Seconde partie : intégration des données dans le logiciel domotique Jeedom sur un Raspberry Pi
Dans cette seconde partie du tutoriel, nous allons réaliser la partie réception des données reçues du capteur sans fil et leur intégration dans un serveur domotique Jeedom afin de pouvoir les stocker et les visualiser sur un smartphone par exemple.
Un Raspberry Pi est utilisé pour la partie serveur domotique, car un Arduino n’est pas adapté pour faire tourner un serveur comme Jeedom. En effet un Arduino ne possède pas suffisamment de mémoire et sa puissance de calcul est trop faible. L’intérêt du Raspberry Pi est que nous allons pouvoir facilement y connecter le module radio HC12 via ses GPIO (General Purpose Input Output).
Un script Python va lire régulièrement les données du module radio HC12 et puis va les transmettre au serveur Jeedom en utilisant le protocole MQTT.
Le matériel
Liste du matériel nécessaire pour la partie récepteur et serveur domotique :
- Raspberry Pi 3 Model B
- Modules radio HC12
Schéma du montage
On relie le HC12 au port Série (UART) du Raspberry Pi et on utilise une sortie du Raspberry Pi (la GPIO 4 par exemple) afin de contrôler la pin SET du HC12 pour sélectionner son mode normal ou configuration via le script Python.
Installation de Jeedom sur le Raspberry Pi
Il suffit d‘exécuter le script d‘installation après l‘avoir télécharger à partir du github jeedom.
pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/jeedom/core/beta/install/install.sh
pi@raspberrypi:~ $ chmod u+x install.sh
pi@raspberrypi:~ $ sudo ./install.sh
Notez le mot de passe root MySQL indiqué à la fin de l‘installation, il pourra vous être utile ultérieurement.
Vous pouvez ensuite vous connecter au serveur Jeedom depuis un navigateur en tapant l‘adresse IP du Raspberry Pi. Le nom d‘utilisateur initial est admin et le mot de passe est admin également. Vous devrez le changer à la première connexion.
Il faudra également vous créer un compte Jeedom market afin d’installer les plugins nécessaires (MQTT).
Il est recommandé de suivre le tutoriel d’installation Jeedom :
https://doc.jeedom.com/fr_FR/installation/
Mise en place de MQTT
Installez Mosquitto MQTT sur le Raspberry Pi ainsi que Paho MQTT pour avoir accès au broker via le script Python.
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install mosquitto mosquitto-clients python3-paho-mqtt
Tester le fonctionnement du broker, en publiant un topic et en s‘y abonnant (publier les données sur un terminal et s‘y abonner sur un autre terminal permet de visualiser les échanges facilement).
Terminal 1 : on s‘abonne aux données
pi@raspberrypi:~ $ mosquitto_sub -h localhost -t "sensor/humidite"
pi@raspberrypi:~ $ mosquitto_sub -h localhost -t "sensor/temperature"
Terminal 2 : on publie des données
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t "sensor/temperature" -m 22
pi@raspberrypi:~ $ mosquitto_pub -h localhost -t "sensor/humidite" -m 40
Lorsque des valeurs pour les topics sont publiées on voit leur valeur évoluer dans le terminal dans lequel nous sommes abonnés à ces topics.
Activation du port série du Raspberry Pi
Afin de permettre la communication entre le Raspberry Pi et le module radio HC12, il faut activer la communication sur le port série dans la configuration du Raspberry Pi.
Script Python
Un script Python récupère les informations du module radio HC12 via le port série, et les publie vers le logiciel domotique Jeedom au travers du broker MQTT.
#!/usr/bin/env python3
import serial
import time
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
def on_publish(client,userdata,result): #create function for callback
pass
broker_url = "localhost"
broker_port = 1883
client = mqtt.Client()
client.on_publish = on_publish
client.connect(broker_url, broker_port)
client.loop_start()
ser = serial.Serial(port="/dev/serial0",baudrate=9600)
time.sleep(1)
ser.flushInput()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT, initial=GPIO.LOW) # set pin 7 (GPIO4) to OUTPUT (SET pin of HC12)
GPIO.output(7, GPIO.LOW) # set HC12 to AT mode
ser.write(b"AT+DEFAULT\n") # Set HC12 to default configuraiton
time.sleep(0.5)
ser.write(b"AT+P4\n") # Set HC12 module to 8dBm
time.sleep(0.5)
GPIO.output(7, GPIO.HIGH) # set HC12 to normal mode
time.sleep(0.5)
print("Script ready, listening to HC12 radio messages and publish it")
ser.flushInput()
while True:
try:
size = ser.inWaiting()
if size > 0:
received_data = ser.read(size).decode("ascii").split(":")
print(received_data)
if ((len(received_data) == 4) and (received_data[0] == 'S1')):
temperature = received_data[1]
humidite = received_data[2]
batterie = received_data[3]
infot = client.publish("sensor/temperature", payload=temperature, qos=1)
infot.wait_for_publish()
infot = client.publish("sensor/humidite", payload=humidite, qos=1)
infot.wait_for_publish()
infot = client.publish("sensor/Heure", payload=time.strftime("%H:%M"), qos=1)
infot.wait_for_publish()
infot = client.publish("sensor/batterie", payload=batterie, qos=1)
infot.wait_for_publish()
except IOError:
print("restarting serial")
ser.close()
ser.open()
except Exception as e:
print("exception occured: ", e)
time.sleep(2)
ser.close()
En dehors de la puissance d’émission, la configuration du module HC12 doit être identique sur le récepteur et sur l’émetteur. Puisque la configuration de l’émetteur est la celle par défaut (FU3, 9600 bauds, canal 1) on configure simplement le récepteur par la commande « AT+DEFAULT ».
Le script boucle sur l’écoute du port série, en attendant un message en provenance du HC12. Le format du message est vérifié afin d’éliminer tout message parasite envoyé par un équipement autre que notre capteur sur le même canal radio.
Le message attendu est du format « S1:XX:YY:ZZ>, aussi le message reçu doit être composé de 4 parties séparées par des « : », dont la première partie doit être « S1 ».
Le script publie les données reçues (température et l’humidité) vers le broker MQTT, en utilisant les topic :
- sensor/humidite
- sensor/temperature
- sensor/barrerie
Afin de pouvoir vérifier l’heure de réception de la dernière mesure, le script publie également le topic suivant qui contient l’heure courante :
- sensor/heure
Configurer Jeedom pour afficher les informations du capteur
Une fois le script Python exécuté, il suffira de configurer Jeedom afin de récupérer les informations du capteur via le plugin MQTT.
Tout d’abord créer un objet racine « home » via le menu « Outils / Objets / Ajouter »
Ajouter le plugin MQTT via le menu « Plugins / Market » depuis l’interface Jeedom.
Une fois installé, activer ce plugin via le menu « Plugin / Configuration » et l’action « Activer » dans le rectangle « Etat »
Ajouter un équipement dans ce plugin MQTT, avec une icône Humidité et Température et dont l’objet parent « home » créé précédemment.
Cocher les cases « Activer » et « Visible ».
Assurez vous que des données « sensor/temperature » « sensor/humidite » et « sensor/heure » soient déjà publiées avant de créer l’équipement. Soit en s’assurant que le script Python ai bien reçu les informations du capteur, soit en publiant manuellement des valeurs comme indiqué précédemment. Si ce n’est pas le cas vous devrez redémarrer le « Démon » dans la configuration de plugin MQTT après leur publication pour qu’ils deviennent visibles dans l’équipement.
Les topics seront automatiquement visibles comme commandes de type « info » dans l’équipement. Vous pouvez bien entendu les personnaliser avec une icône et des unités.
Il est également possible de stocker l’historique des valeurs, très pratique pour suivre l’évolution de la température.
Dans la partie „Dashboard“ vous devriez pouvoir visualiser les valeurs remontées par votre capteur.
Voilà ce tutoriel est terminé, n’hésitez pas à laisser un commentaire !
Bonjour, l
lorsque le script python est lancé et qu’une sonde renvoie des données, j’ai l’erreur suivante :
exception occured ascii codec can’t decode byte 0xe0 in position 2 : ordinal not in range(128),
j’ai essayer de passer le message en str avant mais ça ne marche toujours pas…
Merci d’avance
Bonjour,
Vous utilisez Python 2 ou 3 ?
Vous pouvez jeter un œil ici : https://stackoverflow.com/questions/21129020/how-to-fix-unicodedecodeerror-ascii-codec-cant-decode-byte
Dites-moi si vous trouvez la solution.
Bonjour,
j’avais déjà essayer la plus part sur cette discussion mais ca ne marche toujours pas…
j’ai Thonny en 3.7.3 et Spyder en 2.7 et aucun des 2 ne veut fonctionner correctement
quand je print ser.read(size), j’obtiens b’\x1efx\x98\x18xf\x18\x86\x80\x18\x18~x\x98\xe6\x18\x86’\x18\x18~’\x18\x86\x86\x18\x1e’
Bonjour,
Avez-vous modifié le baudrate du HC12 ? Il est à 9600 bps par défaut et c’est celui que j’utilise dans le code.
Ou avez-vous un autre équipement en série sur le Pi ?
Bonjour,
je n’ai rien changer malheureusement…
j’avais juste la camera, je l’ai enlever au cas où
pour vous le print que j’obtiens est parasiter ?
bravo pour ce tuto tres complet.
Pour l’instant je recupere les donnees dans Jeedom, mais il faut que je lance le script python manuellement pour que ca remonte les donnees a Jeedom.
J’ai tente en terminal en ssh sur le Raspberry de lancer le script : le script_python &
pour faire tourner en tache de fond, mais c’est pas top, des que la machine qui lance le script part en veille, visiblement ca arrete la remontee des donnees.
ps -ef | grep -i script_python memontre qu’il est stoppe.
Y as-y-il un moyen fiable qu’il soit lance, au demarrage par exemple ?
https://raspberry-pi.fr/executer-programme-demarrage/
nickel
Merci