diff --git a/pi_mqtt_gpio/__init__.py b/pi_mqtt_gpio/__init__.py index 2c37d8b0ce4046fd86d478428811ce1f84d066dc..f23934d2c4737ce321665361c73c9bd118d86997 100644 --- a/pi_mqtt_gpio/__init__.py +++ b/pi_mqtt_gpio/__init__.py @@ -310,6 +310,9 @@ sensor_inputs: required: no default: 2 min: 0 + unit_of_measurement: + type: string + required: no stream_reads: type: list diff --git a/pi_mqtt_gpio/server.py b/pi_mqtt_gpio/server.py index fa27e27ac03217d0733912c3f5b3cef04cab133b..4802a8fc90f15b812cb6ba6097344280b8bc352b 100644 --- a/pi_mqtt_gpio/server.py +++ b/pi_mqtt_gpio/server.py @@ -483,6 +483,8 @@ def init_mqtt(config, digital_outputs, stream_writes): hass_announce_digital_input(in_conf, topic_prefix, config) for out_conf in digital_outputs: hass_announce_digital_output(out_conf, topic_prefix, config) + for in_conf in sensor_inputs: + hass_announce_sensor_input(in_conf, topic_prefix, config) elif rc == 1: _LOG.fatal("Incorrect protocol version used to connect to MQTT broker.") sys.exit(1) @@ -990,9 +992,47 @@ def hass_announce_digital_output(out_conf, topic_prefix, mqtt_config): ) +def hass_announce_sensor_input(in_conf, topic_prefix, mqtt_config): + """ + Announces digital output as sensor to HomeAssistant. + :param in_conf: Input config + :type in_conf: dict + :return: None + :rtype: NoneType + """ + device_id = ( + "pi-mqtt-gpio-%s" % sha1(topic_prefix.encode("utf8")).hexdigest()[:8] + ) # TODO: Unify with MQTT Client ID + sensor_name = in_conf["name"] + sensor_config = { + "name": sensor_name, + "unique_id": "%s_%s_output_%s" % (device_id, in_conf["module"], sensor_name), + "state_topic": "%s/%s/%s" % (topic_prefix, SENSOR_TOPIC, in_conf["name"]), + "availability_topic": "%s/%s" % (topic_prefix, mqtt_config["status_topic"]), + "payload_available": mqtt_config["status_payload_running"], + "payload_not_available": mqtt_config["status_payload_dead"], + "expire_after": 2 * int(in_conf.get("interval", "60")) + 5, + "device": { + "manufacturer": "MQTT GPIO", + "identifiers": ["mqtt-gpio", device_id], + "name": mqtt_config["discovery_name"], + }, + } + if "unit_of_measurement" in in_conf: + sensor_config["unit_of_measurement"] = in_conf["unit_of_measurement"] + + client.publish( + "%s/%s/%s/%s/config" + % (mqtt_config["discovery_prefix"], "sensor", device_id, sensor_name), + payload=json.dumps(sensor_config), + retain=True, + ) + + def main(args): global digital_inputs global digital_outputs + global sensor_inputs global stream_writes global client global scheduler