Aller au contenu

Messages recommandés

Posté(e)

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"
   }
}

 

Posté(e)

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.

 

Posté(e)

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'

 

Posté(e) (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é par flacon030
Posté(e) (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é par Lazer
Posté(e)

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

 

Posté(e)
    if type(self.Voltage_DC) == "number" then
        self:updateView("Voltage_DC", "text", "Tension batterie: " .. string.format("%.3f",self.Voltage_DC) .. " V")

 

Posté(e) (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é par flacon030
Posté(e)

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)

 

Posté(e)

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" } } 

 

Posté(e) (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é par flacon030
Posté(e) (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é par flacon030
×
×
  • Créer...