Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. Vergleich von zwei Eingangswerten um Wert festzulegen

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    23
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

Vergleich von zwei Eingangswerten um Wert festzulegen

Geplant Angeheftet Gesperrt Verschoben Node-Red
53 Beiträge 5 Kommentatoren 12.5k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • mickymM mickym

    @rewenode OK - das muss ich mir mal ansehen, wenn ich noch mehr geistige Kapazitäten hatte.

    Soweit war ich

    $reduce(payload.*, function($i, $j){$i or $not($j)}, false)
    

    Warum nochmal die Klammer was bringen soll? - Verstehe ich nicht.
    Aber nach meinen Test funktioniert auch Deine beiden Varianten nicht.

    $reduce(
       $map(*,function($v){$not($v)}),
       function($i, $j){($i or $j)}
    )
    

    als auch

    $reduce(payload.*, function($i, $j){($i or $not($j))}, false)
    

    liefert grundsätzlich true, auch wenn eine Eigenschaft true ist. Es soll ja nur true werden, wenn alle false sind. Es geht ja um die Manipulation des arrays (also vor Übergabe an die reduce Funktion).
    sowohl

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

    liefert aber auch true - was ja nicht der Fall sein dürfte.

    Das ODER einfach negieren - habe ich schon vorgeschlagen, da scheint bei Dir aber irgendwie ein Fehler in der letzten Zeile irgendwie vorzuliegen:

    Ich habe es so und damit geht es:

    $not($reduce(payload.*,function($i, $j){$i or $j}))
    

    ===================================================================

    So mit dem map geht es - da es aber umgedreht wird muss man eine logische AND Verknüpfung machen:

    $reduce(
       $map(payload.*,function($v){$not($v)}),
       function($i, $j){$i and $j}
    ) 
    

    bei der anderen Version funktioniert es nicht.

    R Offline
    R Offline
    rewenode
    schrieb am zuletzt editiert von
    #37

    @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

    Es soll ja nur true werden, wenn alle false sind

    Ja, da mußt du ein and nehmen. Wenn du jeden Array Wert negierst, heißt das ja, dass nur true rauskommen soll wenn alle true (weil negiert) sind. Und das ist eine einfache UND-Verknüpfung.

    $reduce(payload.*, function($i, $j){$i and $not($j)})
    

    Oder halt das Ergebnis des OR negieren wie du es jetzt gemacht hast.

    mickymM 1 Antwort Letzte Antwort
    0
    • R rewenode

      @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

      Es soll ja nur true werden, wenn alle false sind

      Ja, da mußt du ein and nehmen. Wenn du jeden Array Wert negierst, heißt das ja, dass nur true rauskommen soll wenn alle true (weil negiert) sind. Und das ist eine einfache UND-Verknüpfung.

      $reduce(payload.*, function($i, $j){$i and $not($j)})
      

      Oder halt das Ergebnis des OR negieren wie du es jetzt gemacht hast.

      mickymM Offline
      mickymM Offline
      mickym
      Most Active
      schrieb am zuletzt editiert von
      #38

      @rewenode sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

      $reduce(payload.*, function($i, $j){$i and $not($j)})

      Das tut nicht - kommt false raus, wenn alles false ist und true, wenn alle false aber einer true. Ich meine mit dem Mapping geht es ja.

      Ist aber egal - mit dem maping geht es und mit dem map erzeugt ein Nicht-Objekt zumindest kein Error - sondern ein undefined. Die Funktionen die einen Fehler erzeugen oder nicht, sind da wohl sehr unterschiedlich. Wie gesagt mit dem mapping habe ich ja auch eine gute Lösung.

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      R 1 Antwort Letzte Antwort
      0
      • mickymM mickym

        @rewenode sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

        $reduce(payload.*, function($i, $j){$i and $not($j)})

        Das tut nicht - kommt false raus, wenn alles false ist und true, wenn alle false aber einer true. Ich meine mit dem Mapping geht es ja.

        Ist aber egal - mit dem maping geht es und mit dem map erzeugt ein Nicht-Objekt zumindest kein Error - sondern ein undefined. Die Funktionen die einen Fehler erzeugen oder nicht, sind da wohl sehr unterschiedlich. Wie gesagt mit dem mapping habe ich ja auch eine gute Lösung.

        R Offline
        R Offline
        rewenode
        schrieb am zuletzt editiert von rewenode
        #39

        @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

        Das tut nicht - kommt false raus, wenn alles false ist und true, wenn alle false aber einer true. Ich meine mit dem Mapping geht es ja.

        Ja sorry, copy/paste Fehler. Habe den Start-Wert vergessen.

        $reduce(payload.*, function($i, $j){$i and $not($j)}, true)
        

        Doch schon zu spät. Muss natürlich payload.* sein. ;-(

        mickymM 1 Antwort Letzte Antwort
        0
        • R rewenode

          @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

          Das tut nicht - kommt false raus, wenn alles false ist und true, wenn alle false aber einer true. Ich meine mit dem Mapping geht es ja.

          Ja sorry, copy/paste Fehler. Habe den Start-Wert vergessen.

          $reduce(payload.*, function($i, $j){$i and $not($j)}, true)
          

          Doch schon zu spät. Muss natürlich payload.* sein. ;-(

          mickymM Offline
          mickymM Offline
          mickym
          Most Active
          schrieb am zuletzt editiert von mickym
          #40

          @rewenode sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

          $reduce(payload.*, function($i, $j){$i and $not($j)}, true)

          OK das tut - und der init- Wert ist quasi der 1.Wert mit dem $i quasi initialisiert ist.

          Doch schon zu spät. Muss natürlich payload.* sein. ;-(

          Das hatte ich schon korrigiert. ;)

          Dann bin ich auch schon auf die Lösung gekommen - hatte halt nur auch vergessen, dass ich alles mit logischem UND verknüpfen musste. Das heißt die Manipulation am Array kann man also über $j machen (bzw. dem 2. Parameter in der Funktion)

          Danke Dir jedenfalls - habe doch noch zu früher Stunde einiges gelernt. :):+1: :+1: :+1:

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          R 1 Antwort Letzte Antwort
          0
          • mickymM mickym

            @rewenode sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

            $reduce(payload.*, function($i, $j){$i and $not($j)}, true)

            OK das tut - und der init- Wert ist quasi der 1.Wert mit dem $i quasi initialisiert ist.

            Doch schon zu spät. Muss natürlich payload.* sein. ;-(

            Das hatte ich schon korrigiert. ;)

            Dann bin ich auch schon auf die Lösung gekommen - hatte halt nur auch vergessen, dass ich alles mit logischem UND verknüpfen musste. Das heißt die Manipulation am Array kann man also über $j machen (bzw. dem 2. Parameter in der Funktion)

            Danke Dir jedenfalls - habe doch noch zu früher Stunde einiges gelernt. :):+1: :+1: :+1:

            R Offline
            R Offline
            rewenode
            schrieb am zuletzt editiert von
            #41

            @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

            Das heißt die Manipulation am Array kann man also über $j machen (bzw. dem 2. Parameter in der Funktion)

            Ja. Beim Startwert (falls nötig) mußt du halt aufpassen.
            Bei der AND Funktion muss der Start true sein, weil er den Gesamtwert dann nicht verändern kann, weil true AND irgendwas immer irgendwas ist.
            Beim OR dann halt false.

            Die Falle mit dem * statt payload.* entsteht leicht, wenn man den test-Reiter in den nodes nimmt.
            Als Testobjekt gibt man dann schnell mal sowas wie

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

            ein. Die Testfunktion weis natürlich nicht, dass das eigentlich das payload-Objekt sein soll, weshalb payload.* nicht klappt. Da nimmt man dann zum testen halt * . Und dann vergisst man den Ausdruck wieder auf payload.* zu ändern.
            Besser man macht das Testobjekt gleich so:

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

            Dann klappt es auch wieder mit payload.*. Ein Fehler weniger ;-)

            mickymM 1 Antwort Letzte Antwort
            0
            • R rewenode

              @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

              Das heißt die Manipulation am Array kann man also über $j machen (bzw. dem 2. Parameter in der Funktion)

              Ja. Beim Startwert (falls nötig) mußt du halt aufpassen.
              Bei der AND Funktion muss der Start true sein, weil er den Gesamtwert dann nicht verändern kann, weil true AND irgendwas immer irgendwas ist.
              Beim OR dann halt false.

              Die Falle mit dem * statt payload.* entsteht leicht, wenn man den test-Reiter in den nodes nimmt.
              Als Testobjekt gibt man dann schnell mal sowas wie

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

              ein. Die Testfunktion weis natürlich nicht, dass das eigentlich das payload-Objekt sein soll, weshalb payload.* nicht klappt. Da nimmt man dann zum testen halt * . Und dann vergisst man den Ausdruck wieder auf payload.* zu ändern.
              Besser man macht das Testobjekt gleich so:

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

              Dann klappt es auch wieder mit payload.*. Ein Fehler weniger ;-)

              mickymM Offline
              mickymM Offline
              mickym
              Most Active
              schrieb am zuletzt editiert von mickym
              #42

              @rewenode Ja in dem Fenster kopiere ich immer das Objekt anstelle von "hello world" - jedenfalls habe ich heute wieder eine Menge mehr verstanden. Das wird wohl wieder mal ein Thread mit Lesezeichen. ;)

              So ich habe nun alle Node s (kommt nun auch kein Fehler wenn Objekte nicht initialisiert sind) - mit der kurzen Version versehen - ist also bei den logischen Nodes nur noch ein Einzeiler:

              UND

              $reduce(payload.*,function($i, $j){$i and $j})
              

              [
                  {
                      "id": "9367f9f7.8f5708",
                      "type": "switch",
                      "z": "ddec9d30.cb21c",
                      "name": "AND?",
                      "property": "$reduce(payload.*,function($i, $j){$i and $j})",
                      "propertyType": "jsonata",
                      "rules": [
                          {
                              "t": "true"
                          },
                          {
                              "t": "false"
                          }
                      ],
                      "checkall": "true",
                      "repair": false,
                      "outputs": 2,
                      "x": 410,
                      "y": 120,
                      "wires": [
                          [],
                          []
                      ],
                      "info": "# All properties of an object must be true.\n\nAll properties of an object must be true.\n\n`{\n    \"Office\": true,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis true,\n\n`{\n    \"Office\": true,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis false.\n\n# Alle Eigenschaften eines Objektes müssen wahr sein\n\nAlle Eigenschaften eines Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": true,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt true,\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt false."
                  },
                  {
                      "id": "e3464ff4.b6dca",
                      "type": "change",
                      "z": "ddec9d30.cb21c",
                      "name": "AND ?",
                      "rules": [
                          {
                              "t": "set",
                              "p": "payload",
                              "pt": "msg",
                              "to": "$reduce(payload.*,function($i, $j){$i and $j})",
                              "tot": "jsonata"
                          }
                      ],
                      "action": "",
                      "property": "",
                      "from": "",
                      "to": "",
                      "reg": false,
                      "x": 410,
                      "y": 160,
                      "wires": [
                          []
                      ],
                      "info": "# All Property of an object must be true.\n\nAll properties of an object must be true.\n\n`{\n    \"Office\": true,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis true,\n\n`{\n    \"Office\": true,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis false.\n\n# Alle Eigenschaften eines Objektes müssen wahr sein\n\nAlle Eigenschaften eines Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": true,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt true,\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt false."
                  }
              ]
              

              ODER

              $reduce(payload.*,function($i, $j){$i or $j})
              

              [
                 {
                     "id": "d2d1dca3.51175",
                     "type": "switch",
                     "z": "ddec9d30.cb21c",
                     "name": "OR?",
                     "property": "$reduce(payload.*,function($i, $j){$i or $j})",
                     "propertyType": "jsonata",
                     "rules": [
                         {
                             "t": "true"
                         },
                         {
                             "t": "false"
                         }
                     ],
                     "checkall": "true",
                     "repair": false,
                     "outputs": 2,
                     "x": 650,
                     "y": 120,
                     "wires": [
                         [],
                         []
                     ],
                     "info": "# Only one or more properties of an object needs to be true.\n\n Only one or more properties of an object needs to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes müssen wahr sein.\n\nMindestens eine Eigenschaft des Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."
                 },
                 {
                     "id": "36f12990.e70ea6",
                     "type": "change",
                     "z": "ddec9d30.cb21c",
                     "name": "OR ?",
                     "rules": [
                         {
                             "t": "set",
                             "p": "payload",
                             "pt": "msg",
                             "to": "$reduce(payload.*,function($i, $j){$i or $j})",
                             "tot": "jsonata"
                         }
                     ],
                     "action": "",
                     "property": "",
                     "from": "",
                     "to": "",
                     "reg": false,
                     "x": 650,
                     "y": 160,
                     "wires": [
                         []
                     ],
                     "info": "# Only one or more properties of an object needs to be true.\n\n Only one or more properties of an object needs to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes müssen wahr sein.\n\nMindestens eine Eigenschaft des Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."
                 }
              ]
              

              Wer weitere optimierte JSONATA Switches und Change Nodes Beispiele ausprobieren will - hier ein Flow mit Beispielen:

              JSONATA Change und Switch Nodes - 2021-12-01.json

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              1 Antwort Letzte Antwort
              0
              • mickymM mickym

                @frankyboy73 sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                @rewenode Danke, ich glaube es wird klarer. Also wäre hier $i im Prinzip der Name der Nachricht und $j der jeweilige Wert.
                Und mit $i or $j sage ich ist eine der Nachrichten true (bzw. nicht null) ist die Bedingung erfüllt. Bei „and“ dann $i and $j , sind alle Nachrichten True (bzw. nicht null) dann ist die Bedingung erfüllt.
                Geht das auch umgekehrt? Also wenn alle Nachrichten false bzw. Null sind, dann ist die Bedingung erfüllt?

                Edit: Ok, ich hab da wohl doch noch nen Denkfehler, was i und j sind. Ich lese mich da wohl mal erst etwas ein.

                In der Doku : https://docs.jsonata.org/higher-order-functions

                feb219a7-2a66-45fc-b634-8cd793642a7c-image.png

                Siehst Du das immer einfach der letzte mit dem vorletzen Element genutzt werden. In der Doku werden also 1. mit 0. Zahl multipliziert, dann 2. mit 1. Zahl, dann 3. Zahl mit Produkt aus 1 und 2. Zahl.

                021be2e2-6a43-413a-9a55-2185afa74513-image.png

                Geht das auch umgekehrt? Also wenn alle Nachrichten false bzw. Null sind, dann ist die Bedingung erfüllt

                Das machst Du mit der Funktion, die auf einen Wert reduziert:

                Für dieses Reduce definierst Du ja eine eigene Funktion:

                (
                   $withAND := function($i, $j){$i and $j};
                   $reduce(
                       $each(
                 payload,
                 function($v) {$not($v)}
                 ),
                       $withAND
                   )
                )
                

                Du musst halt die Eingabe verneinen. Wobei ich wohl dann besser eine ODER Node verwenden würde und einfach das Ergebnis verneinen. Das wäre logischer.

                Im Übrigen gibt es diese Reduce Funktion auch in der JOIN Node - das habe ich neulich ausprobiert. ;)

                So hier mal die Reduce Funktion in der JOIN Node - funktioniert ähnlich wie die reduce Funktion in JSONATA - es wird immer mit dem Vorgänger verknüpft:

                Hier mal die AND Node - dass alles true sein muss:

                f608efeb-8242-442a-94b4-cd4485d74454-image.png

                Eigentlich ist das auch schon kurz ;) - Insofern könnte man das auch anstelle JSONATA und der UND nutzen: ;)

                [
                   {
                       "id": "bcb4130d.771a8",
                       "type": "inject",
                       "z": "5f34a973.9a1f88",
                       "name": "Fenster geschlossen (1 geöffnet)",
                       "props": [
                           {
                               "p": "payload"
                           }
                       ],
                       "repeat": "",
                       "crontab": "",
                       "once": false,
                       "onceDelay": 0.1,
                       "topic": "",
                       "payload": "{\"Büro Balkon\":true,\"Schlafzimmer Balkon\":true,\"Wohnzimmer Balkon\":true,\"Wohnzimmer rechtes Fenster\":false,\"Wohnzimmer linkes Fenster\":true}",
                       "payloadType": "json",
                       "x": 370,
                       "y": 600,
                       "wires": [
                           [
                               "cf63c700.820c08"
                           ]
                       ]
                   },
                   {
                       "id": "f3ff4478.a406d8",
                       "type": "inject",
                       "z": "5f34a973.9a1f88",
                       "name": "Fenster geschlossen (alle geschlossen)",
                       "props": [
                           {
                               "p": "payload"
                           }
                       ],
                       "repeat": "",
                       "crontab": "",
                       "once": false,
                       "onceDelay": 0.1,
                       "topic": "",
                       "payload": "{\"Büro Balkon\":true,\"Schlafzimmer Balkon\":true,\"Wohnzimmer Balkon\":true,\"Wohnzimmer rechtes Fenster\":true,\"Wohnzimmer linkes Fenster\":true}",
                       "payloadType": "json",
                       "x": 350,
                       "y": 560,
                       "wires": [
                           [
                               "cf63c700.820c08"
                           ]
                       ]
                   },
                   {
                       "id": "cf63c700.820c08",
                       "type": "split",
                       "z": "5f34a973.9a1f88",
                       "name": "",
                       "splt": "\\n",
                       "spltType": "str",
                       "arraySplt": 1,
                       "arraySpltType": "len",
                       "stream": false,
                       "addname": "",
                       "x": 590,
                       "y": 580,
                       "wires": [
                           [
                               "2ce40a79.8f7f36"
                           ]
                       ]
                   },
                   {
                       "id": "2ce40a79.8f7f36",
                       "type": "join",
                       "z": "5f34a973.9a1f88",
                       "name": "",
                       "mode": "reduce",
                       "build": "string",
                       "property": "payload",
                       "propertyType": "msg",
                       "key": "topic",
                       "joiner": "\\n",
                       "joinerType": "str",
                       "accumulate": false,
                       "timeout": "",
                       "count": "",
                       "reduceRight": false,
                       "reduceExp": "$A and payload",
                       "reduceInit": "true",
                       "reduceInitType": "bool",
                       "reduceFixup": "",
                       "x": 730,
                       "y": 580,
                       "wires": [
                           [
                               "8505d9e0.19a638"
                           ]
                       ]
                   },
                   {
                       "id": "8505d9e0.19a638",
                       "type": "debug",
                       "z": "5f34a973.9a1f88",
                       "name": "",
                       "active": true,
                       "tosidebar": true,
                       "console": false,
                       "tostatus": false,
                       "complete": "false",
                       "statusVal": "",
                       "statusType": "auto",
                       "x": 890,
                       "y": 580,
                       "wires": []
                   }
                ]
                

                Mit dieser Funktion der JOIN Node hat es auch gebraucht bis ich das kapiert habe - macht aber nichts anderes als die reduce Funktion unter JSONATA:

                8316124b-ab6c-4d07-93a3-290e8f801cbd-image.png

                Hier mal mit dem Hilfetext der JOIN - Node - damit man das gleich vergleichen kann.

                Das heißt die JSONATA Eingabe:

                $A and payload
                

                entspricht dem Funktionsaufruf der reduce Funktion in JSONATA.

                F Offline
                F Offline
                frankyboy73
                schrieb am zuletzt editiert von frankyboy73
                #43

                @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                Wobei ich wohl dann besser eine ODER Node verwenden würde und einfach das Ergebnis verneinen. Das wäre logischer.

                Oh mann, stimmt. Habe ich in dem moment gar nicht dran gedacht. Ist die Oder Bedingung nicht erfüllt, weil keine Nachricht true ist, sind ja alle false. Das nennt sich wohl Brett vorm Kopf. :grinning:

                Also wenn ich das jetzt nur per join Node erledigen will, müsste das für ein Oder so aussehen? Und die Menge der Nachrichten die ich mit der Join verarbeite wäre dann egal?

                Join2.jpg

                Wenn das so ist, schnalle ich es doch und es ist auch noch für mich nachvollziehbar. Hoffe das ist auch in ein paar Wochen noch in meinem Kopf drin.

                Edit:
                Hm, klappt leider doch nicht wie gedacht. Schalte ich eine Lampe ein kommt true raus, schalte ich ne andere Lampe aus kommt false raus, obwohl die andere Lampe noch an ist.
                Ah, ok, habe gerade gesehen, das ich noch ne split Node brauche. Hm, dann ist für mich die frage split Node und Join Node oder wie ich es eh schon habe join Node und switch Node? Node Anzahl bleibt die gleiche, also was wäre der Vorteil mit split und join?
                Muss ich mir mal anschauen, split Nodes habe ich bisher für so einen Fall noch nicht verwendet.
                @mickym Bei mir ist es doch etwas anders als in deinem Beispiel. Du sendest per Injekt die komplette Nachricht oder Nachrichten. Bei mir ist es so das ich 5 Iobroker in Nodes habe, die nicht Zeitgleich senden, sondern jede einzelne Nachricht zu verschiedenen Zeitpunkten kommt. Je nach dem wann geschaltet wird.

                Schöne Grüße Frank

                Claus1985 0C mickymM 2 Antworten Letzte Antwort
                0
                • F frankyboy73

                  @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                  Wobei ich wohl dann besser eine ODER Node verwenden würde und einfach das Ergebnis verneinen. Das wäre logischer.

                  Oh mann, stimmt. Habe ich in dem moment gar nicht dran gedacht. Ist die Oder Bedingung nicht erfüllt, weil keine Nachricht true ist, sind ja alle false. Das nennt sich wohl Brett vorm Kopf. :grinning:

                  Also wenn ich das jetzt nur per join Node erledigen will, müsste das für ein Oder so aussehen? Und die Menge der Nachrichten die ich mit der Join verarbeite wäre dann egal?

                  Join2.jpg

                  Wenn das so ist, schnalle ich es doch und es ist auch noch für mich nachvollziehbar. Hoffe das ist auch in ein paar Wochen noch in meinem Kopf drin.

                  Edit:
                  Hm, klappt leider doch nicht wie gedacht. Schalte ich eine Lampe ein kommt true raus, schalte ich ne andere Lampe aus kommt false raus, obwohl die andere Lampe noch an ist.
                  Ah, ok, habe gerade gesehen, das ich noch ne split Node brauche. Hm, dann ist für mich die frage split Node und Join Node oder wie ich es eh schon habe join Node und switch Node? Node Anzahl bleibt die gleiche, also was wäre der Vorteil mit split und join?
                  Muss ich mir mal anschauen, split Nodes habe ich bisher für so einen Fall noch nicht verwendet.
                  @mickym Bei mir ist es doch etwas anders als in deinem Beispiel. Du sendest per Injekt die komplette Nachricht oder Nachrichten. Bei mir ist es so das ich 5 Iobroker in Nodes habe, die nicht Zeitgleich senden, sondern jede einzelne Nachricht zu verschiedenen Zeitpunkten kommt. Je nach dem wann geschaltet wird.

                  Claus1985 0C Offline
                  Claus1985 0C Offline
                  Claus1985 0
                  schrieb am zuletzt editiert von
                  #44

                  Habe nochmal eine Frage an Euch als Experten bzgl. einer Logik:

                  Ausgangslage:
                  Ich erhalte von Homekit Werte im Bereich hsv (Hue/Saturation/Brightness) und On/Off zum steuern einer Lampe.
                  Problem dabei ist, dass Homekit immer nur den sich ändernden Wert schickt (z.B. nur Brightness oder Hue oder eben On/Off).

                  Problem:
                  Mein Empfängersystem benötigt im Ergebnis immer alle drei Werte also immer hsv.

                  Idee:
                  Ich müsste also eine Art Zwischenspeicher schaffen, der sich immer den letzten Wert merkt und nur ersetzt falls sich der Wert ändert. Um beim Einschalten nicht auf der letzten Einstellung sondern beim Default zu landen wäre es zusätzlich wichtig, dass wenn sich On/Off ändert er die Werte hsv wieder auf einen fest vorgegebenen Wert zurück setzt.

                  Ich hätte das rein instinktiv mit batch probiert, bin mir aber nicht sicher wie ich es hinbekomme, dass er sich die anderen Werte auch merkt und nicht dreimal einen geänderten Brightness Wert batcht..

                  Habt ihr da eine Idee wie ich das lösen könnte?

                  Danke und Gruß,

                  Claus

                  F mickymM 2 Antworten Letzte Antwort
                  0
                  • Claus1985 0C Claus1985 0

                    Habe nochmal eine Frage an Euch als Experten bzgl. einer Logik:

                    Ausgangslage:
                    Ich erhalte von Homekit Werte im Bereich hsv (Hue/Saturation/Brightness) und On/Off zum steuern einer Lampe.
                    Problem dabei ist, dass Homekit immer nur den sich ändernden Wert schickt (z.B. nur Brightness oder Hue oder eben On/Off).

                    Problem:
                    Mein Empfängersystem benötigt im Ergebnis immer alle drei Werte also immer hsv.

                    Idee:
                    Ich müsste also eine Art Zwischenspeicher schaffen, der sich immer den letzten Wert merkt und nur ersetzt falls sich der Wert ändert. Um beim Einschalten nicht auf der letzten Einstellung sondern beim Default zu landen wäre es zusätzlich wichtig, dass wenn sich On/Off ändert er die Werte hsv wieder auf einen fest vorgegebenen Wert zurück setzt.

                    Ich hätte das rein instinktiv mit batch probiert, bin mir aber nicht sicher wie ich es hinbekomme, dass er sich die anderen Werte auch merkt und nicht dreimal einen geänderten Brightness Wert batcht..

                    Habt ihr da eine Idee wie ich das lösen könnte?

                    Danke und Gruß,

                    Claus

                    F Offline
                    F Offline
                    frankyboy73
                    schrieb am zuletzt editiert von
                    #45

                    @claus1985-0 Hi, nur noch mal zum Verständniss. Du nutzt IObroker? Node Red läuft bei dir als Adapter im Iobroker? Du bekommst die Werte von Homekit per Adapter in den IObroker? Wenn das so ist, hast du ja die hsv Werte in den Datenpunkten (Objekten) im Iobroker, da sind sie ja im Prinzip schon gespeichert und kannst sie dann mit der IObroker Get Node in Node Red auslesen.

                    Schöne Grüße Frank

                    Claus1985 0C 1 Antwort Letzte Antwort
                    0
                    • F frankyboy73

                      @claus1985-0 Hi, nur noch mal zum Verständniss. Du nutzt IObroker? Node Red läuft bei dir als Adapter im Iobroker? Du bekommst die Werte von Homekit per Adapter in den IObroker? Wenn das so ist, hast du ja die hsv Werte in den Datenpunkten (Objekten) im Iobroker, da sind sie ja im Prinzip schon gespeichert und kannst sie dann mit der IObroker Get Node in Node Red auslesen.

                      Claus1985 0C Offline
                      Claus1985 0C Offline
                      Claus1985 0
                      schrieb am zuletzt editiert von
                      #46

                      @frankyboy73 Leider nicht ganz. Ich habe es anfangs mit dem Adapter in ioBroker anbinden wollen. Die Doku ist für mich allerdings zu spärlich beschrieben so, dass ich damit die Hälfte meiner Funktionen nicht abbilden kann / nur per trial & error und enormem Zeitaufwand. Denn das Problem ist das der Adapter ganz spezifische Infos / Formate benötigt die ich so vom Loxone Adapter nicht bekomme.
                      Daher nutze ich ein Set an Homekit Nodes für node red (https://nrchkb.github.io/wiki/service/).
                      Die sind super dokumentiert und theoretisch kann ich damit alles abbilden was ich an Funktionen habe. Da arbeite ich mich nun Stückweise durch.

                      F 1 Antwort Letzte Antwort
                      0
                      • Claus1985 0C Claus1985 0

                        @frankyboy73 Leider nicht ganz. Ich habe es anfangs mit dem Adapter in ioBroker anbinden wollen. Die Doku ist für mich allerdings zu spärlich beschrieben so, dass ich damit die Hälfte meiner Funktionen nicht abbilden kann / nur per trial & error und enormem Zeitaufwand. Denn das Problem ist das der Adapter ganz spezifische Infos / Formate benötigt die ich so vom Loxone Adapter nicht bekomme.
                        Daher nutze ich ein Set an Homekit Nodes für node red (https://nrchkb.github.io/wiki/service/).
                        Die sind super dokumentiert und theoretisch kann ich damit alles abbilden was ich an Funktionen habe. Da arbeite ich mich nun Stückweise durch.

                        F Offline
                        F Offline
                        frankyboy73
                        schrieb am zuletzt editiert von
                        #47

                        @claus1985-0 Ok, du hast sonst noch die Möglichkeit Werte oder Zustände in flow Variablen oder globalen Variablen zu speichern. Flow Variablen kann man nur in der jeweilgen Flow Seite verwenden, Globale in allen Node Red Seiten. Dann kannst du sie später wieder in deinem Flow abfragen oder in die Nachricht einsetzen.
                        Das meine ich mit Flow Seiten.
                        Variablen1.jpg
                        Hier die Variable setzen
                        Variablen3.jpg
                        Variablen2.jpg
                        und dann wieder im flow verwenden
                        Variablen4.jpg
                        Variablen5.jpg
                        So im Prinzip könnte man Werte und Zustände speichern und wieder verwenden.
                        Mann müsste nun wissen wie deine Input Msg genau aussehen und was du ausgeben musst um dir genauer zu helfen.
                        @mickym kennt sich da noch besser aus.

                        Da ich Node Red als Iobroker Adapter nutze speichere ich mir wichtige Zustände, die auch bei System neustart noch vorhanden sein sollen immer in selbst erstellten Datenpunkten im Iobroker ab und lese sie dann wieder per Iobroker in oder Iobroker Get aus.
                        Variablen6.jpg
                        Variablen7.jpg

                        Schöne Grüße Frank

                        1 Antwort Letzte Antwort
                        0
                        • Claus1985 0C Claus1985 0

                          Habe nochmal eine Frage an Euch als Experten bzgl. einer Logik:

                          Ausgangslage:
                          Ich erhalte von Homekit Werte im Bereich hsv (Hue/Saturation/Brightness) und On/Off zum steuern einer Lampe.
                          Problem dabei ist, dass Homekit immer nur den sich ändernden Wert schickt (z.B. nur Brightness oder Hue oder eben On/Off).

                          Problem:
                          Mein Empfängersystem benötigt im Ergebnis immer alle drei Werte also immer hsv.

                          Idee:
                          Ich müsste also eine Art Zwischenspeicher schaffen, der sich immer den letzten Wert merkt und nur ersetzt falls sich der Wert ändert. Um beim Einschalten nicht auf der letzten Einstellung sondern beim Default zu landen wäre es zusätzlich wichtig, dass wenn sich On/Off ändert er die Werte hsv wieder auf einen fest vorgegebenen Wert zurück setzt.

                          Ich hätte das rein instinktiv mit batch probiert, bin mir aber nicht sicher wie ich es hinbekomme, dass er sich die anderen Werte auch merkt und nicht dreimal einen geänderten Brightness Wert batcht..

                          Habt ihr da eine Idee wie ich das lösen könnte?

                          Danke und Gruß,

                          Claus

                          mickymM Offline
                          mickymM Offline
                          mickym
                          Most Active
                          schrieb am zuletzt editiert von mickym
                          #48

                          @claus1985-0 Das geht alles mit einer JOIN Node. Wenn Du 3 verschiedene Topics hast werden alle Werte in einem Objekt gesammel und wenn Du direkt nach der 1. Antwort rausschicken willst. Der Rest ist wie Du es halt brauchst und musst halt ggf. selbst schicken - also initialisieren oder auf Standardwerte setzen.

                          Also wenn Du die Homekit Bridge Nodes schickst, musst Du nicht immer komplette Objekte schicken:

                          b86d189a-d782-45fc-aa65-b0b0e0b97927-image.png

                          Mit einer split Node schreibst Du immer die Objekteigenschaft in das topic - das die JOIN Node nutzen kann.
                          Die Reset HSV InJect Nodes betätigst Du als erstes und kannst sie somit auch zur Initialisierung der JOIN Node nutzen. Hier also ein weiteres Beispiel wie man die Kombi split und join nutzen kann. ;)

                          43a14fb7-0d3c-4ee5-8307-28084ed2302a-image.png

                          [{"id":"a06a0bdf495b9ec9","type":"join","z":"58159633dd63b0d9","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"1","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":720,"y":700,"wires":[["652dca80e17b65b1"]]},{"id":"5cc1b08efca2d3eb","type":"split","z":"58159633dd63b0d9","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":560,"y":700,"wires":[["a06a0bdf495b9ec9"]]}]
                          

                          Grundsätzlich kannst Du dann natürlich wie @frankyboy73 sagte das Ganze in einer Flow Variable speichern und ggf. wo anders wieder verwenden.

                          Defaults setzt Du halt mit einem Objekt:

                          [{"id":"38f6eb20ca13e23f","type":"change","z":"58159633dd63b0d9","name":"Default setzen","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"On\":true,\"Brightness\":50,\"Hue\":50,\"Saturation\":50}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":820,"wires":[[]]}]
                          

                          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                          1 Antwort Letzte Antwort
                          0
                          • F frankyboy73

                            @mickym sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                            Wobei ich wohl dann besser eine ODER Node verwenden würde und einfach das Ergebnis verneinen. Das wäre logischer.

                            Oh mann, stimmt. Habe ich in dem moment gar nicht dran gedacht. Ist die Oder Bedingung nicht erfüllt, weil keine Nachricht true ist, sind ja alle false. Das nennt sich wohl Brett vorm Kopf. :grinning:

                            Also wenn ich das jetzt nur per join Node erledigen will, müsste das für ein Oder so aussehen? Und die Menge der Nachrichten die ich mit der Join verarbeite wäre dann egal?

                            Join2.jpg

                            Wenn das so ist, schnalle ich es doch und es ist auch noch für mich nachvollziehbar. Hoffe das ist auch in ein paar Wochen noch in meinem Kopf drin.

                            Edit:
                            Hm, klappt leider doch nicht wie gedacht. Schalte ich eine Lampe ein kommt true raus, schalte ich ne andere Lampe aus kommt false raus, obwohl die andere Lampe noch an ist.
                            Ah, ok, habe gerade gesehen, das ich noch ne split Node brauche. Hm, dann ist für mich die frage split Node und Join Node oder wie ich es eh schon habe join Node und switch Node? Node Anzahl bleibt die gleiche, also was wäre der Vorteil mit split und join?
                            Muss ich mir mal anschauen, split Nodes habe ich bisher für so einen Fall noch nicht verwendet.
                            @mickym Bei mir ist es doch etwas anders als in deinem Beispiel. Du sendest per Injekt die komplette Nachricht oder Nachrichten. Bei mir ist es so das ich 5 Iobroker in Nodes habe, die nicht Zeitgleich senden, sondern jede einzelne Nachricht zu verschiedenen Zeitpunkten kommt. Je nach dem wann geschaltet wird.

                            mickymM Offline
                            mickymM Offline
                            mickym
                            Most Active
                            schrieb am zuletzt editiert von
                            #49

                            @frankyboy73 sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                            @mickym Bei mir ist es doch etwas anders als in deinem Beispiel. Du sendest per Injekt die komplette Nachricht oder Nachrichten. Bei mir ist es so das ich 5 Iobroker in Nodes habe, die nicht Zeitgleich senden, sondern jede einzelne Nachricht zu verschiedenen Zeitpunkten kommt. Je nach dem wann geschaltet wird.

                            Nun dann sammelst Du die Nachrichten auch in einer JOIN Node - so mache ich generell meine Überwachung. Zum einen speichere ich das OBjekt mit den einzelnen Zuständen dann als JSON.

                            Hier mal meine Batterieüberwachung der Zigbeegeräte:

                            e7a61e21-d823-4173-b876-36494990fe7e-image.png

                            markiert habe ich die JOIN Node - die dann alle Zustände in einem JSON im iobroker abspeichert. Heute würde ich mit Wildcards mit iobroker in Nodes arbeiten - das ging bei mir damals aber nicht.

                            Das ganze sieht dann so aus:

                            {
                              "Präsenz Küche": true,
                              "Thermometer Bad": true,
                              "Präsenz Diele": true,
                              "Thermometer Küche": true,
                              "Präsenz Wohnzimmer Essbereich": true,
                              "Präsenz Bad": true,
                              "Würfel Wohnzimmer": true,
                              "Präsenz Büro": true,
                              "Präsenz Schlafzimmer": true,
                              "Präsenz Flur": true,
                              "Präsenz Wohnzimmer": true,
                              "Würfel Schlafzimmer": true
                            }
                            

                            Sobald sich dann ein Wert ändert wird mit dem Flow der String neu geschrieben, und triggert meine Auswertung.

                            Ich habe das Ganze zur Überwachung von Zuständen alles hier schon mal vorgestellt: https://forum.iobroker.net/topic/44765/gelöst-überwachung-eingeschaltete-verbraucher/7?_=1638381274770

                            Damals hatte ich statt der Auswertung mit JSONATA noch eine function Node gebastelt, die ich nun abgelöst habe.

                            Ah, ok, habe gerade gesehen, das ich noch ne split Node brauche. Hm, dann ist für mich die frage split Node und Join Node oder wie ich es eh schon habe join Node und switch Node? Node Anzahl bleibt die gleiche, also was wäre der Vorteil mit split und join?

                            Muss ich mir mal anschauen, split Nodes habe ich bisher für so einen Fall noch nicht verwendet.

                            Die Kombination split und join Node brauchst immer wenn Du ein vorhandenes Array oder Objekt analysieren oder modifizieren willst - dazu gibst den automatischen Mode der JOIN Nodes - da diese die msg.parts Informationen der split Node nutzt.

                            Neben der Reduktion (Du musst wie gesagt Deine 5 Punkte sammeln mit JOIN, dann split, dann JOIN mit Reduzierung).
                            Also sammeln, analysieren, ausgeben. Für den automatischen JOIN Modus - darfst Du nur keine Nodes aus dem split wegschmeissen - sonst blockiert der Flow - weil die JOIN Node auf Nachrichten wartet die nie kommen.

                            Ein Beispiel wie man die Kombi Split-Join Node braucht ist also generell das Aufbrechen von Arrays oder Objekten, um etwas auszuwerten oder zu modifizieren:

                            79d98a5a-7872-4111-b626-99ea6880a712-image.png

                            [{"id":"d236e710.7db608","type":"inject","z":"97b73c5be4e86908","name":"Array","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\",\"Sonntag\"]","payloadType":"json","x":310,"y":760,"wires":[["f3df0c37.b2496","8d977bbd.932998"]]},{"id":"f3df0c37.b2496","type":"split","z":"97b73c5be4e86908","name":"","splt":"- ","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":450,"y":760,"wires":[["46f88853.8d5f18"]]},{"id":"ca8a83d6.fc65f","type":"join","z":"97b73c5be4e86908","name":"","mode":"auto","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A & payload & \" - \"","reduceInit":"","reduceInitType":"str","reduceFixup":"$substring($A,0,$length($A)-3)\t","x":750,"y":760,"wires":[["998db142.16b6c"]]},{"id":"998db142.16b6c","type":"debug","z":"97b73c5be4e86908","name":"Wieder zusammengesetzer Input ","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":980,"y":760,"wires":[]},{"id":"8d977bbd.932998","type":"debug","z":"97b73c5be4e86908","name":"Input ","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":450,"y":700,"wires":[]},{"id":"46f88853.8d5f18","type":"change","z":"97b73c5be4e86908","name":"translate","rules":[{"t":"change","p":"payload","pt":"msg","from":"Montag","fromt":"str","to":"Monday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Dienstag","fromt":"str","to":"Tuesday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Mittwoch","fromt":"str","to":"Wednesday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Donnerstag","fromt":"str","to":"Thursday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Freitag","fromt":"str","to":"Friday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Samstag","fromt":"str","to":"Saturday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Sonntag","fromt":"str","to":"Sunday","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":760,"wires":[["ca8a83d6.fc65f"]]}]
                            

                            Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                            F 1 Antwort Letzte Antwort
                            0
                            • mickymM mickym

                              @frankyboy73 sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                              @mickym Bei mir ist es doch etwas anders als in deinem Beispiel. Du sendest per Injekt die komplette Nachricht oder Nachrichten. Bei mir ist es so das ich 5 Iobroker in Nodes habe, die nicht Zeitgleich senden, sondern jede einzelne Nachricht zu verschiedenen Zeitpunkten kommt. Je nach dem wann geschaltet wird.

                              Nun dann sammelst Du die Nachrichten auch in einer JOIN Node - so mache ich generell meine Überwachung. Zum einen speichere ich das OBjekt mit den einzelnen Zuständen dann als JSON.

                              Hier mal meine Batterieüberwachung der Zigbeegeräte:

                              e7a61e21-d823-4173-b876-36494990fe7e-image.png

                              markiert habe ich die JOIN Node - die dann alle Zustände in einem JSON im iobroker abspeichert. Heute würde ich mit Wildcards mit iobroker in Nodes arbeiten - das ging bei mir damals aber nicht.

                              Das ganze sieht dann so aus:

                              {
                                "Präsenz Küche": true,
                                "Thermometer Bad": true,
                                "Präsenz Diele": true,
                                "Thermometer Küche": true,
                                "Präsenz Wohnzimmer Essbereich": true,
                                "Präsenz Bad": true,
                                "Würfel Wohnzimmer": true,
                                "Präsenz Büro": true,
                                "Präsenz Schlafzimmer": true,
                                "Präsenz Flur": true,
                                "Präsenz Wohnzimmer": true,
                                "Würfel Schlafzimmer": true
                              }
                              

                              Sobald sich dann ein Wert ändert wird mit dem Flow der String neu geschrieben, und triggert meine Auswertung.

                              Ich habe das Ganze zur Überwachung von Zuständen alles hier schon mal vorgestellt: https://forum.iobroker.net/topic/44765/gelöst-überwachung-eingeschaltete-verbraucher/7?_=1638381274770

                              Damals hatte ich statt der Auswertung mit JSONATA noch eine function Node gebastelt, die ich nun abgelöst habe.

                              Ah, ok, habe gerade gesehen, das ich noch ne split Node brauche. Hm, dann ist für mich die frage split Node und Join Node oder wie ich es eh schon habe join Node und switch Node? Node Anzahl bleibt die gleiche, also was wäre der Vorteil mit split und join?

                              Muss ich mir mal anschauen, split Nodes habe ich bisher für so einen Fall noch nicht verwendet.

                              Die Kombination split und join Node brauchst immer wenn Du ein vorhandenes Array oder Objekt analysieren oder modifizieren willst - dazu gibst den automatischen Mode der JOIN Nodes - da diese die msg.parts Informationen der split Node nutzt.

                              Neben der Reduktion (Du musst wie gesagt Deine 5 Punkte sammeln mit JOIN, dann split, dann JOIN mit Reduzierung).
                              Also sammeln, analysieren, ausgeben. Für den automatischen JOIN Modus - darfst Du nur keine Nodes aus dem split wegschmeissen - sonst blockiert der Flow - weil die JOIN Node auf Nachrichten wartet die nie kommen.

                              Ein Beispiel wie man die Kombi Split-Join Node braucht ist also generell das Aufbrechen von Arrays oder Objekten, um etwas auszuwerten oder zu modifizieren:

                              79d98a5a-7872-4111-b626-99ea6880a712-image.png

                              [{"id":"d236e710.7db608","type":"inject","z":"97b73c5be4e86908","name":"Array","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\",\"Sonntag\"]","payloadType":"json","x":310,"y":760,"wires":[["f3df0c37.b2496","8d977bbd.932998"]]},{"id":"f3df0c37.b2496","type":"split","z":"97b73c5be4e86908","name":"","splt":"- ","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":450,"y":760,"wires":[["46f88853.8d5f18"]]},{"id":"ca8a83d6.fc65f","type":"join","z":"97b73c5be4e86908","name":"","mode":"auto","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A & payload & \" - \"","reduceInit":"","reduceInitType":"str","reduceFixup":"$substring($A,0,$length($A)-3)\t","x":750,"y":760,"wires":[["998db142.16b6c"]]},{"id":"998db142.16b6c","type":"debug","z":"97b73c5be4e86908","name":"Wieder zusammengesetzer Input ","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":980,"y":760,"wires":[]},{"id":"8d977bbd.932998","type":"debug","z":"97b73c5be4e86908","name":"Input ","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":450,"y":700,"wires":[]},{"id":"46f88853.8d5f18","type":"change","z":"97b73c5be4e86908","name":"translate","rules":[{"t":"change","p":"payload","pt":"msg","from":"Montag","fromt":"str","to":"Monday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Dienstag","fromt":"str","to":"Tuesday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Mittwoch","fromt":"str","to":"Wednesday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Donnerstag","fromt":"str","to":"Thursday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Freitag","fromt":"str","to":"Friday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Samstag","fromt":"str","to":"Saturday","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"Sonntag","fromt":"str","to":"Sunday","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":760,"wires":[["ca8a83d6.fc65f"]]}]
                              

                              F Offline
                              F Offline
                              frankyboy73
                              schrieb am zuletzt editiert von
                              #50

                              @mickym Ok, danke, verstehe ich jetzt, denke ich.
                              Das heißt allerdings für meinen Fall, z.B. 5 Lampen im Wohnzimmer. Dash Board Button Hintergrund steuern. Ist mindestens eine Lampe an soll der Button Orange sein, sind alle Lampen aus soll der Button schwarz sein. Dann brauche ich ne Join, zum Sammeln, danach ne Split zum trennen und dann ne Join um das getrennte auszuwerten, danach ne Change um die Farben zu setzen. 😂 Hab ich das so richtig verstanden?
                              Sorry, ich weiß das ist wahrscheinlich ein spezieller Fall.
                              Meine Umsetzung, ne Join zum Sammeln, ein Switch zum auswerten, ne Change zum Farben setzen.
                              Vielleicht sehe ich auch gerade den Wald vor lauter Bäumen nicht. Oder ich bin zu eingefahren auf meine Wege der Umsetzung.
                              Und Sorry an @Claus1985-0 das wir hier Deinen Post für unsere Diskusionsrunde missbrauchen.

                              Schöne Grüße Frank

                              mickymM 1 Antwort Letzte Antwort
                              0
                              • F frankyboy73

                                @mickym Ok, danke, verstehe ich jetzt, denke ich.
                                Das heißt allerdings für meinen Fall, z.B. 5 Lampen im Wohnzimmer. Dash Board Button Hintergrund steuern. Ist mindestens eine Lampe an soll der Button Orange sein, sind alle Lampen aus soll der Button schwarz sein. Dann brauche ich ne Join, zum Sammeln, danach ne Split zum trennen und dann ne Join um das getrennte auszuwerten, danach ne Change um die Farben zu setzen. 😂 Hab ich das so richtig verstanden?
                                Sorry, ich weiß das ist wahrscheinlich ein spezieller Fall.
                                Meine Umsetzung, ne Join zum Sammeln, ein Switch zum auswerten, ne Change zum Farben setzen.
                                Vielleicht sehe ich auch gerade den Wald vor lauter Bäumen nicht. Oder ich bin zu eingefahren auf meine Wege der Umsetzung.
                                Und Sorry an @Claus1985-0 das wir hier Deinen Post für unsere Diskusionsrunde missbrauchen.

                                mickymM Offline
                                mickymM Offline
                                mickym
                                Most Active
                                schrieb am zuletzt editiert von mickym
                                #51

                                @frankyboy73 sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                                Das heißt allerdings für meinen Fall, z.B. 5 Lampen im Wohnzimmer. Dash Board Button Hintergrund steuern. Ist mindestens eine Lampe an soll der Button Orange sein, sind alle Lampen aus soll der Button schwarz sein. Dann brauche ich ne Join, zum Sammeln, danach ne Split zum trennen und dann ne Join um das getrennte auszuwerten, danach ne Change um die Farben zu setzen.

                                Perfekt. :+1: :+1: :+1: - Der Kandidat hat 100% und mit summa cum laude bestanden. ;)

                                Hier einmal konventionell und mit meinen neuen JSONATA Nodes. ;)

                                6ffb367f-315c-4d47-b514-32de31290376-image.png

                                [{"id":"993a71b8471e1aae","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe1","payload":"false","payloadType":"bool","x":280,"y":220,"wires":[["72f4bbb302df8e6f"]]},{"id":"60a614d766f69566","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe2","payload":"false","payloadType":"bool","x":280,"y":280,"wires":[["72f4bbb302df8e6f"]]},{"id":"3be8c6a66acad57f","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe3","payload":"false","payloadType":"bool","x":280,"y":340,"wires":[["72f4bbb302df8e6f"]]},{"id":"8495e50b7c13eedf","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"Lampe3","payload":"true","payloadType":"bool","x":270,"y":380,"wires":[["72f4bbb302df8e6f"]]},{"id":"dc5fd717eb716960","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe4","payload":"false","payloadType":"bool","x":280,"y":440,"wires":[["72f4bbb302df8e6f"]]},{"id":"575636462cfb6eca","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe5","payload":"false","payloadType":"bool","x":280,"y":500,"wires":[["72f4bbb302df8e6f"]]},{"id":"72f4bbb302df8e6f","type":"join","z":"58159633dd63b0d9","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"5","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":490,"y":340,"wires":[["73b250f4837b02d6","3809b3d93dc621f2","36f12990.e70ea6"]]},{"id":"73b250f4837b02d6","type":"debug","z":"58159633dd63b0d9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":700,"y":260,"wires":[]},{"id":"3809b3d93dc621f2","type":"split","z":"58159633dd63b0d9","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":640,"y":340,"wires":[["359e8c39f26b9c36"]]},{"id":"359e8c39f26b9c36","type":"join","z":"58159633dd63b0d9","name":"Lampen aus?","mode":"reduce","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A and $not(payload)","reduceInit":"true","reduceInitType":"bool","reduceFixup":"","x":820,"y":340,"wires":[["ebc5daf93f973e79","e7afe7d7db59c40f"]]},{"id":"ebc5daf93f973e79","type":"debug","z":"58159633dd63b0d9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1010,"y":260,"wires":[]},{"id":"e7afe7d7db59c40f","type":"change","z":"58159633dd63b0d9","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"schwarz","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"false","fromt":"bool","to":"orange","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":340,"wires":[["54b8568c1d741181"]]},{"id":"54b8568c1d741181","type":"debug","z":"58159633dd63b0d9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1230,"y":260,"wires":[]},{"id":"36f12990.e70ea6","type":"change","z":"58159633dd63b0d9","name":"OR ?","rules":[{"t":"set","p":"payload","pt":"msg","to":"$reduce(payload.*,function($i, $j){$i or $j})","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":420,"wires":[["a20d818b.7397c"]],"info":"# Only one or more properties of an object need to be true.\n\n Only one or more properties of an object need to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes muss wahr sein.\n\nMindestens eine Eigenschaft des Objektes muss wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."},{"id":"a20d818b.7397c","type":"change","z":"58159633dd63b0d9","name":"NOT","rules":[{"t":"set","p":"payload","pt":"msg","to":"$not(payload)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":830,"y":420,"wires":[["3ea3554f3bd8089c"]]},{"id":"fd27acdfc8993a6c","type":"debug","z":"58159633dd63b0d9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1250,"y":420,"wires":[]},{"id":"3ea3554f3bd8089c","type":"change","z":"58159633dd63b0d9","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"schwarz","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"false","fromt":"bool","to":"orange","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":420,"wires":[["fd27acdfc8993a6c"]]}]
                                

                                So funktioniert meine Lichtüberwachung übrigens auch in meiner Wohnung - also so ein außergewöhnlicher Fall ist das nicht. ;)

                                9d027488-066e-41bc-b964-344170b951d2-image.png

                                Und in jedem Raum - habe ich meist mehr als eine Lampe. ;)
                                Ich schreibs halt teilweise weg als JSON String - das kann man ggf. zur Initialisierung beim Flowneustart verwenden - aber das hat auch historische Gründe - habe ja in den 2 Jahren auch viel gelernt und würde heute einiges anders machen - aber Verbesserungen wird es immer geben.

                                Wie gesagt - das ganze Überwachsungsthema - aber Schaltstatus oder Alarmzustände habe ich ja in dem unten zitierten Thread beschrieben.

                                Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                C 1 Antwort Letzte Antwort
                                0
                                • mickymM mickym

                                  @frankyboy73 sagte in Vergleich von zwei Eingangswerten um Wert festzulegen:

                                  Das heißt allerdings für meinen Fall, z.B. 5 Lampen im Wohnzimmer. Dash Board Button Hintergrund steuern. Ist mindestens eine Lampe an soll der Button Orange sein, sind alle Lampen aus soll der Button schwarz sein. Dann brauche ich ne Join, zum Sammeln, danach ne Split zum trennen und dann ne Join um das getrennte auszuwerten, danach ne Change um die Farben zu setzen.

                                  Perfekt. :+1: :+1: :+1: - Der Kandidat hat 100% und mit summa cum laude bestanden. ;)

                                  Hier einmal konventionell und mit meinen neuen JSONATA Nodes. ;)

                                  6ffb367f-315c-4d47-b514-32de31290376-image.png

                                  [{"id":"993a71b8471e1aae","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe1","payload":"false","payloadType":"bool","x":280,"y":220,"wires":[["72f4bbb302df8e6f"]]},{"id":"60a614d766f69566","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe2","payload":"false","payloadType":"bool","x":280,"y":280,"wires":[["72f4bbb302df8e6f"]]},{"id":"3be8c6a66acad57f","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe3","payload":"false","payloadType":"bool","x":280,"y":340,"wires":[["72f4bbb302df8e6f"]]},{"id":"8495e50b7c13eedf","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"Lampe3","payload":"true","payloadType":"bool","x":270,"y":380,"wires":[["72f4bbb302df8e6f"]]},{"id":"dc5fd717eb716960","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe4","payload":"false","payloadType":"bool","x":280,"y":440,"wires":[["72f4bbb302df8e6f"]]},{"id":"575636462cfb6eca","type":"inject","z":"58159633dd63b0d9","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Lampe5","payload":"false","payloadType":"bool","x":280,"y":500,"wires":[["72f4bbb302df8e6f"]]},{"id":"72f4bbb302df8e6f","type":"join","z":"58159633dd63b0d9","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"5","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":490,"y":340,"wires":[["73b250f4837b02d6","3809b3d93dc621f2","36f12990.e70ea6"]]},{"id":"73b250f4837b02d6","type":"debug","z":"58159633dd63b0d9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":700,"y":260,"wires":[]},{"id":"3809b3d93dc621f2","type":"split","z":"58159633dd63b0d9","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":640,"y":340,"wires":[["359e8c39f26b9c36"]]},{"id":"359e8c39f26b9c36","type":"join","z":"58159633dd63b0d9","name":"Lampen aus?","mode":"reduce","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A and $not(payload)","reduceInit":"true","reduceInitType":"bool","reduceFixup":"","x":820,"y":340,"wires":[["ebc5daf93f973e79","e7afe7d7db59c40f"]]},{"id":"ebc5daf93f973e79","type":"debug","z":"58159633dd63b0d9","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1010,"y":260,"wires":[]},{"id":"e7afe7d7db59c40f","type":"change","z":"58159633dd63b0d9","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"schwarz","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"false","fromt":"bool","to":"orange","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":340,"wires":[["54b8568c1d741181"]]},{"id":"54b8568c1d741181","type":"debug","z":"58159633dd63b0d9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1230,"y":260,"wires":[]},{"id":"36f12990.e70ea6","type":"change","z":"58159633dd63b0d9","name":"OR ?","rules":[{"t":"set","p":"payload","pt":"msg","to":"$reduce(payload.*,function($i, $j){$i or $j})","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":420,"wires":[["a20d818b.7397c"]],"info":"# Only one or more properties of an object need to be true.\n\n Only one or more properties of an object need to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes muss wahr sein.\n\nMindestens eine Eigenschaft des Objektes muss wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."},{"id":"a20d818b.7397c","type":"change","z":"58159633dd63b0d9","name":"NOT","rules":[{"t":"set","p":"payload","pt":"msg","to":"$not(payload)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":830,"y":420,"wires":[["3ea3554f3bd8089c"]]},{"id":"fd27acdfc8993a6c","type":"debug","z":"58159633dd63b0d9","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1250,"y":420,"wires":[]},{"id":"3ea3554f3bd8089c","type":"change","z":"58159633dd63b0d9","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"schwarz","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"false","fromt":"bool","to":"orange","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":420,"wires":[["fd27acdfc8993a6c"]]}]
                                  

                                  So funktioniert meine Lichtüberwachung übrigens auch in meiner Wohnung - also so ein außergewöhnlicher Fall ist das nicht. ;)

                                  9d027488-066e-41bc-b964-344170b951d2-image.png

                                  Und in jedem Raum - habe ich meist mehr als eine Lampe. ;)
                                  Ich schreibs halt teilweise weg als JSON String - das kann man ggf. zur Initialisierung beim Flowneustart verwenden - aber das hat auch historische Gründe - habe ja in den 2 Jahren auch viel gelernt und würde heute einiges anders machen - aber Verbesserungen wird es immer geben.

                                  Wie gesagt - das ganze Überwachsungsthema - aber Schaltstatus oder Alarmzustände habe ich ja in dem unten zitierten Thread beschrieben.

                                  C Offline
                                  C Offline
                                  ciNo 0
                                  schrieb am zuletzt editiert von
                                  #52

                                  @mickym
                                  & Wenn ich 3 True eingänge durchlassen möchte wenn erst alle anliegen? (ggf. auch bei false)
                                  Also wenn alle 3 Trues anliegen lässt er einen True durch
                                  Bei 3 false liegt false an
                                  Hier geht es um den bewegungsmelder der erst auf EIN geschalten werden kann in der "Vis" wenn alle lampen AUS sind.
                                  Der Bewegungsmelder dann auch AUS schaltet wenn eine lampe schon an ist.... sodass der Bewegungsmelder nicht funktioniert wenn eine Lampe per hand geschalten wurde
                                  Ich hoffe das ist verständlich es zu verstehen .. :P

                                  So sieht das ca aus 2222.png

                                  mickymM 1 Antwort Letzte Antwort
                                  0
                                  • C ciNo 0

                                    @mickym
                                    & Wenn ich 3 True eingänge durchlassen möchte wenn erst alle anliegen? (ggf. auch bei false)
                                    Also wenn alle 3 Trues anliegen lässt er einen True durch
                                    Bei 3 false liegt false an
                                    Hier geht es um den bewegungsmelder der erst auf EIN geschalten werden kann in der "Vis" wenn alle lampen AUS sind.
                                    Der Bewegungsmelder dann auch AUS schaltet wenn eine lampe schon an ist.... sodass der Bewegungsmelder nicht funktioniert wenn eine Lampe per hand geschalten wurde
                                    Ich hoffe das ist verständlich es zu verstehen .. :P

                                    So sieht das ca aus 2222.png

                                    mickymM Offline
                                    mickymM Offline
                                    mickym
                                    Most Active
                                    schrieb am zuletzt editiert von mickym
                                    #53

                                    @cino-0

                                    [
                                        {
                                            "id": "125b2b0a6b53a8b6",
                                            "type": "switch",
                                            "z": "e1d79a638ccf0814",
                                            "name": "AND?",
                                            "property": "$reduce(payload.*,function($i, $j){$i and $j})",
                                            "propertyType": "jsonata",
                                            "rules": [
                                                {
                                                    "t": "true"
                                                },
                                                {
                                                    "t": "false"
                                                }
                                            ],
                                            "checkall": "true",
                                            "repair": false,
                                            "outputs": 2,
                                            "x": 290,
                                            "y": 280,
                                            "wires": [
                                                [],
                                                []
                                            ],
                                            "info": "# All properties of an object must be true.\n\nAll properties of an object must be true.\n\n`{\n    \"Office\": true,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis true,\n\n`{\n    \"Office\": true,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis false.\n\n# Alle Eigenschaften eines Objektes müssen wahr sein\n\nAlle Eigenschaften eines Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": true,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt true,\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt false."
                                        },
                                        {
                                            "id": "5e43ed7dd2fe25fb",
                                            "type": "change",
                                            "z": "e1d79a638ccf0814",
                                            "name": "AND ?",
                                            "rules": [
                                                {
                                                    "t": "set",
                                                    "p": "payload",
                                                    "pt": "msg",
                                                    "to": "$reduce(payload.*,function($i, $j){$i and $j})",
                                                    "tot": "jsonata"
                                                }
                                            ],
                                            "action": "",
                                            "property": "",
                                            "from": "",
                                            "to": "",
                                            "reg": false,
                                            "x": 290,
                                            "y": 320,
                                            "wires": [
                                                []
                                            ],
                                            "info": "# All Property of an object must be true.\n\nAll properties of an object must be true.\n\n`{\n    \"Office\": true,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis true,\n\n`{\n    \"Office\": true,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": true,\n    \"Living Room Right Window\": true,\n    \"Living Room Left Window\": true\n}`\n\nis false.\n\n# Alle Eigenschaften eines Objektes müssen wahr sein\n\nAlle Eigenschaften eines Objektes müssen wahr sein.\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": true,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt true,\n\n`{\n    \"Büro Balkon\": true,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": true,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": true\n}`\n\nergibt false."
                                        },
                                        {
                                            "id": "413e8364ce2c431f",
                                            "type": "switch",
                                            "z": "e1d79a638ccf0814",
                                            "name": "OR?",
                                            "property": "$reduce(payload.*,function($i, $j){$i or $j})",
                                            "propertyType": "jsonata",
                                            "rules": [
                                                {
                                                    "t": "true"
                                                },
                                                {
                                                    "t": "false"
                                                }
                                            ],
                                            "checkall": "true",
                                            "repair": false,
                                            "outputs": 2,
                                            "x": 450,
                                            "y": 280,
                                            "wires": [
                                                [],
                                                []
                                            ],
                                            "info": "# Only one or more properties of an object need to be true.\n\n Only one or more properties of an object need to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes muss wahr sein.\n\nMindestens eine Eigenschaft des Objektes muss wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."
                                        },
                                        {
                                            "id": "04fafcc3fa45573d",
                                            "type": "change",
                                            "z": "e1d79a638ccf0814",
                                            "name": "OR ?",
                                            "rules": [
                                                {
                                                    "t": "set",
                                                    "p": "payload",
                                                    "pt": "msg",
                                                    "to": "$reduce(payload.*,function($i, $j){$i or $j})",
                                                    "tot": "jsonata"
                                                }
                                            ],
                                            "action": "",
                                            "property": "",
                                            "from": "",
                                            "to": "",
                                            "reg": false,
                                            "x": 450,
                                            "y": 320,
                                            "wires": [
                                                []
                                            ],
                                            "info": "# Only one or more properties of an object need to be true.\n\n Only one or more properties of an object need to be true.\n\n`{\n    \"Office\": false,\n    \"Bedroom\": false,\n    \"Living Room Balcony\": false,\n    \"Liviueng Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis false,\n\n`{\n    \"Office\": false,\n    \"Bedroom\": true,\n    \"Living Room Balcony\": false,\n    \"Living Room Right Window\": false,\n    \"Living Room Left Window\": false\n}`\n\nis true.\n\n# Mindestens eine Eigenschaft des Objektes muss wahr sein.\n\nMindestens eine Eigenschaft des Objektes muss wahr sein.\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": false,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt false,\n\n`{\n    \"Büro Balkon\": false,\n    \"Schlafzimmer Balkon\": true,\n    \"Wohnzimmer Balkon\": false,\n    \"Wohnzimmer rechtes Fenster\": false,\n    \"Wohnzimmer linkes Fenster\": false\n}`\n\nergibt true (wahr)."
                                        },
                                        {
                                            "id": "d20284e99d3d0216",
                                            "type": "change",
                                            "z": "e1d79a638ccf0814",
                                            "name": "NOT",
                                            "rules": [
                                                {
                                                    "t": "set",
                                                    "p": "payload",
                                                    "pt": "msg",
                                                    "to": "$not(payload)\t",
                                                    "tot": "jsonata"
                                                }
                                            ],
                                            "action": "",
                                            "property": "",
                                            "from": "",
                                            "to": "",
                                            "reg": false,
                                            "x": 610,
                                            "y": 300,
                                            "wires": [
                                                []
                                            ]
                                        }
                                    ]
                                    

                                    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                    1 Antwort Letzte Antwort
                                    0
                                    Antworten
                                    • In einem neuen Thema antworten
                                    Anmelden zum Antworten
                                    • Älteste zuerst
                                    • Neuste zuerst
                                    • Meiste Stimmen


                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    822

                                    Online

                                    32.5k

                                    Benutzer

                                    81.7k

                                    Themen

                                    1.3m

                                    Beiträge
                                    Community
                                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                    ioBroker Community 2014-2025
                                    logo
                                    • Anmelden

                                    • Du hast noch kein Konto? Registrieren

                                    • Anmelden oder registrieren, um zu suchen
                                    • Erster Beitrag
                                      Letzter Beitrag
                                    0
                                    • Home
                                    • Aktuell
                                    • Tags
                                    • Ungelesen 0
                                    • Kategorien
                                    • Unreplied
                                    • Beliebt
                                    • GitHub
                                    • Docu
                                    • Hilfe