NEWS
UDPRAW von Hyperion zu IOBroker
-
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(); });
-
@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. -
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.
-
@asgothian oh wow danke. ich schau es mir nachher mal an. Hab mir das Script auf dem Handy nicht so genau angeschaut.
-
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
-
@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.
-
In der Konfiguration der Aufnahme Hardware
-
@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 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. -
@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