Add NFC enable/disable support; update devices, Sonoff, and Tuya

This commit is contained in:
2026-04-13 21:35:17 +03:00
parent 86bfecca26
commit 5340f88ffe
15 changed files with 843 additions and 175 deletions

View File

@@ -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))