Eltako FAH60: Softwarefehler Auslesen der Helligkeit zwischen 0 bis 100 lx

Begonnen von anvoes, 05 November 2019, 23:49:17

Vorheriges Thema - Nächstes Thema

anvoes

Die Software im Module 10_EnOcean behandelt das Auslesen des Eltako FAH60 Helligkeitsensors nicht korrekt.

Der Kommentar im Code für die betreffende Stelle lautet:

      # Light Sensor (EEP A5-06-01)
      # [Eltako FAH60, FAH63, FIH63, Thermokon SR65 LI, untested]
      # $db[3] is the voltage where 0x00 = 0 V ... 0xFF = 5.1 V
      # $db[3] is the low illuminance for Eltako devices where
      # min 0x00 = 0 lx, max 0xFF = 100 lx, if $db[2] = 0


Richtigerwese (laut Eltako Gesamtkatalog 2020, Abschnitt T) muss es heissen:

      # Light Sensor (EEP A5-06-01)
      # [Eltako FAH60, FAH63, FIH63, Thermokon SR65 LI, untested]
      # $db[3] is the voltage where 0x00 = 0 V ... 0xFF = 5.1 V
      # $db[3] is the low illuminance for Eltako devices where
      # min 0x00 = 0 lx, max 0x64 = 100 lx, if $db[2] = 0


Dementsprechend wäre der Code abzuändern von


      if ($manufID eq "00D") {
        if($db[2] == 0) {
          $lux = sprintf "%d", $db[3] * 100 / 255;
        } else {
          $lux = sprintf "%d", $db[2] * 116.48 + 300;
        }
      } else {


in


      if ($manufID eq "00D") {
        if($db[2] == 0) {
          $lux = sprintf "%d", $db[3];
        } else {
          $lux = sprintf "%d", $db[2] * 116.48 + 300;
        }
      } else {


Danke und Grüße,

Andreas

klaus.schauer

Danke für den Hinweis. Die Skalierung basiert auf den Eltako-Protokollbeschreibungen bis 2014. Ab 2015 wurde dies wohl geändert. Ich werde eine Unterscheidung mit Hilfe des Attributs "model" einarbeiten. Für die neueren Sensoren muss dann das Attribut "model" manuell auf "Eltako_FAH60" gesetzt werden.

anvoes

Während meiner Versuche mit dem FAH60 ist mir aufgefallen, dass im Fall, dass die Helligkeit zwischen 300 lx und 30.000 lx liegt, das Datenbyte 4 dennoch Werte enthält, obwohl laut Eltako Handbuch in diesem Fall dieses Byte ungültig ist.

Da ich aber beim ersten Hinsehen den Eindruck hatte, dass die Daten im Byte 4 dennoch sinnvolle Werte enthält und möglicherweise undokumentierter Weise die Spannung des Solarmoduls bzw. des Kondensators darstellen könnte, habe ich dies einfach mal ausprobiert und den Code in 10_EnOcean.pm dahingehend geändert. Und tatsächlich, es kommt eine scheinbar sinnvolle Kurve heraus. Dabei habe ich angenommen, dass der Messbereich zwischen 0V und 5V liegt. Aufgrund der fehlenden Spezifikation weiß ich natürlich nicht, ob dem auch wirklich so ist.

Da ich weiterhin ausschließen wollte, dass der gemessene Wert eine zur Helligkeit korrelierter Scheinwert ist, habe ich einen Test gemacht und das Solarpanel für einige Stunden abgeklebt. Tatsächlich ging nach einiger Zeit der gemessene Spannungswert nach unten. Schlussendlich kam ich aber zu der Überzeugung, dass es sich tatsächlich um den Spannungswert handelt, als ich nach ein paar Stunden die Abdeckung vor dem Solarpanel wieder entfernt habe und der Spannungswert schlagartig nach oben ging, obwohl es bereits Abenddämmerung war und es an der Helligkeit nicht liegen konnte.

Ich habe diesem Post einen Screenshot mit den Kurven angehängt und den Zeitpunkt der Abdeckung des Solarpanels mit (1) und den Zeitpunkt der Freigabe des Solarpanels mit (2) markiert.

Falls jemand dies selbst ausprobieren möchte kommt hier der Auszug aus 10_EnOcean.pm mit meiner kleinen Änderung. (@Klaus: was hältst Du davon die Änderungen im Code aufzunehmen? Ich weiß, es wäre die Verwendung eines undokumentierten Feature, aber aufgrund meiner Tests bin ich überzeugt, dass es keine Scheinmessung ist.)

      # Light Sensor (EEP A5-06-01)
      # [Eltako FAH60, FAH63, FIH63, Thermokon SR65 LI, untested]
      # $db[3] is the voltage where 0x00 = 0 V ... 0xFF = 5.1 V
      # $db[3] is the low illuminance for Eltako devices where
      # min 0x00 = 0 lx, max 0xFF = 100 lx, if $db[2] = 0
      # $db[2] is the illuminance (ILL2) where min 0x00 = 300 lx, max 0xFF = 30000 lx
      # $db[1] is the illuminance (ILL1) where min 0x00 = 600 lx, max 0xFF = 60000 lx
      # $db[0]_bit_0 is Range select where 0 = ILL1, 1 = ILL2
      my $lux;
      my $voltage = "unknown";
      if ($manufID eq "00D") {
        if($db[2] == 0) {
          $lux = sprintf "%d", $db[3];
          $voltage = sprintf "%0.1f", 0;
        } else {
          $lux = sprintf "%d", $db[2] * 116.48 + 300;
          $voltage = sprintf "%0.1f", $db[3] * 0.02;
        }
      } else {
        $voltage = sprintf "%0.1f", $db[3] * 0.02;
        if($db[0] & 1) {
          $lux = sprintf "%d", $db[2] * 116.48 + 300;
        } else {
          $lux = sprintf "%d", $db[1] * 232.94 + 600;
        }
      }
      push @event, "3:voltage:$voltage";
      push @event, "3:brightness:$lux";
      push @event, "3:state:$lux";

klaus.schauer

Undokumentierte Funktionen oder Datenfelder wurden bisher grundsätzlich nicht in Fhem übernommen. Im Zweifelsfall hilft im konkreten Fall eine Anfrage beim Eltako-Support, um die beabsichtigte Nutzung des Datenfelder durch den Hersteller zu klären.

anvoes

Ok, verstehe ich.

Zu diesem Thema ist mir gerade eben noch ein weiterer Fehler aufgefallen. Laut Eltako ist kodiert das Byte2 mit 0x00-0xFF den Wertebereich 300-30.000 lux. Das kann aber nicht sein, da falls das Byte2 == 0 ist, dies ja der Marker ist, dass das Byte3 auszuwerten ist welches den Bereich 0-100 lux kodiert. Also fällt der Wert 0 für das Byte2 weg und es müsste dementsprechend richtigerweise heißen, dass das Byte2 mit 0x01-0xFF den Bereich 300-30.00 lux kodiert. Ich hatte mich schon seit langem gewundert, weshalb ich nie Werte zwischen 300-415 lux bekomme (416 lux ist immer der erste Wert - und der ist wohl tatsächlich 300 lux). Zumindest ist mir nun klar woran das liegt.

Ich habe zu beiden Themen den Hersteller angeschrieben und um Klärung gebeten.

anvoes

Ich habe mittlerweile Informationen von der Entwicklungsabteilung bei Eltako bekommen und fasse wie folgt zusammen:

  • Der Helligkeitswert von 416 lux falls das Byte 2 == 0x01 ist geht in Ordnung, da ist die Dokumentation in der technischen Beschreibung missverständlich. Der Code in FHEM kann also so bleiben. Das bedeutet, dass damit der FAH60 nie Werte zwischen 101-415 lux liefert.
  • Das Byte 3 enthält immer einen Spannungswert des Solarpanels, der intern im FAH60 verwendet wird, um den Helligkeitsbereich zwischen 0-100 lux zu ermitteln, da der Hauptsensor nicht weniger als 300 lux detektieren kann. Da der Spannungswert des Solarpanels im Bereich 0-100 lux halbwegs linear ist und geeignet mit einem Faktor versehen wurde, kann damit das FAH60 0-100 lux als Wert im Byte 3 liefern. Für den Fall, dass Byte 2 != 0 ist, enthält das Byte 3 nach wie vor einen Spannungswert, dieser ist aber zu einen nicht linear mit der Helligkeit und zum anderen durch den Ladungszustands des GoldCaps beeinflusst.

    Da von der Entwicklung bestätigt wurde, dass das Byte 3 tatsächlich immer einen Spannungswert darstellt, möchte ich vorschlagen, dass dieser Wert auch als Spannungswert in FHEM verfügbar gemacht wird. Zum einen könnte man Fehler am Solarmodul erkennen und zum anderen könnte man selbst Aktionen abhängig von diesem Wert durchführen.

Falls notwendig kann ich aus den E-Mails mit der Entwicklung zitieren.

klaus.schauer

Na dann brauchen wir nur noch einen halbwegs passenden Wertebereich und die Skalierung des Spannungswertes sowie idealerweise auch Schwellwerte für den Batteriestatus wie ok, low, empty.