NEWS
Wenn 3 von 6 Zuständen "true“ dann Schalter "true"
-
Hallo ioBroker Community,
Ich bin zurzeit Dabei einen Blockly zu erstellen der einen Pelletofen einschalten soll wenn 3 von 6 Stellventile „TRUE“ Sind.
Geschaltet wird der Pelletofen über eine Klemmleiste auf der Rückseite des Pelletofens. Mittels potenzialfreiem Schaltausgang den ich mit einem einfachen ZigBee on/off Relais Und einem Wechselrelais realisiert habe.
Nun möchte ich, dass der Pelletofen ausgeschaltet wird, wenn alle 6 Stellventile „FALSE“ sind. Das ist soweit kein Problem für mich.
Problematisch wirds für mich, wenn ich den Pelletofen Eingeschaltet haben möchte, wenn 3 von 6 Stellventile „true“ sind.
Dann soll der Pelletofen mit einer Verzögerung von 30 Minuten Eingeschaltet werden.So sieht mein Blockly momentan aus.
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="xBu2Qc]YVsDO;OOcV$%9" x="-188" y="63"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="6"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="FWqCUxJahfFfd`kb1$[p"> <field name="oid">zigbee.0.60a423fffe053fc3.state</field> </shadow> </value> <value name="OID1"> <shadow type="field_oid" id="Gh2irAHBXY}8RWD~rld?"> <field name="oid">zigbee.0.842e14fffefce74f.state</field> </shadow> </value> <value name="OID2"> <shadow type="field_oid" id="f`#^v[.eRMYB){,M.pYO"> <field name="oid">zigbee.0.842e14fffefda6a0.state</field> </shadow> </value> <value name="OID3"> <shadow type="field_oid" id="tel?8=$Bn2k{I}ZJuUAV"> <field name="oid">zigbee.0.60a423fffe07e970.state</field> </shadow> </value> <value name="OID4"> <shadow type="field_oid" id="l`4a]1}m5BJZv;Gv:Wx@"> <field name="oid">zigbee.0.5c0272fffe289375.state</field> </shadow> </value> <value name="OID5"> <shadow type="field_oid" id="R9Rr4j#.(DF_JaY_M%*+"> <field name="oid">zigbee.0.bc33acfffe47e3a9.state</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="hl]?*j}NdDv`9^DI`u]0"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_operation" id="-y`AF`U,~egh!BFh5#$%" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="8zy`l[q6_mios0e(SBQq" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="Y=7=nJ0B@HC9n--mf!o1"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="7CL?TF|_i}R},3g!J|8!"> <field name="ATTR">val</field> <field name="OID">zigbee.0.588e81fffed98373.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="D_zYuob5`iIMIc{8xD{A"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="o]N+^EIeQbfDH)v6al_]"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="W=u24@DvFoB*eeh#{]9u"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Heizung.Heizperiode</field> </block> </value> <value name="B"> <block type="logic_boolean" id="n9#|irST*XT`TO8{}=3G"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="m?6`qgRMJbWDEaF$:)z8" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="}Y%8ot{-lg[%`4K+LabK" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_operation" id="ayPA#_^GA`qH#J1=$sOq" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="b7lG*E_w~ObP|@W.B$l#"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="EG%BLfx^pQvI7ck-`Wm6"> <field name="ATTR">val</field> <field name="OID">zigbee.0.842e14fffefda6a0.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="d16fe:{}oc*sf(B?AI7)"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="W6/Ox-YaG23(EmgaLKf-"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="X}zW$qMr!}O-J}?p}+lx"> <field name="ATTR">val</field> <field name="OID">zigbee.0.842e14fffefce74f.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="caN`T$!!725lG[gK68|*"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="F}C`;-Vsli5pimdidGAe" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="xCR^.3O=mqGG)/yaO9!="> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="mc(8m6qmePvjR{Teq|K)"> <field name="ATTR">val</field> <field name="OID">zigbee.0.60a423fffe07e970.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="~j$D1k~PbjU~K*!A{[P~"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="6WQoR+,WFi50Xj%w|!|G"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="~4DwEzMEc`V[[c~I.f[9"> <field name="ATTR">val</field> <field name="OID">zigbee.0.5c0272fffe289375.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="4)Yg5L6W~/A+J+I]UL#}"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> </block> </value> <value name="B"> <block type="logic_operation" id="uwG#l0GHovz{w:!7Y7UK" inline="false"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="VUy%qxA$:A;1X;.k]O[T"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="!yQ8X!gkbow.yBSw+?+c"> <field name="ATTR">val</field> <field name="OID">zigbee.0.60a423fffe053fc3.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="Lb0}bW7.(,)P}+I$y3[B"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="6h_-+yQPY0~L+1VJdg|."> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="hHYei}c]2DQgh}gCsV8P"> <field name="ATTR">val</field> <field name="OID">zigbee.0.bc33acfffe47e3a9.state</field> </block> </value> <value name="B"> <block type="logic_boolean" id="3Je^m).fz![,YmW9n^%d"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="sCq:Y5[E#%/G@)SA(Ojd"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">zigbee.0.588e81fffed98373.state</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="_EfHyG,mwzrEQY#/`DP["> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> <statement name="DO1"> <block type="control" id="6=N1GN{]9KBVKi]/x`78"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation> <field name="OID">zigbee.0.588e81fffed98373.state</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">30</field> <field name="UNIT">min</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="_4A:|%HdAeI{$N`{#TnA"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> </block> </statement> </block> </xml>
-
@davut-karabulut
Oha; ich glaube ich würde einfach in einer Schleife durch alle Ventil-States durchiterieren, und die mit Status „true“ zählen.
Bei Anzahl=0 = Ofen aus, bei Anzahl=3 (oder >= 3 etc) = Ofen an. Ist bestimmt übersichtlicher… -
@davut-karabulut sagte: wenn 3 von 6 Stellventile „true“ sind. Dann soll der Pelletofen mit einer Verzögerung von 30 Minuten Eingeschaltet werden.
Vorschlag:
-
@Davut-Karabulut
Alternative zu dem Vorschlag von @paul53
Sieht erstmal komplizierter aus, aber- Es wird nicht bei jedem Trigger nach allen States geschaut
- Das Einschalten passiert 30 Minuten nachdem der 3. State auf Wahr gegangen ist. Das ist in dem Beispiel von @paul53 nicht so - da kann es im ungünstigsten Fallpassieren das nie eingeschaltet wird (3. State auf true, dann 29 min Später der 4. auf true, danach jeweils vor Ablauf der 30 Minuten ein Wechsel eines States von true auf false, so das am Ende immer mindestens 3 States auf true bleiben=> der Steuere Befehl wird nie ausgeführt )
Hinter dem Spoiler ist das XML zum Import.
-
Uf das ging schnell
Vielen Dank an Alle. Ich werde den von Asgothian ausprobieren.
Gleichzeitig versuche ich auch mal zu verstehen was da eigentlich vor sich geht.
Beim Blockly von paul53 blick ich grade noch so durch.
-
@dk43 Was da bei mir vor sich geht:
Es gibt einen Trigger auf alle 6 Datenpunkte - letztendlich so wie bei dir auch. Das ich die 6 vorher in eine Liste eintrage hat was mit Faulheit zu tun.
Was das Skript macht ist eine Liste von ID's zu verwalten deren Status "wahr" ist. Bei jeder Änderung eines DP wird die ID der Liste hinzugefügt oder aus der Liste entfernt, je nach Status und Notwendigkeit.
Danach wird geschaut ob genau 3 Einträge in der Liste sind (und der Pelletofen gerade aus ist). Wenn das der Fall ist wird ein Timeout gestartet, der den Pelletofen in 30 Minuten startet. Die Abfrage mit "if not timeout" dient dazu sicherzustellen das dieser Timeout nicht doppelt gestartet werden kann.
Als letztes wird geschaut ob die Liste leer ist - dann sind alle DP's auf falsch, und der Pelletofen wird ausgeschaltet.
Die Schleife vor dem Trigger dient dazu bei Skriptstart die Liste mit den aktuellen ID's zu füllen deren States gerade wahr sind. Ansonsten kann es zu seltsamem verhalten führen wenn das Skript gestartet wird während nicht alle 6 auf falsch stehen.
A.
Nachtrag - beim Schreiben der Erklärung ist mir aufgefallen das beim Einschalten selber nicht noch einmal geprüft wird ob immer noch 3 DP's auf Wahr sind. Sprich wenn
- 2 DP's wahr sind
- ein DP kurz wahr wird und dann wieder auf falsch geht
wird der Ofen trotzdem gestartet.
-
@asgothian sagte: Die Abfrage mit "if not timeout" dient dazu sicherzustellen das dieser Timeout nicht doppelt gestartet werden kann.
Das ist sinnvoll und habe ich oben in meinem Vorschlag angepasst.
-
Kurze Rückmeldung.
@Asgothian Irgendetwas habe ich wohl falsch gemacht. Dieser Skript hat garnicht reagiert.
Daraufhin habe ich den Skript von @paul53 probiert. Anfangs hat dieser auch funktioniert.
Das ging soweit gut bis der Skript den Aktor selbsständig ausgeschaltet hat ohne ein SendTo "Pelletofen wird ausgeschaltet".Wenn ich jetzt den Aktor händisch auf True stelle dann schaltet sich der Pelletofen für 15 Minuten ein (woher die 15 Minuten?)
Zuletzt habe ich probiert alle Stellventile auf false zu setzen und nacheinander 3 Ventile wieder auf True. Das hat wie am Anfang funktioniert. Der Aktor zum schalten des Pelletofens ist jetzt seit 20 Minuten Ein.
würde mich freuen wenn man sich das nochmal anschauen könnte
-
@dk43 Mir ist beim Zusammenbau des Skriptes ein Fehler unterlaufen.
die beiden Vergleiche für "present" sind vertauscht.
im oberen Falls muss present < 1 geprüft werden, um unteren present >0
A.