|
|
@@ -760,6 +760,79 @@ async def run_migrations(conn):
|
|
|
except Exception:
|
|
|
pass
|
|
|
|
|
|
+ # Migration: Remove UNIQUE constraint from smart_plugs.printer_id
|
|
|
+ # This allows HA scripts to coexist with regular plugs (scripts are for multi-device control)
|
|
|
+ # SQLite requires table recreation to drop constraints
|
|
|
+ try:
|
|
|
+ # Check if we need to migrate (if UNIQUE constraint exists)
|
|
|
+ result = await conn.execute(text("SELECT sql FROM sqlite_master WHERE type='table' AND name='smart_plugs'"))
|
|
|
+ row = result.fetchone()
|
|
|
+ if row and "printer_id INTEGER UNIQUE" in (row[0] or ""):
|
|
|
+ # Create new table without UNIQUE constraint on printer_id
|
|
|
+ await conn.execute(
|
|
|
+ text("""
|
|
|
+ CREATE TABLE smart_plugs_temp (
|
|
|
+ id INTEGER PRIMARY KEY,
|
|
|
+ name VARCHAR(100) NOT NULL,
|
|
|
+ ip_address VARCHAR(45),
|
|
|
+ plug_type VARCHAR(20) DEFAULT 'tasmota',
|
|
|
+ ha_entity_id VARCHAR(100),
|
|
|
+ ha_power_entity VARCHAR(100),
|
|
|
+ ha_energy_today_entity VARCHAR(100),
|
|
|
+ ha_energy_total_entity VARCHAR(100),
|
|
|
+ printer_id INTEGER REFERENCES printers(id) ON DELETE SET NULL,
|
|
|
+ enabled BOOLEAN NOT NULL DEFAULT 1,
|
|
|
+ auto_on BOOLEAN NOT NULL DEFAULT 1,
|
|
|
+ auto_off BOOLEAN NOT NULL DEFAULT 1,
|
|
|
+ off_delay_mode VARCHAR(20) NOT NULL DEFAULT 'time',
|
|
|
+ off_delay_minutes INTEGER NOT NULL DEFAULT 5,
|
|
|
+ off_temp_threshold INTEGER NOT NULL DEFAULT 70,
|
|
|
+ username VARCHAR(50),
|
|
|
+ password VARCHAR(100),
|
|
|
+ power_alert_enabled BOOLEAN NOT NULL DEFAULT 0,
|
|
|
+ power_alert_high FLOAT,
|
|
|
+ power_alert_low FLOAT,
|
|
|
+ power_alert_last_triggered DATETIME,
|
|
|
+ schedule_enabled BOOLEAN NOT NULL DEFAULT 0,
|
|
|
+ schedule_on_time VARCHAR(5),
|
|
|
+ schedule_off_time VARCHAR(5),
|
|
|
+ show_in_switchbar BOOLEAN DEFAULT 0,
|
|
|
+ last_state VARCHAR(10),
|
|
|
+ last_checked DATETIME,
|
|
|
+ auto_off_executed BOOLEAN NOT NULL DEFAULT 0,
|
|
|
+ auto_off_pending BOOLEAN DEFAULT 0,
|
|
|
+ auto_off_pending_since DATETIME,
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
|
|
|
+ )
|
|
|
+ """)
|
|
|
+ )
|
|
|
+ # Copy data
|
|
|
+ await conn.execute(
|
|
|
+ text("""
|
|
|
+ INSERT INTO smart_plugs_temp
|
|
|
+ SELECT id, name, ip_address, plug_type, ha_entity_id, ha_power_entity,
|
|
|
+ ha_energy_today_entity, ha_energy_total_entity, printer_id, enabled,
|
|
|
+ auto_on, auto_off, off_delay_mode, off_delay_minutes, off_temp_threshold,
|
|
|
+ username, password, power_alert_enabled, power_alert_high, power_alert_low,
|
|
|
+ power_alert_last_triggered, schedule_enabled, schedule_on_time, schedule_off_time,
|
|
|
+ show_in_switchbar, last_state, last_checked, auto_off_executed,
|
|
|
+ auto_off_pending, auto_off_pending_since, created_at, updated_at
|
|
|
+ FROM smart_plugs
|
|
|
+ """)
|
|
|
+ )
|
|
|
+ # Drop old table and rename new one
|
|
|
+ await conn.execute(text("DROP TABLE smart_plugs"))
|
|
|
+ await conn.execute(text("ALTER TABLE smart_plugs_temp RENAME TO smart_plugs"))
|
|
|
+ except Exception:
|
|
|
+ pass
|
|
|
+
|
|
|
+ # Migration: Add show_on_printer_card column to smart_plugs
|
|
|
+ try:
|
|
|
+ await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN show_on_printer_card BOOLEAN DEFAULT 1"))
|
|
|
+ except Exception:
|
|
|
+ pass
|
|
|
+
|
|
|
# Migration: Add MQTT smart plug fields (legacy)
|
|
|
try:
|
|
|
await conn.execute(text("ALTER TABLE smart_plugs ADD COLUMN mqtt_topic VARCHAR(200)"))
|