Energie und Kostenberechnung

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)

Deine Variable in Zeile 4 und 9 sind nicht gleich.

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 :wink:

In Zeile 25 und 8 brauchst du keine ID zwischen den Klammern.

Da ich kein Programmierer bin - versuche es mit Debugs bezüglich der Frage nach den Funktionen - ich würde sagen: egal…

  1. Die erste Anpassung hättest du nicht vornehmen müssen. Der Funktion ist es egal, wie der Übergabeparameter ursprünglich heißt.

  2. Dann sind natürlich die Funktionsaufrufe mit dem Übergabeparameter notwendig. Wenn du die Namen anpasst, dann nicht mehr.

  3. Der Funktion ist es egal wo sie definiert wird. Muss halt nur vor der Ausführung passieren, da das Skript von oben nach unten durchläuft.

Gruß

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)

In die DeviceID schreibst du den Value. Deshalb 0,1. Die ID wäre IDs[i].

Gruß

Hallo Boomx,
Kannst du mir eventuell bei dieser Zeile einen konkreteren Tipp geben?
Die Schleifen überfordern mich leider noch etwas :wink:

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!!!

Gruß

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 :wink:

Wenn es fertig ist, werde ich es hier posten…

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. :wink:

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 :wink:

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 :wink:
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?

2017-08-09-21_38_27-Home-Center-2.jpg

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 =…”

status=" "..DeviceRoom.." - "..DeviceName.." - " ..string.format("%.2f", energieverbrauch()).." kWh in "..mon.. " Monat(en) - € "..string.format("%.2f", energieverbrauch()*ct/100))
	Debug("cyan"," "..status.. " ")

Hi pblacky,

versuchs mal so:
in Zeile 8 ein
local status = ''
einfügen, und

 status = status.. "\n" .." "..DeviceRoom.." - "..DeviceName.." - " ..string.format("%.2f", energieverbrauch()).." kWh in "..mon.. " Monat(en) - € "..string.format("%.2f", energieverbrauch()*ct/100 )
Debug('cyan', status)

Bei Deinem Code war eine ‘)’ zuviel. :wink:

Danke @jeep für den Tipp, jetzt klappt das mit der Variable und dem Mailversand!

Als nächstes werde ich versuchen eine Timer Fuktionen einzubauen, damit das Skript 1 x im Monat ein Mail verschickt …

Guten Nachmittag, eine Frage, können Sie das Skript ausfüllen, um eine E-Mail mit den Verbräuchen zu senden?
Mit freundlichen Grüßen

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)