add wifi signal

This commit is contained in:
Hristo
2022-11-18 22:45:09 +02:00
parent ac5d9927f2
commit 9975775ff8
5 changed files with 57 additions and 10 deletions

View File

@@ -1,5 +1,5 @@
# Raspberry Pi MQTT monitor # Raspberry Pi MQTT monitor
Python script to check the cpu load, cpu temperature, free space, used memory, swap usage, voltage and system clock speed Python script to check the cpu load, cpu temperature, free space, used memory, swap usage, uptime, wifi signal quality voltage and system clock speed
on a Raspberry Pi or any computer running Ubuntu and publish this data to a MQTT broker. on a Raspberry Pi or any computer running Ubuntu and publish this data to a MQTT broker.
I wrote this to monitor my raspberries at home with [home assistant](https://www.home-assistant.io/). The script works fine both on Python 2 and 3 I wrote this to monitor my raspberries at home with [home assistant](https://www.home-assistant.io/). The script works fine both on Python 2 and 3
@@ -23,7 +23,7 @@ masoko/rpi4
The csv message looks like this: The csv message looks like this:
```csv ```csv
9.0, 43.0, 25, 25, 0.85, 1500, False, False 9.0, 43.0, 25, 25, 0.85, 1500, False, False, False
``` ```
Disabled sensors are represented with False in the message. Disabled sensors are represented with False in the message.
@@ -73,6 +73,7 @@ sys_clock_speed = True
swap = False swap = False
memory = False memory = False
uptime = True uptime = True
wifi_signal = 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 when ```group_messages``` is set to False. 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 when ```group_messages``` is set to False.
@@ -80,7 +81,7 @@ If the ```discovery_messages``` is set to true, the script will send MQTT Discov
If the ```group_messages``` is set to true the script will send just one message containing all values in CSV format. 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: The group message looks like this:
``` ```
1.3, 47.1, 12, 1.2, 600, nan, 14.1, 12 1.3, 47.1, 12, 1.2, 600, nan, 14.1, 12, 50.0
``` ```
Test the script. Test the script.
@@ -144,12 +145,19 @@ This is the sensors configuration if ```group_messages = True``` assuming your s
value_template: '{{ value.split(",")[6] }}' value_template: '{{ value.split(",")[6] }}'
name: rpi4 memory name: rpi4 memory
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt - platform: mqtt
state_topic: 'masoko/rpi4' state_topic: 'masoko/rpi4'
value_template: '{{ value.split(",")[7] }}' value_template: '{{ value.split(",")[7] }}'
name: rpi4 uptime name: rpi4 uptime
unit_of_measurement: "days" unit_of_measurement: "days"
- platform: mqtt
state_topic: 'masoko/rpi4'
value_template: '{{ value.split(",")[8] }}'
name: rpi4 wifi signal
unit_of_measurement: "%"
``` ```
This is the sensors configuration if ```group_messages = False``` assuming your sensors are separated in ```sensors.yaml``` file. This is the sensors configuration if ```group_messages = False``` assuming your sensors are separated in ```sensors.yaml``` file.
@@ -188,10 +196,17 @@ This is the sensors configuration if ```group_messages = False``` assuming your
state_topic: "masoko/rpi4/memory" state_topic: "masoko/rpi4/memory"
name: rpi4 memory name: rpi4 memory
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt - platform: mqtt
state_topic: "masoko/rpi4/uptime_days" state_topic: "masoko/rpi4/uptime_days"
name: rpi4 uptime name: rpi4 uptime
unit_of_measurement: "days" unit_of_measurement: "days"
- platform: mqtt
state_topic: "masoko/rpi4/wifi_signal"
name: rpi4 wifi signal
unit_of_measurement: "%"
``` ```
Add this to your ```customize.yaml``` file to change the icons of the sensors. Add this to your ```customize.yaml``` file to change the icons of the sensors.
@@ -231,6 +246,7 @@ entities:
- entity: sensor.rpi4_swap - entity: sensor.rpi4_swap
- entity: sensor.rpi4_memory - entity: sensor.rpi4_memory
- entity: sensor.rpi4_uptime - entity: sensor.rpi4_uptime
- entity: sensor.rpi4_wifi_signal
``` ```
# To Do # To Do
- maybe add network traffic monitoring via some third party software (for now I can't find a way to do it without additional software) - maybe add network traffic monitoring via some third party software (for now I can't find a way to do it without additional software)

View File

@@ -60,6 +60,7 @@ check_and_install_pip(){
install_requirements(){ install_requirements(){
printm "Installing requirements" printm "Installing requirements"
pip install -r requirements.txt pip install -r requirements.txt
sudo pip3 install -r requirements.txt
} }
update_config(){ update_config(){

View File

@@ -9,6 +9,12 @@ printm(){
} }
main(){ main(){
if [[ $(git --version) ]]; then
git=$(which git)
else
sudo apt-get install git
fi
printm "Cloning rpi-mqtt-monitor git repository" printm "Cloning rpi-mqtt-monitor git repository"
git clone https://github.com/hjelev/rpi-mqtt-monitor.git git clone https://github.com/hjelev/rpi-mqtt-monitor.git
cd rpi-mqtt-monitor cd rpi-mqtt-monitor

View File

@@ -31,3 +31,4 @@ sys_clock_speed = True
swap = True swap = True
memory = True memory = True
uptime = True uptime = True
wifi_signal = True

View File

@@ -16,6 +16,16 @@ import os
# get device host name - used in mqtt topic # get device host name - used in mqtt topic
hostname = socket.gethostname() hostname = socket.gethostname()
def check_wifi_signal():
try:
full_cmd = "iwconfig wlan0 | grep -i --color quality"
wifi_signal = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
wifi_signal = wifi_signal.decode("utf-8").strip().split(' ')[1].split('=')[1].split('/')[0]
wifi_signal_calc = round((int(wifi_signal) / 70)* 100)
except Exception:
wifi_signal_calc = 'NA'
return wifi_signal_calc
def check_used_space(path): def check_used_space(path):
st = os.statvfs(path) st = os.statvfs(path)
@@ -114,7 +124,7 @@ def config_json(what_config):
data["name"] = hostname + " Disk Usage" data["name"] = hostname + " Disk Usage"
data["unit_of_measurement"] = "%" data["unit_of_measurement"] = "%"
elif what_config == "voltage": elif what_config == "voltage":
data["icon"] = "mdi:speedometer" data["icon"] = "mdi:current-dc"
data["name"] = hostname + " CPU Voltage" data["name"] = hostname + " CPU Voltage"
data["unit_of_measurement"] = "V" data["unit_of_measurement"] = "V"
elif what_config == "swap": elif what_config == "swap":
@@ -133,6 +143,10 @@ def config_json(what_config):
data["icon"] = "mdi:timer" data["icon"] = "mdi:timer"
data["name"] = hostname + " Uptime" data["name"] = hostname + " Uptime"
data["unit_of_measurement"] = "days" data["unit_of_measurement"] = "days"
elif what_config == "wifi_signal":
data["icon"] = "mdi:wifi"
data["name"] = hostname + " Wifi Signal"
data["unit_of_measurement"] = "%"
else: else:
return "" return ""
# Return our built discovery config # Return our built discovery config
@@ -140,7 +154,7 @@ def config_json(what_config):
def publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0, 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): uptime_days=0, wifi_signal=0):
# connect to mqtt server # connect to mqtt server
client = paho.Client() client = paho.Client()
client.username_pw_set(config.mqtt_user, config.mqtt_password) client.username_pw_set(config.mqtt_user, config.mqtt_password)
@@ -204,15 +218,22 @@ def publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_s
time.sleep(config.sleep_time) time.sleep(config.sleep_time)
client.publish(config.mqtt_topic_prefix + "/" + hostname + "/uptime_days", uptime_days, qos=1) client.publish(config.mqtt_topic_prefix + "/" + hostname + "/uptime_days", uptime_days, qos=1)
time.sleep(config.sleep_time) time.sleep(config.sleep_time)
if config.wifi_signal:
if config.discovery_messages:
client.publish("homeassistant/sensor/" + config.mqtt_topic_prefix + "/" + hostname + "_wifi_signal/config",
config_json('wifi_signal'), qos=0)
time.sleep(config.sleep_time)
client.publish(config.mqtt_topic_prefix + "/" + hostname + "/wifi_signal", wifi_signal, qos=1)
time.sleep(config.sleep_time)
# disconnect from mqtt server # disconnect from mqtt server
client.disconnect() client.disconnect()
def bulk_publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0, def bulk_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): uptime_days=0, wifi_signal=0):
# compose the CSV message containing the measured values # compose the CSV message containing the measured values
values = cpu_load, float(cpu_temp), used_space, float(voltage), int(sys_clock_speed), swap, memory, uptime_days values = cpu_load, float(cpu_temp), used_space, float(voltage), int(sys_clock_speed), swap, memory, uptime_days, wifi_signal
values = str(values)[1:-1] values = str(values)[1:-1]
# connect to mqtt server # connect to mqtt server
@@ -229,7 +250,7 @@ def bulk_publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_cl
if __name__ == '__main__': if __name__ == '__main__':
# set all monitored values to False in case they are turned off in the config # set all monitored values to False in case they are turned off in the config
cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = uptime_days = False cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = uptime_days = wifi_signal = False
# delay the execution of the script # delay the execution of the script
time.sleep(config.random_delay) time.sleep(config.random_delay)
@@ -251,8 +272,10 @@ if __name__ == '__main__':
memory = check_memory() memory = check_memory()
if config.uptime: if config.uptime:
uptime_days = check_uptime() uptime_days = check_uptime()
if config.wifi_signal:
wifi_signal = check_wifi_signal()
# Publish messages to MQTT # Publish messages to MQTT
if config.group_messages: if config.group_messages:
bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days) bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, wifi_signal)
else: else:
publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days) publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, wifi_signal)