37 lines
1.6 KiB
Python
37 lines
1.6 KiB
Python
|
import appdaemon.plugins.hass.hassapi as hass
|
||
|
import appdaemon.plugins.mqtt.mqttapi as mqtt
|
||
|
import appdaemon.adbase as base
|
||
|
|
||
|
|
||
|
class hass_mqtt_state_sync(base.ADBase):
|
||
|
|
||
|
def initialize(self):
|
||
|
self.hass = self.get_plugin_api("HASS")
|
||
|
self.mqtt = self.get_plugin_api("MQTT")
|
||
|
self.ad = self.get_ad_api()
|
||
|
|
||
|
self.entity_id = self.args["entity_id"]
|
||
|
self.entity = self.hass.get_entity(self.entity_id)
|
||
|
self.mqtt_topic_state = self.args["mqtt_topic_state"]
|
||
|
self.mqtt_topic_set_state = self.args["mqtt_topic_set_state"]
|
||
|
self.mqtt_topic_request = self.args["mqtt_topic_request"]
|
||
|
|
||
|
self.mqtt.mqtt_subscribe(self.mqtt_topic_set_state)
|
||
|
self.mqtt.mqtt_subscribe(self.mqtt_topic_request)
|
||
|
self.mqtt.listen_event(self.handle_set_state_payload, "MQTT_MESSAGE", topic=self.mqtt_topic_set_state)
|
||
|
self.mqtt.listen_event(self.handle_request_payload, "MQTT_MESSAGE", topic=self.mqtt_topic_request)
|
||
|
self.entity.listen_state(self.handle_hass_state_change)
|
||
|
|
||
|
def publish_state_to_mqtt(self):
|
||
|
state = self.hass.get_state(self.entity_id)
|
||
|
self.mqtt.mqtt_publish(self.mqtt_topic_state, str(state))
|
||
|
|
||
|
def handle_set_state_payload(self, event_name, data, cb_args):
|
||
|
self.entity.set_state(state = data["payload"])
|
||
|
|
||
|
def handle_request_payload(self, event_name, data, cb_args):
|
||
|
self.publish_state_to_mqtt()
|
||
|
|
||
|
def handle_hass_state_change(self, entity, attribute, old, new, cb_args):
|
||
|
self.ad.log("State change detected: {} -> {}".format(old, new))
|
||
|
self.publish_state_to_mqtt()
|