Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from HABApp.mqtt.mqtt_payload import get_msg_payload
- import paho.mqtt.client as mqtt
- import time
- from HABApp.mqtt.events import MqttValueUpdateEvent
- from leifutil import directmqttconfig
- conf = directmqttconfig.conf()
- class DirectMqtt(object):
- def __init__(self, rule, on_message_callback, **params):
- super().__init__()
- self.loop_started = False
- self.rule = rule
- self.rule.register_on_unload(self.on_unload)
- self.log = params["log"] if "log" in params else None
- self.on_connect_callback = params["on_connect"] if "on_connect" in params else None
- self.on_message_callback = on_message_callback
- self.topics = params["topics"] if "topics" in params else Null
- client_id="HABAppDirectMqtt_" + str(time.monotonic_ns())
- self.mqtt_client = mqtt.Client(client_id,clean_session=True)
- self.mqtt_client.username_pw_set(conf.username,conf.password)
- self.mqtt_client.on_connect = self.on_connect
- self.mqtt_client.on_disconnect = self.on_disconnect
- self.mqtt_client.on_message = self.on_message
- self.mqtt_client.connect_async(conf.host,conf.port)
- if self.log:
- self.log.info(f'DirectMqtt: Connecting to {conf.host}:{conf.port}')
- self.mqtt_client.loop_start()
- self.loop_started=True
- def on_unload(self):
- if self.log:
- self.log.info(f"DirectMqtt: Unloaded.")
- if self.loop_started:
- self.mqtt_client.loop_stop()
- self.loop_started = False
- self.mqtt_client.disconnect()
- def on_connect(self, client, userdata, flags, rc):
- if self.log:
- self.log.info(f'DirectMqtt: Connected.')
- if self.on_connect_callback:
- self.on_connect_callback(self.mqtt_client)
- if self.topics:
- if self.log:
- self.log.info(f'DirectMqtt: topics supplied.')
- for topic in self.topics:
- if self.log:
- self.log.info(f'DirectMqtt: subscribing to {topic}')
- self.mqtt_client.subscribe(topic,qos=1)
- #self.mqtt_client.subscribe("homie/living-room-mcu/433mhz/super")
- def on_disconnect(self, client, userdata, rc):
- if self.log:
- self.log.info(f'DirectMqtt: Disconnected.')
- def on_message(self, client, userdata, message: mqtt.MQTTMessage):
- topic, payload = get_msg_payload(message)
- if topic is None:
- return None
- #if self.log:
- # self.log.info(f'topic: {topic}, payload: {payload}')
- self.on_message_callback(MqttValueUpdateEvent(topic, payload))
Add Comment
Please, Sign In to add comment