Hi,
Ich habe mir ein kleines Skript gebastelt, welches den Energieverbrauch und die Kosten eines Gerätes berechnet.
Dieses funktioniert in der V0.1 schon ganz brauchbar:
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
local DeviceID = 334
local mon = 6
local ct = 22.41
local DeviceName = fibaro:getName (DeviceID)
local DeviceRoom = fibaro:getRoomNameByDeviceID (DeviceID)
sek = math.floor(mon*4*7*24*24*3600) -- Umrechnung in Monate
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
function energieverbrauch();
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return(jsonListe[1].kWh)
end
Debug("cyan",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName)))
Debug('orange',(os.date("%d.%m.%Y - Verbrauch/Monat "..string.format("%.2f", energieverbrauch()).." kWh und kostet "..string.format("%.2f", energieverbrauch()*ct/100).." €.")))
Jetzt würde ich gerne, dass ich mehrere IDs eintragen kann um in späterer Folge dann einen monatlichen Report der wichtigsten Geräte per Email zu bekommen.
Leider scheitere ich derzeit an der Erweiterung der Device IDs in ein Array:
Meine V0.2 des Skriptes bringt immer den Fehler [DEBUG] 02:58:09: line 91: Unclosed elements present
Hier das SKript, vielleicht habt ihr ja einen Tipp oder es gibt ein Beispiel irgendwo, das ich noch nicht gefunden hab !?
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
local vbrIDs = {334,87}
local mon = 6
local ct = 22.41
function CheckVBR(IDs)
for i=1, #IDs do
local DeviceID = tonumber(fibaro:getValue(IDs[i],"value"))
local DeviceName = fibaro:getName(IDs[i])
local DeviceRoom = fibaro:getRoomNameByDeviceID(IDs[i])
sek = math.floor(mon*4*7*24*24*3600)
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
function energieverbrauch();
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return(jsonListe[1].kWh)
end
Debug("cyan",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName)))
Debug('orange',(os.date("%d.%m.%Y - Verbrauch/Monat "..string.format("%.2f", energieverbrauch()).." kWh und kostet "..string.format("%.2f", energieverbrauch()*ct/100).." €.")))
end
end
CheckVBR(vbrIDs)
Stimmt, danke Hoggle!
Habe nun die Zeile 4 geändert auf local IDs = {334,87}
Zusätzlich noch Zeile 25 auf CheckVBR(IDs)
Leider hat sich am Fehler nichts geändern ;-(
Habe ich deinen Tipp richtig umgesetzt, oder hab ich da was missverstanden?
Ist es eigentlich gut die Function function energieverbrauch() als Unterfunktion der function CheckVBR(IDs) einzubauen, oder könnte man die auch außerhalb ansiedeln?
Sorry aber mit den Funktionen hab ich’s noch nicht so 100% ig
So nun habe ich den Code so angepasst wie ich es verstanden hab.
Habe die Json Zeile vorerst auskommentiert und weitere Debugs hinzugefügt, jetzt läuft das skript zumindest mal OHNE Fehler durch.
Und ich habe eine Spur!
Der Debug in Zeile 23 (siehe unten) gibt mir in der Variable “DeviceID” eine fortlaufende Nummer (0,1) statt der ID des Gerätes!
Vermutlich ist das der Fehler, aber ich verstehe nicht was ich falsch hab. GENAU der selbe Befehl wie in Zeile 16 befüllt in einem anderen Skript die Variable mit dem richtigen Wert, der ID des Gerätes?!
Ich fürchte ich steh gerade voll auf dem Schlauch ;-(
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
vbrIDs = {334,87}
mon = 6
sek = math.floor(mon*4*7*24*3600)
ct = 22.41
function energieverbrauch()
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return(jsonListe[1].kWh)
end
function vbr(IDs)
for i=1,#IDs do
DeviceID = tonumber(fibaro:getValue(IDs[i],"value"))
DeviceName = fibaro:getName(IDs[i])
DeviceRoom = fibaro:getRoomNameByDeviceID(IDs[i])
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
--jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
Debug("cyan"," "..DeviceRoom.." - "..DeviceName)
Debug("cyan"," "..DeviceID.." Start: "..StartEnergiemessung.. " Stop: "..EndEnergiemessung)
--Debug('orange',(os.date("%d.%m.%Y - Verbrauch/Monat "..string.format("%.2f", energieverbrauch()).." kWh und kostet "..string.format("%.2f", energieverbrauch()*ct/100).." €.")))
end
end
vbr(vbrIDs)
Hallo Boomx,
Kannst du mir eventuell bei dieser Zeile einen konkreteren Tipp geben?
Die Schleifen überfordern mich leider noch etwas
Habe folgendes in Zeile 16 probiert: DeviceID = fibaro:getValue(IDs[i])
-> [DEBUG] 07:15:14: line 115: attempt to concatenate local ‘propertyName’ (a nil value)
DeviceID = fibaro:getValue(IDs[i],IDs[i])
-> [DEBUG] 07:17:57: line 23: attempt to concatenate global ‘DeviceID’ (a nil value)
DeviceID = tonumber(fibaro:getValue(IDs[i],IDs[i]))
-> [DEBUG] 07:17:57: line 23: attempt to concatenate global ‘DeviceID’ (a nil value)
DeviceID = tonumber(fibaro:getValue(IDs[i]))
[DEBUG] 07:21:58: line 115: attempt to concatenate local ‘propertyName’ (a nil value)
Warum willst du dort den Zustand auslesen? Du willst doch die DeviceID und die steht wie oben beschrieben in der Variablen IDs[i]. Lass einfach das getValue weg, eine Fibaro-Funktion hat dort nichts zu suchen!!!
Ich bin so betriebsblind, SORRY !!!
Danke, jetzt klappt auch die JSON Abfrage.
Nächster Schritt, das alles in ein hübsches Email zu verpacken und 1 x im Monat zu verschicken,
das habe ich hier schon irgendwo gesehen, das schaff ich hoffentlich ohne euch zu quälen
Die Variable sek sieht für mich noch ein wenig gequält aus. Ich denke Du willst die Sekunden in einem Monat ausgeben und mit der Anzahl der Monate (mon) multplizieren.
Das math.floor() brauchst Du nicht, sind ja alles Ganzzahlen. Ein Tag hat 86400 Sekunden x 30 Tage x mon.
Also sek = mon3086400. Wenn ich es richtig gedeutet habe.
Stimmt Jeep, danke für den Tipp, habs gerade eingebaut!
Die Email Funktionalität für mein Skript werd ich mir von deinem Baterieskript abschauen, wenn das erlaubt ist
Zwischenzeitlich habe ich mal alle nötigen Geräte eingefügt um die Verbrauchswerte auf plausibilität zu testen.
Läuft alles sehr gut, bis auf einen Tifekühler im Keller der angeblich im Monat 4300 kWh verbraucht.
Habe mir die Verbrauchskurven angesehen und einen ausrutscher für einige Sekunden auf 28 MegaWatt entdeckt (siehe Anhang), die das Ding niemals verbraucht haben kann
Bekomm ich das aus der Statistik irgendwie weg, oder muss ich die Werte komplett aus dem plug löschen, damit ich eine klare Langzeitbewertung bekomme?
Hi Leute,
Habe jetzt mal ein kleines knackiges Skript gebaut, welches die Verbrauchswerte von bestimmten ID’s ausliest und als Debugg ausgibt.
Läuft schon mal ganz gut!
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
vbrIDs = {169,256,334,87,326,246,215,250,6}
mon = 1
sek = mon*30*86400
ct = 22.41
function energieverbrauch()
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return(jsonListe[1].kWh)
end
function vbr(IDs)
for i=1,#IDs do
DeviceID = IDs[i]
DeviceName = fibaro:getName(IDs[i])
DeviceRoom = fibaro:getRoomNameByDeviceID(IDs[i])
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
Debug("orange"," "..DeviceRoom.." - "..DeviceName.." - " ..string.format("%.2f", energieverbrauch()).." kWh in "..mon.. " Monat(en) - € "..string.format("%.2f", energieverbrauch()*ct/100))
end
end
vbr(vbrIDs)
Jetzt hab ich versucht in meinem Skript die Informationen die im Debug Fenster angezeigt werden zeilenweise in eine Variable zu bekommen um dann die gesamte Liste als Email zuversenden. Leider klappt das mit dem Anfügen nicht wirklich ;-(
Habe mir auch das Batteriecheck Skript von jeep angesehen, und dorr versucht abzukupfern, leider ohne Erfolg.
Habt ihr einen Tipp wie ich das machen kann?
Das bringt immer einen Fehler “unexpected symbol near =…”
Hier ist mein fertiges Skript:
Du musst nur folgendes tun, damit es bei dir läuft:
1.) Deine Geräte IDs in die Variable vbrIDs schreiben
2.) die Zeitspanne in Monaten der Auswertung in der Variable “mon” festlegen
3.) Strompreis in Cent eintragen
4.) DIe Userid an die das Email verschickt werden soll
Fertig!
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
vbrIDs = {6,169,256,334,87,85,326,215,250,418,424} --IDs der Geräte zur Auswertung
mon = 1 -- Anzahl der Monate für Statistik
ct = 22.41 -- Strompreis
local userId = 2 -- Email USer
-- ab hier nichts mehr ändern! ----------
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
sek = mon*30*86400
local status =""
function energieverbrauch()
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return(jsonListe[1].kWh)
end
function vbr(IDs)
for i=1,#IDs do
DeviceID = IDs[i]
DeviceName = fibaro:getName(IDs[i])
DeviceRoom = fibaro:getRoomNameByDeviceID(IDs[i])
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
Debug("orange"," "..DeviceRoom.." - "..DeviceName.." - " ..string.format("%.2f", energieverbrauch()).." kWh in "..mon.. " Monat(en) - € "..string.format("%.2f", energieverbrauch()*ct/100))
status = status.. "\n" ..DeviceRoom.." - "..DeviceName.." - " ..string.format("%.2f", energieverbrauch()).." kWh in "..mon.. " M - € "..string.format("%.2f", energieverbrauch()*ct/100 )
end
end
vbr(vbrIDs)
fibaro:call(userId, "sendEmail","Fibaro-Info: Verbrauchsstatistik", status)
Hi @pblacky,
ich habe mir erlaubt Dein script ein wenig aufzuhübschen und zu optimieren und am Ende den Gesamtverbrauch
samt Summe € im Zeitraum darzustellen.
Außerdem wird die Funktion energieverbrauch() nur noch einmal aufgerufen und nicht 4 mal. Das spart CPU Zeit.
Natürlich könnte man dass noch viel besser machen, vielleicht hast Du mal Lust daran weiter zu basteln.
--[[
%% properties
%% events
--]]
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
local vbrIDs = {39,81,166,180,199,285,339,383,} --IDs der Geräte zur Auswertung
local mon = 12 -- Anzahl der Monate für Statistik
local ct = 28.50 -- Strompreis
local userId = 2 -- Email USer
-- ab hier nichts mehr ändern! ----------
local Debug = function ( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
local sek = mon*30*86400
local status =""
function energieverbrauch()
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
return (jsonListe[1].kWh)
end
local function vbr(IDs)
local kilowatts = 0
local sum = 0
status = 'Energieverbrauchs Report für die letzten ' .. mon .. ' Monate.\n'
Debug('lightblue', status)
for i=1,#IDs do
DeviceID = IDs[i]
StartEnergiemessung = (os.time()-sek)
EndEnergiemessung = os.time()
local DeviceName = fibaro:getName(IDs[i])
local DeviceRoom = fibaro:getRoomNameByDeviceID(IDs[i])
local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
local total = energieverbrauch()
local euro = string.format("%.2f", total * (ct / 100))
kilowatts = kilowatts + total
sum = sum + total * (ct / 100)
Debug("orange"," "..DeviceRoom.." - "..DeviceName.." - " .. total .." kWh in "..mon.. " Monat(en) - € ".. euro)
status = status .. DeviceRoom.." - "..DeviceName.." - " .. total .." kWh in "..mon.. " Monat(en) - € ".. euro ..'\n'
end
local sum = string.format("%.2f", sum)
status = status .. 'Verbrauch total----------------: '.. kilowatts .. ' kWh \n'
status = status .. 'Summe gesamt----------------: '.. sum .. ' €'
Debug("yellow",'Verbrauch total----------------: '.. kilowatts .. ' kWh')
Debug("yellow",'Summe gesamt----------------: '.. sum .. ' €')
end
vbr(vbrIDs)
fibaro:call(userId, "sendEmail","Fibaro-Info: Verbrauchsstatistik", status)