Add NFC enable/disable support; update devices, Sonoff, and Tuya
This commit is contained in:
@@ -84,6 +84,8 @@ def create_app(config_name: str = "default") -> Flask:
|
||||
_add_entities_column(app)
|
||||
_add_config_json_column(app)
|
||||
_migrate_board_types(app)
|
||||
_add_device_hardware_id_column(app)
|
||||
_add_device_app_id_column(app)
|
||||
|
||||
return app
|
||||
|
||||
@@ -144,3 +146,62 @@ def _seed_admin(app: Flask) -> None:
|
||||
db.session.add(admin)
|
||||
db.session.commit()
|
||||
app.logger.info("Default admin user created (username=admin password=admin)")
|
||||
|
||||
|
||||
def _add_device_app_id_column(app: Flask) -> None:
|
||||
"""Add app_id column to devices table and backfill existing rows."""
|
||||
from sqlalchemy import text
|
||||
with app.app_context():
|
||||
try:
|
||||
db.session.execute(text("ALTER TABLE devices ADD COLUMN app_id TEXT"))
|
||||
db.session.commit()
|
||||
app.logger.info("Added app_id column to devices table")
|
||||
except Exception:
|
||||
db.session.rollback() # Column already exists — safe to ignore
|
||||
|
||||
# Backfill any rows that have no app_id yet
|
||||
from app.models.device import Device
|
||||
unset = Device.query.filter(Device.app_id.is_(None)).all()
|
||||
for d in unset:
|
||||
d.app_id = Device.generate_app_id(d.name, exclude_id=d.id)
|
||||
if unset:
|
||||
db.session.commit()
|
||||
app.logger.info("Backfilled app_id for %d device(s)", len(unset))
|
||||
|
||||
|
||||
def _add_device_hardware_id_column(app: Flask) -> None:
|
||||
"""Add hardware_device_id column and backfill from existing entity_num bindings."""
|
||||
from sqlalchemy import text
|
||||
with app.app_context():
|
||||
try:
|
||||
db.session.execute(text("ALTER TABLE devices ADD COLUMN hardware_device_id TEXT"))
|
||||
db.session.commit()
|
||||
app.logger.info("Added hardware_device_id column to devices table")
|
||||
except Exception:
|
||||
db.session.rollback() # Column already exists — safe to ignore
|
||||
|
||||
# Backfill: resolve entity_num → actual hardware device_id string
|
||||
from app.models.device import Device
|
||||
from app.models.sonoff_device import SonoffDevice
|
||||
from app.models.tuya_device import TuyaDevice
|
||||
unset = Device.query.filter(
|
||||
Device.hardware_device_id.is_(None),
|
||||
Device.entity_num.isnot(None),
|
||||
Device.entity_type.in_(["sonoff", "tuya"]),
|
||||
).all()
|
||||
for d in unset:
|
||||
hw_id = None
|
||||
sd_or_td_id = d.entity_num // 100
|
||||
if d.entity_type == "sonoff":
|
||||
obj = db.session.get(SonoffDevice, sd_or_td_id)
|
||||
if obj:
|
||||
hw_id = obj.device_id
|
||||
elif d.entity_type == "tuya":
|
||||
obj = db.session.get(TuyaDevice, sd_or_td_id)
|
||||
if obj:
|
||||
hw_id = obj.device_id
|
||||
if hw_id:
|
||||
d.hardware_device_id = hw_id
|
||||
if unset:
|
||||
db.session.commit()
|
||||
app.logger.info("Backfilled hardware_device_id for %d device(s)", len(unset))
|
||||
|
||||
Reference in New Issue
Block a user