import ujson as json, time, _thread
from machine import unique_id, reset
import ubinascii
import wifi
from io_relays import RelayBank
from io_dimmers import DimmerBank
from sensors import Sensors
from mqtt_client import MQTTManager
from http_server import build_app
# Cargar settings
with open('settings.json') as f:
CFG = json.load(f)
def sysinfo():
return {
"name": CFG["device"]["name"],
"chipid": ubinascii.hexlify(unique_id()).decode(),
"wifiStatus": True, # puedes enriquecer con RSSI si lo necesitas
"mqttStatus": True
}
# Conexión WiFi
ok, info = wifi.connect_wifi(CFG["wifi"]["ssid"], CFG["wifi"]["password"])
print("WiFi:", ok, info)
# IO
relays = RelayBank(CFG["io"]["relays"])
dimmers = DimmerBank(CFG["io"]["dimmers"])
sensors = Sensors(CFG["sensors"])
# MQTT
client_id = (CFG["device"]["name"] + "_" + ubinascii.hexlify(unique_id()).decode()[-4:])[:24]
mqtt = MQTTManager(client_id, CFG["mqtt"])
mqtt.connect()
# Handlers MQTT
base = CFG["mqtt"]["base_topic"]
def on_relay_cmd(topic, msg):
# topic: .../cmd/relay/RELAY1
name = topic.split('/')[-1]
state = (msg.decode().upper() == "ON")
if name in relays.relays:
relays.write(name, state)
mqtt.publish_json("status", {"relays": relays.status(), "dimmers": dimmers.status()})
def on_dimmer_cmd(topic, msg):
name = topic.split('/')[-1]
try:
duty = int(msg.decode())
except:
duty = 0
if name in dimmers.pwms:
dimmers.write(name, duty)
mqtt.publish_json("status", {"relays": relays.status(), "dimmers": dimmers.status()})
mqtt.on(base + "/cmd/relay/", on_relay_cmd)
mqtt.on(base + "/cmd/dimmer/", on_dimmer_cmd)
# Servidor HTTP
from microdot import Microdot
app = build_app(relays, dimmers, sensors, sysinfo, CFG)
def run_http():
app.run(host='0.0.0.0', port=80)
_thread.start_new_thread(run_http, ())
# Bucle principal: MQTT + Telemetría periódica
last = 0
while True:
mqtt.loop()
now = time.ticks_ms()
if time.ticks_diff(now, last) > 5000: # cada 5s
reading = sensors.read()
mqtt.publish_json("telemetry", {"sensors": reading, "ts": now})
last = now
time.sleep_ms(50)