Weihnachtsbeleuchtung

Hallo,
vielleicht ist das Thema ja schon anderweitig behandelt worden. Ich konnte aber bisher keinen passenden Beitrag dazu finden. Meine Frau hat in der Küche am Fenster ´ne Lichterkette, die morgens zw. 6:00 und 8:00 Uhr und abends zw. 15:00 und 22:00 Uhr leuchten soll.
Ich habe ´nen Fibaro Wall plug, an den ich die Kette anschliessen könte. Eigentlich wolte ich ihn in der Waschküche vor die Waschmaschine packen (wg. Benachrichtigung) - aber das muss wohl bis nach Weihnachten warten.
Wie realisere ich nun die Zeitsteuerung? Ich habe es gestern mal über die grafischen Szenen versucht, bin aber nicht erfolgreich gewesen.
Kann jemand helfen? Danke!

Hi,

überall das selbe Problem… :slight_smile:

Allerdings hat meine Frau nicht nur eine Lichterkette…
Allerdings wollte ich dabei den Sonnenuntergang bzw- aufgang berücksichtigen.

Folgendes Script (hier aus dem Forum “zusammenkopiert” läuft, lässt sich aber sicherlich noch optimieren.
Danke an dieser Stelle für die tollen verschiedenen Beispiele hier im Forum und Eure Unterstützung!
Ich hoffe, ich habe es richtig umgesetzt.

--[[
%% properties
%% autostart
%% globals
--]]

--Script schaltet die Relais für die Weihnachtsbeleuchtung morgens in der Früh an, 
--mit einer zeitlichen Verzögerung nach Sonnenaufgang ab und Nachmittags kurz vor 
--Sonnenuntergang wieder ein und in der Nacht wieder aus.

fibaro:debug('Erstmalig gestartet')

local sourceTrigger = fibaro:getSourceTrigger();
local version = '1.0';
fibaro:debug('XMasTime-Controller (Ver.' .. version .. ')');
 
function varTime() 

local morning  = {6, 00}; 	 -- HH:MM für Lichter An morgens in der früh
local night  = {23, 00}; -- HH:MM für Lichter Aus in der Nacht
local vorher = 20 		 -- 20 Minuten vor Sonnenuntergang angehen
local nachher = 20		 -- 20 Minuten Verzögerung nach Sonnenaufgang zum ausgehen
local switches = {84, 177, 181, 222}; -- ID der Switches, Stecker
  
---------------------------------------------------------------------------
local SunSet = fibaro:getValue(1, "sunsetHour")
--fibaro:debug('Sonne geht unter: ' ..SunSet);
local Sunrise = fibaro:getValue(1, "sunriseHour")
--fibaro:debug('Sonne geht auf: ' ..Sunrise);
---------------------------------------------------------------------------
 
if fibaro:countScenes() > 1 then
  fibaro:debug("stop scene");
  fibaro:abort();
end
 
local morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[2]*60);
local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60);
local ostime = os.date("%H:%M", os.time());

--fibaro:debug('Funktion gestartet')
  
-- Licht AN 
	--in der Früh
if ostime == morning then
    for i = 1,#switches do
		fibaro:call(switches[i],"turnOn")
		fibaro:debug("Aktuelle Dev ID: "..switches[i])
	end
    fibaro:debug("Licht in der Früh an........");
	
    --Am Nachmittag
elseif os.date("%H:%M", os.time()+vorher*60) == SunSet   -- 20 Minuten vor Sonnenuntergang
    then 
	local Count = 0
	for Index, Value in pairs( switches ) do
		Count = Count + 1
		fibaro:debug("Aktuelle Dev ID: "..switches[Count])
		fibaro:call(switches[Count], "turnOn") 
	end
    fibaro:debug("Licht am Nachmittag an........");
  
--Licht AUS
    --am Vormittag	
elseif ostime == Sunrise
    then
	fibaro:sleep(nachher*60*1000) -- 20 Minuten Verzögerung
    local Count = 0
	for Index, Value in pairs( switches ) do
	Count = Count + 1
	fibaro:debug("Aktuelle Dev ID: "..switches[Count])
	fibaro:call(switches[Count], "turnOff") 
	end
    fibaro:debug("Licht Vormittags aus........");

    --In der Nacht
elseif ostime == night then
	local Count = 0
	for Index, Value in pairs( switches ) do
	Count = Count + 1
	fibaro:debug("Aktuelle Dev ID: "..switches[Count])
	fibaro:call(switches[Count], "turnOff") 
	end
    fibaro:debug("Licht in der Nacht aus.......");
else
	--fibaro:debug("No action");
end
   
setTimeout(varTime, 60*1000)
end

if (sourceTrigger["type"] == "autostart") 
	then varTime()
	--fibaro:debug("Type Autostart"); 
	end

ah - das mit dem Tabulator hat nicht so funktioniert…

Vielen Dank für die schnelle Antwort. Ich bin nicht so sattelfest mit dem Code. Mal sehen, ob es mir gelingt, das Script zum Laufen zu bringen.

hab es heut zum ersten mal am laufen. mal sehen ob es funktioniert

cooles Ding! werd ich morgen auch mal testen. Danke Hoggle!

Also bei mir ging sie morgens nicht an. Hab dann geschaut warum. Wenn ich als Startzeit 7:30 Uhr wähle, dann muss ich die 0 vor die sieben machen das es geht. Zeile 19 im Script.

Ich hatte den Standort nicht sauber gesetzt, somit waren Sonnenuntergang und Sonnenaufgang falsch. Hab ich korrigiert und nun Stimmen die Zeiten. Mir ist das aufgefallen, weil der Sonnenuntergang heute wirklich Bombe war und das Licht war aber schon an. Kurz mit Google nachgeschaut und es war fast ne Dreiviertel Stunde zu früh. Ich hab Standort Funktionen auch noch nicht benutzt und das nicht eingestellt.
Kann jedem raten dies einzustellen. Ob man es brauch oder nicht. Irgendwann brauch man es eben.

Ich hab die Koordinaten hier rausgesucht: http://www.gpskoordinaten.de/

Kopieren und einfügen. Abspeichern. Fertig.

Nun aber zu meinem Problem mit dem script. Es stoppt oder starten nicht richtig. z. B. Nachdem ich was geändert hab. Abspeicher. Startet es selten. Screenshot hab ich angehängt.
Hab alles mögliche probiert. Abstoppen, wieder starten. Mehrfach. Nochmal speichern drücken.
Am schnellsten startet es, wenn ich einfach ein Leerzeichen irgendwo hinzufüg, nochmal speichern und dann läuft es meistens.
Mir kommt es vor, als ob da ne Variable oder so noch ein Wert hat und deswegen das script abstoppt oder abbricht.
Hab alle Debug Ausgaben an, daran erkenn ich ob es einfach gestoppt hat.
Wenn es aber läuft, dann läuft es.

image.jpg

Hi,

es läuft auch normal in deinem Fall weiter. Das HC2 erkennt nur, das noch eine neue Instanz von der Szene gestartet wurde und beendet diese neue Instanz. Das Skript läuft aber im Hintergrund normal weiter :slight_smile:

Gruß

Da wir an einigen Fenstern Beleuchtung haben, habe ich in dem Script noch eingebaut, dass die entsprechenden Rollos zum Zeitpunkt “Nacht” auch gleich herunterfahren:

--[[
%% properties
%% autostart
%% globals
--]]

--Script schaltet die Relais für die Weihnachtsbeleuchtung morgens in der Früh an, 
--mit einer zeitlichen Verzögerung nach Sonnenaufgang ab und Nachmittags kurz vor 
--Sonnenuntergang wieder ein und in der Nacht wieder aus.

fibaro:debug('Erstmalig gestartet')

local sourceTrigger = fibaro:getSourceTrigger();
local version = '1.0';
fibaro:debug('XMasTime-Controller (Ver.' .. version .. ')');
 
function varTime() 

local morning  = {6, 00}; 	 -- HH:MM für Lichter an morgens in der früh
local night  = {23, 00}; -- HH:MM für Lichter aus in der Nacht
local vorher = 20 		 -- 20 Minuten vor Sonnenuntergang angehen
local nachher = 5		 -- 5 Minuten Verzögerung nach Sonnenaufgang zum ausgehen
local switches = {84, 177, 181, 222}; -- ID der Switches, Stecker
local Rollos = {147, 153, 169, 167}; -- ID der Rollos, die bei 'Nachts' geschlossen werden
  
---------------------------------------------------------------------------
local SunSet = fibaro:getValue(1, "sunsetHour")
--fibaro:debug('Sonne geht unter: ' ..SunSet);
local Sunrise = fibaro:getValue(1, "sunriseHour")
--fibaro:debug('Sonne geht auf: ' ..Sunrise);
---------------------------------------------------------------------------
 
if fibaro:countScenes() > 1 then
  fibaro:debug("stop scene");
  fibaro:abort();
end
 
local morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[2]*60);
local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60);
local ostime = os.date("%H:%M", os.time());

--fibaro:debug('Funktion gestartet')
  
-- Licht AN 
	--in der Früh
if ostime == morning then
    for i = 1,#switches do
		fibaro:call(switches[i],"turnOn")
		fibaro:debug("Aktuelle Dev ID: "..switches[i])
	end
    fibaro:debug("Licht in der Früh an........");
	
    --Am Nachmittag
elseif os.date("%H:%M", os.time()+vorher*60) == SunSet   -- 20 Minuten vor Sonnenuntergang
    then 
	local Count = 0
	for Index, Value in pairs( switches ) do
		Count = Count + 1
		fibaro:debug("Aktuelle Dev ID: "..switches[Count])
		fibaro:call(switches[Count], "turnOn") 
	end
    fibaro:debug("Licht am Nachmittag an........");
  
--Licht AUS
    --am Vormittag	
elseif ostime == Sunrise
    then
	fibaro:sleep(nachher*60*1000) -- 20 Minuten Verzögerung
    local Count = 0
	for Index, Value in pairs( switches ) do
	Count = Count + 1
	fibaro:debug("Aktuelle Dev ID: "..switches[Count])
	fibaro:call(switches[Count], "turnOff") 
	end
    fibaro:debug("Licht Vormittags aus........");

    --In der Nacht
elseif ostime == night then
	local Count = 0
	for Index, Value in pairs( switches ) do
	Count = Count + 1
	fibaro:debug("Aktuelle Stecker ID: "..switches[Count])
	fibaro:call(switches[Count], "turnOff") 
	end
	fibaro:debug("Licht in der Nacht aus.......");
    
    for i = 1,#Rollos do
		fibaro:call(Rollos[i],"close")
		fibaro:debug("Aktuelle Rollo-ID: "..Rollos[i])
	end
    fibaro:debug("Rollos geschlossen.......");
else
	--fibaro:debug("No action");
end
   
setTimeout(varTime, 60*1000)
end

if (sourceTrigger["type"] == "autostart") 
	then varTime()
	--fibaro:debug("Type Autostart"); 
	end

Das Problem:

Wenn ich als Startzeit 7:30 Uhr wähle, dann muss ich die 0 vor die sieben machen das es geht. Zeile 19 im Script.

hatte ich auch schon bei anderen Skripten - warum auch immer, in der obigen Variante brauche ich die führende Null vor der Ziffer nicht…

@boomx
Habe ich gerade gemerkt das es schaltet, also läuft. Aber eben null Debug Ausgaben. Ist ja auch nicht normal. Liegt das am script oder ist das ein Fehler der box?

image.jpg

Ein Fehler deiner Box ist es ganz sicher nicht :wink:

Für mich sieht es so aus, als ob die Funktion die if-Schleifen nicht sauber durchgeht. Der Debug den du bekommst sollte eigentlich nur beim ersten Start auftreten.

Hallo,
in den letzten Wochen habe ich ein wenig mit “virtuellen Modul” und “globale Variable” experimentiert und so langsam ein Grundverständnis erlangt. Jetzt würde ich gerne Hoggles Script um einen Punkt ergänzen: Abhängigkeit von einer globalen Variable.
Ich habe ein virtuelles Modul mit drei Schaltern gebaut. Schalter eins setzt die Variable “Weihnachtsbeleuchtung=on” und schaltet Wallplug x ein. Schalter zwei setzt die Variable auf Off und schaltet den Wallplug auf “Off”. Schalter drei setzt nur die Variable auf “Schedule”. Und jetzt soll das obige Skript nur laufen, wenn die Variable “Weihnachtsbeleuchtung=Schedule” ist. Und da hören meine Lua Kenntnisse auf …
Kann mir jemand helfen?
Danke!

Hallo, in die Runde.
Da ja Weihnachten nicht mehr soweit ist, wollte ich mir das Script von Hoggle dauerhaft leihen.
Ich hab dazu nur noch eine Frage, muss ich für
local SunSet = fibaro:getValue(1, “sunsetHour”) und local SunSet = fibaro:getValue(1, “sunsetHour”) eine globale Variable anlegen? oder holt sich das script dies einfach aus dem HC2?

Danke für Eure Unterstützung
Gruß secundani

Das ist eine Standard-Funktion und bedarf keiner zusätzlichen Variablen.

Gruß

Hi boomx, danke für die schnelle Antwort. Dann steht ja dem Weihnachten nichts im Weg.
Gruß

Hallo boomx, ich hätte mal eine Bitte. Da ich versuche die scripte zu verstehen, ergeben sich mir manchmal Fragen, die ich so nirgends beantwortet bekomme.
So geht es mir mit dem Script von Hoggle. Eventuell kannst Du mir mal erklären warum local morning und local night zweimal definiert wird. Was ich leider gar nicht verstehe ist dieses “local morning = os.date(”%H:%M", -3600+ morning[1]6060 + morning[2]*60); in Verbindung mit den nachfolgenden 2 Zeilen.
Ich würde mich freuen, wenn Du mir das mal übersetzen würdest.
großes Danke
secundani


function varTime() 
 
local morning  = {6, 00}; 	 -- HH:MM für Lichter An morgens in der früh
local night  = {23, 00}; -- HH:MM für Lichter Aus in der Nacht
local vorher = 20 		 -- 20 Minuten vor Sonnenuntergang angehen
local nachher = 20		 -- 20 Minuten Verzögerung nach Sonnenaufgang zum ausgehen
local switches = {84, 177, 181, 222}; -- ID der Switches, Stecker
  
---------------------------------------------------------------------------
local SunSet = fibaro:getValue(1, "sunsetHour")
--fibaro:debug('Sonne geht unter: ' ..SunSet);
local Sunrise = fibaro:getValue(1, "sunriseHour")
--fibaro:debug('Sonne geht auf: ' ..Sunrise);
---------------------------------------------------------------------------
 
if fibaro:countScenes() > 1 then
  fibaro:debug("stop scene");
  fibaro:abort();
end
 
local morning = os.date("%H:%M", -3600+ morning[1]*60*60 + morning[2]*60);
local night = os.date("%H:%M", -3600+ night[1]*60*60 + night[2]*60);
local ostime = os.date("%H:%M", os.time());
 

Hi,

die wird nicht 2x definiert, bzw. eigentlich schon. Man hätte das zweite local auch weglassen können. Ist bei LUA aber egal…

Das zweite morning ersetzt das erste an der Stelle mit Werten von dem ersten Morning.

Gruß

Hi, so etwas dachte ich mir schon. also würde es reichen die oberen Variablen zu nutzen.
Trotzdem würde ich mich freuen, wenn Du mir noch die Zeilen 22 bis 24 mal erklärst. Mich würde schon interessieren welche Zeit da entsteht.
Eventuell lässt es deine Zeit ja zu.
Ich bedanke mich für deine Hilfe und Geduld
Gruß

Die Erklärungen dazu findest du dort:

https://www.lua.org/pil/22.1.html

Gruß