[1/5] CREER SON SITE DOMOTIQUE AVEC ZIBASE, NAS SYNOLOGY, MYSQL ET WORDPRESS

Aller à l'article suivant sur le même thème (dispo depuis le 19/06/2013)

SCRIPT "INTELLIGENT" DE RÉCUPÉRATION

DES DONNÉES SONDE EN PULL


Et oui, ma moitié m'a fait une très bonne surprise pour mon anniversaire et m'a offert un NAS SYNOLOGY 213+.

Au delà de toutes les fonctionnalités possibles avec ce NAS (image, vidéo, surveillance, fichier, sauvegarde...), je me suis surtout penché sur le développement de scripts en PHP tournant à intervalle régulier (CRON=tâches planifiées) permettant de récupérer les données de la ZIBASE depuis le NAS.

Cette solution permet de moins solliciter la ZIBASE tout en étant indépendant d'un hébergeur externe. Bien évidemment, cette même solution peut être mise en œuvre sur un PC/SERVEUR, un autre NAS ou tout autre machine pouvant faire tourner du PHP et MYSQL. Je ne détaillerai pas ici la configuration du NAS car plein de tutoriels répondent déjà à ce besoin.

Ce premier article va faire l'objet d'une petite série (si j'arrive à m'y tenir) pour vous présenter une solution complète de restitution des données sous forme instantanée, sous forme de tableaux, de graphes avec gestion des évènements et modifications des sondes utilisées; le tout avec PHP, MYSQL et WORDPRESS parce que je ne suis pas très doué en développement et que cela permet de faciliter la présentation du site tout en intégrant facilement du PHP (via l'extension WORDPRESS Shortcode Exec PHP).

Bon, pour ce premier opus, entrons dans le vif du sujet pour enregistrer en pull les données des sondes. Vous trouverez en pied de ce post un ZIP vous donnant les éléments suivants :
  1.  Répertoire communs :
  •  sous-répertoire db : ce répertoire contient le script SQL permettant de créer les tables de dla base de données. Pour ma part, j'ai créé une base nommée ZIBASE (original le garçon !). Ce script créé :
    • 5 tables permettant d'accueillir les données de différents type de sonde en pull. Les tables concernées sont les suivantes :
      • TEMPERATURE
      • ANENOMETRE
      • PLUVIOMETRE
      • UV
      • ELECTRICITE
    •  3 tables permettant d'accueillir les données de certains actionneurs en push. Les tables concernées sont les suivantes :
      • VMC_ETAT (Etat vitesse 1 ou 2)
      • ALARME_ETAT (Etat ON/OFF)
      • CHAUFFAGE_ETAT (Etat allumé/éteint)
    • 1 table nommée EVENEMENTS permettant d'accueillir et de logger des évènements d'information ou système
    • 1 table nommée PERIPHERIQUES contenant les sondes déclarées dont vous souhaitez enregistrer les données avec les noms de tables dans lesquelles enregistrer les données, le code de la sonde dans la ZIBASE , le nom dans la ZIBASE , le nom en clair et un ordre d'affichage.  Par exemple, voici pour ma part, comment elle est remplie aujourd'hui :
  

Le script CRON PHP interrogeant la zibase en pull, interrogera également la ZIBASE (sur zibase.net) pour mettre à jour le code des sondes dans cette table automatiquement en cas de changement de piles. La mise à jour du code de la sonde se fera grâce au nom du périphérique déclaré en ZIBASE (nommé nom_zibase dans cette table). J'ai préféré utiliser ce système car je ne change jamais le nom de mes sondes et ne voulais pas utiliser "l'Identification des sondes seulement par leur canal" dans les options système de la ZIBASE (limitation du nombre de sondes, ré-association obligatoire de toutes les périphériques, bug...). Chacun jugera de l'intérêt de cette solution.
  • sous-répertoire include  : contient deux fichiers :
    • config.php : contient tous les éléments nécessaires pour se connecter à votre base. Contient également 3 fonctions utilisées dans d'autres scripts :
      • function exec_query($requete) permettant d'exécuter une requete SQL,
      • function date_diff2($date1,$date2,$mode) permettant de calculer une différence entre deux dates,
      • function getSensorList($idprincipalzibase,$tokenzibase) permettant de récupérer toutes les sondes déclarés dans votre ZIBASE. Cette fonction va être appelé dans le CRON pour mettre à jour vos périphériques déclarés dans la table PERIPHERIQUES.
    • connect_db.php : contient uniquement les éléments pour se connecter à la base de données.
  • sous-répertoire lib : contient le fichier zibase.php qui est la librairie PHP développé par Benjamin GAREL que je remercie (voir ici http://bgarel.free.fr/Zibase/). A noter que pour l'instant dans cette librairie, je n'utilise que la fonction function getSensorInfo($idSensor) qui permet de récupérer les valeurs retournées par une sonde donnée. A noter un bug dans la fonction d'origine car Benjamin ne prenait que l'heure GMT de la sonde et non la date complète. Cela posait des problèmes lors de l'enregistrement d’éléments peu de temps après minuit, je récupérai la date du jour avec l'heure de la veille donc 18/06/2013 23:57 au lieu de 17/06/2013 23:57. J'ai corrigé et commenté la modification dans le script que je fourni dans l'archive. 

     2. Répertoire cron

 Ce répertoire ne contient qu'un script enrsondes.php qui fait deux actions principales :
  • mets à jour automatiquement la table PERIPHERIQUES à partir des informations récupérées au niveau de la ZIBASE et de la comparaison avec les données contenues dans la table PERIPHERIQUES,
  •  enregistre automatiquement les données des différentes sondes déclarées dans la table PERIPHERIQUES dans les tables correspondant aux sondes (UV, PLUMIOMETRE, ANENOMETRE, TEMPERATURE, ELECTRICITE).
J'ai essayé de commenter le mieux possible le code pour que vous puissiez vous y retrouver et y apporter des améliorations (il y a de quoi faire).

En résumé, télécharger le ZIP, exécuter le script zibase.sql créant les tables, remplir la table PERIPHERIQUES, modifier le fichier config.php avec les éléments de votre MYSQL, et cela devrait fonctionner.

Télécharger le ZIP

Aller à l'article suivant sur le même thème (dispo depuis le 19/06/2013)

Trois petites remarques supplémentaires :
  • les chemins relatifs ne fonctionnent pas sur les CRON (pas de connaissance du contexte),
  • si vous utilisez un NAS ne pas oublier de renseigner les éléments de notifications pour paramétrer votre smtp dans le panneau de configuration. Sinon, vous pouvez paramétrer ces éléments dans le fichier config.php mais je suis fainéant.
  • Depuis DSM 4.2 sur SYNOLOGY, vous pouvez lancer ces scripts dans le planificateur de tâche sans avoir à entrer dans la partie linux. Néanmoins, il est impossible lancer un CRON tous les jours et tous les 1/4 d'heure (uniqueement toutes les heures). Du coup, j'ai créer 4 tâches différentes qui appel le même script toutes les heures mais chacun avec 1/2 heure de décalage (voir ci-dessous)