Aller au contenu

Messages recommandés

Posté(e)

Bonjour , j'aurais besoin d'aide pour finir la programmation de ma piscine que je mettrais sur le forum .

J'explique :

La piscine est gérer par une ipx800 V3

Pour calculer le temps de filtration de ma piscine en fonction de la temperature de l'eau, j'aurais besoin de connaitre la valeur max atteint la veille. 

la temperature est stocker dans un variable mais je n'arrive pas a sauvegarder la valeur max sur une journée .

pouvez m'aidez je galère .

Posté(e)

tu dois passer par une variable temporaire.

Dans la variable temporaire, tu stockes la valeur "instantanée" qui vient de ton IPX

ensuite tu (la HC2) la compares avec la valeur de la seconde variable, et si la valeur est supérieure, tu la notes dans la seconde variable

Posté(e)

Merci Jojo , mon code a l'air de bien fonctionner , peut tu me dire si mon code pourrais être plus simple ou pus propre.

--[[
%% autostart
%% properties
%% events
%% globals
--]]

fibaro:debug("HC2 a démarré le script le " .. os.date())


local sourceTrigger = fibaro:getSourceTrigger()
if (sourceTrigger["type"] == "autostart") then
while true do

local currentDate = os.date("*t")
local startSource = fibaro:getSourceTrigger()

    -- Heure àlaquelle vous souhaitez générer le rapport journalier

reportTime = "23:58"  
    
local Temp_piscine = fibaro:getGlobalValue("valueTemp_piscine") -- T° Piscine
local Temp_piscine2 = fibaro:getGlobalValue("valueTemp_piscine2") --T° Piscine + 1 Min
local Temp_piscineM = fibaro:getGlobalValue("valueTemp_piscineM") --T° Piscine Max
local Temp_piscineV = fibaro:getGlobalValue("valueTemp_piscineV") --T° Piscine de la Veille

    	
      fibaro:setGlobal("valueTemp_piscine2", Temp_piscine)
      fibaro:debug(('Temperature = ' .. Temp_piscine).."°")

    
  if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine"))))
then
          fibaro:setGlobal("valueTemp_piscineM",Temp_piscine2)
     end
      -- Tous les jours àminuit, je stockera valeur de la T° Max.
  
    if tostring(os.date("%H:%M")) == reportTime then
     
      fibaro:setGlobal("valueTemp_piscineV",Temp_piscineM) --T° Piscine de la Veille
      fibaro:setGlobal("valueTemp_piscineM","0")
      fibaro:debug(('Temperature Max= ' .. Temp_piscineV).."°")
end

      fibaro:sleep(60*1000) -- 1 Minutes
      
    end
     end
 

Posté(e)

je mettrais déjàle

reportTime = "23:58"  

en dehors de la boucle

while true do

avant d'écrire dans une variable, je vérifie (quand c'est possible) que la valeur que je veux y écrire est différente de celle qu'elle contient. Surtout que dans le cas d'une piscine la température ne change pas toutes les min

Posté(e)

tu as fait ceci :

      fibaro:setGlobal("valueTemp_piscine2", Temp_piscine)

donc la condition

  if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine"))))

sera toujours = ?

Posté(e)

Oui au debut j'avais mit toute les 30 minutes le relever de T°, mais je n'arrive pas a envoyer le rapport a l'heur que je voudrait.

il faut peux être que je crée deux scenes?

Posté(e)

voici une scène écrite par Lazer pour faire exécuter un VD àun moment précis (toutes les sec, min, heure, jour, ....)

--[[
%% properties
%% autostart
%% globals
--]]
local idEmoncms = 334 -- EMONCMS

local seconde = os.date('%S')
if tonumber(seconde) ~= 0 then
	local delta = 60 - seconde
	fibaro:debug("Time is  " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...")
	fibaro:sleep(delta*1000)
end

local hour = os.date('%H')
local day = os.date('%d')

while true do

	-- Actions to perform every new minute
	fibaro:call(idEmoncms, "pressButton", "1"); -- Graphe
  
	-- Actions to perform every new hour
	local newhour = os.date('%H')
	if newhour ~= hour then
		fibaro:debug('New hour')
    	--
		hour = newhour
	end

	-- Actions to perform every new day
	local newday = os.date('%d')
	if newday ~= day and tonumber(os.date('%M')) >= 1 then
		fibaro:debug('New day')
		--
    	day = newday
	end

	fibaro:debug('Last run : ' .. os.date('%H:%M:%S'))
	fibaro:sleep(60*1000) -- 1 minute

end
Posté(e)

c'est genial merci , donc je peux tout faire avec une seul scene en faisant comme ceci

--[[
%% properties
%% autostart
%% globals
--]]
 
local seconde = os.date('%S')
if tonumber(seconde) ~= 0 then
	local delta = 60 - seconde
	fibaro:debug("Time is  " .. os.date('%H:%M:%S') .. ", waiting for " .. delta .. " seconds...")
    fibaro:sleep(delta*1000)
end
 
local hour = os.date('%H')
local day = os.date('%d')
 
while true do
  
local Temp_piscine = fibaro:getGlobalValue("valueTemp_piscine") -- T° Piscine
local Temp_piscine2 = fibaro:getGlobalValue("valueTemp_piscine2") --T° Piscine + 1 Min
local Temp_piscineM = fibaro:getGlobalValue("valueTemp_piscineM") --T° Piscine Max
local Temp_piscineV = fibaro:getGlobalValue("valueTemp_piscineV") --T° Piscine de la Veille

 
	-- Actions to perform every new minute
   fibaro:debug('New minute') 
  
  
	-- Actions to perform every new hour
	local newhour = os.date('%H')
	if newhour ~= hour then
	  fibaro:setGlobal("valueTemp_piscine2", Temp_piscine)
      fibaro:debug(('Temperature = ' .. Temp_piscine2).."°")
    	
    if (( tonumber(fibaro:getGlobalValue("valueTemp_piscine2")) >= tonumber(fibaro:getGlobalValue("valueTemp_piscine"))))
then
          fibaro:setGlobal("valueTemp_piscineM",Temp_piscine2)
     end
		hour = newhour
	end
 
  
	-- Actions to perform every new day
	local newday = os.date('%d')
	if newday ~= day and tonumber(os.date('%M')) >= 1 then
	  fibaro:setGlobal("valueTemp_piscineV",Temp_piscineM) --T° Piscine de la Veille
      fibaro:setGlobal("valueTemp_piscineM","0")
      fibaro:debug(('Temperature Max= ' .. Temp_piscineV).."°")
	
    	day = newday
	end
 
	fibaro:debug('Last run : ' .. os.date('%H:%M:%S'))
	fibaro:sleep(60*1000) -- 1 minute
 
end
Posté(e)

Il suffit d'envoyer ce code àpartir de n'importe quand pour avoir la température max de la veille :

function getMaxTempYesterday(id)
	local t = os.date("*t")
	t.day = t.day - 1
	local debut = os.time{year=t.year, month=t.month, day=t.day, hour=0, min=0, sec=0}
	local fin = os.time{year=t.year, month=t.month, day=t.day, hour=23, min=59, sec=59}
	local res = api.get("/temperature/"..debut.."/"..fin.."/compare/devices/temperature/"..id)
	return res[1].max
end  

local max_hier = getMaxTempYesterday(442)
fibaro:debug("La température maximum était de " .. max_hier)

.

442 est l'id de mon capteur de température.

  • Upvote 2
Posté(e)

Steven peux tu me donner ton avis sur le code que j'utilise pour récupéré la température de L ipx , je l'ai récupéré sur le forum mais il ne manque pas une boucle?

HC2 = Net.FHttp("192.168.1.30")

8

response ,status, errorCode = HC2:GET("/api/xdevices.json?cmd=30")

9

if response ~= nill and tonumber(status)==200 then

10

response = json.decode(response)

11

local valueTemp = tonumber(response.AN1 or 0)

12

local valueTempok = valueTemp* 0.323 - 50

13

local valueTempokstr = " "..string.format("%.2f", valueTempok).." °C"

14

fibaro:setGlobal("valueTemp_piscine", valueTempok)

15

fibaro:debug(valueTemp * 0.323 - 50)

16

fibaro:call(selfId, "setProperty", "ui.Label1.value", valueTempokstr)

17

18

else

19

fibaro:debug("Error: Failed to load json")

20

Posté(e)

En effet, ce code ne va s'exécuter qu'une seule fois puisque, comme tu le précise, il n'y a pas de boucle sauf si tu le met dans le main loop d'un module virtuel (dans ce cas, il sera exécuté toutes les 3 secondes)

 

Par contre, je n'aime pas du tout ce genre de code qui s'exécute en boucle pour rien. En effet, si la valeur ne change pas, il n'y a aucune raison de faire un appel http pour rien. De plus, faire des appel http dans un main loop est souvent source de plantée de la HC2

 

Le meilleur moyen est de traiter l'information ainsi :

  1. L'IPX envoi la valeur à  la HC2 (uniquement quand la valeur change)
  2. L'HC2 traite la valeur et la stocke

 

Voici comment je fais (purement personnel).

 

J'ai un Module Virtuel qui va recevoir les données de l'IPX ( 1 label par valeur reçu ). Ce module est caché.

J'au un scénario qui va écouter les changement du Module Virtuel ci-dessus et qui va traiter l'information.

 

Exemple :

 

J'ai un module virtuel (id 484) avec un label "ConsoGlobal" (représente la consommation électrique de ma maison)

48945905092.png

.

Sur mon IPX j'ai ajouté ceci sur mon analogue cette rquête va mettre à  jour le label ConsoGlobal avec la valeur de mon analog 5 :

9936320509.png

 

Ensuite j'ai un scénario qui va récupérer les changement de libellé sur le module virtuel caché et qui va les traiter :

--[[
%% properties
484 ui.ConsoGlobal.value
--]]

actions = {
  	["ui.ConsoGlobal.value"] = function(value)
    		fibaro:debug(value)
		local valueTempok = tonumber(value) * 0.323 - 50
		local valueTempokstr = " "..string.format("%.2f", valueTempok).." °C"
		fibaro:setGlobal("valueTemp_piscine", valueTempok)
  		fibaro:call(283, "setProperty", "ui.Label1.value", valueTempokstr) 
  	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

Ce script peux gérer plein de bouton.

 

Et voilà  .... tordu ... non ?  :P

 

 

3 avantages à  ce procédé : il est instantané (des que la valeur change, tout ce met à  jour), il ne s'exécute que lorsque cela est nécessaire et pour finir, on a pas besoin de variable globale puisque le label "ConsoGlobal" est toujours présent et toujours à  jour.

Donc au lieu de faire fibaro:getGlobalValue(...) on peux faire fibaro:getValue(484, "ui.ConsoGlobal.label").

Posté(e)

Je te remercie pour ce tuto tres vien bien expliquer. Je vais tester demain soir . Vu que je suis reparti de zéro depuis la dernière stable àcause des 503 a répétition.

Je voudrais essayer de remettre au propre certain script qui consomme de la memoir pour rien .

  • Upvote 1
Posté(e)

je viens de tester pour la température je n'arrive pas a mettre a jour le label T° depuis l'ipx le serveur et le login sont bien renseigner.

/api/callAction?deviceID=16&name=setProperty&arg1=ui.TempPiscine.value&arg2='$A1'
Posté(e)

16 est bien l'ID du module virtuel qui contient le bouton dans l'ID est TempPiscine ? Car aucune raison que cela ne fonctionne pas.

×
×
  • Créer...