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. ?