Kamintemperatur Überwachung

Hallo,
ich habe folgendes Problem.
ich habe einen Kamin in meiner Wohnung wenn dieser an=heiß ist (Temperaturüberwachung, Sensor B03KaminTemp >30°C) soll eine bestimmte Szene (Szene 1 = alle Lüfter aus) gestartet werden. Diese schaltet dann meine WC-Ablüfter so aus das sie manuell nicht mehr eingeschaltet werden können. Das stellt kein Problem dar.
Das Problem ist nun folgendes. Ich möchte durch eine Schleife dauernd (alle 5 min) die Temperatur (B03KaminTemp <30°C) prüfen damit irgendwann wieder die Lüfter einzuschalten sind (Szene 2 alles an). Innerhalb dieser Schleife sollen noch zwei weitere Oder-Funktionen geprüft werden.

  1. Wurde ein zweiter Kamintemperaturwächter (B01KW = off bzw. = heiß) geschaltet dann Szene 1 starten
  2. Wurde der Kamin manuell heiß geschaltet (Variable: B03KaminManu = heiß) dann Szene 1 starten
    Die Abbruchfunktion wäre dann wenn der Sensor B03KaminTemp <30°C ist und der zweite Kamintemperaturwächter (B01KW = on bzw. = kalt) ist. Dann Starte die Szene 2 (alle Lüfter an).
    Die beiden Szenen dürfen nie gleichzeitig laufen.
    Ich habe das bis jetzt mit sehr vielen grafischen Szenen umgesetzt, dabei verliert man aber leider sehr schnell den Überblick und es funktioniert mal und mal nicht.
    Daher will ich alle grafischen Szenen löschen und eine saubere LUA Szene schreiben.
    Leider fehlt mir das nötige Programmierwissen oder meine LUA Skripte die ich schon aus den Forum habe sind nicht adaptierbar. Habt Ihr vielleicht einen kleinen Hinweis für mich wie die Struktur der if Schleifen sein muss?
    Ich hoffe das ich dann den Rest von alleine hinbekomme.
    Anbei noch ein Programmablaufplan wie ich mir die Sache vorstelle.
    Die große Frage dabei ist wie ich nach dem Start der Szenen die einzelnen if Schleifen wiederholen kann oder überhaupt muss?
    Vielen Dank für jede Hilfe!

Hier noch mein LUA Versuch:


--[[
%% properties
300 value
463 value
458 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 		( tonumber(fibaro:getValue(300, "value")) <= 30)  --Kamintemp = B03KT--
   
		and
 		( tonumber(fibaro:getValue(463, "value")) > 0 ) --Kaminwächter B01 = B01KW--
		
    	or
		startSource["type"] == "other"
		)
		then
		fibaro:startScene(109); --Szene2 == Kamin_aus_neu = kalt --
  	   	fibaro:debug("withe",'Der Kamin B03/B01 ist kalt!');
  		
	elseif (
    	( tonumber(fibaro:getValue(300, "value")) >= 30)  --Kamintemp = B03KT--
    	or
    	( tonumber(fibaro:getValue(463, "value")) == 0 ) --Kaminwächter B01 = B01KW--
    	or
    	( tonumber(fibaro:getValue(458, "value")) > 0 ) )--Kaminschalter manuell an = B03_Kamin_manu--
    	then
    	fibaro:startScene(108); --Szene1 == Kamin_an_neu = heiß --
  		--fibaro:debug("red",'Der Kamin B03/B01 ist an! Schalte alle Lüfter ab !');
	)	
  	
 
end

IMG_6670.jpg

Setze einfach eine globale Variable wenn Kamin ein erkannt wird.
Wenn Temperatur kleiner 30 ist und Variable gesetzt dann deaktiviere die Kaminsteuerung.

Du hast in Zeile 27 und 14 jeweils ein =. Eines ist Zuviel.

Da Dein Tempsensor (300) mit jeder Tempänderung das Script triggert, brauchst du eigentlich keine Schleife.
Wie sind die Para des Sensors zur Tempübermittlung eingestellt?
Dein Script wird auch durch die anderen Module getriggert. Soll das sein?

Hallo und Danke für die Tips. Trotzdem funktioniert es trotzdem noch nicht.
Ich habe das Script auch noch etwas angepasst da es immer so sein muss das sobald der Manuelle Schalter gesetzt ist die Lüftung aus gehen muß.
Daher meine Überlegung das ich eine Schleife benötige und die MAuelle Steuerung als erstes überprüft werden muß.

Die Lösung mit der globalen Variable hatte ich. Es hat auch einigermaßen funktioniert. Nur es war sehr unübersichtlich und ich hatte das Gefühl das die Schaltung mal an oder aus.

“Dein Script wird auch durch die anderen Module getriggert. Soll das sein?” Woran sehe ich das?

Para des FUS:
P5 = 255
P6 = 255
P10 und P11 = 61s
P12 =0,06°C

--[[
%% properties
300 value
463 value
458 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if   	tonumber(fibaro:getValue(458, "value")) > 0  --Kaminschalter manuell an = B03_Kamin_manu--
  		then fibaro:startScene(108); --Szene1 == Kamin_an_neu = heiß --
  elseif
   		(
    	( tonumber(fibaro:getValue(300, "value")) < 30)  --Kamintemp = B03KT--
   		and
 		( tonumber(fibaro:getValue(463, "value")) > 0 )) --Kaminwächter B01 = B01KW--
		--or
		--startSource["type"] == "other"
		then
		fibaro:startScene(109); --Szene2 == Kamin_aus_neu = kalt --
  	   	--fibaro:debug("withe",'Der Kamin B03/B01 ist kalt!');
    	
  	else 
    	(( tonumber(fibaro:getValue(300, "value")) > 30)  --Kamintemp = B03KT--
    	or
    	( tonumber(fibaro:getValue(463, "value")) == 0 )) --Kaminwächter B01 = B01KW--
    	then  
  		fibaro:startScene(108); --Szene1 == Kamin_an_neu = heiß --
  		--fibaro:debug("red",'Der Kamin B03/B01 ist an! Schalte alle Lüfter ab !');	
 		
  end

Ich finde den Syntax Fehler leider nicht.
Fibaro sagt:
[DEBUG] 16:15:23: line 29: syntax error near ‘then’

Wie kann ich das korrigieren?

Vielen Dank für eure Hilfe

Im Header stehen die Geräte, die das Script triggern.
DA das bei Dir nur per Temp sein soll, lösche in Zeile 4, 5 :

463 value
458 value

else in Zeile 25 benötigt kein then
Das else soll sicherlich elseif sein

Danke für die Korrektur! Jetzt funktioniert es! :slight_smile:
Aber auch der Schalter 463 und 458 sollen doch die Szene (Kamin aus) auslösen. Deshalb habe ich die oben drin stehen.

dann starte doch deine “Kamin aus” Szene direkt durch die Schalter, bzw baue sie dort in die Header ein.