Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. batterieliste werte vergleichen und mit telegram ausgeben

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    batterieliste werte vergleichen und mit telegram ausgeben

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

      @mickym sagte in batterieliste werte vergleichen und mit telegram ausgeben:

      Bei der Gelegenheit noch ein Wort zu den enums - im iobroker. Das wird von Node-Red Adapter des iobrokers nicht unterstützt - da sind Blockly Fans im Vorteil . Insbesondere ist es bedauerlich, da man sie nicht als subscriptions nutzen kann - also generell dynamische subscriptions.

      Du kannst die enum mit der ioB-List-node auslesen.
      Hier mal 2 meiner Listen, die davon Gebrauch machen:

      2022-09-17_01-14-27.png

      Hier das Prinzip

      2022-09-17_01-17-53.png

      Das enum wird dann mit einem simplen JSONata - Ausdruck gelesen. Hier mal für die Etage:

      $lookup(payload.enums, payload.enums.$sift(function($v, $k) {$k ~> /^enum.ort./}).$keys()[0])
      

      Eigentlich sollte einem Device ja nur ein Ort zugewiesen sein, aber zur Sicherheit nehme ich hier immer den ersten hinterlegten [0].

      Gruß
      Reiner

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

        @rewenode Na ich hab in den state objekten keine enums gefunden, sondern nur im common objekt der enums.

        Nehmen wir dieses Folder Objekt:

        899d40a6-be5a-45a9-913c-c76d3223c6e6-image.png

        In dem Objekt gibts absolut NICHTS - und somit auch nichts für die List Node zum Auslesen. Gilt auch für alle Objekte unter dem Folder.

        {
          "type": "folder",
          "common": {
            "name": "shelly1-C4328A"
          },
          "from": "system.adapter.javascript.0",
          "user": "system.user.admin",
          "ts": 1628370786300,
          "_id": "mqtt.1.shellies.shelly1-C4328A",
          "acl": {
            "object": 1636,
            "owner": "system.user.admin",
            "ownerGroup": "system.group.administrator"
          }
        }
        

        Das Einzige wo die Räume sind ist in den Enums-Objekten:

        b9251b80-0c11-406d-af46-9847a85da8ca-image.png

        Damit könnte ich zwar aus dem Objekt die members auslesen - aber das geht mit der list Node nicht.

        {
          "_id": "enum.rooms.bedroom",
          "common": {
            "name": "Schlafzimmer",
            "members": [
              "alias.0.schalter.sz_bettlampe_links",
              "alias.0.schalter.sz_bettlampe_rechts",
              "alias.0.schalter.sz_lichtschalter_schrankbeleuchtung",
              "alias.0.schalter.sz_schrankbeleuchtung",
              "alias.0.schalter.sz_steckdosendreifach",
              "alias.0.schalter.sz_tischlampe",
              "alias.0.schalter.sz_usb4fach"
            ],
            "icon": "",
            "color": "#37e46b"
          },
          "type": "enum",
          "acl": {
            "object": 1636,
            "owner": "system.user.admin",
            "ownerGroup": "system.group.administrator"
          },
          "from": "system.adapter.admin.0",
          "user": "system.user.admin",
          "ts": 1638823013488
        }
        

        Ich bekomm da nichts raus:

        622c7135-f910-498e-88f4-06779b79ad90-image.png

        Mag sein, dass du den Devices Adapter nutzt - dann mag das anders sein, da dieser ja Aliases anlegt - aber bei den native Objekten scheint das nicht zu gehen.

        R 2 Replies Last reply Reply Quote 0
        • R
          rewenode @mickym last edited by

          @mickym Hier mal ein simpler Versuchsflow :

          [
              {
                  "id": "517d85fc5aaf024e",
                  "type": "tab",
                  "label": "Flow 1",
                  "disabled": false,
                  "info": "",
                  "env": []
              },
              {
                  "id": "2e8d03e488999418",
                  "type": "ioBroker in",
                  "z": "517d85fc5aaf024e",
                  "name": "alias.0.Verschluss.Büro_WGn.opened",
                  "topic": "alias.0.Verschluss.Büro_WGn.opened",
                  "payloadType": "object",
                  "onlyack": "",
                  "func": "rbe",
                  "gap": "",
                  "fireOnStart": "false",
                  "x": 810,
                  "y": 60,
                  "wires": [
                      [
                          "e363d78423d60f62"
                      ]
                  ]
              },
              {
                  "id": "3d77413c217ddcbd",
                  "type": "ioBroker list",
                  "z": "517d85fc5aaf024e",
                  "name": "",
                  "topic": "alias.0.Verschluss.Büro_WGn.opened",
                  "objType": "state",
                  "regex": "",
                  "asArray": "true",
                  "onlyIDs": "false",
                  "withValues": "true",
                  "x": 830,
                  "y": 200,
                  "wires": [
                      [
                          "b7c6a270d81aaab9"
                      ]
                  ]
              },
              {
                  "id": "b7c6a270d81aaab9",
                  "type": "change",
                  "z": "517d85fc5aaf024e",
                  "name": "",
                  "rules": [
                      {
                          "t": "set",
                          "p": "ort",
                          "pt": "msg",
                          "to": "$lookup(payload.enums, payload.enums.$sift(function($v, $k) {$k ~> /^enum.ort./}).$keys()[0])\t\t",
                          "tot": "jsonata"
                      }
                  ],
                  "action": "",
                  "property": "",
                  "from": "",
                  "to": "",
                  "reg": false,
                  "x": 780,
                  "y": 260,
                  "wires": [
                      [
                          "b5e5d4321feb90c0"
                      ]
                  ]
              },
              {
                  "id": "e363d78423d60f62",
                  "type": "change",
                  "z": "517d85fc5aaf024e",
                  "name": "topic -> windowsTopic",
                  "rules": [
                      {
                          "t": "set",
                          "p": "windowsTopic",
                          "pt": "msg",
                          "to": "topic",
                          "tot": "msg"
                      }
                  ],
                  "action": "",
                  "property": "",
                  "from": "",
                  "to": "",
                  "reg": false,
                  "x": 790,
                  "y": 140,
                  "wires": [
                      [
                          "3d77413c217ddcbd"
                      ]
                  ]
              },
              {
                  "id": "b5e5d4321feb90c0",
                  "type": "debug",
                  "z": "517d85fc5aaf024e",
                  "name": "debug 13",
                  "active": true,
                  "tosidebar": true,
                  "console": false,
                  "tostatus": false,
                  "complete": "true",
                  "targetType": "full",
                  "statusVal": "",
                  "statusType": "auto",
                  "x": 1060,
                  "y": 260,
                  "wires": []
              }
          ]
          

          2022-09-17_01-52-18.png

          Das abonnierte Object ist ein Alias, kannst du also leicht nachbauen.
          Es ist hier dem enum.ort.eg zugeornet.

          nr (1).png

          Gruß
          Reiner

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

            @mickym sagte in batterieliste werte vergleichen und mit telegram ausgeben:

            Mag sein, dass du den Devices Adapter nutzt - dann mag das anders sein, da dieser ja Aliases anlegt - aber bei den native Objekten scheint das nicht zu gehen.

            Keinen Device Adapter. Im Falle der Fensterliste sind das Aliase, die auf HM-Adapter verweisen.

            Im Falle der Batterieliste sind das native Zigbee-Devices ohne Alias. Da macht ein Alias ja auch nicht unbedingt Sinn. Die Batterie hängt ha nicht an einem virtuellen device.

            Gruß
            Reiner

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

              @rewenode OK - Du hast Recht -

              ad0562dd-48b8-494c-9b29-59d4af5a499f-image.png

              ... aber wie gesagt ich halte das für sehr umständlich ausser man macht sich damit eigene Listen - wie gesagt die "Pollerei" finde ich aus Prinzip nicht gut.

              Also es funktioniert - aber alle Objekte durchsuchen ist einfach in diesem Fall ungeeignet.

              In anderen Fällen, so wie Du es beschreibst, dass Du schon über die In-Node triggerst und dann über das Objekt die Funktion ermittelst ist OK.

              Aber wichtig wäre ja - wenn man mit den Enums triggern kann und das geht halt nicht. Sondern man triggert nur über die normalen Pfade auf states.

              Ist schon klar, dass Du mit der Methode dann alle Objekte durchsuchen kannst und die Enum Listen wieder rekonstruierst - was in meinen Augen aber sehr umständlich ist. Wenn Du dann alle Objekte, die mit der gefragten Funktion matchen in ein Array gespeichert hast, dann kannst Du alles wieder auslesen - aber ist halt wieder Pollerei.

              Was ich mit dem github Enhancement erreichen wollte ist, das man quasi mit

              enum.function.battery - automatisch subscription listen erstellt. - Das können die neunen mqtt-Nodes unter mqtt v5 - wo du immer mehr subscriptions addieren kannst.

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

                @mickym sagte in batterieliste werte vergleichen und mit telegram ausgeben:

                "Pollerei" finde ich aus Prinzip nicht gut.

                Also, ich habe genau einen State abboniert und lese auch nur das eine Objekt.
                Ich bin mir auch nicht sicher, ob es viel schnelle wäre, state+object+enum im ioB zu lesen, zu kombinieren und an NR zu schicken. Sicher wäre es einfacher, wenn state und object wenigstens auf Wunsch als Einheit zu abbonieren wären.
                Aber sonderlich kompliziert ist das nicht. Die Listen müssen ja ohnehin (i.d.R. per JSONata) aufbereitet werden.

                Gruß
                Reiner

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

                  @rewenode Nee - was ich meine - und das wäre das optimale wenn man in den iobroker-In Nodes enums angeben könnte.

                  In JS geht das auch: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#on---subscribe-on-changes-or-updates-of-some-state

                  dd5e020d-91cf-46fe-941c-8233c796edde-image.png

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

                    Also, ich habe genau einen State abonniert und lese auch nur das eine Objekt.

                    Das ist aber das Problem - gerade wenn man nicht pollen will - dann sollen ja theoretisch nicht ein bestimmter State triggern. Das kann ich das wieder mit Wildcards machen - aber dann brauch ich das Enum entweder nicht analysieren oder ist einfach dummer Aufwand. Ich verstehe einfach nicht, warum man die ENUM Objekte nicht direkt mit der List Node auslesen kann.

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

                      @mickym sagte in batterieliste werte vergleichen und mit telegram ausgeben:

                      dann sollen ja theoretisch nicht ein bestimmter State triggern. Das kann ich das wieder mit Wildcards machen - aber dann brauch ich das Enum entweder nicht analysieren oder ist einfach dummer Aufwand.

                      Hast ja recht. Aber ich bin schonmal froh, dass ich mit vertretbarem Aufwand improvisieren kann.

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

                        @rewenode Und Du hast ja auch Recht 😉 - ich hab es wieder vergessen, dass bei den List-Node Abfragen die Enums mit dabei sind. 😉 - Hatte ich zwar schon mal in anderem Zusammenhang festgestellt - aber war mir wieder entfallen.

                        Ich hab das ja hier selbst in einem Flow angewendet: https://forum.iobroker.net/topic/50161/verfügbarkeit-von-sensoren-über-node-red-überwachen/45?_=1663374414159

                        Für die batteriebetrieben Devices ist in meinen Augen neben des Batterielevels die Überprüfung der Verfügbarkeit bzw. über das Pollen der Adapter den online Status zu überwachen unentbehrlich.

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

                          @mickym said in batterieliste werte vergleichen und mit telegram ausgeben:

                          Die Geräte melden sich wie gesagt selbst und wenn ich dauernd einen Datenpunkt abfrage, der von einem Gerät gar nicht aktiv gemeldet wird - dann ist das eh sinnlos. Sprich wenn der Datenpunkt im Zigbee- Adapter für das Batterielevel auf 80% steht und das Gerät die Verbindung zum iobroker verloren hat, dann steht da nach 10 Jahren immer noch 80% - da das Gerät diesen Wert nie aktualisiert hat. 10 Jahre unnütze Abfragen mit sinnlosen Ergebnissen. Hört auf zu pollen und wartet bis die Geräte sich melden!!!!

                          Hello,
                          ok, jetzt verstehe ich auch warum alle immer nur auf change gehen...klar wenn man es so sieht.

                          im Prinzip gibt es fertige Blockly zum nachbauen die genau auf change state beruhen.

                          Da ich einige Sensoren verwende auf esp32 basis ist fuer mich wie du beschreibst mqtt der gemeinsame NENNER, dh. ich koennte auch diesen als letzten Status speicher verwenden.

                          Danke fuer Eure vielen Antworten, ich muss sagen die komplizierten Dinge lohnen sich fuer meinen Zweck nicht(lernen dauert ), ich benutzte eine vis Seite wo ich die Zustaende sowieso sehe 🙂
                          Eigentlich wollte ich mich nur mit Telegram beschaeftigen 🤡
                          8098a9fe-bfb3-486c-a4a2-e107a10e56ba-image.png

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          718
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

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