Aller au contenu

Modifier Une Varaible Globale Depuis Ipx Par Push


jjacques68

Messages recommandés

Hello tous, encore une question...

 

peut-on modifier une variable global dans une HC depuis une commande push d'une entrée/sortie de l'ipx800 ?

 

on peut lancer une scène : /api/sceneControl?id=21&action=start

un device : /api/callAction?deviceID=8347&name=turnOn

 

mais modifier une variable, j'ai tout essayé :

 

/api/globalVariables/MaVariable=valeur

/api/globalVariables/MaVariable&value=valeur

/api/globalVariables/MaVariable {"value":"valeur"}

 

je trouve rien sur le net !!!

 

encore une fois merci à  vous !!

 

JJacques68

Lien vers le commentaire
Partager sur d’autres sites

donc d'après mes recherches, il n'est pas possible de modifier une VG depuis l'ipx800.

du coup faut résonner autrement.

 

si je veux récupérer la valeur du compteur de l'ipx par exemple, c'est la HC qui va chercher la valeur et non l'ipx qui la transmet...

 

un peu étrange comme solution...

 

mais alors je ne vois pas à  quoi peuvent servir les "étiquettes" disponible dans l'ipx ($C1, $O, ...) si on peut pas les transmettre dans une variable ?

Lien vers le commentaire
Partager sur d’autres sites

Problème, l'IPX800 (en tout cas pour la v4 dont je dispose) ne sait faire que du GET et du POST, mais pas de PUT dont on a besoin pour mettre à  jour une VG ou un fake-device

 

Donc perso :

- pour aller mesurer une valeur (capteurs analogiques), j'ai une scène sur la HC2 qui va interroger l'IPX800 v4 toutes les minutes

- pour les entrées numériques, puisque c'est du binaire, j'ai créé des notifications PUSH dans l'IPX800v4 qui va cliquer sur l'un des 2 boutons d'un module virtuel de la HC. Chaque bouton met alors à  jour un fake-device (value = true ou false) en passant par l'API locale, mais en faisant un PUT.

 

bref pas simple :(

Lien vers le commentaire
Partager sur d’autres sites

des modules qui n'existent plus, mais qu'on a conservé dans la box afin de leur forcer des valeurs de notre choix.

 

J'ai expliqué le principe sur le topic FHEM à  partir d'ici : http://www.domotique-fibaro.fr/index.php/topic/678-passerelle-enocean-fhem/?p=124196 (et pages suivantes)

Mais je ne ferai pas de tuto propre, car ça reste une technique délicate, non supportée officiellement, et qui doit à  terme être replacé par les Plugins quand FIbaro le voudra....

Lien vers le commentaire
Partager sur d’autres sites

oui j'y avais pensé, mais c'est pour le compteur d'eau...

 

une impulsion tous les 1/4 de litre... ça fait beaucoup d'appel du bouton quand on prend une douche, ou pour arrosage du jardin...

 

je pense qu'il vaut mieux temporisé le relevé du compteur...

 

non ?

Lien vers le commentaire
Partager sur d’autres sites

oui mais là  ça devient compliqué pour moi !!

 

je maitrise pas le json et les requêtes http correctement.

 

et les explications sont plutôt "lite"...

 

Il y a énormément d'info que je pioche à  droite et à  gauche sur le forum, mais ça reste très flou pour moi.

 

y a pas de tuto qui explique tout ça ? mais depuis le début ?

Lien vers le commentaire
Partager sur d’autres sites

Tiens voilàma scène qui fait plus ou moins ce que tu veux, àadapter àton besoin :

- perso j'utilise des fake-device, mais il te suffit de remplacer le contenu de la fonction SetValue() si tu veux mettre àjour une Variable globale.

- je ne lis que les sondes analogiques,

- fonctionne avec un IPX800 v4, je crois que le JSON est différent d'un V3 (de toutes façons, les scritps existent déjàsur le forum pour la v3)

- c'est pas super propre, j'ai fait ça vite fait avant les vacances, mais ça fonctionne depuis 2 mois, en tout cas chez moi.

--[[
%% autostart
%% properties
%% events
%% globals
--]]
--------------------------------------------------
-- Scène   : IPX800V4
-- Author  : Lazer
-- Version : 1.0
-- Date    : July 2016
--------------------------------------------------

-- Variables
local refresh = 60 -- seconds
local debug = false


--
-- Message() function
--
function Message(color, message)
	if color and color ~= "" then
		fibaro:debug('<span style="color:'..color..';">'..message..'</span>')
	else
		fibaro:debug(message)
	end
end


--
-- round() function
--
function round(num, idp)
  --if idp and idp>0 then
    local mult = 10^idp
    return math.floor(num * mult + 0.5) / mult
  --[[ else
    idp = idp mult 2 -- negates its negative status
    local mult = 10^idp
    return math.floor(num * mult + 0.5) / mult
    ide = idp / (idp/2)
  end
  return math.floor(num + 0.5) --]]
end


--
-- SetValue() function
--
function SetValue(id, value)
	local httpClient = net.HTTPClient()
	httpClient:request('http://127.0.0.1:11111/api/devices/' .. tostring(id), {
		success = function(response)
			if response.status == 200 then
				if debug then
					Message("green", "SetValue() OK")
				end
				return true
			else
				Message("red", "SetValue() Error : status=" .. tostring(response.status))
				return false
			end
		end,
		error = function(err)
			Message("red", 'SetValue() Error : ' .. err)
			return false
		end,
		options = {
			method = 'PUT',
			data = '{"properties":{"value":' .. value .. '}}'
		}
	})
end


--
-- GetValues() function
--
function GetValues()
	-- Read IPX800 Analog inputs
	local httpClient = net.HTTPClient()
	httpClient:request('http://1.2.3.4/api/xdevices.json?key=xxxxx&Get=A', {
		success = function(response)
			if response.status == 200 then
				if response.data and response.data ~= "" then
					local jsonTable = json.decode(response.data)
					if jsonTable.status and jsonTable.status == "Success" then
						if debug then
							Message("green", "Success")
						end
						if jsonTable.A1 and type(jsonTable.A1) == "number" then
							local newValue = round(((jsonTable.A1*0.000050354)-1.63)/0.0326, 1)
							if debug then
								Message("", "Température = " .. ((jsonTable.A1*0.000050354)-1.63)/0.0326 .. " " .. newValue)
							end
							local oldValue = fibaro:getValue(262, "value")
							if newValue ~= tonumber(oldValue) and newValue ~= -50 then
								Message("yellow", "Température : oldValue=" .. oldValue .. "°C newValue = " .. tostring(newValue) .. "°C")
								SetValue(262, newValue)
							end
						end
						if jsonTable.A2 and type(jsonTable.A2) == "number" then
							local newValue = round(((jsonTable.A2*0.00323)/211.2-0.1515)/0.00636, 1)
							if debug then
								Message("", "Humidité = " .. ((jsonTable.A2*0.00323)/211.2-0.1515)/0.00636 .. " " .. newValue)
							end
							local oldValue = fibaro:getValue(261, "value")
							if newValue ~= tonumber(oldValue) and newValue ~= 0 then
								Message("yellow", "Humidité : oldValue=" .. oldValue .. "% newValue = " .. tostring(newValue) .. "%")
								SetValue(261, newValue)
							end
						end
					else
						Message("", "Failed")
					end
				else
					Message("red", "Error : empty response")
				end
			else
				Message("red", "Error : status=" .. tostring(response.status))
			end
		end,
		error = function(err)
			Message("red", 'Error : ' .. err)
		end,
		options = {
			method = 'GET'
		}
	})
	-- Display LUA memory consumption every 5 minutes
	if not garbageExecTime then
		garbageExecTime = os.time()
	else
		local elapsedTime = os.difftime(os.time(), garbageExecTime or 0)
		if (elapsedTime >= 300) then
			Message("gray", 'Total memory in use by Lua: ' .. string.format("%.2f", collectgarbage("count")) .. ' KB')
			garbageExecTime = os.time()
		end
	end
	-- Wait
	setTimeout(function() GetValues() end, refresh*1000)
end


--
-- Main
--
local trigger = fibaro:getSourceTrigger()
if trigger["type"] == "autostart" then
	Message("blue", os.date('%d/%m/%Y').." : Autostart infinite loop...")
	setTimeout(function() GetValues() end, 0)
else
	Message(nil, os.date('%d/%m/%Y').." : trigger : "..trigger["type"])
end

Ensuite, àtoi d'adapter àtes besoins

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...