NEWS
[Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.
-
Hallo in die Runde,
da wir hier nur Wand- und Fussbodenheizung mit allen bekannten Vor- und Nachteilen haben,
gefällt mir das Script eigentlich ganz gut.
Der einzige Haken für mich ist ich möchte das gern mit "Non" HM-Hardware verwenden da ich nun mal keine HM-Hardware habe.
Abhilfe soll folgendes Konstrukt in der Funktion "controlFBHAktor" bringen.
function controlFBHAktor(roomName, enabled, time) { var useSupport = false; if (rooms[roomName].stateIdHeizungUnterstuetzungAktor) { var isttemperatur = getState(rooms[roomName].stateIdIstTemperatur).val; var solltemperatur = getState(rooms[roomName].stateIdSollTemperatur).val; if (enabled && solltemperatur - isttemperatur > rooms[roomName].heizunterstuetzungKelvin) { if (debug) {console.log(' Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');} useSupport = true; } else if (!enabled || getState(rooms[roomName].stateIdHeizungUnterstuetzungAktor).val) useSupport = true; } if (enabled && time) { time = Math.round(time); setState(rooms[roomName].stateIdHeizungAktorOnTime, time, false, function() { if (debug) {console.log(' * Steuern Aktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');} setState(rooms[roomName].stateIdHeizungAktor, true, false); // ************************************************************************ // ************************** AB HIER ! ******************************** let startTime = new Date(Date.now() + time * 1000); console.log(roomName + '.Aktor aus um: ' + startTime); let endTime = new Date(startTime.getTime() + 1000); //console.log(endTime); clearSchedule(rooms[roomName].sch); rooms[roomName].sch = schedule({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function () { setState(rooms[roomName].stateIdHeizungAktor, false ); setState(rooms[roomName].stateIdHeizungAktorOnTime,0 ); clearSchedule(rooms[roomName].sch); }); // ************************** BIS HIER ! ******************************** // ************************************************************************ if (useSupport) { setState(rooms[roomName].stateIdHeizungUnterstuetzungAktorOnTime, time, false, function() { if (debug) {console.log(' Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ', tempDiff=' + (solltemperatur - isttemperatur) + ')');} setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, true, false); }); } }); } else { if (debug) {console.log(' Steuern Aktor FBH ' + roomName + '--> ' + enabled);} setState(rooms[roomName].stateIdHeizungAktor, enabled, false); if (useSupport) { if (debug) {console.log(' Steuern UnterstützungsAktor FBH ' + roomName + '--> ' + enabled);} setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, enabled, false); } }
Ich lass da einfach für jeden Schaltvorgang ein "Schedulereintrag" erstellen welcher nach der errechneten Zeit den "Aktor" auf "false" und die "Zeit" auf "0" setzt und sich danach selbst löscht.
Im "Trockentest" mit 4 Räumen klappt das schon mal wie gewünscht.
Bevor ich das aber in die Praxis umsetze,
was sagt ihr dazu?
Kann man das so machen oder gibt es eine bessere (elegantere) Lösung?
-
Hab mir das vorhin aucb für sonoff 4ch umgeschrieben.
Ich nehme einfach ein settimeout von JS.
Im Livetest hatte ich vorhin die schönste Kurve bisher. Besser als meine PI - Regler Versuche
so siehts grad aus: Hab etwas abgespeckt mit den Supportaktoren.
function controlFBHAktor(roomName, enabled, time) { var useSupport = false; if (enabled && time) { time = Math.round(time); if(debug) { console.log("switchoff timer: "+ time+""); } clearTimeout(rooms[roomName].timeout) setState(rooms[roomName].stateIdHeizungAktor, enabled, false); rooms[roomName].timeout = setTimeout(function() {switchOff(rooms[roomName].stateIdHeizungAktor); }, time * 1000); } else { console.log("enabled = "+enabled); if (debug) {console.log(' Steuern Aktor FBH ' + roomName + '--> ' + enabled);} setState(rooms[roomName].stateIdHeizungAktor, enabled, false); } } function switchOff(id) { console.log("Ausschalten"); setState(id, false); }
-
Hi, effektiv sind die Lösungen valide so.
Meine Idee wäre es über eigene Javascript-States wegzukapseln. Also einen "virtuellen" "on-time" und "state" Datenpunkt anlegen der dann gekapselt in einem eigenen Skript das ganze Schaltet.
Im Skript hier wäre es dann keine änderung sondern nurdie Nutzung dieser virtuellen State-IDs im Skript. Das ist das flexibelste um bei Skriptänderungen schnell updaten zu können … sonst müsst Ihr immer alle Eure Änderungen wieder mühselig einbauen.
-
Meine Idee wäre es über eigene Javascript-States wegzukapseln. Also einen "virtuellen" "on-time" und "state" Datenpunkt anlegen der dann gekapselt in einem eigenen Skript das ganze Schaltet. `
..ich hatte ja nicht umsonst nach einer eleganteren Lösung gefragt.
Der Ansatz gefällt mir recht gut, vor allen das man nichts am eigentlichen Script ändern muss klingt gut.
Zum testen verwende ich ja aktuell "virtuelle" Datenpunkte, beste Basis also um das mal mit einem eigenen Script umzusetzen! :roll:
Vielen Dank für den Denkanstoss!
Danke auch an David für die Vorstellung seiner Lösung.
-
Meine Idee wäre es über eigene Javascript-States wegzukapseln. Also einen "virtuellen" "on-time" und "state" Datenpunkt anlegen der dann gekapselt in einem eigenen Skript das ganze Schaltet. `
ist wohl der sinnvollste Ansatz wenn die Entwicklung am Script dynamisch bleibt.
Was ich gern noch hätte wäre den Vorlauf einzubeziehen. Dieser schwankt bei mir recht stark zwischen 22 und 30 °C. Der verändert ja auch stark die Heizleistung die in den Boden gebracht werden kann.
Gedankengang wäre ein Vorlauf Soll anhand der Außentemperatur zu berechnen und dann die Zeit mit einem Faktor zum entsprechenden Soll anzupassen.
Wenn der Einzug endlich hinter mir ist, muss ich mir mal die Zeit nehmen das Script komplett zu verstehen
-
Ich habe(siehe erster Post) das Skript quasi aus einem Homematic Skript auf dem HM-Forum "portiert" und seitdem läuft es so.
Die Idee mit der Aussentemperatur-/Vorlaufsteuerung gabs im Thread auch schonmal … schau mal.
Die Idee von dem Skript ist ja das das am Ende alles egal ist. Das Skript schaut was "im Raum" passiert und das ist das relevante. Egal wieviel Sonne von draussen auf das Zimmer knallt (und heizt) und was der Boden mit der aktuellen Vorlauftemperatur heizt, das Skript schaut wie sich die Temperatur in den letzten 20 Minuten geändert hat und rechnet das hoch auf die Ist/Solltemperatur und entscheidet wie lange geheizt werden muss damit es auch nicht übersteuert (eins der großen Themen bei einer FBH) weil der Boden nämlich nachheizt. Und ein Raum im Dachgeschoss bei viel Sonne verhält sich (bei gleicher Vorlauftemperatur) ganz anders als einer im Erdgeschoss oder Keller
In sofern entscheidet das Skript auch nur im Rahmen dieser 20 Minuten Zeitscheiben. Da Zeiten draufzuaddieren macht daher wenig sinn. Wenn es viel kälter ist ist die Heizung eh die ganzen 20 Minuten an. Wenn es weniger als 20 Minuten an ist dann liegt (bei normal-trägen FBHs) die Temperatur schon recht nah um die Zieltemperatur drum rum ...und wenn DU dann verlängerst übersteuerst Du.
AM besginn vom Skript sind ein paar Variablen wo du noch ein bissl mit rumspielen kannst um auf/abschläge zu realisieren. Details im HM Forum Thread.
Ich selbst habe einiges rum experimentiert und ehrlich es kam immer müll raus weil du die vielen Faktoren alle nicht kontrollieren kannst und jeder Faktor andere Auswirkungen hat.
Ingo
-
Hi Apollon77,
ist dieser Thread eigentlich noch richtig ? Ich verwende Dies Script von Dir und finde wirklich gut.
Als Heizungsaktor habe ich einen Stellantrieb , der durch einen Meross-Switch angestoßen wird.
Dadurch dass ich einen Merossswitch nehme, kann ich auch nicht die Variable "stateIdHeizungAktorOnTime" füllen. Ich habe sie leergelassen, aber mich stört, dass ich dann eine Meldung im Log bekomme. Kann ich dort etwas eintragen?Schöne Grüße
Thomas -
Wollte mich einfach mal für ein geiles Skript bedanken. Hab es vor ein paar Tagen in Betrieb genommen und funktioniert wunderbar
-
Ich glaube ich habe noch einen kleinen Fehler im Skript gefunden. Müsste es nicht in der onstop Funktion in der if-Funktion
statt:
if (rooms[roomname].skriptTimeout) {So lauten:
if (rooms[room].skriptTimeout) {Danke und Grüße!
-
@unterstedter Hast Recht!
-
Moin,
ich habe den Verdacht, daß das Script mit der aktuellen JS-Engine nicht richtig zusammenspielt.
Das Script lief mehrere Monate fehlerfrei mit Homematic-230V DIN-Schienen 4fach Aktoren und 230V-Fußbodenreglern über ein Raspberrymatic mit Charly-Funkmodul.
Seit 1-2 Wochen (in etwa, seit ein Update der JS-Engine kam) werden rein über die Fußbodenheizung beheizte Räume nicht mehr warm. In FLOT-Diagrammen zeigt sich, daß die Aktoren nur ganz kurz oder gar nicht angehen:
Oder nur viel zu spät und zögerlich angehen:
Ich bin ehrlich gesagt etwas ratlos, was sonst nicht funktionieren könnte.
Hat jemand ähnliche Probleme?
Danke, -MN
-
@morgennebel Hast du im Skript mal "debug" eingeschaltet, dann solltest Du sehen was er wann tut und wann/warum nicht
-
@apollon77
Gerade aktiviert. Bei 24 Kreisen ist das recht umfangreich. Lässt sich das auf 2 Kreise irgendwie reduzieren?Danke für die schnelle Hilfe,
Ciao, -MN
-
@morgennebel Nicht ohne das Skript anzupassen ... debug mode geht nur alles oder nicht
-
@apollon77 Danke für den Hinweis.
Nach dem Logfile zu schließen, ist der Homematic 4fach-Aktor defekt:
2021-03-24 05:01:51.890 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: ist ausgeschaltet und soll eingeschaltet sein 2021-03-24 05:01:51.890 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Ende Gaestezimmer-Rechts, Nächster Lauf in 20m 2021-03-24 05:01:51.892 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Steuern Aktor FBH Gaestezimmer-Links --> true (time=36000) 2021-03-24 05:01:51.892 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Steuern Aktor FBH Gaestezimmer-Rechts --> true (time=36000) 2021-03-24 05:01:51.895 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Links: false--> true (ack=false, from=system.adapter.javascript.0) 2021-03-24 05:01:51.895 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Rechts: false--> true (ack=false, from=system.adapter.javascript.0) 2021-03-24 05:01:52.077 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Links: true--> true (ack=true, from=system.adapter.linkeddevices.0) 2021-03-24 05:01:52.236 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Rechts: true--> true (ack=true, from=system.adapter.linkeddevices.0) 2021-03-24 05:01:53.383 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Links: true--> false (ack=true, from=system.adapter.linkeddevices.0) 2021-03-24 05:01:54.051 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Ineke-Schlaf: false--> false (ack=true, from=system.adapter.linkeddevices.0) 2021-03-24 05:01:54.518 - info: javascript.0 (32697) script.js.Heizung.Fussboden_PWM-Steuerung: Änderung Status Aktor FBH Gaestezimmer-Rechts: true--> false (ack=true, from=system.adapter.linkeddevices.0)
Das ist dann kein Script- sondern ein Homematic-Fehler...
Es sei denn, die ON_TIME-Befehle sind zeitlich zu nah beim SET ON-Befehl?
Danke, -MN
-
@apollon77 cooles script, aber wie könnte ich das für IR-Paneel nutzen?
ich hab natürlich einen aktor (ein/aus) einen Tempfühler für. benötige ich noch etwas? -
@homecineplexx Ich verstehe die Frage nicht?! Du brauchst einen Aktor der das IR Panel ein bzw aus schaltet ... rest siehe oben
-
@apollon77 said in [Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.:
@homecineplexx Ich verstehe die Frage nicht?! Du brauchst einen Aktor der das IR Panel ein bzw aus schaltet ... rest siehe oben
Und wie ist das mit dem On_Time, was ich nicht habe?
-
@homecineplexx sagte in [Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.:
Und wie ist das mit dem On_Time, was ich nicht habe?
der Datenpunkt On_time speichert den Ausschaltezeitpunkt direkt im Aktor.
Wenn deine Aktor das nicht kann musst du nach dieser Zeit selber wieder ausschalten.Die zusätzliche Sicherheit, dass der Aktor auch ausschaltet, wenn in der Zwischenzeit deine Logik abraucht, hast du dann allerdings nicht
-
@homecineplexx Dann entweder einen Aktor nehmen der es kann oder du musst einen javascript state nehmen mit nem Skript der das dann simuliert. Kann der das wirklich nicht ?