# Envoie des infos du rpi vers mqtt # ### # Quelques infos piquées sur le net # https://www.framboise314.fr/utiliser-le-protocole-mqtt-pour-communiquer-des-donnees-entre-2-raspberry-pi/ # https://pypi.org/project/paho-mqtt/ # http://www.steves-internet-guide.com/into-mqtt-python-client/ # ### # Prérequis : # sudo apt install python3-pip # sudo pip3 install paho-mqtt pythonping # ### # Changement de timezone dans raspi-config # sudo raspi-config # => 4 Localisation Options => I2 Change time zone => Europe => Paris # Puis copier le fichier ce dans /home/pi # nano /home/pi/rpi2mqtt.py # ### # Lancement au boot : # sudo nano /etc/systemd/system/rpi2mqtt.service # Copier ce qui suit en enlevant les # du chaques lignes # remplacer XXX par un nom unique (uniqement lettre et chiffre) ex: rpi08 # ### #[Unit] #Description=rpi2mqtt #After=syslog.target network.target # #[Service] #Type=simple #WorkingDirectory=/home/pi/ #ExecStart=sudo python3 /home/pi/rpi2mqtt.py -c XXX -i 120 # #RestartSec=5 #Restart=on-failure # #[Install] #WantedBy=multi-user.target # ### # Puis : # sudo systemctl daemon-reload # sudo systemctl enable rpi2mqtt.service # sudo systemctl start rpi2mqtt.service # ### # Todo: # ### # Note : # FR locales VS US locales: CPU load est ecrit 0,01 et en US c'est 0.01 # # Vous pouvez soit changer les IP/login/pass du borker dans ce fichier, soit en parametre de la ligne de commande # # Import libs import argparse import sys import math import time import subprocess #import locale import paho.mqtt.client as mqtt import json from pythonping import ping # Import script arguments def getOptions(args=sys.argv[1:]): parser = argparse.ArgumentParser(description="Parses command.") parser.add_argument("-c", "--client", help="Client name aka topic name") parser.add_argument("-b", "--host", help="Broker IP") parser.add_argument("-p", "--port", type=int, help="Broker port") parser.add_argument("-u", "--user", help="Broker user login") parser.add_argument("-w", "--password", help="Broker user password") parser.add_argument("-t", "--topic", help="Main topic") parser.add_argument("-g", "--ping", help="IP to ping") parser.add_argument("-i", "--interval", type=int, help="Refresh interval in seconds") parser.add_argument("-v", "--verbose",dest='verbose',action='store_true', help="Verbose mode.") options = parser.parse_args(args) return options options = getOptions(sys.argv[1:]) if options.verbose: print(options) # Parse options opt_client = "xxx" if options.client: opt_client = options.client opt_host = "192.168.0.1" if options.host: opt_host = options.host opt_port = 1883 if options.port: opt_port = options.port opt_user = "pi" if options.user: opt_user = options.user opt_password = "raspberry" if options.password: opt_password = options.password opt_topic = "monitoring" if options.topic: opt_topic = options.topic opt_ping = "192.168.0.1" if options.ping: opt_ping = options.ping opt_interval = 60 if options.interval: opt_interval = options.interval # mtg = {'time': 0, 'ping': 0, 'ip': "", 'name': "", 'temp': 0, 'load': 0, 'mem': 0, 'disk': 0} next_reading = time.time() client = mqtt.Client(opt_client) client.username_pw_set(opt_user, opt_password) client.connect(opt_host, opt_port, 60) client.loop_start() try: while True: mtg['time'] = math.trunc(time.time()) rs_ping = ping(opt_ping, size=40, count=2) mtg['ping'] = str(rs_ping.rtt_avg_ms) mtg['ip'] = subprocess.check_output("hostname -I | cut -d' ' -f1 | tr -d '\n'", shell=True).decode("utf-8") mtg['name'] = subprocess.check_output("hostname | tr -d '\n'", shell=True).decode("utf-8") mtg['temp'] = subprocess.check_output("cat /sys/class/thermal/thermal_zone0/temp | awk '{printf \"%.2f\", $1/1000 }'", shell=True).decode("utf-8") mtg['load'] = subprocess.check_output("top -bn1 | grep load | awk -F \": \" '{print $NF}' | awk -F \", \" '{print $(NF-2)}' | tr -d '\n'", shell=True).decode("utf-8") mtg['mem'] = subprocess.check_output("free -m | awk 'NR==2{printf \"%.2f\", $3*100/$2 }'", shell=True).decode("utf-8") mtg['disk'] = subprocess.check_output('df -h | awk \'$NF=="/"{printf "%s", $5}\'', shell=True).decode("utf-8") topic = opt_topic + '/' + opt_client client.publish(topic, json.dumps(mtg), 1) if options.verbose: print(mtg) next_reading += opt_interval sleep_time = next_reading-time.time() if sleep_time > 0: time.sleep(sleep_time) except KeyboardInterrupt: pass client.loop_stop() client.disconnect()