Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Benachrichtigung wenn ein DP false

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Benachrichtigung wenn ein DP false

    This topic has been deleted. Only users with topic management privileges can see it.
    • mickym
      mickym Most Active @Stefan341 last edited by mickym

      @stefan341 So was kann man elegant machen, in dem man die Datenpunkte in ein Objekt zusammenfasst.

      Nehmen wir mal an, Du willst wissen welche Fenster offen sind, dann kannst Du alle Fenster in einem Objekt zusammenfassen:

      {
        "Schlafzimmer Balkon": false,
        "Wohnzimmer Balkon": false,
        "Büro Balkon": true,
        "Wohnzimmer linkes Fenster": true,
        "Wohnzimmer rechtes Fenster": false
      }
      

      Dann kann man das ganz elegant mit JSONATA ermitteln.

      a56a4fb8-802e-4a11-b7e0-451c0b1676e4-image.png

      <xml xmlns="https://developers.google.com/blockly/xml">
       <variables>
         <variable id="aA.*;_ru^#]_9,@9g/a7">Fenster</variable>
         <variable id="y$,lsh`(/f/KRKVqyl*I">Liste</variable>
       </variables>
       <block type="variables_set" id="n18R~{At#6-W^|#nk/S~" x="63" y="63">
         <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
         <value name="VALUE">
           <block type="convert_json2object" id="4wzyNk%.qc3j@;t2Yt;4">
             <value name="VALUE">
               <block type="text" id="y{#BbgL3UVZK8xX}AP)/">
                 <field name="TEXT">{   "Schlafzimmer Balkon": false,   "Wohnzimmer Balkon": false,   "Büro Balkon": true,   "Wohnzimmer linkes Fenster": true,   "Wohnzimmer rechtes Fenster": false }</field>
               </block>
             </value>
           </block>
         </value>
         <next>
           <block type="debug" id="y5ACSX]?6UX?y_M~4cOi">
             <field name="Severity">info</field>
             <value name="TEXT">
               <shadow type="text" id="~;!/=-Myu28~)lHY5B@K">
                 <field name="TEXT">test</field>
               </shadow>
               <block type="variables_get" id="8,T+{=I9hz^BhA7j[(~+">
                 <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
               </block>
             </value>
             <next>
               <block type="comment" id=")}/{n[8gQW4`,3re7N(w">
                 <field name="COMMENT">offene Fenster</field>
                 <next>
                   <block type="variables_set" id=";b6YJKk6a*BCFXG66QH%">
                     <field name="VAR" id="y$,lsh`(/f/KRKVqyl*I">Liste</field>
                     <value name="VALUE">
                       <block type="convert_jsonata" id="60?hiiE{vhNf[Eb8wLKR">
                         <value name="EXPRESSION">
                           <shadow type="text" id="4*RA8mF?};wVHc:}R^8r">
                             <field name="TEXT">$each($,function($v, $k) {$v  ? $k})</field>
                           </shadow>
                         </value>
                         <value name="TARGET">
                           <block type="variables_get" id="q_bj0(dpn7EY[BS5q^;n">
                             <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
                           </block>
                         </value>
                       </block>
                     </value>
                     <next>
                       <block type="debug" id="M[u52`*c)VMnv3A.m0~$">
                         <field name="Severity">info</field>
                         <value name="TEXT">
                           <shadow type="text" id="@Ym7koU2hMwTm4m:n3_.">
                             <field name="TEXT">test</field>
                           </shadow>
                           <block type="lists_getSublist" id="fcVPd)C/DbhLG3V$Qa{^">
                             <mutation at1="false" at2="false"></mutation>
                             <field name="WHERE1">FIRST</field>
                             <field name="WHERE2">LAST</field>
                             <value name="LIST">
                               <block type="variables_get" id="!Hj{v-d^@Kv=|RTc.iFZ">
                                 <field name="VAR" id="y$,lsh`(/f/KRKVqyl*I">Liste</field>
                               </block>
                             </value>
                           </block>
                         </value>
                       </block>
                     </next>
                   </block>
                 </next>
               </block>
             </next>
           </block>
         </next>
       </block>
      </xml>
      

      Ein solches Objekt kannst Du aus beliebigen Datenpunkten mit dem neuen Baustein erzeugen:

      7d9adfd3-4b88-4bc4-a397-4d28c46fe0b2-image.png

      Der Vorteil ist halt dass Du nicht nur auf Booleans, sondern beliebige Werte überprüfen kannst.

      Rene55 1 Reply Last reply Reply Quote 0
      • Rene55
        Rene55 @mickym last edited by

        @mickym Was macht das Script denn bei dir, wenn alle Fenster false sind?

        1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active last edited by mickym

          @rene55 sagte in Benachrichtigung wenn ein DP false:

          @mickym Was macht das Script denn bei dir, wenn alle Fenster false sind?

          Ja war noch ein Fehler drin, weil kein Array/Liste rauskommt, wenn es kein match gibt. Einfach den JSONATA Ausdruck in eckige Klammern und gut ist.

          [$each($,function($v, $k) {$v  ? $k})]
          

          1e40cdc7-d5f2-46dd-a93c-77d4ad77ef80-image.png

          Die Benachrichtigung, den Alarm erzeugt man dann natürlich nur, wenn die Liste (das Array) Elemente enthält.

          Hier nochmal das gesamte Skript zum Ausprobieren:

          <xml xmlns="https://developers.google.com/blockly/xml">
           <variables>
             <variable id="aA.*;_ru^#]_9,@9g/a7">Fenster</variable>
             <variable id="y$,lsh`(/f/KRKVqyl*I">Liste</variable>
           </variables>
           <block type="variables_set" id=".^NUGW!~gr]Q_,FPh41T" disabled="true" x="63" y="37">
             <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
             <value name="VALUE">
               <block type="object_new" id="`eHOl5z1xVLXMVLB}J=K">
                 <mutation xmlns="http://www.w3.org/1999/xhtml">
                   <attribute id="ATTR_0" name="Schlafzimmer Balkon"></attribute>
                   <attribute id="ATTR_1" name="Wohnzimmer Balkon"></attribute>
                   <attribute id="ATTR_2" name="Büro Balkon"></attribute>
                   <attribute id="ATTR_3" name="Wohnzimmer linkes Fenster"></attribute>
                   <attribute id="ATTR_4" name="Wohnzimmer rechtes Fenster"></attribute>
                 </mutation>
                 <value name="ATTR_0">
                   <shadow type="text" id="8y%[n@:ThuT5/qu}Z/jB">
                     <field name="TEXT">Schlafzimmer Balkon</field>
                   </shadow>
                   <block type="get_value" id="2AZ$_@HSE(1QzYaF1N1%">
                     <field name="ATTR">val</field>
                     <field name="OID">ID auswählen</field>
                   </block>
                 </value>
                 <value name="ATTR_1">
                   <shadow type="text" id="hBg8T4X:r[RH$WB58Ch/">
                     <field name="TEXT">Wohnzimmer Balkon</field>
                   </shadow>
                   <block type="get_value" id="[I[FKA_plW@ohlypieMO">
                     <field name="ATTR">val</field>
                     <field name="OID">ID auswählen</field>
                   </block>
                 </value>
                 <value name="ATTR_2">
                   <shadow type="text" id=";NcV+e,}7wo}NDz0NAP1">
                     <field name="TEXT">Büro Balkon</field>
                   </shadow>
                   <block type="get_value" id="|i.[cx0Zx,BY|UBZ#l5/">
                     <field name="ATTR">val</field>
                     <field name="OID">ID auswählen</field>
                   </block>
                 </value>
                 <value name="ATTR_3">
                   <shadow type="text" id="xI/*!=wz/$}6#us8Ye5+">
                     <field name="TEXT">Wohnzimmer linkes Fenster</field>
                   </shadow>
                   <block type="get_value" id="3O+-PkW.5s;r?P[e=g0`">
                     <field name="ATTR">val</field>
                     <field name="OID">ID auswählen</field>
                   </block>
                 </value>
                 <value name="ATTR_4">
                   <shadow type="text" id="b8rs@bnowUi{mmW(*GpV">
                     <field name="TEXT">Wohnzimmer rechtes Fenster</field>
                   </shadow>
                   <block type="get_value" id="j60T@2osw;weAKN)R)39">
                     <field name="ATTR">val</field>
                     <field name="OID">ID auswählen</field>
                   </block>
                 </value>
               </block>
             </value>
             <next>
               <block type="variables_set" id="n18R~{At#6-W^|#nk/S~">
                 <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
                 <value name="VALUE">
                   <block type="convert_json2object" id="4wzyNk%.qc3j@;t2Yt;4">
                     <value name="VALUE">
                       <block type="text" id="y{#BbgL3UVZK8xX}AP)/">
                         <field name="TEXT">{   "Schlafzimmer Balkon": true,   "Wohnzimmer Balkon": false,   "Büro Balkon": false,   "Wohnzimmer linkes Fenster": false,   "Wohnzimmer rechtes Fenster": false }</field>
                       </block>
                     </value>
                   </block>
                 </value>
                 <next>
                   <block type="debug" id="y5ACSX]?6UX?y_M~4cOi">
                     <field name="Severity">info</field>
                     <value name="TEXT">
                       <shadow type="text" id="~;!/=-Myu28~)lHY5B@K">
                         <field name="TEXT">test</field>
                       </shadow>
                       <block type="variables_get" id="8,T+{=I9hz^BhA7j[(~+">
                         <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
                       </block>
                     </value>
                     <next>
                       <block type="comment" id=")}/{n[8gQW4`,3re7N(w">
                         <field name="COMMENT">offene Fenster</field>
                         <next>
                           <block type="variables_set" id=";b6YJKk6a*BCFXG66QH%">
                             <field name="VAR" id="y$,lsh`(/f/KRKVqyl*I">Liste</field>
                             <value name="VALUE">
                               <block type="convert_jsonata" id="60?hiiE{vhNf[Eb8wLKR">
                                 <value name="EXPRESSION">
                                   <shadow type="text" id="4*RA8mF?};wVHc:}R^8r">
                                     <field name="TEXT">[$each($,function($v, $k) {$v  ? $k})]</field>
                                   </shadow>
                                 </value>
                                 <value name="TARGET">
                                   <block type="variables_get" id="q_bj0(dpn7EY[BS5q^;n">
                                     <field name="VAR" id="aA.*;_ru^#]_9,@9g/a7">Fenster</field>
                                   </block>
                                 </value>
                               </block>
                             </value>
                             <next>
                               <block type="debug" id="M[u52`*c)VMnv3A.m0~$">
                                 <field name="Severity">info</field>
                                 <value name="TEXT">
                                   <shadow type="text" id="@Ym7koU2hMwTm4m:n3_.">
                                     <field name="TEXT">test</field>
                                   </shadow>
                                   <block type="lists_getSublist" id="fcVPd)C/DbhLG3V$Qa{^">
                                     <mutation at1="false" at2="false"></mutation>
                                     <field name="WHERE1">FIRST</field>
                                     <field name="WHERE2">LAST</field>
                                     <value name="LIST">
                                       <block type="variables_get" id="!Hj{v-d^@Kv=|RTc.iFZ">
                                         <field name="VAR" id="y$,lsh`(/f/KRKVqyl*I">Liste</field>
                                       </block>
                                     </value>
                                   </block>
                                 </value>
                                 <next>
                                   <block type="controls_if" id="N/3%tn;HaP!`lXQ/`}*7">
                                     <value name="IF0">
                                       <block type="logic_negate" id="csEJexWg7zW~t(EU}0=T">
                                         <value name="BOOL">
                                           <block type="lists_isEmpty" id="-LIX/%CH-IvV:`Z8_l}k">
                                             <value name="VALUE">
                                               <block type="variables_get" id="?MSM]nI?z$eBR8b(dqXk">
                                                 <field name="VAR" id="y$,lsh`(/f/KRKVqyl*I">Liste</field>
                                               </block>
                                             </value>
                                           </block>
                                         </value>
                                       </block>
                                     </value>
                                     <statement name="DO0">
                                       <block type="debug" id="hNA{=8[vjbzPe+gCWk$G">
                                         <field name="Severity">info</field>
                                         <value name="TEXT">
                                           <shadow type="text" id="!;(Nt$qt1[|1`Jd_N=S`">
                                             <field name="TEXT">test</field>
                                           </shadow>
                                           <block type="text" id="?Rh2g5^eUA99~6nYGxvv">
                                             <field name="TEXT">Erstelle Benachrichtigung</field>
                                           </block>
                                         </value>
                                       </block>
                                     </statement>
                                   </block>
                                 </next>
                               </block>
                             </next>
                           </block>
                         </next>
                       </block>
                     </next>
                   </block>
                 </next>
               </block>
             </next>
           </block>
          </xml>
          

          Rene55 1 Reply Last reply Reply Quote 0
          • Rene55
            Rene55 @mickym last edited by Rene55

            @mickym Ja, danke. Ich habs bei mir berichtigt und macht was es soll. [wieder was gelernt 😳 ] Sind die Parameter $v und $k wahlfrei?

            mickym 2 Replies Last reply Reply Quote 0
            • mickym
              mickym Most Active @Rene55 last edited by mickym

              @rene55 Ja. $v steht für value - also den Wert der Eigenschaft, $k steht für key - also den Namen der Eigenschaft.
              Du kannst also den JSONATA Ausdruck zur besseren Verständlichkeit auch so schreiben:

              [$each($,function($Wert, $Attribut) {$Wert ? $Attribut})]
              

              Wie die Variablen heißen - bleibt Dir überlassen. In der funktion wird nur im 1. Parameter der Wert, im 2. Paramenter die Eigenschaft angegeben.

              Wenn Du was anderes als auf true oder false abprüfen willst, dann gegen den Wert natürlich.

              1 Reply Last reply Reply Quote 1
              • mickym
                mickym Most Active @Rene55 last edited by mickym

                @rene55 sagte in Benachrichtigung wenn ein DP false:

                @mickym Ja, danke. Ich habs bei mir berichtigt und macht was es soll. [wieder was gelernt 😳 ] Sind die Parameter $v und $k wahlfrei?

                Wenn Du also nicht auf true oder false, sondern zum Beispiel auf Zahlenwerte überprüfen willst, habe ich hier mal ein Dummybeispiel - in dem nur ausgegeben wird, wenn der Wert > 10 ist .

                2bdab1a0-f308-4d64-a07a-5cff44de54d9-image.png

                Rene55 1 Reply Last reply Reply Quote 0
                • Rene55
                  Rene55 @mickym last edited by

                  @mickym Danke, hab ich auch mal eben nachgebaut - für irgendwann später mal. Hoffentlich kann ich mich dann noch daran erinnern.

                  mickym 1 Reply Last reply Reply Quote 0
                  • mickym
                    mickym Most Active @Rene55 last edited by mickym

                    @rene55 Nachdem man auch in Blockly JSONATA nutzen kann, ist das eine Möglichkeit. Auch wenn ich glaub manchen ein Dorn ist, dass man JSONATA nutzen kann. Es wird lieber herkömmlich geskripted, bevor man diese Bibliothek nutzt. Man muss halt die Datenpunkte die man überwachen will einmal zu einem Objekt zusammenbauen.

                    06d7a4e5-e54f-47b1-8701-678fcca63371-image.png

                    Hier zum Beispiel meine Shellies. 😉

                    So habe ich aber verschiedene Überwachungsdatenpunkte - für Geräte oder welche Geräte online sein dürfen, wenn ich an oder abwesend bin oder wenn ein Adapter streikt usw.

                    Rene55 1 Reply Last reply Reply Quote 0
                    • Rene55
                      Rene55 @mickym last edited by

                      @mickym Mit Blockly habe ich es auch nicht so mit. Text (also in dem Fall Javascript) liegt mir da schon eher.
                      JSONata hab ich an verschiedenen Stellen schon mal gesehen, aber nie selbst benutzt, geschweige denn auf die Idee gekommen, so etwas selbst zu entwerfen.

                      mickym 1 Reply Last reply Reply Quote 0
                      • mickym
                        mickym Most Active @Rene55 last edited by mickym

                        @rene55 In Javascript kannst Du JSONATA genauso nutzen.

                        f3738b00-ae9d-4faa-bbe8-7173e792458e-image.png

                        Du musst nur seit ca. 1 Jahr das await vorne dran setzen. Und wie gesagt - bei der hiesigen Implementation gibt es manchmal einen mir unerklärlich Fehler, dass bei Listen immer ein sequence:true angehängt wird. Wann das passiert und wann nicht, habe ich noch nicht rausgefunden.

                        JSONATA ist nicht einfach - aber eine geniale Bibliothek (ich bin totaler Fan inzwischen) und man spart sich zig Zeilen Code und Schleifen - gerade wenn man mit Objekten arbeitet.

                        Rene55 1 Reply Last reply Reply Quote 0
                        • Rene55
                          Rene55 @mickym last edited by

                          @mickym Ja, ist klar. Die meisten Blocklys, die ich finde und für mich brauchbar halte, stelle ich sowieso auf JS um. Manchmal bin ich zu blöd, die richtigen Bausteine zu finden.
                          Objekte habe ich lange Zeit für überflüssiges Zeug gehalten, jetzt bin ich auf dem Weg, ein Fan davon zu werden. Und dann werde ich mich (bei Gelegenheit) auch mal tiefer in JSONata einlesen. Danke für die vielen Beispiele und Erklärungen.

                          mickym 1 Reply Last reply Reply Quote 1
                          • mickym
                            mickym Most Active @Rene55 last edited by mickym

                            @rene55 sagte in Benachrichtigung wenn ein DP false:

                            Ja, ist klar. Die meisten Blocklys, die ich finde und für mich brauchbar halte, stelle ich sowieso auf JS um. Manchmal bin ich zu blöd, die richtigen Bausteine zu finden.

                            Ja deswegen finde ich, wenn man nicht herkömmlich mit Text, sondern mit grafischen Bausteinen programmieren möchte, NodeRed wesentlich logischer, aber da die Mehrzahl hier an Board Blockly verwendet, werden Neulinge meist Richtung Blockly geleitet. - Deswege schlage ich halt manchmal eine Alternative vor, für Leute, die auch mal was anderes ausprobieren wollen. 😉

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            761
                            Online

                            31.7k
                            Users

                            79.7k
                            Topics

                            1.3m
                            Posts

                            7
                            17
                            426
                            Loading More Posts
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes
                            Reply
                            • Reply as topic
                            Log in to reply
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                            The ioBroker Community 2014-2023
                            logo