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
}



