samedi, 01 mars 2014

Raspberry-pi : Interface Météo

météo,interface web,gui,sensor,température,modules,sqlite,station météoDans mon premier post sur le Netatmo je vous avais dis que Netatmo possédait une documentation pour les développeurs ainsi que des Api et je me suis dis que je pourrais récupéré la valeur du thermostat pour l'incorporé dans ma base de donnée. Quand j'ai eu mon Netatmo j'ai pu grâce a l'api et enregistrer dans ma DB temp les valeurs toutes les 30 minutes avec mon raspberry. A présent, mon Raspberry pi enregistre la température de mon salon ainsi que la température de mes chambres ainsi que la température extérieur je vous détaillerais tout cela plutard.

Vu que j'avais les valeurs j'ai fais quelques recherche pour les mettres en graphique et je suis tombé sur hightcharts qui ont une base de graphique assez sympas avec pas mal de modèles. De ce fait j'ai fait une recherche pour des interfaces utilisant hightcharts et je suis tomber sur un site : "Pi home server: Une station météo Raspberry Pi avec une interface web" , l'auteur avait acheté des modules météo tout fait qui fonctionne par le sérial mais sa sonde lui reviens a presque 40€ et son interface était en hightcharts donc je me suis dis qu'il serais très intéressant de reprendre l'interface de celui ci pour le rendre compatible avec les sonde a 7€ de idleman que je me suis fait(15€ avec batterie) mais par la suite j'aimerais rajouter des sondes a 12€(Extra sensor TFA Quadro ou cresta TX-320) que j'ai trouver sur le net j'en parlerais sur un prochain tuto si j'arrive a trouver de la doc sur le protocole rf .


Concrètement, le résultat final devrais ressembler a ceci

météo,interface web,gui,sensor,température,modules,sqlite,station météo

Le résultat est fort proche de l'interface de Pi Home server car je me suis tout simplement basé sur son interface que j'ai adapté a mes besoins.

Prérequis

Pour faire fonctionner l'interface on va avoir besoin de nginx et sqlite3 si vous voulez installer nginX/sqlite3 suivez la procédure ici Raspberry-Pi : Config serveur Lesp mais si vous avez apache et mysql, les scripts utilisé ici sont pour sqlite donc vous pouvez essayer d'adapter les scripts pour mysql mais moi sur mon pc j'ai apache avec sqlite et mysql, d'autre part il vous faudra aussi avoir python d'installer sur votre pi.

Création sqlite (base, table, valeur)

 Dans un premier temps il va falloir nous crée la DB qui va accueillir tout les résultats et permettre de les afficher dans le graphique, donc rendez vous sur votre pi dans le dossier ou vous voulez que soit l'interface pour faire simple j'ai préféré prendre /var/www donc on y va et on lancer sqlite en créant la Db dans le répertoire tmp

sudo mkdir /var/www/tmp
cd /var/www/tmp sqlite3 temp.db

On va crée plusieurs tables, une sera utilisé pour les valeurs, une pour les noms des émetteurs pour le graphique(si il n'y a pas de nom dans cette table la rien ne s'affichera sur le graph) et un table éphémérides pour les valeurs récupérer par le Script de Pi home server.

Voici les lignes a entrer pour crée les table dans la base de donnée

CREATE TABLE temptest (ID INTEGER PRIMARY KEY AUTOINCREMENT , sonde INT , valeur INT, signe INT, sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL );
CREATE TABLE Emetteurs (Id NUMERIC, Volt REAL, VoltUpdate TEXT, Localisation TEXT, DateFreq TEXT, Type TEXT);
CREATE TABLE Ephemeride (Date TEXT, Fete TEXT, SolLever TEXT, Sol Coucher TEXT, LuneLever TEXT, LuneCoucher TEXT);

Sur mon pi sa a donner comme ceci : 

météo,interface web,gui,sensor,température,modules,sqlite,station météo

Maintenant que les tables sont crée on va pouvoir les tester, pour ce faire je vais vous copier quelques valeur de mon propre fichier (également disponible ici pour les fénéants :p)

Voici quelques exemples de donnée : 

INSERT INTO Emetteurs VALUES(10,5.0,'2014-02-22 15:38:54','Chambre B',433,'Temp');
INSERT INTO Emetteurs VALUES(11,4.8,'2014-02-22 18:25:55','Chambre A',433,'Temp');

INSERT INTO Ephemeride VALUES('2014-02-20','Sainte Aimée','07h49','18h18','-','09h54');
INSERT INTO Ephemeride VALUES('2014-02-21','Saint Pierre Damien','07h48','18h20','01h00','10h28');
INSERT INTO Ephemeride VALUES('2014-02-22','Sainte Isabelle','07h46','18h22','01h36','11h08');

INSERT INTO temptest VALUES(1,11,18,1,'2014-02-21 14:01:07');
INSERT INTO temptest VALUES(2,10,23,1,'2014-02-21 14:01:18');
INSERT INTO temptest VALUES(3,11,19,1,'2014-02-21 23:01:02');
INSERT INTO temptest VALUES(4,10,22,1,'2014-02-21 23:01:17');
INSERT INTO temptest VALUES(5,10,23,1,'2014-02-22 10:01:13');
INSERT INTO temptest VALUES(6,11,20,1,'2014-02-22 10:02:07');

 Dans mon exemple ici vous pouvez voir 2 sonde, la 10 et la 11, mais dans la pratique chez moi, les sondes de 0 a 15 sont les code réservé pour les sondes radio (en binaire 1111 = 15) et j'ai attribuer des codes au delà pour les scripts d'encodage dans la base Sql, par exemple le 20 correspond a mon Netatmo le 16 a la température extérieur.

météo,interface web,gui,sensor,température,modules,sqlite,station météo

Si vous n'aimez pas l'interface en ligne de code, vous pouvez ouvrir la DB avec le programme SQL Database Browser, c'est un programme qui mettra en graphique tout les lignes et vous permettra de modifier ligne par ligne.

Interface web

Voici mon package modifier avec le script pour ma ville (Milmort) ainsi que les éphémérides (de météo france).

Ce dossier représente mon répertoire /var/www si vous voulez le déplacer n'oublier pas de changer l'emplacement de la DB dans l'index et les scripts ainsi que les exécutables et lien pour les scripts.

Pour les personnes qui n'ont pas de sondes radio mais qui aimerais enregistrer la température de leur raspberry pi , la température de la pièce où est le raspberry ainsi que la température extérieur le principe est le même il vous suffit juste de crée un script pour qu'il encode dans la base sql de cette façon : 

INSERT INTO temptest(sonde,valeur) VALUES(16,25);

 Donc l'interface est a placer directement dans "/var/www/" pour la DB soit vous garder la votre dans "/var/www/tmp" ou prenez la mienne avec plus de valeurs.

 Si vous souhaitez changer les couleurs des tracés, il suffit de modifier les codes couleurs dans la lignes "colors".

 Vu que mes sondes ne renvois pas encore le voltage restant sur la batterie j'ai désactivé l'affichage des lignes Volt du sqlite, mais si vous avez des valeurs pour le voltage, rien ne vous empêche de dé-commenter pour le remettre en fonction.

 Par défaut j'ai déjà mis plusieurs périodes (36h, 3 jours, 1 semaine, 1 mois, 6 mois) mais si vous souhaitez rajouter des périodes (2 mois, 4 mois, 1 an ...) il vous faudra crée une entrée en plus pour l'array_push des graphic ainsi qu'un div item en plus dans le myCarousel (j'ai laissé un exemple en ligne 284 et 448).

 

Les Script pythons

 Pour le script j'ai pris le code des éphémérides de Pi Home Server et je l'ai modifier car je n'ai pas trouver d'autre façon plus simple que celle qu'il a utilisé pour aller sur une page Web chercher une chaîne de caractère et l'introduire dans une base de donnée.

Ces scripts utilise Python, donc si vous avez pas vu en haut que je disais de l'installer voici la commande pour l'installer.

sudo apt-get install python

 Une fois python installer on va aller crée des lanceurs pour lancé la prise de mesure afin de pouvoir facilement lancé a la demande le script et facilement l'intégré au crontab.

Donc les scripts de lancement on va devoir les mettre dans le dossier des exécutables donc on s'y rend et on crée un premier fichier pour les éphémérides

cd /usr/bin
sudo nano ephemeride

Voici ce qu'on va devoir mettre dans le fichier pour pouvoir lancer ephemeride.py

#!/bin/bash

cd /var/www/python
sudo ./ephemeride.py

 Vous sauvez puis quittez et on rend le lanceur exécutable

sudo chmod 777 ephemeride

 Pour la météo extérieur de votre localité il faut dans un premier temps crée un script dans /usr/bin qui nous servira de lanceur

#!/bin/bash

cd /var/www/python
sudo ./exterieur.py

 Vous sauvez puis quittez et on rend le lanceur exécutable

sudo chmod 777 exterieur

Maintenant je vais essayer de vous expliquez comment adapter le script pour aller chercher la météo de votre ville. Donc si vous avez un site où vous allez souvent voir votre météo il suffit de faire un wget sur la page de votre localité (Milmort 7sur7 dans mon cas) et une fois la page du site télécharger regarder le code puis rechercher ou se trouve la température, essayer de trouver les caractères devant puis ceux derrière la valeur de la température puis ensuite faite une recherche sur ces caractères et si vous ne trouver aucune utilisation des même caractères vous pouvez prendre le site en question puis allez modifier le script "exterieur.py" qui est présent dans www/python pour l'adapté à votre ville..

Dans mon cas j'ai ceci comme format pour la température : 

<h2>4°C</h2>

 J'ai donc fait une recherche pour <h2> dans la page et je sais que vu qu'il n'y en a aucun je peu prendre ce site la, maintenant j'ai du faire quand même 3 site web pour trouver un ou les balises était utilisé qu'une seule fois donc on adapte le code du script pour Milmort c'est comme ceci : 

for line in f:
    m = re.search('<h2>(.+?)°C</h2>', line)

 De ce fait il ira toujours rechercher ce qu'il y a entre les balises "<h2>" et "°C</h2>", dans mon cas sa a été simple sur 7sur7 mais ce n'est pas toujours le cas.

 Maintenant pour rendre automatique le lancement des scripts vous pouvez faire un crontab

crontab -e

vu que les éphémérides se mettent a jours tout les jours on fait un script qui se met a jour tout les jours et pour la température extérieur comme il n'y a pas de décimales autant le faire toutes les heures donc on inscrit ceci a la fin a la fin du crontab

15 2 * * * ephemeride
8 * * * * exterieur

Donc tout les jours a 2h15 les éphémérides se mettrons a jour et toute les Xh08 se sera la température extérieur. 

 

Résultat Final

 

météo,interface web,gui,sensor,température,modules,sqlite,station météo

météo,interface web,gui,sensor,température,modules,sqlite,station météo

Écrit par Viskor dans Astuces, Domotique, Ecologie, Netatmo, Raspberry-Pi |  Facebook | |