Heizungsthermostatscript V2.0
Moderator: Co-Administratoren
Re: Heizungsthermostatscript V2.0
ok werde ich machen,
was homematic angeht bin ich anfänger und möchte meine heizung darüber steuern und später licht und steckdosen.
für mich ist alles zur zeit noch neuland was homematic angeht.
was homematic angeht bin ich anfänger und möchte meine heizung darüber steuern und später licht und steckdosen.
für mich ist alles zur zeit noch neuland was homematic angeht.
-
- Beiträge: 14085
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 580 Mal
- Danksagung erhalten: 1492 Mal
Re: Heizungsthermostatscript V2.0
Bei dieser Hardwareausstattung würde ich noch mal die Lektüre der ersten Sätze des Postst von Petrus am 12.03.2018, 14:00 empfehlen. Mit modernen Thermostaten ist der Einsatz des Scripts überflüssig, denn die damit erreichte Funktionalität ist schon direkt in die modernen Thermostate in Form von Profilen hinterlegt. Leute mit Mischinstallationen können das ja durchaus einsetzen, aber ein Neuanfang beim Vorhandensein der aktuellen Hardware lohnt nicht wirklich.seemann hat geschrieben:ich habe homematic ip thermostate und heizkörper regler.
Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
-
- Beiträge: 64
- Registriert: 31.08.2014, 19:48
- Danksagung erhalten: 1 Mal
Re: Heizungsthermostatscript V2.0
Hallo Petrus,
nur noch eine Rückmeldung: ich habe einen HMIP Thermostat. Da klappt ebenfalls alles.
Gruß
Seme
PS habe ganzes haus nun mit diesem script am Laufen...
nur noch eine Rückmeldung: ich habe einen HMIP Thermostat. Da klappt ebenfalls alles.
Gruß
Seme
PS habe ganzes haus nun mit diesem script am Laufen...
Viele Grüße
Seme
ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5
Seme
ccu3 Raspberrymatic 3.71.12.20231020,
Thermostate 8x HM-CC-RT-DN 105155 FW 1.4, Thermostat 1x HMIP-eTRV FW 1.6.3
Wandthermostat 1x HM-TC-IT-WM-W-EU FW 1.3
Tuer-Fensterkontakte 7x HM-Sec-SC-2 FW 1.2, Tuer-Fensterkontakt-optisch 1x HMIP-SWDO 1.10.7, Tuer-Fensterkontakt opt. HMIP-SWDO-I FW 1.14.0
Fenster-Drehgriffkontakt HMIP-SRH FW 1.0.1
Bewegungsmelder HM-Sec-MDIR-2 FW 1.6
Temperatur- Feuchtesensor aussen HM-WDS10-TH-O FW 1.3
Rauchmelder HM-Sec-SD FW 1.1, 2x HMIP-SWSD FW 1.0.11
Funk-Schaltaktor HM-LC-Sw1-FM FW 1.12, Funk-Schaltsteckdose HM-ES-PMSw1-Pl 2.5
Zusatzsoftware: CUXDaemon V. 2.11, E-Mail V. 1.7.6, XML API 1.22, hm_pdetect 1.16, Philips Hue 3.2.5
-
- Beiträge: 17
- Registriert: 27.02.2017, 07:05
- Danksagung erhalten: 1 Mal
Re: Heizungsthermostatscript V2.0
Hallo zusammen,
jetzt muss ich doch mal ne Frage stellen.
Grundsätzlich läuft das script Top und macht genau was es soll. Ich arbeite im 4-Schichtbetrieb und da nützen Wochenprofile nicht viel.
Es gibt ja die Einstellung deltaStdMin für die manuelle Einstellung für einen gewissen Zeitraum, und genau da liegt das Problem.
Ich habe für jeden Raum ein script am laufen, aber die Scriptvariablen sind ja immer gleich, und die scripte werden bei mir alle 30 Min. angestoßen.
Kann es sein, dass es da zu Problemen kommen kann? Mit den Zeitstempeln?
jetzt muss ich doch mal ne Frage stellen.
Grundsätzlich läuft das script Top und macht genau was es soll. Ich arbeite im 4-Schichtbetrieb und da nützen Wochenprofile nicht viel.
Es gibt ja die Einstellung deltaStdMin für die manuelle Einstellung für einen gewissen Zeitraum, und genau da liegt das Problem.
Ich habe für jeden Raum ein script am laufen, aber die Scriptvariablen sind ja immer gleich, und die scripte werden bei mir alle 30 Min. angestoßen.
Kann es sein, dass es da zu Problemen kommen kann? Mit den Zeitstempeln?
-
- Beiträge: 14085
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 580 Mal
- Danksagung erhalten: 1492 Mal
Re: Heizungsthermostatscript V2.0
Logisch, dass einem da die festen Profile nicht viel helfen, aber ein Script, was alle paar Minuten läuft, ist auch der absolute Overkill, um zwei Schaltpunkte täglich festzulegen. Ich arbeite auch im Schichtsystem nach einem festen Schichtplan im Sechs-Wochen-Rhythmus. Für die Sollwertsteuerung läuft bei mir kein Script. Ein Script benötige ich lediglich, um meinen Schichtplan im System abbilden zu können (und selbst das habe ich in einer Erstversion per Programm abgebildet). Alles Andere läuft mit ganz normalen Programmen. Meine Thermostate laufen im Automatikbetrieb mit normalen Heizprofilen und bekommen vom Standard abweichende Sollwerte in Abhängigkeit vom Schichtplan per Programm.Preisselbeere hat geschrieben: ↑31.10.2018, 17:44Ich arbeite im 4-Schichtbetrieb und da nützen Wochenprofile nicht viel.
Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
Re: Heizungsthermostatscript V2.0
Guten Morgen,
ich bin zwar nicht der Profi, aber das ging relativ simpel. Ich habe in einer Version 2.14 noch 2 Homematic - IP Geräte aufgenommen.
Ich habe ein Starterset Heizung gekauft und das hat so leider noch nicht funktioniert.
Ergänzt von mir in der Heizung: HmIP-eTRV-B
und dort war noch ein fehlernder Magnetkontakt dabei: HmIP-SWDM
Bitte wie üblich die Variablen noch anpassen, meine sind die aus dem "Kalenderscript"
Noch eine Frage, hat jemand den HMIP-SWDO ? Funktioniert der ?
Ich hatte beim Kopieren der Scriptstellen diesen als Vorlage genommen und damit ging mein HmIP-SWDM nicht.
-> Der Fehler war die Groß und Kleinschreibung von HmIP , als ich das für den SWDM korrigiert habe, hat es geklappt
Dann müsste man im Script ggf. den HMIP-SWDO in HmIP-SWDO umbenennen.
Gruß
Mike
ich bin zwar nicht der Profi, aber das ging relativ simpel. Ich habe in einer Version 2.14 noch 2 Homematic - IP Geräte aufgenommen.
Ich habe ein Starterset Heizung gekauft und das hat so leider noch nicht funktioniert.
Ergänzt von mir in der Heizung: HmIP-eTRV-B
und dort war noch ein fehlernder Magnetkontakt dabei: HmIP-SWDM
Bitte wie üblich die Variablen noch anpassen, meine sind die aus dem "Kalenderscript"
Code: Alles auswählen
! Version 2.14
! Script von Erik Groennerud - 8.2009- MM.2013
! Ergaenzung von Zauberlehrling
! Optimiert und ergaenzt von Petrus (Peter) - 01.2018
! Performance Ideen von Goersch
! **************************************************************************
! Angabe fuer "raum" nur notwendig, wenn das Script die Thermostate
! und Sensoren automatisch ermitteln soll. Andernfalls leer lassen.
! **************************************************************************
string raum = "Flur Erdgeschoss";
! **************************************************************************
! Eingabe fuer thermostat (nur wenn "raum" nicht angegeben ist):
! Gerät: HM-CC-TC Angabe: BidCos-RF.<SERIENNUMMER>:2.SETPOINT
! Gerät: HM-CC-RT-DN Angabe: BidCos-RF.<SERIENNUMMER>:4.SET_TEMPERATURE
! Gerät: HM-TC-IT-WM-W-EU Angabe: BidCos-RF.<SERIENNUMMER>:2.SET_TEMPERATURE
! Gerät: HmIP-WTH-2 Angabe: HmIP-RF.<SERIENNUMMER>:1.SET_POINT_TEMPERATURE
! Gerät: HMIP-eTRV-2 Angabe: HmIP-RF.<SERIENNUMMER>:1.SET_POINT_TEMPERATURE
! **************************************************************************
string thermostat = "";
! **************************************************************************
! Eingabe fuer Sensoren (optional und nur, wenn "raum" nicht angegeben ist):
! Bsp. HM-Sec-SC-2 Angabe: BidCos-RF.<SERIENNUMMER>:1.STATE
! HmIP-SWDM oder ähnliche HmIP Angabe: HmIP-RF.<SERIENNUMMER>:1.STATE
! **************************************************************************
string sensoren = ""; ! Angabe mehrerer Sensoren moeglich -> Eingaben mit ";" trennen
! **************************************************************************
! Namen der Systemvariablen in der CCU
! Namen von nicht verwendeten Systemvarialen einfach leer lassen
! **************************************************************************
string sv_Heizperiode = "Heizperiode"; ! Fuer Pruefung, ob Winter oder Sommer
string sv_Partytemperatur = "Partytemperatur"; ! Selbsterklaerend
string sv_Urlaub1 = "IST-Urlaub-01-Abwesend-Heute"; ! Fuer Pruefung, ob Urlaub und auf Reisen => Temperatur "grad_urlaub"
string sv_Urlaub2 = "IST-Urlaub-01-Anwesend-Heute"; ! Fuer Pruefung, ob Urlaub und zu Hause => Temperatur Zeitleiste Sa. oder So.
string sv_Gaeste = "Gaeste"; ! Fuer Pruefung, ob Gaeste im Hause sind => Temperatur "grad_gaeste"
string sv_Anwesenheit = "Anwesenheit"; ! Fuer Pruefung, ob ausser Haus => Temperatur "grad_aa"
string sv_Feiertag = "IST-Feiertag-Heute"; ! Fuer Pruefung, ob heute Feiertag ist => Temperatur Zeitleiste Sa. oder So.
string Gewerk_Verschluss = "Verschluss"; ! Gewerk in der CCU fuer die Veschluesse
! **************************************************************************
! Temperaturen 6-30 Grad, 0 = OFF, 100=ON
real grad_0 = 17.0;
real grad_1 = 19.0;
real grad_2 = 20.0;
real grad_3 = 20.5;
real grad_4 = 21.0;
real grad_5 = 21.5;
real grad_6 = 22.0;
real grad_7 = 22.5;
real grad_8 = 23.0;
real grad_9 = 24.0;
real grad_fenster = 6; ! Temperatur bei offenem Fenster -1 = off
real grad_urlaub = 16.5; ! Temperatur, wenn Urlaub und auf Reisen -1 = off
real grad_gaeste = 22; ! Temperatur fuer Gaeste -1 = off
real grad_aa = 18; ! Temperatur ausser haus, wird als Absenkung benutzt, -1 = OFF (immer Anwesenheit)
string deltaStdMin = "02:00"; ! deltaStdMin mit "hh:mm" setzten (Std / Min immer zweistellig) Differenzzeit, die manuelle Temperatur erhalten bleibt bis überschrieben wird
integer woche = 0; ! 0=7 Tage Woche, 1=Montag=Wochentags & Samstag=Wochenende, 2= Montag=Woche, 3=Montag=Wochentags & Samstag=Samstag & Sonntag=Sonntag
integer leiste = 1; ! Welche Zeitleiste aktiv ist
if (leiste == 1){
! Zeitleiste 1
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "000000000000134442222222222222222222333333322110";
string zeitleiste_die = "000000000000134442222222222222222222333333322110";
string zeitleiste_mit = "000000000000134442222222222222222222333333322110";
string zeitleiste_don = "000000000000134442222222222222222222333333322110";
string zeitleiste_fre = "000000000000134442222222222222222222333333322110";
string zeitleiste_sam = "000000000000001122444444444444444444433333322110";
string zeitleiste_son = "000000000000001122444444444444444444433333222110";
};
if (leiste == 2){
! Zeitleiste 2
! Uhrzeit 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2|
! 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3|
string zeitleiste_mon = "000000000000134440000000000000000001344444422110";
string zeitleiste_die = "000000000000134440000000000000000001344444422110";
string zeitleiste_mit = "000000000000134440000000000000000001344444422110";
string zeitleiste_don = "000000000000134440000000000000000001344444422110";
string zeitleiste_fre = "000000000000134440000000000000000001344444422110";
string zeitleiste_sam = "000000000000001122444444444444444444433333222110";
string zeitleiste_son = "000000000000001122444444444444444444433333222110";
};
boolean debug = 0; ! Zu Testzwecken: Ausgaben im Parser und Werte werden bei jedem Skriptaufruf gesendet!
! Im Normalbetrieb muss debug immer auf 0 sein!
boolean syslog = 0; ! 1= Infos erfolgen ins Syslog ; 0= Kein Syslog (Standard)
!******************************************************
! Ab hier Script CODE - Do not change behind this line
!******************************************************
! Script abbrechen, wenn Eingaben nicht korrekt.
if (((!raum) && (!thermostat)) || (!sv_Heizperiode)) {
if (debug) { WriteLine("Angaben fuer raum und/oder thermostat pruefen!"); }
if (syslog) {
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug Heizungsthermostatscript: " # raum # " Variablen raum und thermostat pruefen!\n", &stdout, &stderr);
}
quit;
}
! Umwandeln deltaStdMin in Sekunden
integer stunde = deltaStdMin.Substr(0, 2).ToInteger();
integer minute = deltaStdMin.Substr(3, 2).ToInteger();
integer setdelta = (stunde * 3600) + (minute * 60);
object regler=null; ! Datenobjekt des Reglers fuer die Solltemperatur
object svObj=null; ! Datenobjekt fuer die Ueberpruefung der Systemvariablen
real soll_neu; ! Die neue Solltemperatur fuer den Raumthermostaten (Regler).
real soll_alt; ! Die alte Solltemperatur der Zeitleiste, die zuletzt aktuell war.
real soll_ist = -1; ! Die aktuelle Solltemperatur im Raumthermostat (Regler).
time sv_timestamp; ! Zeitstempel der Systemvariablen, die zuletzt geaendert worden ist (Wert in Sekunden).
time rt_timestamp; ! Zeitstempel, wann die Solltemperatur im RT zuletzt gesetzt wurde.
boolean prioritaet = false; ! Ist prioritaet = true, dann wird die neue Solltemperatur auf jeden Fall in den Regler geschrieben.
! Beginn Thermostate abfragen
if (raum) {
var myAssembly = dom.GetObject(raum);
string itemID;
var OldItem;
boolean IstWandthermostat=false;
! Solltemperatur im Raumthermostat ermitteln.
foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());
! Wenn Raumthermostat gefunden wurde...
if ((device.HssType() == "HM-CC-RT-DN") && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("BidCos-RF." # device.Address() # ":4.SET_TEMPERATURE");
soll_ist = regler.Value();
OldItem=device;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-RT-DN)"); }
}
} else {
if ((device.HssType() == "HM-CC-TC") && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
soll_ist = regler.Value();
OldItem=device;
IstWandthermostat=true;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-TC)"); }
}
} else {
if ((device.HssType() == "HM-TC-IT-WM-W-EU") && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SET_TEMPERATURE");
soll_ist = regler.Value();
OldItem=device;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-TC-IT-WM-W-EU)"); }
}
} else {
if (((device.HssType() == "HmIP-WTH")||(device.HssType() == "HmIP-WTH-2")) && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("HmIP-RF." # device.Address() # ":1.SET_POINT_TEMPERATURE");
soll_ist = regler.Value();
OldItem=device;
IstWandthermostat=true;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: " # device.HssType() # ")"); }
}
} else {
if (((device.HssType() == "HmIP-eTRV")||(device.HssType() == "HmIP-eTRV-2")||(device.HssType() == "HmIP-eTRV-B")) && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("HmIP-RF." # device.Address() # ":1.SET_POINT_TEMPERATURE");
soll_ist = regler.Value();
OldItem=device;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: " # device.HssType() # ")"); }
}
}
}
}
}
}
}
}
!Wenn kein "regler" gefunden wurde, Script beenden
if (regler==null){ quit; }
} else {
! Aktuelle Solltemperatur auslesen
regler = dom.GetObject(thermostat);
if (regler) {
soll_ist = regler.Value();
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (" # thermostat # ")"); }
} else { quit; }
}
! Ende Thermostate abfragen
! Beginn Ermittlung Solltemperatur
! Heizperiode pruefen
if (dom.GetObject(sv_Heizperiode).State()) {
soll_neu = 100.0;
prioritaet = true;
} else {
integer offen = 0;
if ((raum) && (Gewerk_Verschluss)) {
! Alle Geraete im "raum" abfragen und auswerten.
var myAssembly = dom.GetObject(raum);
string itemID;
foreach(itemID, myAssembly.EnumUsedIDs()) {
var item = dom.GetObject(itemID);
if (item.IsTypeOf(OT_CHANNEL)) {
var device = dom.GetObject(item.Device());
! Pruefen, ob Verschluss offen
! Testen, ob Fenster Dachluken, usw. offen sind. Diese muessen dem jeweiligen Raum und dem "Gewerk_Verschluss" zugeordnet sein
! Alle Gewerke dem Raum zugeordneten Geraete untersuchen
! Andere als die aufgefuehrten Sensoren oder Aktoren, die als Verschluss dienen, einfach in nachfolgender IF-Anweisung aendern oder ergaenzen.
! Tuerfensterkontakte Jalousienaktor / Dachluken Funk Jalousienaktor / Dachluken Wired Schliesserkontakt-Sensor Hutschienenmontage Fenster-Drehgriffsensoren Funk-Rollladenaktor fuer Markenschalter
if ((device.HssType() == "HM-Sec-SC") || (device.HssType() == "HM-Sec-SC-2") || (device.HssType() == "HM-LC-Bl1-FM") || (device.HssType() == "HMW-LC-Bl1-DR") || (device.HssType() == "HMW-Sen-SC-12-DR") || (device.HssType() == "HM-Sec-RHS") || (device.HssType() == "HM-Sec-RHS-2") || (device.HssType() == "HM-LC-Bl1PBU-FM") || (device.HssType() == "HmIP-SRH") || (device.HssType() == "HmIP-SWDO-I") || (device.HssType() == "HMIP-SWDO")|| (device.HssType() == "HmIP-SWDM")) {
var myChannel = dom.GetObject(item);
string id;
foreach(id, myChannel.ChnFunction()) {
var func = dom.GetObject(id);
if (func.Name() == Gewerk_Verschluss) {
if (item.State() > 0) {
offen = offen + 1.00;
if (debug) { WriteLine(device.HssType() # ": geöffnet"); }
} else { if (debug) { WriteLine(device.HssType() # ": geschlossen"); }}
}
}
}
}
}
} else {
if (sensoren) {
string id;
foreach (id, sensoren.Split(";")) {
var item = dom.GetObject(id);
if (item) {
if (item.State() > 0) {
offen = offen + 1.00;
if (debug) {WriteLine("Verschluss (" # id # ") ist offen!");}
} else {
if (debug) {WriteLine("Verschluss (" # id # ") ist geschlossen!");}
}
} else { if (debug) {WriteLine("Fehler:" # id # " ist kein Verschluss-Objekt!");}}
}
}
}
! Wenn ein Verschluss im Raum offen ist, dann Fenstertemperatur einstellen
if (offen > 0) { ! Fenster offen, Ventile einstellen
if (soll_ist <= grad_fenster) { ! Wenn soll_ist niedriger als grad_fenster (z.B. Ventile zu -> soll_ist = 0), dann nichts machen
soll_neu = soll_ist;
} else {
soll_neu = grad_fenster;
prioritaet = true;
}
} else {
! Timestamp "Partytemperatur" festhalten
boolean b_svVar = false;
sv_timestamp = "1970-01-01 01:00:00";
if (sv_Partytemperatur) {
svObj = dom.GetObject(sv_Partytemperatur);
if (svObj) {
sv_timestamp = svObj.Timestamp();
! Partytemperatur testen und einstellen; -1 = deaktiviert
if (svObj.Value() > -1) { b_svVar = true; }
}
}
if (b_svVar) { !Wenn Partytemperatur, dann einstellen
soll_neu = svObj.Value();
} else {
! Pruefen ob Timestamp "Urlaub" juenger ist als "Partytemperatur" => Wenn ja, merken
if (sv_Urlaub1) {
svObj = dom.GetObject(sv_Urlaub1);
if (svObj) {
time settime = svObj.Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
if ((svObj.State()) && (grad_urlaub > -1)) { boolean b_svVar = true; }
}
}
! Urlaub testen und einstellen; -1 = deaktiviert
if (b_svVar) { !Wenn im Urlaub und grad_urlaub nicht -1 (deaktiviert)
soll_neu = grad_urlaub;
} else {
if (sv_Gaeste) {
! Pruefen ob Timestamp "Gaeste" juenger ist als "Urlaub" => Wenn ja, merken
svObj = dom.GetObject(sv_Gaeste);
if (svObj) {
settime = svObj.Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
! Gaeste testen und einstellen, -1 = deaktiviert
if ((svObj.State()) && (grad_gaeste > -1)) { b_svVar = true; }
}
}
if (b_svVar){ !Wenn Gaeste im Haus und grad_gaeste nicht -1 (deaktiviert)
soll_neu = grad_gaeste;
} else {
if (sv_Anwesenheit) {
svObj = dom.GetObject(sv_Anwesenheit);
if (svObj) {
! Pruefen ob Timestamp "Anwesenheit" juenger ist als "Gaeste" => Wenn ja, merken
settime = svObj.Timestamp();
if (settime > sv_timestamp) {sv_timestamp = settime;}
if ((!svObj.State()) && (grad_aa > -1)) { b_svVar = true; }
}
}
! Differenzen von ausser Haus Testen und beachten
if (b_svVar) {
soll_neu = grad_aa;
} else {
string zeitleiste_heute; ! Die Temperaturleiste fuer den aktuellen Tag.
string zeitleiste_gestern; ! Die Temperaturleiste von gestern.
string heizwert; ! Enthaelt den Wert, der in der Zeitleiste zum jetzigen Zeitpunkt gilt.
! Hier nun die Auswertung der Zeitleisten
!Auswerten, welche Zeitleiste heute ist
integer tag = system.Date("%u");
if ((tag == 1) && (woche == 0)) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_heute = zeitleiste_die;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_heute = zeitleiste_mit;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_heute = zeitleiste_don;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_heute = zeitleiste_fre;} else {
if ((tag == 6) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_sam;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if ((tag >= 1) && (tag <= 5) && ((woche == 1) || (woche == 3))) {zeitleiste_heute = zeitleiste_mon;} else {
if ((tag >= 6) && (tag <= 7) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_heute = zeitleiste_mon;} }}}}}}}}}
! An Feiertagen oder bei Urlaub und zu Hause, gilt die Temperatur von Samstag bzw. Sonntag
b_svVar = false;
if (sv_Urlaub2) { svObj = dom.GetObject(sv_Urlaub2); if (svObj) { if (svObj.State()) { b_svVar = true; }}}
if (((b_svVar) || (dom.GetObject(sv_Feiertag).State())) && ((woche == 0) || (woche == 3))) {zeitleiste_heute = zeitleiste_son;} else {
if (((b_svVar) || (dom.GetObject(sv_Feiertag).State())) && (woche == 1)) {zeitleiste_heute = zeitleiste_sam;}}
! Position der Zeitleiste bestimmen
if (system.Date("%M").ToInteger() > 29) {integer add = 1;} else {integer add = 0;}
integer sTime = (system.Date("%H").ToInteger()*2)+add;
heizwert = zeitleiste_heute.Substr(sTime, 1);
! Temperatur bestimmen, die gesetzt werden soll
if (heizwert == "0") {soll_neu = grad_0;} else {
if (heizwert == "1") {soll_neu = grad_1;} else {
if (heizwert == "2") {soll_neu = grad_2;} else {
if (heizwert == "3") {soll_neu = grad_3;} else {
if (heizwert == "4") {soll_neu = grad_4;} else {
if (heizwert == "5") {soll_neu = grad_5;} else {
if (heizwert == "6") {soll_neu = grad_6;} else {
if (heizwert == "7") {soll_neu = grad_7;} else {
if (heizwert == "8") {soll_neu = grad_8;} else {
if (heizwert == "9") {soll_neu = grad_9;} }}}}}}}}}
! letzte Solltemeratur bestimmen, dabei muss der wert von 00:00 beachtet werden - der letzte Wert war gestern
if (sTime == 0) {
if ((tag == 1) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_son;} else {
if ((tag == 2) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mon;} else {
if ((tag == 3) && (woche == 0)) {zeitleiste_gestern = zeitleiste_die;} else {
if ((tag == 4) && (woche == 0)) {zeitleiste_gestern = zeitleiste_mit;} else {
if ((tag == 5) && (woche == 0)) {zeitleiste_gestern = zeitleiste_don;} else {
if ((tag == 6) && (woche == 0)) {zeitleiste_gestern = zeitleiste_fre;} else {
if ((tag == 7) && ((woche == 0) || (woche == 3))) {zeitleiste_gestern = zeitleiste_sam;} else {
if ((tag >= 2) && (tag <= 6) && ((woche == 1) || (woche == 3))) {zeitleiste_gestern = zeitleiste_mon;} else {
if (((tag == 1) || (tag == 7)) && (woche == 1)) {zeitleiste_gestern = zeitleiste_sam;} else {
if (woche == 2) {zeitleiste_gestern = zeitleiste_mon;} }}}}}}}}}
heizwert = zeitleiste_gestern.Substr(47, 1);
} else {
heizwert = zeitleiste_heute.Substr((sTime-1), 1);
}
! Temperatur bestimmen, die in der letzten 30 Minutenn war
if (heizwert == "0") {soll_alt = grad_0;} else {
if (heizwert == "1") {soll_alt = grad_1;} else {
if (heizwert == "2") {soll_alt = grad_2;} else {
if (heizwert == "3") {soll_alt = grad_3;} else {
if (heizwert == "4") {soll_alt = grad_4;} else {
if (heizwert == "5") {soll_alt = grad_5;} else {
if (heizwert == "6") {soll_alt = grad_6;} else {
if (heizwert == "7") {soll_alt = grad_7;} else {
if (heizwert == "8") {soll_alt = grad_8;} else {
if (heizwert == "9") {soll_alt = grad_9;} }}}}}}}}}
} !Ende IF Anwesenheit
} !Ende IF Gaeste
} !Ende IF Urlaub
} !Ende IF Partytemperatur
} !Ende IF Fenster offen
} !Ende IF Heizungsperiode
! Ende Ermittlung Solltemperatur
! ******************************
if (soll_ist >= 0) { ! Wenn RT geantwortet hat (Sollwert konnte ausgelesen werden)...
! ...dann pruefen ob neue Solltemperatur in RT geschrieben werden muss.
if (soll_ist <> soll_neu) { ! Wenn aktuelle Solltemperatur = neue Solltemp., dann nichts machen
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spaet ist es jetzt?
rt_timestamp = regler.Timestamp();
integer diff = now.ToInteger() - rt_timestamp.ToInteger();
if ((diff >= setdelta) || (prioritaet) || (soll_ist == grad_fenster) || (sv_timestamp >= rt_timestamp) || ((soll_ist == soll_alt) && (soll_alt <> soll_neu))) {
regler.State(soll_neu);
if (debug) {
WriteLine("Neue Solltemperatur (" # soll_neu.ToString(1) # "°C) an Thermostat gesendet!");
WriteLine("Letzter Zeitstempel (Sollwertänderung Thermostat): " # rt_timestamp);
}
if (syslog){
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " neu gesetzt!\n", &stdout, &stderr);
system.Exec("logger -t script -p user.debug alte_Solltemperatur: " # soll_ist # " neue_Solltemperatur: " # soll_neu # "\n", &stdout, &stderr);
system.Exec("logger -t script -p user.debug Letzte_Aenderung: " # rt_timestamp # " Zeitdifferenz:_" # diff # "sek.", &stdout, &stderr);
system.Exec("logger -t script -p user.debug Offene_Luken: " # offen , &stdout, &stderr);
}
} else {
if (debug) {
WriteLine("\rAuswertung (ODER-Verknüpfung):");
WriteLine("1. (diff >= setdelta) : ("#diff.ToString()#" >= "#setdelta.ToString()#") : "#(diff >= setdelta));
WriteLine("2. (prioritaet) : "#prioritaet);
WriteLine("3. (soll_ist == grad_fenster) : ("#soll_ist.ToString(1)#"°C == "#grad_fenster.ToString(1)#"°C) : "#(soll_ist == grad_fenster));
WriteLine("4. (sv_timestamp >= rt_timestamp) : ("#sv_timestamp#" >= "#rt_timestamp#") : "#(sv_timestamp >= rt_timestamp));
WriteLine("5. ((soll_ist == soll_alt) && (soll_alt <> soll_neu)) : (("#soll_ist.ToString(1)#"°C == "#soll_alt.ToString(1)#"°C) && ("#soll_alt.ToString(1)#"°C <> "#soll_neu.ToString(1)#"°C)) : "#((soll_ist == soll_alt) && (soll_alt <> soll_neu)));
WriteLine("Ergebnis = False = Keine Solltemperatur an Thermostat gesendet!");
}
}
} else { if (debug) { WriteLine("Keine neue Solltemperatur (" # soll_neu.ToString(1) #"°C)"); }}
} else {
if (syslog) {
string stdout;
string stderr;
system.Exec("logger -t script -p user.debug Raumthermostat " # raum # " antwortet nicht!", &stdout, &stderr);
}
}
Noch eine Frage, hat jemand den HMIP-SWDO ? Funktioniert der ?
Ich hatte beim Kopieren der Scriptstellen diesen als Vorlage genommen und damit ging mein HmIP-SWDM nicht.
-> Der Fehler war die Groß und Kleinschreibung von HmIP , als ich das für den SWDM korrigiert habe, hat es geklappt
Dann müsste man im Script ggf. den HMIP-SWDO in HmIP-SWDO umbenennen.
Gruß
Mike
- spitzlbergerj
- Beiträge: 42
- Registriert: 23.11.2014, 10:02
- Kontaktdaten:
Re: Heizungsthermostatscript V2.0
Hallo beieinander, hallo Petrus, Hallo Eric,
ich habe noch eine sehr alte Version des Skriptes im Einsatz und möchte jetzt auf die neue 2.13 / 2.14 umstellen, insbesondere, weil meine Erweiterung zur Beibehaltung manueller Temperatureinstellungen nicht wirklich funktioniert
Beim Untersuchen der neuen 2.14 bin ich über den Umgang mit dem neuen Wandthermostat HM-TC-IT-WM-W-EU gestolpert.
Beim Wandthermostat HM-CC-TC wird gesetzt, beim HM-TC-IT-WM-W-EU nicht. Ich kann im weiteren Verlauf des Skriptes keinen Grund dafür finden. In meiner alten Version behandle ich HM-TC-IT-WM-W-EU als Wandthermostat.
Warum wird HM-TC-IT-WM-W-EU in der 2.14 nicht als Wandthermostat behandelt? Oder hat sich hier ein Fehler eingeschlichen?
Und Eric,
noch eine andere Frage. Ich lasse mir alle relevanten Daten meiner Homematic über den selbstgebauten Smart Mirror https://forum.magicmirror.builders/topi ... gic-mirror anzeigen. Dafür schreibe und erweitere ich Module auf github.com. Sollten wir nicht auch dieses Skript auf github.com setzen? das würde die Versionsverwaltung einfacher machen? Ich helfe da gerne mit.
ich habe noch eine sehr alte Version des Skriptes im Einsatz und möchte jetzt auf die neue 2.13 / 2.14 umstellen, insbesondere, weil meine Erweiterung zur Beibehaltung manueller Temperatureinstellungen nicht wirklich funktioniert
Beim Untersuchen der neuen 2.14 bin ich über den Umgang mit dem neuen Wandthermostat HM-TC-IT-WM-W-EU gestolpert.
Code: Alles auswählen
...
} else {
if ((device.HssType() == "HM-CC-TC") && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SETPOINT");
soll_ist = regler.Value();
OldItem=device;
IstWandthermostat=true;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-CC-TC)"); }
}
} else {
if ((device.HssType() == "HM-TC-IT-WM-W-EU") && (!IstWandthermostat)) {
if (OldItem<>device) {
regler = dom.GetObject("BidCos-RF." # device.Address() # ":2.SET_TEMPERATURE");
soll_ist = regler.Value();
OldItem=device;
if (debug) { WriteLine("Soll-Ist = " # soll_ist.ToString(1) # "°C (HssType: HM-TC-IT-WM-W-EU)"); }
}
} else {
...
Code: Alles auswählen
IstWandthermostat=true
Warum wird HM-TC-IT-WM-W-EU in der 2.14 nicht als Wandthermostat behandelt? Oder hat sich hier ein Fehler eingeschlichen?
Und Eric,
noch eine andere Frage. Ich lasse mir alle relevanten Daten meiner Homematic über den selbstgebauten Smart Mirror https://forum.magicmirror.builders/topi ... gic-mirror anzeigen. Dafür schreibe und erweitere ich Module auf github.com. Sollten wir nicht auch dieses Skript auf github.com setzen? das würde die Versionsverwaltung einfacher machen? Ich helfe da gerne mit.
Grüße
Sepp
Fang nie an aufzuhören!
Hör nie auf anzufangen!
--------------------------------------------
CCU3, CCU2 in abgesetzter Garage
3x HM-RC-P1, 2x HM-LC-Sw4-PCB, 1x HM-RC-19, 1x HM-PB-4Dis-WM-2, 3x HM-ES-PMSw1-Pl-DN-R1, 1x HM-LC-Sw1-Pl-DN-R1, 3x HM-Sec-SCo, 15x HM-CC-RT-DN, 1x HM-PBI-4-FM, 9x HM-LC-Sw1-FM, 1x HM-LC-Sw1-PCB, 1x HM-LC-Sw2-FM, 6x HM-SwI-3-FM, 3x HM-PB-2-WM55-2, 1x HM-Sec-SC-2, 7x HM-TC-IT-WM-W-EU, 2x HM-PB-6-WM55, 1x HmIP-RCV-50, 4x HM-Sen-MDIR-O, 73 Systemvariable, 69 Programme
CUxD, Cloudmatic, RedMatic, HM-pdetect
Anbindung MagicMirror über diverse Module
--------------------------------------------
Sepp
Fang nie an aufzuhören!
Hör nie auf anzufangen!
--------------------------------------------
CCU3, CCU2 in abgesetzter Garage
3x HM-RC-P1, 2x HM-LC-Sw4-PCB, 1x HM-RC-19, 1x HM-PB-4Dis-WM-2, 3x HM-ES-PMSw1-Pl-DN-R1, 1x HM-LC-Sw1-Pl-DN-R1, 3x HM-Sec-SCo, 15x HM-CC-RT-DN, 1x HM-PBI-4-FM, 9x HM-LC-Sw1-FM, 1x HM-LC-Sw1-PCB, 1x HM-LC-Sw2-FM, 6x HM-SwI-3-FM, 3x HM-PB-2-WM55-2, 1x HM-Sec-SC-2, 7x HM-TC-IT-WM-W-EU, 2x HM-PB-6-WM55, 1x HmIP-RCV-50, 4x HM-Sen-MDIR-O, 73 Systemvariable, 69 Programme
CUxD, Cloudmatic, RedMatic, HM-pdetect
Anbindung MagicMirror über diverse Module
--------------------------------------------
-
- Beiträge: 2482
- Registriert: 13.02.2012, 20:23
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 300 Mal
- Danksagung erhalten: 116 Mal
Re: Heizungsthermostatscript V2.0
Habe auch das Problem mit dem HM-TC-IT-WM-W-EU und dem HM-CC-RT-DN es geht einfach nicht wieso.
musste von der 2.12 auf die neuste wechseln, wegen Wechsel auf x86ccu
lasse ich das script durchlaufen:
was ich auch nicht verstehe ist was wird unter string thermostat = ""; angegeben HM-TC-IT-WM-W-EU oder HM-CC-RT-DN oder doch beide?
Noch ein Nachtrag, das script schreibt in den Steller aber das Thermostat überschreibt das ganze wieder nach ca. 1 Minute
musste von der 2.12 auf die neuste wechseln, wegen Wechsel auf x86ccu
lasse ich das script durchlaufen:
nach kurzer Zeit hüpf die Temperatur wieder auf den alten wert zurück.Soll-Ist = 20.0°C (HssType: HM-TC-IT-WM-W-EU)
Soll-Ist = 20.0°C (HssType: HM-CC-RT-DN)
HM-Sec-SC: geschlossen
HM-Sec-SC-2: geschlossen
Neue Solltemperatur (19°C) an Thermostat gesendet!
Letzter Zeitstempel (Sollwertänderung Thermostat): 2019-04-03 18:47:39
was ich auch nicht verstehe ist was wird unter string thermostat = ""; angegeben HM-TC-IT-WM-W-EU oder HM-CC-RT-DN oder doch beide?
Noch ein Nachtrag, das script schreibt in den Steller aber das Thermostat überschreibt das ganze wieder nach ca. 1 Minute
-
- Beiträge: 14085
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 580 Mal
- Danksagung erhalten: 1492 Mal
Re: Heizungsthermostatscript V2.0
Das ist logisch, weil entsprechend der Anleitung des Herstellers Solltemperaturen nicht an die physischen Geräte gesendet werden sollen, sondern ins erstellte virtuelle Gerät der Gruppe geschrieben werden sollen.
Gruß Xel66
Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch
-
- Beiträge: 2482
- Registriert: 13.02.2012, 20:23
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 300 Mal
- Danksagung erhalten: 116 Mal