Stromausfall

Wenn dich nur interessiert wie lange ein Stromausfall dauert kannst du auch eine Szene schreiben welche z.B. jede Minute z.B. den Status von zwei Stromverbrauchern prüft. (Musst mal probieren ob das verlässlich ist z.b. Device = Death
Wenn beide Geräte nicht funktionieren Zei in Variable schreiben.
Wenn wieder ein Gerät funktioniert Meldung mit Uhrzeit und Dauer auswerfen.
Die geht nur wenn HC2 an USV hängt.

Danke Mdietinger für diese Idee!
Aber wenn meine HC2 an der USV hängt, dann klappt das eh auch mit der Steckdose die Hansdamp beschrieben hat.
Mein Gedanke war eine Funktion die ohne USV auskommt, aber das ist technisch nicht wirklich realisierbar.
Ich muss einfach nur dafür sorgen dass die HC2 an die USV kommt, dann hab ich viele Optionen :wink:

Wenn deine HC2 nicht an USV ĺiegt kannst ein Script dauerhaft Laufen lassen dass Zeit jede Minute in globale Variable schreibt.
Sobald HC2 started wird das Script feststellen dass mehr als x Minuten vergangen sind und Nachricht mit Uhrzeit und Dauer

DAS klingt allerdings interessant, darüber werd ich mal genauer nachdenken…

Vereinfacht könnte die Szene so aussehen.
Autostart der Szene bei HC2 Start (1 x manueller Start)
1 Instanz
Alarm Stoppt die Szene nicht
Variable TimeStamp anlegen
Bei jedem Start wird TimeStamp geladen und mit aktueller Zeit verglichen.
Danach 1sec. Loop zum TimeStamp schreiben.

--[[
%% properties
%% events
%% globals
--]]

 OldTime = fibaro:getGlobalValue("TimeStamp")
 fibaro:debug("Fibaro HC2 für " ..(os.time()- OldTime) .."Sekunden außer Betrieb")
  --fibaro:call(xxx,  "sendPush", "Fibaro HC2 für " ..(os.time()- OldTime) .."Sekunden außer Betrieb")

while true do
  fibaro:setGlobal("TimeStamp", os.time())

  fibaro:sleep(1000)

end

Hallo mdietinger,
Danke für dieses Skriptbeispiel!!
Ich hatte schon wesentlich komplexere Ideen im Kopf :wink:
Werde es gleich mal aktivieren!

Kleiner Fehler :slight_smile:
solltest fibaro:sleep(1000) auf fibaro:sleep(60000) setzen.
Jede Sekunde einen Wert speichern ist wohl ein bisschen zuviel des Guten.

Hatte eh schon geplant, dein Skript so umzuschreiben, dass es nicht Sekunden sondern Minuten anzeigt.
Muss nur noch rausfinden, wie ich die Sekunden in Minuten umrechne!
Oder hats du da auch einen Tipp …

(os.time()- OldTime)/60 sollte den Job machen. (Habe nicht probiert)

TimeStamp = (os.time()- OldTime)/60
funktioniert, habs ausprobiert!

Nur wird der Wert dann mit vielen Kommastellen ausgegeben
-> : 0.71666666666667
Weißt du wie man das auf sagen wir 2 Kommastellen einschränken kann?

Hab schon das versucht:
TimeStamp = tonumber((os.time()- OldTime)/60)
Wird aber dort mit genauso vielen Kommastellen angezeigt…

Auf der Lua Seite von Fibaro gibts dazu leider auch keine genaue erklärung…

Habe ich in einem Script von crissxcross gefunden:

-- Interne Funktion zum Runden auf Ganzzahlen
function round(x)
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

Danke für den Tipp.
Hab das jetzt mal alles in ein Skript verpackt, das für mich funktioniert:
Kleine Änderung: verschickt ein Email statt einer Push Nachricht.

--[[
%% properties
%% events
%% globals
--]]

-- Interne Funktion zum Runden auf Ganzzahlen
function round(x)
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

OldTime = fibaro:getGlobalValue("OnTime")
OffTime = round ((os.time()- OldTime)/60)
 
fibaro:debug("Fibaro HC2 für " ..(OffTime) .." Min außer Betrieb")
local subject = "HC2 Offline für " ..OffTime.. " Minuten"
fibaro:call(2,"sendEmail","HC2 Überwachung",subject)

while true do
  fibaro:setGlobal("OnTime", os.time())
  fibaro:sleep(60000)
end

Fragen nur für meine Perfektion :wink:

.) Könnte man die beiden Variablen “OldTime” und “OffTime” eventuell zusammenlegen indem man die Variable “OffTime” entsprechend befüllt?
.) derzeit wird auf die volle Minute gerundet, lässt sich das RUndungsskript auf 1-2 Kommastellen abändern?

müsste so gehen:
OffTime = round ((os.time()- fibaro:getGlobalValue("OnTime"))/60)

Zwei Komastellen solltest du so erhalten:

OffTime = round ((os.time()- fibaro:getGlobalValue("OnTime"))/60*100)/100

Eine Komastelle so:
OffTime = round ((os.time()- fibaro:getGlobalValue("OnTime"))/60*10)/10

Klappt hervorragend!
Ich darf durch dich immer sehr viel lernen, danke vielmals dafür!!

Hier nochmal das fertige Skript zur Verwendung. Es muss nur die UserID fürs Mail angepasst werden.
Werde es jetzt mal einige Zeit laufen lassen und mich hier melden, falls es was zu berichten gibt…

--[[
%% properties
%% events
%% globals
--]]

local userId = 2 -- Userid für Mailversand

-- Interne Funktion zum Runden auf Ganzzahlen
function round(x)
return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

OffTime = round ((os.time()- fibaro:getGlobalValue("OnTime"))/60)

fibaro:debug("HC2 Offline für " ..(OffTime) .." Min.")
local subject = "Fibaro HC2 war für " ..OffTime.. " Minuten außer Betrieb"
fibaro:call(userId,"sendEmail","Fibaro HC2 Überwachung",subject)

while true do
  fibaro:setGlobal("OnTime", os.time())
  fibaro:sleep(60000)
end

Habe heute mal einen Test gemacht und was komisches rausgefunden:

1.) Skript (siehe oben) aktiviert dass mit der HC2 gestartet wird
Nach dem Speichern war diese Option übrigens plötzlich verschwunden!
2.) Skript gestartet
3.) HC2 vom Strom getrennt, so wie es bei einem Stromausfall auch passiert.

Nach dem Wiedereinschalten ist das Skript leider nicht von selbst angelaufen und hat daher natürlich auch kein Mail verschickt :frowning:

Frage: Muss ich die STartroutine auf “manuell” oder “automatisch” stellen?
Derzeit steht sie auf “manuell” “1Instanz” und ich hatte sie für einen automatischen Start mit der HC2 konfiguriert, ist aber jetzt nicht mewhr zu sehen…

Gehört auf automatisch.
Musst sie nur einmalig nach speichern starten.
Dann sollte sie nach jedem Neustart von HC2 automatisch starten.

Ok, dann habe deine Beschreibung am Anfang missverstanden, danke!!