Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Allgemeine Fragen zum Thema Hausautomation bei Neubau und Renovierung, die (noch) nicht produktspezifisch sind

Moderator: Co-Administratoren

Antworten
hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von hirrsson » 20.07.2020, 09:37

Hallo,

ich möchte mein Projekt ”Heizungsbedarf“ vorstellen. Bitte beachte, dass ich Deutsch nur ein paar wenige Jahre gesprochen habe – für meinem Grammatik bitte ich um Entschuldigung!

So: Mein Script „Heizungsbedarf überprüfen“ läuft seit 5 Monate Fehlerfrei bei mir…

Umgebung:
Wie viele von uns, habe ich eine Gastherme im Keller. Diese wird von einem Thermostat im Wohnzimmer gesteuert. Falls Wohnzimmer zu kalt ist, wird der Therme angeschaltet.
Ich möchte aber der Heizungsbedarf in jedes Zimmer überprüfen und der Wohnzimmerthermostat steuern mit dem Ergebnis. Ergo: Falls Wohnzimmer zu warm ist, aber Schlafzimmer nicht, dann schalte trotzdem der Gastherme an

Da ich kein super Script hier im Forum gefunden habe, habe ich ein bissen zusammengeklaut und gebastelt. Danke Forum!!!!!

Ein paar Monate habe ich auch der Temperatur im Zimmer überprüft, bin aber zurück auf nur „Ventil“ überprüfen. Funktioniert bei mir besser, gerade da ich leider kein Thermostat in jedes Zimmer habe. Falls man es haben will, kann man einfach die die „IF-Abfrage“ ändern.

Mein Setup:
- Thermostat Junkers TR-200 im Wohnzimmer
- überall Heizkörperthermostate HMIP-eTRV-2 oder HMIP-eTRV-C
- Gewerk „Heizung“ (alle HK aber auch Thermostate) Geräte
- SV: „HeizungGastherme“ .Ein Boolean der entweder der Thermostat im Wohnzimmer auf „an“ oder „aus“ schaltet
- SV: „Telegram“. Verschickt ein Telegram msg. War praktisch um zu schauen wann die Heizung in welches Zimmer gebraucht war.
- SV: "HeizungsLog" (als text). hier wird der "Log" gespeichert, damit ich es auf dem Handy schauen kann.

1) Thermostat vorbereiten:
Hier bin ich super froh, dass ich hier eine Anleitung gefunden habe. Dank dieser Anleitung, konnte ich endlich mein Projekt starten!
viewtopic.php?f=79&t=54380
Der HmIP-PCBS wird mit dem SV: HeizungGastherme gesteuert.
Bei false, geht der Thermostat auf „Abend/Nacht“ Modus (Eingestellt: 17 Grad am Thermostat).
Bei true, geht der Thermsotat auf „Tagestemeratur“ (Eingestellt: 23 Grad am Thermostat).
=> somit kann ich meine Gastherme im Keller kontrollieren.

2) SV „HeizungGastherme“ als Boolean anlegen und "HeizungsLog" als Text.

3) Programm 1. Anlegen Name: Heizung Gasheizung an aus via Thermometer.
Dieses Programm überprüft der SV „HeizungGastherme“ und schaltet der HmIP-PCBS entweder an/aus. Sehr simpel
2020-07-20_09-13-19.jpg
4) Programm 2. Anlegen Name „Heizungsbedarf überprüfen“.
Wird jede 5e Minute ausgeführt mit diesem Script:

Code: Alles auswählen

! Überprüft jede Heizkörper auf Temperatur (ist + soll) und Ventilöffnung. Falls notwendig, Heizung an/aus stellen

boolean sendTelegram = false;
string telegramMessage = "";
string messageTextForOn = "";
string messageTextForOff = "";

! Variablen initialisieren. 
!Setzte das richtige Gewerk, um alle Devices holen zu können
var myAssembly = dom.GetObject("Heizung");

!Hole Zustand von Gastherme 
boolean zustandGastherme = dom.GetObject("HeizungGastherme").Value();
string itemID;

!Möglichkeit einen Toleranz für temperatur zu setzen
real toleanz_Temperatur = 0;
boolean heizungWirdGebraucht = false;

telegramMessage = "Gastherme ist: " # zustandGastherme # "\n";

! Hole das Gewerk Durch alle angemeldeten Geräte iterieren
foreach(itemID, myAssembly.EnumUsedIDs()) {
    ! Gerätedetails & Schnittstelle holen
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());
	if ( (device.HssType() == "HmIP-eTRV-2") || (device.HssType() == "HmIP-eTRV-C" ) ) {
		! Interface, Name, Adresse und Kanal auslesen
		var interface = dom.GetObject(item.Interface());
		string interface_name = interface.Name();
		string device_address = device.Address();
		device_address = device_address.StrValueByIndex(":", 0);

		!Get the wanted values from each device!
		string channel_name = interface_name # "." # device_address # ":1.ACTUAL_TEMPERATURE";
		integer actualTemperatur = dom.GetObject(channel_name).Value();
		
		channel_name = interface_name # "." # device_address # ":1.SET_POINT_TEMPERATURE";
		integer wantedTemperatur = dom.GetObject(channel_name).Value();
		
		channel_name = interface_name # "." # device_address # ":1.LEVEL";
		integer valvePosition = dom.GetObject(channel_name).Value();

!		var room = dom.GetObject(item.ChnRoom()); room.Name()


		!Check if Heizung gebraucht wird (entweder Ventil, Temperatur oder beide)
!		if ( actualTemperatur < (wantedTemperatur - toleanz_Temperatur)) {
		if ( valvePosition > 0.100000 ) {
			heizungWirdGebraucht = true;
			messageTextForOn = messageTextForOn # "An: " # item.Name() # ". \n - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # "\n";
			
!		}elseif (actualTemperatur > (wantedTemperatur - toleanz_Temperatur)) {
		}elseif ( valvePosition < 0.100000 ) {
				messageTextForOff = messageTextForOff # "Aus: " # item.Name() # ". \n - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # "\n";
		}		
	}
}

! Get Timestamp wenn die Heizung zu letzt geändert wurde und Timestamp jetzt
time timeStampHeizungNotwendig = dom.GetObject("HeizungGastherme").Timestamp();
time zeitJetzt = system.Date('%F %T').ToTime();

telegramMessage = telegramMessage # "Zeit jetzt: " # zeitJetzt # "\n" # "Gastherme update um: " # timeStampHeizungNotwendig # "\n\n";

!300 sek (5 min) hinzufügen um sicherzustellen, dass die Heizung nicht immer an/aus geht
timeStampHeizungNotwendig = timeStampHeizungNotwendig+280;

!Ueperpruefen ob die Heizung geändert werden muss (und kann wegen der last change)
if(zeitJetzt.ToInteger() > timeStampHeizungNotwendig.ToInteger()) {
		if ( heizungWirdGebraucht != zustandGastherme ) {
			dom.GetObject("HeizungGastherme").State( !zustandGastherme );
			
			telegramMessage = telegramMessage # "Zeit ok, status Heizung ändern zu: " # !zustandGastherme;
			telegramMessage = telegramMessage + "\n";
		}else {
			sendTelegram = false;
		}
}else {
	sendTelegram = false;
}


!telegramMessage = telegramMessage # messageTextForOn # "\n" # messageTextForOff;

!Speichere der log in einem Systemvariable
dom.GetObject("HeizungsLog").State(telegramMessage # messageTextForOn # "\n" # messageTextForOff);

if (sendTelegram){
	dom.GetObject("Telegram").State(telegramMessage # messageTextForOn);
}

Es überprüft ob ein Zimmer „Heizungsbedarf“ hat. Überprüft aber auch, ob ich die letzte 5 Minuten die Heizung an-/ausgestellt habe (ich will sicherstellen, dass meine Gastherme nicht ständig an/aus geht).

Ich werde versuchen die Fragen, so gut wie möglich, zu beantworten (Zeitfaktor mit 3 Kinder!).
Ich bitte aktiv um Verbesserungsvorschläge. Man kann es bestimmt besser machen!

Vielen Dank vorab,

Benutzeravatar
Sanweb
Beiträge: 57
Registriert: 11.08.2020, 09:50
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 5 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von Sanweb » 19.08.2020, 12:55

Hallo,

ich verstehe das nicht so ganz mit den zeitllichen Abläufen im 4. Schritt:
Es soll ein Programm angelegt werden, das alle 5 Minuten ein Script ausführt um den Heizungsbedarf zu prüfen. Innerhalb des Scriptes widerum prüfst Du per Timestamp den Eintrag der SV "HeizungGastherme" und das Script entscheidet dann, wenn der letzte Eintrag älter ist als 280 Sekunden, das die Heizung eingeschaltet werden darf (wenn eine Anforderung durch ein Heizkörperthermostat vorliegt) oder nicht.

Nehmen wir mal an, das Script wird alle 5 Minuten ausgeführt und es wird über das Script entschieden, ob die Gastherme ein oder ausgeschaltet wird, dann ist die zusätzliche Abfrage über den Timestamp (ob dieser älter als 280 Sekunden ist) doch unnötig, da der Timestamp nicht jünger als 5 Minuten (300 Sekunden) sein kann, da das Programm nur alle 5 Minuten ausgeführt wird und der HmIP-PCBS somit eh nur alle 5 Minuten das Wandthermostat schalten kann.

Man helfe mir bitte auf die Sprünge, wenn ich da etwas falsch sehen sollte ... :)

An Sich habe ich Deine beiden Projekte, jedoch mit einem anderen Heizungsscript, umgesetzt und funktioniert bisher tadellos. Bin mir aktuell aber noch nicht im klaren, ob ich die Heizperiode über den Status eines HmIP Schalters oder Aussenthermometers (oder gar über beiden) schalten soll ... Aktuell schalte ich sie über ein An/abwesenheits Programm (über Fritzbox) und Aussenthermometer.
Mein bescheidenes Homematic IP System:
270 Kanäle in 42 Geräten:
1x HM-ES-TX-WM, 5x HmIP-HEATING, 1x HM-PB-2-WM, 1x HmIP-CCU3, 1x HmIP-DSD-PCB, 5x HmIP-eTRV-2, 1x HmIP-FSI16, 1x HmIP-HAP, 1x HmIP-PCBS, 1x HmIP-PS-2, 1x HmIP-RCV-50, 4x HmIP-SCI, 1x HmIP-SLO, 2x HmIP-SPI, 5x HmIP-STHD, 1x HmIP-STHO-A, 2x HmIP-SWDO-I, 7x HmIP-SWDO-PL, 1x HmIP-WKP

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von hirrsson » 03.09.2020, 18:49

Sanweb hat geschrieben:
19.08.2020, 12:55


Man helfe mir bitte auf die Sprünge, wenn ich da etwas falsch sehen sollte ... :)
Hi

Ich habe es so , weil ich auch der Variable via tablet umstellen kann. Zb ich will jetzt die Heizung anschalten. Dann soll trotzdem die 5 min eingehalten werden.

Benutzeravatar
Sanweb
Beiträge: 57
Registriert: 11.08.2020, 09:50
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 5 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von Sanweb » 08.09.2020, 11:42

Den Teil, wo abgefragt wird, ob Heizungsbedarf besteht oder nicht, würde ich abändern auf

Code: Alles auswählen

		!Check if Heizung gebraucht wird (entweder Ventil, Temperatur oder beide)
		if (( actualTemperatur < (wantedTemperatur - toleanz_Temperatur)) && ( valvePosition <  0.100000 )) {
			heizungWirdGebraucht = true;
			
		}elseif ((actualTemperatur > (wantedTemperatur - toleanz_Temperatur)) || ( valvePosition >  0.100000 )) {

			heizungWirdGebraucht = false;
		}
Grund wäre für mich, das er Temperatur UND Ventilstellung prüfen soll, weil wenn das Stellwerk eines Thermostates defekt ist, er im ursprünglichen Script die Therme trotzdem einschalten würde. Nehmen wir an, ein Thermostat mit defektem Stellwerk benötigt nach dem alten Script Heizungsbedarf und alle anderen nicht, würde die Gastherme eingeschaltet werden und permanent Gas verbraucht, obwohl der Heizkörper nicht auf Temperatur kommt. Um dieses zu vermeiden, Könnte man die Ventilstellung gleich mal mit einbeziehen.

Hattest du in Deinem Script mittels doppelter Schleife mit integriert, jedoch die Ventilprüfung auskommentiert.

Mein aktuelles Heizungsscript sieht so aus:

Code: Alles auswählen

! Thermostate abfragen
! ----------------------------------------------------
object ThermostatWohnzimmer;
string sWohnzimmerRegler = "XXXXXXXXXXXXXX";
 
integer HzWohnzimmer=0;
integer HzSchlafzimmer=0;
integer HzBad=0;
integer HzKueche=0;
integer HzEsszimmer=0;

real toleanz_Temp = 0;

! ----------------------------------------------------
! Thermostat Wohnzimmer abfragen
! ----------------------------------------------------
! aktueller Istwert von HmIP-eTRV-2 ermitteln
object ThermostatWohnzimmer = dom.GetObject("HmIP-RF." # sWohnzimmerRegler # ":1.ACTUAL_TEMPERATURE");
real akt_TempWohnzimmer= ThermostatWohnzimmer.Value();

! Eingestellten Sollwert von HmIP-eTRV-2 ermitteln
object ThermostatWohnzimmer= dom.GetObject("HmIP-RF." # sWohnzimmerRegler # ":1.SET_POINT_TEMPERATURE");
real soll_TempWohnzimmer = ThermostatWohnzimmer.Value();

! Aktuelle Ventiloeffnung (%) von HmIP-eTRV-2 ermitteln
object ThermostatWohnzimmer = dom.GetObject("HmIP-RF." # sWohnzimmerRegler # ":1.LEVEL");
real akt_VentilWohnzimmer = ThermostatWohnzimmer.Value();

! ----------------------------------------------------
! Kontrolle ob Heizung benötigt
! ----------------------------------------------------
if ((akt_TempWohnzimmer > (soll_TempWohnzimmer - toleanz_Temp)) && (akt_VentilWohnzimmer <  0.100000 ))
{HzWohnzimmer=0; var LogWohnzimmer="Kein Heizbedarf im Wohnzimmer";}
if ((akt_TempWohnzimmer < (soll_TempWohnzimmer - toleanz_Temp)) || (akt_VentilWohnzimmer >  0.100000 ))
{HzWohnzimmer=1; var LogWohnzimmer="Heizbedarf im Wohnzimmer";}

! ----------------------------------------------------
! Thermostate Schlafzimmer abfragen
! ----------------------------------------------------
object ThermostatSchlafzimmer;
string sSchlafzimmerRegler = "XXXXXXXXXXXXXX";  

! aktueller Istwert von HmIP-eTRV-2 ermitteln
object ThermostatSchlafzimmer = dom.GetObject("HmIP-RF." # sSchlafzimmerRegler # ":1.ACTUAL_TEMPERATURE");
real akt_TempSchlafzimmer = ThermostatSchlafzimmer.Value();
string strAkt_TempSchlafzimmer = ThermostatSchlafzimmer.Value();

! Eingestellten Sollwert von HmIP-eTRV-2 ermitteln
object ThermostatSchlafzimmer = dom.GetObject("HmIP-RF." # sSchlafzimmerRegler # ":1.SET_POINT_TEMPERATURE");
real soll_TempSchlafzimmer = ThermostatSchlafzimmer.Value();

! Aktuelle Ventiloeffnung (%) von HmIP-eTRV-2 ermitteln
object ThermostatSchlafzimmer = dom.GetObject("HmIP-RF." # sSchlafzimmerRegler # ":1.LEVEL");
real akt_VentilSchlafzimmer = ThermostatSchlafzimmer.Value();

! ----------------------------------------------------
! Kontrolle ob Heizung benötigt
! ----------------------------------------------------
if ((akt_TempSchlafzimmer > (soll_TempSchlafzimmer - toleanz_Temp)) && (akt_VentilSchlafzimmer < 0.100000 ))
{HzSchlafzimmer=0; var LogSchlafzimmer="Kein Heizbedarf im Schlafzimmer";}
if ((akt_TempSchlafzimmer < (soll_TempSchlafzimmer - toleanz_Temp)) || (akt_VentilSchlafzimmer > 0.100000 ))
{HzSchlafzimmer=2; var LogSchlafzimmer="Heizbedarf im Schlafzimmer";}

! ----------------------------------------------------
! Thermostate Bad abfragen
! ----------------------------------------------------
object ThermostatBad;
string sBadRegler = "XXXXXXXXXXXXXX";

! aktueller Istwert von HmIP-eTRV-2 ermitteln
object ThermostatBad = dom.GetObject("HmIP-RF." # sBadRegler # ":1.ACTUAL_TEMPERATURE");
real akt_TempBad = ThermostatBad.Value();
string strAkt_TempBad = ThermostatBad.Value();

! Eingestellten Sollwert von HmIP-eTRV-2 ermitteln
object ThermostatBad = dom.GetObject("HmIP-RF." # sBadRegler # ":1.SET_POINT_TEMPERATURE");
real soll_TempBad = ThermostatBad.Value();

! Aktuelle Ventiloeffnung (%) von HmIP-eTRV-2 ermitteln
object ThermostatBad = dom.GetObject("HmIP-RF." # sBadRegler # ":1.LEVEL");
real akt_VentilBad = ThermostatBad.Value();
! ----------------------------------------------------
! Kontrolle ob Heizung benötigt
! ----------------------------------------------------
if ((akt_TempBad > (soll_TempBad - toleanz_Temp)) && (akt_VentilBad < 0.100000 ))
{HzBad=0; var LogBadezimmer="Kein Heizbedarf im Badezimmer";} 
if ((akt_TempBad < (soll_TempBad - toleanz_Temp)) || (akt_VentilBad > 0.100000 ))
{HzBad=4; var LogBadezimmer="Heizbedarf im Badezimmer";}

! ----------------------------------------------------
! Thermostat Kueche abfragen
! ----------------------------------------------------
object ThermostatKueche;
string sKuecheRegler = "XXXXXXXXXXXXXX";  

! aktueller Istwert von HmIP-eTRV-2 ermitteln
object ThermostatKueche = dom.GetObject("HmIP-RF." # sKuecheRegler # ":1.ACTUAL_TEMPERATURE");
real akt_TempKueche = ThermostatKueche.Value();
string strAkt_TempKueche = ThermostatKueche.Value();

! Eingestellten Sollwert von HmIP-eTRV-2 ermitteln
object ThermostatKueche = dom.GetObject("HmIP-RF." # sKuecheRegler # ":1.SET_POINT_TEMPERATURE");
real soll_TempKueche = ThermostatKueche.Value();

! Aktuelle Ventiloeffnung (%) von HmIP-eTRV-2 ermitteln
object ThermostatKueche = dom.GetObject("HmIP-RF." # sKuecheRegler # ":1.LEVEL");
real akt_VentilKueche = ThermostatKueche.Value();

! ----------------------------------------------------
! Kontrolle ob Heizung benötigt
! ----------------------------------------------------
if ((akt_TempKueche > (soll_TempKueche - toleanz_Temp)) && (akt_VentilKueche < 0.100000 ))
{HzKueche=0; var LogKueche="Kein Heizbedarf in der Kueche";}
if ((akt_TempKueche < (soll_TempKueche - toleanz_Temp)) || (akt_VentilKueche > 0.100000 ))
{HzKueche=8; var LogKueche="Heizbedarf in der Kueche";}

! ----------------------------------------------------
! Thermostat Esszimmer abfragen
! ----------------------------------------------------
object ThermostatEsszimmer;
string sEsszimmerRegler = "XXXXXXXXXXXXXX";  

! aktueller Istwert von HmIP-eTRV-2 ermitteln
object ThermostatEsszimmer = dom.GetObject("HmIP-RF." # sEsszimmerRegler # ":1.ACTUAL_TEMPERATURE");
real akt_TempEsszimmer = ThermostatEsszimmer.Value();
string strAkt_TempEsszimmer = ThermostatEsszimmer.Value();

! Eingestellten Sollwert von HmIP-eTRV-2 ermitteln
object ThermostatEsszimmer = dom.GetObject("HmIP-RF." # sEsszimmerRegler # ":1.SET_POINT_TEMPERATURE");
real soll_TempEsszimmer = ThermostatEsszimmer.Value();

! Aktuelle Ventiloeffnung (%) von HmIP-eTRV-2 ermitteln
object ThermostatEsszimmer = dom.GetObject("HmIP-RF." # sEsszimmerRegler # ":1.LEVEL");
real akt_VentilEsszimmer = ThermostatEsszimmer.Value();

! ----------------------------------------------------
! Kontrolle ob Heizung benötigt
! ----------------------------------------------------
if ((akt_TempEsszimmer > (soll_TempEsszimmer - toleanz_Temp)) && (akt_VentilEsszimmer < 0.100000 ))
{HzEsszimmer=0; var LogEsszimmer="Kein Heizbedarf im Esszimmer";}
if ((akt_TempEsszimmer < (soll_TempEsszimmer - toleanz_Temp)) || (akt_VentilEsszimmer > 0.100000 ))
{HzEsszimmer=16; var LogEsszimmer="Heizbedarf im Esszimmer";}

boolean SwitchAn = false;
boolean SwitchAus = true;

! ----------------------------------------------------
! Kontrolle aller Heizungen und ob einschalten/ausschalten
! ----------------------------------------------------
if ((HzWohnzimmer + HzSchlafzimmer + HzBad + HzKueche + HzEsszimmer)>0)
{
var switch=dom.GetObject("HmIP-RF.XXXXXXXXXXXXXX:3.STATE");
switch.State(SwitchAn);

dom.GetObject('Status.Gastherme').State('Gastherme an, da Heizbedarf angefordert wurde!');

}
else
{
var switch=dom.GetObject("HmIP-RF.XXXXXXXXXXXXXX:3.STATE");
switch.State(SwitchAus);

dom.GetObject('Status.Gastherme').State('Gastherme aus, da kein Heizbedarf besteht!');

}
! ----------------------------------------------------------------------------------
! Variable Status Räume setzen 
!
var StatusWohnzimmer=(LogWohnzimmer);
dom.GetObject('Heizbedarf.Wohnzimmer').State(StatusWohnzimmer);

var StatusSchlafzimmer=(LogSchlafzimmer);
dom.GetObject('Heizbedarf.Schlafzimmer').State(StatusSchlafzimmer);

var StatusBadezimmer=(LogBadezimmer);
dom.GetObject('Heizbedarf.Badezimmer').State(StatusBadezimmer);

var StatusKueche=(LogKueche);
dom.GetObject('Heizbedarf.Kueche').State(StatusKueche);

var StatusEsszimmer=(LogEsszimmer);
dom.GetObject('Heizbedarf.Esszimmer').State(StatusEsszimmer);
Das ich alle Heizkörper nicht in einer einzigen Schleife abfrage, sondern jedes seperat, hat die Bewandnis, das ich somit jedem Heizkörper eine seperate Temperatur-Toleranz vergeben könnte,, was aktuell aber noch nicht notwendig ist.

Das ich jeden Heizkörperstatus in einer seperaten Systemvariable gespeichert habe liegt daran, das ich aktuell Telegram auf meiner CCU2 nicht zum laufen bekomme und daher die Nachrichten über IOBroker versende, wenn sich der Status der HmIP-PCBS ändert:
hm3.jpg
Habe es versucht, alles in einer Systemvariable zu packen, aber die Zeichen für den Zeilenumbruch werden von IOBroker wieder in Sonderzeichen umgewandelt, so das ich mih für den o.g. Weg entschied.

Ausgelöst wird das Script surch folgendes Programm:
hm1.jpg
Der Systemtakt wird alle 5 Minuten durch folgendes Progarmm gesteuert:
hm2.jpg
Die Programme wiederum werden An-/Abwesenheitsgesteuert durch weitere Programme in Kombination des Fritzbox Anwesehnheits-AddOn für CCU's gesteuert. Die Heizperiode steuere ich mittels externer HmIP Aussensensoren (Temperatur & Luftfeuchtigkeit), und für die Tag- & Nachterkennung kommt ebenfalls ein HmIP Aussensensor (Lichtsensor) zum Einsatz.
Mein bescheidenes Homematic IP System:
270 Kanäle in 42 Geräten:
1x HM-ES-TX-WM, 5x HmIP-HEATING, 1x HM-PB-2-WM, 1x HmIP-CCU3, 1x HmIP-DSD-PCB, 5x HmIP-eTRV-2, 1x HmIP-FSI16, 1x HmIP-HAP, 1x HmIP-PCBS, 1x HmIP-PS-2, 1x HmIP-RCV-50, 4x HmIP-SCI, 1x HmIP-SLO, 2x HmIP-SPI, 5x HmIP-STHD, 1x HmIP-STHO-A, 2x HmIP-SWDO-I, 7x HmIP-SWDO-PL, 1x HmIP-WKP

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von hirrsson » 16.09.2020, 11:55

Sanweb hat geschrieben:
08.09.2020, 11:42
Die Programme wiederum werden An-/Abwesenheitsgesteuert
....
Die Heizperiode steuere ich mittels externer HmIP Aussensensoren (Temperatur & Luftfeuchtigkeit)
....
Tag- & Nachterkennung kommt ebenfalls ein HmIP Aussensensor (Lichtsensor) zum Einsatz.
Cool.
ich bin selber dabei es zu IOBroker zu migrieren. Mein Programm ist auch An/Abwesenheitgesteuert und ich gehe auf "Alarm an/aus". Das mit den Handys hat nicht funktioniert, da ich das Haus auch ohne Handy verlassen kann ggf. Handy zuhause manchmal ausstelle.

Bzgl. Tag/Nacht hatte ich mich auch überlegt. Da wir aber Kinder haben, und die, unabhängig von die Sonne ins Bett gehen, habe ich mich für eine Statische "Uhrzeit" entschieden.

Bzgl. Heizperiode.. eigentlich eine Gute Idee.. werde ich im IOBroker einbauen. :)

Benutzeravatar
Sanweb
Beiträge: 57
Registriert: 11.08.2020, 09:50
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 5 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von Sanweb » 25.09.2020, 15:08

@hirrsson
die Steuerung Tag/Nacht und den Kindern sowie euch als Eltern lässt sich sehr einfach lösen. Vor kurzer Zeit bin ich hier im Forum über ein sehr simples und einfach geniales Prokjekt gestolpert, wobei es mich wundert, das es anscheinend noch keine große Anwendung zu finden scheint. Gemeint ist dabei ein sogenannter Bettsensor.

Diesen habe ich für mein Prjekt wiederum in einer etwas umgewandelten Form integriert. Anstatt teuerer HmIP Komponenten habe ich mich hier der günstigen NodeMCU V3 aus dem Land des ewigen Lächelns (~1,50 €/Stck) bedient und darauf Tasmota geflasht. Dann kamm ein 2m Alu-U-Profil zum Einsatz, in dem ich ein Stripe WS2812B LED's geklebt und an der NodeMCU angeschlossen habe. Als Schließerkontakt habe ich dann den besagten Button aus dem o.g. Beitrag einfach an einen weiteren freien GPIO Port gegen Masse angeschlossen. Bei meiner besseren Hälfte und mir im Doppelbett wird nun über IOBroker folgende Szenarien geschaltet. Stehe ich nachts auf, schliesst der Schalter und das LED Stripe unter meinem Bett geht als Nachlicht an. Tag & Nacht auswertung erfolgt über den HmIP Sensor im Garten. Das gleiche geschieht auch bei meiner besseren Hälfte. Werden beide Buttons geöffnet (also wir liegen beide im Bett), werden z.B. alle stromfressenden Stdby-Geräte abgeschlatet, die Heizung geht automatisch auf Nachtbetrieb. Muss nun einer z.B. früher aufstehen als der andere, können durch den Button spezielle Szenarien geschlatet werden.

Wenn du das bei den Betten Deiner inder ebenfalls integrierst, kannst du damit erst einmal ein schönes Ambiente schaffen und gleichzeitig weiß das Smarthome System, wer wann im Bett liegt und was es zu tun hat, wenn wer wann wo aufsteht oder sich hinlegt. Das ganze kann dann z.B. mittels IOBroker und Blockly auch so gesteuert wrrden, das Aktionen nur innerhalb bestimmter Uhrzeiten geschehen soll.

Ganze Konstruktion pro Bett aller Materiallien inkl. Netzteile kostet ~ 30€ und da kann kein HmIP in Sachen Flexibilität & Anschaffungskosten mithalten. Den neuen Taster kann man dann über IOBroker/Blockly als virtuellen Taster mittels CuxD in die CCU auch holen.
Mein bescheidenes Homematic IP System:
270 Kanäle in 42 Geräten:
1x HM-ES-TX-WM, 5x HmIP-HEATING, 1x HM-PB-2-WM, 1x HmIP-CCU3, 1x HmIP-DSD-PCB, 5x HmIP-eTRV-2, 1x HmIP-FSI16, 1x HmIP-HAP, 1x HmIP-PCBS, 1x HmIP-PS-2, 1x HmIP-RCV-50, 4x HmIP-SCI, 1x HmIP-SLO, 2x HmIP-SPI, 5x HmIP-STHD, 1x HmIP-STHO-A, 2x HmIP-SWDO-I, 7x HmIP-SWDO-PL, 1x HmIP-WKP

masgo
Beiträge: 14
Registriert: 17.10.2020, 21:36
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 2 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von masgo » 17.10.2021, 20:38

Ein großes Danke für die tolle Anleitung. Ich hab das Skript mit leichten Änderungen auch bei mir im Einsatz. Als Anregung hier mein Skript:

Code: Alles auswählen

! Überprüft jeden Heizkörper auf Temperatur (ist + soll) und Ventilöffnung. Falls notwendig, Heizung an/aus stellen

string logMessage = "";
string messageTextForOn = "";
string messageTextForOff = "";

! Variablen initialisieren. 
!Setzte das richtige Gewerk, um alle Devices holen zu können
var myAssembly = dom.GetObject("eTRV");

!Hole Zustand von Gastherme 
boolean zustandGastherme = dom.GetObject("Gastherme").Value();


!Möglichkeit einen Toleranz für temperatur zu setzen. positive Wert = wird vor dem Soll aktiv. Negative erst nach dem Soll.
real toleanzTemperatur = 0.0;
boolean heizungWirdGebraucht = false;

logMessage = "Gastherme ist: " # zustandGastherme # "\n";

var numTemps=0.0;
var temperaturAVG = 0.0;
var temperaturMIN = 99.0;
var temperaturMAX = 0.0;

! Hole das Gewerk Durch alle angemeldeten Geräte iterieren
string itemID;
foreach(itemID, myAssembly.EnumUsedIDs()) {
    ! Gerätedetails & Schnittstelle holen
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());

	if ( (device.HssType() == "HmIP-eTRV-2") || (device.HssType() == "HmIP-eTRV-B" ) ) {
		! Interface, Name, Adresse und Kanal auslesen
		var interface = dom.GetObject(item.Interface());
		string interface_name = interface.Name();
		string device_address = device.Address();
		device_address = device_address.StrValueByIndex(":", 0);

		!Get the wanted values from each device!
		string channel_name = interface_name # "." # device_address # ":1.ACTUAL_TEMPERATURE";
		real actualTemperatur = dom.GetObject(channel_name).Value();
		
		channel_name = interface_name # "." # device_address # ":1.SET_POINT_TEMPERATURE";
		real wantedTemperatur = dom.GetObject(channel_name).Value();

		channel_name = interface_name # "." # device_address # ":1.LEVEL";
		real valvePosition = dom.GetObject(channel_name).Value();

		!min/max/avg calculations
		numTemps = numTemps + 1.0;
		temperaturAVG = temperaturAVG + actualTemperatur;
		if ( temperaturMAX < actualTemperatur) { temperaturMAX = actualTemperatur; }
		if ( temperaturMIN > actualTemperatur) { temperaturMIN = actualTemperatur; }

		!Check if Heizung gebraucht wird (entweder Ventil, Temperatur oder beide)
		if ( (valvePosition > 0.10) && ( actualTemperatur < (wantedTemperatur + toleanzTemperatur)) ) {
			heizungWirdGebraucht = true;
			messageTextForOn = messageTextForOn # "AN - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # " - " # item.Name() # "\n";
		}
		else{
			messageTextForOff = messageTextForOff # "AUS - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # " - " # item.Name() # "\n";
		}		
	}
}

! avg Calc
temperaturAVG = temperaturAVG / numTemps;

logMessage = logMessage # "Gastherme soll: " # heizungWirdGebraucht # "\n";

if ( heizungWirdGebraucht != zustandGastherme ) {
	! Get Timestamp wenn die Heizung zu letzt geändert wurde und Timestamp jetzt
	time timeStampHeizungNotwendig = dom.GetObject("Gastherme").Timestamp();
	time zeitJetzt = system.Date('%F %T').ToTime();

	logMessage = logMessage # "Zeit jetzt: " # zeitJetzt # "\n" # "Last change:\t" # timeStampHeizungNotwendig # "\n";

	!600 sek (10 min) hinzufügen um sicherzustellen, dass die Heizung nicht immer an/aus geht
	timeStampHeizungNotwendig = timeStampHeizungNotwendig + 600;

	!Ueperpruefen ob die Heizung geändert werden muss (und kann wegen der last change)
	if(zeitJetzt.ToInteger() > timeStampHeizungNotwendig.ToInteger()) {
		dom.GetObject("Gastherme").State( !zustandGastherme );
		
		logMessage = logMessage # "Zeit ok, status Heizung ändern zu: " # !zustandGastherme # "\n";
	}
	else {
		logMessage = logMessage # "Abstand zu kurz. Keine Änderung\n";
	}
}

var deltaTemp = temperaturMAX - temperaturMIN;
logMessage = logMessage
			# "--------------------------------------------------------------------------\n"
			# messageTextForOn 
			# "--------------------------------------------------------------------------\n"
			# messageTextForOff
			# "--------------------------------------------------------------------------\n"
			# "Max/Avg/Min Temperatur: " 
			# temperaturMAX.ToString(1) # " / " 
			# temperaturAVG.ToString(1) # " / " 
			# temperaturMIN.ToString(1) 
			# " Delta: " # deltaTemp.ToString(1) # "\n";

!Speichere Systemvariablen
dom.GetObject("GasthermeLog").State(logMessage);
dom.GetObject("TemperaturAVG").State(temperaturAVG);
dom.GetObject("TemperaturMIN").State(temperaturMIN);
dom.GetObject("TemperaturMAX").State(temperaturMAX);

!WriteLine(logMessage);
Was ich geänderte habe:
  • zusätzlich berechne ich Min/Avg/Max/Delta Temperaturen und speichere die in Variablen. Das ist nur so, um einen Überblick zu kriegen. Da bei uns die meisten Türen offen sind, sollten Min und Max nicht zu weit auseinander liegen.
  • Anstatt das Gewerk "Heizung" abzurufen, rufe ich "eTRV" ab. Damit kriege ich nur genau die HK-Thermostate zurück und keine Wandthermostate usw.
  • Bei der finalen Prüfung, prüfe ich erst ob sich am Zustand was ändern soll, bevor ich anfange die Uhrzeit zu holen usw.
  • Ich habe im Bekanntenkreis mehrere Menschen die in der SHK Branche tätig sind. Die haben mir alle dazu geraten den Zustand der Therme seltener zu ändern. Lieber nur alle 10 oder 20 Minuten. Ich hab jetzt mal 10 Minuten genommen und werde mal auswerten wie oft sich das tatsächlich ändert.

hirrsson
Beiträge: 45
Registriert: 14.10.2016, 08:14
Hat sich bedankt: 8 Mal
Danksagung erhalten: 1 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von hirrsson » 18.10.2021, 17:18

masgo hat geschrieben:
17.10.2021, 20:38
Was ich geänderte habe:
  • zusätzlich berechne ich Min/Avg/Max/Delta Temperaturen und speichere die in Variablen. Das ist nur so, um einen Überblick zu kriegen. Da bei uns die meisten Türen offen sind, sollten Min und Max nicht zu weit auseinander liegen.
  • Anstatt das Gewerk "Heizung" abzurufen, rufe ich "eTRV" ab. Damit kriege ich nur genau die HK-Thermostate zurück und keine Wandthermostate usw.
  • Bei der finalen Prüfung, prüfe ich erst ob sich am Zustand was ändern soll, bevor ich anfange die Uhrzeit zu holen usw.
  • Ich habe im Bekanntenkreis mehrere Menschen die in der SHK Branche tätig sind. Die haben mir alle dazu geraten den Zustand der Therme seltener zu ändern. Lieber nur alle 10 oder 20 Minuten. Ich hab jetzt mal 10 Minuten genommen und werde mal auswerten wie oft sich das tatsächlich ändert.
Bitte schön :-)

Cool bzgl. Min / Max. werde ich auch bei mir machen.

Ich habe mein Projekt iobroker aufgegeben. Iobroker läuft, aber alle "wichtige" skripte (und Funktionalitäten) macht meinem CCU. z.b. Heizung, Sauna, Alarm.

Kennte der TAG eTRV nicht. SUPER. Werde ich auch in andere Skripts einbauen.

Auch vielen Dank für die Rückmeldung 5 vs 10 min. Werde ich bei mir auch ändern.
Bzgl. "Uhrzeit", dass lasse ich . Ich habe einen Log-Variabel die ich auch im Frontend anzeige. Manchmal will ich wissen, wieso ist der Heizung an/aus.... :-)

masgo
Beiträge: 14
Registriert: 17.10.2020, 21:36
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 2 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von masgo » 18.10.2021, 21:04

Die Aufteilung CCU / iobroker ist bei mir ähnlich. Der iobroker macht die nice-to-have features. Visualisierung fürs Tablet das an der Wand hängt und fürs Handy, Musik-Steuerung, Wettervorhersage, Corona-Statistiken (mittlerweile nicht mehr so wichtig, aber als die Inzidenz direkt an Maßnahmen gekoppelt war, schon), Anrufe in Abwesenheit, Präsenz-Erkennung, Wettervorhersage, Pollen-Vorhersage, Verbindung zu InfluxDB um die Werte zu archivieren, usw. - alles nur so Komfort-Dinge. Wenn es ausfällt ist das kein Drama. Und es fällt manchmal aus, weil ich da viel rumspiele.

Die CCU konzentriert sich dann auf die Heizung. (Licht habe ich, bis auf 2 Lampen, nicht smart da wir schon Dimmer hatten und ich bisher keinen adäquaten smarten Ersatz finden konnte). Wenn die CCU ausfällt, dann haben die Thermostate Direktverknüpfungen zu den Wandthermostaten. Ansonsten kommen die Thermostate auch halbwegs alleine klar. Wenn das Relais mal ausfällt, dann hat die Heizung ja immernoch ihr Wandthermostat was im schlimmsten Fall auf ECO steht. Und zur Sicherheit gibts noch nen physischen Schalter am Relais, womit man die Leitung manuell unterbrechen kann = Junkers-Thermostat wieder im Normalmodus.

masgo
Beiträge: 14
Registriert: 17.10.2020, 21:36
System: CCU
Hat sich bedankt: 16 Mal
Danksagung erhalten: 2 Mal

Re: Junkers TR-200 mit HmIP Heizkörperthermostate steuern

Beitrag von masgo » 11.11.2021, 00:39

Ich habe übrigens festgestellt, dass unsere Therme (welche in der Küche verbaut ist) recht laut wird wenn nur ein Heizkörper minimal aufgedreht ist. Kommt vermutlich von der Pumpe. Ich hab das Program jetzt so angepasst, dass ich zusätzlich noch die Summe der Ventilstellungen berechne. Wenn diese unter 0.25 ist, dann geht das Skript davon aus, dass kein Heizbedarf besteht. Man bachte, dass der Wert von 0.25 durch try&error bei meiner Anlage ermittelt wurde.

Ich habe die toleanzTemperatur bei mir auf 0.6 gestellt. Die ist-Temperatur darf also 0,6° höher sein als das Soll und das Skript würde trotzdem noch anhand der Ventilstellung entscheiden ob Bedarf besteht oder nicht.

Das Skript lasse ich jetzt auch alle 2 min laufen. Weil mir die Anlage sonst zu langsam auf Heizbedarf reagiert. - Die 10 Minuten Sperre gegen das hin- und her Schalten gibt es natürlich immer noch.

Hier mein aktuelles Skript

Code: Alles auswählen

! Überprüft jeden Heizkörper auf Temperatur (ist + soll) und Ventilöffnung. Falls notwendig, Heizung an/aus stellen

string logMessage = "";
string messageTextForOn = "";
string messageTextForOff = "";

! Variablen initialisieren. 
!Setzte das richtige Gewerk, um alle Devices holen zu können
var myAssembly = dom.GetObject("eTRV");

!Hole Zustand von Gastherme 
boolean zustandGastherme = dom.GetObject("Gastherme").Value();


!Möglichkeit einen Toleranz für temperatur zu setzen. positive Wert = wird vor dem Soll aktiv. Negative erst nach dem Soll.
real toleanzTemperatur = 0.6;
boolean heizungWirdGebraucht = false;

logMessage = "Gastherme ist: " # zustandGastherme # "\n";

var numTemps=0.0;
var temperaturAVG = 0.0;
var temperaturMIN = 99.0;
var temperaturMAX = 0.0;
var valveSum = 0.0;

! Hole das Gewerk Durch alle angemeldeten Geräte iterieren
string itemID;
foreach(itemID, myAssembly.EnumUsedIDs()) {
    ! Gerätedetails & Schnittstelle holen
    var item = dom.GetObject(itemID);
    var device = dom.GetObject(item.Device());

	if ( (device.HssType() == "HmIP-eTRV-2") || (device.HssType() == "HmIP-eTRV-B" ) ) {
		! Interface, Name, Adresse und Kanal auslesen
		var interface = dom.GetObject(item.Interface());
		string interface_name = interface.Name();
		string device_address = device.Address();
		device_address = device_address.StrValueByIndex(":", 0);

		!Get the wanted values from each device!
		string channel_name = interface_name # "." # device_address # ":1.ACTUAL_TEMPERATURE";
		real actualTemperatur = dom.GetObject(channel_name).Value();
		
		channel_name = interface_name # "." # device_address # ":1.SET_POINT_TEMPERATURE";
		real wantedTemperatur = dom.GetObject(channel_name).Value();

		channel_name = interface_name # "." # device_address # ":1.LEVEL";
		real valvePosition = dom.GetObject(channel_name).Value();

		!min/max/avg calculations
		numTemps = numTemps + 1.0;
		temperaturAVG = temperaturAVG + actualTemperatur;
		if ( temperaturMAX < actualTemperatur) { temperaturMAX = actualTemperatur; }
		if ( temperaturMIN > actualTemperatur) { temperaturMIN = actualTemperatur; }

		!Check if Heizung gebraucht wird (entweder Ventil, Temperatur oder beide)
		valveSum = valveSum + valvePosition;
		if ( (valvePosition > 0.10) && ( actualTemperatur < (wantedTemperatur + toleanzTemperatur)) ) {
			heizungWirdGebraucht = true;
			messageTextForOn = messageTextForOn # item.Name() # " -  AN - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # "\n";
		}
		else{
			messageTextForOff = messageTextForOff # item.Name() # " - AUS - Ist: " # actualTemperatur.ToString(1) # " Soll: " # wantedTemperatur.ToString(1) # " Valve: " # valvePosition.ToString(2) # "\n";
		}		
	}
}

! avg Calc
temperaturAVG = temperaturAVG / numTemps;

heizungWirdGebraucht = heizungWirdGebraucht && (valveSum > 0.25);

logMessage = logMessage # "Gastherme soll: " # heizungWirdGebraucht # "\n";

if ( heizungWirdGebraucht != zustandGastherme ) {
	! Get Timestamp wenn die Heizung zu letzt geändert wurde und Timestamp jetzt
	time timeStampHeizungNotwendig = dom.GetObject("Gastherme").Timestamp();
	time zeitJetzt = system.Date('%F %T').ToTime();

	logMessage = logMessage # "Zeit jetzt: " # zeitJetzt # "\n" # "Last change:\t" # timeStampHeizungNotwendig # "\n";

	!600 sek (10 min) hinzufügen um sicherzustellen, dass die Heizung nicht immer an/aus geht
	timeStampHeizungNotwendig = timeStampHeizungNotwendig + 600;

	!Ueperpruefen ob die Heizung geändert werden muss (und kann wegen der last change)
	if(zeitJetzt.ToInteger() > timeStampHeizungNotwendig.ToInteger()) {
		dom.GetObject("Gastherme").State( !zustandGastherme );
		
		logMessage = logMessage # "Zeit ok, status Heizung ändern zu: " # !zustandGastherme # "\n";
	}
	else {
		logMessage = logMessage # "Abstand zu kurz. Keine Änderung\n";
	}
}

var deltaTemp = temperaturMAX - temperaturMIN;
logMessage = logMessage
			# "--------------------------------------------------------------------------\n"
			# messageTextForOn 
			# "--------------------------------------------------------------------------\n"
			# messageTextForOff
			# "--------------------------------------------------------------------------\n"
			# "Max/Avg/Min Temperatur: " 
			# temperaturMAX.ToString(1) # " / " 
			# temperaturAVG.ToString(1) # " / " 
			# temperaturMIN.ToString(1) 
			# " Delta: " # deltaTemp.ToString(1) # "\n"
			# "Valve Sum: " # valveSum;

!Speichere Systemvariablen
dom.GetObject("GasthermeLog").State(logMessage);
dom.GetObject("TemperaturAVG").State(temperaturAVG);
dom.GetObject("TemperaturMIN").State(temperaturMIN);
dom.GetObject("TemperaturMAX").State(temperaturMAX);

!WriteLine(logMessage);



Antworten

Zurück zu „Neubau - Renovierung - Planung“