Czy dało by się zro...
 
Powiadomienia
Wyczyść wszystko

Pomoc Czy dało by się zrobić skrypt zliczający: ile energii pobiera mój Dom

11 Wpisów
2 Użytkownicy
0 Reactions
1,687 Wyświetleń
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 

Odświeżę temat:

Pytanie do znawców skryptologii dzvents

Czy dało by się zrobić skrypt zliczający: ile energii pobiera mój Dom (dziennie+miesiecznie) z tego API

	
Body	
Data	
0	
Details	
Manufacturer	"Fronius"
Model	"S0 Meter at inverter 1"
Serial	"n.a."
Enable	1
EnergyReal_WAC_Minus_Relative	44
Meter_Location_Current	1
PowerReal_P_Sum	-580.1304869532953
TimeStamp	1629618495
Visible	1
Head	
RequestArguments	
DeviceClass	"Meter"
Scope	"System"
Status	
Code	0
Reason	""
UserMessage	""
Timestamp	"2021-08-22T09:48:16+02:00"

z tego linku:

http://192.168.1.199/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System

Byłbym bardzo wdzięczny za pomoc

 
Dodane : 22/08/2021 8:53 am
isom
 isom
(@isom)
Wpisów: 5178
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Ja nie umiem zrobić w skrypcie działań matematycznych na dwóch ujemnych wartościach . Normalnie dwie ujemne wartości odejmujemy tak że do pierwszej ujemnej dodajemy wartość z przeciwnym znakiem , ale jak to zrobić w skrypcie ? Zawsze dostanę zły argument i będzie kicha.

Pomijam brak informacji o tym jaki to czujnik ? Licznik , CustomSensor , czy jeszcze coś innego. Myślę że warto opisywać co się zrobiło na czym i co się chce uzyskać bo inaczej to nikt nie będzie w stanie pomóc.

 
Dodane : 23/08/2021 1:42 pm
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 
Dodane przez: @isom

Ja nie umiem zrobić w skrypcie działań matematycznych na dwóch ujemnych wartościach . Normalnie dwie ujemne wartości odejmujemy tak że do pierwszej ujemnej dodajemy wartość z przeciwnym znakiem , ale jak to zrobić w skrypcie ? Zawsze dostanę zły argument i będzie kicha.

Pomijam brak informacji o tym jaki to czujnik ? Licznik , CustomSensor , czy jeszcze coś innego. Myślę że warto opisywać co się zrobiło na czym i co się chce uzyskać bo inaczej to nikt nie będzie w stanie pomóc.

Nic sie nie zrobilo o to chodzi. Korzystam z twoich skryptow 🙂

Wartosc energii pobranej przez dom otrzymuje za pomocą tego skryptu:

local scriptVar = 'Fronius_Meter'
return
{
    on =
    {
        timer =
        {'every minute'},

        httpResponses =
        {
        scriptVar,
        },
    },

    logging =
    {
        level = domoticz.LOG_ERROR,
        marker = Fronius_Meter,
    },

    execute = function(dz, item)
        
        local IPFronius = dz.variables('UV_FroniusIP').value  -- zmienna w domoticz typ string IPFronius

        if item.isTimer then
            dz.openURL(
            {
                url = 'http://'..IPFronius..'/solar_api/v1/GetPowerFlowRealtimeData.fcgi',
                callback = scriptVar,
            })
            return
        end

        if item.ok and item.isJSON then
            local rt = item.json.Body.Data.Site
            if not(rt) then 
                dz.log('There is no Body.Data in the JSON', dz.LOG_ERROR)
                dz.utils.dumpTable(item.json) 
            else
                dz.devices('PGE').updateCustomSensor( rt.P_Grid or 0)
                dz.devices('Dom').updateCustomSensor( rt.P_Load or 0)
                dz.devices('Samowystarczalność').updateCustomSensor( rt.rel_Autonomy or 0)
                dz.devices('Potrzeby_własne').updateCustomSensor( rt.rel_SelfConsumption or 0)
            end
        else
            dz.log('There was a problem handling the request', dz.LOG_ERROR)
            dz.log(item, dz.LOG_DEBUG)
        end

    end
}

Czujnik to Custom Sensor

Wartosc jest pobierana z API Froniusa z dolozonym licznikiem impulsowym

Marzeniem byloby miec zuzycie (przez dom) dobowe tygodniowe i miesieczne

Mam tez skrypt znaleziony w sieci ktory liczy mi miesieczna wartosc produkcji

Moze  on naprowadzi cokolwiek na temat

local httpResponses = "monthTotal"

return {
    on      =   {   
                    timer           =   { "every 15 minutes" },
                    httpResponses   =   { httpResponses .. "*" } 
                },

    logging =   {   
                    level           =   domoticz.LOG_ERROR, -- set to LOG_ERROR when script works as expected
                    marker          =   httpResponse   
                },
                
    execute = function(dz, item)
        -- ****************************** Your settings below this line ***************************************************
        usageDevice = dz.devices(67)          -- Replace xxxx with ID of energyDevice you want to track
        monthTotal = dz.devices(172)        -- Create as virtual managed counter (energy) and change yyyy to the ID of the new device
        -- ****************************** No changes required below this line *********************************************
        
        local function logWrite(str,level)
            dz.log(tostring(str),level or dz.LOG_DEBUG)
        end
        
        local function triggerJSON(id, period, delay)
            local delay = delay or 0
            local  URLString   =    dz.settings['Domoticz url'] .. "/json.htm?type=graph&sensor=counter&range=" .. 
                                    period .. "&idx=" .. id 
            dz.openURL({    url = URLString,
                            method = "GET",
                            callback = httpResponses .. "_" .. period}).afterSec(delay)                      
        end
        
        local function calculateMonthTotal(rt)
            local monthTotal = 0
            local currentMonth = dz.time.rawDate:sub(1,7)
            for id, result in  ipairs(rt) do 
                if rt[id].d:sub(1,7) == currentMonth then
                    logWrite(rt[id].d .. " ==>> " .. rt[id].v)
                    monthTotal = monthTotal + rt[id].v
                end
            end
            return monthTotal * 1000
        end    
        
        if not item.isHTTPResponse then
            triggerJSON(usageDevice.id, "month")
        elseif item.ok then                                      -- statusCode == 2xx
            monthTotal.update(0,calculateMonthTotal(item.json.result))
        else
            logWrite("Could not get (good) data from domoticz. Error (" .. (item.statusCode or 999) .. ")"  ,dz.LOG_ERROR)
            logWrite(item.data)
        end
    end
}

Czujnik to Managed Counter

Niestety ten czujnik nie rysuje mi wykresow nie wiem czemu. Byc moze dopiero po uplywie miesiaca cos sie pokaze. Nie wiem bo uzywam go kilkanascie dni.

 

 
Dodane : 23/08/2021 6:12 pm
isom
 isom
(@isom)
Wpisów: 5178
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

@kniazio ten skrypt znaleziony w sieci będzie zliczał miesięczne zużycie tyle że z czujnika typu licznik . Używa on json do pobrania wskazań takich jak

1

 Jak podstawisz do tego skryptu czujnik typu licznik to będzie działać , jednak nie ma to nic wspólnego z pobieraniem danych z froniusa i aktualizowaniem czujnika CustomSensor.

Mnie to na nic nie naprowadzi bo dalej widzę problem ,o którym pisałem wcześniej

 
Dodane : 23/08/2021 7:08 pm
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 

Ok. A czy nie dalo by sie zrobic czujnika typu licznik z tego linku?

http://192.168.1.199/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System

	
Body	
Data	
0	
Details	
Manufacturer	"Fronius"
Model	"S0 Meter at inverter 1"
Serial	"n.a."
Enable	1
EnergyReal_WAC_Minus_Relative	30
Meter_Location_Current	1
PowerReal_P_Sum	-307.2983095757838
TimeStamp	1629783666
Visible	1
Head	
RequestArguments	
DeviceClass	"Meter"
Scope	"System"
Status	
Code	0
Reason	""
UserMessage	""
Timestamp	"2021-08-24T07:41:06+02:00"
 
Dodane : 23/08/2021 8:46 pm
isom
 isom
(@isom)
Wpisów: 5178
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Pomijając wartości ujemne, czy zawsze te wartości przyrastają w funkcji czasu ? Licznik musi dostawać zawsze większą wartość od poprzedniej żeby działał prawidłowo 

 
Dodane : 24/08/2021 7:32 am
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 
Dodane przez: @isom

Pomijając wartości ujemne, czy zawsze te wartości przyrastają w funkcji czasu ? Licznik musi dostawać zawsze większą wartość od poprzedniej żeby działał prawidłowo 

Wartosci sa takie jaki pobor pradu w domu wiec raz sa wieksze a raz mniejsze

Sa jak mowi nazwa parametru RealTime

 
Dodane : 24/08/2021 7:37 am
isom
 isom
(@isom)
Wpisów: 5178
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

To już wiesz dlaczego aktualizowany jest CustomSensor a nie Licznik .

Podłącz ten licznik bemko do jakiegoś ESP i wysyłaj wartości chwilowe równolegle do domoticz i do fronka a bedziesz miał licznik zużycia gotowy, albo wymień licznik na ten który proponowałem  na początku - Modbus 

 

 
Dodane : 24/08/2021 7:39 am
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 

@isom Na tej stronie autor pisze o wersji 1.1 API oraz o wiekszej ilosci danych z Froniusa.

W sieci nic nie moge znalezc na ten temat. Ciekawe

https://github.com/iobroker-community-adapters/ioBroker.fronius/issues/52

Please try out the newest Version V1.1. There the most datapoints are visible. If you need specific extensions, then just let us know the missing datapoints

 
Dodane : 24/08/2021 7:51 am
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 
Dodane przez: @isom

To już wiesz dlaczego aktualizowany jest CustomSensor a nie Licznik .

Podłącz ten licznik bemko do jakiegoś ESP i wysyłaj wartości chwilowe równolegle do domoticz i do fronka a bedziesz miał licznik zużycia gotowy, albo wymień licznik na ten który proponowałem  na początku - Modbus 

 

 A cos blizej tego esp?

Jak podlaczyc. Na tym zlaczu przeciez pewnie jakies napiecie jest.

Jaki plugin itp. Uzywam EasyEsp.

 
Dodane : 24/08/2021 10:17 am
kniazio
(@kniazio)
Wpisów: 210
Pomocny Donator 2K21
Autor tematu
 

Temat licznika zuzycia rozwiazany

obraz
obraz

W skrypcie @isom trzeba bylo zmodyfikowac typ licznika:

dz.devices('Zużycie_Dom').updateElectricity( rt.P_Load or 0)

 

local scriptVar = 'Fronius_Meter'
return
{
    on =
    {
        timer =
        {'every minute'},

        httpResponses =
        {
        scriptVar,
        },
    },

    logging =
    {
        level = domoticz.LOG_ERROR,
        marker = Fronius_Meter,
    },

    execute = function(dz, item)
        
        local IPFronius = dz.variables('UV_FroniusIP').value  -- zmienna w domoticz typ string IPFronius

        if item.isTimer then
            dz.openURL(
            {
                url = 'http://'..IPFronius..'/solar_api/v1/GetPowerFlowRealtimeData.fcgi',
                callback = scriptVar,
            })
            return
        end

        if item.ok and item.isJSON then
            local rt = item.json.Body.Data.Site
            if not(rt) then 
                dz.log('There is no Body.Data in the JSON', dz.LOG_ERROR)
                dz.utils.dumpTable(item.json) 
            else
                dz.devices('PGE').updateCustomSensor( rt.P_Grid or 0)
                dz.devices('Dom').updateCustomSensor( rt.P_Load or 0)
                dz.devices('Zużycie_Dom').updateElectricity( rt.P_Load or 0)
                dz.devices('Samowystarczalność').updateCustomSensor( rt.rel_Autonomy or 0)
                dz.devices('Potrzeby_własne').updateCustomSensor( rt.rel_SelfConsumption or 0)
            end
        else
            dz.log('There was a problem handling the request', dz.LOG_ERROR)
            dz.log(item, dz.LOG_DEBUG)
        end

    end
}

 

 

 
Dodane : 30/08/2021 6:55 am
Udostępnij: