Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. UDPRAW von Hyperion zu IOBroker

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    UDPRAW von Hyperion zu IOBroker

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

      Ich Grüße,

      Ich bin recht neu beim Scripting, und bin nun nach 8h rumprobieren, am ende vom meinem Latein.

      Ich habe unter meinem TV an einem Sideboard einen Zigbee LED Streifen, und möchte die Farben gerne an das TV Bild anpassen (also die Durchschnittsfarbe vom unteren Bereich).

      Die ganze Verarbeitung übernimmt Hyperion NG, und sendet die RGB Werte per UDP an meinen IoBroker
      (zumindest wenn diese Dokumentation stimmt https://git.koehlerweb.org/frodovdr/hyperion.ng/commit/6b0bf2ac90519d93e39b2fc4b05f3353471e6688?style=split)

      Nun habe ich das Script hier "ausgeliehen"
      https://forum.iobroker.net/topic/33464/gelöst-udp-listener-eaddrinuse
      um die Daten zu Empfangen.

      Was ich Empfange ist aber leider nur Quark.

      Logs.png

      und nun weiß ich nicht, warum die beiden nicht die selbe Sprache sprechen, oder nur ich nicht verstehe, was von Hyperion übertragen wird.

      Vielen dank für die Aufmerksamkeit, und hoffentlich Hilfe.

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

        @ratatoesk Okay, habs verstanden... ich weiß nicht warum ich Hex oder Dezimal werte erwartet hatte statt ASCII...

        mhh... nur ich möchte ja im Idealfall das als Hex in einem Datenpunkt schreiben... bekomme ich auch in den nächsten 2 Wochen noch raus 🙂

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

          @ratatoesk Okay, ich bin so weit gekommen... die Konsole zeigt mir jetzt die Werte in HEX an, yay... aber ich bekomme sie nicht in meinen Datenpunkt geschrieben... keine Ahnung warum nicht.

          const dgram = require('dgram');
          
          const socket = dgram.createSocket('udp4');
          
          socket.on("error", function (err) {
              log("Socket error: " + err);
              socket.close();
          });
           
          
          socket.on('message',function(message,rinfo) {
            log("recieved: " + message.toString("hex"));
            setState("javascript.0.TV-Licht.Licht_SubTV"/*Licht SubTV*/, ("#" + message.toString("hex")));
            });
           
          socket.on('listening', function() {
              const address = socket.address();
              log(`server listening on ${address.address}:${address.port}`);
           });
          
          socket.bind(5568);
          
          
          
          R 1 Reply Last reply Reply Quote 0
          • R
            ratatoesk @ratatoesk last edited by ratatoesk

            Script läuft jetzt nachdem ich es in eine neue datei geschrieben habe 🤷‍♂️

            Hier jetzt der Code, leider gehen nur 3-4Hz sonst kommt IoBroker nicht mehr hinterher den State zu setzen, aber für die Umgebungsbeleuchtung ausreichend.

            //UDP Socket öffnen
            const dgram = require('dgram');
            
            const socket = dgram.createSocket('udp4');
            
            //Error Handhabung
            socket.on("error", function (err) {
                log("Socket error: " + err);
                socket.close();
            });
             
            //Receive message
            socket.on('message',function(message,rinfo) {
            //Packet als HEX - Farbe setzen
               setState("Lampe.color"/*Color*/, ("#" + message.toString("hex")));
            
            //Helligkeitswerte berechnen
                var br;
                var bg;
                var bb;
                var i = "0x" +(message.toString("hex")); // 16711952
                r = (i >> 16) & 0xFF;       // or `(i & 0xFF0000) >> 16`
                g = (i >>  8) & 0xFF;      // or `(i & 0x00FF00) >>  8`
                b =  i        & 0xFF;         // or ` i & 0x0000FF       `
              br =  Math.round((r /255) *100);
              bg =  Math.round((g /255) *100);
              bb =  Math.round((b /255) *100);
            
            //Helligkeit der Intensivsten Farbe als Globale Helligkeit setzen
              if (br >= bg && br >=bb) {setState("Lampe.brightness"/*Brightness*/, br)}
              else if (bg >= bb) {setState("Lampe.brightness"/*Brightness*/, bg)}
              else {setState("Lampe.brightness"/*Brightness*/, bb)};
            
              
            
              });
             
            
            socket.on('listening', function() {
                const address = socket.address();
                log(`server listening on ${address.address}:${address.port}`);
             });
            
            
            socket.bind(5568);
            
            onStop(() => { 
                socket.close();
            });
            
            

            Klar, Licht was sich direkt mit Hyperion ansteuern lässt ist da deutlich angenehmer und Funktioniert besser, aber es gehen dank Iobroker als Schnittstelle halt alle Lampen, auch wenn die sicher auf Dauer ersetzt werden.

            1rfsNet 1 Reply Last reply Reply Quote 0
            • 1rfsNet
              1rfsNet @ratatoesk last edited by

              @ratatoesk Ich bin nicht so wirklich der JS Profi und bin nicht sicher, ob ich dein Script vollständig verstanden habe.
              Hatte auch die Idee die LED Panels an der Decke ungefähr an das Bild anzupassen. Hatte mir schon gedacht, dass iobroker da nicht mithalten kann. Also war mein Plan nur ungefähr die Lampen zu steuern (also wenn sich wirklich die Farbe komplett ändert und nicht bei jeder kleinsten Änderung). Meinst du das ist halbwegs umsetzbar oder ist der Versatz zu groß?

              Asgothian 1 Reply Last reply Reply Quote 0
              • Asgothian
                Asgothian Developer @1rfsNet last edited by

                @1rfsnet

                Die Quizfragen dazu sind:

                • wie oft senden Hyperion die Daten
                • was sind "signifikante Änderungen"

                Im ersten Schritt würde ich das Skript so erweitern:

                // Variablen definieren
                //
                var setRed = -1;
                var setGreen = -1;
                var setBlue = -1;
                var minDelta = 10;
                var TimeStamp = Date.now();
                
                //UDP Socket öffnen
                const dgram = require('dgram');
                 
                const socket = dgram.createSocket('udp4');
                 
                //Error Handhabung
                socket.on("error", function (err) {
                    log("Socket error: " + err);
                    socket.close();
                });
                 
                //Receive message
                socket.on('message',function(message,rinfo) {
                //Packet als HEX - Farbe setzen
                   setState("Lampe.color"/*Color*/, ("#" + message.toString("hex")));
                   //timing
                  const now = Date.now(); 
                //Helligkeitswerte berechnen
                    var br;
                    var bg;
                    var bb;
                    var i = "0x" +(message.toString("hex")); // 16711952
                    r = (i >> 16) & 0xFF;       // or `(i & 0xFF0000) >> 16`
                    g = (i >>  8) & 0xFF;      // or `(i & 0x00FF00) >>  8`
                    b =  i        & 0xFF;         // or ` i & 0x0000FF       `
                  br =  Math.round((r /255) *100);
                  bg =  Math.round((g /255) *100);
                  bb =  Math.round((b /255) *100);
                
                  // R,G,B Werte auf mindestens "minDelta" Veränderung prüfen, Max. 1 Änderung pro 500 ms.
                  if ((Math.abs(br-setRed) > minDelta || Math.abs(bg-setGreen) > minDelta || Math.abs(bb-setBlue) > minDelta) && (now - timestamp > 500)) 
                  { 
                //Helligkeit der Intensivsten Farbe als Globale Helligkeit setzen
                  const bright = Math.max(br,bg,bb);
                  setBlue = bb;
                  setRed = br;
                  setGreen = bg;
                  setState("Lampe.brightness"/*Brightness*/, bright)l
                 }
                });
                 
                 
                socket.on('listening', function() {
                    const address = socket.address();
                    log(`server listening on ${address.address}:${address.port}`);
                 });
                 
                 
                socket.bind(5568);
                 
                onStop(() => { 
                    socket.close();
                });
                
                1rfsNet 1 Reply Last reply Reply Quote 0
                • 1rfsNet
                  1rfsNet @Asgothian last edited by

                  @asgothian Ich würde mal vermuten, dass Hyperion jede kleinste Änderung schickt. Zumindest das kann man sich ja mal ohne ioBroker ansehen (werde ich mal bei Gelegenheit machen).
                  Signifikate Änderungen wären wohl z.B., dass bei einem blauen Himmel nicht alle paar ms der Blauton minimal verändert wird.

                  Asgothian 1 Reply Last reply Reply Quote 0
                  • Asgothian
                    Asgothian Developer @1rfsNet last edited by

                    @1rfsnet

                    Wie schon oben im Post geschrieben - ich habe das Skript für Dich schon entsprechend angepasst. Über die Variable minDelta kannst du die Empfindlichkeit einstellen. Allerdings ist zu beachten das das Skript nur die Helligkeit einer Lampe anpasst, nicht die Farbe.

                    A.

                    1rfsNet 1 Reply Last reply Reply Quote 0
                    • 1rfsNet
                      1rfsNet @Asgothian last edited by

                      @asgothian oh wow danke. ich schau es mir nachher mal an. Hab mir das Script auf dem Handy nicht so genau angeschaut.

                      1 Reply Last reply Reply Quote 0
                      • R
                        ratatoesk last edited by

                        Oh, garnicht aufgefallen das Interesse 🙂

                        Also, wie oft Hyperion die Daten sendet, kann man ja einstellen, mit 2 Datensätzen die Sekunde habe ich da gute Erfahrungen gemacht mit einem TS0505B Zigbee Controller. Wenn man darüber hinaus geht, beginnen sich die Daten, wahrscheinlich im Zigbee Adapter anzustauen, und die Farbwechsel beginnen hinterher zu hinken, bis man teil eine Minute vor schwarzem Bild warten darf, bis die LEDs aufgeholt haben. Ich weiß jetzt nicht wie der Zigbee Adapter die daten sendet, durch MQTT mit Quality of Service "At most once" würde sich das Problem lösen, und dadurch auch mehr Performance möglich sein.

                        Bei 2-3 Datensätzen von Hyperion je Sekunde, sehe ich jetzt weniger einen Sinn dort noch extra die Daten zu Filtern. Auch wenn man somit vielleicht die Schreibzugriffe auf die SD Karte bissl reduziert 😅

                        1rfsNet 1 Reply Last reply Reply Quote 1
                        • 1rfsNet
                          1rfsNet @ratatoesk last edited by

                          @ratatoesk said in UDPRAW von Hyperion zu IOBroker:

                          Also, wie oft Hyperion die Daten sendet, kann man ja einstellen, mit 2 Datensätzen die Sekunde habe ich da gute Erfahrungen gemacht

                          Wo geht das denn? Habe schon gesucht, aber finde nichts.

                          R 1 Reply Last reply Reply Quote 0
                          • R
                            ratatoesk @1rfsNet last edited by

                            @1rfsnet Hyperion.png

                            In der Konfiguration der Aufnahme Hardware

                            1rfsNet 1 Reply Last reply Reply Quote 0
                            • 1rfsNet
                              1rfsNet @ratatoesk last edited by

                              @ratatoesk Achso schade. Ich habe USB Aufnahme, da gibt es die Einstellung nicht. Außerdem sind die Einstellungen da instanzunabhängig.

                              Hast du eine Idee wie man das auf ioBroker Seite verarbeiten könnte? Ich dachte daran zwar alles zu empfangen, aber setState nur 2x pro Sekunde auszuführen, d.h. die anderen Werte einfach zu ignorieren. Leider habe ich keine Idee wie ich das machen soll. Ich kenne mich damit zu wenig aus.

                              1rfsNet 1 Reply Last reply Reply Quote 0
                              • 1rfsNet
                                1rfsNet @1rfsNet last edited by

                                @1rfsnet said in UDPRAW von Hyperion zu IOBroker:

                                Hast du eine Idee wie man das auf ioBroker Seite verarbeiten könnte? Ich dachte daran zwar alles zu empfangen, aber setState nur 2x pro Sekunde auszuführen, d.h. die anderen Werte einfach zu ignorieren. Leider habe ich keine Idee wie ich das machen soll. Ich kenne mich damit zu wenig aus.

                                Habs inzwischen hinbekommen, aber so richtig toll ist das trotzdem nicht.

                                1.) DIe Lampen springen zu oft zwischen zwei Farben hin und her. (Das ist vermutlich eher ein Problem bei Hyperion)
                                2.) man müsste irgendwie ähnliche Farbcodes erkennen und ausfiltern. Ich sende viel zu oft sehr ähnliche Farbcodes an die Lampen, was teilweise zu komischem Flackern führt.

                                R 1 Reply Last reply Reply Quote 0
                                • R
                                  ratatoesk @1rfsNet last edited by

                                  @1rfsnet Hyperion sendet die Daten ja als hex Werte, die dann in rgb umgewandelt werden, und diese könntest du direkt vergleichen, und dann nach dem Set state eine halbe Sekunde pause einfügen

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

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  956
                                  Online

                                  31.7k
                                  Users

                                  79.6k
                                  Topics

                                  1.3m
                                  Posts

                                  3
                                  15
                                  737
                                  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