NEWS
[Vorlage] Heizungsthermostatsteuerung 2.1 - Script
-
edit: im Anhang,korrigierte VIS mit 3 Profilen. Hoffe so kann ich etwas unterstützen… `
Hi,das ist perfekt. Ich danke dir.
Ich werde draus eine subversion machen und online stellen.
Beim Script muss ich immer eine online Version erstellen, die nicht so ist wie ich mit meiner Version arbeite.
Da ist mir der Testraum untergegangen. Gibt auch eine Subversion.
zum Thema der Sekunden in VIS: das ist leider VIS-seitig so. Die Sekunden werden in der Tat NICHT angezeigt, wenn die Auswahl machst. Dann aber im Widget wieder angezeigt. –> Works as designed <-- aber nicht great
Nochmals vielen Dank
Looxer
-
Der QuickFix hört sich gut an
Allerdings komme ich mit der Minimal Temperatur auch nur bis 12 Grad. Diese müsste dann auch noch ausgeweitet werden.
Über eine Umsetzung des QuickFix würde ich mich jedenfalls sehr freuen. `
Ich persönlich habe zwar das neue Script eingebaut, aber die Views sind bisher noch die alten. Von daher ist das für mich egal. `
danke für euer Feedback. Wie Chaot hier schreibt nutzt er und viele andere nicht unbedingt die View die zur Script-Version veröffentlicht wurde. Das ist ok so und das soll auch so weiterhin möglich sein. Es ist beispielsweise heute noch möglich die View aus 1.0 zu verwenden, und zwar ohne Korrektur.
Daher werde ich die View nicht anpassen. Also habe ich mir folgende Alternative überlegt.
-
im Script gibt es eine Auswahlmöglichkeit entweder mit relativen oder absoluten Abwesenheitsabsenkungen zu arbeiten.
-
Bei Auswahl von absolution Absenkungen muss dann der jeweilie Nutzer eine kleine Anpassung an der View vornehmen:
(Kopie des Widgets, z.B. Minimaltemperatur an die Stelle der Abwesenheitssenkung und dann Korrektur des Datenpunktes im Widget.)
Damit bleiben Script und View abwärtskompatibel und trotzdem kann mit absoluten Temps garbeitet werden.
Moses war ja auch nicht der einzige, der danach fragte.
vG Looxer
-
-
Hi Looxer,
danke für das Update des Scripts, tolle Arbeit!
Das Thema mit dem Delay für nicht HM-Verschlusssensoren ist somit Geschichte!
Leider habe ich aktuell das Problem, dass mein zweites Heizkörperthermostat im Wohnzimmer nicht synchronisiert wird, wenn dass Fenster geöffnet wurde. Es findet keine Solltemperaturabsenkung auf den eingestellten Wert statt (in meinem Fall 12 °C). Sonst laufen die beiden Thermostate synchron.
Hast du ne Idee, was das sein kann? Danke!
Grüße,
Max
-
Hast du ne Idee, was das sein kann? Danke! `
Ich hatte dazu ein Stück Coding entfernt, weil ich eigentlich annahm, dass es an anderer Stelle zieht.Kannst du mal bitte zum Testen das untere Stück Coding wieder aktivieren ?
Brauchst nur die Zeilen /* und */ entfernen
vG Looxer
EDIT
sorry - besser so
tausche bitte aus:
//----------------------------------------------------------------------------------------------------- // Funktion ThermostatChange erkennt die Veraenderung der Solltemperatur durch subsription //----------------------------------------------------------------------------------------------------- function ThermostatChange(id) { var ManAdj; var room; var ActTime = formatDate(new Date(),"YYYY/MM/DD SS:mm:ss"); // Formatierte Aktuelle Zeit var ActTimeMilliSek = new Date(ActTime).getTime(); // Aktuelle Zeit in Millisekunden seit 1970 var LastRoomUpdate; var source_ManTempSet; Source_CurrentSollTemp = 0; // Ruecksetzen der current SollTemp fuer nachfolgende Programme for (var x in ControlTab ) { if (ControlTab[x][1] === id ) { room = ControlTab[x][0]; LastRoomUpdate = ActTimeMilliSek - LastRoomUpdateTime(room, "find"); // Differenzzeit aus dieser Zeit und der letzten updatezeit des Raumes (Vermeidung von eigenen Triggern wenn die Solltemp geaendert wird) if ( LastRoomUpdate < 1000) { // der Raum wurde vor weniger als 1 Sekunde bereits upgedated if (debug) { log("Routine ThermostatChange: Der Raum wurde vor weniger als 1 Sekunde bereits upgedated Aenderung wird ignoriert " + LastRoomUpdate, "info"); } return; } writelog(room, id, "Am Thermostat wurde eine neue Soll-Temperatur erkannt " + getState(id).val); log("Routine ThermostatChange: " + id + " Raum " + room + " Solltemperatur-Aenderung erkannt auf " + getState(id).val , "info"); source_ManTempSet = getState(id).val; if (source_ManTempSet !== VerschlussAbsenkungsGrenze) { writelog(room, id, "Routine ThermostatChange: Thermostat " + id + " Raum " + room + " Thermostat Solltemperatur-Aenderung erkannt auf " + source_ManTempSet) ; LoopDevices(room); } else { writelog(room, id, "Routine ThermostatChange: Temperaturabsenkung erkannt" + id + " Raum " + room + " auf: " + source_ManTempSet ) ; } /* if (Source_ManTempSet === null) { // log("Routine ThermostatChange: ACHTUNG Fall 1 ThermostatChange in Temperatur Source_ManTempSet hat keinen Wert - kann nicht synchen") return; } if (debug) { log("Routine ThermostatChange: Starte Sync fuer Manuelle Temperatur fuer " + id + " Temperatur = " + Source_ManTempSet, "info"); } SyncThermostat(room, "ManualTemp", Source_ManTempSet, id); // jetzt manuelle Temp synchen return; */ } // ID in controll tab gefunden } // endfor } // ende Funktion
gegen:
//----------------------------------------------------------------------------------------------------- // Funktion ThermostatChange erkennt die Veraenderung der Solltemperatur durch subsription //----------------------------------------------------------------------------------------------------- function ThermostatChange(id) { var ManAdj; var room; var ActTime = formatDate(new Date(),"YYYY/MM/DD SS:mm:ss"); // Formatierte Aktuelle Zeit var ActTimeMilliSek = new Date(ActTime).getTime(); // Aktuelle Zeit in Millisekunden seit 1970 var LastRoomUpdate; var source_ManTempSet; Source_CurrentSollTemp = 0; // Ruecksetzen der current SollTemp fuer nachfolgende Programme for (var x in ControlTab ) { if (ControlTab[x][1] === id ) { room = ControlTab[x][0]; LastRoomUpdate = ActTimeMilliSek - LastRoomUpdateTime(room, "find"); // Differenzzeit aus dieser Zeit und der letzten updatezeit des Raumes (Vermeidung von eigenen Triggern wenn die Solltemp geaendert wird) if ( LastRoomUpdate < 1000) { // der Raum wurde vor weniger als 1 Sekunde bereits upgedated if (debug) { log("Routine ThermostatChange: Der Raum wurde vor weniger als 1 Sekunde bereits upgedated Aenderung wird ignoriert " + LastRoomUpdate, "info"); } return; } writelog(room, id, "Am Thermostat wurde eine neue Temperatur eingestellt " + getState(id).val); log("Routine ThermostatChange: " + id + " Raum " + room + " Solltemperatur-Aenderung erkannt auf " + getState(id).val , "info"); source_ManTempSet = getState(id).val; if (source_ManTempSet !== VerschlussAbsenkungsGrenze) { writelog(room, id, "Routine ThermostatChange: Thermostat " + id + " Raum " + room + " Thermostat Solltemperatur-Aenderung erkannt auf " + source_ManTempSet) ; ManAdj = ManAdjustments(room, id); } else { writelog(room, id, "Routine ThermostatChange: Temperaturabsenkung erkannt" + id + " Raum " + room + " auf: " + source_ManTempSet ) ; } if (Source_ManTempSet === null) { // log("Routine ThermostatChange: ACHTUNG Fall 1 ThermostatChange in Temperatur Source_ManTempSet hat keinen Wert - kann nicht synchen") return; } if (debug) { log("Routine ThermostatChange: Starte Sync fuer Manuelle Temperatur fuer " + id + " Temperatur = " + Source_ManTempSet, "info"); log("ControlTab " + ControlTab[x], "info"); } SyncThermostat(room, "ManualTemp", Source_ManTempSet, id); // jetzt manuelle Temp synchen return; } } } // ende Funktion
-
Hi,
ich habe die Script Version 2.10_01 hochgeladen um zwei kritische Fehler zu korrigieren
-
Raum Testraum erzeugte Fehler
-
Termostat Sync bei AbsenkTemp funktionierte nicht mehr.
die View - Korrekturen folgen noch
vG Looxer
-
-
Jetzt hätte ich auch einmal wieder eine Frage. Ich hab das Script laufen Version: 2.00b02 und hab in dieser Version ab Zeile 487 was geändert.
Muss man das komplette Script erneuern und kann ich das ab Zeile 487 wieder eintragen? Hier wird erzwungen, dass die HKT´s von einem anderen Programm einen Sollwert bekommen. `
Hi Quorle,ich habe den "UserExit" zu ende programmiert. Damit kannst du Bedingungen definieren wie z.B. ein Datenpunkt hat eine Aenderung oder ist groesser oder kleiner als ein Vorgabewert etc. Im UserExit gibt es eine Routine die den Wert des Datenpunktes nimmt und als manuelle Temp einstellt. Auch lässt sich die Routine erweitern um weitere Daten einzulesen um ggf eine andere SollTemp zu ermitteln.
Zusammenfassend:
-
Der Wert eines Datenpunktes kann bei dessen Aenderung in die manuelle Temp eingestellt werden (auch ohne zusätzliches Coding)
-
zusätzliches Coding erlaubt weitere Veränderung zur Ermittlung einer von aussen kommenden SollTemp
Würde das das abdecken was du brauchst ?
Wenn ja - würdest du das mal testen können ?
vG Looxer
-
-
Gibt es eine Möglichkeit eine feste Abwesenheits-Temperatur (Absenktemperatur) pro Raum zu definieren? `
Hi Moses,
ich habe das mal eingebaut. Um das zu aktivieren muss eine Einstellung vorgenommen werden.
Die variable heisst "AbsenkTempAbsolut". Wenn diese auf true steht wird davon ausgegangen, dass im View eine absolute Temp eingegeben wird.
Dazu muss aber das Widget geändert werden (kopieren von z.B. MinimalTemperatur und das alte Widget loeschen) und natürlich die Zuordnung des Datenpunktes.
Waerest du bereit das mal zu testen ?
vG Looxer
-
Gibt es eine Möglichkeit eine feste Abwesenheits-Temperatur (Absenktemperatur) pro Raum zu definieren? `
Hi Moses,
ich habe das mal eingebaut. Um das zu aktivieren muss eine Einstellung vorgenommen werden.
Die variable heisst "AbsenkTempAbsolut". Wenn diese auf true steht wird davon ausgegangen, dass im View eine absolute Temp eingegeben wird.
Dazu muss aber das Widget geändert werden (kopieren von z.B. MinimalTemperatur und das alte Widget loeschen) und natürlich die Zuordnung des Datenpunktes.
Waerest du bereit das mal zu testen ?
vG Looxer `
Würde auch testen, stellst du die Version mal rein?
-
-
Hi,
die View (Widgets) für die 3Profile ist korrigiert und hochgeladen.
Danke an @Admin für die Vorlage.
vG Looxer
-
Hi Moses,
ich habe das mal eingebaut. Um das zu aktivieren muss eine Einstellung vorgenommen werden.
Die variable heisst "AbsenkTempAbsolut". Wenn diese auf true steht wird davon ausgegangen, dass im View eine absolute Temp eingegeben wird.
Dazu muss aber das Widget geändert werden (kopieren von z.B. MinimalTemperatur und das alte Widget loeschen) und natürlich die Zuordnung des Datenpunktes.
Waerest du bereit das mal zu testen ?
vG Looxer `
Wow das ging aber verdammt schnell! Vielen Dank schonmal
Klar würde ich es testen!
Grüße Moses
-
Hi,
ich fasse mal die Fragen/Antworten der letzten posts hier zusammen-
- Die Möglichkeit die Anwesenheit für bestimmte Räume hinzuzufügen. Beispiel: Tochter verlässt das Haus, also braucht dieser Raum (SchlafzimmerOG) während ihrer Abwesenheit nicht weiter geheizt werden bzw. kann abgesenkt werden. Alle anderen Räume hingegen müssen ganz normal weiter laufen. `
Das geht relativ easy. Generell führen neue Funktionen natürlich zu mehr Komplexität z.B. beim Konfigurieren. (mehr Fragen / Doku etc)
Ich denke, dass es um Kinderzimmer geht.
Tatsächlich habe ich auch mal darüber nachgedacht und dann befunden, dass zumindest meine Kinder keine "Ich mach die Türe zu, wenn ich geh" - Kinder sind . Die Funktion wäre ja nur sinnvoll, wenn dies auch konsequent gemacht wird.
Ich nehme es mal mit auf `
Ja, Kinderzimmer oder WG-Zimmer.Wir haben an jeder Tür diese Automatischen Schließer installiert. Damit die Kinder nicht ständig die Türen offen stehen lassen.
- Die Möglichkeit die Anwesenheit für bestimmte Räume hinzuzufügen. Beispiel: Tochter verlässt das Haus, also braucht dieser Raum (SchlafzimmerOG) während ihrer Abwesenheit nicht weiter geheizt werden bzw. kann abgesenkt werden. Alle anderen Räume hingegen müssen ganz normal weiter laufen. `
-
Hast du ne Idee, was das sein kann? Danke! `
Ich hatte dazu ein Stück Coding entfernt, weil ich eigentlich annahm, dass es an anderer Stelle zieht.Kannst du mal bitte zum Testen das untere Stück Coding wieder aktivieren ?
Brauchst nur die Zeilen /* und */ entfernen
vG Looxer
EDIT
sorry - besser so
tausche bitte aus:
//----------------------------------------------------------------------------------------------------- // Funktion ThermostatChange erkennt die Veraenderung der Solltemperatur durch subsription //----------------------------------------------------------------------------------------------------- function ThermostatChange(id) { var ManAdj; var room; var ActTime = formatDate(new Date(),"YYYY/MM/DD SS:mm:ss"); // Formatierte Aktuelle Zeit var ActTimeMilliSek = new Date(ActTime).getTime(); // Aktuelle Zeit in Millisekunden seit 1970 var LastRoomUpdate; var source_ManTempSet; Source_CurrentSollTemp = 0; // Ruecksetzen der current SollTemp fuer nachfolgende Programme for (var x in ControlTab ) { if (ControlTab[x][1] === id ) { room = ControlTab[x][0]; LastRoomUpdate = ActTimeMilliSek - LastRoomUpdateTime(room, "find"); // Differenzzeit aus dieser Zeit und der letzten updatezeit des Raumes (Vermeidung von eigenen Triggern wenn die Solltemp geaendert wird) if ( LastRoomUpdate < 1000) { // der Raum wurde vor weniger als 1 Sekunde bereits upgedated if (debug) { log("Routine ThermostatChange: Der Raum wurde vor weniger als 1 Sekunde bereits upgedated Aenderung wird ignoriert " + LastRoomUpdate, "info"); } return; } writelog(room, id, "Am Thermostat wurde eine neue Soll-Temperatur erkannt " + getState(id).val); log("Routine ThermostatChange: " + id + " Raum " + room + " Solltemperatur-Aenderung erkannt auf " + getState(id).val , "info"); source_ManTempSet = getState(id).val; if (source_ManTempSet !== VerschlussAbsenkungsGrenze) { writelog(room, id, "Routine ThermostatChange: Thermostat " + id + " Raum " + room + " Thermostat Solltemperatur-Aenderung erkannt auf " + source_ManTempSet) ; LoopDevices(room); } else { writelog(room, id, "Routine ThermostatChange: Temperaturabsenkung erkannt" + id + " Raum " + room + " auf: " + source_ManTempSet ) ; } /* if (Source_ManTempSet === null) { // log("Routine ThermostatChange: ACHTUNG Fall 1 ThermostatChange in Temperatur Source_ManTempSet hat keinen Wert - kann nicht synchen") return; } if (debug) { log("Routine ThermostatChange: Starte Sync fuer Manuelle Temperatur fuer " + id + " Temperatur = " + Source_ManTempSet, "info"); } SyncThermostat(room, "ManualTemp", Source_ManTempSet, id); // jetzt manuelle Temp synchen return; */ } // ID in controll tab gefunden } // endfor } // ende Funktion
gegen:
//----------------------------------------------------------------------------------------------------- // Funktion ThermostatChange erkennt die Veraenderung der Solltemperatur durch subsription //----------------------------------------------------------------------------------------------------- function ThermostatChange(id) { var ManAdj; var room; var ActTime = formatDate(new Date(),"YYYY/MM/DD SS:mm:ss"); // Formatierte Aktuelle Zeit var ActTimeMilliSek = new Date(ActTime).getTime(); // Aktuelle Zeit in Millisekunden seit 1970 var LastRoomUpdate; var source_ManTempSet; Source_CurrentSollTemp = 0; // Ruecksetzen der current SollTemp fuer nachfolgende Programme for (var x in ControlTab ) { if (ControlTab[x][1] === id ) { room = ControlTab[x][0]; LastRoomUpdate = ActTimeMilliSek - LastRoomUpdateTime(room, "find"); // Differenzzeit aus dieser Zeit und der letzten updatezeit des Raumes (Vermeidung von eigenen Triggern wenn die Solltemp geaendert wird) if ( LastRoomUpdate < 1000) { // der Raum wurde vor weniger als 1 Sekunde bereits upgedated if (debug) { log("Routine ThermostatChange: Der Raum wurde vor weniger als 1 Sekunde bereits upgedated Aenderung wird ignoriert " + LastRoomUpdate, "info"); } return; } writelog(room, id, "Am Thermostat wurde eine neue Temperatur eingestellt " + getState(id).val); log("Routine ThermostatChange: " + id + " Raum " + room + " Solltemperatur-Aenderung erkannt auf " + getState(id).val , "info"); source_ManTempSet = getState(id).val; if (source_ManTempSet !== VerschlussAbsenkungsGrenze) { writelog(room, id, "Routine ThermostatChange: Thermostat " + id + " Raum " + room + " Thermostat Solltemperatur-Aenderung erkannt auf " + source_ManTempSet) ; ManAdj = ManAdjustments(room, id); } else { writelog(room, id, "Routine ThermostatChange: Temperaturabsenkung erkannt" + id + " Raum " + room + " auf: " + source_ManTempSet ) ; } if (Source_ManTempSet === null) { // log("Routine ThermostatChange: ACHTUNG Fall 1 ThermostatChange in Temperatur Source_ManTempSet hat keinen Wert - kann nicht synchen") return; } if (debug) { log("Routine ThermostatChange: Starte Sync fuer Manuelle Temperatur fuer " + id + " Temperatur = " + Source_ManTempSet, "info"); log("ControlTab " + ControlTab[x], "info"); } SyncThermostat(room, "ManualTemp", Source_ManTempSet, id); // jetzt manuelle Temp synchen return; } } } // ende Funktion ```` `
Hi Looxer,
leider werden die beiden Thermostate mit dieser Änderung nicht synchronisiert.
Grüße
-
leider werden die beiden Thermostate mit dieser Änderung nicht synchronisiert. `
Hi,ich gehe davon aus, dass das syncing in der Version 2.0 funktionierte ?
In diesem Fall bitte probiere die Version, die ich aktuell hochgeladen habe.
Ist im Grunde der alte Code.
vG Looxer
-
Hallo looxner01,
Nun erst einmal wieder ein Riesen Dankeschön für das Script. Ich habe nun die aktuelle Version implementiert und meine Anpassungen eingetragen. Bislang läuft es wirklich sauber und besser.
Trotzdem habe ich Probleme mit dem VIEW. Ich schreibe wie immer alles auf die Räume um ( Kind1,Flur, usw… ), aber irgendwie steht da etwas komischen in den Stateangaben bei den Einstellfenster für die Zeiten in Temperaturen.
Sieh dir mal im Bild das Object ID bitte an. Das ist doch nicht richtig?
Ich hab aktuell nur 1 Profil, dann müsste dies doch auf Profil 1 gehen, oder sehe ich das jetzt falsch? Denn wenn ich eine Zeit oder Temperatur ändere, wird dies nicht in die States eingetragen. Es gibt ja das oben genannte ( Bild ) State gar nicht.
Kannst du dir das erklären?
-
leider werden die beiden Thermostate mit dieser Änderung nicht synchronisiert. `
Hi,ich gehe davon aus, dass das syncing in der Version 2.0 funktionierte ?
In diesem Fall bitte probiere die Version, die ich aktuell hochgeladen habe.
Ist im Grunde der alte Code.
vG Looxer `
ja, in der 2.0 funktioniert es.
Ich habe zuerst das aktuelle Script (Version 2.1.01) ausprobiert, denn laut Beschreibung müsste das Problem gefixt sein.
Im nächsten Schritt habe ich die vorgeschlagene Änderung in 2.1.01 eingearbeitet.
Ging in beiden fällen nicht…
Grüße
-
Kannst du dir das erklären? `
ja, liegt leider an mir :shock:Der view ist leider fehlerhaft.
der 3-Profile View sollte schon ok sein. Den 1-Profil View ersetze ich Morgen.
Solange benutze bitte noch den alten View. Funktioniert ja noch.
vG Looxer
-
Kannst du dir das erklären? `
ja, liegt leider an mir :shock:Der view ist leider fehlerhaft.
der 3-Profile View sollte schon ok sein. Den 1-Profil View ersetze ich Morgen.
Solange benutze bitte noch den alten View. Funktioniert ja noch.
vG Looxer `
Super danke, du bist der beste
-
ja, in der 2.0 funktioniert es.
ch habe zuerst das aktuelle Script (Version 2.1.01) ausprobiert, denn laut Beschreibung müsste das Problem gefixt sein.
Im nächsten Schritt habe ich die vorgeschlagene Änderung in 2.1.01 eingearbeitet.
Ging in beiden fällen nicht… `
Hast du auch die 2.10-01 versucht wie sie hochgeladen ist ? Die enthält schon die relevanten Aenderungen.
vG Looxer
-
Hast du auch die 2.10-01 versucht wie sie hochgeladen ist ? Die enthält schon die relevanten Aenderungen.
vG Looxer
Ja, das habe ich im ersten Schritt gemacht - wie oben erwähnt. War keine Synchronisation da.
Grüße