PILOTER UNE CARTE GROVEPI+ AVEC RASPBERRY ET HOMEASSISTANT
Si vous souhaitez mettre en place chez vous un système centralisé domotique, ce billet est fait pour vous. L'ensemble de vos élèves de collège ne pourra vraisemblablement pas maîtriser l'ensemble du processus expliqué ci-dessous. Tout au plus peut-on imaginer la carte comme support de cours lorsque nous abordons le monde des objets connectés.
Sur ce billet vous devez être libre au moins sur une bonne après-midi car si les opérations ne sont pas complexes, elles nécessitent toutefois des actions assz longues. Pour vous éviter ce temps d'attente je vous proposerai de télécharger l'image de la SDCARD et de la graver, cela devrait vous permettre de démarrer sans paramétrage et sans installation. Il faudra toutefois attendre le temps de téléchargement (entre 4 à 5 Go) et sa gravure (un bon quart d'heure).
MATERIEL
- Une Raspberry PI
- Un kit de démarrage Raspberry (SDCARD 16 Go minimum 8 Go, Une alimentation puissante 5V/3A), un câble HDMI, un câble ethernet, un câble micro-usb pour alimenter le Raspberry
- la carte GrovePi+
- Quelques modules Grove (module Led ou relais et module DHT11)
Raspberry PI
Faut-il la présenter ? Disons courtement qu'il s'agit de mini PC low-cost équipé d'un processeur ARM et de connectivité Ethernet, Bluetooth et Wifi depuis la version PI 3. Le système démarre sur une SDCARD qu'il faut choisir en classe 10. Je n'en dirais pas plus, vous trouverez sur Internet toutes les informations pour faire plus ample connaissance avec la carte.
GrovePi+
La carte GrovePi+ se monte directement sur le port GPIO du Raspberry. Elle est équivalente dans sa structure à une carte Arduino Uno seulement les données transitent au travers du port I2C du Raspberry. Elle possède le même microprocesseur qu'une Arduino UNO, un atmega328p. D'ailleurs en sélectionnant la carte UNO dans le logiciel Arduino et en choissisant le programmeur RaspBerry GPIO la carte permet de recevoir les fichiers HEX produits.
Home-Assistant
Voici une capture d'écran d'HomeAssistant. Différents capteurs branchés sur le Raspberry apparaissent (température et humidité), d'autres données proviennent d'Internet notamment toutes les prévisions météorologiques. Rappelons nous, nous sommes dans le mondes des IoT (Internet Of Things) l'Internet Des Objets. Certains prédisent également l'apparition prochaine de l'homme connecté, mais là c'est un autre débat …
Pour Home-Assistant beaucoup de choses se passent au niveau des fichiers de paramétrage. Nous y reviendrons ultérieurement.
MQTT ? C'est quoi ce truc?
Une simple image vaut mieux qu'un long discours. Dans la communication MQTT les capteurs publient des informations (publish) auprès des équipements qui sont à l'écoute (subscribe). Plus d'information ici: http://www.lemagit.fr/conseil/Internet-des-Objets-bien-comprendre-MQTT
Nous utiliserons sur le Raspberry “mosquitto” qui est le serveur MQTT assez prisé dans les projets des makers.
INTRODUCTION
Le schéma ci-dessus reprend l'ensemble des composants et leur rôle respectif. Vous pouvez donc déduire que vous pouvez refaire ce test sans Raspberry (ordinateur Windows ou linux) et sans GrovePi (Carte arduino équipée d'un shield Ethernet pour la fonction MQTT). Je vous ferais un autre billet pour le test sans Raspberry et sans carte GrovePi+.
Passons à la pratique ...
ETAPE 1
Télécharger l'image Dexter Jessie https://sourceforge.net/projects/dexterindustriesraspbianflavor/files/2017.10.05-BETA_Dexter_Industries_jessie.zip/download et la graver sur la SDCARD de 16Go à l'aide d'Etcher https://etcher.io/ (Une 8 Go peut suffire pour le test)
ETAPE 2
Lancer le raspberry branché à un écran et au réseau et se connecter avec le compte pi/robots1234. Attention la carte démarre en QWERTY! Lancer ensuite l'outil raspi-config et
- positionner les locales sur fr-FR-UTF8
- choisir la région FR pour le Wifi
- paramétrer le clavier en AZERTY
- modifier au besoin le mot de passe de l'utilisateur pi
- autoriser le ssh
- redémarrer le raspberry (sudo reboot)
ETAPE 3
Conseil, pour vous faciliter la vie et récupérer le code par copier/coller connectez vous en ssh avec l'outil Putty en ayant repéré l'adresse IP de votre RaspBerry.
ifconfig
Mettre à jour le Raspberry
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade
Allez boire un bon café car la mise à jour est assez longue (245 paquets sont mis à jour sur le raspberry!)
ETAPE 4
Se rendre sur /home/pi/Dexter/GrovePi et mettre à jour
sudo git fetch origin sudo git reset --hard sudo git merge origin/master
Puis graver le firmware sur le GrovePi+
cd Firmware sudo chmod a+x ./firmware_update.sh sudo ./firmware_update.sh
Dès à présent vous pouvez vous octroyez une pause et jouer un peu en cliquant sur l'icône Scratch et en testant les divers exemples fournis. Euh c'est implicite mais le GrovePi+ doit être monté sur la Raspberry.
Fin de récré maintenant ! ;)
ETAPE 5
Installons le serveur MQTT
sudo apt-get install mosquitto mosquitto_clients
Nous allons le tester dans deux terminaux différents.
Dans un terminal tapez:
mosquitto_sub -t "sensor" -h localhost
Dans un autre saisir:
mosquitto_pub -t "sensor" -h localhost -m 10
Le chiffre 10 apparaîtra sur le premier terminal. Vous pouvez tenter de modifier le message derrière -m. MQTT n'est pas plus compliqué que cela! On souscrit (sub) ou on publie (pub) un message (-m) sur un topic (-t) sur un serveur (-h).
ETAPE 6
Problème! La version de python de Jessie n'est pas correcte! Pas grave, nous allons compiler Python sur le Raspberry depuis les sources.Enregistrez le code suivant dans /home/pi/get_python.sh.
#!/bin/sh RELEASE=3.6.3 # install dependencies sudo apt-get install libbz2-dev liblzma-dev libsqlite3-dev libncurses5-dev -y sudo apt-get install tk-dev -y sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev -y sudo apt-get install libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev -y sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev -y # download and build Python mkdir ~/python3 cd ~/python3 wget https://www.python.org/ftp/python/$RELEASE/Python-$RELEASE.tar.xz tar xvf Python-$RELEASE.tar.xz cd Python-$RELEASE ./configure make sudo make install sudo rm -rf ~/python3/Python-$RELEASE cd ~
Donnez les bons droits sur le script
sudo chmod a+x /home/pi/get_python.sh sudo ./get_python.sh
Patience, patience python 3.6.3 va s'installer sur votre Raspberry …
petit rappel, je vous proposerai un lien pour télécharger une image de la SD CARD avec toutes les installations en place! Mais si certains veulent un peu jouer avec Raspbian c'est formateur!
ETAPE 7
Nous installons maintenant homeassistant
sudo python3.6 -m pip install homeassistant
Lancez une fois homeassistant pour qu'il écrive les fichiers dans home/pi/.homeassistant les fichiers de configuration. Le premier démarrage est parfois long car homeassistant télécharge des modules en cours d'éxécution.
hass CTRL+C pour l'arrêter
Copiez les données suivantes dans le fichier /home/pi/.homeassistant/configuration.yaml
homeassistant:
# Name of the location where Home Assistant is running name: Home # Location required to calculate the time the sun rises and sets latitude: 49.32917 longitude: -0.459753 # Impacts weather/sunrise data (altitude above sea level in meters) elevation: 14 # metric for Metric, imperial for Imperial unit_system: metric # Pick yours from here: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones time_zone: Europe/Paris http: frontend: config: mqtt: broker: localhost #si le Broker est installé sur le même poste qu'Home-Assistant #broker: 169.254.153.244 port: 1883 client_id: home-assistant-1 keepalive: 60 #username: USERNAME #optionnel #password: PASSWORD #optionnel protocol: 3.1 sun: weather: - platform: openweathermap api_key: ############################## sensor: - platform: yr name: Météo forecast: 24 monitored_conditions: - temperature - symbol - precipitation - windSpeed - pressure - windDirection - humidity - fog - cloudiness - lowClouds - mediumClouds - highClouds - dewpointTemperature sensor 2: platform: mqtt state_topic: "sensor/temperature" name: "Température" qos: 0 unit_of_measurement: "°C" #value_template: '{{ payload }}' sensor 3: platform: mqtt state_topic: "sensor/humidity" name: "Humidité" qos: 0 unit_of_measurement: "%" #value_template: '{{ payload }}' switch: platform: mqtt name: "Arrosage" command_topic: "homeassistant/switch1" #Topic sur lequel on publie l'état de l'interrupteur payload_on: "ON1" # A vous de choisir le message envoyé lorsque l'interrupteur est allumé payload_off: "OFF1" # et éteint optimistic: true # Mettez à true pour maintenir l'état qos: 0 retain: true value_template: '{{ value.x }}'
Relancez homeassistant:
hass
Rendez vous sur http:<adresse_IP du raspberry>:8123
Tout fonctionne sauf nos capteurs qui pour l'instant ne communiquent pas sur le serveur MQTT!
Soit on intègre cela en C Arduino sur le GrovePi, soit on laisse le firmWare sur le GrovePi et on écrit un script python. J'ai choisi la seconde solution.
Le script python fait le lien entre le GrovePi et le broker MQTT. Homeassistant est configuré pour fonctionner avec le broker MQTT et affiche les résultats dès réception des messages MQTT.
Rédigez le script /home/pi/test_mqtt.py
#!/usr/bin/env python broker="localhost" import paho.mqtt.publish as publish import paho.mqtt.client as paho import time from grovepi import * # Connect the Grove LED to digital port D7 led = 7 sensor = 4 pinMode(led,"OUTPUT") #define callback def on_message(client, userdata, message): time.sleep(1) msg = str(message.payload.decode("utf-8")) print("received message =", msg) if (msg == "ON1"): digitalWrite(led,1) # Send HIGH to switch on LED if (msg == "OFF1"): digitalWrite(led,0) # Send HIGH to switch on LED def readTemperature(): client= paho.Client("client-001") client.on_message=on_message while True: try: print("connecting to broker ",broker) client.connect(broker)#connect client.loop_start() #start loop to process received messages print("subscribing ") client.subscribe("homeassistant/switch1")#subscribe [temp,humidity] = dht(sensor,0) print("temp=", temp, "humidity =", humidity) publish.single("sensor/temperature", '{0:0.1f}'.format(temp), hostname="192.168.1.53") publish.single("sensor/humidity", '{0:0.1f}'.format(humidity), hostname="192.168.1.53") time.sleep(2) client.disconnect() #disconnect client.loop_stop() #stop loop except KeyboardInterrupt: # Turn LED off before stopping digitalWrite(led,0) break except IOError: # Print "Error" if communication error encountered print ("Error") readTemperature()
Il faudra le module python paho-mqtt
sudo python -m pip install paho-mqtt
Il suffit maintenant de le lancer
python /home/pi/test_mqtt.py
Tada … !
D'accord le python c'est peut être un peu ardu pour nos élèves! Le point de ma réflexion me mène donc à NoreRed qui propose un pilotage à partir de blocs et offre apparemment des fonctionnalités assez puissantes incluant les fonctionnalités MQTT et l'accès au GrovePi. Je vous en reparlerai dans un autre billet.