import appdaemon.plugins.hass.hassapi as hass import appdaemon.plugins.mqtt.mqttapi as mqtt import appdaemon.adbase as base class hass_mqtt_state_sync(hass.Hass,mqtt.Mqtt): def initialize(self): self.entity_id = self.args["entity_id"] self.entity = self.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_subscribe(self.mqtt_topic_set_state, namespace="mqtt") self.mqtt_subscribe(self.mqtt_topic_request, namespace="mqtt") self.listen_event(self.handle_set_state_payload, "MQTT_MESSAGE", topic=self.mqtt_topic_set_state, namespace="mqtt") self.listen_event(self.handle_request_payload, "MQTT_MESSAGE", topic=self.mqtt_topic_request, namespace="mqtt") self.entity.listen_state(self.handle_hass_state_change) self.publish_state_to_mqtt() def publish_state_to_mqtt(self): state = self.get_state(self.entity_id) self.mqtt_publish(self.mqtt_topic_state, str(state), namespace="mqtt") def handle_set_state_payload(self, event_name, data, cb_args): state = data["payload"] # Set state alone does not trigger state change event, so we need to call it manually if state == "on": self.call_service("homeassistant/turn_on", entity_id=self.entity_id) elif state == "off": self.call_service("homeassistant/turn_off", entity_id=self.entity_id) else: 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.log("State change detected: {} -> {}".format(old, new)) self.publish_state_to_mqtt()