Hilfe bei Skript Weihnachtsbeleuchtung

Hallo zusammen,

auch ich versuche mich langsam in LUA und habe ein Skript zur Steuerung unserer Weihnachtsbeleuchtung zusammengebastelt (Programmieren würde ich das nicht nennen…) Das Skript läuft soweit durch, nur im nächsten Durchlauf 1 Minute später bekomme ich eine Fehlermeldung, die da lautet:

 [DEBUG] 10:39:44: Sonne geht unter: 16:42
[DEBUG] 10:39:44: Sonne geht auf: 08:25
[DEBUG] 10:39:45: Heute ist ein Werktag und kein Feiertag.
[DEBUG] 10:40:45: [1;31m2017-01-13 10:40:45.006580 [ fatal] LUA error: attempt to call a nil value

Das Skript:

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

local 	aussenlichterkette	= 104		-- IDs derzu steuernden Lampen
local	innenbeleuchtung1 	= 78
local	innenbeleuchtung2 	= 84
local 	morgensAussenEin 	= "06:00"	-- Einschaltzeitpunkt der Aussenbeleuchtung morgens
--local	morgensInnenEin 	= "06:00"	-- Einschaltzeitpunkt der Innenbeleuchtung morgens
local	morgensDelayAus	 	= 30		-- Ausschaltverzögerung zum Sonnenaufgang in Minuten
										-- Einschalten Abends bei Sonnenuntergang
local	abendsAussenAus 	= "22:00"	-- Ausschaltzeitpunkte der Lampen Abends
local	abendsInnenAus1		= "22:15"
local	abendsInnenAus2		= "22:30"
local	rebootSceneID		= 55		-- ID dieser Szene

--########################################################################################
debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
--########################################################################################

local sourceTrigger = fibaro:getSourceTrigger();
function sceneReboot()
		local currentDate = os.date("*t");
        if ((currentDate.hour == 2) and (currentDate.min >= 0)and (currentDate.min < 1))
        or sourceTrigger["type"] == "other" then
              debug('salmon',"Neustart der Szene!")
              fibaro:sleep(1*60*1000)
              fibaro:startScene(rebootSceneID);
        end
        setTimeout(sceneReboot, 1*60*1000)
end
--#######################################################################################

	local startSource = fibaro:getSourceTrigger()
	local currentTime = os.date("%H:%M", os.time())
	local currentDate = os.date("*t")
	local weihnachtszeit = fibaro:getGlobalValue("HolidayTime") == "Yes"
	local feiertag_heute = tonumber(fibaro:getGlobalValue("Feiertag_heute"))
	local werktag = 1
	local sunset = fibaro:getValue(1, "sunsetHour")
		debug('blue','Sonne geht unter: ' ..sunset)
	local sunrise = fibaro:getValue(1, "sunriseHour")
		debug('orangered', 'Sonne geht auf: ' ..sunrise)

function weihnachtsbeleuchtung()
--########################################################################################
if fibaro:countScenes() > 1 then
	debug('red', "Stoppe Szene!");
  fibaro:abort();
end
------------------------------------------------------------------------------------------
--##################### Feststellung ob Wochenende oder Feiertag #########################
------------------------------------------------------------------------------------------

if (feiertag_heute == 1 or currentDate.wday == 7 or currentDate.wday == 1)
then
	local werktag = 0
	debug('grey', "Heute ist Wochenende oder ein Feiertag.")
else
local werktag = 1
debug('grey',"Heute ist ein Werktag und kein Feiertag.")
end

------------------------------------------------------------------------------------------
--###################### Weihnachtslicht morgens einschalten #############################
------------------------------------------------------------------------------------------

if weihnachtszeit == "Yes" and currentTime == morgensAussenEin
then
		fibaro:call(aussenlichterkette, "turnOn")
		debug('gold', 'Aussenbeleuchtung eingeschaltet.')

elseif weihnachtszeit == "Yes" and (os.date("%H:%M", os.time()) == morgensInnenEin)
then
--		fibaro:call(innenbeleuchtung1, "turnOn")
--		fibaro:call(innenbeleuchtung2, "turnOn")
		debug('gold', 'Innenbeleuchtung eingeschaltet.')
		fibaro:setGlobal('HolidayLights', 'On')

------------------------------------------------------------------------------------------
--###################### Weihnachtslicht morgens ausschalten #############################
------------------------------------------------------------------------------------------

elseif weihnachtszeit == "Yes" and os.date("%H:%M", os.time()-morgensDelayAus*60) == sunrise
then
		fibaro:call(aussenlichterkette, "turnOff")
--		fibaro:call(innenbeleuchtung1, "turnOff")
--		fibaro:call(innenbeleuchtung2, "turnOff")
		fibaro:setGlobal('HolidayLights', 'Off')
		debug('darkblue', 'Weihnachtsbeleuchtung ausgeschaltet.')

------------------------------------------------------------------------------------------
--###################### Weihnachtslicht abends einschalten #############################
------------------------------------------------------------------------------------------

elseif weihnachtszeit == "Yes" and os.date("%H:%M", os.time()) == sunset
then
		fibaro:call(aussenlichterkette, "turnOn")
		fibaro:call(innenbeleuchtung1, "turnOn")
		fibaro:call(innenbeleuchtung2, "turnOn")
		fibaro:setGlobal('HolidayLights', 'On')
		debug('gold', 'Weihnachtsbeleuchtung eingeschaltet.')

------------------------------------------------------------------------------------------
--###################### Weihnachtslicht abends ausschalten #############################
------------------------------------------------------------------------------------------

elseif weihnachtszeit == "Yes" and (os.date("%H:%M", os.time()) == abendsAussenAus)
then
		fibaro:call(aussenlichterkette, "turnOff")
		debug('darkblue', 'Aussenbeleuchtung ausgeschaltet.')

elseif weihnachtszeit == "Yes" and (os.date("%H:%M", os.time()) == abendsInnenAus1)
then
		fibaro:call(innenbeleuchtung1, "turnOff")
		fibaro:setGlobal('HolidayLights', 'Off')
		debug('steelblue', 'Innenbeleuchtung1 ausgeschaltet.')

elseif weihnachtszeit == "Yes" and (os.date("%H:%M", os.time()) == abendsInnenAus2)
then
		fibaro:call(innenbeleuchtung2, "turnOff")
		debug('steelblue', 'Innenbeleuchtung2 ausgeschaltet.')
end

--########################################################################################

setTimeout(tempFunc, 60*1000)
end

--########################################################################################
--########################################################################################
local sourceTrigger = fibaro:getSourceTrigger()
if (sourceTrigger["type"] == "autostart") then
weihnachtsbeleuchtung()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if  weihnachtszeit == "Yes"
or startSource["type"] == "other"
then
	fibaro:call(innenbeleuchtung1, "turnOn")
	fibaro:call(innenbeleuchtung1, "turnOn")
	fibaro:call(aussenlichterkette, "turnOn")
	debug('yellow', "Weihnachtsbeleuchtung eingeschaltet!")
end

end

Auch für weitere Hilfestellungen und Anregungen bin ich dankbar!

Hi,

attempt to call a nil value deutet daraufhin, dass das Skript versucht eine ID zu callen, welche aber nicht definiert ist. Geh am Besten nochmal die IDs und die Variablen durch. Möglicherweise findest du hier einen Fehler.

Gruß

Hi,

wozu benötigst Du function sceneReboot()?
Nimm mal in Zeile 62 und 65 das local raus.
Definiert ist die Var ja schon, Du willst ihr doch hier sicherlich nur einen neuen Wert zuweisen.

VG Hoggle

Danke für eure Hilfe, ich werd mir das mal genauer anschauen mit den IDs und Variablen.
Brauche ich die Funktion sceneReboot nicht, um jeden Tag Sonnenaufgang und -untergang festzustellen?

Ich hab den Fehler gefunden:
In Zeile 132 habe ich den timeout auf eine Funktion gesetzt, die es nicht gibt. Deswegen lief die Funktion beim ersten Durchgang auch sauber durch.
Richtig muss es heissen :

setTimeout(weihnachtsbeleuchtung, 60*1000)

Danke nochmals für eure Hilfe!

Hi,

de Sonnenuntergang und -aufgang ermittelst Du in Zeile 45 und 47.

VG Hoggle

Ja schon, aber das mache ich doch außerhalb der Funktion ‘weihnachtsbeleuchtung’, die jede Minute wiederholt wird. Also doch nur einmalig, oder nicht?