Aller au contenu

Evénements


Steven

Messages recommandés

domo, désolé je viens de me rendre compte que je ne t'avais jamais répondu....

 

 

Entre temps, depuis que j'ai un Fibaro Button, le module virtuel plantait, car celui-ci ne déclenche plus de triggers, mais des Central Scenes, et donc le retour JSON de l'API events est différent.

J'en avait parlé sur un autre topic.

 

Je me suis aussi rendu compte que le VD plantait si un module ne se trouvait dans aucune pièce (c'est peut être ton problème domo).

 

Voici mon code qui fonctionne chez moi :

-- Last modification : September 2016 by Lazer

local excluded_id = {}    -- Comma separated list of ID to exclude
local max_events = 500    -- Maximum number of events to fetch
local max_labels = 10     -- Number of labels in virtual device
local debug = false       -- debug

local today = os.date("%d/%m/%Y")
local selfID = fibaro:getSelfId()
local j = 0

local HC2 = Net.FHttp("127.0.0.1", 11111)
local response, status, errorCode = HC2:GET("/api/panels/event?last="..max_events.."&type=id")

if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then

	local t = json.decode(response)
	for i = 1, max_events do

		local exclude = false
		for k = 1, #excluded_id do
			if excluded_id[k] == t[i].deviceID then
				exclude = true
				break
			end
		end

		if (t[i].deviceType == "com.fibaro.temperatureSensor") or
			(t[i].deviceType == "com.fibaro.humiditySensor") or
			(t[i].deviceType == "com.fibaro.lightSensor") or
			(t[i].deviceType == "com.fibaro.multilevelSensor") or
			exclude == true
		then
			if debug then
				fibaro:debug(i.." => Exclude")
			end
		else
			if debug then
				fibaro:debug(i.. " => Include : deviceID="..t[i].deviceID)
				fibaro:debug("timestamp : "..t[i].timestamp)
				fibaro:debug("deviceID : "..fibaro:getName(t[i].deviceID))
				fibaro:debug("getRoomID : "..fibaro:getRoomID(t[i].deviceID))
				if fibaro:getRoomID(t[i].deviceID) > 0 then
					fibaro:debug("getRoomName : "..fibaro:getRoomName(fibaro:getRoomID(t[i].deviceID)))
				end
				fibaro:debug("propertyName : "..(t[i].propertyName or ""))
				fibaro:debug("oldValue : "..(t[i].oldValue or ""))
				fibaro:debug("newValue : "..(t[i].newValue or ""))
			end

			--local msg = fibaro:getName(t[i].deviceID) .. " "..roomName .. " | " .. oldValue .. "->" .. newValue .. " | " .. heure

			local msg = fibaro:getName(t[i].deviceID)

			local roomID = fibaro:getRoomID(t[i].deviceID)
			if roomID > 0 then
				msg = msg .. " " .. fibaro:getRoomName(roomID)
			end

			if t[i].propertyName then
				local oldValue = ""
				local newValue = ""
				if t[i].propertyName == "value" then
					oldValue = t[i].oldValue
					newValue = t[i].newValue
				elseif t[i].propertyName == "armed" then
					if t[i].oldValue > 0 then oldValue = "armé" else oldValue = "désarmé" end
					if t[i].newValue > 0 then newValue = "armé" else newValue = "désarmé" end
				end
				msg = msg .. " | " .. oldValue .. "->" .. newValue
			elseif t[i].event then
				msg = msg .. " | " .. (t[i].event.data.keyAttribute or "")
			else
				msg = msg .. " | "
				fibaro:debug("Non supporté !!!")
			end

			local date = os.date("%d/%m/%Y", t[i].timestamp)
			local heure = os.date("%H:%M:%S", t[i].timestamp)
			msg = msg .. " | " .. heure
			if today ~= date then
				msg = msg .. " " .. date
			end

			j = j + 1
			if debug then
				fibaro:debug("j="..j)
			end
			local label = fibaro:get(selfID, "ui.Label"..j..".value")
			if label ~= msg then
				pcall(function() 
					fibaro:call(selfID, "setProperty", "ui.Label"..j..".value", msg)
				end)
			end
			if j >= max_labels then
				break
			end
		end

	end -- for

else
	fibaro:debug("Net.FHttp error")
end -- if

-- Clean labels
for k = j+1, max_labels do
	if debug then
		fibaro:debug("j="..j.." k="..k)
	end
	local label = fibaro:get(selfID, "ui.Label"..k..".value")
	if label ~= "" then
		fibaro:call(selfID, "setProperty", "ui.Label"..k..".value", "")
	end
end

fibaro:debug("OK")

Pour info, chez moi j'ai ajouté 25 labels au VD afin d'avoir plus d'historique, donc j'ai mis les paramètres suivants et ça fonctionne très bien :

- max_events = 1200
- max_labels = 25

J'ai mis un max_events assez gros, car pendant les vacances il y a très peu d'activité chez moi (uniquement simulation de présence...) et les seuls événements remontés par l'API sont les sonde de température/humidité/lux/etc, pas intéressant pour ce qu'on veut afficher. Donc 1200 me permet d'être tranquille à  affiner en fonction de votre environnement.

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...
  • 1 an après...

Remplacer :

			if today ~= date then
				msg = msg .. " " .. date
			end

 

Par :

				msg = msg .. " " .. date

 

(donc en fait, juste supprimer la condition)

 

 

EDIT : j'en déduis à la lecture de l'autre topic que tu utilises une vieille version totalement dépassée, tu ferais mieux de relire ce topic, et en particulier cette page-ci.....

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
  • 2 semaines après...
  • 11 mois après...

Il ne faut plus mettre l'IP, il faut utiliser 127.0.0.1 comme dans le code, il ne faut donc pas modifier cette ligne.

 

Les seules lignes modifiables par l’utilisateur sont :

local excluded_id = {}    -- Comma separated list of ID to exclude
local max_events = 500    -- Maximum number of events to fetch
local max_labels = 10     -- Number of labels in virtual device
local debug = false       -- debug

 

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...