flacon030 Posté(e) mardi à 14:32 Auteur Signaler Posté(e) mardi à 14:32 C'est cela le code en json brut? { "Body" : { "Data" : { "0" : { "Controller" : { "Capacity_Maximum" : 16588.0, "Current_DC" : 0.0, "DesignedCapacity" : 16588.0, "Details" : { "Manufacturer" : "BYD", "Model" : "BYD Battery-Box Premium HV", "Serial" : "P030T020Z2306091139 " }, "Enable" : 1, "StateOfCharge_Relative" : 95.099999999999994, "Status_BatteryCell" : 3.0, "Temperature_Cell" : 28.5, "TimeStamp" : 1756823536, "Voltage_DC" : 320.89999999999998 }, "Modules" : [] } } }, "Head" : { "RequestArguments" : { "Scope" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2025-09-02T14:32:20+00:00" } }
Lazer Posté(e) mardi à 14:40 Signaler Posté(e) mardi à 14:40 Oui c'est cela. Et on voit que l'index est bien de type chaine de caractère, "string", donc il faut l'utiliser tel quel avec les guillemets autour du 0, le tout entre crochet.
flacon030 Posté(e) mardi à 15:09 Auteur Signaler Posté(e) mardi à 15:09 c'est bien se que j'ai fait self.Current_DC = fronius.Body.Data["0"].Controller.Current_DC or 0 et je me retrouve avec ce message d'erreur [02.09.2025] [17:06:36] [ERROR] [QUICKAPP598]: QuickApp crashed [02.09.2025] [17:06:36] [ERROR] [QUICKAPP598]: main.lua:479: attempt to index a nil value (field 'Controller') Et si j'essaye cela j'ai ce message d'erreur self.Voltage_DC = fronius.Body.Data["0"]Controller.Voltage_DC or 0 [02.09.2025] [17:07:35] [ERROR] [QUICKAPP598]: QuickApp crashed [02.09.2025] [17:07:35] [ERROR] [QUICKAPP598]: main.lua:479: syntax error near 'or'
jojo Posté(e) mardi à 15:13 Signaler Posté(e) mardi à 15:13 oui, mais pourquoi tu commences avec fronius. et sans ?
flacon030 Posté(e) mardi à 15:17 Auteur Signaler Posté(e) mardi à 15:17 (modifié) Si je ne mais pas Fronius cela ne fonctionne pas il y est pour toutes mes demandes qui fonctionnent comme celle ci qui se trouve sur une autre adresse JSON self.childs.totalEnergyConsumedChild:updateProperty("log", "") self:setChildVisibility("totalEnergyConsumedChild", true) self.E_Total_Produced = fronius.Body.Data["0"].EnergyReal_WAC_Sum_Produced or 0 -- total energy produit self.E_Total_Consumed = fronius.Body.Data["0"].EnergyReal_WAC_Sum_Consumed or 0 -- total energy consumed self.Frequency_Phase_Average = fronius.Body.Data["0"].Frequency_Phase_Average or 0 -- Ajout frequence self.Current_AC_Phase_1 = fronius.Body.Data["0"].Current_AC_Phase_1 or 0 -- Ajout courant ph1 self.Current_AC_Phase_2 = fronius.Body.Data["0"].Current_AC_Phase_2 or 0 -- Ajout courant ph2 self.Current_AC_Phase_3 = fronius.Body.Data["0"].Current_AC_Phase_3 or 0 -- Ajout courant ph3 self.Voltage_AC_Phase_1 = fronius.Body.Data["0"].Voltage_AC_Phase_1 or 0 self.Voltage_AC_Phase_2 = fronius.Body.Data["0"].Voltage_AC_Phase_2 or 0 self.Voltage_AC_Phase_3 = fronius.Body.Data["0"].Voltage_AC_Phase_3 or 0 Modifié mardi à 15:17 par flacon030
Lazer Posté(e) mardi à 15:21 Signaler Posté(e) mardi à 15:21 (modifié) il y a 12 minutes, flacon030 a dit : self.Current_DC = fronius.Body.Data["0"].Controller.Current_DC or 0 OK la syntaxe semble bonne, mais la condition or ne l'est pas. Si tu veux être rigoureux et éviter tout plantage, il faut tester chaque élément du tableau imbriqué avant de récupérer la valeur, ou bien de renvoyer 0 : self.Current_DC = type(fronius) == "table" and type(fronius.Body) == "table" and type(fronius.Body.Data) == "table" and type(fronius.Body.Data["0"]) == "table" and type(fronius.Body.Data["0"].Controller) == "table" and fronius.Body.Data["0"].Controller.Current_DC or 0 Je ne suis pas sûr que tu récupérera ta valeur, mais au moins tu éviteras le crash du code LUA. Modifié mardi à 15:22 par Lazer
flacon030 Posté(e) mardi à 15:31 Auteur Signaler Posté(e) mardi à 15:31 Cela avance a present j'ai ce message d'erreur [02.09.2025] [17:30:02] [ERROR] [QUICKAPP598]: QuickApp crashed [02.09.2025] [17:30:02] [ERROR] [QUICKAPP598]: main.lua:496: bad argument #2 to 'format' (number expected, got nil) La ligne 496 est la suivante: if self.Voltage_DC ~= json.null() then self:updateView("Voltage_DC", "text", "Tension batterie: " .. string.format("%.3f",self.Voltage_DC) .. " V")
Lazer Posté(e) mardi à 15:33 Signaler Posté(e) mardi à 15:33 if type(self.Voltage_DC) == "number" then self:updateView("Voltage_DC", "text", "Tension batterie: " .. string.format("%.3f",self.Voltage_DC) .. " V")
flacon030 Posté(e) mardi à 15:42 Auteur Signaler Posté(e) mardi à 15:42 (modifié) Il n'y a plus d'erreur mais la valeur ne remonte pas Voici mon code -- comment the line below to activate trace logs fibaro.trace = function() end function QuickApp:onInit() self:debug('onInit') self.E_Total_Consumed = 0 self.E_Total_Produced = 0 if (not self:checkConfiguration()) then self:updateProperty("log", "Not configured") self:warning("Quick app not configured. Please go to the quick app variables configuration, and set ip of your Fronius device.") else self:updateProperty("log", "") self:trace("initFields") self:initFields() self:trace("createChildDevices") self:createChildDevices() self:trace("fetchGeneralData") self:fetchGeneralData() self:trace("fetchMeterData") self:fetchMeterData() self:trace("fetchInverterData") self:fetchInverterData() self:trace("fetchStorageData") self:fetchStorageData() end end function QuickApp:checkConfiguration() if self:getVariable("ip") ~= "" and self:getVariable("port") ~= "" and self:getVariable("timeout") ~= "" then return true end return false end function QuickApp:initFields() self.http = net.HTTPClient({ timeout = 3000 }) self.ip = self:getVariable("ip") self.port = self:getVariable("port") self.timeout = tonumber(self:getVariable("timeout")) self.childs = {} self:updateProperty("configured", true) end -- fetch Storage data --------------------------------------------------------------------------------------------------------------------------------- function QuickApp:fetchStorageData() self.http:request("http://" .. self.ip .. ":" .. self.port .. "/solar_api/v1/GetMeterRealtimeData.cgi", { options = { method = "GET", timeout = 10000, headers = { ["Accept"] = "application/json" } }, success = function(response) if (response.status == 200) then self:parseStorageData(response.data) end fibaro.setTimeout(tonumber(self.timeout) * 1000, function () self:fetchStorageData() end) end, error = function(err) self:error(tostring(err)) fibaro.setTimeout(tonumber(self.timeout) * 1000, function () self:fetchStorageData() end) end }) end function QuickApp:parseStorageData(data) local fronius = json.decode(data) self.Current_DC = type(fronius) == "table" and type(fronius.Body) == "table" and type(fronius.Body.Data) == "table" and type(fronius.Body.Data["0"]) == "table" and type(fronius.Body.Data["0"].Controller) == "table" and fronius.Body.Data["0"].Controller.Current_DC or 0 if type(self.Voltage_DC) == "number" then self:updateView("Voltage_DC", "text", "Tension batterie: " .. string.format("%.3f",self.Voltage_DC) .. " V") end end Modifié mardi à 15:46 par flacon030
Lazer Posté(e) mardi à 15:55 Signaler Posté(e) mardi à 15:55 Dans la fonction parseStorageData(), tu pourrais ajouter une trace toute bête pour débugguer, et tu nous donnes ce qui s'affiche dans le log : print(data)
flacon030 Posté(e) mercredi à 07:15 Auteur Signaler Posté(e) mercredi à 07:15 voici les données [03.09.2025] [09:13:35] [DEBUG] [QUICKAPP598]: onInit [03.09.2025] [09:13:36] [DEBUG] [QUICKAPP598]: { "Body" : { "Data" : { "0" : { "Controller" : { "Capacity_Maximum" : 16588.0, "Current_DC" : 5.3786226238703652, "DesignedCapacity" : 16588.0, "Details" : { "Manufacturer" : "BYD", "Model" : "BYD Battery-Box Premium HV", "Serial" : "P030T020Z2306091139 " }, "Enable" : 1, "StateOfCharge_Relative" : 35.399999999999999, "Status_BatteryCell" : 3.0, "Temperature_Cell" : 26.0, "TimeStamp" : 1756883610, "Voltage_DC" : 320.89999999999998 }, "Modules" : [] } } }, "Head" : { "RequestArguments" : { "Scope" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2025-09-03T07:13:35+00:00" } }
flacon030 Posté(e) mercredi à 09:56 Auteur Signaler Posté(e) mercredi à 09:56 (modifié) C'est bon cela fonctionne J'avais fait une petite erreur j'avais mis courant d'un coté, et voltage de l'autre (voir capture) Merci encore pour ton aide Modifié mercredi à 10:02 par flacon030
flacon030 Posté(e) mercredi à 14:13 Auteur Signaler Posté(e) mercredi à 14:13 (modifié) Bonjour a tous voici la version ultime pour ma par Elle n'est pas parfaite mais fonctionnel Voici les données que je cherchais a avoir pour infludb et grafana J'ai ajouté par rapport a la dernière version les éléments suivants: La tension batterie La T° de la batterie Le courant de charge / décharge de la batterie Les tensions 230V de l'onduleur Les courants de l'onduleur Le cos Phi de l'onduleur Les tensions des PV1 et 2 Les courants des PV1 et 2 Se que je n'ai pas implémenté se sont: les tension en triphasé (430V) Les puissance en réactif en mono et triphasé Les puissances par phase en W et en Va Plus quelque autres éléments Fronius(1).fqa Modifié mercredi à 18:15 par flacon030
Lazer Posté(e) mercredi à 18:40 Signaler Posté(e) mercredi à 18:40 Désole pas trop dispo aujourd'hui. Bien vu pour l'inversion courant/tension.
Messages recommandés