Aller au contenu

ADN182

Messages recommandés

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 : Updater
Label : Update.Device
ID Label : UD

Screenshot from 2016-12-15 21-09-00.png

 

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

Screenshot from 2016-12-15 21-52-05.png

 

 

Puis dans la section avancée du module d'Alerte (petit rouage sur la droite) 

 

Révélation

Screenshot from 2016-12-15 21-52-25.png

 

 

Insérer la requête dans la ligne Push 

 

Révélation

Screenshot from 2016-12-15 21-53-52.png

 

Merci @sebcbien pour cette partie ;)

Modifié par ADN182
Version 1.0 - Mise à jour du Post
  • Upvote 6
Lien vers le commentaire
Partager sur d’autres sites

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

 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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..

 

Lien vers le commentaire
Partager sur d’autres sites

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
 

Lien vers le commentaire
Partager sur d’autres sites

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é par pepite
Lien vers le commentaire
Partager sur d’autres sites

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 :)

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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 ;-)

Lien vers le commentaire
Partager sur d’autres sites

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.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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.

 

 

Screenshot from 2016-12-15 22-10-34.png

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...