Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Zigbee - Licht und Lichtwecker...

    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

    Zigbee - Licht und Lichtwecker...

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

      Hallo zusammen,

      ich versuche seit einiger Zeit verzweifelt meine Lichtsteuerung in den Griff zu bekommen. Irgendwie scheine ich etwas grundlegendes falsch zu machen. Daher hier meine Probleme und Fragen. Ich nutze den Sonoff Stick mit dem Zigbee Adapter.

      Aktuelle Situation

      Ich habe einige Zigbee FoH Schalter mit denen ich weiße und farbige Zigbee Birnen von Philips und Tint mit Javascript schalte. D.h. wenn Schalter gedrückt wird, dann schalte das Licht an oder setze eine andere Lichtfarbe. Zusätzlich habe ich einen Lichtwecker, der über 10 Minuten die Zigbee Birnen langsam heller werden lassen. Schön wäre es, wenn der Übergang für das An- bzw. Ausschalten, dem Farbwechsel oder dem Wechsel von Farbe zu Weiß etwa 1 Sekunde braucht.

      Technische Umsetzung

      Beim Ein- bzw. Ausschalten prüfe ich am Anfang transition_time und setze es auf 1 falls notwendig.

      Einschalten
      Falls es sich um eine farbige Birne handelt, setze ich bei weißem Licht als erstes colortemp sonst color mit der übergebenen Lichttemperatur bzw. -farbe. Mit dem Setzen von brightness auf 100, schalte ich die Birne an.

      Ausschalten
      Um die Birne auszuschalten, setze ich brightness einfach auf 0.

      Lichtwecker
      Für den Lichtwecker setze ich zuerst transition_time, dann colortemp und zuletzt brightness.

      Probleme

      Beim Einschalten kommt es ab und zu vor, dass das Licht nicht von farbig zu weiß bzw. umgekehrt wechselt. Auch wird beim Einschalten die transition_time nicht berücksichtigt, d.h. es springt an.
      Da ich die Vermutung hatte, bei den zwei oder drei "Aktionen" per setState eins verschluckt wird, habe ich versucht mit payload die Werte zu setzen. Bei brightness handelt es sich auf einmal um einen absoluten Wert und die Werte im Objektbaum werden nicht aktualisiert. Dies ist gerade beim Lichtwecker unschön, da ich in Abhängigkeit vom Licht andere Aktionen durchführen möchte, hier diese nicht aktualisiert wurden.

      Hat jemand die ähnliche Erfahrungen? Wie habt ihr sie gelöst? Wie schaltet Ihr Euer Licht?

      DJMarc75 1 Reply Last reply Reply Quote 0
      • DJMarc75
        DJMarc75 @MacPo last edited by

        @macpo sagte in Zigbee - Licht und Lichtwecker...:

        mit Javascript schalte

        ohne dieses unbekannte Skript kann man leider nur schlecht helfen 😉

        M 1 Reply Last reply Reply Quote 0
        • M
          MacPo @DJMarc75 last edited by

          @djmarc75 Ich hatte mir es noch überlegt...

          const transitionLicht = 1;
          
          on({id: "javascript.0.loxone.lichtSchreibtisch", change: "ne", ack: false}, function (obj){ licht(String(obj.id), 'zigbee.0.00158d0001234567', obj.state.val); });
          
          /**
          * Setzt das Licht und setze AKN für das 
          * @param {string} javascriptObjekt  Objekt Id in ioBroker für das Aknowledge
          * @param {string} zigbeeObjekt      Zigbee-Objekt mit dem Licht
          * @param {object} lichtWert         Lichtwert
          */
          function licht(javascriptObjekt, zigbeeObjekt, lichtWert) {
              //Setze die allgemeine Transitionszeit für Licht.
              var aktuelleTransitionszeit = getState(zigbeeObjekt + '.transition_time').val;
              if (aktuelleTransitionszeit != transitionLicht) {
                  setState(zigbeeObjekt + '.transition_time', transitionLicht);
              }
          
              var istFarbe = String(Array.prototype.slice.apply($(zigbeeObjekt + ".color"))).length != 0;
          
              if (istFarbe) {
                  lichtRgb(zigbeeObjekt, String(lichtWert));
              } else {
                  lichtSw(zigbeeObjekt, String(lichtWert));
              }
              setState(javascriptObjekt, lichtWert, true);
          }
          
          /**
          * Setzt das Licht für eine weiße Birne
          * @param {string} zigbeeObjekt    ZigbeeObjektId
          * @param {string} wert            Lichtwert
          */
          function lichtSw(zigbeeObjekt, wert) {
              var loxStr = String(wert);
          
              if (loxStr.length == 0) {
                  logs('debug', 'Übergebender Wert leer - Abbruch');
                  return;
              }
          
              //Loxone Lichtlevel 0% bis 100%
              var lichtLevel = parseInt(loxStr) || 0;
              setState(zigbeeObjekt + '.brightness', lichtLevel);
          }
          
          /**
          * Setzt das Licht für eine farbige Birne
          * @param {string} zigbeeObjekt    ZigbeeObjektId
          * @param {string} wert            Lichtwert (bei 2xxxxxxxx weiß, sonst RGB)
          */
          function lichtRgb(zigbeeObjekt, wert) {
              logs('trace', 'Start');
          
              var loxStr = String(wert);
              var loxStrLen = loxStr.length;
              if (loxStrLen == 0) {
                  logs('debug', 'Übergebender Wert leer - Abbruch');
                  return;
              } else {
                  logs('debug', 'Übergebender Wert: ' + loxStr);
              }
          
              if (loxStr.substring(0, 1) == '2' && loxStrLen == 9) {  
                  //Weiss
                  var lichtLevel = parseInt(loxStr.substring(2, 5)) || 0;
                  var lichtTemp = parseInt(loxStr.substring(5, 9)) || 0;
          
                  if (lichtLevel == 0) {
                      logs('debug', 'LichtRgb - Weiss: ' + zigbeeObjekt + ' ausschalten');
                      setState(zigbeeObjekt + '.brightness', lichtLevel);
                  } else {
                      //Loxone Lichttemperatur: 6500 Kelvin kalt bis 2700 Kelvin warm
                      //Zigbee Lichttemperatur:  150             bis  500
                      //Umrechnung: 665 - ((Kelvin / 10) - 120) -> 785 - (Kelvin / 10)
                      lichtTemp = Math.round(785 - (lichtTemp / 10));
                      setState(zigbeeObjekt + '.colortemp', lichtTemp);
                      setState(zigbeeObjekt + '.brightness', lichtLevel);
                  }
              } else {  
                  //RGB
                  var colorRedParse = 0;
                  var colorGreenParse = 0;
                  var colorBlueParse = 0;
          
                  if (loxStrLen <= 3) {
                      colorRedParse = parseInt(loxStr.substring(0, 3)) || 0;
                  } else if (loxStrLen <= 6) {
                      colorRedParse = parseInt(loxStr.substring(loxStrLen - 3, loxStrLen)) || 0;
                      colorGreenParse = parseInt(loxStr.substring(0, loxStrLen - 3)) || 0;
                  } else if (loxStrLen <= 9) {
                      colorRedParse = parseInt(loxStr.substring(loxStrLen - 3, loxStrLen)) || 0;
                      colorGreenParse = parseInt(loxStr.substring(loxStrLen - 6, loxStrLen - 3)) || 0;
                      colorBlueParse = parseInt(loxStr.substring(0, loxStrLen - 6)) || 0;
                  } else {
                      logs('error', 'LichtRgb - Rgb: ' + zigbeeObjekt + ': Unerwartet Länge übergebender Wert - Abbruch');
                      return;
                  }
                  // Loxone liefert Rot, Grün und Blau als 0 bis 100%
                  var colorRed = Math.round(255 / 100 * colorRedParse);
                  var colorGreen = Math.round(255 / 100 * colorGreenParse);
                  var colorBlue = Math.round(255 / 100 * colorBlueParse);
          
                  var level = Math.round(Math.max(colorRed, colorGreen, colorBlue)) / 2.55;
          
                  var red = colorRed / 255;
                  var green = colorGreen / 255;
                  var blue = colorBlue / 255;
                  red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
                  green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
                  blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
                  logs('debug', 'red: ' + red + ' / green: ' + green + ' / blue: ' + blue + ' / level: ' + level);
          
                  var X = red * 0.664511 + green * 0.154324 + blue * 0.162028;
                  var Y = red * 0.283881 + green * 0.668433 + blue * 0.047685;
                  var Z = red * 0.000088 + green * 0.072310 + blue * 0.986039;
          
                  var divisor = colorRed + colorGreen + colorBlue;
                  if (divisor == 0) {
                      logs('debug', 'LichtRgb - Rgb: ' + zigbeeObjekt + ' ausschalten');
                      setState(zigbeeObjekt + '.brightness', 0);
                  } else {
                      var x = X / divisor;
                      var y = Y / divisor;
                      
                      var zigbeeColor = '#' + ('0' + colorRed.toString(16)).slice(-2) + ('0' + colorGreen.toString(16)).slice(-2) + ('0' + colorBlue.toString(16)).slice(-2);
                      setState(zigbeeObjekt + '.color', zigbeeColor);
                      setState(zigbeeObjekt + '.brightness', level);
                  }
              }
          }
          
          M 1 Reply Last reply Reply Quote 0
          • M
            MacPo @MacPo last edited by MacPo

            Nun komme ich endlich dazu, ein paar Infos von meinem aktuellen Zwischenstand zu schreiben:
            Wenn man die Eigenschaft send_payload nutzen möchte, muss man die speziellen Wertebereiche von den Zigbee-Objekte berücksichtigen. Die anderen Eigenschaften wie brightness haben neutrale Werte wie hier zum Beispiel in Prozent.
            Es sollte nicht gleichzeitig brightness und state gesetzt werden, dass hat bei mir zu unerwarteten Verhalten geführt. Für das Ausschalten reicht es aus, wenn man die Helligkeit auf 0 setzt. Beim Einschalten oder ändern des Lichts kann man die Eigenschaften color, colortemp und brightness direkt nacheinander setzen, ohne dass es zu Problemen kommt.
            Dennoch wird beim Ein-/Ausschalten die Schaltzeit nur je nach Model (auch vom gleichen Hersteller) berücksichtigt. Bei Änderungen des Lichts hingegen immer.
            Allgemein werden andere Eigenschaften nicht implizit aktualisiert, so dass zum Beispiel brightness_move mit -10 am Ende zu einem sehr schwachen Licht führt, aber die Eigenschaft brightness immer noch bei 100 steht. device_query habe ich aktiviert.

            M 1 Reply Last reply Reply Quote 0
            • M
              MacPo @MacPo last edited by

              Hat jemand ähnliche Erfahrungen? Ich bin über jeden Tipp dankbar, wie z.B. beim Ein-/Ausschalten immer die transition_time berücksichtigt wird...

              arteck 1 Reply Last reply Reply Quote 0
              • arteck
                arteck Developer Most Active @MacPo last edited by

                @macpo die eigenschaften werden dirke von dem Gerät gepflegt.. und da verhalten sich die unterschieldichen Hersteller demäntsprechend..

                aber die transition_time sollte immer mit brightess zusammen hängen.. ich nutze es nicht so wie du aber meine Bürolampe (ist eine HUE) macht immer was die soll..
                ausser wenn du transition_time auf unplausble werte setzt >10

                M 1 Reply Last reply Reply Quote 0
                • M
                  MacPo @arteck last edited by

                  @arteck Aktuell verwende ich transition_time mit 3.600 (10min) für meinen Lichtwecker...

                  Ich werde nochmal andere Birnen testen.

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate
                  FAQ Cloud / IOT
                  HowTo: Node.js-Update
                  HowTo: Backup/Restore
                  Downloads
                  BLOG

                  447
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  411
                  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