diff --git a/README.md b/README.md index bebf053..7b28f4e 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ This is the default configuration: ``` random_delay = randrange(30) +discovery_messages = False group_messages = True sleep_time = 0.5 cpu_load = True @@ -63,6 +64,8 @@ memory = False uptime = True ``` +If the ```discovery_messages``` is set to true, the script will send MQTT Discovery config messages which allows Home Assistant to automatically add the sensors without having to define them in configuration. Note, this setting is only available for when ```group_messages``` is set to False. + If the ```group_messages``` is set to true the script will send just one message containing all values in CSV format. The group message looks like this: ``` @@ -85,7 +88,7 @@ Create a cron entry like this (you might need to update the path in the cron ent Once you installed the script on your raspberry you need to create some sensors in home assistant. - +If you are using ```discovery_messages```, then this step is not required as the sensors are auto discovered by Home Assistant and added. This is the sensors configuration if ```group_messages = True``` assuming your sensors are separated in ```sensors.yaml``` file. ```yaml diff --git a/src/config.py.example b/src/config.py.example index 7aac73a..451cc5f 100644 --- a/src/config.py.example +++ b/src/config.py.example @@ -12,6 +12,9 @@ mqtt_topic_prefix = "rpi-MQTT-monitor" # If this is set to True the script will send just one message containing all values group_messages = True +# If this is set, then the script will send MQTT discovery messages meaning a config less setup in HA. Only works for group_messages being False +discovery_messages = False + # Random delay in seconds before measuring the values # - this is used for de-synchronizing message if you run this script on many hosts, set this to 0 for no delay. # - if you want a fix delay you can remove the randarnge function and just set the needed delay. diff --git a/src/rpi-cpu2mqtt.py b/src/rpi-cpu2mqtt.py index f772298..1639172 100644 --- a/src/rpi-cpu2mqtt.py +++ b/src/rpi-cpu2mqtt.py @@ -61,35 +61,106 @@ def check_uptime(): full_cmd = "awk '{print int($1/3600/24)}' /proc/uptime" return int(subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]) +def config_json(what_config): + data = { + "state_topic": "", + "icon": "", + "name": "", + "unique_id": "", + "unit_of_measurement": "", + } + data["state_topic"] = config.mqtt_topic_prefix+"/"+hostname+"/"+what_config + data["unique_id"] = hostname+"_"+what_config + if what_config == "cpuload": + data["icon"] = "mdi:speedometer" + data["name"] = hostname + " CPU Usage" + data["unit_of_measurement"] = "%" + elif what_config == "cputemp": + data["icon"] = "hass:thermometer" + data["name"] = hostname + " CPU Temperature" + data["unit_of_measurement"] = "°C" + elif what_config == "diskusage": + data["icon"] = "mdi:harddisk" + data["name"] = hostname + " Disk Usage" + data["unit_of_measurement"] = "%" + elif what_config == "voltage": + data["icon"] = "mdi:speedometer" + data["name"] = hostname + " CPU Voltage" + data["unit_of_measurement"] = "V" + elif what_config == "swap": + data["icon"] = "mdi:harddisk" + data["name"] = hostname + " Disk Swap" + data["unit_of_measurement"] = "%" + elif what_config == "memory": + data["icon"] = "mdi:memory" + data["name"] = hostname + " Memory Usage" + data["unit_of_measurement"] = "%" + elif what_config == "sys_clock_speed": + data["icon"] = "mdi:speedometer" + data["name"] = hostname + " CPU Clock Speed" + data["unit_of_measurement"] = "MHz" + elif what_config == "uptime_days": + data["icon"] = "mdi:timer-outline" + data["name"] = hostname + " Uptime" + data["unit_of_measurement"] = "days" + else: + return "" + # Return our built discovery config + return json.dumps(data) + def publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sys_clock_speed = 0, swap = 0, memory = 0, uptime_days = 0): # connect to mqtt server client = paho.Client() client.username_pw_set(config.mqtt_user, config.mqtt_password) - client.connect(config.mqtt_host, config.mqtt_port) + client.connect(config.mqtt_host, int(config.mqtt_port)) # publish monitored values to MQTT if config.cpu_load: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_cpuload/config", config_json('cpuload'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/cpuload", cpu_load, qos=1) time.sleep(config.sleep_time) if config.cpu_temp: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_cputemp/config", config_json('cputemp'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/cputemp", cpu_temp, qos=1) time.sleep(config.sleep_time) if config.used_space: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_diskusage/config", config_json('diskusage'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/diskusage", used_space, qos=1) time.sleep(config.sleep_time) if config.voltage: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_voltage/config", config_json('voltage'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/voltage", voltage, qos=1) time.sleep(config.sleep_time) if config.swap: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_swap/config", config_json('swap'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/swap", swap, qos=1) time.sleep(config.sleep_time) if config.memory: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_memory/config", config_json('memory'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/memory", memory, qos=1) time.sleep(config.sleep_time) if config.sys_clock_speed: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_sys_clock_speed/config", config_json('sys_clock_speed'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/sys_clock_speed", sys_clock_speed, qos=1) time.sleep(config.sleep_time) - if config.uptime_days: + if config.uptime: + if config.discovery_messages: + client.publish("homeassistant/sensor/"+config.mqtt_topic_prefix+"/"+hostname+"_uptime_days/config", config_json('uptime_days'), qos=0) + time.sleep(config.sleep_time) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/uptime_days", uptime_days, qos=1) time.sleep(config.sleep_time) # disconect from mqtt server