def create_mqtt_client( driver_object, mqtt_server, mqtt_port, mqtt_username, mqtt_password, mqtt_base_topic, devices_names_config, ha_prefix, log_level, ): """Create MQTT client object, setup callbacks and connection to server.""" logger.debug("Connecting to %s:%s", mqtt_server, mqtt_port) mqttc = mqtt.Client( client_id="dali2mqtt", userdata={ "driver": driver_object, "base_topic": mqtt_base_topic, "ha_prefix": ha_prefix, "devices_names_config": devices_names_config, "log_level": log_level, "all_lamps": {}, }, ) mqttc.will_set( MQTT_DALI2MQTT_STATUS.format(mqtt_base_topic), MQTT_NOT_AVAILABLE, retain=True ) mqttc.on_connect = lambda a, b, c, d: on_connect(a, b, c, d, ha_prefix) # Add message callbacks that will only trigger on a specific subscription match. mqttc.message_callback_add( MQTT_COMMAND_TOPIC.format(mqtt_base_topic, "+"), on_message_cmd ) mqttc.message_callback_add( MQTT_BRIGHTNESS_COMMAND_TOPIC.format(mqtt_base_topic, "+"), on_message_brightness_cmd, ) mqttc.message_callback_add( MQTT_SCAN_LAMPS_COMMAND_TOPIC.format(mqtt_base_topic), on_message_reinitialize_lamps_cmd, ) mqttc.on_message = on_message if mqtt_username: mqttc.username_pw_set(mqtt_username, mqtt_password) mqttc.connect(mqtt_server, mqtt_port, 60) return mqttc
def on_connect( client, data_object, flags, result, ha_prefix=DEFAULT_HA_DISCOVERY_PREFIX, ): # pylint: disable=W0613,R0913 """Callback on connection to MQTT server.""" mqtt_base_topic = data_object["base_topic"] driver_object = data_object["driver"] client.subscribe([ (MQTT_COMMAND_TOPIC.format(mqtt_base_topic, "+"), 0), (MQTT_BRIGHTNESS_COMMAND_TOPIC.format(mqtt_base_topic, "+"), 0), (MQTT_SCAN_LAMPS_COMMAND_TOPIC.format(mqtt_base_topic), 0), ]) client.publish(MQTT_DALI2MQTT_STATUS.format(mqtt_base_topic), MQTT_AVAILABLE, retain=True) initialize_lamps(data_object, client)
def on_message_cmd(mqtt_client, data_object, msg): """Callback on MQTT command message.""" logger.debug("Command on %s: %s", msg.topic, msg.payload) light = re.search( MQTT_COMMAND_TOPIC.format(data_object["base_topic"], "(.+?)"), msg.topic ).group(1) if msg.payload == MQTT_PAYLOAD_OFF: try: lamp_object = data_object["all_lamps"][light] logger.debug("Set light <%s> to %s", light, msg.payload) data_object["driver"].send(gear.Off(lamp_object.short_address)) mqtt_client.publish( MQTT_STATE_TOPIC.format(data_object["base_topic"], light), MQTT_PAYLOAD_OFF, retain=True, ) except DALIError as err: logger.error("Failed to set light <%s> to %s: %s", light, "OFF", err) except KeyError: logger.error("Lamp %s doesn't exists", light)
def gen_ha_config(self, mqtt_base_topic): """Generate a automatic configuration for Home Assistant.""" json_config = { "name": self.friendly_name, "unique_id": "DALI2MQTT_LIGHT_{}".format(self.device_name), "state_topic": MQTT_STATE_TOPIC.format(mqtt_base_topic, self.device_name), "command_topic": MQTT_COMMAND_TOPIC.format(mqtt_base_topic, self.device_name), "payload_off": MQTT_PAYLOAD_OFF.decode("utf-8"), "brightness_state_topic": MQTT_BRIGHTNESS_STATE_TOPIC.format(mqtt_base_topic, self.device_name), "brightness_command_topic": MQTT_BRIGHTNESS_COMMAND_TOPIC.format(mqtt_base_topic, self.device_name), "brightness_scale": self.max_level, "on_command_type": "brightness", "availability_topic": MQTT_DALI2MQTT_STATUS.format(mqtt_base_topic), "payload_available": MQTT_AVAILABLE, "payload_not_available": MQTT_NOT_AVAILABLE, "device": { "identifiers": "dali2mqtt", "name": "DALI Lights", "sw_version": f"dali2mqtt {__version__}", "model": "dali2mqtt", "manufacturer": f"{__author__} <{__email__}>", }, } return json.dumps(json_config)