Enhanced MQTT support with separate topics and multipliers (#173)

- Add separate MQTT topics for power, energy, and state monitoring
  - mqtt_power_topic, mqtt_power_path, mqtt_power_multiplier
  - mqtt_energy_topic, mqtt_energy_path, mqtt_energy_multiplier
  - mqtt_state_topic, mqtt_state_path, mqtt_state_on_value
- Support different MQTT topics per data type (e.g., Zigbee2MQTT with
  separate power/energy/state topics)
- Individual multipliers for power and energy (e.g., mW→W, Wh→kWh)
- Configurable ON value for state monitoring (e.g., "ON", "true", "1")
- Maintain backward compatibility with legacy mqtt_topic/mqtt_multiplier
- Database migration auto-copies legacy fields to new fields
- Update backup/restore to handle new MQTT fields
- Add backend tests for new MQTT configurations
- Update frontend form with organized Power/Energy/State sections

Closes #173
This commit is contained in:
maziggy
2026-01-30 14:17:26 +01:00
parent 00e3478a3e
commit 04f4dccd41
15 changed files with 836 additions and 306 deletions
+11 -1
View File
@@ -315,9 +315,19 @@ def smart_plug_factory(db_session):
defaults["ha_entity_id"] = "switch.test"
defaults["ip_address"] = None
elif plug_type == "mqtt":
# Legacy fields (for backward compatibility tests)
defaults["mqtt_topic"] = kwargs.get("mqtt_topic", "test/topic")
defaults["mqtt_power_path"] = kwargs.get("mqtt_power_path", "power")
defaults["mqtt_multiplier"] = kwargs.get("mqtt_multiplier", 1.0)
# New separate topic/path/multiplier fields
defaults["mqtt_power_topic"] = kwargs.get("mqtt_power_topic")
defaults["mqtt_power_path"] = kwargs.get("mqtt_power_path", "power")
defaults["mqtt_power_multiplier"] = kwargs.get("mqtt_power_multiplier", 1.0)
defaults["mqtt_energy_topic"] = kwargs.get("mqtt_energy_topic")
defaults["mqtt_energy_path"] = kwargs.get("mqtt_energy_path")
defaults["mqtt_energy_multiplier"] = kwargs.get("mqtt_energy_multiplier", 1.0)
defaults["mqtt_state_topic"] = kwargs.get("mqtt_state_topic")
defaults["mqtt_state_path"] = kwargs.get("mqtt_state_path")
defaults["mqtt_state_on_value"] = kwargs.get("mqtt_state_on_value")
defaults["ip_address"] = None
defaults["ha_entity_id"] = None
else: