DingDong allerseits,
Ich habe hier ein Klingelscript geboren, das nicht so ganz macht was es soll.
Es blinkt nicht im programmierten 3sec Takt und es mag nach 1min nicht weiterlaufen und die Klingel wieder inaktiv setzen.
Warum nur?
Parallel dazu läuft dort das Script “die perfekte Lichtsteuerung” wo ich aber nix geändert habe. Sollte ich das Klingelscript dort als extra func hinterlegen?
Gruß Carsten
--[[
%% properties
62 value --Fenstersensor
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
if ( ( tonumber(fibaro:getValue(62, "value")) > 0 ) or startSource["type"] == "other") then
fibaro:call(9, "sendPush", "Klingel");
fibaro:debug('Klingel');
fibaro:setGlobal("Klingel", "Aktiv");
fibaro:debug('Klingel aktiv - Variable gesetzt');
while (fibaro:getGlobal('Klingel') == 'Aktiv') do
fibaro:call(35, "setColor", "255","0","0","0"); -- setzte Licht Flur auf rot
fibaro:call(35, "turnOn"); -- schalte Licht flur ein
fibaro:sleep(3*1000);
fibaro:call(35, "turnOff");
end
fibaro:sleep(60*1000);
fibaro:setGlobal("Klingel", "Inaktiv");
fibaro:debug('Klingel Inaktiv - Variable gesetzt');
fibaro:call(35, "turnOff");
fibaro:debug('Licht wieder aus');
end
Hey,
in der do-while Schleife ist die bedingung Klingel == Aktiv. Diese wird zumindest in deinem Script nicht in der schleife angefasst. Die Globale Variable wird sich also niemals ändern und die Schleife läuft ewig. Gibt es noch einen 2. Teil des Scripts?
Ich hoffe, das hilft dir weiter,
Gruß
Daniel
Hallo Daniel, dann habe ich einen Denkfehler.
Der Plan ist das blinken zu lassen solange die Variable Klingel auf Aktiv steht.
Diese Variable soll 1min auf Aktiv stehen und dann auf Inaktiv gesetzt werden.
Muß also der untere Schlafbefehl mit Variablenänderung mit in die While Schleife rein?
Das kommt alles davon das ich mir das noch aus Einzelbefehlen zusammenstümper und nicht durchdacht programmiere.
Zum Licht an sich bin ich einen Schritt weiter. Das blinkt nämlich sehr wohl wie es soll. In der Anzeige im HC2. Nicht real.
Es wird also tatsächlich von der Lichtsteuerung überstimmt und muss dort als extra func eingebaut werden.
Gruß Carsten
Also aktuell blinkt das licht ewig lang. es sei denn, dieses script überlappt sich etc. aber das sind schon wieder nicht vorhersehbare Ereignisse - wollen wir eigentlich nicht!
Mal als kleine Übungsaufgabe:
--[[
%% properties
%% globals
--]]
local var = 0 --var initialisieren
while true do --schleife hat kein Ende
var = var+1 --Variable 1 erhöhen
fibaro:debug(var) --Aktuellen wert ausgeben
if var == 5 then --prüfen ob var 5 ist
break --wenn ja, dann break. while schleife wird abgebrochen.
end
fibaro:sleep(1000)
end --hier geht es nach "break" weiter
fibaro:debug("ende")
Hier siehst du, wie es mit der Schleife funktionieren müsste. Bei dir läuft die Schleife mit einer 1 sec pause durch, eine Variable müsste also einfach auf 60 gezählt werden (wenn wir die minimale zeit der Befehle in der Schleife vernachlässigen). Du kannst die Variable genauso im kopf der do while schleife prüfen. Das Bsp. von mir ist nur eine alternative.
Edit: was die Lichtsteuerung macht, weiß ich leider nicht. Ich programmiere mir die sSchen selbst. Aber normalerweise sollte es nichts überstimmen, das wäre nicht besonders cool.
Grüße
Hut ab Daniel, das hat mir jetzt lerntechnisch mehr gebracht als wenn Du mir die Lösung vorgesagt hättest.
Du hast jetzt eine lokale Variable genommen. Ich auch. Wenn andere Szenen davon abhängig sind, brauche ich aber eine globale Variable, richtig?
Fertig:
--[[
%% properties
62 value --Fenstersensor
%% globals
--]]
local startSource = fibaro:getSourceTrigger();
local Klingel = 0
if ( ( tonumber(fibaro:getValue(62, "value")) > 0 ) or startSource["type"] == "other") then
fibaro:call(9, "sendPush", "Klingel");
fibaro:debug('Klingel');
while true do
Klingel = Klingel+1
fibaro:debug(Klingel)
fibaro:call(35, "setColor", "255","0","0","0"); -- setzte Licht Flur auf rot
fibaro:call(35, "turnOn"); -- schalte Licht flur ein
fibaro:sleep(3*1000);
fibaro:call(35, "turnOff");
if Klingel == 10 then
break
fibaro:sleep(1000)
end
end
fibaro:call(35, "turnOff");
fibaro:debug('Licht wieder aus');
end
Ich habe oben gefragt, denn es hätte ja sein können du hast eine 2. Szene parallel laufen, welche sich um die globale Variable kümmert. Das führt bei mir persönlich zwar auch zu Verwirrung, aber ein Lösungsansatz wäre es genauso. Wenn also eine 2. Szene deine Variable “Klingel” ändern würde, gibt es genauso die Chance die Schleife zu verlassen. Ich hoffe, auch das leuchtet ein^^
Ach und das sleep nach break ist überflüssig. bei break ist wirklich schluss und er springt ans ende der whileschleife. nicht manchmal, sondern IMMER
Grüße
Danke Daniel. Ich habe das gesäubert und setze zusätzlich die globale Variable weil das eben speziell bei mir in der Lichtszene bei xtraLightTriggerChecks eingetragen werden sollte. Das hat Chris hier beschrieben.
Schön, dass es jetzt funktioniert. Ja gerade bei Licht sind globale Variablen recht sinnvoll. Ich habe auch selbst eine Variable, die zumindest Grob meine Beleuchtung im Raum angibt (in 3 Stufen).
Grüße