Stromsparen mit LUA

Advertisements

Wir sollten alle mehr Strom sparen, denn durchschnittlich 3% Mehrkosten hat jeder von uns in den letzten 12 Monaten auf der Stromrechnung hinnehmen müssen. Die jähliche Mehrbelastung einer dreiköpfigen Familie liegt damit bei etwa 25 €. Diese Kosten gilt es – nicht zuletzt mit Blick auf unsere Umwelt – zu minimieren. In diesem Artikel zeige ich Dir, wie Du mit Hilfe eines Lua Skriptes ungenutzte Verbraucher nachts und bei Abwesenheit voll automatisch abschalten kannst und so den unnötigen Verbrauch minimierst.

Stromsparen mit Lua

Stromsparen mit Lua

Bekenntnis

Ich gebe es zu: Ich bin technikverrückt, wenn nicht sogar süchtig. Nichts was einen Stecker hat ist vor mir sicher. Das fängt bei der TV- und Hif-Ausstattung an, geht über ein NAS und hört beim Smart Home noch lange nicht auf. In meinem Wohnzimmer steht ein großer Fernseher, ein A/V Receiver, ein Linux TV Receiver, ein Subwoofer, ein Sonos Connect und noch ein paar andere Geräte für entspannte Abende auf dem Sofa. Alles schöne Geräte deren Funktionen mir meinen Alltag versüßen. Ein kleiner Touch auf die iPad Fernbedienung und schon geht das Entertainmentprogramm los. Stromsparen stand bisher nicht im Mittelpunkt meines Handelns.

Im Laufe der Jahre sind Geräte hinzu gekommen und andere wieder ausgezogen. Viele von Ihnen kosten auch Abseits von Anschaffung und Nutzung bares Geld. StandBy Verbrauch ist das Stichwort. Damit die Geräte „aufs Wort“ hören und beim Einschalten sofort verfügbar sind werden sie permanent mit Strom versorgt. Daran partizipiert allerdings hauptsächlich der Stromanbieter und es schadet nachhaltig unserer Umwelt. Die Hersteller versprechen sparsame Geräte und wenig Verbrauch im StandBy. Aber sieh selbst, was das bei üppiger Ausstattung bedeutet.

155 Watt für nichts

Schalte ich heute alle Geräte in meinem Wohnzimmer ein und lasse sie auf meine Interaktion warten, summiert sich der StandBy Verbauch auf 155 Watt! Unter der Annahme, dass die Geräte dies 24 Stunden am Tag tun und die KWh bei meinem Stromanbieter etwa 27 Cent kostet, sind das 1.357,8 KWh bzw. € 366,61 im Jahr. Kosten die ich für das zusätzliche Heizen meines Wohnzimmers bezahle. Da sind Überlegungen zum Stromsparen durchaus angebracht.

115 Watt StandBy Verbrauch

115 Watt StandBy Verbrauch

Überlegungen

Meine erste Idee war eine schaltbare Steckdosenleiste. Damit lassen sich ungenutzte Geräte einfach mit einem Schalter vom Strom trennen und schon ist der Verbrauch bei Null. Soweit ein guter Vorsatz zum Stromsparen und es mag – Disziplin vorausgesetzt – beim Fernseher und einer kleinen Lampe auch funktionieren. Aber die Kosten für NAS und andere computerbasierte Geräte übersteigen auf Dauer die eingesparten Euros deutlich

Stromsparen mit Home Center 2 Szene

Die nächste Idee (oder doch die erste?) war natürlich die Integration in das vorhandene Home Center 2. Aber auch damit ist ein einfaches Abschalten der Geräte nicht möglich und es müssen einige Sonderfälle bedacht und Routinen dafür entwickelt werden.

Einfach zusammengefasst habe ich eine Fibaro Szene entwickelt, die dem Ausschalten von Geräten und Lampen dient. Und zwar sobald niemand im Haus ist oder alle im Bett liegen und schlafen. Diese hilft Dir beim Stromsparen. Um empfindliche Geräte nicht einfach auszuschalten und im schlimmsten Fall zu beschädigen, bietet die Szene Möglichkeiten eigenen Lua Code und damit Funktionen zur Sonderbehandlung von Geräten zu berücksichtigen.

Der Trigger

Gestartet wird die Szene bei Veränderungen der globalen Variablen PresentState und/oder SleepState. Also wenn ich das Hauses verlasse oder ins Bett gehe. Startet die Szene, prüft sie den Status der beiden Variablen und wird ausgeführt. Nur wenn mindestens eine der beiden auf Away (PresentState) oder Sleeping (SleepState) gesetzt wurde, werden auch Aktionen ausgeführt.

--[[
%% properties
%% globals
PresentState
SleepState
--]]
---------------------------------------------------
------------- Status Check ------------------------
-- Um eine versehentliche Ausführung der Szene zu 
-- verhindern wird beim Start der aktuelle Status
-- von SleepState und PresentState überprüft.
---------------------------------------------------

function checkstate()
    state = 0
    if (fibaro:getGlobal("PresentState") == "Away")   then state = state + 1 end
    if (fibaro:getGlobal("SleepState")   == "Sleeping") then state = state + 1 end
end

Recheck – Wartezeit und erneute Prüfung des Status

Neben meiner Technikverrücktheit bin ich auch noch vergesslich. So kommt es des Öfteren vor, dass ich das Haus verlasse und beispielsweise die Einkaufstasche liegen lasse. Oder ich spiele mit der Fibaro App herum und setzte eine der Trigger Variablen manuell. Damit in beiden Fällen nicht sofort alles abgeschaltet wird, verfügt die Szene über eine Funktion um dies zu vermeiden.

-- Recheck Einstellungen - Gleich ausschalten oder warten und erneut prüfen?
local recheck 		= true 	-- Wenn true, dann wird vor dem Ausschalten gewartet
local rechecktime	= 5 	-- Wartezeit bis zum Recheck in Minuten

Die Funktion lässt sich ein- und ausschalten (true oder false) und die Zeitspanne in Minuten bis zur erneuten Prüfung der Variablen lässt sich definieren.

Schalter, Dimmer und Wallplugs definieren

Die Szene sieht 3 Gerätegruppen vor. Schalter, Dimmer und Wallplugs. In der Konfiguration kann für jede angegeben werden, ob alle Geräte dieser Gruppe ausgeschaltet werden sollen, oder eine individuelle Liste der zu schaltenden Geräte angegeben wird.

---- Auszuschaltende Switches, Dimmer, Wallplugs
local allSwitches 	= true		-- true = Alle Switches ausschalten
local allDimmer		= true		-- true = Alle Dimmer ausschalten
local allWallplug 	= false		-- true = Alle Wallplug ausschalten
local indSwitches   = {}		-- Nur diese Switches ausschalten
local indDimmer	    = {}		-- Nur diese Dimmer ausschalten
local indWallplugs  = {}		-- Nur diese Wallplugs ausschalten

Advanced Funktionen

Um nicht nur Licht und Wallplugs auszuschalten lassen sich weitere Lua Befehle einfügen. In meinem Fall ist das beispielsweise das Abschalten meiner Philips Hue Lampen in Küche und Wohnzimmer. In der Konfiguration kann eine Wartezeit in Minuten eingetragen werden um Geräten die Möglichkeit zu geben erst vollständig herunterzufahren, bevor der Strom abgeschaltet wird.

-- Advanced Funktionen Einstellungen - Zusatzfunktionen ausführen?
local advfunction	= true 	-- Zusatz Funktionen ausführen
local advfunctime	= 0 	-- Wartezeit nach dem Ausführen

Deine Lua Aktionen für die Advanced Funktionen müssen in den folgenden Block:

---------------------------------------------------
------------- Zusätzliche Funktionen --------------
-- Geräte die vor dem Ausschalten der Steckdosen 
-- eine Aktion benötigen können an dieser Stelle 
-- vorher heruntergefahren werden.
---------------------------------------------------

function addDownFunc()
	debug("red","--------------- Zusatzfunktionen --------------");
	debug("red","-> Hues ausschalten")
		fibaro:call(79, "pressButton", "10")
	
	--- Wartezeit nach Config
	debug("red","Wartezeit: "..advfunctime.." Minute(n)")
		fibaro:sleep(advfunctime*60*1000)
	debug("red","------------------------------------------------")	
end

Sonderbehandlung von Geräten

Soweit so gut. Damit spare ich schon eine Menge Strom, aber einen Sonderfall habe ich noch. In meinem Schlafzimmer nutze ich einen kleinen Mini-PC mit der Mediaplayer Software Kodi. Und zwar für TV und Streaming. Der Linux Receiver in meinem Wohnzimmer und mein NAS dienen dabei als Quelle. Ich schaue also das TV Programm und aufgenommene Sendungen per IP und Kodi direkt über die Geräte im Wohnzimmer.

Alle anderen Geräte abzuschalten und NAS sowie Linux Receiver laufen zu lassen war keine Option für mich, denn dann wäre wieder nichts mit Stromsparen. Daher habe ich eine für diese Geräte eine Sonderbehandlung implementiert.

Beim Wechsel der SleepState Variable auf Sleeping (bzw. PresentState auf Away) wird die Szene ausgeführt und prüft vor dem Herunterfahren von Receivers und NAS anhand des Stromverbrauches am Wallplug im Schlafzimmer, ob der Fernseher mehr also 20 Watt verbraucht und somit noch eingeschaltet ist. Sobald der Verbrauch auf unter 20 Watt sinkt, wird dies von der Szene erkannt und die Geräte mit Sonderbehandlung werden ebenfalls heruntergefahren.

-- Sondergeräte definieren
-- Diese Geräte werden erst heruntergefahren, wenn der Verbrauch des definieren Wallplugs kleiner als der angegebene Wert ist
local special		= true		-- Sondergerätefunktion ein/ausschalten
local specWallplug 	= 105		-- Sondergerät
local specPower		= 20		-- Wattgrenze
local specDevices	= {209,211,213,215,217,219}	-- Geräte mit Sonderbehandlung
local specInterval 	= 2				-- Verbrauch alle X Minuten prüfen
local spectime		= 3 				-- Wartezeit nach dem Ausführen

Kostenrechnung oder Return of Investment (ROI)

Ich habe 6 Wallplugs in meinem Wohnzimmer installiert um möglichst viele Geräte auch unabhängig voneinander nutzen zu können. Das ist schon eine kleine Investition, kostet doch ein Wallplug fast € 50. Wenn wir aber davon ausgehen, dass ich alle Geräte 2 Stunden am Tag nutze und diese den Rest der Zeit keinen Strom verbrauchen, so spare ich schon in den ersten 12 Monaten € 336,06. Andere unnötige Verbraucher wir das Licht in der Garage oder im Keller noch gar nicht mitgerechnet. Dazu habe ich noch Spaß an meinem Smart Home und tue etwas für die Umwelt.

Return of Investment

Return of Investment

Vollständige Szene

--[[
%% properties
%% globals
PresentState
SleepState
--]]
---------------------------------------------------
--------- Verwendung ------------------------------
--[[
Stromsparmaßnahmen bei Abwesendheit oder Schlaf
Trigger: globale Variablen PresentState und SleepState
bei Away/Sleeping
- Ausschalten aller Lichtquellen. Alle oder selektiv
- Herunterfahren von Rechnern in einer Extra Funktion
- Abschalten der Steckdosen / Wallplugs
--]]
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>1) then
fibaro:debug('Kill the second scene!');
fibaro:abort();
end
---------------------------------------------------
------------- Config ------------------------------
---- Globale Einstellungen
local SleepState   	= fibaro:getGlobal("SleepState") 	-- Schlafstatus abfragen
local PresentState 	= fibaro:getGlobal("PresentState")	-- Präsenzstatus abfragen
local advdebug 		= true 								-- Debugging ein/ausschalten
-- Recheck Einstellungen - Gleich ausschalten oder warten und erneut prüfen?
local recheck 		= true 								-- Wenn true, dann wird vor dem Ausschalten 
local rechecktime	= 1 								-- Wartezeit bis zum Recheck in Minuten
-- Advanced Funktionen Einstellungen - Zusatzfunktionen ausführen?
local advfunction	= true 								-- Zusatz Funktionen ausführen
local advfunctime	= 0 								-- Wartezeit nach dem Ausführen
-- Sondergeräte definieren
-- Diese Geräte werden erst heruntergefahren, wenn der Verbrauch des definieren Wallplugs kleiner als der angegebene Wert ist
local special		= true								-- Sondergerätefunktion ein/ausschalten
local specWallplug 	= 105								-- Sondergerät
local specPower		= 20								-- Wattgrenze
local specDevices	= {209,211,213,215,217,219}			-- Geräte mit Sonderbehandlung
local specInterval 	= 2									-- Verbrauch alle X Minuten prüfen
local spectime		= 3 								-- Wartezeit nach dem Ausführen
---- Auszuschaltende Switches, Dimmer, Wallplugs
local allSwitches 	= true								-- true = Alle Switches ausschalten
local allDimmer		= true								-- true = Alle Dimmer ausschalten
local allWallplug 	= false								-- true = Alle Wallplug ausschalten
local indSwitches   = {}								-- Nur diese Switches ausschalten
local indDimmer		= {}								-- Nur diese Dimmer ausschalten
local indWallplugs  = {}								-- Nur diese Wallplugs ausschalten
---------------------------------------------------
--------- Farbiges Debug --------------------------
---------------------------------------------------
debug = function ( color, message )
if (advdebug) then 
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end	
---------------------------------------------------
------------- Status Check ------------------------
-- Um eine versehentliche Ausführung der Szene zu 
-- verhindern wird beim Start der aktuelle Status
-- von SleepState und PresentState überprüft.
---------------------------------------------------
function checkstate()
state = 0
if (fibaro:getGlobal("PresentState") == "Away")   then state = state + 1 end
if (fibaro:getGlobal("SleepState")   == "Sleeping") then state = state + 1 end
end	
---------------------------------------------------
------------- Recheck -----------------------------
---------------------------------------------------
function recheckstate()
state = 0
debug("yellow","------------------- Recheck -------------------")
debug("yellow","Wartezeit: "..rechecktime.." Minute(n).")
fibaro:sleep(rechecktime*60*1000)
if (fibaro:getGlobal("PresentState") == "Away")   then state = state + 1 end
if (fibaro:getGlobal("SleepState")   == "Sleeping") then state = state + 1 end
if (state == 0) 
then
debug("green","Checkstate = "..state..". Skript wird beendet")
fibaro:abort();
end
debug("yellow","------------------------------------------------")
end	
---------------------------------------------------
------------- Zusätzliche Funktionen --------------
-- Geräte die vor dem Ausschalten der Steckdosen 
-- eine Aktion benötigen können an dieser Stelle 
-- vorher heruntergefahren werden.
---------------------------------------------------
function addDownFunc()
debug("red","--------------- Zusatzfunktionen --------------");
debug("red","-> Hues ausschalten")
fibaro:call(79, "pressButton", "10")
--- Wartezeit nach Config
debug("red","Wartezeit: "..advfunctime.." Minute(n)")
fibaro:sleep(advfunctime*60*1000)
debug("red","------------------------------------------------")	
end
---------------------------------------------------
------------- Sondergeräte Funktionen -------------
---------------------------------------------------
function specialFunction()
debug("yellow","--------------- Sonderfunktionen --------------");
debug("yellow","Läuft der TV im Schlafzimmer noch?");
if ( tonumber(fibaro:getValue(specWallplug, "power")) > 20) then
while tonumber(fibaro:getValue(specWallplug, "power")) > 20 do
debug("yellow", "TV läuft...warten ")
fibaro:sleep(specInterval*60*1000)
end
debug("yellow","TV ausgeschaltet, Wallplug abschalten")
fibaro:call(specWallplug,"turnOff")
else
debug("yellow","TV aus, weiter gehts")
end
-- Sonstige Geräte herunterfahren
debug("red","NAS herunterfahren")
fibaro:call(139, "pressButton", "1")
debug("red","VU+ herunterfahren")
fibaro:call(122, "pressButton", "1")
--- Wartezeit nach Config
debug("yellow","Wartezeit: "..spectime.." Minute(n)")
fibaro:sleep(spectime*60*1000)
debug("yellow","Geräte mit Sonderbehandlung ausschalten.")
for j = 1,#specDevices do 
fibaro:call(specDevices[j],"turnOff")
end
debug("yellow","------------------------------------------------")
end
---------------------------------------------------
------- Dimmer, Switches und Wallplug IDs ---------
-- Geräte IDs im HC2 finden
-- Siehe Konfiguration oben
---------------------------------------------------
function getDeviceIDs()
if (allSwitches) then tableSwitch=fibaro:getDevicesId({type = "com.fibaro.binarySwitch"}) else tableSwitch=indSwitches end
if (allDimmer) 	 then tableDimmer=fibaro:getDevicesId({type = "com.fibaro.multilevelSwitch"}) else tableDimmer=indDimmer end
if (allWallplug) then tableWallplug=fibaro:getDevicesId({type = "com.fibaro.FGWP101"}) else tableWallplug=indWallplugs end
allDevices = {}
for j = 1,#tableSwitch do table.insert(allDevices, tableSwitch[j]) end  
for j = 1,#tableDimmer do table.insert(allDevices, tableDimmer[j]) end  
for j = 1,#tableWallplug do table.insert(allDevices, tableWallplug[j]) end
--for j = 1,#allDevices do print(allDevices[j]) end
end
---------------------------------------------------
------- Dimmer, Switches und Wallplug schalten ----
---------------------------------------------------
function switchDevices()
debug("blue","----------- Geräte schalten ---------------------")
getDeviceIDs()
for j = 1,#allDevices do 
fibaro:call(allDevices[j],"turnOff")
end
debug("blue","Alle Geräte/Lichter ausgeschaltet")
debug("blue","------------------------------------------------")		
end
---------------------------------------------------
------------- Ausführung --------------------------
-- Status abfragen und Ausgeben
checkstate()
debug("green","-------------------------------------------------")
debug("green","------- HC2 Energy Save by mkshb.de----------")
debug("green","-------------------------------------------------")
debug("blue","PresenState: "..PresentState)
debug("blue","SleepState: "..SleepState)
if (state == 0) 
then
debug("red","Checkstate = "..state..". Es gibt nichts zu tun. Skript wird beendet")
elseif (state > 0) 
then
debug("green","Checkstate = "..state..". Skript wird gestartet")
-- Recheck ausführen, wenn aktiviert
if (recheck) then recheckstate() else debug("yellow","-> Reckeck deaktiviert.") end
-- Zusätzliche Funktionen ausführen?
if (advfunction) then addDownFunc() else debug("red","-> Zusatzfunktionen deaktiviert.") end
-- Switches, Dimmer und Wallplugs ausschalten
switchDevices()
-- Sonderfunktionen
if(special) then specialFunction() else debug("yellow","-> Special deaktiviert.") end
end
debug("green","-------------------------------------------------")
debug("green","------- HC2 Energy Save beendet --------------")
debug("green","-------------------------------------------------")

Rückmeldung erbeten

Wenn Du Die Szene verwendest oder das Skript für Dich anderweitig weiterentwickelt hast, dann freue ich mich über einen Kommentar unter dem Artikel oder auf meinem Blog.

Posted in Strom and tagged .

11 Comments

  1. Hi Bastian,
    habe Dein Script noch nicht getestet (werde das aber gleich mal tun), aber es liest sich schonmal super. Auch hast Du eine ganz hervorragende Erklärung geschrieben. Respekt!
    Willst Du das nicht mal in die Datenbank bei siio posten?

    • Hallo Basti,

      Danke für Dein Feedback und viel Erfolg und Spaß beim Implementieren. Wenn Du Fragen oder Probleme hast, dann unterstütze ich gern.

      Ursprünglich sollte dieser Artikel auf Siio erscheinen, dass hat sich aber zerschlagen. Ebenso ist man bei Siio sehr restriktiv im Bezug auf externe Links, daher sehe ich im Moment davon ab dort etwas zu posten. Dies zu werten überlasse ich jedem selbst. Gern helfe ich jedoch anderen Usern im Forum um die Community zu unterstützen.

      Gruß
      Bastian

  2. Hi Bastian,

    bin zufällig gestern über siio auf deine Seite mit dem Status Board gekommen. Einfach perfekt! Und dann habe ich heute dieses hier entdeckt (über eine Google-Suche). Funktioniert einwandfrei und durch deine leicht verständlichen Erklärungen verstehe auch ich als Laie diese. Die helfen mir auch bei eigenen Programmierversuchen weiter!
    Deine Seite habe ich auf jeden Fall abgespeichert und verfolge ich nun regelmäßig.

    Ich bin noch am Überlegen, ob ich meine Kameras auch über dieses Script steuere, sodass die bei Abwesenheit oder im Schlaf eingeschaltet werden und ansonsten ruhen und Strom sparen. Ggf. könnten auch noch die Rollläden entsprechend geschlossen werden, aber vielleicht ist das auch etwas unsinnig (zumindest tagsüber).

    Viel Erfolg und Spaß weiterhin und vielen Dank für deine Mühe, mach weiter so!

    Gruß
    Daniel

  3. Hi Bastian,

    wie sieht es eigentlich bei einem Raspberry Pi und Stromsparen aus?
    Wenn ich das richtig sehe, gibt es Befehle zum sanften Herunterfahren, allerdings gibt es kein Wake-on-Lan.
    Andererseits geht der Raspberry an, sobald er Strom bekommt. Das schreit doch förmlich nach einem Wall-Plug:-)
    Den Raspberry hart per Wall-Plug auszuschalten, erscheint mir jedoch etwas unsicher.

    Gibt es hier eine Möglichkeit den Raspberry bei Abwesenheit aus dem HC2 heraus runterzufahren und den Wallplug auszuschalten?

    Grüße
    Mr.Coffee

    • Hi Mr. Coffee,

      ich fahre meine Raspberry nicht herunter, da diese Infrastruktur-Aufgaben übernehmen. Herunterfahren kannst Du den Pi aber wie ein normales Linux-System. Wenn Du danach einen Wallplug ausschaltest, kannst Du ihn durch erneutes Einschalten auch wieder hochfahren.

      Gruß
      Bastian

      • Hi Bastian,

        ich habe nun einen Apache PHP-Server installiert, der über die HC2 angesprochen werden kann. Nun fährt der Raspberry artig herunter, wenn niemand zu Hause ist und die Steckdose schaltet ab. Sobald der PresentState wieder „home“ ist, schaltet die Steckdose ein und der Raspberry fährt hoch. Top.
        Danke.

        Gruß
        Mr.Coffee

  4. Pingback: Produkt Bewertungen von anderen Webseiten

  5. Pingback: Wie entsteht ein Smart Home? | Mein kleiner Smart Home Blog

    • Hi Jeff,

      ich habe unterschiedliche Arten die Variable zu setzen. Am Schlafzimmerlicht hängt ein Doppeltaster mit Dimmer dahinter. Der eine schaltet das Licht, der andere die Variable. Dann habe ich noch eine kleine Z-Wave Fernbedienung und wenn es mal aufwändig sein soll, dann helfen die Smartphones auch dabei. Es ist noch ein kleines Arduino Projekt mit einer Gestensteuierung ähnlich dem Fibaro Swipe angedacht, aber noch nicht wirklich konkret.

      Grüße
      Bastian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere