Aller au contenu
Allan2b

Récupérer La Temperature Max De La Veille

Recommended Posts

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 .

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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
 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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 = ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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?

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

tous le jour c'est bien a 0H00 et pas le lendemain a l'heur a laquelle a été lancer le script?

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Steven ,

Ça fonctionne aussi même si mon capteur de température est sur mon ipx donc virtuel sur la HC2?

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Arggg, non, sauf si tu as pu installer le Virtual Sensor de Krikroff : http://www.domotique-fibaro.fr/index.php/topic/2164-plugin-virtual-sensor/

 

Désolé de ne pas avoir tout lu, j'ai juste lu le sujet et partagé sans réfléchir un morceau de code.

Partager ce message


Lien à poster
Partager sur d’autres sites

Non je l'ai supprimer . c'est pas grave ton code me servira quand même .

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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'

Partager ce message


Lien à poster
Partager sur d’autres sites

'$A1' ... ne devrait-il pas être '$A' tout simplement ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

juste une question a quel moment par le push pour les entree analogique de l ipx pour la HC2 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

×