Outils pour utilisateurs

Outils du site


2_-_piloter_une_carte_grovepi_avec_raspberry_et_homeassistant

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

  1. Une Raspberry PI
  2. 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
  3. la carte GrovePi+
  4. Quelques modules Grove (module Led ou relais et module DHT11)

Raspberry PI

images-na.ssl-images-amazon.com_images_i_91zsu44_2b34l._sl1500_.jpg

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+

smittytone.files.wordpress.com_2015_02_p1020319.jpg

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?

cdn.ttgtmedia.com_rms_onlineimages_mqtt_publish-subscribe.jpg

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

  1. positionner les locales sur fr-FR-UTF8
  2. choisir la région FR pour le Wifi
  3. paramétrer le clavier en AZERTY
  4. modifier au besoin le mot de passe de l'utilisateur pi
  5. autoriser le ssh
  6. 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.

2_-_piloter_une_carte_grovepi_avec_raspberry_et_homeassistant.txt · Dernière modification : 2020/09/26 15:15 de 127.0.0.1