Aller au contenu
pinou

Zibasegateway Pour Hc2

Recommended Posts

Après le calendrier Google, je me suis attaqué maintenant à  ma Zibase. En effet, j'ai commencé la domotique il y a quelques temps de ça, avec une Zibase. Depuis elle ne m'a jamais quitté. Même si aujourd'hui j'ai migré (pratiquement) tous mes modules zwave sous la Home center, j'utilise toujours ma Zibase pour les devices Oregon et EnOcean essentiellement. 

J'ai vu passer différentes solutions permettant de récupérer les infos/valeurs de ces modules au sein de la HC2. Ceci dit, rien de satisfaisant pour moi, car les solutions sur lesquelles je suis tombé font essentiellement du pooling vers la Zibase, or j'ai besoin de temps réel. Pas pour les relevés des sondes Oregon mais pour les détecteur d'ouverture EnOcean. Je me suis donc amusé à  trouver une autre solution répondant à  mon besoin.

 

Le principe

Le principe est assez simple : plutôt que d'aller voir de façon périodique l'état des devices de la Zibase, je me suis dit qu'il suffit en fait "d'écouter" ce que broadcast la Zibase et de chopper dans ce flux ce qui m'interesse. Il suffit alors de passer par l'api de Fibaro pour mettre à  jour les variables correspondantes dans ma HC2.

 

Dans le détail...

Il s'agit d'un script PHP que j'ai hébergé sur mon syno (mais un RPI ou toute autre machine pouvant faire tourner du PHP 24h/24 suffit). Pas besoin de configurer un serveur web puisque le script PHP tourne en mode CLI (lancé automatiquement au démarrage du syno dans mon cas).

Lors du lancement du script, ce dernier va s'abonner aux messages de la Zibase.

Il va donc recevoir un flux de ce type a chaque fois qu'un device remonte une info vers la Zibase :

Received radio ID (<rf>433Mhz Oregon</rf> Noise=<noise>2420</noise> Level=<lev>3.4</lev>/5 <dev>Temp-Hygro</dev> Ch=<ch>2</ch> T=<tem>+18.4</tem>C (+65.1F) Humidity=<hum>45</hum>%  Batt=<bat>Ok</bat>): <id>OS439218434</id> 

On décode alors ces données pour pouvoir mettre à  jour la ou les variables associées au niveau de la HC2.

Un des points délicats concerne la configuration du fichier permettant de mettre en place ce décodage.

 

Le fichier de configuration des messages de la Zibase

Ce fichier est donc un des éléments essentiels de cette solution. Il s'agit d'un fichier json (pour la facilité de lecture et construction). Il y a 2 parties dans ce fichier : 

Un premier élément de configuration permettant de définir les différents protocoles radio qui seront reconnus par le script. On vient dire ici, par protocol (Oregon, EnOcean, ...) et par type de device (Détecteurs, sondes température, etc.) quelles sont les données qu'il faut récupérer dans le flux correspondant.

Un second élément permet de définir pour chaque device reconnu (par son ID Radio) quelles sont les variables qui seront mise a jour avec quelles données. On indiquera également si cette mise a jour doit se faire à  chaque remontée d'info (exemple du détecteur), ou seulement si la donnée à  été modifiée depuis la dernière mise à  jour (afin de ne pas saturer la HC2 de requêtes inutiles).

Autant vous prévenir tout de suite, cette configuration est chiante à  souhait à  mettre en place, mais bon j'ai pas trouvé plus simple et/ou plus automatisé. Ceci dit, une fois au point, on y touche plus !

 

Le script PHP

Ce dernier vient avec un script contenant les variables de configuration dont les valeurs sont à  modifier en fonction de votre installation. C'est assez explicite, je ne vais pas m'attarder dessus.

 

Côté Home center

Alors ici, il y a quelques petites choses à  faire. Le plus gros problème est que je passe par l'api HTTP pour mettre à  jour les variables. Or par ce biais, même si la mise à  jour fonctionne, elle ne permet pas de déclencher les scènes et autres scripts qui seraient basés sur ces dernières (limitation de Fibaro ... va comprendre pourquoi ...). Du coup, j'ai implémenté la solution proposée par Jojo dans un autre post qui consiste à  passer par l'intermédiaire d'un bouton de module virtuel qui vient mettre à  jour la variable avec sa valeur. 

Bon ne pouvant pas m'amuser à  créer un bouton pour chaque valeur discrète possible et imaginable, le script PHP va mettre à  jour 2 variables permettant de stocker le nom de la variable finale à  mettre à  jour et sa valeur(1). On va ensuite déclencher le module virtuel (2) qui va récupérer ces données (3) et mettre à  jour à  son tour la variable désirée avec la bonne valeur (4). Et voilà , les scènes basées sur cette variable fonctionnent du coup (5) ! 

Je ne sais pas si vous me suivez toujours dans mon raisonnement (un peu tordu), j'essaye de vous faire un p'tit dessin pour illustrer la chose :

script PHP ---------+----(1)--->zibaze_variable = "anemometre" <-.

                                 +----(1)--->zibaze_value = "3.2" <-----------+
                                  |                                                                          (3)
                                  `----(2)--->VModuleID = 99, PushButton n°1 --+
                                                                                                               |

                                                                                                              (4)
                                                                                                               |
                                                                                                               v
                                                                                                   anemometre = "3.2"
                                                                                                               |
                                                                                                              (5)
                                                                                                               |
                                                                                                               v
                                                                                           scene "FermetureStore" start

Installation

Du coup l'installation de tout ce bordel s'effectue en plusieurs étapes :

 

A/ Pour la partie PHP il faut 

1) Poser les différents fichiers dans un espace sur votre serveur et connectez vous dessus (ssh, telnet, ...)

2) Modifiez le fichier zibaseGateway_config.php et zibaseGateway.php afin d'initialiser les variables avec les bonnes valeurs (partout ou il y a des XXXX vous devez configurer en fonction de votre installation)

3) Assurez vous que la variable verbose soit positionnée à  LogType::CONSOLE dans un premier temps (une fois que tout sera au point vous la changerez comme bon vous semble)

4) Lancez le script à  la main

php zibaseGateway.php

5) Si tout va bien, les messages reçus de la Zibase devraient s'afficher à  l'écran. A vous de jouer maintenant pour mettre à  jour le fichier zibaseMessages.json en conséquence. 

6) Arrêtez les script (CTRL+c) et relancez le pour vérifier que la configuration est bien prise en compte correctement. 

 

B/ On passe maintenant au niveau de la Home Center

7) Déclarez les différentes variables que vous avez déclaré au point 5)

8) Déclarez les 2 variables Zibase_variable et Zibase_value (cf. fichier de configuration zibaseGateway_config.php)

9) Importez le module virtuel

 

C/ Le test final

10) Relancez le script et vérifiez que les variables de votre HC soient bien mises à  jour. Si ce n'est pas le cas, reprenez depuis le point 2) : soit vous n'avez pas initialisé vos variables correctement, soit le fichier json ne reflète pas la réalité...

 

D/ Mode automatique

Etant nouveau dans le monde des syno, j'avoue avoir un poil galéré pour que mon script php se lance automatiquement au démarrage du NAS. En gros il faut transformer ce script en deamon.

11) Tout d'abord j'ai modifié la config PHP au niveau de l'interface d'admin du NAS : Panneau de configuration > Services web > Paramètres PHP : cliquez sur personnaliser PHP openbase_dir et rajouter les chemins vers vos repertoires d'installation. Sans cette config vous risquez d'avoir des warnings/erreurs PHP lors de l'exécution.

12) J'ai créé un script SH qui permet de "deamonsier" le script PHP. Il suffit de faire un lien de ce script dans le bon répertoire : 

ln -s S99zibase.sh /usr/syno/etc/rc.d/S99zibase.sh

Et voilà , le script sera lancé ou arrêté automatiquement au startup/shutdown de votre NAS.
Bien entendu, ces différents points sont à  adapter en fonction de votre config...

Maintenant que tout fonctionne, il ne vous reste plus qu'a redémarrer votre NAS et vérifier que les variables HC2 soient bien mises à  jour. A vous de créer des modules virtuels pour afficher l'état de vos variables dans vos interfaces...

 

Remerciements

Un gros merci à 

  • Cmoi20, auteur du projet ZiHome dont je me suis très très fortement inspiré pour mettre en place le script PHP
  • jojo pour sa solution de mise à  jour d'une variable via un module virtuel
  • Bejamin Garel pour son sdk PHP pour la Zibase

 

Téléchargements

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Super !!!!

C'est ce que j'ai fait sur Jeedom en NodeJS

J'ai pas encore tout lu, mais je vais essayer ça ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum cela m'a l'air top, par contre faudra que je lise cela àtête reposé, car làj'ai pas tout pigé :) :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui, y a certainement des parties ou je suis allé un peu vite dans les explications, mais bon, tu verras, ça ne demande pas d'être expert PHP/Linux ;) Et puis s'il y a un pb et que je peux aider, n'héstitez pas a poser des questions ...

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai continué de bidouiller mon module car il y a certaines parties qui ne me plaisaient pas.

En effet, si je prends par exemple ma sonde anémomètre, les données remontées sont exprimées en m/s pour ce qui est de la vitesse et en degré pour la direction du vent. Bon perso, ce genre d'info ne me parle pas trop, je préfère des km/h et des points cardinaux (N, NE, etc.), c'est plus facile pour ma petite tête de se représenter la chose. 

Donc 2 solutions : 

  • soit je modifie le script PHP pour faire la conversion
  • soit je modifie le device virtuel coté HC2 pour faire le job

 

J'ai pris la 2cd solution, car ça permet a chacun d'implémenter sa propre transformation de données et plus (modification des images, etc.) et c'est bien plus accessible que d'aller modifier du PHP sur le serveur...

 

Donc voici 2 exemples d'implémentation : 

 

1) tout d'abord j'ai modifié quelque peu le module virtuel Zibase afin d'associer à  chaque variable traitée, un id de module Virtuel : 

devices = {["Vent_dir"] = 101, ["Vent_ms"] = 101, 
      ["Pluviometrie"] = 102, ["UV_terrasse"] = 103,
  	  ["Baie_1_salon"] = 104, ["Baie_1_salle"] = 105, 
  	  ["Baie_2_salle"] = 106
	 };

Ainsi lorsque je vais traiter la variable Vent_dir ou Vent_ms, je sais que je dois déclencher le bouton n°1 du module dont l'ID est le 101

 

2) Ce déclenchement s'effectue de la façon suivante : 

-- Update VD associated
if (devices[var_name]) then
	fibaro:call(devices[var_name], "pressButton", "1");  
end

3) Reste plus qu'a mettre en place le module virtuel associé. Je suis parti du principe que ces modules ont tous au miminum un premier bouton permettant de déclenche la mise à  jour les informations affichées sur ce dernier.

 

Exemple n° 1 : sonde anémomètre

 

Le code du bouton 1 est donc : 

function round(num, idp)
  local mult = 10^(idp or 0);
  return math.floor(num * mult + 0.5) / mult;
end

-- set icon
local vd_id = fibaro:getSelfId();
local vd_icon = fibaro:get(vd_id, "deviceIcon");
fibaro:call(vd_id, "setProperty", "currentIcon", vd_icon);

-- conversion vitesse en km/h
local vitesse = tonumber(fibaro:getGlobalValue('Vent_ms'));
vitesse = round((vitesse * 3.6), 1);

-- conversion ° en point cardinal
local degre  = fibaro:getGlobalValue('Vent_dir');
local direction  = {"N", "NE", "E", "SE", "S", "SO", "O", "NO", "N"};
local index  = round((degre / 45),0);

-- Mise à  jour du label
fibaro:call(vd_id,"setProperty","ui.Label1.value", vitesse.." km/h"); 
fibaro:call(vd_id,"setProperty","ui.Label2.value", direction[index+1]); 

Et voilà , le visuel : 

post-1175-0-16111300-1425115186_thumb.png

 

Exemple 2 : détecteur d'ouverture

Ici, pas de conversions spécifiques à  faire, je vais juste mettre à  jour l'image du module afin d'être en accord avec la valeur de la variable associée : 

-- set icon
local vd_id = fibaro:getSelfId();
local vd_icon_ouvert = 1081;
local vd_icon_ferme = 1080;

if (fibaro:getGlobalValue('Baie_2_salle') == "ON") then
  fibaro:call(vd_id, "setProperty", "currentIcon", vd_icon_ouvert);
else
  fibaro:call(vd_id, "setProperty", "currentIcon", vd_icon_ferme);
end 

Et voilà  les visuels : 

post-1175-0-43767200-1425115850_thumb.png

 

Le jour ou Fibaro se décidera d'activer les "plugin developer" sur la v4.x, alors avec le Virtual Sensor de Krikroff l'intégration de la Zibase sera nickel ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Pinou pour ton tuto de passerelle via PHP.


 


Je l’ai mis en oeuvre et il est fonctionnel.


 


Cependant, je me pose la question de l’intérêt de ta solution par rapport à  une lecture en pooling du fichier XML de la Zibase ?


 


Étant donné qu’on ne peut trigger sur le changement d’état des 2 variables Zibase_variable et Zibase_value, on est obligé également de faire du pooling pour recopier le contenu de ces deux variables dans les variables respectives (ex: solution Jojo -> loop pour appuyer sur le bouton de ton module virtuel).


 


Ce que je recherche, c’est de pouvoir déclencher instantanément un scénario sur le changement d’état d’une variable globale mis à  jour via HTTP. ex: un interrupteur Chacon associé à  la Zibase permet l’allumage sans latence d’une HUE associée à  la HC2.


 


Si quelqu’un a une solution, je suis preneur.


Partager ce message


Lien à poster
Partager sur d’autres sites

@ducono ce que tu demandes est couvert par la solution que j'ai mis en place, justement pour adresser mon problème au niveau des détecteurs d'ouverture EnOcean que j'ai. Tout est en temps réel. Le script php met a jour les deux variables et déclenche dans la foulée un device virtuel qui traite ces variables. Du coup, le déclenchement des scènes fonctionne. Pas besoin de loop... Relis bien mes posts et aussi le dernier qui donne un exemple de traitement de ces données.

Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

J’avais donc raté quelque chose.


 


Je n’avais pas vu que c’était le script PHP qui demandait l’appui du bouton du VirtualDevice, donc je n’avais pas mis à  jour son ID.


 


Maintenant, ça marche impec!


 


Il ne me reste plus qu’à  automatiser le lancement du script sur le Nas. J’ajouterai plus tard l’état des batteries de chaque capteur.


 


Merci Pinou.


Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour , je viens de tomber sur votre tuto et je trouve l'approche plus efficace que mon polling régulier.

J'ai donc mis en application mais il y a toujours un mais;)  

Tous est bien installé sur le NAs , le script tourne le fichier log se rempli correctement, les variable sont déclarées (Zibase_value,Zibase_variable)sur la Hc2 en v4 mais ne sont pas alimentées.

Pouvez vous m'aider? merci par avance blob.png.bb9167d2a09e22d5c413754421d8853f.pngblob.thumb.png.14d96ac369d9db4fcf95f6b162f3e706.png

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans ton fichier de config, tu as bien mis ceci :

 

$this->homeCenterVersion = FirmwareVersion::VERSION_4; 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai un doute sur les guillemets(') ou (") j'ai remplacé par (") sur hc2 aussi blob.png.a4db7bf3dc836ff72b8929c1ba60ce9f.png

Partager ce message


Lien à poster
Partager sur d’autres sites

bonjour , je pense avoir trouvé le problème mais je n'arrive pas a le résoudre.  cela vient probablement des droits d'ecriture avec la paire admin:password . le compte synolgy que j'ai créé ne peut écrire de variable mais arrive a appuyer sur un vd. Je ne sais pas comment mettre le compte admin qui est maintenant un mail en php.

Partager ce message


Lien à poster
Partager sur d’autres sites

×