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. Entwicklung
  4. Mehrfach auf selber IP-Adresse lauschen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

Mehrfach auf selber IP-Adresse lauschen

Geplant Angeheftet Gesperrt Verschoben Entwicklung
26 Beiträge 3 Kommentatoren 2.6k Aufrufe 3 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.
  • S Sneak-L8

    Hallo zusamen,

    ich habe einen Adapter, der per UDP-Kommandos mit einer Wallbox spricht. Dazu gibt es drei UDP4-Sockets: einer der Befehle sendet, einer der die direkten Antworten entgegen nimmt und einer der Broadcasts (auf einem anderen Port) empfängt.

    Wenn nun zwei Wallboxen angeschlossen sind und ich eine 2. Instanz des Adapters nutzen will, um auch die 2. Wallbox zu steuern, dann habe ich das Problem, dass die "Listening"-Address bereits in Gebrauch ist (EADDRINUSE).
    Ich vermute, dass liegt daran, dass ja alle Instanzen auf demselben Rechner liegen und man jede Kombination aus IP-Adresse und Port nur einmal nutzen kann. Ist das richtig?

    Gibt es eine Möglichkeit, das "Lauschen" auf eine Sender-IP-Adresse zu begrenzen um mehrere Sockets mit verschiedenen IP-Adressen nutzen zu können?

    Oder kann ich auf einem Port mit allen Instanzen nur genau ein mal lauschen?
    Falls ja, bliebe mir wohl nur die Wahl, mehrere Wallboxen in einem Adapter zusammen zu verwalten oder eine Master-Instanz zu bestimmen, die dann mit den anderen Instanzen kommuniziert, indem sie diesen die empfangenen Daten weiterleitet.
    Wenn dem so ist: welche Variante würdet Ihr empfehlen? Gibt es da evtl. schon ein how-to?

    Da kenne ich mich zu wenig mit Sockets und dem üblichen Vorgehen in ioBroker bzw. Node-Js aus.

    Viele Grüße
    Sneak-L8

    UncleSamU Offline
    UncleSamU Offline
    UncleSam
    Developer
    schrieb am zuletzt editiert von
    #2

    @sneak-l8 Soviel ich weiss heisst die Lösung "reuseAddr", allerdings habe ich das mit Node noch nie versucht.

    Siehe https://nodejs.org/api/dgram.html

    Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
    ♡-lichen Dank an meine Sponsoren

    S 1 Antwort Letzte Antwort
    0
    • UncleSamU UncleSam

      @sneak-l8 Soviel ich weiss heisst die Lösung "reuseAddr", allerdings habe ich das mit Node noch nie versucht.

      Siehe https://nodejs.org/api/dgram.html

      S Offline
      S Offline
      Sneak-L8
      schrieb am zuletzt editiert von
      #3

      @unclesam Super, viiiieeelen Dank. Das war genau, was ich gesucht habe. Einfach die reuseAddr beim createSocket dazupacken und schon kann man mehrere Verbindungen gleichzeitig auf derselben IP nutzen. Klappt!

      S 1 Antwort Letzte Antwort
      1
      • S Sneak-L8

        @unclesam Super, viiiieeelen Dank. Das war genau, was ich gesucht habe. Einfach die reuseAddr beim createSocket dazupacken und schon kann man mehrere Verbindungen gleichzeitig auf derselben IP nutzen. Klappt!

        S Offline
        S Offline
        Sneak-L8
        schrieb am zuletzt editiert von Sneak-L8
        #4

        @sneak-l8 Hallo zusammen, der Tipp von @UncleSam hat geholfen, aber nun komme ich zu einem zweiten Problem.

        Wenn mehrere Instanzen auf demselben Port lauschen, bekommt nur eine Instanz alle "normale" Antworten mit, die anderen empfangen die Nachrichten nicht.
        Broadcast-Nachrichten from externen Gerät dagegeben kommen bei allen Instanzen an.
        An was könnte das liegen? Die Adresse die ich beim .bind angeen kann, bezieht sich ja auch den lokalen Rechner und nicht auf die IP-Adresse des Gerätes, auf das ch lauschen will.
        Gibt es sonst noch eine Möglichkeit?
        Oder kann ich von einer Instanz zur anderen eigene "Nachrichten" schicken?

        Dieser Seite zufolge ist es eben genau so wie ich es beschrieben habe. Broadcast kommen überall an, andere Nachrichten nur bei der zuletzt gebundenen Instanz (Für Details wird auf diese Seite verwiesen)

        Damit rückt die FRage oben stärker in den Fokus: wie können Instanzen von ioBroker-Adaptern miteinander kommunizieren?

        OliverIOO 1 Antwort Letzte Antwort
        0
        • S Sneak-L8

          @sneak-l8 Hallo zusammen, der Tipp von @UncleSam hat geholfen, aber nun komme ich zu einem zweiten Problem.

          Wenn mehrere Instanzen auf demselben Port lauschen, bekommt nur eine Instanz alle "normale" Antworten mit, die anderen empfangen die Nachrichten nicht.
          Broadcast-Nachrichten from externen Gerät dagegeben kommen bei allen Instanzen an.
          An was könnte das liegen? Die Adresse die ich beim .bind angeen kann, bezieht sich ja auch den lokalen Rechner und nicht auf die IP-Adresse des Gerätes, auf das ch lauschen will.
          Gibt es sonst noch eine Möglichkeit?
          Oder kann ich von einer Instanz zur anderen eigene "Nachrichten" schicken?

          Dieser Seite zufolge ist es eben genau so wie ich es beschrieben habe. Broadcast kommen überall an, andere Nachrichten nur bei der zuletzt gebundenen Instanz (Für Details wird auf diese Seite verwiesen)

          Damit rückt die FRage oben stärker in den Fokus: wie können Instanzen von ioBroker-Adaptern miteinander kommunizieren?

          OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb am zuletzt editiert von OliverIO
          #5

          @sneak-l8

          https://stackoverflow.com/questions/13307904/can-udp-broadcasts-be-received-by-multiple-apps-on-the-same-computer

          und zeig mal deinen code

          Meine Adapter und Widgets
          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
          Links im Profil

          S 1 Antwort Letzte Antwort
          0
          • OliverIOO OliverIO

            @sneak-l8

            https://stackoverflow.com/questions/13307904/can-udp-broadcasts-be-received-by-multiple-apps-on-the-same-computer

            und zeig mal deinen code

            S Offline
            S Offline
            Sneak-L8
            schrieb am zuletzt editiert von Sneak-L8
            #6

            @oliverio https://github.com/iobroker-community-adapters/ioBroker.kecontact/tree/newAdapterBase

            reuseaddr mache ich bereits, das war ja der Tipp von UncleSam. Bind funktioniert auch, nur kommen wie auch im Link beschrieben nur beim zuletzt gebundenen Adapter die Nachrichten an. Das hat mir ein Tester auch sehr gut durch ein Log-Mitschnitt gezeigt.

            OliverIOO 1 Antwort Letzte Antwort
            0
            • S Sneak-L8

              @oliverio https://github.com/iobroker-community-adapters/ioBroker.kecontact/tree/newAdapterBase

              reuseaddr mache ich bereits, das war ja der Tipp von UncleSam. Bind funktioniert auch, nur kommen wie auch im Link beschrieben nur beim zuletzt gebundenen Adapter die Nachrichten an. Das hat mir ein Tester auch sehr gut durch ein Log-Mitschnitt gezeigt.

              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von
              #7

              @sneak-l8

              schau mal hier.
              ich hab den bind-befehl etwas anders.
              die angabe von 0.0.0.0 ist wohl noch sowas wie ein filter (also hier alles)
              und ich setze nochmal explitzit die setbroadcast funktion

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              S 1 Antwort Letzte Antwort
              0
              • OliverIOO OliverIO

                @sneak-l8

                schau mal hier.
                ich hab den bind-befehl etwas anders.
                die angabe von 0.0.0.0 ist wohl noch sowas wie ein filter (also hier alles)
                und ich setze nochmal explitzit die setbroadcast funktion

                S Offline
                S Offline
                Sneak-L8
                schrieb am zuletzt editiert von
                #8

                @oliverio Danke für die Rückmeldung. Ich vermute, hinter "hier" sollte sich ein Link verbergen. Der scheint aber nicht da zusein.
                Ich verstehe bisher nur so viel. setBroadcast sollte ich auch bei der normalen Verbindung setzen und 0.0.0.0 expliziet angeben anstatt keine IP-Adresse anzugeben?

                OliverIOO 1 Antwort Letzte Antwort
                0
                • S Sneak-L8

                  @oliverio Danke für die Rückmeldung. Ich vermute, hinter "hier" sollte sich ein Link verbergen. Der scheint aber nicht da zusein.
                  Ich verstehe bisher nur so viel. setBroadcast sollte ich auch bei der normalen Verbindung setzen und 0.0.0.0 expliziet angeben anstatt keine IP-Adresse anzugeben?

                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von
                  #9

                  @sneak-l8
                  Ja sorry link vergessen
                  https://github.com/oweitman/ioBroker.squeezeboxrpc/blob/54a78e0c428dec47e96ade29fd4aa530cf0eab4e/lib/iosbserver.js#L271

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  S 1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @sneak-l8
                    Ja sorry link vergessen
                    https://github.com/oweitman/ioBroker.squeezeboxrpc/blob/54a78e0c428dec47e96ade29fd4aa530cf0eab4e/lib/iosbserver.js#L271

                    S Offline
                    S Offline
                    Sneak-L8
                    schrieb am zuletzt editiert von
                    #10

                    @oliverio Ok, danke , probiere ich aus.
                    Sollte ja keinen UInterschied machen, ob ich den Broadcast in "on listening" oder als function beim bin mache. Passiert ja mehr oder minder zur selben Zeit, oder?

                    OliverIOO 1 Antwort Letzte Antwort
                    0
                    • S Sneak-L8

                      @oliverio Ok, danke , probiere ich aus.
                      Sollte ja keinen UInterschied machen, ob ich den Broadcast in "on listening" oder als function beim bin mache. Passiert ja mehr oder minder zur selben Zeit, oder?

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #11

                      @sneak-l8
                      Ich denke nicht

                      Aus der Node Doku
                      Specifying both a 'listening' event listener and passing a callback to the socket.bind() method is not harmful but not very useful.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      S 2 Antworten Letzte Antwort
                      0
                      • OliverIOO OliverIO

                        @sneak-l8
                        Ich denke nicht

                        Aus der Node Doku
                        Specifying both a 'listening' event listener and passing a callback to the socket.bind() method is not harmful but not very useful.

                        S Offline
                        S Offline
                        Sneak-L8
                        schrieb am zuletzt editiert von
                        #12

                        @oliverio Genau den Satz hatte ich dort auch gelesen und genau daher gefragt (nicht , dass ich ihn falsch verstanden hatte) :)

                        S 1 Antwort Letzte Antwort
                        0
                        • S Sneak-L8

                          @oliverio Genau den Satz hatte ich dort auch gelesen und genau daher gefragt (nicht , dass ich ihn falsch verstanden hatte) :)

                          S Offline
                          S Offline
                          Sneak-L8
                          schrieb am zuletzt editiert von
                          #13

                          @sneak-l8 So, Test war leider nicht erfolgreich. Es empfängt weiterhin nur der letzte der sich eingeklinkt hat die Daten.
                          Hab jetzt nochmal bei Stackoverflow nachgelesen. Zwei Möglichkeitne sehe ich noch.
                          Das eine wäre REUSEPORt anstelle REUSEADDR und das zweite wäre der Versuch mit Connect auf die konkrete IP-Adresse der jeweiligen Wallbox zu binden.

                          1 Antwort Letzte Antwort
                          0
                          • OliverIOO OliverIO

                            @sneak-l8
                            Ich denke nicht

                            Aus der Node Doku
                            Specifying both a 'listening' event listener and passing a callback to the socket.bind() method is not harmful but not very useful.

                            S Offline
                            S Offline
                            Sneak-L8
                            schrieb am zuletzt editiert von
                            #14

                            @oliverio So, ich hab's nochmal versucht. reuseport gibt es bei NodeJs unter Linux wohl gar nicht. Das klappt schon mal nicht. Und mit connect komme ich auch nicht weiter, da muss ich ja beim send.Objekt auch lauschen und bekomme nicht zurück.

                            Ich befüchte, die Beschreibungen haben recht, dass es nur bei Broadcast-Messages geht.

                            Dann bliebe die Frage, ob ich zwischen den Adaptern kommunizieren kann? Also entweder über eine Art Message oder direkter Aufruf einer Methode einer anderen Instanz des Adapters?

                            OliverIOO 1 Antwort Letzte Antwort
                            0
                            • S Sneak-L8

                              @oliverio So, ich hab's nochmal versucht. reuseport gibt es bei NodeJs unter Linux wohl gar nicht. Das klappt schon mal nicht. Und mit connect komme ich auch nicht weiter, da muss ich ja beim send.Objekt auch lauschen und bekomme nicht zurück.

                              Ich befüchte, die Beschreibungen haben recht, dass es nur bei Broadcast-Messages geht.

                              Dann bliebe die Frage, ob ich zwischen den Adaptern kommunizieren kann? Also entweder über eine Art Message oder direkter Aufruf einer Methode einer anderen Instanz des Adapters?

                              OliverIOO Offline
                              OliverIOO Offline
                              OliverIO
                              schrieb am zuletzt editiert von
                              #15

                              @Sneak-L8

                              Hm schwierig. Eigentlich h dachte ich seh das das funktionieren müsste. Evtl mit noch anderen Einstellungen

                              Ansonsten kannst natürlich auch selbes noch eine Kommunikation aufbauen durch senden und empfangen von Netzwerk nachrichten

                              Meine Adapter und Widgets
                              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                              Links im Profil

                              S 1 Antwort Letzte Antwort
                              0
                              • OliverIOO OliverIO

                                @Sneak-L8

                                Hm schwierig. Eigentlich h dachte ich seh das das funktionieren müsste. Evtl mit noch anderen Einstellungen

                                Ansonsten kannst natürlich auch selbes noch eine Kommunikation aufbauen durch senden und empfangen von Netzwerk nachrichten

                                S Offline
                                S Offline
                                Sneak-L8
                                schrieb am zuletzt editiert von
                                #16

                                @oliverio Ich habe es jetzt so gelöst, dass mittels "reuseaddr" alle Instanzen auf derselben Adresse/demselben Port lauschen. Nur eine Instanz bekommt dann die Antworten. Diese prüft, ob die Nachricht von der IP-adresse der in dieser Instanz verwalteten Wallbox kommt.
                                Andernfalls wird die Instanz ermittelt die sich um diese Wallbox kümmert und die Nachricht in einen State dieser Instanz geschrieben. Über einen Listener reagiert die Instanz dann auf das setzen des States.

                                Bei der Ermittlung des State nutze ich getForeignObjects leider kommen mit "system.adapter.<adapterName>." alle möglichen Daten zu den Instanzen, abern icht das Objekt der Instanz. Daher frage ich nach "system.adapter.<adapterName>..uptime", um aus den Antworten dann die Instanzen zu ermitteln und mittels getForeignObject dann direkt "system.adapter.<adapterName>.<n>" zu lesen. Dort finde ich dann unter native.host die für die Instanz hinterlegte IP-Adresse.
                                Weißt Du, ob es einen kürzeren Weg gibt, an die Instanz mit native.host = <IP-Adresse> zu kommen?

                                OliverIOO 1 Antwort Letzte Antwort
                                0
                                • S Sneak-L8

                                  @oliverio Ich habe es jetzt so gelöst, dass mittels "reuseaddr" alle Instanzen auf derselben Adresse/demselben Port lauschen. Nur eine Instanz bekommt dann die Antworten. Diese prüft, ob die Nachricht von der IP-adresse der in dieser Instanz verwalteten Wallbox kommt.
                                  Andernfalls wird die Instanz ermittelt die sich um diese Wallbox kümmert und die Nachricht in einen State dieser Instanz geschrieben. Über einen Listener reagiert die Instanz dann auf das setzen des States.

                                  Bei der Ermittlung des State nutze ich getForeignObjects leider kommen mit "system.adapter.<adapterName>." alle möglichen Daten zu den Instanzen, abern icht das Objekt der Instanz. Daher frage ich nach "system.adapter.<adapterName>..uptime", um aus den Antworten dann die Instanzen zu ermitteln und mittels getForeignObject dann direkt "system.adapter.<adapterName>.<n>" zu lesen. Dort finde ich dann unter native.host die für die Instanz hinterlegte IP-Adresse.
                                  Weißt Du, ob es einen kürzeren Weg gibt, an die Instanz mit native.host = <IP-Adresse> zu kommen?

                                  OliverIOO Offline
                                  OliverIOO Offline
                                  OliverIO
                                  schrieb am zuletzt editiert von
                                  #17

                                  @sneak-l8

                                  ich muss nochmal nachfragen.
                                  du programmierst einen adapter?
                                  der folgende befehl kann aus dem script-adapter und aus den widgets heraus aufgerufen werden, aber jedesmal etwas anders.

                                  https://github.com/ioBroker/ioBroker.js-controller/blob/5d9bc81716937c16ae2e89717eca3c9a1faee5d3/packages/controller/doc/adapter.js.html#L3519

                                  mit diesem befehl kannst du alle datenpunkte abrufen, die einem muster entsprechen.
                                  wenn ich davon ausgehe, das die datenpunkte mit der jeweiligen ip wie folgt heißt:
                                  adaptername.0.datenpunktname
                                  adaptername.1.datenpunktname
                                  usw

                                  müsste es wie folgt funktionieren

                                  var key = "adaptername.*.datenpunktname"
                                  adapter.getStates(key, function (err, states) {
                                           for (var id in states) {
                                                adapter.log.debug('"' + id + '" = "' + states[id].val);
                                           }
                                       });
                                  

                                  im states-array hast du dann jeweils die gefundenen datenpunkte als objekt.
                                  ich würde dann anhand des timestamps den jeweils zuletzt beschriebenen datenpunkt heraussuchen und da dann den wert (also die ip-adresse) weiter verarbeiten.
                                  die verfügbaren properties und deren bezeichnung eines datenpunkts sind mir aktuell nicht geläufig. aber mit einem debugger kannst das ja schnell sehen.

                                  Meine Adapter und Widgets
                                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                  Links im Profil

                                  S 1 Antwort Letzte Antwort
                                  0
                                  • OliverIOO OliverIO

                                    @sneak-l8

                                    ich muss nochmal nachfragen.
                                    du programmierst einen adapter?
                                    der folgende befehl kann aus dem script-adapter und aus den widgets heraus aufgerufen werden, aber jedesmal etwas anders.

                                    https://github.com/ioBroker/ioBroker.js-controller/blob/5d9bc81716937c16ae2e89717eca3c9a1faee5d3/packages/controller/doc/adapter.js.html#L3519

                                    mit diesem befehl kannst du alle datenpunkte abrufen, die einem muster entsprechen.
                                    wenn ich davon ausgehe, das die datenpunkte mit der jeweiligen ip wie folgt heißt:
                                    adaptername.0.datenpunktname
                                    adaptername.1.datenpunktname
                                    usw

                                    müsste es wie folgt funktionieren

                                    var key = "adaptername.*.datenpunktname"
                                    adapter.getStates(key, function (err, states) {
                                             for (var id in states) {
                                                  adapter.log.debug('"' + id + '" = "' + states[id].val);
                                             }
                                         });
                                    

                                    im states-array hast du dann jeweils die gefundenen datenpunkte als objekt.
                                    ich würde dann anhand des timestamps den jeweils zuletzt beschriebenen datenpunkt heraussuchen und da dann den wert (also die ip-adresse) weiter verarbeiten.
                                    die verfügbaren properties und deren bezeichnung eines datenpunkts sind mir aktuell nicht geläufig. aber mit einem debugger kannst das ja schnell sehen.

                                    S Offline
                                    S Offline
                                    Sneak-L8
                                    schrieb am zuletzt editiert von
                                    #18

                                    @oliverio Ja, ich programiere einen Adapter (kecontact).
                                    Mit getStates bekomme ich nur die States eines Adapters (so habe ich es bisher verstanden). Wenn ich die Objects (der Instanz) eines Adapters brauche, muss ich getObjects() nehmen. Und mir geht es um eine Einstellung (native.host = IP-adresse der Wallbox), nach der ich in den Instanzen suche.

                                    Da ich die Daten einer anderen Instanz brauche, muss ich getForeignObjects() nehmen.

                                    Hier mal mein Codeausschnitt dazu:

                                            const prefix = "system.adapter.";
                                            const adapterpart = adapter.name + ".";
                                            const suffix = ".uptime";
                                            adapter.getForeignObjects(prefix + adapterpart + "*" + suffix, function(err, objects) {
                                                if (err) {
                                                    adapter.log.error("Error while fetching other instances: " + err);
                                                    return;
                                                }
                                                if (objects) {
                                                    for (const item in objects) {
                                                        if (Object.prototype.hasOwnProperty.call(objects, item) && item.endsWith(suffix)) {
                                                            const namespace = item.slice(prefix.length, - suffix.length);
                                                            adapter.getForeignObject(prefix + namespace, function(err, object) {
                                                                if (err) {
                                                                    adapter.log.error("Error while fetching other instances: " + err);
                                                                    return;
                                                                }
                                                                if (object) {
                                                                    if (Object.prototype.hasOwnProperty.call(object, "native")) {
                                                                        if (Object.prototype.hasOwnProperty.call(object.native, "host")) {
                                                                            if (object.native.host == remote.address) {
                                                                                adapter.setForeignState(namespace + "." + stateMsgFromOtherwallbox, message.toString().trim());
                                                                                adapter.log.debug("Message from " + remote.address + " send to " + namespace);
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    }
                                                }
                                    

                                    wobei "remote.address" die gesuchte IP-Adresse der Instanz und "message" die er UDP empfangene Nachricht enthält.

                                    Ich nehme das Pattern "system.adapter.kecontact.*.uptime", weil die getForeignObjects-Methode bei "system.adapter.kecontact.*" leider nur die Daten, aber nicht system.adapter.kecontact.1 findet...

                                    OliverIOO 1 Antwort Letzte Antwort
                                    0
                                    • S Sneak-L8

                                      @oliverio Ja, ich programiere einen Adapter (kecontact).
                                      Mit getStates bekomme ich nur die States eines Adapters (so habe ich es bisher verstanden). Wenn ich die Objects (der Instanz) eines Adapters brauche, muss ich getObjects() nehmen. Und mir geht es um eine Einstellung (native.host = IP-adresse der Wallbox), nach der ich in den Instanzen suche.

                                      Da ich die Daten einer anderen Instanz brauche, muss ich getForeignObjects() nehmen.

                                      Hier mal mein Codeausschnitt dazu:

                                              const prefix = "system.adapter.";
                                              const adapterpart = adapter.name + ".";
                                              const suffix = ".uptime";
                                              adapter.getForeignObjects(prefix + adapterpart + "*" + suffix, function(err, objects) {
                                                  if (err) {
                                                      adapter.log.error("Error while fetching other instances: " + err);
                                                      return;
                                                  }
                                                  if (objects) {
                                                      for (const item in objects) {
                                                          if (Object.prototype.hasOwnProperty.call(objects, item) && item.endsWith(suffix)) {
                                                              const namespace = item.slice(prefix.length, - suffix.length);
                                                              adapter.getForeignObject(prefix + namespace, function(err, object) {
                                                                  if (err) {
                                                                      adapter.log.error("Error while fetching other instances: " + err);
                                                                      return;
                                                                  }
                                                                  if (object) {
                                                                      if (Object.prototype.hasOwnProperty.call(object, "native")) {
                                                                          if (Object.prototype.hasOwnProperty.call(object.native, "host")) {
                                                                              if (object.native.host == remote.address) {
                                                                                  adapter.setForeignState(namespace + "." + stateMsgFromOtherwallbox, message.toString().trim());
                                                                                  adapter.log.debug("Message from " + remote.address + " send to " + namespace);
                                                                              }
                                                                          }
                                                                      }
                                                                  }
                                                              });
                                                          }
                                                      }
                                                  }
                                      

                                      wobei "remote.address" die gesuchte IP-Adresse der Instanz und "message" die er UDP empfangene Nachricht enthält.

                                      Ich nehme das Pattern "system.adapter.kecontact.*.uptime", weil die getForeignObjects-Methode bei "system.adapter.kecontact.*" leider nur die Daten, aber nicht system.adapter.kecontact.1 findet...

                                      OliverIOO Offline
                                      OliverIOO Offline
                                      OliverIO
                                      schrieb am zuletzt editiert von
                                      #19

                                      @sneak-l8
                                      ah ja verstehe.
                                      ich nenne das für mich die Konfigurationseinstellungen einer Instanz.

                                      ja das kannst du so abfragen. ich würde es aber dennoch über datenpunkte machen.

                                      dein adapter weiß ja erst einmal nicht ob es von ihm 1 oder mehr instanzen gibt.
                                      daher muss er erst einmal das abfragen.
                                      wenn mehrere instanzen laufen, dann passieren da konkurrierende abfragen.
                                      es bleibt zufall, welche instanz als erstes den broadcast abfragt und das in das richtige setting schreibt.

                                      daher jede instanz hört auf den broadcast
                                      jede instanz sucht nach anderen instanzen des adapters und abonniert auf die änderung des/der jeweiligen anderen datenpunkte, sowie schaut ob schon was drin steht und nimmt den jüngsten wert aller

                                      die instanz die den broadcast erhält setzt den datenpunkt
                                      die anderen erhalten den trigger
                                      das übernehmen des jüngsten werts aus allen datenpunkten geschieht, falls eine instanz später (neu)gestartet wird. da kommt kein trigger weil der wert ja schon geschrieben ist.

                                      wie gesagt, ich würde das über einen datenpunkt machen und nicht über die instanzkonfiguration.

                                      Meine Adapter und Widgets
                                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                      Links im Profil

                                      S 1 Antwort Letzte Antwort
                                      0
                                      • OliverIOO OliverIO

                                        @sneak-l8
                                        ah ja verstehe.
                                        ich nenne das für mich die Konfigurationseinstellungen einer Instanz.

                                        ja das kannst du so abfragen. ich würde es aber dennoch über datenpunkte machen.

                                        dein adapter weiß ja erst einmal nicht ob es von ihm 1 oder mehr instanzen gibt.
                                        daher muss er erst einmal das abfragen.
                                        wenn mehrere instanzen laufen, dann passieren da konkurrierende abfragen.
                                        es bleibt zufall, welche instanz als erstes den broadcast abfragt und das in das richtige setting schreibt.

                                        daher jede instanz hört auf den broadcast
                                        jede instanz sucht nach anderen instanzen des adapters und abonniert auf die änderung des/der jeweiligen anderen datenpunkte, sowie schaut ob schon was drin steht und nimmt den jüngsten wert aller

                                        die instanz die den broadcast erhält setzt den datenpunkt
                                        die anderen erhalten den trigger
                                        das übernehmen des jüngsten werts aus allen datenpunkten geschieht, falls eine instanz später (neu)gestartet wird. da kommt kein trigger weil der wert ja schon geschrieben ist.

                                        wie gesagt, ich würde das über einen datenpunkt machen und nicht über die instanzkonfiguration.

                                        S Offline
                                        S Offline
                                        Sneak-L8
                                        schrieb am zuletzt editiert von
                                        #20

                                        @oliverio

                                        es bleibt zufall, welche instanz als erstes den broadcast abfragt und das in das richtige setting schreibt.
                                        Nicht ganz.

                                        Broadcasts werden an alle Instanzen durchgereicht. Direkte Antworten auf einen UDP-Befehl eine beliebigen Instanz des Adapters gehen alle an die letzt-gestartete Instanz.

                                        Sowohl bei Broadcasts als auch bei direkten Antworten prüft die Instanz zunächst, ob das Datenpaket von der der Wallbox mit der in den Konfigurationseinstellungen hinterlegten IP-Adresse kommt.

                                        Bei Broadcasts werden fremde Antworten einfach ignoriert, nur direkte Antworten müssen an die anderen Instanzen weitergereicht werden.

                                        Wenn ich wie von Dir vorgeschlagen einen Datenpunkt angelegen würde und die anderen Instanzen lauschen auf eine Änderung dieses Datenpunktes dann habe ich mehrere Nachteile:

                                        • alle Instanzen müssen auf die Datenpunkte aller anderen Instanzen lauschen, denn sie wissen weder, wer die Daten empfangen wird, noch ist dies konstant
                                        • wenn die letzt-gestartete Instanz eendet wird, bekommt künftig automatisch die vorletzt-gestartete Instanz die Anworten.
                                        • es muss ein 2. Datenpnukt geschrieben werden oder die Antwort so verpackt werden, dass die "Absender-IP-Adresse" mitgeschrieben wird, damit jede Instanz erkennen kann, ob die Daten für sie sind
                                        • wenn quasi gleichzeitig Daten von mehreren Wallboxen eintreffen und diese sofort in alle Instanz-Datenpunkte geschrieben werden, dann besteht die Gefahr, dass die zweite Nachricht die erste überschreibt, bevor die erste ausgewertet wurde (oder gibt es da ein saubere Queueing?)

                                        Daher habe ich mich entschieden, dass der aktuelel Empfänger die Daten an die anderen Instanzen weiterreicht. Damit ich die Daten nicht mehrfach schreiben muss (und nicht zusätzlich die Absender-IP hinterlegen muss), hole ich mir alle Instanzen und schaue, wer für die IP-Adresse zuständig ist. Diese Instanz bekommt dann die Nachricht als Datenpunkt geschrieben.

                                        Ich hoffe, ich konnte das verständlich erklären.

                                        OliverIOO 1 Antwort Letzte Antwort
                                        0
                                        • S Sneak-L8

                                          @oliverio

                                          es bleibt zufall, welche instanz als erstes den broadcast abfragt und das in das richtige setting schreibt.
                                          Nicht ganz.

                                          Broadcasts werden an alle Instanzen durchgereicht. Direkte Antworten auf einen UDP-Befehl eine beliebigen Instanz des Adapters gehen alle an die letzt-gestartete Instanz.

                                          Sowohl bei Broadcasts als auch bei direkten Antworten prüft die Instanz zunächst, ob das Datenpaket von der der Wallbox mit der in den Konfigurationseinstellungen hinterlegten IP-Adresse kommt.

                                          Bei Broadcasts werden fremde Antworten einfach ignoriert, nur direkte Antworten müssen an die anderen Instanzen weitergereicht werden.

                                          Wenn ich wie von Dir vorgeschlagen einen Datenpunkt angelegen würde und die anderen Instanzen lauschen auf eine Änderung dieses Datenpunktes dann habe ich mehrere Nachteile:

                                          • alle Instanzen müssen auf die Datenpunkte aller anderen Instanzen lauschen, denn sie wissen weder, wer die Daten empfangen wird, noch ist dies konstant
                                          • wenn die letzt-gestartete Instanz eendet wird, bekommt künftig automatisch die vorletzt-gestartete Instanz die Anworten.
                                          • es muss ein 2. Datenpnukt geschrieben werden oder die Antwort so verpackt werden, dass die "Absender-IP-Adresse" mitgeschrieben wird, damit jede Instanz erkennen kann, ob die Daten für sie sind
                                          • wenn quasi gleichzeitig Daten von mehreren Wallboxen eintreffen und diese sofort in alle Instanz-Datenpunkte geschrieben werden, dann besteht die Gefahr, dass die zweite Nachricht die erste überschreibt, bevor die erste ausgewertet wurde (oder gibt es da ein saubere Queueing?)

                                          Daher habe ich mich entschieden, dass der aktuelel Empfänger die Daten an die anderen Instanzen weiterreicht. Damit ich die Daten nicht mehrfach schreiben muss (und nicht zusätzlich die Absender-IP hinterlegen muss), hole ich mir alle Instanzen und schaue, wer für die IP-Adresse zuständig ist. Diese Instanz bekommt dann die Nachricht als Datenpunkt geschrieben.

                                          Ich hoffe, ich konnte das verständlich erklären.

                                          OliverIOO Offline
                                          OliverIOO Offline
                                          OliverIO
                                          schrieb am zuletzt editiert von OliverIO
                                          #21

                                          @sneak-l8

                                          mal eine frage:
                                          warum willst du eigentlich mehrere instanzen eines adapter laufen haben?
                                          evtl ist da der logik-knick
                                          so wie ich verstanden habe, kommuniziert dein entferntes gerät nur mit einer instanz.
                                          das ist von netzwerks wegen auch so korrekt.
                                          aber wenn du eine unterteilung machst (über mehrere instanzen des selben adapters,
                                          dann kannst du das doch auch alles innerhalb einer instanz selbst machen?

                                          Meine Adapter und Widgets
                                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                          Links im Profil

                                          S 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

                                          633

                                          Online

                                          32.7k

                                          Benutzer

                                          82.4k

                                          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