NEWS
Datenpunkte zusammenfassen - Jalousiesteuerung über VIS
-
Moin zusammen,
ich bin gerade dabei, in meiner VIS eine Rolladensteuerung zubauen. Hier soll es so sein, dass per Auswahl in der VIS die Rolläden entsprechend gruppiert werden, und die entsprechende Auswahl zusammen hoch oder runter fahren soll bei der Ansteuerung.
Ich habe dazu mich mal an einem Blockly mit Binding zu einem "Zentralen" DP versucht, leider spuckt der mir aber nichts aus. Vielleicht kann mir jemand einen kleinen aber wegweisenden Ansatz geben, wie ich korrekt an die Sache dran gehen kann.
Anbei mein Versuch das ganze erst mal mit einem "DP" zu realisieren.
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="5.G=(7r?7gJ,fF*L2U2m" x="-437" y="188"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="S-E*W@!k^Y=(?X^`D_E9"> <field name="oid">javascript.0.Jalousien.Badezimmer</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="/~0=y`t@)HD)?y=M-8X#"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="`zgY?,S9R!a,|uSi78Z/"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="AmaWfew5}rX_5#dY#v2("> <field name="ATTR">val</field> <field name="OID">javascript.0.Jalousien.Badezimmer</field> </block> </value> <value name="B"> <block type="logic_boolean" id="Q[^T7XY=5]C3;kwN{z8f"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="direct" id="W%n7Dso@_X`TZ:PXy9Uc" inline="false"> <field name="ONLY_CHANGES">TRUE</field> <value name="OID_SRC"> <shadow type="field_oid" id="c]@f`AqPoBSof!ZK7`79"> <field name="oid">javascript.0.Jalousien.TESTDP1</field> </shadow> </value> <value name="OID_DST"> <shadow type="field_oid" id="B+Ezc*`I+@9mqF:OHZ/m"> <field name="oid">javascript.0.Jalousien.Zusammenfassung</field> </shadow> </value> <next> <block type="debug" id="*r6R$@rzPdN9VXtG*d57"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="@BK!5@AlGT)%06i]1[o5"> <field name="TEXT">Bad +</field> </shadow> </value> <next> <block type="comment" id="$idpF+Hit%tZ:EP5f+a@"> <field name="COMMENT">Bad in Zusammenfassung</field> </block> </next> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="-yg-j`S-g@]`RX7%Kt(7"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="sd3g#}yndW%h-B@^It7y"> <field name="TEXT">Bad -</field> </shadow> </value> <next> <block type="comment" id="dYJeL1SU4j0zczUQ}E]r"> <field name="COMMENT">Bad nicht mehr in Zusammenfassung</field> </block> </next> </block> </statement> <next> <block type="control" id=";U,a3XTX]G,uy_KPWb;6"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.Jalousien.Zusammenfassung</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="HvfD36R[A~hCR:D@)7tV"> <field name="TEXT">100</field> </block> </value> <next> <block type="debug" id="SC:rLtES8F#z~5Lrwh;S"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="get_value" id="KBtj%AgkcHe1tge:Te9%"> <field name="ATTR">val</field> <field name="OID">javascript.0.Jalousien.TESTDP1</field> </block> </value> </block> </next> </block> </next> </block> </statement> </block> <block type="on_ext" id="o56cJz2lRKq-@YEp1zi1" x="-437" y="838"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="SA$narOywv7?-|Q5fq--"> <field name="oid">javascript.0.Jalousien.Küche</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="}aS(WrKZx[iqT$Qv`b./"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_compare" id="l|TYO]CYZ.pSeCmrbl9$"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="E[Fn]=ygbs]i.uoB)16C"> <field name="ATTR">val</field> <field name="OID">javascript.0.Jalousien.Küche</field> </block> </value> <value name="B"> <block type="logic_boolean" id="7riGx1~|$]YC`HqhK{h+"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="direct" id="`ndZ{/C64o|LXvJgu:fQ" inline="false"> <field name="ONLY_CHANGES">TRUE</field> <value name="OID_SRC"> <shadow type="field_oid" id="6P(nMB:Z`E3cQZTyTnuP"> <field name="oid">javascript.0.Jalousien.Zusammenfassung</field> </shadow> </value> <value name="OID_DST"> <shadow type="field_oid" id="P}#gd9tqW-3cKC!(ZW%b"> <field name="oid">javascript.0.Jalousien.TESTDP2</field> </shadow> </value> <next> <block type="debug" id="Wn$YGbT@4fcnSZ^VOICJ"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="G+qh$Y~u!?O-*+DJGYnr"> <field name="TEXT">Küch +</field> </shadow> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="debug" id="OxeeJ/Soeb+zJhtO]U|h"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="lNi~5}~%Z55M)Rz}bb]t"> <field name="TEXT">Küche -</field> </shadow> </value> </block> </statement> <next> <block type="control" id="utsZTOdV!g(Hcgj]RYFF"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.Jalousien.Zusammenfassung</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="1H?ADj[Avr(3V{,)2Yc#"> <field name="TEXT">100</field> </block> </value> <next> <block type="debug" id="9P`e@0~$#21fWLByQv^+"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="A?Cxj$iADy.g}#InUW5V"> <field name="TEXT">test</field> </shadow> <block type="get_value" id=")_i~X:ulDbZ8fiW:[w{c"> <field name="ATTR">val</field> <field name="OID">javascript.0.Jalousien.TESTDP1</field> </block> </value> <next> <block type="debug" id="6$+{zL9%aO%FR(muojqQ"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="get_value" id=":n##p;?p,PiS?6S#46%b"> <field name="ATTR">val</field> <field name="OID">javascript.0.Jalousien.TESTDP2</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </xml>
Vielen Dank schon mal
-
@kfl
Ich würde da nix "binden" (was übrigens außerhalb des Triggers gehört).Ich würde da für jede Gruppe einen eigenen DP unter
0_userdata.0
erstellen und da wie folgt regeln:
Wenn es einfach nur um "auf" oder "zu" geht, könnte man auch den Szenen-Adapter nehmen.
-
@codierknecht Danke für dein Rückmeldung, wenn ich das ganze über Gruppe gestalten würde, müsste ich ja für jede Situation eine eigene Gruppe erstellen bspw:
Bad und Küche -> Gruppe
Schlafzimmer, Bad, Kinderzimmer Küche -> Gruppe
Schlafzimmer, Bad, Essen, Kinderzimmer, Küche -> Gruppeoder gibt es die Möglichkeit durch einen Baustein die Gruppe jeweils immer mit der entsprechenden Auswahl zu bestücken?
Ansonsten müsste ich halt für jeden Rolladen ein kleines Script erstellen:
-
@kfl
Du könntest Gruppen in die kleinsten Einheiten aufsplitten und in den "übergeordneten" Gruppen nur den DP der Teilgruppen ansteuern.Bad und Küche => Gruppe 1
Schlafzimmer, und Kinderzimmer => Gruppe 2
Gruppe 3 => Gruppe 1 + Gruppe 2oder gibt es die Möglichkeit durch einen Baustein die Gruppe jeweils immer mit der entsprechenden Auswahl zu bestücken?
Du könntest mit Selektoren und Aufzählungen arbeiten.
Übrigens:
Im Trigger musst Du nicht nochmal der "Wert vom Objekt" lesen.
https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/5 -
@codierknecht dann bleib ich wohl lieber erst mal bei meinem praktmatischen Beispiel
Muss erst einmal reinkommen, bevor ich mich mit komplexeren Themen u.a. Selektoren beschäftige.Danke für den Tipp mit dem Objekt lesen und für das Topic!
-
@kfl
Statt mit Selektoren könnte man auch mit einer Liste arbeiten. Also ein DP, der ein Array enthält.
Mir fällt aber jetzt aus dem Stegreif kein Widget ein, mit dem man sowas in der gewünschten Art realisieren könnte. -
@kfl
Oder so:
Man erstellt eine eigene Struktur unterhalb von0_userdata.0
mit DP vom Typ "Logikwert".
Die kann man in der Vis an- und abwählen.
In "name" (oder "desc") steckt man bei den eigenen DP die ID des zugeordneten Rollo.Im Script reagiert man auf einen weiteren DP, der "auf" oder "ab" bzw. den Ziel-Level liefert.
-
@kfl sagte: Auswahl zusammen hoch oder runter fahren soll bei der Ansteuerung.
Links ist die Auswahl und rechts oben sind zwei Button zur Ansteuerung "hoch" oder "runter"?
Dann kann man zu den Jalousien Alias DP erstellen mit der ID-Struktur von z.B. "alias.0.Jalousien.Wohnzimmer_Links". Eine identische Struktur kann man für die Auswahl unter "0_userdata.0.Jalousien" erstellen.
Das Blockly könnte dann so aussehen: -
-
@codierknecht sagte: funktioniert eigentlich immer
In dem Fall aber nur mit den passenden ID-Strukturen unter "alias.0" und "0_userdata.0", die erst erstellt werden müssen.
-
@paul53
Naja - ein bisschen Arbeit muss ja für den TE auch noch übrig bleiben -
@codierknecht said in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
@paul53
Nimm mal @paul53's Vorschlag.
Was er zeigt, funktioniert eigentlich immer einwandfreiDann beschäftige ich mich mit @paul53 's Vorschlag, Danke für deine Bemühungen
@paul53 said in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
@kfl sagte: Auswahl zusammen hoch oder runter fahren soll bei der Ansteuerung.
Links ist die Auswahl und rechts oben sind zwei Button zur Ansteuerung "hoch" oder "runter"?
Dann kann man zu den Jalousien Alias DP erstellen mit der ID-Struktur von z.B. "alias.0.Jalousien.Wohnzimmer_Links". Eine identische Struktur kann man für die Auswahl unter "0_userdata.0.Jalousien" erstellen.
Das Blockly könnte dann so aussehen:Da hätte ich ja direkt drauf kommen können
Wie bekommt man denn eine Funktion "Um"? Bzw was ist der Unterschied zwischen "Um" und "Nach"?
Bei der Bedienung "Wert von Objekt ID", muss hier nicht noch ein Operator hin, der schaut ob die ID's von den Fenster auch mit gefahren werden sollen oder nicht?
Was macht denn die Zeile setze fenster inder Liste (...)?Sorry wegen den ganzen Fragen, aber ich möchte das auch gerne verstehen, dann ist es einfach umzusetzen
-
@kfl sagte: was ist der Unterschied zwischen "Um" und "Nach"?
Die Version des JS-Adapters.
@kfl sagte in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
"Wert von Objekt ID", muss hier nicht noch ein Operator hin, der schaut ob die ID's von den Fenster auch mit gefahren werden sollen oder nicht?
Nein, das ist bei booleschen Werten nicht erforderlich, denn "falls" prüft auf true für "mache".
@kfl sagte in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
Was macht denn die Zeile setze fenster inder Liste (...)?
Vorher wird die ID in eine Liste aufgespalten, wobei der Punkt das trennende Element im Text ist. Aus dieser Liste wird nur das letzte Element (z.B. "Wohnzimmer_Links") genommen, um damit die Datenpunkt-ID der Jalousie zu bilden.
-
@paul53 said in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
@kfl sagte: was ist der Unterschied zwischen "Um" und "Nach"?
Die Version des JS-Adapters.
@kfl sagte in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
"Wert von Objekt ID", muss hier nicht noch ein Operator hin, der schaut ob die ID's von den Fenster auch mit gefahren werden sollen oder nicht?
Nein, das ist bei booleschen Werten nicht erforderlich, denn "falls" prüft auf true für "mache".
@kfl sagte in Datenpunkte zusammenfassen - Jalousiesteuerung über VIS:
Was macht denn die Zeile setze fenster inder Liste (...)?
Vorher wird die ID in eine Liste aufgespalten, wobei der Punkt das trennende Element im Text ist. Aus dieser Liste wird nur das letzte Element (z.B. "Wohnzimmer_Links") genommen, um damit die Datenpunkt-ID der Jalousie zu bilden.
Super, vielen vielen Dank für die nützlichen Infos
Das Ganze funktioniert auch soweit, allerdings habe ich noch 2 Warnungen im Log, wie eine Frage, wieso zwischen drin immer noch die Meldung kommt:
"14:42:49.841 info javascript.0 (148075) script.js.common.Jalousie_Steuerung: alias.0.Jalousie_EG.Hoch"14:42:49.840 info javascript.0 (148075) script.js.common.Jalousie_Steuerung: alias.0.Jalousie_EG.Esszimmer 14:42:49.840 warn javascript.0 (148075) at Jalousien (script.js.common.Jalousie_Steuerung:11:7) 14:42:49.840 warn javascript.0 (148075) at Object.<anonymous> (script.js.common.Jalousie_Steuerung:21:9) 14:42:49.841 info javascript.0 (148075) script.js.common.Jalousie_Steuerung: alias.0.Jalousie_EG.Hoch 14:42:49.841 warn javascript.0 (148075) at Jalousien (script.js.common.Jalousie_Steuerung:11:7) 14:42:49.841 warn javascript.0 (148075) at Object.<anonymous> (script.js.common.Jalousie_Steuerung:21:9) 14:42:49.841 info javascript.0 (148075) script.js.common.Jalousie_Steuerung: alias.0.Jalousie_EG.Küche
var pos, id, fenster; // Beschreibe diese Funktion … async function Jalousien(pos) { var id_list = Array.prototype.slice.apply($("0_userdata.0.Jalousie_EG.*")); for (var id_index in id_list) { id = id_list[id_index]; if (getState(id).val) { id = id.split('.'); fenster = id.slice(-1)[0]; setStateDelayed(('alias.0.Jalousie_EG.' + String(fenster)), pos, false, parseInt(((0) || "").toString(), 10), false); console.log(('alias.0.Jalousie_EG.' + String(fenster))); } } } on({id: "0_userdata.0.Jalousie_EG.Hoch"/*Hoch*/, val: true}, async function (obj) { let value = obj.state.val; let oldValue = obj.oldState.val; await Jalousien(0); }); on({id: "0_userdata.0.Jalousie_EG.Runter"/*Runter*/, val: true}, async function (obj) { let value = obj.state.val; let oldValue = obj.oldState.val; await Jalousien(100); });
-
@kfl
Die Namen von Datenpunkten dürfen keine Sonderzeichen enthalten. Insbesondere keine Umlaute! -
@kfl sagte: immer noch die Meldung kommt:
Der Selektor findet auch den Datenpunkt "0_userdata.0.Jalousie_EG.Hoch" zu dem es natürlich keinen Alias gibt.
EDIT: Man kann sie ausblenden:
-
@Codierknecht @paul53 Elegante Lösungen, vielen Dank für eure Unterstützung!!