Features:
- Added ows.mqtt.bridge model with health status monitoring
- Bridge list/form views with status indicators (Online/Offline/Unknown)
- Scheduled action for periodic health checks (every 2 minutes)
- Health metrics: devices count, subscriptions, last seen timestamp
- Manual health check button in UI
- Smart button linking brokers to bridge instance
Infrastructure:
- Added ows.mqtt.broker model for MQTT broker configurations
- Bridge-Broker relation via Many2one field
- Dynamic MQTT reconnection without container restart
- Robust startup: Bridge starts even when MQTT fails
- TLS reconfiguration limitation documented (paho-mqtt)
Technical Changes:
- Updated models to use @api.model_create_multi for Odoo 18
- Fixed view definitions: tree → list for Odoo 18 compatibility
- Removed mail.thread dependency (unnecessary chatter)
- Added ir.cron for automated health monitoring
- Security/ACL rules for bridge and broker models
- Menu integration under IoT/MQTT section
Documentation:
- Updated IMPLEMENTATION_PLAN.md with new features
- Updated Odoo module README with bridge/broker models
- iot_bridge/README.md already documents dynamic reconnection
Testing:
- All changes tested via Odoo module upgrade
- Health check endpoint verified: GET /health
- Bridge reconnection tested with broker config changes
- Implement build script (build_docs.py) with AST parser to auto-generate HTML docs from docstrings
- Add comprehensive Google-style docstrings to all controllers and models
- Create static/description/index.html for Odoo Apps UI with module overview
- Generate api_reference.html (20.5 KB) from source code, linked from Odoo UI
- Add DOCUMENTATION_STRATEGY.md with comparison of 5 documentation approaches
- Create API.md with complete REST API documentation
Device Status Monitoring:
- Implement device_status_monitor.py with health checks and offline detection
- Add /status endpoint for device health overview
- Automatic offline detection after message_timeout_s
Config Push Architecture:
- Add POST /config endpoint to IoT Bridge for dynamic device management
- Auto-push device config from Odoo on create/write/unlink
- Implement device_manager.py for runtime device updates
E2E Tests:
- All 6 E2E tests passing (Create, Update, Push, Delete, Restart, Status Monitor)
- Test coverage for device lifecycle and config synchronization
Documentation is auto-generated via: ./build_docs.sh
View in Odoo: Settings → Apps → Open Workshop MQTT → API Reference
Completes PUSH-only architecture - removes all PULL-based config fetching
REMOVED:
- MockOdooClient.get_config() method (~15 lines)
- Legacy PULL logic: returned hardcoded device config
- No longer used after PUSH architecture (Phase 3.1/3.2)
- OdooClient.get_config() method (~27 lines)
- Legacy PULL logic: GET /ows/iot/config from Odoo
- No longer used after PUSH architecture (Phase 3.1/3.2)
VERIFIED:
- ✅ No periodic config refresh logic in main.py
- ✅ Bridge loads config-active.yaml at startup only
- ✅ Bridge receives config via POST /config (pushed by Odoo)
- ✅ No GET requests to Odoo for config anymore
KEPT (unchanged):
- odoo_client.send_event() - still used for event pushing
- config_server.py GET /config - returns bridge's current config (debugging)
ARCHITECTURE CLEANUP:
Before: Bridge could PULL config from Odoo (get_config)
After: Bridge ONLY receives PUSH from Odoo (POST /config)
- Cleaner separation of concerns
- No periodic polling overhead
- Bridge fully autonomous with config-active.yaml
MODIFIED FILES:
- iot_bridge/odoo_client.py - ~40 lines removed
- IMPLEMENTATION_PLAN.md - Phase 3.3 marked complete
TESTING:
✅ Bridge still runs without config-active.yaml (waits for push)
✅ Bridge loads config-active.yaml at startup
✅ No errors in bridge logs (no missing get_config calls)
✅ Odoo push still works (Phase 3.2 model hooks)
NEXT STEP:
Phase 3.5 - End-to-End Tests (full PUSH architecture validation)
Major architectural improvements to make Bridge resilient:
1. Bridge Autonomy (CRITICAL FIX):
- Remove sys.exit(1) when Odoo config fails (iot_bridge/main.py)
- Bridge now runs autonomously with local config.yaml
- No longer crashes in endless restart loop when Odoo is down
- Odoo connection check becomes optional warning, not blocker
2. Event Type Compatibility:
- Add 'session_ended' to controller event processing (iot_api.py)
- Bridge sends 'session_ended', controller expected 'session_stopped'
- Now accepts both event types for closing sessions
3. Event Type Support:
- Add 'session_ended' to iot_event model selection (iot_event.py)
- Fixes 500 errors when Bridge sends session_ended events
4. Architecture Documentation:
- Update FEATURE_REQUEST with new PUSH architecture (Odoo -> Bridge)
- Update IMPLEMENTATION_PLAN with Phase 3 refactoring plan
- Document autonomous mode and config-push design
- Remove obsolete documentation files
Tested Scenarios:
- ✅ Bridge starts and runs without Odoo
- ✅ Session detection works autonomously
- ✅ Events queue when Odoo is down
- ✅ Queue automatically processes when Odoo returns
- ✅ Sessions close correctly with session_ended events
This enables the next phase: Odoo pushing config to Bridge via HTTP API.