Heizungspumpe an/aus brauche Hilfe

Ich habe eine Heizungstherme mit einem Raumthermostat 24h Analoguhr und Bimettal…Die Uhr ist schon defekt. Dazu besitze ich 6 Raumthermostate von Popp und nutze die Raumregelung vom HC2 incl. des Lua-Zusatzskript für offene Fenster. Derzeit habe ich zu der Raumregelung noch zwei grafische Szenen, die das Raumthermostat (ist ja halb defekt) wie eine Wochenzeitschaltuhr (über ein Fibaro FGS-222) schalten. Jetzt wo es wärmer wird regeln zwar die Ventile in den Räumen runter, aber die Heizungspumpe läuft, wenn ich nicht von Hand eingreife. Über eine grafische Szene ist mir noch nichts eingefallen um dem entgegenwirken zu können, weil ich da nicht meine Gedanke verwirklichen kann und Lua kann ich nicht…leider.
Ich hatte mir gedacht, wenn Raumfühler1 >= dem Raumthermostat1 und wenn Raumfühler2 >= dem Raumthermostat2 ist usw. bis Thermostat 6, dann soll die Heizungspumpe aus gehen, wenn nicht soll sie angehen.

Was ich jetzt noch bemerken muss… mein Thermostat nutz einen Öffner (Kontakt offen…Pumpe ein)

Das sind meine Gedanken:

if fibaro:getValue(46, “value”) >= fibaro:getValue(45, “value”) and --Thermostat Kinderzimmer
if fibaro:getValue(49, “value”) >= fibaro:getValue(48, “value”) and --Thermostat Badezimmer oben
if fibaro:getValue(52, “value”) >= fibaro:getValue(51, “value”) and --Thermostat Esszimmer
if fibaro:getValue(55, “value”) >= fibaro:getValue(54, “value”) and --Thermostat Wohnzimmer
if fibaro:getValue(58, “value”) >= fibaro:getValue(57, “value”) and --Thermostat Schlafzimmer
if fibaro:getValue(61, “value”) >= fibaro:getValue(60, “value”) then --Thermostat Badezimmer unten
fibaro:call(41, “turnOn”) – Heizungspumpe aus (arbeitet mit einem Öffner)
else
fibaro:call(41, “turnOff”) – Heizungspumpe an
end

Was muss ich beachten, dass ich das zum laufen bekomme?

Ich danke und hoffe auf Hilfe… Sven

Hi,

mach doch erstmal eine Blockszene und wandel diese dann in LUA um. Dann hast du die Basis, welche du erweitern kannst. Du solltest hier mit einer if/elseif-Abfrage arbeiten.

Gruß

Guten Morgen;

mein Skript macht jetzt schon in etwa was es soll, nur fehlt mir eine Schleife, dass nach dem ausschalten nicht jede Sekunde wieder ausgeschaltet wird…vielleicht kannst du die da einbauen ? Hatte mir 3 Minuten vorgestellt, wie in Zeile 30 zu sehen ist, was so aber nicht funktioniert :confused:

(Habe mein Script mal an gehangen…)

Der Anhang will wohl nicht…wie setze ich ein Lua-Script hier rein?

–[[
%% properties
46 value
49 value
52 value
55 value
58 value
61 value
%% globals
–]]

if fibaro:getValue(46, “value”) >= fibaro:getValue(45, “value”) and --Thermostat Kinderzimmer
fibaro:getValue(49, “value”) >= fibaro:getValue(48, “value”) and --Thermostat Badezimmer oben
fibaro:getValue(52, “value”) >= fibaro:getValue(51, “value”) and --Thermostat Esszimmer
fibaro:getValue(55, “value”) >= fibaro:getValue(54, “value”) and --Thermostat Wohnzimmer
fibaro:getValue(58, “value”) >= fibaro:getValue(57, “value”) and --Thermostat Schlafzimmer
fibaro:getValue(61, “value”) >= fibaro:getValue(60, “value”) then --Thermostat Badezimmer unten

fibaro:debug( 'Kinderzimmertemperatur ist mit ' .. fibaro:getValue(46,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(45,  "value" ) .. ' Grad' ) 
fibaro:debug( 'Badezimmertemperatur oben ist mit ' .. fibaro:getValue(49,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(48,  "value" ) .. ' Grad' ) 
fibaro:debug( 'Esszimmertemperatur ist mit ' .. fibaro:getValue(52,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(51,  "value" ) .. ' Grad' )
fibaro:debug( 'Wohnzimmertemperatur ist mit ' .. fibaro:getValue(55,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(54,  "value" ) .. ' Grad' )
fibaro:debug( 'Schlafzimmertemperatur ist mit ' .. fibaro:getValue(58,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(57,  "value" ) .. ' Grad' )
fibaro:debug( 'Badezimmertemperatur unten ist mit ' .. fibaro:getValue(61,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(60,  "value" ) .. ' Grad' )

fibaro:debug( 'Schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=ein und somit die Pumpe auf aus !' )

fibaro:call(41, "turnOn")  -- Heizungspumpe aus (arbeitet mit einem Öffner)
--fibaro:sleep(180000) -- in Millisekunden 180000 = 3 min

else
fibaro:call(41, “turnOff”) – Heizungspumpe an
fibaro:debug( 'schaltet Hauptthermostat ’ … fibaro:getValue(41, “value” ) … ‘=aus’ )

end

Ich sehe hier keinen Grund für eine Schleife… es sollten eher die Trigger angepasst werden und möglicherweise zusätzliche Instanzen verhindert werden.

Gruß

Guten Morgen…dann verrate mir doch bitte, wie ich zusätzliche Instanzen verhindere! Mit den Triggern meinst du…

–[[
%% properties
46 value
49 value
52 value
55 value
58 value
61 value
%% globals
–]]
???
Das sind die Istwerte und sobald einer kleiner oder gleich dem Sollwert, soll ein Schaltmodul eingeschaltet werden…

sag mir bitte auch, wie ich ein Luascript anständig posten kann und was der Unterschied ifelse und else in meinem Script wäre…ich danke dir

Hi,
Oberhalb dieser Textbox findest du einen “Code” Button.
Den erst drücken, Script einfügen, Button erneut drücken.

Viele Grüße Hoggle

Ja, das sind die Trigger

Else wird immer dann ausgeführt, wenn if oder ifelse nicht zutreffen.
ifelse hat eine Bedingung, als weitere Ergänzung zu if

Ich danke für die schnelle Antwort und wie verhindere ich “zusätzliche Instanzen” was boomx meinte?

local instances = tonumber(fibaro:countScenes())
if (instances > 1) then fibaro:abort(); end

^^ Dann sollte das mit dem fibaro:sleep laufen, wobei ich immer noch nicht den Sinn dahinter sehe. Warum schaltet es nach ein paar Sekunden wieder aus? Das klingt für mich nach einer zu schnellen Übermittlung neuer Werte.

Zusätzliche Instanzen kannst verhindern wenn du das Sleep rausnimmst.
Kannst eine globale Variable mit dem Timestamp des Ausschaltens setzen.
Danach kannst am Anfang des Codes abfragen wie lange die Pumpe aus ist.
Würde empfehlen dass du eine Hysterese einfügst damit die Pumpe nicht ständig aus und einSchaltet.
z.B. heizt 0,5° über Solltemperatur und schaltet nach unterschreiten der Solltemperatur wieder ein.
Musst wahrscheinlich etwas experimentieren bis du den richtigen Schwellwert gefunden hast.

Danke schön!

Das ist es ja…eine Heizung arbeitet nicht schnell, von daher möchte ich ja eine Pause von 3-5 Minuten da einbauen. Mein Script schaut die ganze Zeit nach, ob der Istwert dem Sollwert entspricht, und das bei allen Heizkörpern, welche sich ja selber regeln. Damit die Heizungspumpe nicht 24h durchläuft, bzw. nur durch einen Maximal-Temperatur-Begrenzer gestoppt wird, schalte ich die Pumpe, per Modul (Id41) aus. Irgendwann fällt dann eine von den 6 Soll-Temperaturen und die Pumpe springt an. die Pumpe schickt 70-80 Grad heißes Wasser durch das System, so dass das Raumthermostat irgend wann sagt, dass es warm genug ist…da das aber alles so träge ist, steigt der Raum Sollwert auch nach dem Abschalten der Pumpe noch weiterhin. Von daher darf die Pumpe sofort ausgeschaltet werden, sobald der Sollwert erst mal erreicht ist und auch sofort wieder einschalten, wenn es unter diesen Wert fällt, weil da garantiert 5-20 Minuten dazwischen vergehen (je nach Außentemperatur(je kühler je schneller) und Menschen(je mehr je langsamer) in der Wohnung ist/sind.

Das ist wie beim Wasser kochen auf einem alten Herd mit Heizplatten. Du brauch unbedingt 60 Grad warmes Wasser Stellst einen Topf mit Wasser und Topfdeckel auf die Platte und stellst den Herd an. Bei genau 60 Grad auf dem Thermometer stellst du den Herd aus…Du wirst bemerken, das das Thermometer über 60 Grad geht und trotz des auschaltens das Wasser noch ne gewisse Zeit die 60 Grad hat, weil die Herdplatte erstens die Wärme ein wenig speichert, genau wie der Topfboden und ein Thermometer auch träge arbeitet.

Ich danke euch für die Hilfe und hoffe, dass meine ihr meinen Gedanken versteht…vielleicht jetzt Verbesserungen und Optimierungen seht, aber daran denkt, dass ich mit Lua ein vollkommener Anfänger bin :slight_smile: Werde jetzt erst mal die beiden Zeilen von boomx einbauen und schauen was passiert…Grüße Sven

Mein Script schaut die ganze Zeit nach

Nein, das macht das Skript nicht. Das Skript läuft nur, wenn sich der Wert eines Triggers verändert. Verändert sich dieser Wert nicht, dann läuft das Skript auch nicht. ^^

die Trigger sind ja die Raumfühler (und ich muss jeden abfragen), und die ändern sich andauernd, auch wenn es nur 0,1 Grad sind. Und bei 6 Raumfühlern ist die Chance sehr hoch, dass einer davon sich ändert.
So läuft das Programm auch, nur wird halt ca. alle 30 Sekunden getriggert. Entweder muss ich es schaffen aus den Messwerten z.B. 16,76 Grad eine ganze Zahl mache oder auch meiner “IF” Abfragung sage (IF “Messwert” minus 1 >= “Sollwert”, dann schalte ein)

Verstehe schon dass das System träge ist, aber bei 6 Thermostaten ist die Chance groß dass eins schon abgeriegelt hat und kurz vor dem unterschreiten ist.
Macht wahrscheinlich wenig Sinn die Pumpe alle 5 Minuten ab und wieder an zu schalten. (Lebensdauer der Pumpe versus Einsparung)
Das zu optimieren ist wahrscheinlich aufwendiger.

Doch, das macht Sinn…vorher war nur ein Raumthermostat da, was genau das selbe gemacht hat, bis darauf, dass der Raum in dem es war warm war und andere Räume kalt blieben. Jetzt werden alle Räume betrachtet. Dazu muss man sagen, das vorher alle Räume ein Standartthermostat hatten und die Heizung in dem Raum mit dem Raumthermostat nur ein Absperrventil. Alleine durch die Popp-Ventile und Fibaro-Fensterkontakte konnte ich den Gasverbrauch sehr verringern. Jetzt kommt der Stromverbrauch dran.

--[[
%% properties
58 value
61 value
43 value
%% globals
Jahreszeit
--]]
     
SollwertKind	= fibaro:getValue(45, "value")	--Thermostat Kinderzimmer
IstwertKind		= fibaro:getValue(46, "value")	--Thermostat Kinderzimmer
SollwertBad		= fibaro:getValue(48, "value")	--Thermostat Badezimmer oben
IstwertBad		= fibaro:getValue(49, "value")	--Thermostat Badezimmer oben
SollwertEZ		= fibaro:getValue(51, "value")	--Thermostat Esszimmer
IstwertEZ		= fibaro:getValue(52, "value")	--Thermostat Esszimmer
SollwertWZ		= fibaro:getValue(54, "value")	--Thermostat Wohnzimmer
IstwertWZ		= fibaro:getValue(55, "value")	--Thermostat Wohnzimmer
SollwertSZ		= fibaro:getValue(57, "value")	--Thermostat Schlafzimmer
IstwertSZ		= fibaro:getValue(58, "value")	--Thermostat Schlafzimmer
SollwertWC		= fibaro:getValue(60, "value")	--Thermostat Badezimmer unten
IstwertWC		= fibaro:getValue(61, "value")	--Thermostat Badezimmer unten
SollwertWR		= fibaro:getValue(63, "value")	--Thermostat Werkraum
IstwertWR		= fibaro:getValue(118, "value")	--Fenster Werkraum 

function Debug( color, message )
 fibaro:debug(string.format('<%s style="color:%s;">%s<!--%s-->', "span", color, message, "span"));
end
    
	if (fibaro:getGlobalValue("Jahreszeit") == "Sommer") then
		if (tonumber(IstwertKind)	+2 >= tonumber(SollwertKind)	and
      		tonumber(IstwertBad) 	+2 >= tonumber(SollwertBad) 	and
			tonumber(IstwertEZ)		+2 >= tonumber(SollwertEZ) 		and
			tonumber(IstwertWZ)		+2 >= tonumber(SollwertWZ)	 	and
    		tonumber(IstwertSZ)		+2 >= tonumber(SollwertSZ)		and		
    		tonumber(IstwertWC)		+2 >= tonumber(SollwertWC))		then
      		
			fibaro:call(41, "turnOn")  -- Heizungspumpe aus (arbeitet mit einem Öffner)
    		fibaro:sleep(1*1000)
			Debug("yellow",'Heizung steht auf Sommermodus, Fahre Heizung runter.')
			fibaro:debug( 'Schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=ein und somit die Pumpe auf aus !' )
		else
			fibaro:call(41, "turnOff") -- Heizungspumpe an
    		fibaro:sleep(1*1000)
			Debug("green",'Heizung steht auf Sommer, aber Raumtemperatur zu kalt.')
			fibaro:debug( 'schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=aus und die Heizungspumpe ein !' )
		end  
	elseif (fibaro:getGlobalValue("Jahreszeit") == "Winter") then
----
		if (tonumber(IstwertKind)	-0.5	>= tonumber(SollwertKind)	and
      		tonumber(IstwertBad) 	-0.5	>= tonumber(SollwertBad) 	and
			tonumber(IstwertEZ)		-0.5	>= tonumber(SollwertEZ) 	and
			tonumber(IstwertWZ)		-0.5	>= tonumber(SollwertWZ)	 	and
    		tonumber(IstwertSZ)		-0.5	>= tonumber(SollwertSZ)		and		
    		tonumber(IstwertWC)		-0.5	>= tonumber(SollwertWC))	then
   
			fibaro:call(41, "turnOn")  -- Heizungspumpe aus (arbeitet mit einem Öffner)
			fibaro:sleep(1*1000)
    		fibaro:debug( 'Kinderzimmertemperatur ist mit ' 	.. fibaro:getValue(46,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(45,  "value" ) .. ' Grad' ) 
			fibaro:debug( 'Badezimmertemperatur oben ist mit ' 	.. fibaro:getValue(49,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(48,  "value" ) .. ' Grad' ) 
			fibaro:debug( 'Esszimmertemperatur ist mit ' 		.. fibaro:getValue(52,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(51,  "value" ) .. ' Grad' )
			fibaro:debug( 'Wohnzimmertemperatur ist mit ' 		.. fibaro:getValue(55,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(54,  "value" ) .. ' Grad' )
			fibaro:debug( 'Schlafzimmertemperatur ist mit ' 	.. fibaro:getValue(58,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(57,  "value" ) .. ' Grad' )
			fibaro:debug( 'Badezimmertemperatur unten ist mit ' .. fibaro:getValue(61,  "value" ) .. ' Grad groesser als Raumsollwert mit ' .. fibaro:getValue(60,  "value" ) .. ' Grad' )
			Debug("orange", 'Heizung steht auf Wintermodus.')
			fibaro:debug( 'Schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=ein und somit die Pumpe auf aus, da es warm genug ist !' )
      
		else
			fibaro:call(41, "turnOff") -- Heizungspumpe an
    		fibaro:sleep(1*1000)
			Debug("red",'Heizung steht auf Wintermodus')
			fibaro:debug( 'schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=aus und somit die Heizungspumpe ein !' )
		
		end  

	else
  		if (tonumber(IstwertKind)	>= tonumber(SollwertKind)	and
      		tonumber(IstwertBad) 	>= tonumber(SollwertBad) 	and
			tonumber(IstwertEZ)		>= tonumber(SollwertEZ) 	and
			tonumber(IstwertWZ)		>= tonumber(SollwertWZ)	 	and
    		tonumber(IstwertSZ)		>= tonumber(SollwertSZ)		and		
    		tonumber(IstwertWC)		>= tonumber(SollwertWC))	then
      		
			fibaro:call(41, "turnOn")  -- Heizungspumpe aus (arbeitet mit einem Öffner)
    		fibaro:sleep(1*1000)
			Debug("cyan",'Heizung steht auf Herbst/Frühlings-Modus,')
			fibaro:debug( 'Schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=ein und somit die Pumpe auf aus !' )
		else
			fibaro:call(41, "turnOff") -- Heizungspumpe an
    		fibaro:sleep(1*1000)
			Debug("magenta",'Heizung steht auf Herbst/Frühlings-Modus,')
			fibaro:debug( 'schaltet Hauptthermostat ' .. fibaro:getValue(41,  "value" ) .. '=aus und die Heizungspumpe ein !' )
		end  
	end

Das ist bei mir jetzt erst mal raus gekommen…Es gibt noch “Sommer”, “Winter”, “Herbst” und “Frühling” als Variablen, wobei Herbst und Frühling gleich sind ID43 nutze ich als Testtrigger “Winter und Herbst/Frühling” Umschalter…Sommer schaltet bei Außentemperatur von >= 18 Grad selbsttätig…gibts noch Ideen oder Verbesserungen…und immer daran denken, dass ich Anfänger bin :confused: