Energie und Kostenberechnung

Hallo zusammen,

Vielen Dank für eure Mühe und sorry für die später Rückmeldung. Siio wollte bei mir sich nicht mehr aktualisieren und habe somit keine neuen Post gesehen, war sehr seltsam… werde eure Skripte am WE testen, sieht aber sehr viel versprechend aus!

Viele Grüße
Volker

Hallo @pblacky,
erstmal Danke fürs Testen und da Fibaro größere E-Mails einfach verschwinden lässt, waren ein paar Änderungen am Script fällig. Wie Du ja ermittelt hat ist bei ca. 30 devices Schluss. Hängt aber bestimmt auch von der Länge der Namen und Räume ab.
Und da wir Programmierer eigentlich faule Leute sind, und ich zu faul war alle meine Verbraucher mühsam zu ermitteln habe ich das Script auf automatische Ermittlung umgestellt. Für die, die so sind wie ich, die können sich mit den folgenden 2 Zeilen die devices für die manuelle Ermittlung ausgeben lassen.

local devices = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})
print(json.encode(devices))

Natürlich kann man danach bestimmen ob man die Verbraucher automatisch oder manuell auswählt.
Das PDF im Anhang wurde entsprechend aktualisiert.

Changelog für Version 0.1.9
– Automatisches ermitteln der Stromverbraucher
– Manuelle oder automatische Berechnung möglich
– Aufteilung der Verbraucher auf mehrere E-Mails
– Optimierung der sendMail Function
– Nummerierung der Geräte in der Ausgabe

--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- Version      : 0.1.9
-- Created by   : pblacky, jeep
-- Release date : 16 Mar. 2018
--
-- Save your IDs before updating.!
--
local sourceTrigger = fibaro:getSourceTrigger(); 
local manually  = false
local cent      = 28.50 -- Strompreis
local userIDs   = {2}  -- Email Users
local checktime = "21:10"
local maildays  = {1,7,13,14,16} --Achtung, das ist der Tag des Monats, [1-31]   
local subject   = "Fibaro-Info: Verbrauchsstatistik"
local devcount  = 0  -- Device counter
local devpmail  = 25 -- Number of devices per email

if manually then
   -- Manuelle Eingabe der Geräte-IDs zur Auswertung.   
   vbrIDs = {213,224,256,264,285,305,322,339,383,391} 
else  
   -- Automatische Ermittlung der Stromverbraucher.
   vbrIDs = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})  
end
-- Ermitteln des Tages im Monat 
local mday  = tonumber(os.date('%d'))
local tabmd = { [1] = "30", [7] = "7", [14] ="14", [16] = "15" } -- [1 - 31]
local days  = (tabmd[mday]) 

if days == nil then
   days = 1 
end  

local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) 
end

local function sendMail(mailNr,endmail)
  if (userIDs[1] ~= nil) then
    local subject= subject .. '-Nr: ' .. mailNr 
     if mailNr > 0 and endmail == nil then
        status = status .. 'Weitere Geräte in nächster Mail '
     end
    for m=1, #userIDs do
      if userIDs[m] ~= nil then
         fibaro:call(userIDs[m], "sendEmail", subject, status)
         Debug('lightgreen', 'Mail gesendet an User-Id: ' .. userIDs[m]) 
      end
    end
  end
end

local function contains(maildays, val)
   for i=1,#maildays do
      if maildays[i] == val then 
         return true
      end
   end
   return false
end

local function formatString(name, room)
   local slength = string.len(name) + string.len(room)
   local dlength = 35 - slength 
   local dots    = string.rep ("-", dlength)
   return dots
end 

local function calcperiod(ndays)
   sek = ndays * 86400
   status = 'Energieverbrauchs Report für die/den letzten ' .. ndays .. ' Tag(e).'
   status = status ..'\n'.. "Erstellt am " .. os.date('%c')
   StartEnergiemessung = (os.time()-sek)
   EndEnergiemessung = os.time()
end

local function energieverbrauch(DeviceID)
  local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
  return (jsonListe[1].kWh)
end

local function vbr(IDs)
  Debug('lightblue', status)
  local kilowatts = 0
  local mailNr = 0
  local sum = 0
  for i=1,#IDs do
    local DeviceID = IDs[i]
    local DeviceName  = fibaro:getName(IDs[i])
    local DeviceRoom  = fibaro:getRoomNameByDeviceID(IDs[i])
    local total = energieverbrauch(DeviceID)
    local euro  = string.format("%.2f", total * (cent / 100))
    local dots  = formatString(DeviceName, DeviceRoom)
    devcount = devcount + 1
    kilowatts   = kilowatts + total
    sum  = sum + total * (cent / 100) 
    Debug("orange", devcount.. ') '..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro)      
    if i==1 then
       status = status ..'\n'.. devcount .. ') '..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro ..'\n'
    else  
       status = status .. devcount .. ') '.. DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro ..'\n'
    end  
    if (i % devpmail == 0) then
       if contains(maildays, mday) then
          mailNr = mailNr+1
          sendMail(mailNr) 
          status = ' '
          fibaro:sleep(500)
       end
    end  
  end -- for
  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 .. ' €\n')
  
  if contains(maildays, mday) then
     mailNr = mailNr + 1
     sendMail(mailNr, true)
  end
end

calcperiod(days)
function main()
   local currentDate = os.date("*t");
   local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
   local startSource = fibaro:getSourceTrigger();
   if currenthour == checktime then
      calcperiod(days)
      vbr(vbrIDs)
   end
   setTimeout(main, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (startSource["type"] == "other")	then
      vbr(vbrIDs)
    end
end

Wir freuen uns auf Euer Feedback. ?

WHOW!!!
Das ist ja ein tolles Update, danke @jeep!
Habs gleich mal mit der “Automatik” eingebaut und es sieht auf den ersten Blick super aus!!
Werd mal etwas genauer testen und beobachten ob alle Devices da sind…

Danke Jeep, sieht wirklich super aus und scheint auch so zu funktionieren wie es soll…
Bin sehr begeistert! :slight_smile:
Werde es auch mal beobachten und mich dann wieder melden.

Viele Grüße
Volker

Hallo zusammen,

es gibt wieder mal ein Update. Neben diversen Codeoptimierungen habe ich vor allem die Ausgabe überarbeitet. Durch die Verwendung eines Monospace Fonts und ein wenig html, ist die Ausgabe besser lesbar geworden. Neben der Debugausgabe gibt es jetzt noch eine Html-Ausgabe. Beide Ausgaben können über die Variablen unterdrückt werden so dass man nur die Endsummen erhält. Das PDF wurde auch aktualisiert.

Changelog für Version 0.2.7
– Optimierung der Debugausgabe
– Verbesserungen des Codes

--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- Version      : 0.2.7
-- Created by   : pblacky, jeep
-- Release date : 21 Mar. 2018
--
-- Save your IDs before updating.!
--
local sourceTrigger = fibaro:getSourceTrigger(); 
local manually  = false
local cent      = 28.50 -- Strompreis
local userIDs   = {2}  -- 266 Email Users
local checktime = "21:10"
local maildays  = {1,7,13,14,15,} --Achtung, das ist der Tag des Monats, [1-31]   
local subject   = "Fibaro-Info: Verbrauchsstatistik"
local devcount  = 0  -- Device counter
local devpmail  = 25 -- Number of devices per email
local colhtml   = "yellowgreen" 
local debugout  = true -- false
local debughtml = true -- false

if manually then
   -- Manuelle Eingabe der Geräte-IDs zur Auswertung.   
   vbrIDs = {213,224,256,264,285,305,322,339,383,391} 
else  
   -- Automatische Ermittlung der Stromverbraucher.
   vbrIDs = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})  
end
-- Ermitteln des Tages im Monat 
local mday  = tonumber(os.date('%d'))
local tabmd = { [1] = "30", [7] = "7", [14] ="14", [21] = "365" } -- [1 - 31]
local days  = (tabmd[mday]) 

if days == nil then
   days = 1 
end  
--"font-size:300%;
local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="font-family:Courier new;font-size: 12px;color:%s;">%s', "span", color, message, "span")) 
end

local function sendMail(mailNr,endmail)
  if (userIDs[1] ~= nil) then
    local subject= subject .. '-Nr: ' .. mailNr 
     if mailNr > 0 and endmail == nil then
        status = status .. 'Weitere Geräte in nächster Mail '
     end
    for m=1, #userIDs do
      if userIDs[m] ~= nil then
         fibaro:call(userIDs[m], "sendEmail", subject, status)
         Debug('lightgreen', 'Mail gesendet an User-Id: ' .. userIDs[m]) 
      end
    end
  end
end

local function contains(maildays, val)
   for i=1,#maildays do
      if maildays[i] == val then 
         return true
      end
   end
   return false
end

local function formatString(name, room)
   local slength = string.len(name) + string.len(room)
   local dlength = 35 - slength 
   local dots    = string.rep ("-", dlength)
   return dots
end 

local function calcperiod(ndays)
   sek = ndays * 86400
   status = 'Energieverbrauchs Report für die/den letzten ' .. ndays .. ' Tag(e).'
   htmlStat = "<pre><h3>"..status.."</h3></pre>"  
   StartEnergiemessung = (os.time()-sek)
   EndEnergiemessung = os.time()
end

local function energieverbrauch(DeviceID)
  local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
  return (jsonListe[1].kWh)
end

local function vbr(IDs)
  Debug('lightblue',status)
  Debug('lightblue', "Erstellt am "..os.date('%c')) 
  local kilowatts = 0
  local mailNr = 0
  local sum = 0
  for i=1,#IDs do
    local DeviceID = IDs[i]
    local DeviceName  = fibaro:getName(IDs[i])
    local DeviceRoom  = fibaro:getRoomNameByDeviceID(IDs[i])
    local total = energieverbrauch(DeviceID)
    local euro  = string.format("%.2f", total * (cent / 100))
    local dots  = formatString(DeviceName, DeviceRoom)
    devcount = devcount + 1
    kilowatts   = kilowatts + total
    sum  = sum + total * (cent / 100) 
    local output = devcount.. ') '..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro      
    local htmlout = "<pre><h4>".. output .. "</h4></pre>"
    if i==1 then
       status = '\n'..status .. '\n'..output ..'\n'
       htmlStat = htmlStat .. htmlout
    else  
       status = status .. output ..'\n'
       htmlStat = htmlStat .. htmlout
    end
    if debugout then Debug('orange', output) end
    if (i % devpmail == 0) then
       if contains(maildays, mday) then
          mailNr = mailNr+1
          sendMail(mailNr) 
          status = ' '
          fibaro:sleep(500)
       end
    end  
  end -- for
  local sum = string.format("%.2f", sum)
  local verbrauch= 'Verbrauch total----------------: '.. kilowatts .. ' kWh'
  local summe    = 'Summe gesamt-------------------: '.. sum .. ' €'
 
  status = status .. verbrauch ..'\n'.. summe
  status = status .. "\n" .. "Erstellt am "..os.date('%c')
  htmlStat = htmlStat .. "<pre><h3>".. verbrauch.."</h3></pre>" .."<pre><h3>".. summe .. "</pre>"

  Debug("yellow",'Verbrauch total-------------: '.. kilowatts .. ' kWh')
  Debug("yellow",'Summe gesamt----------------: '.. sum .. ' €')
  if debughtml then Debug(colhtml, htmlStat) end
  if contains(maildays, mday) then
     mailNr = mailNr + 1
     sendMail(mailNr, true)
  end
end

calcperiod(days)
function main()
   local currentDate = os.date("*t");
   local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
   local startSource = fibaro:getSourceTrigger();
   if currenthour == checktime then
      calcperiod(days)
      vbr(vbrIDs)
   end
   setTimeout(main, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (startSource["type"] == "other")	then
      vbr(vbrIDs)
    end
end

Vielen Dank an Pblacky / Jeep,
echt klasse das Script. Echt Wahnsinn was ihr immer wieder so auf die Beine stellt.
Echt Top.

Gruß
Carsten

Danke CarstenN,
Es ist schön zu sehen, dass auch Andere Freude daran haben :wink:

Das sehe ich auch so pblacky. Aber ohne Deine Idee wäre das script nicht dass was es heute ist. Ich habe noch ein wenig optimiert und in der Ausgabe die DeviceID mitgenommen. Vielleicht ist es für den einen oder anderen wichtig dass zu wissen.
Außerdem habe ich eine neue Variable “defDays” eingeführt. Hier kann man als Defaultwert die Anzahl der Tage eintragen, wenn das Script keine Übereinstimmung in der lookup Tabelle findet.
Schade das die Umlaute die Zeile immer um 1 Zeichen kürzen.

Changelog für Version 0.2.8
– Kleine Code änderungen der Ausgabe
– Einführung der Variablen defDays.

--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- Version      : 0.2.8
-- Created by   : pblacky, jeep
-- Release date : 27 Mar. 2018
--
-- Save your IDs before updating.!
--
local sourceTrigger = fibaro:getSourceTrigger(); 
local manually  = false
local cent      = 28.50 -- Strompreis
local userIDs   = {2}  -- 266 Email Users
local checktime = "21:10"
local maildays  = {1,7,13,14,15,} --Achtung, das ist der Tag des Monats, [1-31]   
local subject   = "Fibaro-Info: Verbrauchsstatistik"
local devcount  = 0  -- Device counter
local devpmail  = 25 -- Number of devices per email
local colhtml   = "skyblue" --yellowgreen" 
local debugout  = true -- false
local debughtml = true -- false
local defDays   = 30 -- Wenn keine Übereinstimmung in "tabmd", wird dieser Wert genommen

if manually then
   -- Manuelle Eingabe der Geräte-IDs zur Auswertung.   
   vbrIDs = {213,224,256,264,285,305,322,339,383,391} 
else  
   -- Automatische Ermittlung der Stromverbraucher.
   vbrIDs = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})  
end
-- Ermitteln des Tages im Monat 
local mday  = tonumber(os.date('%d'))
local tabmd = { [1] = "30", [7] = "7", [14] ="14", [24] = "365" } -- [1 - 31]
local days  = (tabmd[mday]) 

if days == nil then
   days = defDays 
end  

local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="font-family:Courier new;font-size: 12px;color:%s;">%s', "span", color, message, "span")) 
end

local function sendMail(mailNr,endmail)
  if (userIDs[1] ~= nil) then
    local subject= subject .. '-Nr: ' .. mailNr 
     if mailNr > 0 and endmail == nil then
        status = status .. 'Weitere Geräte in nächster Mail '
     end
    for m=1, #userIDs do
      if userIDs[m] ~= nil then
         fibaro:call(userIDs[m], "sendEmail", subject, status)
         Debug('lightgreen', 'Mail gesendet an User-Id: ' .. userIDs[m]) 
      end
    end
  end
end

local function contains(maildays, val)
   for i=1,#maildays do
      if maildays[i] == val then 
         return true
      end
   end
   return false
end

local function formatString(name, room)
   local slength = string.len(name) + string.len(room)
   local dlength = 35 - slength 
   local dots    = string.rep ("-", dlength)
   return dots
end 

local function calcperiod(ndays)
   sek = ndays * 86400
   status = 'Energieverbrauchs Report für die/den letzten ' .. ndays .. ' Tag(e).'
   htmlStat = "<pre><h3>"..status.."</h3></pre>"  
   StartEnergiemessung = (os.time()-sek)
   EndEnergiemessung = os.time()
end

local function energieverbrauch(DeviceID)
  local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
  return (jsonListe[1].kWh)
end

local function vbr(IDs)
  Debug('lightblue',status)
  Debug('lightblue', "Erstellt am "..os.date('%c')) 
  local kilowatts = 0
  local mailNr = 0
  local sum = 0
  for i=1,#IDs do
    local DeviceID = IDs[i]
    local DeviceName  = fibaro:getName(IDs[i])
    local DeviceRoom  = fibaro:getRoomNameByDeviceID(IDs[i])
    local total = string.format("%.2f",energieverbrauch(DeviceID))
    local euro  = string.format("%.2f", total * (cent / 100))
    local dots  = formatString(DeviceName, DeviceRoom)
    devcount    = string.format('%03d',devcount + 1)
    kilowatts   = kilowatts + total
    sum  = sum + total * (cent / 100) 
    local output  = devcount.. ') '.. DeviceID ..' ' ..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro      
    local htmlout = "<pre><h4>".. output .. "</h4></pre>"
    if i==1 then
       status = '\n'..status .. '\n'..output ..'\n'
       htmlStat = htmlStat .. htmlout
    else  
       status = status .. output ..'\n'
       htmlStat = htmlStat .. htmlout
    end
    if debugout then Debug('orange', output) end
    if (i % devpmail == 0) then
       if contains(maildays, mday) then
          mailNr = mailNr+1
          sendMail(mailNr) 
          status = ' '
          fibaro:sleep(500)
       end
    end  
  end -- for
  local sum = string.format("%.2f", sum)
  local verbrauch= 'Verbrauch total----------------: '.. kilowatts .. ' kWh'
  local summe    = 'Summe gesamt-------------------: '.. sum .. ' €'
 
  status = status .. verbrauch ..'\n'.. summe
  status = status .. "\n" .. "Erstellt am "..os.date('%c')
  htmlStat = htmlStat .. "<pre><h3>".. verbrauch.."</h3></pre>" .."<pre><h3>".. summe .. "</pre>"

  Debug("yellow",'Verbrauch total-------------: '.. kilowatts .. ' kWh')
  Debug("yellow",'Summe gesamt----------------: '.. sum .. ' €')
  if debughtml then Debug(colhtml, htmlStat) end
  if contains(maildays, mday) then
     mailNr = mailNr + 1
     sendMail(mailNr, true)
  end
end

calcperiod(days)
function main()
   local currentDate = os.date("*t");
   local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
   local startSource = fibaro:getSourceTrigger();
   if currenthour == checktime then
      calcperiod(days)
      vbr(vbrIDs)
   end
   setTimeout(main, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (startSource["type"] == "other")	then
      vbr(vbrIDs)
    end
end

Hallo zusammen,

im Laufe der Zeit habe ich festgestellt das ich doch viele Geräte habe deren Verbrauch, weil minimal, ich eigentlich ignorieren
könnte. Somit habe ich eine neue Variable und Function hinzugefügt, in der man solche Geräte vom Report ausnehmen kann.
Das PDF wurde für die neue Version angepasst.

Changelog für Version 0.2.9
– Variable excludeDev und Function excluded() hinzugefügt.

--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- Version      : 0.2.9
-- Created by   : pblacky, jeep
-- Release date : 08 April 2018
--
-- Save your IDs before updating.!
--
local sourceTrigger = fibaro:getSourceTrigger(); 
local manually  = false
local cent      = 28.50 -- Strompreis
local userIDs   = {2}  -- 266 Email Users
local checktime = "21:10"
local maildays  = {1,7,13,14,15,} --Achtung, das ist der Tag des Monats, [1-31]  
local excludeDev= {71,242,248}    -- Diese devices werden nicht beruecksichtigt 
local subject   = "Fibaro-Info: Verbrauchsstatistik"
local devcount  = 0  -- Device counter
local devpmail  = 25 -- Number of devices per email
local colhtml   = "skyblue" --yellowgreen" 
local debugout  = true -- false
local debughtml = true -- false
local defDays   = 30 -- Wenn keine Übereinstimmung in "tabmd" wird dieser Wert genommen

if manually then
   -- Manuelle Eingabe der Geräte-IDs zur Auswertung.   
   vbrIDs = {213,224,256,264,285,305,322,339,383,391} 
else  
   -- Automatische Ermittlung der Stromverbraucher.
   vbrIDs = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})  
end
-- Ermitteln des Tages im Monat 
local mday  = tonumber(os.date('%d'))
local tabmd = { [1] = "30", [7] = "7", [14] ="14", [8] = "365" } -- [1 - 31]
local days  = (tabmd[mday]) 

if days == nil then
   days = defDays 
end  

local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="font-family:Courier new;font-size: 12px;color:%s;">%s', "span", color, message, "span")) 
end

local function sendMail(mailNr,endmail)
  if (userIDs[1] ~= nil) then
    local subject= subject .. '-Nr: ' .. mailNr 
     if mailNr > 0 and endmail == nil then
        status = status .. 'Weitere Geräte in nächster Mail '
     end
    for m=1, #userIDs do
      if userIDs[m] ~= nil then
         fibaro:call(userIDs[m], "sendEmail", subject, status)
         Debug('lightgreen', 'Mail gesendet an User-Id: ' .. userIDs[m]) 
      end
    end
  end
end

local function contains(maildays, val)
   for i=1,#maildays do
      if maildays[i] == val then 
         return true
      end
   end
   return false
end

local function formatString(name, room)
   local slength = string.len(name) + string.len(room)
   local dlength = 35 - slength 
   local dots    = string.rep ("-", dlength)
   return dots
end 

local function calcperiod(ndays)
   sek = ndays * 86400
   status = 'Energieverbrauchs Report für die/den letzten ' .. ndays .. ' Tag(e).'
   htmlStat = "<pre><h3>"..status.."</h3></pre>"  
   StartEnergiemessung = (os.time()-sek)
   EndEnergiemessung = os.time()
end

local function energieverbrauch(DeviceID)
  local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
  return (jsonListe[1].kWh)
end

local function excluded(id)
   for i=1,#excludeDev do
      if excludeDev[i] == id then 
         return true
      end
   end
   return false
end

local function vbr(IDs)
  Debug('lightblue',status)
  Debug('lightblue', "Erstellt am "..os.date('%c')) 
  local kilowatts = 0
  local mailNr = 0
  local sum = 0
  for i=1,#IDs do
    local DeviceID = IDs[i] 
    if not excluded(DeviceID) then
       local DeviceName  = fibaro:getName(IDs[i])
       local DeviceRoom  = fibaro:getRoomNameByDeviceID(IDs[i])
       local total = string.format("%.2f",energieverbrauch(DeviceID))
       local euro  = string.format("%.2f", total * (cent / 100))
       local dots  = formatString(DeviceName, DeviceRoom)
       devcount    = string.format('%03d',devcount + 1)    kilowatts   = kilowatts + total
       sum  = sum + total * (cent / 100) 
       local output  = devcount.. ') '.. DeviceID ..' ' ..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro      
       local htmlout = "<pre><h4>".. output .. "</h4></pre>"
       if i==1 then
          status = '\n'..status .. '\n'..output ..'\n'
          htmlStat = htmlStat .. htmlout
       else  
          status = status .. output ..'\n'
          htmlStat = htmlStat .. htmlout
       end
       if debugout then Debug('orange', output) end
       if (i % devpmail == 0) then
          if contains(maildays, mday) then
             mailNr = mailNr+1
             sendMail(mailNr) 
             status = ' '
             fibaro:sleep(500)
          end
       end  
	end --if
  end -- for
  local sum = string.format("%.2f", sum)
  local verbrauch= 'Verbrauch total----------------: '.. kilowatts .. ' kWh'
  local summe    = 'Summe gesamt-------------------: '.. sum .. ' €'
 
  status = status .. verbrauch ..'\n'.. summe
  status = status .. "\n" .. "Erstellt am "..os.date('%c')
  htmlStat = htmlStat .. "<pre><h3>".. verbrauch.."</h3></pre>" .."<pre><h3>".. summe .. "</pre>"

  Debug("yellow",'Verbrauch total-------------: '.. kilowatts .. ' kWh')
  Debug("yellow",'Summe gesamt----------------: '.. sum .. ' €')
  if debughtml then Debug(colhtml, htmlStat) end
  if contains(maildays, mday) then
     mailNr = mailNr + 1
     sendMail(mailNr, true)
  end
end

calcperiod(days)
function main()
   local currentDate = os.date("*t");
   local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
   local startSource = fibaro:getSourceTrigger();
   if currenthour == checktime then
      calcperiod(days)
      vbr(vbrIDs)
   end
   setTimeout(main, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (startSource["type"] == "other")	then
      vbr(vbrIDs)
    end
end

EDIT: Noch ein Screenshot hinzugefügt.

Energierverbrauch.jpg

Ich habe mal eine Frage bezgl. der Benachrichtigung per Mail - wie kann ich das einstellen, das die Mail nicht täglich kommt, sondern nur einmal im Monat ?
Nach der Installation kam erst keine und nun habe ich jeden Tag eine bekommen ?

Für eine Monatsauswertung sollten die beiden unteren Zeilen in der Form genügen. So erhälst Du an jedem 1.ten den Verbrauch der
letzten 30 Tage gemailt. Steht auch so im PDF. :wink:

local maildays = {1,}
local tabmd = { [1] = “30”,}

Kommt die Mail pro Gerät oder pro Nutzer ? Ich habe 3 Endgeräte angemeldet die mit dem HC2 gekoppelt sind, vielleicht ist die Mail deshalb 3 x gekommen - Danke für die Info

Die Mail geht an alle die in local userIDs = {2} – 266 Email Users eingetragen sind.
Die Mails sind 3 x gekommen weil in der Variablen local maildays = {1,7,13,14,15,} --Achtung, das ist der Tag des Monats, [1-31] 3 Tage hintereinander (13,14,15) eingetragen sind.
Zur besseren Verständnis lese das angehängte PDF.

Danke für die Erklärung, PDF nun herunter geladen und reingezogen ? stimmt, hätte ich es gleich gemacht, wären dumme Fragen erspart geblieben ? vielen Dank für die tolle Arbeit ?

Hi Leute,
Ich hab gerade eine Spannende Situation.
Mein Verbrauchsskript in der aktuellen Version 0.2.9 läuft seit dem Update auf die Fibaro Softwareversion 4.180 täglich, obwohl es nur am 1. des Monats laufen soll.

Hat das außer mir noch wer?

Hi pblacky,
ich denke nicht das die 4.180 das Problem ist. Eher habe ich hier einen Bug eingebaut. Werde es mir heute Abend anschauen.

Hatte nur EIN Event in der Variable
local tabmd = { [1] = "30"} – [1 - 31]

Habe jetzt mal die Formel aus dem Original Skript genommen und etwas verkleinert, mal sehen, vielleicht war das die Ursache …

Ich stelle mal ein Update zur Verfügung. Vermute das unter gewissen Umständen die Ausgabe nicht der Tabelle entsprach. @pblacky, nur das wir nicht aneinander vorbei sprechen, der Output im Debug-Fenster soll täglich um “checktime” kommen, aber die Email nur an den Tagen in der “tabmd”. Oder hattest Du was anderes gemeint?

Changelog für Version 0.3.1
– Möglicher Bug beim berechnen der Mailausgabe

--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- File name	: Energyreport.lua 
-- Version      : 0.3.1
-- Created by   : pblacky, jeep
-- Release date : 14 May 2018
--
-- If you use manuel mode, save your IDs before updating !
--
local sourceTrigger = fibaro:getSourceTrigger(); 
local version   = "0.3.1"
local manually  = false
local cent      = 28.50 -- Strompreis per KWh
local userIDs   = {2}   -- 266 Email Users
local checktime = "21:10" -- Daily trigger time
local maildays  = {1,7,13,14,15,}  --Achtung, das ist der Tag des Monats, [1-31]  
local excludeDev= {71,242,157,248} -- Diese devices werden nicht beruecksichtigt 
local subject   = "Fibaro-Info: Verbrauchsstatistik"
local devcount  = 0  -- Device counter
local devpmail  = 25 -- Number of devices per email
local colhtml   = "skyblue" --yellowgreen" 
local debugout  = false -- false|true
local debughtml = true  -- false|true
local defDays   = 30 -- Wenn keine Übereinstimmung in "tabmd" wird dieser Wert genommen
--local ndays
if manually then
   -- Manuelle Eingabe der Geräte-IDs zur Auswertung.   
   pwrIDs = {213,224,256,264,285,305,322,339,383,391} 
else  
   -- Automatische Ermittlung der Stromverbraucher.
   pwrIDs = fibaro:getDevicesId({interfaces = {"power"}, visible = true, enabled = true})  
end

local function DofM()
  -- Ermitteln des Tages im Monat 
  local mday  = tonumber(os.date('%d'))
  local tabmd = { [1] = "30", [7] = "7", [14] ="14", [15] = "365" } -- [1 - 31]
  local days  = (tabmd[mday]) 
  if days == nil then
     days = defDays 
  end
  return days
end

local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="font-family:Courier new;font-size: 12px;color:%s;">%s', "span", color, message, "span")) 
end

local function sendMail(mailNr,endmail)
  if (userIDs[1] ~= nil) then
    local subject= subject .. '-Nr: ' .. mailNr 
     if mailNr > 0 and endmail == nil then
        status = status .. 'Weitere Geräte in nächster Mail '
     end
    for m=1, #userIDs do
      if userIDs[m] ~= nil then
         fibaro:call(userIDs[m], "sendEmail", subject, status)
         Debug('lightgreen', 'Mail gesendet an User-Id: ' .. userIDs[m]) 
      end
    end
  end
end

local function contains(maildays, val)
   for i=1,#maildays do
      if maildays[i] == val then 
         return true
      end
   end
   return false
end

local function formatString(name, room)
   local slength = string.len(name) + string.len(room)
   local dlength = 35 - slength 
   local dots    = string.rep ("-", dlength)
   return dots
end 

local function calcperiod(ndays)
   sek = ndays * 86400
   status = 'Energieverbrauchs Report für die/den letzten ' .. ndays .. ' Tag(e).'
   htmlStat = "<pre><h3>"..status.."</h3></pre>"  
   StartEnergiemessung = (os.time()-sek)
   EndEnergiemessung = os.time()
end

local function energieverbrauch(DeviceID)
  local jsonListe = api.get("/energy/"..StartEnergiemessung.."/"..EndEnergiemessung.."/compare/devices/power/"..DeviceID)
  return (jsonListe[1].kWh)
end

local function excluded(id)
   for i=1,#excludeDev do
      if excludeDev[i] == id then 
         return true
      end
   end
   return false
end

local function pwr(IDs)
  Debug('lightblue',status)
  Debug('lightblue', "Erstellt am "..os.date('%c')) 
  local kilowatts = 0
  local mailNr = 0
  local sum = 0
  for i=1,#IDs do
    local DeviceID = IDs[i] 
    if not excluded(DeviceID) then
       local DeviceName  = fibaro:getName(IDs[i])
       local DeviceRoom  = fibaro:getRoomNameByDeviceID(IDs[i])
       local total = string.format("%.2f",energieverbrauch(DeviceID))
       local euro  = string.format("%.2f", total * (cent / 100))
       local dots  = formatString(DeviceName, DeviceRoom)
       devcount    = string.format('%03d',devcount + 1)    kilowatts   = kilowatts + total
       sum  = sum + total * (cent / 100) 
       local output  = devcount.. ') '.. DeviceID ..' ' ..DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro      
       local htmlout = "<pre><h4>".. output .. "</h4></pre>"
       if i==1 then
          status = '\n'..status .. '\n'..output ..'\n'
          htmlStat = htmlStat .. htmlout
       else  
          status = status .. output ..'\n'
          htmlStat = htmlStat .. htmlout
       end
       if debugout then Debug('orange', output) end
       if (i % devpmail == 0) then
          if contains(maildays, mday) then
             mailNr = mailNr+1
             sendMail(mailNr) 
             status = ' '
             fibaro:sleep(500)
          end
       end  
	end --if
  end -- for
  local sum = string.format("%.2f", sum)
  local verbrauch= 'Verbrauch total----------------: '.. kilowatts .. ' kWh'
  local summe    = 'Summe gesamt-------------------: '.. sum .. ' €'
 
  status = status .. verbrauch ..'\n'.. summe
  status = status .. "\n" .. "Erstellt am "..os.date('%c')
  htmlStat = htmlStat .. "<pre><h3>".. verbrauch.."</h3></pre>" .."<pre><h3>".. summe .. "</pre>"

  Debug("yellow",'Verbrauch total-------------: '.. kilowatts .. ' kWh')
  Debug("yellow",'Summe gesamt----------------: '.. sum .. ' €')
  if debughtml then Debug(colhtml, htmlStat) end
  if contains(maildays, mday) then
     mailNr = mailNr + 1
     sendMail(mailNr, true)
  end
end
days = DofM()
calcperiod(days)
function main()
   local currentDate = os.date("*t");
   local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
   local startSource = fibaro:getSourceTrigger();
   if currenthour == checktime then
      days = DofM()
      calcperiod(days)
      pwr(pwrIDs)
   end
   setTimeout(main, 60*1000)
end

if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    if (startSource["type"] == "other")	then
      days =DofM()
      pwr(pwrIDs)
    end
end

Ich hab das so verstanden:
Wenn ich

local maildays  = {1}
 local tabmd = { [1] = "30"}

eingestellt hab, dann muss ich am 1. des Monats eine Verbauchsliste über die letzten 30 Tage bekommen.
Sonst passiert außer dem täglichen Debug nichts weiter, stimmt das??

Das ist korrekt. :wink: