ADN182 Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 (modifié) Bonjour, Petit Tuto pour vous aider à faire commniquer les modules de votre Jeedom avec votre HC2. Je voudrais remercier tout d'abord les personnes sans qui cela ne serait jamais arrivé @Lazer @Steven @sebcbien et toute la communauté... But : Le but de ce Tuto est d'interconnecter les devices Jeedom vers la HC2 et uniquement dans ce sens ! (pour l'instant) Mon besoin initiale est d'interconnecter ma centrale d'alarme disposant de capteurs RF (Porte, Mouvement) avec ma HC2 ne faisant pas de RF... Pour que la gestion de l'alarme soit faite par une seule et même interface. Et pour bénificier des capteurs RF (moins couteux et déja présent) afin de les utiliser dans des scénarios de vie. Après avoir lu le post de @sebcbien sur Jeedom je me suis dit : j'ai trouvé une solution pouvant répondre à mon besoin j'ai donc fait l'acquisition d'un module RFXCom 433Mhz et Raspberry. Mon but n'est pas de remplacé ma HC2 mais de lui rajouter la "Techno" RF sans avoir à "gérer" deux box. Et pourquoi pas utiliser les avantages de Jeedom par la suite... Concept : Jeedom va envoyer pour chaque modification de module (capteur pour ma part), un appel (GET) à l'API Fibaro pour mettre à jour un label d'un Virtual Device. Cette modification appelera une Scène qui se chargera de convertir les valeurs données par Jeedom en valeur exploitable pour la HC2 et mettra à jour le device concerné. Alors pourquoi un Device et une Scène pour modifier les propriétées d'un device ? Parce que Jeedom a ma connaissance ne fait pas de requête de type PUT. Celle-ci permette de mettre à jour les propriétées d'un device de notre HC2. De ce fait obligé de "feinté" grace à l'astuce de @Steven (Voir Post Ici) Capteur Fenètre ===> RFXCom ====> Jeedom =========> VD Update HC2 ======> Scène Update HC2 ==========> Modification Value Fake Device RF USB API HTTP LUA LUA (API) Pré-Requies : Il faut nommer les modules dans Jeedom à l'identique dans la HC2 et les mêttre dans la même pièce. C'est ce qui va permettre d'avoir une seul et unique requêtes et de pouvoir se dispenser de connaitre l'ID HC2. Sommaire : Création d'un Fake Device Création d'un Virtual Device Création d'une Scène Mise en place de l'intéraction dans Jeedom 1. Création d'une Fake Device J'utilise ici la procédure de @Lazer (Voir Post ici) En voici les grandes lignes : on inclue un module (du type qu'on souhaite (consommation, température, détecteur, etc)) on le reset (via appui long sur le bouton, selon la méthode décrite dans la doc) sans l'exclure de la HC2 il passe en noeud mort en décoche la case 'marquer comme mort' => le module ne sera plus jamais mort, même si il n'existe plus en peut l'utiliser à vie pour updater ses propriétés via l'API Puis on recommande la procédure décrite ci-dessus autant de fois qu'on souhaite, afin d'avoir une infinité de modules, qui remplacent parfaitement les plugins. Je n'ai aucun mérite juste fait un copier coller de ton post Merci a Lui ! 2. Création d'un Virtual Device Création d'un VD : Nom : UpdaterLabel : Update.DeviceID Label : UD Noter l'ID de votre Virtual Device il nous servira pour la suite, on prendra pour exemple : 333) 3. Création d'une Scène Création d'une Scène en Lua : Nom : Updater Ajouter le code ci-dessous en y modifiant l'ID de votre VD dans les "properties" de la Scène. - OLD - Scène Utilisant l'ID du device. Révélation --[[ %% properties 333 ui.UD.value %% events %% globals --]] fibaro:debug("Start Scene") actions = { ["ui.UD.value"] = function(values) setProperties(values) end, } function setProperties(values) for dev,val in pairs(json.decode(values)) do fibaro:debug(tostring(dev)) fibaro:debug(tostring(val)) if val == 1 then val="true" elseif val == 0 then val="false" else fibaro:debug("Erreur de valeur en entrée différent de 0 ou 1") break; end local http = net.HTTPClient() local url = "http://127.0.0.1:11111/api/devices/"..dev; local jsondata = '{"properties":{"value":' ..val..'}}' http:request(url, { options = { method = 'PUT' , data = jsondata }, success = function(p) fibaro:debug("Sucess, Code : "..p.status) --fibaro:debug(p.data) end, error = function(err) fibaro:debug("Error Code : "..err) end }) http = nil; end end -- =============================== -- Démarrage du script -- =============================== local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end - New - Scène utilisant le Nom des devices Révélation --[[ %% properties 333 ui.UD.value %% events %% globals --]] --------------------------------------------- --- Author : ADN182 --- --- Thanks to Lazer, Sebcbien, Steven --- --- Version 1.0 --- --------------------------------------------- -- Scène permettrant de communiqué les valeurs provenant de Jeedom vers la HC2 -- Pre-requis : -- - Les périphétiques Jeedom et HC2 doivent avoir le même Nom -- et appartenir à la même pièce -- Etape : -- - Récupération des Valeurs Jeedom -- - Parsing des informations provenant de Jeedom -- - Recherche du Périphérique sur le HC2 -- - Mise à jour du Périphérique (Fake Device) -- Fontion Log Color function log(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..message..'</span>') else fibaro:debug(message) end end -- Récupération des Valeurs Jeedom -- Fonction Parsing des informations provenant de Jeedom local function ParsingValue(values) log("orange","Etape : Transformation des données Jeedom") log("", "Donnée provenant de Jeedom : "..value) data = value --var reg = /\[(.*?)\]/g; data = string.gsub(data, "[[]", "") data = string.gsub(data, "[]]", ",") data = string.gsub(data, ",:", ",") data=split(data, ",") Jeedom_room=data[1] Jeedom_device=data[2] Jeedom_type=data[3] Jeedom_val=data[4] log("grey","Jeedomm Room : "..tostring(Jeedom_room)) log("grey","Jeedom Device : "..tostring(Jeedom_device)) log("grey","Jeedom Type : "..tostring(Jeedom_type)) log("grey","Jeedom Value : "..tostring(Jeedom_val)) -- Change Value if tonumber(Jeedom_val) == 1 then log("green","Transformation pour Interpretation HC2 : 1 >>> True") Jeedom_val="true" return Jeedom_room,Jeedom_device,Jeedom_type,Jeedom_val elseif tonumber(Jeedom_val) == 0 then log("green","Transformation pour Interpretation HC2 : 0 >>> False") Jeedom_val="false" return Jeedom_room,Jeedom_device,Jeedom_type,Jeedom_val else log("yellow", "Valeur Jeedom Inconnu (Valeur permise : 0 ou 1) : " ..tostring(Jeedom_val)) return false; end end -- Fonction Mise à jour du Périphérique (Fake Device) local function UpdateDeviceHC2(HC2id, val) log("orange","Etape : Mise à jour du Périphérique dans la HC2") if HC2id then if val or not val then local httpClient = net.HTTPClient() local url = "http://127.0.0.1:11111/api/devices/"..tonumber(HC2id); local jsondata = '{"properties":{"value":' ..val..'}}' httpClient:request(url, { options = { method = 'PUT' , data = jsondata }, success = function(response) if response.status == 200 then if response.data and response.data ~= "" then log("green","Mise à jour de l'état du Périphérique " ..tostring(HC2id).. " Réussi") httpClient = nil; end else log("red","Echec de mise à jour de l'état du Périphérique "..tostring(HC2id).. " Error HTTP Code : "..response.status) httpClient = nil; end end, error = function(erreur) log("red","Echec de mise à jour de l'état du Périphérique "..tostring(HC2id).. " Error HTTP Code : "..erreur) httpClient = nil; end }) else log("red","Problème de Parssing des données Jeedom") end else log("red","Le Périphérique n'existe pas dans la HC2") end end -- Fonction Principale et de Recherche du Périphérique sur le HC2 local function setProperties(values) local Jeedom_Room,Jeedom_Device,Jeedom_Type,Jeedom_Val = ParsingValue(values) if Jeedom_Val then local getDevices = 'http://127.0.0.1:11111/api/devices?visible=true' local httpClient = net.HTTPClient() local HC2id = nil; log("orange","Etape : Récupération de l'ID du Périphérique") log("grey","Recherche du Périphérique "..tostring(Jeedom_Device).." dans la HC2...") httpClient:request(getDevices, { options = { method = 'GET' }, success = function (response) local found = false; if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) for j = #jsonTable, 1, -1 do if jsonTable[j].name == Jeedom_Device then log("grey","Périphérique " ..Jeedom_Device.. " trouvé dans le HC2 recherche de la pièce : " ..Jeedom_Room) if fibaro:getRoomNameByDeviceID(jsonTable[j].id) == Jeedom_Room then log("green","Correspondace HC2 pour le device : ".. Jeedom_Device.. " dans la pièce " ..Jeedom_Room) HC2id = jsonTable[j].id; UpdateDeviceHC2(HC2id,Jeedom_Val) found = true; end end end if not found then log("red", "Auncun Périphérique ".. Jeedom_Device.." trouvé dans la HC2") end else httpClient = nil; end end end, error = function(err) log("red","Error Code : "..err) end }) else log("red","Problème de Parssing des données Jeedom") end end actions = { ["ui.UD.value"] = function(values) setProperties(values) end, } -- =============================== -- Démarrage du script -- =============================== log("orange","--------------- Start Scene ------------------") local trigger = fibaro:getSourceTrigger() if (trigger.type == "property") then property = trigger.propertyName device = trigger.deviceID value = fibaro:getValue(device, property) actions[property](value) end Merci @Steven, @sebcbien, @Lazer pour ces parties Test : Vous pouvez d'ors est déjà tester si ce que l'on vient de créer fonctionne. Il suffit tout simplement de rentré l'url suivante dans votre Navigateur en prenant soin de la modifier et compléter au préalable avec vos informations. http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2={idFakeModuleHC2:1} http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2=[Garage][Porte Celier][Alerte]:1 Vous devriez donc voir la porte s'ouvrir si c'est un capteur de porte. 4. Mise en place de l'intéraction dans Jeedom Concernant la partir Jeedom rien de plus simple il suffit que dans chaque device (section commande du device) de placer l'url ci-dessous, en spécifiant l'ID du Fake device HC2 associé : http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2={idFakeModuleHC2:#value#} http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2=#humanname#:#value# Petite astuce si vous avez un mot de passe contenant un @ il suffit de le remplacer par le caractère suivant : %40. En considérant que l'utilisateur est : user que le mot de passe de celui-ci est p@ssword cela donne l'url ci-dessous : http://user:p%40ssword@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2=#humanname#:#value# Dans Votre Equipement aller dans la section "Commandes" Révélation Puis dans la section avancée du module d'Alerte (petit rouage sur la droite) Révélation Insérer la requête dans la ligne Push Révélation Merci @sebcbien pour cette partie Modifié le 19 décembre 2016 par ADN182 Version 1.0 - Mise à jour du Post 6
pepite Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Yes super @ADN182 ;-) Pourquoi VD ET scène ? Petit post pour suivre ;-)
sebcbien Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Super idée !!! En plus de la méthode dont on a déjà parlé sur le fil Jeedom, il y a aussi cette méthode dont je n'ai pas beaucoup parlé: https://www.domotique-fibaro.fr/topic/8330-mon-test-jeedom/?do=findComment&comment=132529 J'utilise une astuce de @Steven qui permet de faire communiquer Jeedom avec la HC2 via un seul et unique VD, et une scène. Cet exemple porte sur la transmission vers des VG de la fibaro mais permet aussi de commander des devices. Il y a aussi un script qui permet égalment de faire Fibaro -> JD via une scéne: - VG avec ou sans "conversion" - Devices https://www.domotique-fibaro.fr/topic/8330-mon-test-jeedom/?page=20#comment-130188 1
Nico Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Merci, enfin le sens qui m'intéresse !
ADN182 Posté(e) le 15 décembre 2016 Auteur Signaler Posté(e) le 15 décembre 2016 Oui tout à fais Seb, je me suis inspiré de ton post avec le VG de Steven, rien n'est de moi dans tous ça
sebcbien Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Mais c'est super utile des tutos, ça permet aux élèves qui parlent dans le fond de la classe d'avoir une deuxième chance, hein @Nico Et y'a encore à améliorer, par exemple pour la communication HC2->JD les ordres sont envoyés lors de trigger, mais si par exemple y'a un ordre qui n'est pas passé, les contenus sont désynchronisés. Il manque donc une procédure pour balayer tous les états et les renvoyer tous toutes les XX minutes par exemple. Cas concret, ma HC2 envoie tous les états des capteurs d'alarme à JD, si mon windows qui héberge mon jeedom reboote, pendant la durée du reboot, si des états changent, l'ordre ne passera pas et une fois JD up, il croira des fenêtres fermées alors qu'elles ont été ouvertes entre-temps..
sebcbien Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Sinon, pour les PUT, GET...je m'y perds, c'est pas ma tasse de thé... Mais via un petit script PHP tu dois pouvoir tout faire. Dès que j'arrive chez moi, je vais poster un exemple avec un petit script qui me permet d'envoyer des ordres à un ampli marantz via une utilisation des connexions par socket. C'est très facile, donc si tu sais faire une méthode plus simple avec ça ce sera tout bénef Sent from my Note4
pepite Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 (modifié) ah oui ok, j'avais oublie ce post du master @Steven Donc depuis Jeedom, un petit HTTP sur l'API avec un plugin script et hop..ca remonte dans la HC2 ;-) @Steven, donc depuis ton IPX tu fais du HTTP sur la HC2 pour la remontee des infos à partir d'un changement d'etat ? Et pour de svaleurs, je coris qu'on en a deja parle, faut que je retrouve. @sebcbien, suffirait de faire tourner un mainloop ou une scene non ? Modifié le 15 décembre 2016 par pepite
Nico Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 J'ai toujours été au fond de la classe, mais j'étais toujours le premier, même en parlant Et la première chose que j'ai appris en prépa avant l'école d'ing, c'est qu'il ne faut pas être bon, juste meilleurs que les autres, ce qui change énormément de chose dans la façon d'appréhender les choses : Laisses faire l'autre, tu récupères, améliores et gagnes 1
Nico Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Pepite, bah oui, la mise à jour de libellé de VG, on en avait parlé sur un topic justement quand je voulais gérer ma partie Zibase plus simplement que des milliers de variables globales.
pepite Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 il y a 42 minutes, sebcbien a dit : Il y a aussi un script qui permet égalment de faire Fibaro -> HC2 via une scéne: Ce ne serait pas plutot dans le SENS HC2 --> JEEDOM ;-) @Nico, oui oui pas de souci, je fais ca sur presue tout. En fait, ce qui me reste en VG est du à l'existant..j'ai pas tout migré en LABEL lol Et aussi les VDs des experts bases sur VG, je ne les ai pas modifiés ;-)
ADN182 Posté(e) le 15 décembre 2016 Auteur Signaler Posté(e) le 15 décembre 2016 Envoi Seb je vais regarder, mais je pense que la j'ai trouvé quelque chose de "User Friendly" sans importer de script assez facile en d'autre termes. En plus je viens de tester et je peux récupérer le nom des modules de Jeedoom. Du coup il sufira que je modifie deux trois trucs, il faudra ensuite pour l'utilisateur nommer et mettre au même emplacement (Salon, Cuisine) ses modules sur Jeedom et HC2. Ce sera ainsi le plus "automotisé" pas besoin de connaitre l'ID du module HC2 juste de le nommer à l'identique. 1
Nico Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Nickel, on attend ta version finale
sebcbien Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 Voici le principe de base du script php, très simple: https://www.domotique-fibaro.fr/topic/8330-mon-test-jeedom/?do=findComment&comment=128870 Un peu plus avancé, j'ai fait récemment ceci: https://www.jeedom.com/forum/viewtopic.php?f=31&t=23195 Donc en gros, je crée un script que je mets a disposition derrière un "bouton" Ensuite j'appelle ce script/bouton via une commande de type "message" ce qui me permet de récupérer deux valeurs facilement (titre et message) et de les envoyer vers le premier script. Donc si tu modifie le php avec le PUT dont tu parle ça devrait être facilement fait, tu peux ensuite envoyer les valeurs que tu veux via un scénario par exemple Après tu peux aussi appeler ce php directement depuis un device jeedom avec les bons paramètres et qui appellera ce script "hébergé par jeedom" exemples: http://127.0.0.1/plugins/script/core/ressources/NotificationHub.php?message=#message#&title=date("H:i:s ",#timestamp#)#title# http://127.0.0.1/plugins/script/core/ressources/NotificationHub.php?message=#message#&title=#title#&VG=PresentState
ADN182 Posté(e) le 15 décembre 2016 Auteur Signaler Posté(e) le 15 décembre 2016 Merci Seb ! je vais regarder ça une fois que j'ai fini mon Tuto dis moi tu sais si l'on peut appliquer des paramètres à plusieurs modules ? Dans Jeedom j'ai trouvé un bouton "Appliquer à" (voir capture) je pensé que cela aller permettre d'appliqué la même configuration à un ensemble de device. Mais d'après mes test ça ne semble pas fonctionner. L'idée serait d'avoir une seule URL pour tous les devices et de l'appliquer sur ceux-ci ainsi pas besoin de passé sur l'ensemble des devices Jeedom.
sebcbien Posté(e) le 15 décembre 2016 Signaler Posté(e) le 15 décembre 2016 je sais que ce "appliquer à" fonctionne avec la config du plugin, css etc, c'est plutôt visuel donc apparemment. Par contre c'est peut être plus imple d'accéder a tous les modules via le résumé domotique.
ADN182 Posté(e) le 19 décembre 2016 Auteur Signaler Posté(e) le 19 décembre 2016 Merci @Sebcbien, j'ai regardé dans la doc Jeedom en principe c'est censé répliquer les paramètres (J'ai cassé la config de mes modules en essayant la fonctionnalité, il ne répondait plus). J'ai mis à jour le POST il est désormais possible avec une seule URL dans le PUSH URL de chaque périphériques Jeedom de communiqué avec la HC2 sans avoir besoin de connaitre l'ID.... http://<user>:<password>@<IP_DE_MA_HC2>/api/callAction?deviceID=333&name=setProperty&arg1=ui.UD.value&arg2=#humanname#:#value# Dommage que la fonctionnalitée de réplication de la config des modules ne fonctionne ou n'exista pas sinon il suffirait de selectionner les modules souhaité et d'envoyer cette url pour chacun des modules selectionnés. 1
ADN182 Posté(e) le 19 décembre 2016 Auteur Signaler Posté(e) le 19 décembre 2016 Extrait de la doc pour la configuration Avancée d'une commande : 2. Configuration avancée d’une commande La fenêtre de configuration avancée d’une commande est composée de 3 onglets : Informations, Configuration avancée et Affichage avancé. Elle a aussi 2 boutons, un pour sauvegarder et un pour appliquer les mêmes paramètres de configuration à une autre commande https://jeedom.com/doc_old/documentation/core/fr_FR/doc-core-display.html
sebcbien Posté(e) le 19 décembre 2016 Signaler Posté(e) le 19 décembre 2016 mais comment tu fais pour matcher la dernière partie d'un device ? Exemple dans [Garage][Porte Celier][Alerte]:1 [Alerte], comment tu la fais matcher sur la HC2 ? si c'est un dimmer par exemple, ou une température ?
ADN182 Posté(e) le 20 décembre 2016 Auteur Signaler Posté(e) le 20 décembre 2016 Bien vu Seb j'ai oublié de préciser que ça marché uniquement pour les capteurs et sûrement actionneur pour l'instant (j'ai testé qu'avec des capteurs je n'ai que ça :s) mais comme on a le type ([Alerte] qui correspond à un capteur d'alarme) je pense que je peux facilement modifier pour prendre en compte les capteur de température... Pour l'instant je dis si tu m'envoi 0 tu transforme en False et 1 en True donc pas de problème pour les act et capteur. Peut-tu me donner le type de commandes pour un capteur de température et un dimmer ? (Partie config avancée ) Envoyé de mon Nexus 5X en utilisant Tapatalk 1
pepite Posté(e) le 20 décembre 2016 Signaler Posté(e) le 20 décembre 2016 Beau boulot, super merciiii. A tester :-)
ADN182 Posté(e) le 20 décembre 2016 Auteur Signaler Posté(e) le 20 décembre 2016 J'ai trouvé Seb dans la section Configuration Jeedom Avancé, Configuration résumé des objets 1
sebcbien Posté(e) le 20 décembre 2016 Signaler Posté(e) le 20 décembre 2016 cool. Je suis arrivé à faire un put d'une valeur à partir de jeedom, sans VD ni scène. Inspiré du script de @c-lol https://www.domotique-fibaro.fr/topic/2938-api-post-php/ Il suffit de créer un script, d'y coller ce code, de sauver et ensuite appeler ce script avec les bons paramètres... Voici ce que ça donne: <?php $ipHc2 = "192.168.XXX.XXX"; $tcpPort = "80"; $request = "/api/devices/2153"; $userName = "userhc2"; $password = "monpassword"; $data_string = '{"properties":{"value": true}}'; //$data_string = '{"properties":{"value": false}}'; $url = 'http://'.$userName.':'.$password.'@'.$ipHc2.':'.$tcpPort .$request; $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); echo $result; ?> j'arrive à changer l'état d'un oeil de fibaro avec ça. Voilà, c'est juste pour info car tu bloquait sur le PUT. Maintenant les noms des devices, pièces etc. que tu as fait, ici y'a rien. Mai ça te donnera peut être des idées pour simplifier et surtout raccourcir le chemin
Messages recommandés