NEWS
Einfache Heizungsreglung
-
Wie zeige ich dir denn das Objekt?

So?
Und danke für den Tip mit dem Leerzeichen. Die ganze ETS Installation erschlägt mich noch, aber ich werde das direkt mal anpassen.@mr-kan1ster
Im Expertenmodus siehst Du rechts neben dem Objekt einen Stift.
Darauf klicken und dann die "Objektdaten" hier posten. In Code-Tags </> !!! -
Wie zeige ich dir denn das Objekt?

So?
Und danke für den Tip mit dem Leerzeichen. Die ganze ETS Installation erschlägt mich noch, aber ich werde das direkt mal anpassen.@mr-kan1ster Wenn Du ganz oben links mal auf den Kopf klickst und den Expertenmodus einschaltest, erscheint hinten beim Wert noch so ein Bleistiftsymbol. Da klickst Du mal drauf und zeigst das hier. Dann sieht man, woraus das Objekt besteht.
Anschließend den Expertenmodus aber SOFORT wieder ausschaten!BTW: Je früher Du anfängst, die Leerzeichen aus allem zu verbannen, desto weniger Aufwand hast Du später, das in allen Scripten, VIS usw. geradezuzehen. Also auch am Besten sofort.
Gruss, Jürgen
EDIT: Ich sehe, der Datenpunkt hat vorne kein Leerzeichen, sondern einen Unterstrich. Das wäre dann auch OK!
-
@Mr-Kan1ster
Grundsätzlich gilt: Leer- und Sonderzeichen sind böse (Ausnahme: Unter- und Bindestrich).
Umlaute sind ganz ganz böse.Das gilt für Objekt-ID's und auch für Variablen- und Methodennamen bei der Programmierung (dort ist wieder der Bindestrich böse - also gleich wieder vergessen).
-
Hallo zusammen,
Ich scheine nichtmal die Grundlagen von blockly zu verstehen, denn ich scheitere schon am einfachsten Vergleich 2er Werte.
Ich versuche mich mal direkt an die Anfoderungen der anderen Posts zu halten und nicht lange zu schwafeln.Was ich versuche:
Falls sich die IST-Temperatur geändert hat
Vergleiche IST-Temperatur mit statischem Sollwert
Falls IST-Temp < Sollwert, mache das Ventil der Fußbodenheizung auf (Pulsweitenmodulation nutzt % also) 100
Sonst mache das Ventil zu, also 0%Ich sehe im ETS Busmonitor, dass jedes Mal wenn sich die IST-Temp ändert direkt eine Reaktion vom Skript folgt.
Leider ist es IMMER der "Sonst" weg.
Das ganze Ding aufbohren mit Fensterkontakt und Sommer Winterzeit, versuche ich erst gar nicht. Ich möchte nur, dass er wie ein richtiger Regler den vergleich macht, und den Wert an das Ventil sendet.Hier der Screenshot, darunder der Export.

<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</variable> </variables> <block type="variables_set" id=":zeA?20y*Tg3gh6l`#XY" x="-563" y="-612"> <field name="VAR" id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</field> <value name="VALUE"> <block type="math_number" id="}{p#)E;:IVfY|{NKnc0P"> <field name="NUM">22</field> </block> </value> <next> <block type="on" id="+@5PayeP*}[`W31?Hn9m"> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.Isttemperatur_Kind2</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="UJBeFU58ERJkbQ]G#7zS"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="@_YREWj:WhZ0.UT#cR6d"> <field name="OP">LT</field> <value name="A"> <block type="get_object" id="p(@zMuDhRpcba}`cKLcO"> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.Isttemperatur_Kind2</field> </block> </value> <value name="B"> <block type="variables_get" id="t7Gy8=I2]G.0|MAwe-)k"> <field name="VAR" id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="^zZ%fU{gsn*t?UaV@uGE"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.schaltende_Stellgröße_Kind2</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="VScSGUvke6=C4GFD/kzX"> <field name="NUM">100</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="control" id="{[cGXUC!mAzH}G{cNBw]"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.schaltende_Stellgröße_Kind2</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="ykWReqRYOeReqcXFl~*9"> <field name="NUM">0</field> </block> </value> </block> </statement> </block> </statement> </block> </next> </block> </xml> -
Hallo zusammen,
Ich scheine nichtmal die Grundlagen von blockly zu verstehen, denn ich scheitere schon am einfachsten Vergleich 2er Werte.
Ich versuche mich mal direkt an die Anfoderungen der anderen Posts zu halten und nicht lange zu schwafeln.Was ich versuche:
Falls sich die IST-Temperatur geändert hat
Vergleiche IST-Temperatur mit statischem Sollwert
Falls IST-Temp < Sollwert, mache das Ventil der Fußbodenheizung auf (Pulsweitenmodulation nutzt % also) 100
Sonst mache das Ventil zu, also 0%Ich sehe im ETS Busmonitor, dass jedes Mal wenn sich die IST-Temp ändert direkt eine Reaktion vom Skript folgt.
Leider ist es IMMER der "Sonst" weg.
Das ganze Ding aufbohren mit Fensterkontakt und Sommer Winterzeit, versuche ich erst gar nicht. Ich möchte nur, dass er wie ein richtiger Regler den vergleich macht, und den Wert an das Ventil sendet.Hier der Screenshot, darunder der Export.

<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</variable> </variables> <block type="variables_set" id=":zeA?20y*Tg3gh6l`#XY" x="-563" y="-612"> <field name="VAR" id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</field> <value name="VALUE"> <block type="math_number" id="}{p#)E;:IVfY|{NKnc0P"> <field name="NUM">22</field> </block> </value> <next> <block type="on" id="+@5PayeP*}[`W31?Hn9m"> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.Isttemperatur_Kind2</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="UJBeFU58ERJkbQ]G#7zS"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="@_YREWj:WhZ0.UT#cR6d"> <field name="OP">LT</field> <value name="A"> <block type="get_object" id="p(@zMuDhRpcba}`cKLcO"> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.Isttemperatur_Kind2</field> </block> </value> <value name="B"> <block type="variables_get" id="t7Gy8=I2]G.0|MAwe-)k"> <field name="VAR" id="(@L{1Dm:]ck~khb(y:~y">Solltemp Kind2</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="^zZ%fU{gsn*t?UaV@uGE"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.schaltende_Stellgröße_Kind2</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="VScSGUvke6=C4GFD/kzX"> <field name="NUM">100</field> </block> </value> </block> </statement> <statement name="ELSE"> <block type="control" id="{[cGXUC!mAzH}G{cNBw]"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">openknx.0.Kinderzimmer_2.Heizung_Kind_2.schaltende_Stellgröße_Kind2</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="ykWReqRYOeReqcXFl~*9"> <field name="NUM">0</field> </block> </value> </block> </statement> </block> </statement> </block> </next> </block> </xml>@mr-kan1ster
Meine einfache Zweipunktregelung sieht so aus:

Wenn die Temperatur unter 3.1°C sinkt, schalte Heizlüfter ein.
Steigt sie auf über 3.6°C schalte Heizlüfter ab.Die gewählten Temperaturen gewährleisten im Zusammenhang mit der thermischen Trägheit des Raumes, dass das System nicht anfängt zu schwingen.
-
@mr-kan1ster
Meine einfache Zweipunktregelung sieht so aus:

Wenn die Temperatur unter 3.1°C sinkt, schalte Heizlüfter ein.
Steigt sie auf über 3.6°C schalte Heizlüfter ab.Die gewählten Temperaturen gewährleisten im Zusammenhang mit der thermischen Trägheit des Raumes, dass das System nicht anfängt zu schwingen.
@pi-ter
Du solltest dann aber "Wert" nehmen und nicht den Wert noch 2x lesen.
-
@pi-ter
Du solltest dann aber "Wert" nehmen und nicht den Wert noch 2x lesen.
@codierknecht
ah, ok... danke für den Tipp. -
@mr-kan1ster
Meine einfache Zweipunktregelung sieht so aus:

Wenn die Temperatur unter 3.1°C sinkt, schalte Heizlüfter ein.
Steigt sie auf über 3.6°C schalte Heizlüfter ab.Die gewählten Temperaturen gewährleisten im Zusammenhang mit der thermischen Trägheit des Raumes, dass das System nicht anfängt zu schwingen.
@pi-ter Ich arbeite bei meinem Regler mit einer Hysterese von +/- 0,15°C um die Solltemperatur, also 0,3 Grad Schwankungsbreite. Auch das ist mir eigentlich zu viel. Wenn sich die Temperatur im Raum der Einschaltschwelle am unteren Rand der Hysterese nähert, fange ich auch an zu frösteln... Vielleicht bin ich auch eine Frostbeule ...
Da der Regler als "Spezial Firmware" eines ESP8266 D1 Mini läuft, habe ich die Solltemperatur und die Hysterese (+/-) als Datenpunkt herausgeführt, weil ich auch Angst vor Schwingungen hatte, und deshalb schnell eingreifen wollte, ohne gleich eine neue Firmware in den ESP hochladen zu müssen ..

"Schwingungen" habe ich nicht beobachtet ... kommt aber wahrscheinlich auch auf den Temperatursensor an. Ich habe einen im Metallröhrchen konfektionieren DS18B20 im Einsatz. (Shelly https://www.pollin.de/p/shelly-temperatursensor-ds18b20-591021)
Wenn der Sensor stärker schwankende Temperatur-Messwerte bei eigentlich gleichbleibender Temperatur zeigen würde ("Rauschen") müsste man natürlich die Hysterese weiter, als das Rauschband des Sensors stellen...
Schwing-Probleme habe ich nicht...

-
@codierknecht
ah, ok... danke für den Tipp. -
@djmarc75
Das sieht nach einer ziemlich ausgeklügelten Lösung aus, ich verstehe nur nicht, was daran einfacher/besser/effektiver ist als mein (nach @Codierknecht 's Vorschlag geänderter) Wenigzeiler.Dass man die Werte des Sensors nicht mehrfach lesen muss, habe ich verstanden. Das ist einleuchtend.
Für mich sieht Dein Beispiel recht aufwändig aus.
Kläre / klärt mich auf :-)VG
Peter -
@paul53 "steuere" sollte man schon verwenden, wenn es darum geht, dass die Änderung auch im Gerät ankommt... Nur wenn es egal ist, ob das Gerät auch den Wert bekommt, reicht auch ein "aktualisiere"... Bei jedem "wurde geändert" Trigger wird ja maximal ein "steuere" Aufruf auch wirklich durchlaufen.
Wird doch hier diskutiert https://forum.iobroker.net/topic/5787/blockly-unterschied-zwischen-steuere-und-aktualisiere
Der Komplexitäts-Unterschied auf Javascript-Ebene ist jedenfalls nicht besonders groß wenn man sich den erzeugten Code so anschaut ...
Hier ein "aktualisiere" Block (Wert auf false, Bestätigt auf true)
setState('0_userdata.0.Heizung.Nachtabsenkung' /* Nachtabsenkung */, false, true);Und hier eine "steuere" Block (Wert auf 18.7, Bestätigt durch implizite Parametrierung auf false (darum muss sich das Gerät kümmern)
setState('mqtt.0.thermostat.desired.temperature' /* thermostat/desired/temperature */, 18.7); -
@paul53 "steuere" sollte man schon verwenden, wenn es darum geht, dass die Änderung auch im Gerät ankommt... Nur wenn es egal ist, ob das Gerät auch den Wert bekommt, reicht auch ein "aktualisiere"... Bei jedem "wurde geändert" Trigger wird ja maximal ein "steuere" Aufruf auch wirklich durchlaufen.
Wird doch hier diskutiert https://forum.iobroker.net/topic/5787/blockly-unterschied-zwischen-steuere-und-aktualisiere
Der Komplexitäts-Unterschied auf Javascript-Ebene ist jedenfalls nicht besonders groß wenn man sich den erzeugten Code so anschaut ...
Hier ein "aktualisiere" Block (Wert auf false, Bestätigt auf true)
setState('0_userdata.0.Heizung.Nachtabsenkung' /* Nachtabsenkung */, false, true);Und hier eine "steuere" Block (Wert auf 18.7, Bestätigt durch implizite Parametrierung auf false (darum muss sich das Gerät kümmern)
setState('mqtt.0.thermostat.desired.temperature' /* thermostat/desired/temperature */, 18.7); -
@paul53 "steuere" sollte man schon verwenden, wenn es darum geht, dass die Änderung auch im Gerät ankommt... Nur wenn es egal ist, ob das Gerät auch den Wert bekommt, reicht auch ein "aktualisiere"... Bei jedem "wurde geändert" Trigger wird ja maximal ein "steuere" Aufruf auch wirklich durchlaufen.
Wird doch hier diskutiert https://forum.iobroker.net/topic/5787/blockly-unterschied-zwischen-steuere-und-aktualisiere
Der Komplexitäts-Unterschied auf Javascript-Ebene ist jedenfalls nicht besonders groß wenn man sich den erzeugten Code so anschaut ...
Hier ein "aktualisiere" Block (Wert auf false, Bestätigt auf true)
setState('0_userdata.0.Heizung.Nachtabsenkung' /* Nachtabsenkung */, false, true);Und hier eine "steuere" Block (Wert auf 18.7, Bestätigt durch implizite Parametrierung auf false (darum muss sich das Gerät kümmern)
setState('mqtt.0.thermostat.desired.temperature' /* thermostat/desired/temperature */, 18.7);@martinp sagte in Einfache Heizungsreglung:
"steuere" sollte man schon verwenden
ds wurde ja auch nicht angezweifelt. Nur die unnötige zweifache Verwendung!
-
@paul53 "steuere" sollte man schon verwenden, wenn es darum geht, dass die Änderung auch im Gerät ankommt... Nur wenn es egal ist, ob das Gerät auch den Wert bekommt, reicht auch ein "aktualisiere"... Bei jedem "wurde geändert" Trigger wird ja maximal ein "steuere" Aufruf auch wirklich durchlaufen.
Wird doch hier diskutiert https://forum.iobroker.net/topic/5787/blockly-unterschied-zwischen-steuere-und-aktualisiere
Der Komplexitäts-Unterschied auf Javascript-Ebene ist jedenfalls nicht besonders groß wenn man sich den erzeugten Code so anschaut ...
Hier ein "aktualisiere" Block (Wert auf false, Bestätigt auf true)
setState('0_userdata.0.Heizung.Nachtabsenkung' /* Nachtabsenkung */, false, true);Und hier eine "steuere" Block (Wert auf 18.7, Bestätigt durch implizite Parametrierung auf false (darum muss sich das Gerät kümmern)
setState('mqtt.0.thermostat.desired.temperature' /* thermostat/desired/temperature */, 18.7); -
@martinp sagte: "steuere" sollte man schon verwenden
Richtig, aber möglichst nur einmal pro DP innerhalb einer Callback-Funktion.
@paul53 Das ist doch so... bei jedem Durchlauf des Skriptes wird ja nur maximal einer der beiden Zweige "falls" oder "sonst falls" durchlaufen... maximal wird das "steuere" im "falls" Zweig durchlaufen, oder das im "sonst falls" Zweig.
NIE in einem Durchlauf beide!Die meiste Zeit wird wahrscheinlich bei einem Durchlauf durch die zusätzliche Abfrage der Hilfsvariable sogar gar kein "steuere" Aufruf erfolgen ...
-
@paul53 Das ist doch so... bei jedem Durchlauf des Skriptes wird ja nur maximal einer der beiden Zweige "falls" oder "sonst falls" durchlaufen... maximal wird das "steuere" im "falls" Zweig durchlaufen, oder das im "sonst falls" Zweig.
NIE in einem Durchlauf beide!Die meiste Zeit wird wahrscheinlich bei einem Durchlauf durch die zusätzliche Abfrage der Hilfsvariable sogar gar kein "steuere" Aufruf erfolgen ...
-
@martinp sagte: Das ist doch so...
Ja, auf die CPU-Last hat es keinen Einfluss, aber jeder Funktionsaufruf belegt RAM. Was meinst du wohl, weshalb ioBroker solch ein RAM-Fresser ist?
aber jeder Funktionsaufruf belegt RAM. Was meinst du wohl, weshalb ioBroker solch ein RAM-Fresser ist?
Naja, das Anlegen einer Hilfsvariable, um unterhalb des Auskasperns, was denn nun gemacht werden soll nur EINEN Aufruf von SetState statt ZWEIEN zu generieren frisst auch Speicher ...
Ich bin aber nicht so fit im Abschätzen des Speicherbedarfs eines Funktionsaufrufes in Javascript - kann mir aber EIGENTLICH nicht vorstellen, dass die modernen Javascript Engines noch bei solchen simplen Dingen wie Funktionsaufrufen bereits beim Anlegen des JIT-Codes so viel Speicher fressen....
Bei C++ würde ich sagen "Bullshit" ...
Noch ein kleiner Einwand am Rande ....
Wenn man minimalen Speicherbedarf haben will, sollte man Blockly nicht verwenden...
Ein Beispiel:

Javascript Code dazu:schedule("0 13 19 * * *", async () => { setState('sonoff.0.Bewaesserung.POWER' /* Bewaesserung POWER */, true); setStateDelayed('sonoff.0.Bewaesserung.POWER' /* Bewaesserung POWER */, false, 35000, false); });Codegröße des ganzen Scripts 214 Byte
Der Minifier von DigitalOcean macht daraus 140 Byte...
https://www.digitalocean.com/community/tools/minify
schedule("0 13 19 * * *",(async()=>{setState("sonoff.0.Bewaesserung.POWER",!0),setStateDelayed("sonoff.0.Bewaesserung.POWER",!1,35e3,!1)}));Macht man die komischen Kommentare, die Blockly da hineinwirft weg, kommt man auch durch "Handoptimieren" auf 164 Byte
schedule("0 13 19 * * *", async () => { setState('sonoff.0.Bewaesserung.POWER', true); setStateDelayed('sonoff.0.Bewaesserung.POWER', false, 35000, false); });Ich kaufe mir lieber einen RAM-Riegel mehr, statt mir Gedanken um 140 vs 214 Bytes zu machen ;-)
-
aber jeder Funktionsaufruf belegt RAM. Was meinst du wohl, weshalb ioBroker solch ein RAM-Fresser ist?
Naja, das Anlegen einer Hilfsvariable, um unterhalb des Auskasperns, was denn nun gemacht werden soll nur EINEN Aufruf von SetState statt ZWEIEN zu generieren frisst auch Speicher ...
Ich bin aber nicht so fit im Abschätzen des Speicherbedarfs eines Funktionsaufrufes in Javascript - kann mir aber EIGENTLICH nicht vorstellen, dass die modernen Javascript Engines noch bei solchen simplen Dingen wie Funktionsaufrufen bereits beim Anlegen des JIT-Codes so viel Speicher fressen....
Bei C++ würde ich sagen "Bullshit" ...
Noch ein kleiner Einwand am Rande ....
Wenn man minimalen Speicherbedarf haben will, sollte man Blockly nicht verwenden...
Ein Beispiel:

Javascript Code dazu:schedule("0 13 19 * * *", async () => { setState('sonoff.0.Bewaesserung.POWER' /* Bewaesserung POWER */, true); setStateDelayed('sonoff.0.Bewaesserung.POWER' /* Bewaesserung POWER */, false, 35000, false); });Codegröße des ganzen Scripts 214 Byte
Der Minifier von DigitalOcean macht daraus 140 Byte...
https://www.digitalocean.com/community/tools/minify
schedule("0 13 19 * * *",(async()=>{setState("sonoff.0.Bewaesserung.POWER",!0),setStateDelayed("sonoff.0.Bewaesserung.POWER",!1,35e3,!1)}));Macht man die komischen Kommentare, die Blockly da hineinwirft weg, kommt man auch durch "Handoptimieren" auf 164 Byte
schedule("0 13 19 * * *", async () => { setState('sonoff.0.Bewaesserung.POWER', true); setStateDelayed('sonoff.0.Bewaesserung.POWER', false, 35000, false); });Ich kaufe mir lieber einen RAM-Riegel mehr, statt mir Gedanken um 140 vs 214 Bytes zu machen ;-)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden

