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
+40 -1
View File
@@ -760,7 +760,7 @@ async def run_migrations(conn):
except Exception:
pass
# Migration: Add MQTT smart plug fields
# Migration: Add MQTT smart plug fields (legacy)
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_topic VARCHAR(200)"))
except Exception:
@@ -782,6 +782,45 @@ async def run_migrations(conn):
except Exception:
pass
# Migration: Add enhanced MQTT smart plug fields (separate topics and multipliers)
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_topic VARCHAR(200)"))
except Exception:
pass
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_power_multiplier REAL DEFAULT 1.0"))
except Exception:
pass
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_topic VARCHAR(200)"))
except Exception:
pass
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_energy_multiplier REAL DEFAULT 1.0"))
except Exception:
pass
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_topic VARCHAR(200)"))
except Exception:
pass
try:
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_state_on_value VARCHAR(50)"))
except Exception:
pass
# Migration: Copy existing mqtt_topic to mqtt_power_topic for backward compatibility
try:
await conn.execute(
text("""
UPDATE smart_plugs
SET mqtt_power_topic = mqtt_topic,
mqtt_power_multiplier = mqtt_multiplier
WHERE mqtt_topic IS NOT NULL AND mqtt_power_topic IS NULL
""")
)
except Exception:
pass
async def seed_notification_templates():
"""Seed default notification templates if they don't exist."""