Klingel Steuerung

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. :frowning:

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 :wink:

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