Aller au contenu

stipower

Membres confirmés
  • Compteur de contenus

    90
  • Inscription

  • Dernière visite

  • Jours gagnés

    3

Messages posté(e)s par stipower

  1. Thermostat Calcifer Rika Firenet

    version 1.0

    Présentation : 

     

    Ce QuickApp permet de contrôler la température de consigne d'un poêle Rika avec Firenet.

    Le mode Domotique OFF permet de passer en lecture seule pour n'avoir que le visuel du Quickapp et garder le contrôle par l'appliweb Firenet.

     

    image.png.33bd1f2b58aba2ffe591dba2e5471690.png

     

    Le Qapp ne supportant pas les requêtes http vers Firenet (retour erroné), j'ai du passer par des scènes.

     

    Le Qapp utilise 2 scènes pour envoyer les requêtes http chez firenet :

    • Firenet SetInfo -> est lancée par le quickapp pour pousser les mise à jour chez firenet.
    • Firenet GetInfo -> tourne toutes les 10 secondes pour mettre à jour l'interface du quickapp.

     

    Prérequis : 

     

    • Disposer d'un compte firenet avec un poël Rika.

     

    Installation du QuickApp :

    • importer le fichier Quickapp
    • créer la scène Firenet SetInfo
    • créer la scène Firenet GetInfo

     

    Modifications des variables dans les variables du quickapp : 

    •     Stove -> numéro du poele
    •     user -> nom d'utilisateur firenet
    •     password -> mot de passe firenet

     

     

    Modifications des variables dans le code main du quickapp : 

    •     local IDSC_Firenet_SetInfo = XXX  -- ID de la scène Firenet SetInfo

     

     

    Modifications des variables dans le code de la scène Firenet GetInfo

    •     local IDQappCalcifer = XXX -- ID du Quickapp Calcifer

     

    Modifications des variables dans le code de la scène Firenet SetInfo

    •     local IDQappCalcifer = XXX -- ID du Quickapp Calcifer

     

     

     

    Changelog :

     

    • v1.00 : mai 2025
      • Version initiale

     

    Téléchargement :

    Nouvelle installation :

    • importer le fichier suivant pour créer un nouveau QuickApp

    Calcifer_Firenet.fqa

     

    • créer les 2 scènes en y copiant le code.

    Firenet GetInfo.lua

    Firenet SetInfo.lua

     

    Mise à jour : copier/coller le contenu des fichiers suivants dans le QuickApp existant et les 2 scènes existantes :

    • Like 2
    • Upvote 1
  2. Bonjour.

    Tout d'abord, merci à Couillerot pour son code.

     

    Pour résoudre le problème des 50 requètes à ne pas dépasser, j'ai modifié la ligne 78 en augmentant le timer de 5 min (1000 ms x 60 sec x 5 min) à 60 min :

    avant

    fibaro.setTimeout(1000 * 60 * 5, function()

    après

                   fibaro.setTimeout(1000 * 60 * 60, function()

     

    1h est largement suffisant pour prévoir la pluie sur mes fraises :).

     

     

  3. Hello,

     

    Bon, j'ai un truc bizarre.

    Je n'ai pas le même comportement avec net.HTTPClient() dans une scène ou dans un QApp.

     

    Cela marche bien dans une scène. réponse 302 : login ok donc redirection et je récupère le cookie et je fais la suite, blablabla.

    Sur ma Qapp, si je vire pas le CheckCertificate alors je n'ai plus de réponse. Il ne se passe rien.

    Si je vire le CheckCertificate, alors j'ai une réponse erreur 404. La même erreur que quand je mets des faux login/password.

     

    Dans la scène, ces même logins/ password sont OK.

     

    Y a-t-il un comportement différent attendu entre les Scènes et les App ???

     

    Merci :)

     

    Voici mon code QA qui marche pas (erreur 404) : 

    function QuickApp:onInit()
        self:debug("onInit")
        -- récupère le token Easee
      
    	-- variables locales
    	local Debugging = 01
     	local EaseeURLlogin = "https://api.easee.com/api/accounts/login"
    		EaseeURLlogin = "https://www.rika-firenet.com/web/login/"
    		--EaseeURLlogin = "https://free.fr"
    	local http = net.HTTPClient()
    	local user = "toto"
    	local password = "titi"
    	local HTTPdata = '{"email": "'.. user .. '", "password": "' .. password .. '"}'
    
    	if Debugging > 0 then
    		fibaro.debug(DebugTag,"EaseeURLlogin : "..EaseeURLlogin)
    		fibaro.debug(DebugTag,"HTTPdata : "..HTTPdata)
    	end
    
    	http:request(EaseeURLlogin, {
    		options = {
    			--checkCertificate = false,
    			method = 'POST',
    			headers = {
    				['Accept'] = 'application/json',
    				['Content-Type'] = 'application/json',
    				},
    			data = HTTPdata,
    			timeout = 10000
    			},
    
    		success = function(response)
    			fibaro.debug(DebugTag,'ici')
    			fibaro.debug(DebugTag,response.status)
    		end,
    		
    		error = function(err)
    			local msg = "Erreur : " .. err
    			fibaro.warning(DebugTag,msg)
    		end,
    		}
    	)
    end

     

    debug Qapp:

    [24.01.2025] [13:41:18] [DEBUG] [QUICKAPP345]: onInit
    [24.01.2025] [13:41:18] [DEBUG] [TEST]: EaseeURLlogin : https://www.rika-firenet.com/web/login/
    [24.01.2025] [13:41:18] [DEBUG] [TEST]: HTTPdata : {"email": "toto", "password": "titi"}
    [24.01.2025] [13:41:19] [DEBUG] [TEST]: ici
    [24.01.2025] [13:41:19] [DEBUG] [TEST]: 404

     

    Voici mon code dans la scène (qui marche bien code 302)

    function APIGetInfo(URLBase, user ,password, Stove, parametre, value)
    
    	-- variables locales
    	local DebugTag = "SC_RIKA_107_APIGetInfo"	
    	local Debugging = 0
    	local URLLogin = "/web/login"
    	local URLAPI = "/api/client/"..Stove.."/status?nocache="
    	local Cookie = "vide"
    	local Revision = "vide" -- à virer ??????????
    
    	local URL = URLBase..URLLogin
    	local HTTPdata = '{"email": "'.. user .. '", "password": "' .. password .. '"}'
    
    	if Debugging > 0 then
    		fibaro.debug(DebugTag,"**************** Login ****************")
    		fibaro.debug(DebugTag,"URL = " .. URL)
    		fibaro.debug(DebugTag,"HTTPdata : "..HTTPdata)
    	end
    
    	http:request(URL, {
    		options = {
    			method = 'POST',
    			headers = {
    				['Accept'] = 'application/json',
    				['Content-Type'] = 'application/json',
    				},
    			data = HTTPdata,
    			timeout = 10000
    			},
    
    		success = function(response)
    		
    			if Debugging > 0 then
    				fibaro.debug(DebugTag,"status : "..response.status)
    				fibaro.debug(DebugTag,"response : " ..json.encode(response))
    				fibaro.debug(DebugTag,"response.data : " ..json.encode(response.data))
    				fibaro.debug(DebugTag,"Cookie : "..response.headers["Set-Cookie"])
    			end
    			
    			if response.status == 302 or response.status == 200 or response.status == 201 then
    			
    				fibaro.trace(DebugTag,"Login Firenet OK.")
    				Cookie = response.headers["Set-Cookie"]
              
              --[... suite du code]

     

    debug scène :

    [24.01.2025] [13:43:09] [DEBUG] [SC_RIKA_107]: **************** Start ****************
    [24.01.2025] [13:43:09] [DEBUG] [SC_RIKA_107_APIGETINFO]: **************** Login ****************
    [24.01.2025] [13:43:09] [DEBUG] [SC_RIKA_107_APIGETINFO]: URL = https://www.rika-firenet.com/web/login
    [24.01.2025] [13:43:09] [DEBUG] [SC_RIKA_107_APIGETINFO]: HTTPdata : {"email": "XXX", "password": "YYY"}
    [24.01.2025] [13:43:10] [DEBUG] [SC_RIKA_107_APIGETINFO]: status : 302
    [24.01.2025] [13:43:10] [DEBUG] [SC_RIKA_107_APIGETINFO]: response : {"data":"","headers":{"Strict-Transport-Security":"max-age=15552000; includeSubDomains","........

     

  4. Hello,

     

    Idée d'amélioration : 

     

    Ma sonde de temp remonte un chiffre à 10 digit. Ca sert à rien mais c'est comme ca ...

    J'ai donc modifié ton code pour avoir ceci sur la fonction HM:updateLabelTemp(item)

     

    function HM:updateLabelTemp(item)
      table.insert(self.iwashere, "updateLabelTemp")
      item.power = item.power or 0  -- not needed
      local device = iif(self.HMCF.coolingDevice, "❄️ ", "🔥 ")
      local percent = iif(self.isOff, "Off", string.format("%.0f%%", item.power))
      local power = device..percent.." | "..iif(item.state == ON, "", "💤")
      local tempe = item.temp or "N/A "
      if type(tempe) == "string" then tempe = math.floor(item.temp * 10) / 10 end
      if self.outdoor then
        self:updateLabel("lbTemp", "🌙 "..self.outdoor.."°C | 🌡️ "..tempe.."°C | "..power)
      else
        self:updateLabel("lbTemp", "🌡️ "..tempe.."°C | "..power)
      end
      table.remove(self.iwashere)
    end
     

     

    ajout de : 
      if type(tempe) == "string" then tempe = math.floor(item.temp * 10) / 10 end

     

    • Like 1
  5. Bon, j'ai fait quelques tests. Pour l'instant j'ai réussis à me connecter avec une scène sur https://www.rika-firenet.com/web/login.

    Bon après je suis bloqué, il me faudrait un compte avec un poêle enregistré.

    Ca intéresse quelqu'un de bosser avec moi sur les sujet ?

     

    [05.01.2025] [20:47:28] [DEBUG] [SC_RIKA_107]: **************** Start ****************
    [05.01.2025] [20:47:28] [DEBUG] [SC_RIKA_107]: URL = https://www.rika-firenet.com/web/login
    [05.01.2025] [20:47:29] [DEBUG] [SC_RIKA_107]: 302
    [05.01.2025] [20:47:29] [TRACE] [SC_RIKA_107]: OK => Location = /web/summary
    [05.01.2025] [20:47:29] [DEBUG] [SC_RIKA_107]: URL = https://www.rika-firenet.com/web/summary
    [05.01.2025] [20:47:29] [DEBUG] [SC_RIKA_107]: 404
    [05.01.2025] [20:47:29] [DEBUG] [SC_RIKA_107]: {"headers":{"Content-Security-Policy":"default-src 'self' fonts.gstatic.com fonts.googleapis.com bf56065spx.bf.dynatrace.com www.google.com www.gstatic.com www.google-analytics.com; style-src 'self' 'unsafe-inline' fonts.googleapis.com fonts.gstatic.com www.google.com www.gstatic.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' js-cdn.dynatrace.com www.google-analytics.com www.google.com www.gstatic.com; img-src 'self' data: www.google-analytics.com www.google.com www.gstatic.com","X-Frame-Options":"SAMEORIGIN","Nel":"{\"report_to\":\"heroku-nel\",\"max_age\":3600,\"success_fraction\":0.005,\"failure_fraction\":0.05,\"response_headers\":[\"Via\"]}","Report-To":"{\"group\":\"heroku-nel\",\"max_age\":3600,\"endpoints\":[{\"url\":\"https://nel.heroku.com/reports?ts=1736106449&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=7XgXV6GM1PpyRkEVl6zvOkcuFO9tiXlw4VBQMv%2FAIw4%3D\"}]}","Etag":"W/\"1e-9VJ6Obc5ehkdquBX8z1IxhBx8vk\"","X-Download-Options":"noopen","Vary":"Accept-Encoding","Server":"Cowboy","X-Webkit-Csp":"default-src 'self' fonts.gstatic.com fonts.googleapis.com bf56065spx.bf.dynatrace.com www.google.com www.gstatic.com www.google-analytics.com; style-src 'self' 'unsafe-inline' fonts.googleapis.com fonts.gstatic.com www.google.com www.gstatic.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' js-cdn.dynatrace.com www.google-analytics.com www.google.com www.gstatic.com; img-src 'self' data: www.google-analytics.com www.google.com www.gstatic.com","X-Content-Type-Options":"nosniff","X-Dns-Prefetch-Control":"off","Connection":"keep-alive","Via":"1.1 vegur","Reporting-Endpoints":"heroku-nel=https://nel.heroku.com/reports?ts=1736106449&sid=812dcc77-0bd0-43b1-a5f1-b25750382959&s=7XgXV6GM1PpyRkEVl6zvOkcuFO9tiXlw4VBQMv%2FAIw4%3D","Date":"Sun, 05 Jan 2025 19:47:29 GMT","Strict-Transport-Security":"max-age=15552000; includeSubDomains","Content-Type":"text/html; charset=utf-8","X-Content-Security-Policy":"default-src 'self' fonts.gstatic.com fonts.googleapis.com bf56065spx.bf.dynatrace.com www.google.com www.gstatic.com www.google-analytics.com; style-src 'self' 'unsafe-inline' fonts.googleapis.com fonts.gstatic.com www.google.com www.gstatic.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' js-cdn.dynatrace.com www.google-analytics.com www.google.com www.gstatic.com; img-src 'self' data: www.google-analytics.com www.google.com www.gstatic.com","Set-Cookie":"connect.sid=s%3AMvph0D9Db-B1mNvP8WZuS0mEn26p2C9N.Al7K5ikIDHDD4kr8hqOBcSicivq11IjLn5HhWXmPNg0; Path=/; Expires=Sun, 19 Jan 2025 19:47:29 GMT; HttpOnly","X-Xss-Protection":"1; mode=block","Content-Length":"30"},"data":"
    Not Found
    ","status":404}

     

  6. Tu 'as aucun message d'erreur avec ton QA même à 3 secondes de refresh ?

     

    Ca peut aussi être du à la passerelle qui serait différente ou avec un autre firmware.

    Quelle est la version de firmware de ta passerelle Envoy ?

    La mienne est en D8.2.4264 (882efd) du 27 juin 2024

     

     

  7. Ce n'est pas un problème réseau.

    J'ai les même symptômes en WIFI (ping 3ms) et LAN (ping 1ms).

    Et j'aurais aussi les problème avec mon code.

     

    Peut-être plus sur net.HTTPClient() ?

     

    Ca c'est ma fonction qui choppe le token toutes les heures.

     

    	local EnphaseURLlogin = "https://enlighten.enphaseenergy.com/login/login.json?"
    	local EnphaseURLToken = "https://entrez.enphaseenergy.com/tokens"
    	local envoy_serial = "XXXXXXX" -- sérial de l'installation Enphase
    	local user ="XXXXXX"
    	local password = "XXXXX"
    	local SessionID
    	local http = net.HTTPClient()
    
    	local DataEnphaseURLlogin = '{"user": {"email": "'.. user .. '", "password": "' .. password .. '"}}'  
    		-- attendu : DataEnphaseURLlogin = '{"user": {"email": "XXXX", "password": "XXXX"}}' 
    	
    	--fibaro.debug("test","Get session_id")
    
    	http:request(EnphaseURLlogin, {
    		options = {
    			checkCertificate = false,
    			method = 'POST',
    			headers = {
    				['Accept'] = 'application/json',
    				['Content-Type'] = 'application/json',
    				},
    			data = DataEnphaseURLlogin,
    			timeout = 10000
    			},
    
    		success = function(response)
    			--fibaro.debug("test",response.status)
    			if (response.status == 200 or response.status == 201) and type(response.data) == "string" and response.data ~= "" then
    				-- réponse OK
    				--.debug("test",response.data)
    				--[[ reponse attendue : 
    					{"message":"success",
    					"session_id":"XXXXXXXXXXX",
    					"manager_token":"eyJhbGciOiJIUzI......1NiJ9.eyJkYXRh",
    					"is_consumer":true,"system_id":XXXXXXXX}
    					--]]
    				SessionID = json.decode(response.data)
    				SessionID = SessionID.session_id
    				--fibaro.debug("test","session_id = " .. SessionID)
    
    -- ************************************	 Get Token ************************************
    				--fibaro.debug("test","Get Token")
    
    				local DataEnphaseURLToken = '{"session_id" : "' .. SessionID .. '", "serial_num" : "' .. envoy_serial .. '", "username" : "' .. user .. '"}'
    					-- attendu : DataEnphaseURLToken = '{"session_id" : "XXXX", "serial_num" : "XXXX", "username" : "XXXX"}'
    
    				http:request(EnphaseURLToken, {
    						options = {
    							checkCertificate = false,
    							method = 'POST',
    							headers = {
    								['Accept'] = 'application/json',
    								['Content-Type'] = 'application/json',
    								 },
    							data = DataEnphaseURLToken,
    							timeout = 10000
    							},
    
    						success = function(response)
    							--fibaro.debug("test",response.status)
    							if (response.status == 200 or response.status == 201) and type(response.data) == "string" and response.data ~= "" then
    								if type(response.data) == "string" and response.data ~= "" then	
    									-- réponse OK
    									--fibaro.debug("test",response.data)
    									local Token = response.data
    									fibaro.debug("test","Token = " .. string.format("Token ok","01"))
    									self:setVariable("TokenEnphase",Token) --> envoie du Token dans une variable globale
    								else
    									-- réponse Pas OK
    									fibaro.debug("test",'GetEnphaseToken response code : ' .. response.status)
    									local msg = 'GetEnphaseToken response code : ' .. response.data
    									fibaro.debug("test",msg)
    									SendMail(msg)
    								end
    							end
    						end,
    
    						error = function(err)
    							local msg = "GetEnphaseToken Erreur : " .. err
    							fibaro.debug("test",msg)
    							SendMail(msg)
    						end,
    						}
    					)
    					
    			else
    				-- réponse Pas OK
    				fibaro.debug("test",'GetEnphaseSession response code : ' .. response.status)
    				local msg = 'GetEnphaseSession response code : ' .. response.data
    				fibaro.debug("test",msg)
    				SendMail(msg)			
    			end
    		end,
    		
    		error = function(err)
    			local msg = "GetEnphaseSession Erreur : " .. err
    			fibaro.debug("test",msg)
    			SendMail(msg)
    		end,
    		}
    	)
    
    	fibaro.setTimeout(60 * 60 * 1000, function() GetEnvoyToken(self) end)
    
    end

     

    Ca c'est ma fonction qui choppe la table de l'envoy toutes les 3 secondes pour la mettre dans une variable :

     

    function GetEnvoyLive(self)
    	-- TableEnvoyLive
    
    	local Token = self:getVariable("TokenEnphase")
    	--fibaro.debug("test","Token = " .. Token)
    
    	local Bearer = 'Bearer ' .. Token
    	local URL = "https://192.168.X.X"
    	local API = "/ivp/meters/readings"
    
    	local http = net.HTTPClient()
    	http:request(URL .. API, {
    		options = {
    			checkCertificate = false,
    			method = 'GET',
    			headers = {
    				['Accept'] = 'application/json',
    				['Content-Type'] = 'application/json',
    				['Authorization'] = Bearer },
    			timeout = 10000
    			},
    		success = function(response)
    			local result = response.data;
    
    			if response.status == 200 or response.status == 201 then
    			-- réponse OK	
    				self:setVariable("TableEnvoy", response.data)
    				--fibaro.debug("test",response.data) 
    				TableEnvoy = json.decode(response.data)
    				--fibaro.debug("test","activePower = " .. TableEnvoy[2].activePower)
    				self:updateProperty("value", TableEnvoy[2].activePower)
    			else
    			-- réponse Pas OK
    				fibaro.debug("test",'response code : ' .. response.status)
    				fibaro.debug("test","TableEnvoy -> False")	
    				self:setVariable("TableEnvoy", "False")
    				fibaro.debug("test",response.data)			
    			end
    		end,
    		
    		-- Erreur sur la fonction
    		error = function(err)
    			fibaro.debug("test",'function(err) : ' .. err)
    			fibaro.debug("test","TableEnvoy -> False")	
    			self:setVariable("TableEnvoy", "False")
    		end
    	})
    	
    	fibaro.setTimeout(3 * 1000, function() GetEnvoyLive(self) end)
    end

     

    Et ca ma fonction qui choppe les values de la table toutes les 3 secondes (et qui les colle pour l'instant dans un label de ma Qapp).

     

    function GetTableEnvoy(self)
    	 -- récupération des valeur de l'Envoy  ********************************************************************************************************
    
    	local JsonTableEnvoy = self:getVariable("TableEnvoy") -- donwload de la table en string
    	--fibaro.debug("test",string.sub(JsonTableEnvoy,1,400)) -- affiche les 400 premiers caractères
    		
    	if JsonTableEnvoy == nil or string.len(JsonTableEnvoy) < 50 then -- creation de la variable global si necessaire (variable nulle ou corrompue)
    		fibaro.debug("test","Table JsonTableEnvoy Corrompu")
    		fibaro.debug("test",JsonTableEnvoy)
    	else
    		local TableEnvoy = json.decode(JsonTableEnvoy) -- conversion table string en table
    		PowerPVautoconsoW = math.floor(TableEnvoy[1].activePower,'PowerPVautoconsoW')		-- production solaire autoconsommation
    		EnergieCompteurW = -math.floor(TableEnvoy[2].activePower,'EnergieCompteurW')	-- Compteur linky puissance actrive en watts
    		EnergieCompteurVA = math.floor(TableEnvoy[2].apparentPower,'EnergieCompteurVA')	-- Compteur linky Puissance apparente en VA
    		cosphi = TableEnvoy[2].pwrFactor,'cosphi'						-- cosphi
    		--fibaro.debug("test","EnergieCompteurW = " ..EnergieCompteurW)
    		self:updateView("label_ID_0", "text", "PowerPVautoconsoW = "..PowerPVautoconsoW..", EnergieCompteurW = "..EnergieCompteurW)
    	end
    
    	fibaro.setTimeout(3 * 1000, function() GetTableEnvoy(self) end)
    end

     

    Si tu as un episte, je peux t'aider à faire des tests.

    Sinon, je vais chercher comment faire des childs (j'ai pas encore trouvé) pour me faire mon propre Qapp. Mais c'est dommage de refaire le même design que toi :/

     

     

  8. Salut Lazer,

     

    Je suis passé sur HC3. Je m'intéresse donc à ta Qapp qui me va très bien.

    J'ai néanmoins ces messages d'erreur dès que je passe à moins de 60 secondes de refresh (RefreshInterval)

     

    [07.11.2024] [22:01:29] [WARNING] [QA_ENPHASE_73]: Using old token
    [07.11.2024] [22:01:39] [ERROR] [QA_ENPHASE_73]: Can't get Enphase inventory : Operation canceled
    [07.11.2024] [22:01:54] [ERROR] [QA_ENPHASE_73]: Can't get new token : Operation canceled

     

    Et forcément, les childs sont sans valeur.

     

    J'ai réussis à porter mon code de HC2 vers HC3. Et j'ai bien un refresh de 3 secondes comme sur mon HC2 sans souci qui me donne les valeurs de conso, productions, etc.

    Je n'ai pas toutes les compétences pour décortiquer tout ton code qui est bien plus propre que le mien Et il y a surement des contraintes que je n'ai pas comprises,  mais du coup je m'interroge sur pourquoi ta Qapp ne marche pas chez moi :( .

    Qu'en penses tu ?

     

×
×
  • Créer...