Ventilator zeitgesteuert ausschalten

Hi Leute,
Ich versuche gerade ein Skript zu schreiben das folgendes macht:
Ist der Ventilator ausgeschaltet, dann schalte ihn ein und nach einer gewissen Zeit wieder aus (derzeit 10 Sek)
Ist er eingeschaltet, dann schalte ihn aus.
Leider macht mein Skript noch nicht das was es soll ;-(

Ausschalten klappt schon, aber beim Einschalten wird erst nach den 10 Sek eingeschaltet und dann nicht mehr aus.
Irgendwie steh ich auf der Leitung, kann mir jemand einen Tipp geben?
Hier mein Skript:

--[[
%% properties
%% events
%% globals
--]]
startSource = 215
local deviceValue1 = tonumber(fibaro:getValue(startSource, "value"))
	if (deviceValue1 > 0) then
		Debug("green",(os.date("%d.%B %Y um %X Uhr AUS")))
		fibaro:call(215, "turnOff")
	else
setTimeout(function()
	fibaro:call(215, "turnOn")
	Debug("green",(os.date("%d.%B %Y um %X Uhr EIN")))
end, 10000)
Debug("green",(os.date("%d.%B %Y um %X Uhr Zeit abgelaufen - ")))
end

In deiner else-Schleife hast du auch kein turnOff drin, sondern nur ein turnOn. Ergo schaltet der Ventilator auch nicht mehr aus.

Gruß

Das ist leider nicht alles. Er zählt zuerst die Zeit runter udn dann schaltet er sich aus statt ein…
Ich dachte es wäre ein einfahcer Fehler.
Na ja, dann nmuss ich halt weiter experimentieren …

Habe es jetzt mal mit “Sleep” gelöst.
Ist zwar nicht professionell, aber funktioniert:

--[[
%% properties
%% events
%% globals
--]]
----- Lösche doppelte Szene(n) -----
if (fibaro:countScenes()>1) then 
 fibaro:abort()
end

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

startSource = 215
local deviceValue1 = tonumber(fibaro:getValue(startSource, "value"))
	if (deviceValue1 > 0) then
		Debug("green",(os.date("%d.%B %Y um %X Uhr AUS")))
		fibaro:call(215, "turnOff")
	else
		Debug("green",(os.date("%d.%B %Y um %X Uhr EIN")))
		fibaro:call(215, "turnOn")
		Debug("green",(os.date("%d.%B %Y um %X Uhr Sleep")))
		fibaro:sleep(10000); -- 10 Sekunden
		Debug("green",(os.date("%d.%B %Y um %X Uhr Zeit abgelaufen - AUS")))
  		fibaro:call(215, "turnOff")
	end

Hi,

schaue Dir mal zwei Beispiele für setTimeout an:

fibaro:debug("Pumpe AN - "..os.date("%d.%m.%Y", os.time()))

    fibaro:debug("V2 ist anschalten")
    fibaro:debug("V2 ist an")

	setTimeout(function()
	    fibaro:debug("V2 aus")
    	fibaro:debug("V3 ist an")
	end, 1*1000)
    
    setTimeout(function()
   	    fibaro:debug("V3 aus")
    	fibaro:debug("V1 ist an")
	end, 1*1000)
    

    setTimeout(function()
   	    fibaro:debug("V1 aus")
    	fibaro:debug("Ventile und Pumpe ausgeschaltte")
    end, 1*1000)

und dann

fibaro:debug("Pumpe AN - "..os.date("%d.%m.%Y", os.time()))

    fibaro:debug("V2 ist anschalten")
    fibaro:debug("V2 ist an")

	setTimeout(function()
	    fibaro:debug("V2 aus")
    	fibaro:debug("V3 ist an")
	end, 2*1000)
    
    setTimeout(function()
   	    fibaro:debug("V3 aus")
    	fibaro:debug("V1 ist an")
	end, (2+2)*1000)
    

    setTimeout(function()
   	    fibaro:debug("V1 aus")
    	fibaro:debug("Ventile und Pumpe ausgeschaltte")
    end, (4+2)*1000)

VG Hoggle

Hallo Hoggle,
Danke für die Codeschnipsel!
Wenn ich das richtig verstehe, dann läuft jeder Bereich setTimeout(function() so lange bis die Zahl bei End (inkl Multiplikator) vorbei ist, richtig?
Das bedeutet der erste läuft 2 x 1000 Millisekunden, der zweite 4 x 1000 MS u.s.w, richtig?

Hast du eine Idee wie ich es lösen kann, dass folgendes passiert:

1.) Szene wird aufgerufen und Ventilator läucht nicht -> Ventilator ein Timer auf Endzeit in 5 Minuten!
2.) Szene wir aufgerufen wenn Ventilator läuft -> Ventilator AUS, Timer gelöscht.

Wenn du zb. einen Switch nutzt kannst du abfragen wie viel Strom er gerade zieht. Also größer Null dann aus. Ansonsten an mit Sleeptime.
Kannst du auch mit einer Scene lösen.

Hast du due Scripte kopiert und den Debug angesehen?
Die Funktionen werden zeitgleich gestartet (1. Beispiel) und nicht versetzt…

Ja ich habe die beiden laufen gelassen und auch bemerkt, dass das 2.Skript zeitverzögert startet.
Habe das mit dem verzögert ausschalten auch damit schon gelöst, DANKE!!


startSource = 85
timeStop = 5000

local DeviceValue1 = tonumber(fibaro:getValue(startSource, "value"))
if (DeviceValue1 > 0) then
   fibaro:call(startSource, "turnOff")
   fibaro:debug("Beende die Szene?? - "..os.date("%d.%m.%Y", os.time()))
else
   fibaro:debug("AN - "..os.date("%d.%m.%Y", os.time()))
   fibaro:call(startSource, "turnOn")
        setTimeout(function()
	fibaro:call(startSource, "turnOff")
	fibaro:debug("AUS - "..os.date("%d.%m.%Y", os.time()))
   end, timeStop)
end

Bleibt nur nocht die Frage nach dem Exit :wink:
Ich würde gerne die Szene “sanft” beenden, da wo “Beende die Szene” steht, hast du einen Tipp?

Was genau meinst du mit “sanft”?

Sorry für die Wortwahl, besser wäre “elegant”.
Ich meine alle laufenden Prozesse DIESES Skriptes zu beenden ohne andere Dinge die auf der HC2 sonst noch laufen zu beeinflussen …
fibaro:abort() funktionierte im Test nicht, aber ich vermute da mangelt es an den nötigen Parametern :wink:

Es gibt noch killSense

Das ist nicht nötig. Die Szene beendet sich von selbst.

Gruß

Du meintest fibaro:killScenes(214).
Danke, das hat funktioniert!!

Hier die komplette Szene:

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

startSource = 85
timeStop = 30000
-- timeStop = 2000; -- (2Sek.)

	local DeviceValue1 = tonumber(fibaro:getValue(startSource, "value"))
	if (DeviceValue1 > 0) then
  		fibaro:call(startSource, "turnOff")
  		fibaro:debug("beende die Szene - "..os.date("%d.%m.%Y", os.time()))
  		fibaro:killScenes(214)
	else
			fibaro:debug("AN - "..os.date("%d.%m.%Y", os.time()))
			fibaro:call(startSource, "turnOn")
			setTimeout(function()
				fibaro:call(startSource, "turnOff")
				fibaro:debug("AUS - "..os.date("%d.%m.%Y", os.time()))
			end, timeStop)
			
	end

Ja Boomx das stimmt, aber in meinem Test war das immer erst nach dem Ablauf des Timers!
Da die echte Szene die ich vorhabe länger laufen soll (ca. 1-2 Stunden), will ich sie beenden, wenn sie noch aktiv ist!

In der Praxis geht es um einen Deckenventilator, denn ich nachts im Halbschlaf über eine Taste am NodOn aktiviere.
Er soll ca. 1 Stunde laufen udn sich dann abschalten. Zusätzlich soll er sich sofort abschalten, wenn ich die Taste erneut drücke während er läuft.
mit dem oben gezeigten Skript sollte das perfekt funktionieren, danke!!

Abschliessende Frage:
Gibt es einen Befehl mit dem ich die ID der Szene herausfinden kann, die gerade läuft?
Würde sie gerne nicht statisch eintragen wie hier fibaro:killScenes(203) sondern mittels Variable?

Hab leider bei meiner Suche im Forum dazu nichts gefunden was mir hilft.

Frage:
Kann ich die fibaro:killScenes(214) Funktion in der aktuellen Szene auch ohne Angabe der ID laufen lassen?

Habe Probiert stattdessen: fibaro:killScenes() zu verwenden, dann bekomme ich aber folgende Fehlermeldung:
[DEBUG] 13:34:18: line 212: attempt to concatenate local ‘sceneID’ (a nil value)
Zeile 212 gibt es in meinem Skript nich, hat nur 24 Zeilen!

…damit ist deine Frage eigentlich beantwortet - er benötigt ein ID…

Ok, danke!
Hatte gehofft das geht etwas “universeller” :wink:

Bei den VDs wird das auch gemacht.
Ich müsste nachsehen, aber es gibt sicherlich einen Befehl, um die Szenen-ID zu ermitteln.