NEWS
Einfache Steuerung Steckdose/Temperatur
-
@CrunkFX Hey super gerne,
allerdings habe ich das Problem Java zu installieren..... und soweit ich weiß ist das zwingen für Blocky notwendig oder?
-
@Seb-K Versuch mal in IOB den Javascript Adapter zu installieren. Dann sollten alle dependencies automatisch mitinstalliert werden.
-
@Seb-K Falls bei dir die Installation klappt gehst du wie folgt vor:
-
Im ObjektBrowser unter Userdata.0 einen neuen Datenpunkt als Zahl anlegen, der deine Wunschtemperatur wird.
-
Ich gehe davon aus, dass die Werte für Temp im TH16 als Zahl angelegt werden. Falls nicht ändern wir nochmal was.
Dann also ein neues Blockly Script anlegen und oben rechts auf Importieren gehen:
<xml xmlns="http://www.w3.org/1999/xhtml"> <block type="on_ext" id="W1ukkv8+-RJ^m%krfUK6" x="37" y="37"> <mutation items="1"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="Q?7Bcztc=QdB~m}3^dbc"> <field name="oid">default</field> </shadow> <block type="get_value" id="~8pkp]f@pXX1@CQ.IY2,"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field> </block> </value> <statement name="STATEMENT"> <block type="controls_if" id="2kqxJ}$lU85L!ft-/kxE"> <value name="IF0"> <block type="logic_compare" id="rkTXol`rxf/1q~i@Kjaa"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="G?=^}GmR84glD`Zi+tQb"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field> </block> </value> <value name="B"> <block type="math_arithmetic" id="lHTnf(PKJk%5BAS^.du3"> <field name="OP">MINUS</field> <value name="A"> <shadow type="math_number" id="Iqlpl#{S5S}bv]mWtT]P"> <field name="NUM">1</field> </shadow> <block type="get_value" id="^.{.Qf.FXqJR.dskU*;X"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.deine_Wunschtemperatur</field> </block> </value> <value name="B"> <shadow type="math_number" id="`$v%dB0EWl]qrkcsdAuz"> <field name="NUM">0.2</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="@]0_0[C?0^jLax0O%*%7"> <mutation delay_input="false"></mutation> <field name="OID">0_userdata.0.deine_Gosund_Steckdose</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="~C/-P,sOktY:cG4{H;oz"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="YNr;-AsS@8l|_wD(q9Qw"> <value name="IF0"> <block type="logic_compare" id="C$EOUzST`sN/Y5{=MH6-"> <field name="OP">GT</field> <value name="A"> <block type="get_value" id="t;-XAAJ@NVUG8/K%]xE*"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field> </block> </value> <value name="B"> <block type="math_arithmetic" id="8$B;`_}JFe$$a^Rz5Lv7"> <field name="OP">ADD</field> <value name="A"> <shadow type="math_number" id="Iqlpl#{S5S}bv]mWtT]P"> <field name="NUM">1</field> </shadow> <block type="get_value" id="xx]3:*!$^s9o5)9/|LPM"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.deine_Wunschtemperatur</field> </block> </value> <value name="B"> <shadow type="math_number" id="4`$HIlisil=:DXC8S%hM"> <field name="NUM">0.2</field> </shadow> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="n|N[iCG$i]0?9TeM_~K6"> <mutation delay_input="false"></mutation> <field name="OID">0_userdata.0.deine_Gosund_Steckdose</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="S4SCo58|12bec#+nx8Me"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> </block> </next> </block> </statement> </block> </xml>
In Blockly lässt sich leider keine anständige Hysterese einbauen, daher hab ich für min und max einen Offset von 0,2 angesetzt. Das funktioniert bei unserer Fußbodenheizung super. Damit soll verhindert werden, dass die Pumpe und Ventile ständig schnell hintereinander schalten.
In VIS kannst du dann einen Slider o.ä bauen mit dem du dann die Wunschtemperatur anpassen kannst.
Bei Rückfragen stehe ich gerne zur Verfügung.
MFG CrunkFX
-
-
@CrunkFX said in Einfache Steuerung Steckdose/Temperatur:
rowser unter Us
ich installiere jetzt erstmal iobroker auf nem neuem system und dann teste ich noch mal JS
-
@Seb-K OK welche Plattform nutzt du?
-
debian auf einem Thin PC
-
@Seb-K OK damit sollte es auf jeden Fall klappen
-
ich installiere erstmal alles und melde mich nochmal. bisher erst einmal besten dank
-
Ich verstehe nicht, warum manche hier was Blockly oder Java Schript schreiben in einem Thread wo nach einer Node-Red Lösung gefragt wird. Für solche Probleme - die man soweit ich weiß Hysterese genannt werden - kann man sogar im Node-Red fertige Lösungen installieren und muss quasi nichts programmieren.
Ich denke - dass man hier sicher selbst einen Flow basteln kann, aber es gibt auch einen Node / Modul, dass man ausprobieren kann:
-
@mickym Wie du vielleicht mitbekommen hast sollte die Hysterese dynamisch gestaltet werden, ich hab jahrelang nodered benutzt und bin mir darüber im Klaren, dass das eine super Software ist, aber das verarbeiten von variablen aus anderen Quellen z.b. Datenpunkte in IOBroker ist mehr ein workaround als hilfreich. Ich lasse mich aber gerne eines besseren belehren, wenn du mir hier nen Flow postest der eine dynamische Hysterese ermöglicht.
MFG
CrunkFX -
...aber das verarbeiten von variablen aus anderen Quellen z.b. Datenpunkte in IOBroker ist mehr ein workaround als hilfreich. - was ich an dem Satz nicht verstehe ist, dass Du doch nahezu auf alle Datenpunkte im IOBroker (mal abgesehen von den Systemdaten) zugreifen kannst. Ok man muss oft noch eine Typkonvertierung ggf. durchführen.
Man kann z.Bsp um Levels dynamisch zu starten - die Hysterese als Subflow implementieren.
[ { "id": "2963f527.4194ba", "type": "switch", "z": "b42815ec.5e6c58", "name": "fLevel.On < Temperatur > fLevel.Off", "property": "payload", "propertyType": "msg", "rules": [ { "t": "lt", "v": "fLevel.On", "vt": "flow" }, { "t": "gt", "v": "fLevel.Off", "vt": "flow" }, { "t": "lte", "v": "fLevel.Off", "vt": "flow" } ], "checkall": "false", "repair": false, "outputs": 3, "x": 560, "y": 100, "wires": [ [], [], [] ] } ]
Zum Initialisieren bzw. Verändern der Levels schicke ich ein Nachrichten-Objekt in dem ich das untere und ober Level setzen kann.
In dem Beispiel:
msg.level -
Objekt mit On und Off - als nummerische Werte, um die Standardlevels von 10 (level.On) und 20 (level.Off) zu überschreiben.Bei mir sieht das Ganze komplexer aus - aber ich denke das Prinzip kann man erkennen:
Insofern find ich das eigentlich super einfach - gerade für jemand der nicht programmiert.
Die Verzögerung habe ich nur gebaut - damit man Initialisierung und Veränderungen von aktuellen Daten unterschiedlich behandeln kann.
Das was Du mit eigenem Datenpunkt unter userdata.0 zu erstellen für die VIS ist ja völlig richtig und würde ich auch so machen.
Im Prinzip ist es eigentlich noch einfacher - als ich eben dargestellt habe. Man kann die in userdata.0 erstellten Datenpunkte eigenlich direkt einlesen und dann in flow Variablen abspeichern und somit ist das Ganze eigentlich schon erledigt und dynamisiert!
Ob man die Spanne zwischen oben oder unterem Level dann verarbeiten will - bleibt freigestellt, dann eben diesen Fall im Switch löschen.
Und wenn man die Level in den userdata-Punkten dynamisch berechnen will - kann man dies ja mathematisch mit einer Function-Node machen oder einer Change-Node. Dann stelle ich halt eine Temperatur ein und setze die flow-Variablen eben nach Berechnung, wenn userdata.0.temperatur geändert wurde.
Wenn Du kein VIS nutzt, sondern das Node-Red Dashboard - kannst natürlich auch die Flow Variablen direkt setzen - muss man halt nur initialisieren.Ansonsten wird der Flow ja einfach mit den Temperaturen der Sonoff TH16 gespeist.
-
@mickym Hi, deinen Ansatz finde ich sehr gut und verstehe deine Argumente für Node-Red, aber für jemanden der wenig bis gar keine Erfahrung in NodeRed hat sind das komplett böhmische Dörfer. Die hier zu bewältigende Aufgabe ist Technisch gesehen nicht sonderlich Komplex, aber in Blockly(trotz grauenvoller Übersetzung) einfacher zu Realisieren als in NodeRed, da Blockly Baukastentechnisch Arbeitet und Nodered Flow basiert. Wenn man also ganz frisch jemandem Nodered beibringen muss, dann sollte die Anfangsaufgabe keine Mammutaufgabe sein. Wenn hier jemand mit entsprechender Nodered Erfahrung dieses Problem gestellt hätte wäre ich sicher drauf eingegangen. Nichts desto trotz bleibt jedem selbst überlassen wie er seine Probleme löst, Nodered ist wie gesagt eine Super Software auch für Anfänger aber gerade bei Beispielen in denen mit Flow Messages gearbeitet wird(sprich man sieht nicht was passiert, da der Wert ja unsichtbar im Flow verteilt wird) könnte ich mir Vorstellen, dass da nicht jeder auf anhieb den durchblick hat sowie bei Blockly.
MFG
CrunkFX -
@CrunkFX
Ich habe mal Dein Blockly Skript importiert und versucht in Node-Red umzusetzen:[ { "id": "9f04b667.5cd998", "type": "tab", "label": "Flow 2", "disabled": false, "info": "" }, { "id": "3bcbf948.4c3446", "type": "ioBroker in", "z": "9f04b667.5cd998", "name": "", "topic": "0_userdata.0.dein_TH16_Temp_DP", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "x": 230, "y": 200, "wires": [ [ "9deba34c.8a806" ] ] }, { "id": "9deba34c.8a806", "type": "change", "z": "9f04b667.5cd998", "name": "to Number", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$number(msg.payload)\t", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 470, "y": 200, "wires": [ [ "79074a2f.e315f4", "79a6662f.b72558" ] ] }, { "id": "79074a2f.e315f4", "type": "change", "z": "9f04b667.5cd998", "name": "Level Oben + 0.2", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload + 0.2", "tot": "jsonata" }, { "t": "set", "p": "LevelOff", "pt": "flow", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 690, "y": 180, "wires": [ [] ] }, { "id": "79a6662f.b72558", "type": "change", "z": "9f04b667.5cd998", "name": "Level Unten - 0.2", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload - 0.2", "tot": "jsonata" }, { "t": "set", "p": "LevelOn", "pt": "flow", "to": "payload", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 690, "y": 220, "wires": [ [] ] }, { "id": "a3f4a48c.5fbea8", "type": "inject", "z": "9f04b667.5cd998", "name": "", "topic": "Temperatur", "payload": "19", "payloadType": "str", "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "x": 150, "y": 360, "wires": [ [ "200998b7.04c3e8" ] ] }, { "id": "200998b7.04c3e8", "type": "change", "z": "9f04b667.5cd998", "name": "to Number", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$number(msg.payload)\t", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 310, "y": 360, "wires": [ [ "60e1c1db.31561" ] ] }, { "id": "60e1c1db.31561", "type": "switch", "z": "9f04b667.5cd998", "name": "Schalte", "property": "payload", "propertyType": "msg", "rules": [ { "t": "gt", "v": "LevelOff", "vt": "flow" }, { "t": "lt", "v": "LevelOn", "vt": "flow" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 460, "y": 360, "wires": [ [ "775acae7.a07974" ], [ "c65452e7.c57c8" ] ] }, { "id": "775acae7.a07974", "type": "change", "z": "9f04b667.5cd998", "name": "Ausschalten Off/False", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 700, "y": 340, "wires": [ [ "184ff99a.c85ca6" ] ] }, { "id": "c65452e7.c57c8", "type": "change", "z": "9f04b667.5cd998", "name": "Einschalten On/true", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 690, "y": 380, "wires": [ [ "184ff99a.c85ca6" ] ] }, { "id": "184ff99a.c85ca6", "type": "ioBroker out", "z": "9f04b667.5cd998", "name": "zur Steckdose", "topic": "", "ack": "false", "autoCreate": "false", "x": 980, "y": 360, "wires": [] } ]
Das sieht dann so aus:
Und ich will niemand bekehren, aber doch vielleicht auch Alternativen aufzeigen.
Das wäre in meinen Augen das, was Du mit dem Blockly machst - ich habe mir das extra mal importiert.
Ich persönlich mag dieses Flow basierende, da es gerade für Neulinge einfacher zu verstehen ist, was passiert wenn ....
Im Übrigen wird man eben auch gezwungen zu unterscheiden, was sind "Parameter" Flows oder dann "Schalter" Flows. Ich finde, dass man hier "erzogen" wird, die Probleme richtig zu strukturieren - deshalb bin ich halt ein kleiner Fan-Boy von Node-Red. Man möge mir das Nachsehen.Statt dem Inject Node - für die Temperatur natürlich den Datenpunkt der Sonoff setzen und analog zu oben in Zahl konvertieren und natürlich den Datenpunkt zur Steckdose anpassen und ob True/False oder 0/1 oder On/Off gesetzt werden muss.