Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Xiaomi Yeelight Smart LED (DE)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Xiaomi Yeelight Smart LED (DE)

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

      Guten Tag,

      ich bin neu hier im Forum und wollte nun auch meine Yeelights in ioBroker einrichten. Dazu wollte ich das Script von Magda benutzen. ich bin folgendermaßen Vorgegangen.

      ich habe die Yeelight.sh nach /opt/iobroker kopiert

      Yeelight ist an

      Java Script Adapter Aktiv

      Dann unter Skripte zwei neue Scripte erstellt. Dort habe ich jeweils den Code von Magda eingefügt.

      Yeelight find

      var dgram = require('dgram');
      var s = dgram.createSocket('udp4');
      var debug = true;
      
      const MULTICAST_IP = '239.255.255.250';
      const s_dataset = 'javascript.0.Yeelight.Bulb';
      const s_id = '.id';
      const s_address = '.Location';
      const s_bright = '.bright';
      const s_hue = '.hue';
      const s_colorMode = '.color_mode';
      const s_rgb = '.rgb';
      const s_sat = '.sat';
      const s_power = '.power';
      const s_ct = '.ct';
      const s_name = '.name';
      const s_group = '.group';
      
      s.bind(1982, function() {
         s.addMembership(MULTICAST_IP);
         if (debug) console.log("listening on all addresses");
      });
      
      s.on("message", function (msg, rinfo) {
         if (debug) console.log('Broadcast empfangen: ' + msg);
         if (msg.indexOf('yeelight') < 0) {
             if (debug) console.log("Kein Yeelight Broadcast");
             return;
         }
         var bulbID = extractValue('id: ', msg);
         var i = 1;
         var unknownBulb = true;
      
         //wenn Lampe vorhanden, dann Werte aktualisieren
         while (getObject(s_dataset + i + s_id)) {
            if (getState(s_dataset + i + s_id).val == bulbID) {
               setState(s_dataset + i + s_address, extractValue('Location: ', msg), false);
               setState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), true);
               setState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), true);
               setState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), true);
               setState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), true); //Wert umgewandelt von Dec zu Hex damit Colorpicker Widget einfacher zu nutzen ist
               setState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), true);
               setState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), true);
               setState(s_dataset + i + s_power, extractValue('power: ', msg), true);
               unknownBulb = false;
               if (debug) console.log('Werte für Lampe ' + i + ' aktualisiert');
               break;
            }
            i++;
            //Notaus
            if (i >= 100) {
               if (debug) console.log('zu viele Schleifendurchläufe');
               break;
            }
         }
         //wenn Lampe nicht gefunden, dann neue Lampe erstellen
         if (unknownBulb) {
            if (debug) console.log('neue Lampe wird erstellt');
            createNewBulb(i, msg);  
         }
      });
      
      function createNewBulb(i, msg) {
         createState(s_dataset + i + s_id, extractValue('id: ', msg), {read: true, write: true, desc: "unique ID der Yeelight Lampe", type: "string", def: ""});
         createState(s_dataset + i + s_address, extractValue('Location: ', msg), {read: true, write: true, desc: "URL der Yeelight Lampe", type: "string", def: ""});
          createState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), {read: true, write: true, desc: "Helligkeit", type: "number", min: 1, max: 100, def: 1, unit: "%"});
         createState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), {read: true, write: true, desc: "HSV Farbwert", type: "number", min: 0, max: 359, def: 1, unit: ""});
         createState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), {read: true, write: true, desc: "Farbwert", type: "number", min: 1, max: 3, def: 1, unit: ""});
         createState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), {read: true, write: true, desc: "RGB Farbwert in HEX", type: "string", def: ""});
         createState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), {read: true, write: true, desc: "HSV Sättigung", type: "number", min: 1, max: 100, def: 1, unit: ""});
         createState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), {read: true, write: true, desc: "Farbtemperatur weiß", type: "number", min: 1700, max: 6500, def: 5000, unit: ""});
         createState(s_dataset + i + s_power, extractValue('power: ', msg), {read: true, write: true, desc: "Zustand on/off", type: "string", def: ""});
          createState(s_dataset + i + s_name, '', {read: true, write: true, desc: "selbst vergebener Name", type: "string", def: "Yeelight"});
         createState(s_dataset + i + s_group, i, {read: true, write: true, desc: "Gruppe", type: "number", min: 1, max: 100, def: 1, unit: ""});
         if (debug) console.log('neue Lampe erstellt mit ID: ' + i);
      }
      
      function extractValue(key, message) {
          var text = message.toString('utf-8');
          var startPos = (text.indexOf(key) + key.length);
          var endPos = text.substring(startPos).indexOf('\r\n');
          return text.substr(startPos, endPos);
      }
      
      // close connection if script stopped
      onStop(function (callback) {
          if (s) {
              // close connection
              s.close();
              if (debug) console.log('UDP Client gestoppt');
          }
          callback();
      }, 2000 /*ms*/); 
      
      

      und Yeelight add

      var net = require('net');
      var clients = [];
      var debug = true;
      
      const switchEffect = 'smooth'; //smooth or sudden
      const switchEffectTime = 1000; // min value 30
      
      const s_dataset = 'javascript.0.Yeelight.Bulb';
      const s_bright = '.bright';
      const s_hue = '.hue';
      const s_colorMode = '.color_mode';
      const s_rgb = '.rgb';
      const s_sat = '.sat';
      const s_power = '.power';
      const s_ct = '.ct';
      const s_name = '.name';
      
      function createClient(bulbID, location) {
          var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
          var ipAddress = (new RegExp('(?:[0-9]{1,3}\.){3}[0-9]{1,3}')).exec(location)[0];
         clients[bulbID - 1] = net.createConnection(port, ipAddress);
         if (debug) console.log('Client erstellt für Lampe ' + bulbID);
      
         clients[bulbID - 1].on('data', function(data) {
            if (debug) console.log('Empfangen: ' + data);
            notificationReceived(bulbID, data)
         });
      
         clients[bulbID - 1].on('close', function() {
             if (debug) console.log('Verbindung geschlossen');
         }); 
      
         clients[bulbID - 1].on('error', function() {
            if (debug) console.log('Verbindung fehlerhaft');
         }); 
      }
      
      function killClient(bulbID) {
         if (clients[bulbID - 1]) {
            clients[bulbID - 1].destroy();
            if (debug) console.log('Client beendet für Lampe ' + bulbID);
         }
      }
      
      function sendBulbCommand(bulbID, changedValue, param1, effect, effectTime) {
         var command;
          switch (changedValue) {
              case 'ct':
                  command = '{"id":' + bulbID + ',"method":"set_ct_abx","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'rgb':
                  command = '{"id":' + bulbID + ',"method":"set_rgb","params":[' + parseInt(param1.substring(1), 16) + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'hue':
               var sat = getState(s_dataset+ bulbID + '.sat').val;
                  command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + param1 + ', ' + sat + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
            case 'sat':
               var hue = getState(s_dataset + bulbID + '.hue').val;
                  command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + hue + ', ' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;   
              case 'bright':
                  command = '{"id":' + bulbID + ',"method":"set_bright","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'power':
                  command = '{"id":' + bulbID + ',"method":"set_power","params":["' + param1 + '", "' + effect + '", ' + effectTime + ']}\r\n';
                  break;
              case 'toggle':
                  command = '{"id":' + bulbID + ',"method":"toggle","params":[]}\r\n';
                  break;
              default:
                  if (debug) console.log('Unbekanntes Kommando');
                  return;
          }
          if (debug) console.log(command);
      
          var commandClient = new net.Socket();
          //if (debug) console.log(clients[bulbID - 1].remoteAddress);
          //if (debug) console.log(clients[bulbID - 1].remotePort);
      
          var location = getState('javascript.0.Yeelight.Bulb' + bulbID + '.Location').val;
          var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
          var ipAddress = (new RegExp('(?:[0-9]{1,3}\.){3}[0-9]{1,3}')).exec(location)[0];
      
          commandClient.connect(port, ipAddress, function() {
              commandClient.write(command); 
              if (debug) console.log("CommandClient Command gesendet");
          });
          commandClient.on('data', function(data) {
              if (debug) console.log('CommandClient empfangen: ' + data);
             commandClient.destroy(); // kill client after server's response
             if (debug) console.log('CommandClient beendet');
          });
      }
      
      function notificationReceived(bulbID, data) {
         var notification = JSON.parse(data);
         if (notification.params.power) {
            setState(s_dataset + bulbID + s_power, notification.params.power, true);
         }
         if (notification.params.bright) {
            setState(s_dataset + bulbID + s_bright, parseInt(notification.params.bright), true);
         }
         if (notification.params.ct) {
            setState(s_dataset + bulbID + s_ct, parseInt(notification.params.ct), true);
         }
         if (notification.params.rgb) {
            setState(s_dataset + bulbID + s_rgb, '#' + parseInt(notification.params.rgb).toString(16), true);
         }
         if (notification.params.hue) {
            setState(s_dataset + bulbID + s_hue, parseInt(notification.params.hue), true);
         }
         if (notification.params.sat) {
            setState(s_dataset + bulbID + s_sat, parseInt(notification.params.sat), true);
         }
         if (notification.params.color_mode) {
            setState(s_dataset + bulbID + s_colorMode, parseInt(notification.params.color_mode), true);
         }
      
      }
      
      //Subscribe für Änderung der Datenpunkte
      subscribe({id: /^javascript\.0\.Yeelight.Bulb.*/, change: 'any', ack: false}, function (obj) {
         var bulbID = (new RegExp('^javascript\.0\.Yeelight.Bulb([0-9]?[0-9])\.')).exec(obj.id)[1];
         var changedValue = (new RegExp('^javascript\.0\.Yeelight.Bulb[0-9]?[0-9]\.(.*)')).exec(obj.id)[1];
         if (debug) console.log('Kommando für Lampe ' + bulbID + ' mit ' + changedValue);
         if (changedValue == 'Location') {
            killClient(bulbID);
            createClient(bulbID, obj.state.val);
         } else {
            sendBulbCommand(bulbID, changedValue, obj.state.val, switchEffect, switchEffectTime);
         }
      });
      

      Lampen sind an werden aber nicht gefunden. Muss im Discovery.0 Adapter noch etwas eingestellt werden.

      Laufen tut ioBroker auf einer Qnap mit Linux

      wenn ich nun die Scripte starte werden keine Lampen gefunden. Im Log steht nur

      javascript.0 2018-01-05 10:09:58.086 info script.js.common.Yeelight_add: registered 1 subscription and 0 schedules

      javascript.0 2018-01-05 10:09:58.079 info Start javascript script.js.common.Yeelight_add

      javascript.1 2018-01-05 10:09:58.037 info Stop script script.js.common.Yeelight_add

      javascript.0 2018-01-05 10:09:58.037 info Stop script script.js.common.Yeelight_add

      javascript.0 2018-01-05 10:09:45.404 info script.js.common.Yeelight_find: listening on all addresses

      javascript.0 2018-01-05 10:09:45.396 info script.js.common.Yeelight_find: registered 0 subscriptions and 0 schedules

      javascript.0 2018-01-05 10:09:45.374 info Start javascript script.js.common.Yeelight_find

      Habe ich noch etwas vergessen? habe leider keine Idee mehr.

      Vielen Dank für Eure Vorschläge
      4866_java.png
      4866_disc.png

      1 Reply Last reply Reply Quote 0
      • M
        MegaMatze last edited by

        Hmmm ich bin ja immer noch am hoffen, dass es bald einen Adapter geben wird. Das mit den Skripten ist mir doch etwas zu umständlich und kompliziert. Da kommen bei mir beim Discovery irgendwie nicht alle Lampen.

        1 Reply Last reply Reply Quote 0
        • S
          Spaceball last edited by

          Hallo MegaMatze,

          sobald Du die Drittanbietersteuerung in der Yeelight App aktivierst, ist ein Suchen per Discovery Adapter unnötig. Die IP taucht dann im Netzwerk auf.

          Ich denke der Adapter wird auf sich warten lassen, da die Steuerung an/aus, Dimmen und Farbwechsel mit drei recht einfachen Skripts umsetzbar ist (siehe meiner Anleitung). Das funktioniert sogar mit Alexa. Und wenn der Cloudadapter nicht immer abschmieren würde wenn ich versuche, eine dritte Komponente der Lampe zuzuordnen, dann würde neben Alexa…an/aus und Dimme... auch der Farbwechsel funktionieren. Das ist bisher das einzige, was ich per Xiaomi Magic Cube realisiere.... Alles andere (auch Gruppen von Yeelights) funzt bestens mit Alexa... and ALLE Funktionen per VIS sauber steuerbar.

          1 Reply Last reply Reply Quote 0
          • W
            wecker6789 last edited by

            Guten Tag,

            Meinen vollsten Respekt an euch alle.

            Bei mir hört es leider schon auf wie ich den Bash.script auf dem IOBroker installiere?

            Ich fühle mich da wirklich doof…..

            Hoffe es kann mir dort jemand helfen.

            Danke an euch.

            1 Reply Last reply Reply Quote 0
            • S
              Soulforged last edited by

              @wecker6789:

              Guten Tag,

              Meinen vollsten Respekt an euch alle.

              Bei mir hört es leider schon auf wie ich den Bash.script auf dem IOBroker installiere?

              Ich fühle mich da wirklich doof…..

              Hoffe es kann mir dort jemand helfen.

              Danke an euch. `

              Hallo Wecker6789,

              ein Script muss nicht installiert werden 😉 Es genügt völlig, wenn du es an der entsprechenden Ordner auf dem Raspberry (/opt/iobroker) legst. Dazu kannst du bspw. die ftp Verbindung nutzen.

              Wenn du Magdas Script verwendest, benötigst du aber das Bash-Script nicht, da die JavaScripts die komplette Steuerung übernehmen.

              –---------------------------------------------------------------------------------------------

              Ich habe bis eben mit meinen Yeelight Ceiling Lights gekämpft. Diese haben einen sogenannten "Moon-Mode" bzw. Nightmode, der bislang nicht ansteuerbar war. Nun habe ich herausgefunden, dass diese durch ein weiteres argument namens "mode" beim "set_power" gesetzt werden können, wenn mode auf 5 steht (0=default, 1-3 sind RGB, HUE+Sat und weiß).

              Nun habe ich die Scripts von Magda nach meinen Bedürfnissen etwas erweitert.

              Find:

              Es wird grundsätzlich ein stat "model" mit angelegt, welche die Art der Lampe enthält (zb. "color", "strip" und eben auch "ceiling" bzw "ceiling1" (letzte erst mit der neuesten Firmware). Wenn Model nun "Ceiling" oder "Ceiling1" ist wird ein weiterer stat namens "nightmode" angelet.

              Add:

              Ich fange die Änderungen von Nightmode mit ab und führe bei true den Befehl set_power mit dem modus 5 aus. Zurücksetzen geht indem man die colortemperature ändert --> die eingestellte wird nochmals geschickt.

              Hier die beiden angepassten Scripte, falls sie jemand bei sich auch ausporbieren möchte:

              yeelight add:

              ! var net = require('net');
              ! var clients = [];
              ! var debug = true;
              ! const switchEffect = 'smooth'; //smooth or sudden
              ! const switchEffectTime = 1000; // min value 30
              ! const s_dataset = 'javascript.0.Yeelight.Bulb';
              ! const s_bright = '.bright';
              ! const s_hue = '.hue';
              ! const s_colorMode = '.color_mode';
              ! const s_rgb = '.rgb';
              ! const s_sat = '.sat';
              ! const s_power = '.power';
              ! const s_ct = '.ct';
              ! const s_name = '.name';
              ! const s_nightmode = '.nightmode';
              ! const s_model = '.model';
              ! function createClient(bulbID, location) {
              ! var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
              ! var ipAddress = (new RegExp('(?:[0-9]{1,3}.){3}[0-9]{1,3}')).exec(location)[0];
              ! clients[bulbID - 1] = net.createConnection(port, ipAddress);
              ! if (debug) console.log('Client erstellt für Lampe ' + bulbID);
              ! clients[bulbID - 1].on('data', function(data) {
              ! if (debug) console.log('Empfangen: ' + data);
              ! notificationReceived(bulbID, data)
              ! });
              ! clients[bulbID - 1].on('close', function() {
              ! if (debug) console.log('Verbindung geschlossen');
              ! });
              ! clients[bulbID - 1].on('error', function() {
              ! if (debug) console.log('Verbindung fehlerhaft');
              ! });
              ! }
              ! function killClient(bulbID) {
              ! if (clients[bulbID - 1]) {
              ! clients[bulbID - 1].destroy();
              ! if (debug) console.log('Client beendet für Lampe ' + bulbID);
              ! }
              ! }
              ! function sendBulbCommand(bulbID, changedValue, param1, effect, effectTime) {
              ! var command;
              ! var p_mode=0;
              ! switch (changedValue) {
              ! case 'ct':
              ! //wenn die Lampe eine Ceiling ist, geht der Nightmode mit aus. Da kein Status zurück kommt, muss er hier gesetzt werden. Wenn Nightmode aus gesetzt wird, wird ohnehin ct gesetzt, also nur nightmode ausschalten
              ! var bulbmodel = getState(s_dataset + bulbID + s_model).val;
              ! if( bulbmodel =="ceiling" || bulbmodel == "ceiling1") {
              ! setState(s_dataset + bulbID + s_nightmode, false, false);
              ! return;
              ! }else{
              ! command = '{"id":' + bulbID + ',"method":"set_ct_abx","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! }
              ! break;
              ! case 'rgb':
              ! command = '{"id":' + bulbID + ',"method":"set_rgb","params":[' + parseInt(param1.substring(1), 16) + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! break;
              ! case 'hue':
              ! var sat = getState(s_dataset+ bulbID + '.sat').val;
              ! command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + param1 + ', ' + sat + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! break;
              ! case 'sat':
              ! var hue = getState(s_dataset + bulbID + '.hue').val;
              ! command = '{"id":' + bulbID + ',"method":"set_hsv","params":[' + hue + ', ' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! break;
              ! case 'bright':
              ! command = '{"id":' + bulbID + ',"method":"set_bright","params":[' + param1 + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! break;
              ! case 'power':
              ! command = '{"id":' + bulbID + ',"method":"set_power","params":["' + param1 + '", "' + effect + '", ' + effectTime + ']}\r\n';
              ! break;
              ! case 'nightmode':
              ! if(param1===true) { //night mode can only be set through power command with mode = 5
              ! p_mode = 5;
              ! command = '{"id":' + bulbID + ',"method":"set_power","params":["on", "' + effect + '", ' + effectTime + ', ' + p_mode + ']}\r\n';
              ! }else{ //night mode is unset through change of color temp –> set color temperature to last known value
              ! var last_known_ct = getState(s_dataset + bulbID + s_ct).val;
              ! command = '{"id":' + bulbID + ',"method":"set_ct_abx","params":[' + last_known_ct + ', "' + effect + '", ' + effectTime + ']}\r\n';
              ! }
              ! break;
              ! case 'toggle':
              ! command = '{"id":' + bulbID + ',"method":"toggle","params":[]}\r\n';
              ! break;
              ! default:
              ! if (debug) console.log('Unbekanntes Kommando');
              ! return;
              ! }
              ! if (debug) console.log(command);
              ! var commandClient = new net.Socket();
              ! //if (debug) console.log(clients[bulbID - 1].remoteAddress);
              ! //if (debug) console.log(clients[bulbID - 1].remotePort);
              ! var location = getState('javascript.0.Yeelight.Bulb' + bulbID + '.Location').val;
              ! var port = (new RegExp(':([0-9]{1,5})')).exec(location)[1];
              ! var ipAddress = (new RegExp('(?:[0-9]{1,3}.){3}[0-9]{1,3}')).exec(location)[0];
              ! commandClient.connect(port, ipAddress, function() {
              ! commandClient.write(command);
              ! if (debug) console.log("CommandClient Command gesendet");
              ! });
              ! commandClient.on('data', function(data) {
              ! if (debug) console.log('CommandClient empfangen: ' + data);
              ! commandClient.destroy(); // kill client after server's response
              ! if (debug) console.log('CommandClient beendet');
              ! });
              ! }
              ! function notificationReceived(bulbID, data) {
              ! var notification = JSON.parse(data);
              ! if (notification.params.power) {
              ! setState(s_dataset + bulbID + s_power, notification.params.power, true);
              ! }
              ! if (notification.params.bright) {
              ! setState(s_dataset + bulbID + s_bright, parseInt(notification.params.bright), true);
              ! }
              ! if (notification.params.ct) {
              ! setState(s_dataset + bulbID + s_ct, parseInt(notification.params.ct), true);
              ! }
              ! if (notification.params.rgb) {
              ! setState(s_dataset + bulbID + s_rgb, '#' + parseInt(notification.params.rgb).toString(16), true);
              ! }
              ! if (notification.params.hue) {
              ! setState(s_dataset + bulbID + s_hue, parseInt(notification.params.hue), true);
              ! }
              ! if (notification.params.sat) {
              ! setState(s_dataset + bulbID + s_sat, parseInt(notification.params.sat), true);
              ! }
              ! if (notification.params.color_mode) {
              ! setState(s_dataset + bulbID + s_colorMode, parseInt(notification.params.color_mode), true);
              ! }
              ! }
              ! //Subscribe für Änderung der Datenpunkte
              ! subscribe({id: /^javascript.0.Yeelight.Bulb./, change: 'any', ack: false}, function (obj) {
              ! var bulbID = (new RegExp('^javascript.0.Yeelight.Bulb([0-9]?[0-9]).')).exec(obj.id)[1];
              ! var changedValue = (new RegExp('^javascript.0.Yeelight.Bulb[0-9]?[0-9].(.
              )')).exec(obj.id)[1];
              ! if (debug) console.log('Kommando für Lampe ' + bulbID + ' mit ' + changedValue);
              ! if (changedValue == 'Location') {
              ! killClient(bulbID);
              ! createClient(bulbID, obj.state.val);
              ! } else {
              ! sendBulbCommand(bulbID, changedValue, obj.state.val, switchEffect, switchEffectTime);
              ! }
              ! });

              yeelight_find

              ! var dgram = require('dgram');
              ! var s = dgram.createSocket('udp4');
              ! var debug = true;
              ! const MULTICAST_IP = '239.255.255.250';
              ! const s_dataset = 'javascript.0.Yeelight.Bulb';
              ! const s_id = '.id';
              ! const s_address = '.Location';
              ! const s_bright = '.bright';
              ! const s_hue = '.hue';
              ! const s_colorMode = '.color_mode';
              ! const s_rgb = '.rgb';
              ! const s_sat = '.sat';
              ! const s_power = '.power';
              ! const s_ct = '.ct';
              ! const s_name = '.name';
              ! const s_group = '.group';
              ! const s_model = '.model';
              ! const s_nightmode = '.nightmode';
              ! s.bind(1982, function() {
              ! s.addMembership(MULTICAST_IP);
              ! if (debug) console.log("listening on all addresses");
              ! });
              ! s.on("message", function (msg, rinfo) {
              ! if (debug) console.log('Broadcast empfangen: ' + msg);
              ! if (msg.indexOf('yeelight') < 0) {
              ! if (debug) console.log("Kein Yeelight Broadcast");
              ! return;
              ! }
              ! var bulbID = extractValue('id: ', msg);
              ! var i = 1;
              ! var unknownBulb = true;
              ! //wenn Lampe vorhanden, dann Werte aktualisieren
              ! while (getObject(s_dataset + i + s_id)) {
              ! if (getState(s_dataset + i + s_id).val == bulbID) {
              ! setState(s_dataset + i + s_address, extractValue('Location: ', msg), false);
              ! setState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), true);
              ! setState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), true);
              ! setState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), true);
              ! setState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), true); //Wert umgewandelt von Dec zu Hex damit Colorpicker Widget einfacher zu nutzen ist
              ! setState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), true);
              ! setState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), true);
              ! setState(s_dataset + i + s_power, extractValue('power: ', msg), true);
              ! setState(s_dataset + i + s_model, extractValue('model: ', msg), true);
              ! unknownBulb = false;
              ! if (debug) console.log('Werte für Lampe ' + i + ' aktualisiert');
              ! break;
              ! }
              ! i++;
              ! //Notaus
              ! if (i >= 100) {
              ! if (debug) console.log('zu viele Schleifendurchläufe');
              ! break;
              ! }
              ! }
              ! //wenn Lampe nicht gefunden, dann neue Lampe erstellen
              ! if (unknownBulb) {
              ! if (debug) console.log('neue Lampe wird erstellt');
              ! createNewBulb(i, msg);
              ! }
              ! });
              ! function createNewBulb(i, msg) {
              ! createState(s_dataset + i + s_id, extractValue('id: ', msg), {read: true, write: true, desc: "unique ID der Yeelight Lampe", type: "string", def: ""});
              ! createState(s_dataset + i + s_address, extractValue('Location: ', msg), {read: true, write: true, desc: "URL der Yeelight Lampe", type: "string", def: ""});
              ! createState(s_dataset + i + s_bright, parseInt(extractValue('bright: ', msg)), {read: true, write: true, desc: "Helligkeit", type: "number", min: 1, max: 100, def: 1, unit: "%"});
              ! createState(s_dataset + i + s_hue, parseInt(extractValue('hue: ', msg)), {read: true, write: true, desc: "HSV Farbwert", type: "number", min: 0, max: 359, def: 1, unit: ""});
              ! createState(s_dataset + i + s_colorMode, parseInt(extractValue('color_mode: ', msg)), {read: true, write: true, desc: "Farbwert", type: "number", min: 1, max: 3, def: 1, unit: ""});
              ! createState(s_dataset + i + s_rgb, '#' + parseInt(extractValue('rgb: ', msg)).toString(16), {read: true, write: true, desc: "RGB Farbwert in HEX", type: "string", def: ""});
              ! createState(s_dataset + i + s_sat, parseInt(extractValue('sat: ', msg)), {read: true, write: true, desc: "HSV Sättigung", type: "number", min: 1, max: 100, def: 1, unit: ""});
              ! createState(s_dataset + i + s_ct, parseInt(extractValue('ct: ', msg)), {read: true, write: true, desc: "Farbtemperatur weiß", type: "number", min: 1700, max: 6500, def: 5000, unit: ""});
              ! createState(s_dataset + i + s_power, extractValue('power: ', msg), {read: true, write: true, desc: "Zustand on/off", type: "string", def: ""});
              ! createState(s_dataset + i + s_name, '', {read: true, write: true, desc: "selbst vergebener Name", type: "string", def: "Yeelight"});
              ! createState(s_dataset + i + s_model, extractValue('model: ', msg), {read: true, write: false, desc: "Lampenmodel", type: "string", def: "Yeelight"});
              ! if((extractValue('model: ', msg)=="ceiling")||(extractValue('model: ', msg)=="ceiling1")) { //if it is a ceiling light, create state to activate nightligth mode
              ! createState(s_dataset + i + s_nightmode, 0, {read: false, write: true, desc: "Powermode nightlight", type: "boolean", def: true});
              ! }
              ! createState(s_dataset + i + s_group, i, {read: true, write: true, desc: "Gruppe", type: "number", min: 1, max: 100, def: 1, unit: ""});
              ! if (debug) console.log('neue Lampe erstellt mit ID: ' + i);
              ! }
              ! function extractValue(key, message) {
              ! var text = message.toString('utf-8');
              ! var startPos = (text.indexOf(key) + key.length);
              ! var endPos = text.substring(startPos).indexOf('\r\n');
              ! return text.substr(startPos, endPos);
              ! }
              ! // close connection if script stopped
              ! onStop(function (callback) {
              ! if (s) {
              ! // close connection
              ! s.close();
              ! if (debug) console.log('UDP Client gestoppt');
              ! }
              ! callback();
              ! }, 2000 /ms/);

              1 Reply Last reply Reply Quote 0
              • 4
                4-Real last edited by

                hallo Magda, ich komme gerade nicht weiter, wie ich z.B. nun in der Cloud mit deinem Script die Lampe Schalte..

                Meine Beiden Yeelights wurden mit allen Datenpunkten erkannt und auch in javascript.0 erstellt, nur wie füge ich bzw führe ich die Scripte aus bzw muss ich jetzt noch ein Blockly oder so erstellen oder ähnliches? Wollte nämlich die Yeelights noch der Cloud hinzufügen.

                Ich bin gerade verwirrt…ist wohl doch noch ein wenig tiefer in der Materie wie ich erst gedacht habe..

                1 Reply Last reply Reply Quote 0
                • E
                  e-p-s last edited by

                  Vielleicht Erbamt sich mal jemand und macht einen Nativ Adapter.

                  1 Reply Last reply Reply Quote 0
                  • S
                    Soulforged last edited by

                    @e-p-s:

                    Vielleicht Erbamt sich mal jemand und macht einen Nativ Adapter. `
                    Das dachte ich anfangs auch, bin mir aber aktuell gar nicht mehr so sicher wie sinnvoll das ist. Ein Adapter braucht fast immer an die 30MB Ram und der ist leider, zumindest auf meinem Raspi 3, relativ knapp. Wenn ich überlege, dass ich teilweise für nur 1 Gerät und davon 2 Kommandos einen ganzen Adapter installieren muss.

                    Da die Yeelights bei mir die Hälfte aller Geräte ausmachen muss ich dir aber schon recht geben. Ein Adapter wäre schön. Ich wollte mich ohnehin mal mit der Adapterentwicklung beschäftigen, wenn der Rest von meinem System komplett läuft. Vielleicht mache ich das mal auf Basis von Magdas Scripten (+meine eigenen Erweiterungen)

                    1 Reply Last reply Reply Quote 0
                    • S
                      seipekm last edited by

                      Ich hab ein bisschen Recherchet und hab diese Nodejs applikation gefunden

                      https://www.npmjs.com/package/miio

                      vielleicht hilft es einen für die Nativ Appllikation

                      würde mich mega freuen wenn einer die Adapter entwickelt

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

                        @Spaceball:

                        1. VIS

                        widget für an/aus:

                        [{"tpl":"tplMfdLightCtrl","data":{"oid":"javascript.1.yeelight.RGB_Lampe_1.on","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","asButton":"true","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"min":"0","max":"1","invert_icon":true},"style":{"left":"450px","top":"20px","z-index":"3"},"widgetSet":"jqui-mfd"}]
                        

                        widget für Dimmer:

                        [{"tpl":"tplMetroSlider","data":{"oid":"javascript.1.yeelight.RGB_Lampe_1.dim","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"sliderMarkerColor":"#ff0a0a","min":"10","max":"100"},"style":{"left":"120px","top":"70px","background":"linear-gradient(to left, #ffffff 0%, #444444 100%)","width":"316px","height":"42px","z-index":"4","position":""},"widgetSet":"metro"}]
                        

                        widget für den HSV-Farbraum:

                        [{"tpl":"tplMetroSlider","data":{"oid":"javascript.1.yeelight.RGB_Lampe_1.hsv","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"sliderMarkerColor":"#ffffff","min":"0","max":"350","step":"1"},"style":{"left":"120px","top":"20px","z-index":"4","width":"316px","height":"42px","background":"linear-gradient(to right, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%)"},"widgetSet":"metro"}]
                        ```` `  
                        

                        Blöde Frage, wie importiere ich diese Widgets?

                        thx

                        1 Reply Last reply Reply Quote 0
                        • S
                          Soulforged last edited by

                          @reini:

                          Blöde Frage, wie importiere ich diese Widgets?

                          thx `

                          Im Vis einfach oben auf Widget importieren und dann den Code (Text) reinkopieren.

                          1 Reply Last reply Reply Quote 0
                          • Alex1808
                            Alex1808 last edited by

                            Adapter Yeelight zum testen

                            https://github.com/cahek2202/ioBroker.yeelight

                            1 Reply Last reply Reply Quote 0
                            • 4
                              4-Real last edited by

                              Yeah top! danke für den Adapter!

                              Auf den ersten Blick sieht er gut aus und sind echt viele möglichkeiten!

                              1 Reply Last reply Reply Quote 0
                              • 4
                                4-Real last edited by

                                Habe mal eine Frage zu dem Adapter. Ist es möglich die Lampe Lokal mit allen Farben zu steuern ohne das ich hunderte von verschiedenen Datenpunkte mit den verschiedenen Farben machen muss?

                                Ich bin leider nicht fit in IoBroker bzw java, das ich mir selber ein unabhängiges Script schreiben könnte.

                                1 Reply Last reply Reply Quote 0
                                • Meistertr
                                  Meistertr Developer last edited by

                                  @4-Real:

                                  Habe mal eine Frage zu dem Adapter. Ist es möglich die Lampe Lokal mit allen Farben zu steuern ohne das ich hunderte von verschiedenen Datenpunkte mit den verschiedenen Farben machen muss?

                                  Ich bin leider nicht fit in IoBroker bzw java, das ich mir selber ein unabhängiges Script schreiben könnte. ` Ich versteh die Frage nicht einmal..

                                  Gesendet von meinem Handy

                                  1 Reply Last reply Reply Quote 0
                                  • 4
                                    4-Real last edited by

                                    @Meistertr:

                                    @4-Real:

                                    Habe mal eine Frage zu dem Adapter. Ist es möglich die Lampe Lokal mit allen Farben zu steuern ohne das ich hunderte von verschiedenen Datenpunkte mit den verschiedenen Farben machen muss?

                                    Ich bin leider nicht fit in IoBroker bzw java, das ich mir selber ein unabhängiges Script schreiben könnte. ` Ich versteh die Frage nicht einmal..

                                    Gesendet von meinem Handy `

                                    War das wirklich so undeutlich? ;-( Sorry wenn es so falsch rüberkommt.

                                    Es gibt ja die Yeelights RGB. Ich wollte wissen, ob ich ohne den Skill von Yeelight über IoBroker alle Farben ansteuern kann Ohne mehrere Datenpunkte zu erstellen bzw Scripte mit bestimmten Farbcodes erstellen muss.

                                    Soweit ich das verstanden habe müsste ich ja so nun in der IoBroker Cloud jetzt immer in den Yeelight Adapter den RGB Datenpunkt auswählen und z.B. Rot einstellen und dann das Smart-Gerät z.B. "Sofalampe Rot" nennen, oder?

                                    Gibt es nicht eine Möglichkeit das Smart-Gerät nur Sofalampe zu nennen und dann zu sagen "Alexa, schalte Sofalampe auf Rot" ohne das ich für jede Farbe einen eigenen Smart-Geräte Eintrag machen muss?

                                    Ich glaube das bleibt nicht aus oder?

                                    Verständlicher geworden?

                                    Mir geht es eigentlich nur darum das ich nicht in Iobroker so viele Datenpunkte hinterlegen möchte auch wegen Übersichtlichen Gründen.

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

                                      @Alex1808:

                                      Adapter Yeelight zum testen

                                      https://github.com/cahek2202/ioBroker.yeelight `

                                      Die ReadMe ist ja recht spärlich, werd auch mal testen

                                      1 Reply Last reply Reply Quote 0
                                      • Meistertr
                                        Meistertr Developer last edited by

                                        Der Adapter ist ja erst ein paar Tage alt.

                                        Gesendet von meinem Handy

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          seipekm last edited by

                                          ich teste es auch mit LED und BLUB. Aber sieht gut aus

                                          1 Reply Last reply Reply Quote 0
                                          • E
                                            el-lutschi last edited by

                                            Hallo,

                                            ich nutze das Script zur Steuerung.

                                            Kann mir jemand sagen wie ich die Gruppensteuerung deaktiviere?

                                            Diese füllt mir den Log dauernd mit einträgen, da ich keine Gruppen definiert habe.

                                            javascript.0	2018-02-27 17:47:40.144	warn	Object "javascript.0.Yeelight.Bulb4.group" does not exist
                                            javascript.0	2018-02-27 17:47:40.143	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Lampe 3 nicht Mitglied in Gruppe 1
                                            javascript.0	2018-02-27 17:47:40.143	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Schleifendurchlauf 3
                                            javascript.0	2018-02-27 17:47:40.142	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Lampe 2 nicht Mitglied in Gruppe 1
                                            javascript.0	2018-02-27 17:47:40.141	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Schleifendurchlauf 2
                                            javascript.0	2018-02-27 17:47:40.131	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Gruppenmitglied bin ich selbst
                                            javascript.0	2018-02-27 17:47:40.131	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Schleifendurchlauf 1
                                            javascript.0	2018-02-27 17:47:40.130	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Kommando wird an Gruppe weitergegeben
                                            javascript.0	2018-02-27 17:47:40.129	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: {"id":1,"method":"set_power","params":["on", "smooth", 1000]}
                                            javascript.0	2018-02-27 17:47:40.128	info	script.js.Custom_Scripts.Yeelight_Steuerung.Yeelight_Steuern: Kommando für Lampe 1 mit power
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            571
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            61
                                            277
                                            76354
                                            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