Mon projet domotique (le matériel)

Bonjour visiteur de passage.

Dans une premier temps, je détaillerai la liste du matériel nécessaire au projet annoncé lors d’un article précédent. Puis, je présenterai un schéma de principe.

  • Un raspberry pi modèle B avec carte SD 8G classe 10.

raspberry-pi-model-b

  • Dix capteurs de température de type DS18B20 (un pour chaque pièce dans mon cas).ds18b20
  • Un afficheur LCD I2C de 20*4.

lcd_i2c

  • Des résistances.
  • Un composant permettant d’étendre le bus I2C P82B715PN.

P82B715

  • Un optocoupleur SFH620A permet la télérelève EDF via le port série.

sfh620a

  • Un pi cobbler pour assurer la liaison entre le raspberry et le circuit.

Adafruit_Pi_Cobbler_Breakout_Kit

  • Une série de relais permettant de commande le fil pilote des zones de chauffage et les ouvertures de portes (garage et portail).

relais

J’utilise également une alimentation 5 volts différentes pour tous les circuits de commandes évitant ainsi de trop tirer sur les ports GPIO et le rapsberry pi en général.

  • Une alimentation 5 volts 2 ampères

alimentation5v

  • Un interrupteur à souder.
  • Une diode Led rouge (au choix) pour la présence secteur.
  • Une diode 1N4148.

J’en profite pour remercier le père de mon collègue Nico qui, ancien prof de techo, m’a donné un stock énorme de composants électroniques 🙂

Voici le schéma de principe de l’installation.

Eyesathome

That’s all folks 🙂

 

I2c Raspberry pi

Bonjour ami lecteur,

Voici un petit topo sur la liaison I2C présente sur les raspberry. Pour connaitre l’historique du protocole, je vous renvois à la page wikipédia.

A quoi te sert ce protocole dans le cadre de ton projet ?

Dans mon projet, le serveur raspberry utilise un afficheur i2c pour afficher (quoi de plus normal pour un afficheur 😉 les températures provenant des capteurs répartis dans la maison, les températures relevées par la cuve, l’intensité EDF consommée en temps réel etc.

afficheur

Vue du menu défilant

Il se trouve dans le salon à la place de l’ancien programmateur de chauffage. Il fallait bien boucher le trou avec quelque chose Le chauffage étant maintenant gérer par le serveur raspberry.

L’avantage principal réside dans le fait qu’il ne faut que 2 fils pour transmettre les informations (SDA et SCL).

Comment activer l’I2C ?

On se connecte sur le raspberry pi:

sudo nano /etc/modules

Puis ajouter les deux lignes suivantes à la fin du fichier:

i2c-bcm2708 
i2c-dev

puis aprés un reboot, ça devrait fonctionner.
Sachant que nous sommes prévoyant, on fera également une mise à jour

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

Pour tester, un rapsberry modèle B répondra à la commande suivante:

sudo i2cdetect -y 1

resultati2cL’adresse 27 correspond à l’afficheur.

Je vous renvois à la lecture de cet excellent article sur les possibilités du protocole.
http://mchobby.be/wiki/index.php?title=ArduPi-I2C

Et chez toi ça marche comment ?

Toutes les 10 minutes, l’afficheur s’illumine et affiche toutes les informations via ce script python. Pour une fois, je suis assez fière de dire que je l’ai fait tout seul.

Mode crâneur = off 😉

#!/usr/bin/python
# -*- coding:utf-8 -*-

import os
import time
import lcddriver
import datetime
import sys
import RPi.GPIO as GPIO
import sqlite3
from time import sleep, localtime, strftime

# Chemin du fichier contenant les donnees de la telereleve EDF
chemin = "/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Telereleve/edf"

# Initialisation de l'afficheur
lcd = lcddriver.lcd()

# Fonction qui met en route l'écran LCD
def lcd_allumage():
        Relai = 11
        # Fonction GPIO
        GPIO.setwarnings(False)
        # Synchronisation des PIN GPIO
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(Relai, GPIO.OUT)
        GPIO.output(Relai, GPIO.HIGH)
        return

# Presente un message d'attente
def lcd_attente():
        ligne1 = "    Eyes At Home    "
        ligne2 = "                    "
        ligne3 = "  Analyse en cours  "
        ligne4 = "                    "
        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
        time.sleep(5)
        return

# Fonction qui récupère la fête du jour ainsi que l'heure du lever et du coucher du soleil dans la base de données
def lcd_bonjour():
        jour = strftime("%Y-%m-%d", localtime())
        bdd = sqlite3.connect("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/bdd/meteoPi.db")
        c = bdd.cursor()
        c.execute("SELECT Fete,SolLever,SolCoucher FROM Ephemeride WHERE Date = '"+ jour +"'")
        valeur = c.fetchall()

        for l in valeur:
                fete = str(l[0])
                lever = str(l[1])
                coucher = str(l[2])

        bdd.commit()
        bdd.close()
        bdd.close()

        jour = strftime("%A %d %b %Y", localtime())
        ligne1 = jour
        ligne2 = str (fete)
        ligne3 = "Lever soleil  :"+ str (lever)
        ligne4 = "Coucher soleil:"+ str (coucher)
        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
        time.sleep(8)
        return

# Lance la fonction affichage sur le LCD (programme affichage.py fonction affiche_lcd)
def lcd_chauffage():
        # Application de la commande comprise dans le fichier de la zone
        # Pour la zone 1 (Chambres, bureau, dressing)
        lecture_z1 = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Calendrier/therm_Z1", "r")
        # Retire les 6 premiers caracteres du texte pour ne conserver que l'ordre
        ordre_z1 = lecture_z1.readline(6)
        ordre_z1 = lecture_z1.readline(3)
        # Ferme le fichier
        lecture_z1.close()
        # Pour la zone 2 (Chambres, bureau, dressing)
        lecture_z2 = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Calendrier/therm_Z2", "r")
        # Retire les 6 premiers caracteres du texte pour ne conserver que l'ordre
        ordre_z2 = lecture_z2.readline(6)
        ordre_z2 = lecture_z2.readline(3)
        # Ferme le fichier
        lecture_z2.close()
        # Préparation de l'affichage
        ligne1 = "  Etat du chauffage "
        ligne2 = "                    "
        ligne3 = "Z1 Chambres    : "+ ordre_z1
        ligne4 = "Z2 S. de bains : "+ ordre_z2
        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
        time.sleep(6)
        return

#Module d'affichage des informations de la cuve
def lcd_vol_cuve():
        # Configuration de la ligne 1
        ligne1 = "    Cuve jardin"
        fichier = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Cuve/f_pro", "r")
        i = 0
        for i in range (0,2):
         temp=fichier.readline()
         temp=temp.rstrip()
         if i == 0:
                ligne3 = "Haut. d'eau : "+temp+ " cm"
         if i == 1:
                ligne4 = "Volume      : "+temp+ " l"
                ligne2 = "    -----------"
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
        return

def lcd_temp_cuve():
        # Configuration de la ligne 1
        ligne1 = "    Temperatures"
        #ligne1 = "Eyes at Home  (Temp)"
        fichier = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Cuve/temp_cuve", "r")
        i = 0
        for i in range (0,3):
         temp=fichier.readline()
         temp=temp.rstrip()
         if i == 0:
                ligne2 = "Eau cuve     : "+temp
         if i == 1:
                ligne3 = "Exterieur    : "+temp
         if i == 2:
                ligne4 = "Boiter tech  : "+temp
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
        return

# Fonction qui lit le fichier temperatures, puis effectue la mise en forme pour affichage
def lcd_temperature():
        # Configuration de la ligne 1
        ligne1 = "    Temperatures"
        fichier = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Temperature/temperatures", "r")
        i = 0
        for i in range (0,10):
         temp=fichier.readline()
         temp=temp.rstrip()
         if i == 0:
                ligne2 = "Bureau       : "+temp
         if i == 1:
                ligne3 = "Cellier      : "+temp
         if i == 2:
                ligne4 = "Ch. Anais    : "+temp
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
         if i == 3:
                ligne2 = "Ch. Parents  : "+temp
         if i == 4:
                ligne3 = "Ch. Romain   : "+temp
         if i == 5:
                ligne4 = "Couloir      : "+temp
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
         if i == 6:
                ligne2 = "Dressing     : "+temp
         if i == 7:
                ligne3 = "Garage       : "+temp
         if i == 8:
                ligne4 = "S. de bains  : "+temp
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
         if i == 9:
                ligne2 = "                    "
                ligne3 = "Salon        : "+temp
                ligne4 = "                    "
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
        return

# Module d'affichage des donnees issues de la telereleve edf
def lcd_telereleve():
    if os.path.isfile(chemin):
        ligne1 = "Edf releve compteur"
        fichier = open("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/Telereleve/edf", "r")
        i = 0
        for i in range(0,7):
         temp=fichier.readline()
         temp=temp.rstrip()
         if i == 1:
                ligne2 = "H. creuses : "+ temp
         if i == 2:
                ligne3 = "H. pleines : "+ temp
         if i == 3:
                        if temp == "HC":
                                temp = "Heures creuses"
                        if temp == "HP":
                                temp = "Heures pleines"
                        ligne4 = "=> "+ temp +" <="
                        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                        time.sleep(6)
         if i == 4:
                ligne1 = "Edf consommation    "
                ligne2 = "Intensite "+ temp +" amperes "
         if i == 5:
                ligne3 = "soit "+ temp +" watt.    "
         if i == 6:
                ligne4 = "Int. max "+ temp +" amperes."
                affiche_lcd (ligne1, ligne2, ligne3, ligne4)
                time.sleep(6)
        return

# Module d'affichage du cout finaincier de la journée de la veille
def lcd_valeur_edf():
        veille = (datetime.date.today()-datetime.timedelta(1)).strftime('%d/%m/%Y')
        bdd = sqlite3.connect("/usr/share/adafruit/webide/repositories/my-pi-projects/Serveur_1/bdd/cptedf.db")
        c = bdd.cursor()
        c.execute("SELECT * FROM edf WHERE timestamp = '"+ veille +"'")

        valeur = c.fetchall()

        for l in valeur:
                hc = l[1]
                hp = l[2]

        bdd.commit()
        bdd.close()
        bdd.close()

        v_hc = (hc * 0.0578)
        v_hp = (hp * 0.0935)
        v_tot = v_hc + v_hp
        ligne1 = "Edf cout de la conso"
        ligne2 = "H. pleines : "+ str(hp)+" Kwh"
        ligne3 = "H. creuses : "+ str(hc)+" Kwh"
        ligne4 = "soit pour hier %.2f"% v_tot
        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
        time.sleep(6)
        return

# Module de nettoyage de l'écran entre chaque affichage
def clear_lcd():
        ligne1 = "                    "
        ligne2 = "                    "
        ligne3 = "                    "
        ligne4 = "                    "
        affiche_lcd (ligne1, ligne2, ligne3, ligne4)
        return

# Module d'affichage des messages sur ecran de controle i2c
def affiche_lcd (ligne1, ligne2, ligne3, ligne4):
        lcd.lcd_display_string(ligne1, 1)
        lcd.lcd_display_string(ligne2, 2)
        lcd.lcd_display_string(ligne3, 3)
        lcd.lcd_display_string(ligne4, 4)
        return

# Lance le programme d'affichage des informations sur le LCD
lcd_allumage()
clear_lcd()
lcd_attente()
clear_lcd()
lcd_bonjour()
clear_lcd()
lcd_chauffage()
clear_lcd()
lcd_vol_cuve()
clear_lcd()
lcd_temp_cuve()
clear_lcd()
lcd_temperature()
clear_lcd()
lcd_telereleve()
clear_lcd()
lcd_valeur_edf()

# Message de réinitialisation
lcd.lcd_display_string("                    ", 1)
lcd.lcd_display_string(" Supervision maison ", 2)
lcd.lcd_display_string("    Eyes At Home    ", 3)
lcd.lcd_display_string("        v1.0        ", 4)
time.sleep(10)

# Extinction de l'écran
GPIO.output(11, GPIO.LOW)

J’expliquerai plus en détail dans la page projet comment tout ça fonctionne.