Guten Morgen,
da meine Suche nach schlauen LUA Szenen zur Steuerung meiner Multimedia Geräte im Wohnzimmer nur auf mäßigen Erfolg gestoßen ist, habe ich mich selbst ans Werk gemacht und etwas dafür entwickelt.
Das Skript ist natürlich nicht 1:1 auf die Gegebenheiten anderer SmartHomes zu übertragen, dennoch möchte ich es Euch nicht vorenthalten. Vielleicht hat ja der ein oder andere noch Verbesserungsvorschläge oder kann es als Inspiration für eigene Szenen nutzen.
Die Ausgangslage:
Ich bin Multimedia verrückt und habe in meinem Wohnzimmer einen ganzen Haufen von Verbrauchern die mir viel Spaß bereiten wenn ich sie nutze. Als da wären, Onkyo A/V Receiver nebst hochwertigem 5.1 System, ein VU+ TV Receiver, Sonos Connect, PS4 plus Ladestation für Controller, Kodi auf einem SFF Desktop PC, Raspberry als DNSMASQ Server, Netzwerkswitch, QNAP NAS, Hue Lampen nebst Bridge und noch 2 oder 3 kleinere Verbraucher.
Die Motivation:
Kurz gesagt: 150 Watt Verbrauch im Standby! Bei 20 Stunden Standby am Tag sind das rund 1.000 KWh im Jahr. Bei meinem Tarif also etwa 300 € Stromkosten im Jahr dafür, dass die Geräte auf ihre Nutzung warten.
Das Vorhaben:
Die Standbyzeiten auf ein Minimum reduzieren. Im ersten Schritt einmal auf Standby verzichten, wenn ich gar nicht zu Hause bin oder schlafe.
Die Herausforderung:
Meine erste Überlegung war die Platzierung eines Fibaro Wallplugs um erst alle Geräte per LUA herunterzufahren und dann den Strom komplett abzuschalten. Diese Idee habe ich dann schnell zu den Akten gelegt, da auch Komponenten dabei sind, die ich nicht abschalten möchte (DNSMASQ Server und Netzwerkswitch) und die Investition in 4-6 Wallplugs mir dann doch etwas übertrieben vorkam. Ich brauchte also eine Möglichkeit die Geräte entsprechend gruppieren und selektiv ein und ausschalten zu können ohne x mal 50 € zu investieren. Durch Zufall lief mir die Greenpower PowerNode 6 - eine über Z-Wave gesteuerte Steckdosenleiste - über den Weg und ich habe gleich zugeschlagen, die rund 100€ schienen mir für eine Steckerleiste als zu hoch, aber deutlich günstiger als 5 oder 6 Wallplugs. Noch dazu kann die PowerNode 6 genau wie der Wallplug schalten und messen. Das Gerät ist für mein Vorhaben die perfekte Lösung. Also habe ich die Geräte nach dem Prinzip “Welches Gerät brauche ich für welche Aktion?” gruppiert und waren bereit für den smarten Einsatz in meiner Szene.
Die Szenen Idee:
Wie bereits erwähnt wollte ich erstmal alles so steuern, dass zu den Zeiten in denen ich die Geräte definitiv nicht brauche kein Strom verbraucht wird. Also alles aus, wenn ich nicht da bin oder schlafe. Für beide Szenarien gab es bereits globale Variablen, nämlich “SleepState” und “PresentState” aus der intelligenten Lichtsteuerung. Mit diesen konnte ich die Szene triggern. Die Variable “PresentState” hatte ich schon mit dem einschalten des Alarms entsprechend verwendet, “SleepState” war bisher nur in meinem HC2 anwesend und stand immer auf “Awake”.
Die Idee war nun, dass ich beim Wechsel einer der beiden Variablen (Anmerkung: ein gleichzeitiger Wechsel, also das doppelte starten der Szene ist bei mir praktisch unmöglich, denn ich schlafe entweder zu Hause, oder ich bin “Away” ) all meine Multimediagerät ggf. herunterfahre und dann den Strom abschalte.
Die Sonderfälle:
Natürlich war es mit dem einfachen herunterfahren und ausschalten nicht getan, denn das ein oder andere Gerät wurde trotz gesetztem “SleepState” noch benötigt - zumindest temporär. So nutze ich zum einschlafen einen CuboxTV mit Kodi. Dieser empfängt sein TV Signal über IP vom VU+ Receiver im Wohnzimmer. Da mir alle Basteleien rund um “wenn keine Bewegung …oder… seit x Minuten keine Aktion ausgeführt” zu unsicher sind habe ich diese Ausnahme also in die Szene mit übernommen indem diese prüft, ob der Wallplug an dem Fernseher und CuboxTV im Schlafzimmer hängen mehr also 20 Watt Strom verbraucht. Ist dies der Fall, ist der Fernseher noch eingeschaltet und das Herunterfahren und Ausschalten im Wohnzimmer wartet. Sobald der TV sich per SleepTimer ausgeschaltet hat, läuft die Szene zu Ende und fährt alles im Wohnzimmer herunter.
Das LUA Skript:
--[[
%% properties
%% globals
PresentState
SleepState
--]]
-----------------------------------
--------- Verwendung ---------
--[[
Steuerung Multimediageräte (Wohnzimmer)
Trigger: globale Variablen PresentState und SleepState
bei Away/Sleeping
- Ausschalten aller Lichtquellen
- Herunterfahren von Rechnern
- Abschalten des Stroms
bei Home/Awake
- Einschalten des Stroms
- Geräte hochfahren
--]]
-----------------------------------
--------- Schleifenschutz ---------
if (fibaro:countScenes()>1) then
fibaro:debug('Kill the second scene!');
fibaro:abort();
end
-----------------------------------
---------- Einstellungen ----------
vardebug = true
-----------------------------------
------------- Config --------------
SleepState = fibaro:getGlobal("SleepState") -- Schlafstatus abfragen
PresentState = fibaro:getGlobal("PresentState") -- Präsenzstatus abfragen
local powerdown = {144,145,147,143,146} -- ID der Steckdosen der Greenworks Leiste die ab-/angeschaltet werden sollen
local qnap = 139 -- ID QNAP (VD)
local vu = 122 -- ID VU+ (VD)
local edimax = {75,76} -- ID Edimax Zwischenstecker (VD)
local lights = {8,10} -- ID Lampen Wohnzimmer
local hue = 79 -- ID Hue (VD)
local wallplug = 105 -- ID Wallplug Schlafzimmer
--------------------------------
---------- Funktionen ----------
-- ### Debug Funktion
function debug(color, message)
if (vardebug) then
--fibaro:debug(message)
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end
-- ### Funktion state um zu ermitteln, was getan werden muss.
-- ### Bei Abwesendheit oder Schlaf ist die Variable state > 0
function state()
state = 0
if (fibaro:getGlobal("PresentState") == "Away") then state = state + 1 end
if (fibaro:getGlobal("SleepState") == "Sleeping") then state = state + 1 end
end
-- ## Funktion recheck_state zum erneuten prüfen.
-- ## Implementiert, damit nicht bei jedem aktivieren/deaktiviere des Alarms sofort alles hoch- und runtergefahren wird.
-- ## Siehe unten
function recheck_state()
recheck_state = 0
if (fibaro:getGlobal("PresentState") == "Away") then recheck_state = recheck_state + 1 end
if (fibaro:getGlobal("SleepState") == "Sleeping") then recheck_state = recheck_state + 1 end
end
-- ### Diverse Ausgaben zum debuggen
debug("green",PresentState)
debug("blue",SleepState)
state()
debug("red",state)
--------------------------------
------------ Skript ------------
-- ### Überprüfen des states (0 = Home oder Awake // > 0 = Away/Holiday oder Sleeping)
if (state == 0) then
debug("blue","Status Home/Awake, 3 Minute warten ...")
-- ### Nachdem der Status 0 gesetzt wurde, 3 Minuten warten.
-- ### Typisch: Haus verlassen und irgendwas vergessen
-- ### So fährt nicht gleich alles wieder hoch
fibaro:sleep(180000) -- 3 Minute
-- ### Jetzt State erneut prüfen, ist dieser noch immer 0, dann fortfahren
recheck_state()
if (recheck_state == 0) then
-- ## Alle oben definierten Dosen der Leiste einschalten
debug("blue","Strom einschalten")
for i = 1,#powerdown do
fibaro:call(powerdown[i],"turnOn")
end
-- ## Edimax Zwischenstecker einschalten
debug("green","Edimax WZ einschalten")
fibaro:call(75, "pressButton", "1")
-- ## Eine Minute warten um anschließend VU+ in den Standby setzen zu können (Ist nach dem hochfahren immer AN)
debug("blue","1 Minute warten")
fibaro:sleep(60000) -- 1 Minute
debug("blue","VU+ auf Standby schalten")
fibaro:call(vu, "pressButton","5")
end
elseif (state > 0) then
-- ### Nachdem der Status 1 gesetzt wurde, 5 Minuten warten
-- ### Selber Grund wie oben nur anders herum
debug("blue","Status Away/Sleeping, 5 Minute warten ...")
fibaro:sleep(300000) -- 5 Minuten warten
-- ### Jetzt State erneut prüfen, ist dieser noch immer 0, dann fortfahren
recheck_state()
if (recheck_state > 0) then
-- ## Hues ausschalten
debug("red","Hues aus")
fibaro:call(hue, "pressButton", 10)
-- ## Lampen ausschalten
debug("red","Lampen aus")
for k = 1,#lights do
fibaro:call(lights[k],"turnOff")
end
--## Edimax Zwischenstecker ausschalten
debug("red","Edimax ausschalten")
for j = 1,#edimax do
fibaro:call(edimax[j], "pressButton", "2")
end
-- ## Über Stromverbrauch Wallplug prüfen, ob der TV im Schlafzimmer läuft
debug("yellow","Teste Stromverbrauch im Schlafzimmer...")
if ( tonumber(fibaro:getValue(wallplug, "power")) > 20) then
--## Solange der Verbrauch > 20 Watt Schleife laufen lassen
while tonumber(fibaro:getValue(wallplug, "power")) > 20 do
debug("yellow",powersz.." Watt - TV läuft...warten ")
fibaro:sleep(120000) -- 2 Minute warten, dann erneut prüfen
end
--## Wenn Verbrauch < 20 Watt, dann Wallplug ausschalten
debug("green","TV ausgeschaltet, Wallplug abschalten")
fibaro:call(wallplug,"turnOff")
else
--## Wenn TV aus, dann einfach fortfahren
debug("green","TV aus")
end
--## NAS herunterfahren
debug("red","NAS herunterfahren")
fibaro:call(qnap, "pressButton", "1")
--## VU+ herunterfahren
debug("red","VU+ herunterfahren")
fibaro:call(vu, "pressButton", "1")
--## 3 Minuten auf Herunterfahren warten
debug("red","3 Minuten auf herunterfahren warten")
fibaro:sleep(180000) -- 3 Minuten warten
-- ## Alle oben definierten Dosen der Leiste ausschalten
debug("red","Strom aus")
for i = 1,#powerdown do
fibaro:call(powerdown[i],"turnOff")
end
end
end
debug("green","Ende")
Ergebnis:
Es bleibt im Wohnzimmer genau eine Steckdose eingeschaltet. Diese versorgt meinen Raspberry und den Netzwerk-Switch mit Strom. Sind alle anderen Geräte aus liegt der Verbrauch dieser Geräte bei etwa 12 Watt. Ich spare also rund 800 KWh bzw. 220€ im Jahr.
Ist nun doch etwas mehr Test geworden als geplant. Über Kommentare und Verbesserungsvorschläge würde ich mich freuen.
Gruß
Neospin
PS: So eine Vorschaufunktion im Forum wäre schön