Add Tuya Cloud integration; 2-step add-board wizard; DP value formatting
- Tuya Cloud Gateway driver (tuya-device-sharing-sdk):
- QR-code auth flow: user-provided user_code, terminal_id/endpoint
returned by Tuya login_result (mirrors HA implementation)
- Device sync, toggle DP, rename, per-device detail page
- category → kind mapping; detect_switch_dps helper
- format_dp_value: temperature (÷10 + °C/°F), humidity (+ %)
registered as 'tuya_dp' Jinja2 filter
- TuyaDevice model (tuya_devices table)
- Templates:
- tuya/gateway.html: device grid with live-reading sensor cards
(config/threshold keys hidden from card, shown on detail page)
- tuya/device.html: full status table with formatted DP values
- tuya/auth_settings.html: user_code input + QR scan flow
- Add-board wizard refactored to 2-step flow:
- Step 1: choose board type (Cloud Gateways vs Hardware)
- Step 2: type-specific fields; gateways skip IP/relay fields
- Layout builder: Tuya chip support (makeTuyaChip, tuya_update socket)
- requirements.txt: tuya-device-sharing-sdk, cryptography
This commit is contained in:
@@ -36,6 +36,7 @@ def create_app(config_name: str = "default") -> Flask:
|
||||
from app.routes.api import api_bp
|
||||
from app.routes.admin import admin_bp
|
||||
from app.routes.sonoff import sonoff_bp
|
||||
from app.routes.tuya import tuya_bp
|
||||
from app.routes.layouts import layouts_bp
|
||||
|
||||
app.register_blueprint(auth_bp)
|
||||
@@ -45,6 +46,7 @@ def create_app(config_name: str = "default") -> Flask:
|
||||
app.register_blueprint(api_bp, url_prefix="/api")
|
||||
app.register_blueprint(admin_bp, url_prefix="/admin")
|
||||
app.register_blueprint(sonoff_bp)
|
||||
app.register_blueprint(tuya_bp)
|
||||
app.register_blueprint(layouts_bp, url_prefix="/layouts")
|
||||
|
||||
# ── user loader ───────────────────────────────────────────────────────────
|
||||
@@ -59,11 +61,20 @@ def create_app(config_name: str = "default") -> Flask:
|
||||
registry.discover()
|
||||
app.logger.info("Board drivers loaded: %s", [d.DRIVER_ID for d in registry.all()])
|
||||
|
||||
# ── Jinja filters ─────────────────────────────────────────────────────────
|
||||
from app.drivers.tuya_cloud.driver import format_dp_value as _tuya_fmt
|
||||
|
||||
@app.template_filter("tuya_dp")
|
||||
def _tuya_dp_filter(value, dp_code: str, status=None):
|
||||
"""Format a raw Tuya DP value for display (temperature scaling, units…)."""
|
||||
return _tuya_fmt(dp_code, value, status)
|
||||
|
||||
# ── create tables & seed admin on first run ───────────────────────────────
|
||||
with app.app_context():
|
||||
# Import all models so their tables are registered before create_all
|
||||
from app.models import board, user, workflow # noqa: F401
|
||||
from app.models import sonoff_device # noqa: F401
|
||||
from app.models import tuya_device # noqa: F401
|
||||
from app.models import layout # noqa: F401
|
||||
db.create_all()
|
||||
_seed_admin(app)
|
||||
|
||||
Reference in New Issue
Block a user