samedi 17 décembre 2011

Domotique - Température: Thermostat on the www, Google Calendar est mon ami

Suite à la mise en oeuvre du DS18B20, je m'étais fait une petite page web (en complément de celle présentant les courbes) permettant de régler la température désirée, ainsi que le capteur sur lequel étaient réalisés les contrôles.
Le côté pratique de cette page est vite apparu: il était possible de modifier la température de n'importe où dans le monde, que ce soit à la maison ou ailleurs, du moment qu'un accès web était présent.

D'un autre côté, il n'était pas possible de programmer la température désirée sur le long terme, et transformer ladite page web pour en faire un point d'entrée de thermostat d'ambiance me freinait à plusieurs niveaux:

  • faire une IHM au format html (ou autre) permettant de facilement programmer plusieurs plages de températures sur plusieurs jours (et sans se limiter, comme sur certains thermostats, à 2 niveau de chauffe possibles et des plages découpées à la demi-heure) est mission impossible ou presque (et je n'ai pas que ça à faire)
  • il fallait ensuite envoyer l'info à mon serveur à la maison pour que ça finisse d'une manière ou d'une autre dans mon Arduino
  • il fallait enfin modifier le sketch de l'Arduino afin que lui aussi gère toutes ces données, et cette mission me paraissait aussi plaisante que celle du premier point
J'ai donc cherché sur le web des solutions clés en main, sachant que l'aspect graphique devait être pré-maché au maximum: j'ai réalisé cette installation pour l'aspect Arduino, pas pour passer des heures à faire des pages web.
Je suis donc rapidement tombé sur le seul candidat potentiel: le calendrier de Google, d'autant que j'ai vite vu que Python est l'ami de Google, et que des librairies de mise en oeuvre sont existantes.
Google Calendar permet de s'affranchir de tout l'aspect graphique, est utilisable partout car il n'y a pas de client à installer, et marche même dans l'univers Android. On peut donc même faire chauffer la maison quand on est dans le train, histoire qu'il fasse bon quand on arrive à la maison !

Pré-requis
Pour pouvoir mettre en oeuvre cette interface entre Google Calendar et Arduino, il faut:

  • Un accès Gmail
  • L'id du calendrier
  • un PC faisant l'interface entre Arduino et le www, hébergeant un script python qui va récupérer les données dans Google Calendat
Accéder à Google Calendar
Sous Google Calendar, afin de ne pas trop polluer mon planning utilisé pour la vie courante, j'ai créé un nouvel agenda en cliquant sur la liste déroulante située à coté de Mes agendas

Il faut ensuite récupérer l'ID de cet agenda, il nous sera utile pour y accéder depuis le code Python.
Cliquer sur la liste déroulante située à côté de l'agenda créé (Thermostat dans mon cas), puis sur Propriétés
L'ID de l'agenda est visible au niveau de l'URL.
Attention à ne pas récupérer l'adresse dispo au niveau de la zone d'insertion du planning: ça risque de ne pas fonctionner


Thermostat d'ambiance
L'avantage indéniable de l'utilisation d'un agenda est de pouvoir définir des plages de chauffe précises, répétables facilement, et dans lesquelles il est possible de définir une température précise.
Mon choix s'est porté sur la synthaxe suivante:
Th_nom-sonde:température-désirée

En complément, j'ai défini une synthaxe simplifiée:
Th_nom-sonde, ou même Th_
Dans ce cas, la température appliquée est une température définie en configuration (par l'intermédiaire d'une page web).

Afin de ne pas avoir à tapisser tout le planning de plaquettes, une absence de plaquette entraîne l'application  automatique d'une autre température de consigne, telle que la température hors gel qu'on trouve sur les thermostats habituels


Il est donc toujours possible d'utiliser le thermostat à minima:
  • pas de plaquette = température hors gel
  • plaquette sans consigne = température de consigne

Google Calendar est interrogé toutes les 5mn. Par l'intermédiaire d'une séquence spécifique, il est possible de forcer une interrogation immédiate de l'agenda


Paramètres par défaut
En complément des 2 températures une valeur de delta (écart de température à atteindre pendant le cycle de chauffe avant l'arrêt du chauffage) est définie, ainsi qu'un capteur de température.
Ces paramètres sont modifiables par l'intermédiaire d'une page web sécurisée, et récupérés toutes les 10mn par le script Python.
Par l'intermédiaire d'une séquence spécifique, il est possible de forcer une prise en compte immédiate de ces valeurs

Zoom sur les échanges de données
Ci-dessous, un résumé (un peu succinct) des échanges entre les modules principaux: web, PC, Arduino:

Récupérer les données de Google Calendar
Le code Python permettant de récupérer les données de Calendar est simple. Il récupère la liste des évènements de la journée, puis contrôle si des évènements sont actifs au temps courant.
Si un évènement est actif, le titre de la tâche est récupéré puis traitée pour être transmise à l'Arduino

Connexion à Google Calendar sur la plage désirée (la journée courante):

import gdata.calendar.service
import gdata.calendar
import datetime

cal_client = gdata.calendar.service.CalendarService()
cal_client.email = "VOTRE_LOGIN"
cal_client.password = "VOTRE_PASSWORD"
cal_client.source = 'Google-Calendar_Python_Sample-1.0'
cal_client.ProgrammaticLogin()

query = gdata.calendar.service.CalendarEventQuery('ID_CALENDAR@group.calendar.google.com', 'private', 'full')
auj=str(datetime.date.today())
query.start_min = auj
dem=str(datetime.date.today()+datetime.timedelta(1))
query.start_max = dem
feed = cal_client.CalendarQuery(query)

Contrôle des heures début/fin des consignes:

for event in feed.entry:
    for a_when in event.when:
        str_date_deb=a_when.start_time
        # Passage du format str au format datetime, pour pouvoir contrôler ensuite les heures de début/fin avec l'heure courante:
        date_deb = datetime.datetime(int(str_date_deb[0:4]) , int(str_date_deb[5:7]), int(str_date_deb[8:10]), int(str_date_deb[11:13]), int(str_date_deb[14:16]), int(str_date_deb[17:19]), int(str_date_deb[20:22]))
        str_date_deb=a_when.end_time
        date_fin = datetime.datetime(int(str_date_deb[0:4]) , int(str_date_deb[5:7]), int(str_date_deb[8:10]), int(str_date_deb[11:13]), int(str_date_deb[14:16]), int(str_date_deb[17:19]), int(str_date_deb[20:22]))
   
        if ((date_deb<=datetime.datetime.now()) and (date_fin>=datetime.datetime.now())):
              print "Cons.:",event.title.text  
              print "Debut:",date_deb
              print "Fin:",date_fin

Voilà !
Vous avez normalement tous les outils vous permettant de lire le contenu de Google Calendar. Google permet aussi bien d'autres actions, comme créer de nouvelles entrées par exemple.



PS: Merci à Code 18 pour cette modif permettant d'insérer du code proprement dans blogspot !

20 commentaires:

Code 18 a dit…

C'est original comme solution. Je reviendrai lire les développements, je suis curieux de voir jusqu'où tu pourras faire évoluer ton projet. Bonne continuité.

Jamais sans mon scoot' a dit…

Et bien en fait ce n'est même pas encore très clair dans ma tête ...
d'une part il me manque un moyen 'propre' de forcer une modif immédiatement, sans attendre le cycle de 5mn. J'ai bien une solution à l'heure actuelle, mais pas très pro. J'aurais voulu faire ça depuis une page web, mais est-il possible de coder une action vers mon PC serveur depuis une page web, n'importe où dans le monde ?
Ensuite, je pense peut-être m'orienter vers une solution 100% embarquée, avec une carte ethernet directement sur l'Arduino, pour me passer de mon PC.
A bientôt donc, surement sur ton blog, et avec plaisir sur ces pages.

Anonyme a dit…

J'ai pas tout compris..

Jamais sans mon scoot' a dit…

Précise ce que t'as pas compris ... et je préciserai pour que tu comprennes ;)

Anonyme a dit…

Bonjour,
D'abord merci pour cette très bonne idée que j'ai reprise pour ma propre solution de gestion de chauffage a base de carte arduino.
Ma variante n'utilise pas un script python mais une page php qui récupères les infos du calendrier google via appels curl. La carte arduino appelle la page php toutes les 5mm qui lit le calendrier, calcules les consignes en fonction des éléments du calendrier et renvoi les consignes a l'arduino.
Je rencontre le même soucis conceptuel que toi, comment faire prendre en compte les changements sans attendre les 5mm ?
Comment as tu finalement réglé cela ?
Merci d'avance de ta réponse...

Jamais sans mon scoot' a dit…

Bonjour,
je suis curieux de voir la solution que tu as suivi pour faire des recups via appels curl. As-tu un lien, soit vers ta solution, soit vers un exemple ?
De mon côté; Google Calendar me sert toujours à programmer mon thermostat, mais je ne fais plus de modifs demandant une réactivité de moins de 5mn par celui-ci. J'ai développé une IHM dispo sous Windows, dont l'explication est dispo dans le blog, et une version nomade sur tel Android, qui me permet de le déclenché depuis un widget. Le temps de prise en compte est de l'ordre de 5 à 10 secondes avec ces 2 solutions.
Ces 2 solutions viennent donc en complément de G Calendar, pour les déclenchements non prévus (par exemple si je rentre 2 heures plus tôt que prévu de la sortie du week-end).

Je mettrai prochainement le widget Android sur le blog, mais il faut que je le retouche: les noms de mes sondes y sont pour le moment collées en dur.

Thierry Brami a dit…

Salut,
Je trouve ton système très intéressant :-)
Voulant faire un thermostat programmable via mon téléphone android et ayant peu de matériel pour le moment, je vais rapidement faire une petite commande sur ebay.
J'ai un compte google, un calendrier google, un compte dropbox et un Orangutan SVP-324 Robot Controller usb (mais je voudrai le garder pour une autre application).
Déjà j’aurais une p’tite question sur les sondes DS18B20; j’ai vu sur ebay 3 types : simple composant, composant avec capa de découplage sur un mini pcb et une sonde étanche. Que me conseillerais-tu en intérieur ?
Ensuite tu utilises un PC constamment allumé chez toi. Si tu devais te passer de ce PC qu’elle serait ta liste de course ou quel est le projet déjà existant que tu ferais?
Merci
et @+
Thierry

Jamais sans mon scoot' a dit…

Salut Thierry,
Merci pour ton commentaire.
Concernant le ds18b20, il y a en effet plusieurs modèles sur ebay. Perso j'ai pris la plus simple car c'était la moins chère...
Je lis que tu vas vouloir commander ton thermostat par ton tel android ... il faut que je me bouge et que je poste le binaire du widget !
J'utilise toujours un PC (qui ne me sert pas qu'à ça d'ailleurs). Je pensais rajouter une carte ethernet pour rendre ma conf autonome... finalement, je vais peut-être me tourner vers une carte rapsberry pi. Pour un prix équivalent à une carte Ethernet, j'aurai une solution clé en main...
Bon dev', et n'hésite pas en cas de pb!

Thierry Brami a dit…

Salut,
Non, ce n'est pas la peine de te dépêcher! Je suis loin d'être prêt et en plus le ds18b20 que j'ai pris sur ebay à 2€ devrait arriver que dans 15j (il viens de chine).
Pour le coeur du système, je préférerai effectivement utiliser une conf autonome pour ne pas laisser le PC allumé.
Si tu vas vers une solution "Raspberry Pi" (Type B 512 Mo à 50€)es ce que la migration Pc + arduino vers Raspberry Pi sera facile? ou es-tu obligé de refaire tout tes programmes ?
@+
Thierry

Thierry Brami a dit…

ça y est j'ai suivi ton conseil.
J'ai commandé un Raspberry Pi" Type B 512 Mo pour 45€ hier soir.
Une sonde ds18b20 2€, une autre SHT11 à 4€, une carte interface avec 2 relais à 2€.

Si j'ai bien compris avec le Raspberry je n'aurai plus besoin d'utiliser d'arduino pour controler ma chaudière?

Si c'est le cas, il me manquera plus qu'une carte SD, installer un système d'exploitation, je crois qu'il y en a plusieurs et je ne sais pas trop le quel choisir?
Et acheter une alim 5V 2A microUSB pour le Raspberry.

Après ...

Thierry Brami a dit…

Hello,
ça y est j'ai reçu mon Rpi.
Installé une carte SD avec Raspbian.
Installé un ds18b20 sur un des Gpio.
--> Résultat: j'arrive à lire la température du capteur de température en 1-wire :-)

A présent il me reste plus qu'a trouver comment adapter ton projet avec le Rpi et le controler avec google Calendar.

Jamais sans mon scoot' a dit…

Hi,
désolé de ne pas avoir répondu plus tôt ... par défaut, quel est l'OS installé sur le Rpi ?
Chez moi, le contrôle de Google Calendar passe par un script Python, donc aussi bien portable sous Linux que Windows ...
Attention, je pense que c'est moi qui vais te démarcher dans le futur: tu prends une sacré avance sur moi !

Thierry Brami a dit…

Salut,
J ai bien avancé. Je pense que tu m as bien dirigé vers le Rpi. Ça semble être une très bonne solution.
Par contre je ne fait que prendre des bouts de codes par ci par là sans tout comprendre.
J ai ouvert un petit sujet ici pour avoir un soutien et partager mon projet: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=65&t=39905&sid=d6c21e6a3fe532b1b36ee5b2975b8b12

En 1 mois, j ai facilement mesuré une température, fait les courbes sur 1 an.
Testé une sortie gpio sur un relais et commandé ma chaudière en fonction d une température fixe dans un fichier txt.
Ensuite grâce à ton script python j ai récupéré des événements sur un calendrier Google.
Et j en suis là ;-)
Par contre étant en vacance je peux pas trop continuer mais je regarde de temps en temps les différents projets.
À+
Thierry

Jamais sans mon scoot' a dit…

Bonjour Thierry,
J'ai bien reçu ton dernier commentaire, mais j'ai fait une fausse manip: j'ai cliqué par erreur sur Supprimer au lieu de Publier !
Et c'est une shot: impossible de le récupérer après coup!
Tu peux donc le republier si tu veux. Je suis en tout cas heureux que ta solution fonctionne. Pour répondre a ton autre question: oui, on veut aller à la Réunion, ça fait déjà plusieurs années qu'on se tâte, et je suis déjà allé faire un tour sur le site de ton frère via ton profil, mais je ne me suis pas attardé : c'était trop douloureux ;)

Thierry Brami a dit…

Hello, je sais plus ce que j'avais écrit.
En résumé, le programme fonction très bien depuis 3 semaines sur le Rpi et google calendrier.
A présent le soleil est de retour et j'espère ne plus avoir besoin de chauffer la maison avant le mois de septembre ;-)
J'ai partagé le code python ici: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=65&t=39905&sid=d6c21e6a3fe532b1b36ee5b2975b8b12

Pour la Réunion, il faut surveiller les promos des vols parce qu'en juillet/aout c'est vraiment hors de prix.
Pour le gîte de mon frère il fait de temps en temps des promos suite à des désistements de dernière minute ou sinon envois moi un mail avec tes dates et je verrais s'il peut te faire une petite remise ;-)

http://www.gite-lareunion.com/FR1/tarifs.php#promotion

Ce qui est bien en ce moment c'est que les baleines approchent les cotes et on peut les observer de son ponton.
@+
Thierry

Jamais sans mon scoot' a dit…

Moi aussi, j'espère ne plus enfin a avoir a chauffer... pour la Réunion, ça se fera plutôt en fin d'année. Je ne manquerai pas de regarder sur le site de ton frère! Nos voisins étant Réunionais, ils nous relancent régulièrement... donc c'est sûr, on y finira un jour ;)
Nous, nous étions plutôt Ile Maurice (on y est allé 2 fois, le retour a été douloureux à chaque fois).
Dès que j'investis dans le Rpi, je me jete sur ton code... L'été devrait y être propice...

Thierry Brami a dit…

Attention pour Noël ... Jour de l an les gîtes sont souvent réservés 1 an à l avance.
Par contre les 2 premières quinzaines de décembre sont souvent pas totalement réservés.
Il fait très chaud à cette période et les leetchis sont prêt pour noël. Les billets d avions à noël sont presque 2 fois plus chère et s arrachent comme des petits pains.
Si tu as besoin de conseils sur le Rpi n hésites pas. Bonne journée Thierry

Jamais sans mon scoot' a dit…

Merci pour les conseils...
Pour le RPI je n'hésiterai pas. J'ai parcouru le fil que tu avais ouvert... très fourni en conseil, la communauté est active, c'est super...
A bientôt !

Francois ROLAND a dit…

J'ai suivi le tuto mais obtient un message d'erreur me disant que
des fonctions du modules ne sont pas reconnus

Des idée?

Vincent L a dit…

Bonjour,
Les sketchs datent de l'époque où l'ide était en version 023. Il est fort probable que si vous êtes en version 1.0.x, il y ait des erreurs car certaines librairies ont changées

Enregistrer un commentaire

Laissez vos commentaires ...