konbaasiang

directmqtt HABApp library

May 4th, 2022 (edited)
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.34 KB | None | 0 0
  1. from HABApp.mqtt.mqtt_payload import get_msg_payload
  2. import paho.mqtt.client as mqtt
  3. import time
  4. from HABApp.mqtt.events import MqttValueUpdateEvent
  5. from leifutil import directmqttconfig
  6. conf = directmqttconfig.conf()
  7.  
  8. class DirectMqtt(object):
  9.     def __init__(self, rule, on_message_callback, **params):
  10.         super().__init__()
  11.  
  12.         self.loop_started = False
  13.  
  14.         self.rule = rule
  15.         self.rule.register_on_unload(self.on_unload)
  16.  
  17.         self.log = params["log"] if "log" in params else None
  18.  
  19.         self.on_connect_callback = params["on_connect"] if "on_connect" in params else None
  20.         self.on_message_callback = on_message_callback
  21.  
  22.         self.topics = params["topics"] if "topics" in params else Null
  23.  
  24.         client_id="HABAppDirectMqtt_" + str(time.monotonic_ns())
  25.  
  26.         self.mqtt_client = mqtt.Client(client_id,clean_session=True)
  27.  
  28.         self.mqtt_client.username_pw_set(conf.username,conf.password)
  29.  
  30.         self.mqtt_client.on_connect = self.on_connect
  31.         self.mqtt_client.on_disconnect = self.on_disconnect
  32.         self.mqtt_client.on_message = self.on_message
  33.  
  34.         self.mqtt_client.connect_async(conf.host,conf.port)
  35.  
  36.         if self.log:
  37.             self.log.info(f'DirectMqtt: Connecting to {conf.host}:{conf.port}')
  38.  
  39.         self.mqtt_client.loop_start()
  40.         self.loop_started=True
  41.  
  42.  
  43.     def on_unload(self):
  44.         if self.log:
  45.             self.log.info(f"DirectMqtt: Unloaded.")
  46.         if self.loop_started:
  47.             self.mqtt_client.loop_stop()
  48.             self.loop_started = False
  49.             self.mqtt_client.disconnect()
  50.  
  51.     def on_connect(self, client, userdata, flags, rc):
  52.         if self.log:
  53.             self.log.info(f'DirectMqtt: Connected.')
  54.  
  55.         if self.on_connect_callback:
  56.             self.on_connect_callback(self.mqtt_client)
  57.  
  58.         if self.topics:
  59.             if self.log:
  60.                 self.log.info(f'DirectMqtt: topics supplied.')
  61.             for topic in self.topics:
  62.                 if self.log:
  63.                     self.log.info(f'DirectMqtt: subscribing to {topic}')
  64.                 self.mqtt_client.subscribe(topic,qos=1)
  65.         #self.mqtt_client.subscribe("homie/living-room-mcu/433mhz/super")
  66.  
  67.     def on_disconnect(self, client, userdata, rc):
  68.         if self.log:
  69.             self.log.info(f'DirectMqtt: Disconnected.')
  70.  
  71.     def on_message(self, client, userdata, message: mqtt.MQTTMessage):
  72.         topic, payload = get_msg_payload(message)
  73.         if topic is None:
  74.             return None
  75.  
  76.         #if self.log:
  77.         #   self.log.info(f'topic: {topic}, payload: {payload}')
  78.  
  79.         self.on_message_callback(MqttValueUpdateEvent(topic, payload))
  80.  
  81.  
  82.  
  83.  
  84.  
Add Comment
Please, Sign In to add comment