Hi pblacky,
alles klar, mein Fehler, vergiss meinen letzten Post. Ich habe mich da selbst überlistet. Die function sendMail, die an mehreren Usern aus dem Array userId Mails verschicken sollte hatte ich noch gar nicht eingebaut. Trotzdem verstehe ich nicht warum die letzte Version bei Dir nicht funktioniert. Wenn ich Deine 2 letzten Beispiele in Gedanken auflöse mit userId, subject und mailtext, erhalte ich das:
fibaro:call(2, “sendEmail”, “Info: Mailtest!”, 2)
fibaro:call(2, “sendEmail”, “Info: Mailtest!”,"ID: " 2)
Die Werte hinter dem letzten Komma, wären der Mailtext in unserem Fall wird der status als Mailtext verschickt. Egal ich habe die Function eingebaut so das userIDs zwingend in {} stehen muss.
Changelog für Version 0.1.3
– Function eingefügt um die E-Mail an mehreren IDs zu verschicken.
--[[
%% autostart
%% properties
%% events
--]]
--
-- Determine and calculate the power consumption in a given period of time.
-- Version : 0.1.3
-- Created by : pblacky, jeep
-- Release date : 15 Mar. 2018
--
-- Save your IDs before updating.!
--
local sourceTrigger = fibaro:getSourceTrigger();
local vbrIDs = {39,81,166,180,199,285,339,383,391} --IDs der Geräte zur Auswertung
local cent = 28.50 -- Strompreis
local userIDs = {2,303} -- 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"
-- Ermitteln des Tages im Monat
local mday = tonumber(os.date('%d'))
local tabmd = { [1] = "30", [7] = "7", [14] ="14", [15] = "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()
if (userIDs[1] ~= nil) then
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 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)
kilowatts = kilowatts + total
sum = sum + total * (cent / 100)
Debug("orange", DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro)
if i==1 then
status = status ..'\n'.. DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro ..'\n'
else
status = status .. DeviceRoom.." - "..DeviceName .. dots .. total .." kWh = € ".. euro ..'\n'
end
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 .. ' €\n')
if contains(maildays, mday) then
sendMail()
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
Screenshot im Anhang.