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
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.
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.
@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
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
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"
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
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
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
@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
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.
Temat licznika zuzycia rozwiazany
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 }