Files
thingy52-mqtt-bridge/controller.py
2025-05-03 23:59:00 +01:00

82 lines
2.3 KiB
Python

from mqtt import MQTTConnection
from device import Device
import logging
logging.basicConfig(level=logging.INFO)
class Controller:
def __init__(self,
broker: str,
mac: str | None = None,
updateFrequency: int = 5,
port: int = 1883,
topic: str = "thingy52",
clientId: str = "thingy52",
username: str | None = None,
password: str | None = None,
caCertPath: str | None = None,
certPath: str | None = None,
keyPath: str | None = None,
mqttMinReconnectDelay: int = 1,
mqttMaxReconnectDelay: int = 60,
mqttReconnectAttempts: int = 20,
mqttReconnectDelayMultiplier: int = 2,
sensors: list[str] = [
"battery",
"temperature",
"pressure",
"humidity",
"eco2",
"tvoc",
"button",
"taps",
"tapDirection",
"orient",
"stepCount",
"colour"
],
temperatureOffset: int = 0
):
self.__mqtt = MQTTConnection(
broker,
port,
topic,
clientId,
username,
password,
caCertPath,
certPath,
keyPath,
mqttMinReconnectDelay,
mqttMaxReconnectDelay,
mqttReconnectAttempts,
mqttReconnectDelayMultiplier,
self.__stop
)
self.__thingy = Device(
mac,
updateFrequency,
mqttMinReconnectDelay,
mqttMaxReconnectDelay,
mqttReconnectAttempts,
mqttReconnectDelayMultiplier,
self.__stop,
sensors,
temperatureOffset
)
try:
self.__mqtt.publish("available", "online")
self.__mqtt.subscribe("homeassistant/available", lambda msg : self.__mqtt.publish("available", "online") if (msg == "online") else None, False)
for sensor in sensors:
self.__thingy.subscribe(sensor, lambda val, sensor=sensor : self.__mqtt.publish(sensor, val))
self.__thingy.start()
finally:
self.__stop()
def __stop(self):
self.__thingy.disconnect()
self.__mqtt.disconnect()