Firmata mit TSL2561

Begonnen von eitschdie, 09 September 2015, 15:54:56

Vorheriges Thema - Nächstes Thema

klausw

Zitat von: thymjan am 15 November 2015, 13:06:20
Versuche seit 2 Tagen die knapp 1500 Zeilen Code zu verstehen...  :o

Mit der FRM als I/O-Device funktioniert die ganze Initialisierung nicht. Das Modul I2C_TSL2561 wird aufgerufen, bevor die Kommunikation mit dem Arduino richtig steht. Trotz Scheitern wird die Initialisierung aber nicht wiederholt ...
Hmm, kann man da ne Pause einfügen?
Scheitern bedeutet Timeout beim I2C_TSL2561 Modul?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

thymjan

Hab schon testweise ein usleep eingebaut. Aber dann wartet das ganze fhem und die Firmata-Initialisierung ist trotzdem erst hinterher.

Was ich auch noch nicht verstanden habe: welche sub's werden denn von der main loop / von Fhem aufgerufen, also welches ist das start-sub? Und wo steht das?

thymjan

#17
So langsam komme ich der Sache näher. In den Funktionen I2C_TSL2561_i2cread und I2C_TSL2561_i2cwrite wird sofort nach der Lese- bzw. Schreibfunktion _SENDSTAT abgefragt. So schnell ist die Firmata nicht. Daher brechen die beiden nicht unwesentlichen Funktionen immer mit Fehlermeldung ab. Ich denke hier muss etwas gewartet werden.
Vielleicht ist es auch cleverer, _SENDSTAT hier gar nicht abzufragen?

^^^
ich glaube die Annahme ist Käse....  :-\

Die Funktion schreibt an FRM und FRM schreibt an den Arduino.
Aber irgendwie kommt nix zurück, da ist noch ein Zeiger verbogen.

Der parallel laufende BMP180 läuft 1A.

Wie bekomme ich das hin, das I2C_TSL2561 erst definiert wird, wenn sich die Firmata angemeldet hat, bzw. wie kann ich I2C_TSL2561_Define erneut aufrufen?

thymjan

#18
I2C_BMP180 wird auch weit bevor die Firmata bereit ist definiert, aber dieses Modul wartet höflich bis die Firmata bereit ist.
I2C_TSL2561 schreibt sofort drauf los, bevor die Firmata bereit ist. Ist das Zufall?

2015.11.16 22:28:29 1: Including fhem.cfg
2015.11.16 22:28:29 3: telnetPort: port 7072 opened
2015.11.16 22:28:30 3: WEB: port 8083 opened
2015.11.16 22:28:30 3: WEBphone: port 8084 opened
2015.11.16 22:28:30 3: WEBtablet: port 8085 opened
2015.11.16 22:28:31 2: eventTypes: loaded 633 events from ./log/eventTypes.txt
2015.11.16 22:28:34 1: BMP180_Define start: 2/BMP180 I2C_BMP180
2015.11.16 22:28:41 1: I2C_TSL2561_Define start: 3/TSL2561.firmata I2C_TSL2561 0x39
2015.11.16 22:28:41 1: Including ./log/fhem.save
2015.11.16 22:28:42 3: FRM_1: port 3031 opened
2015.11.16 22:28:42 0: Featurelevel: 5.6
2015.11.16 22:28:42 0: Server started with 65 defined entities (version $Id: fhem.pl 9868 2015-11-12 18:04:37Z rudolfkoenig $, os linux, user fhem, pid 14134)
2015.11.16 22:28:42 5: I2C_BMP180_Poll: start
2015.11.16 22:28:42 5: I2C_BMP180_Poll: 5 min

2015.11.16 22:28:44 5: I2C_TSL2561_Poll: start
2015.11.16 22:28:44 5: I2C_TSL2561_GetLuminosity: calc state 0 acqui state 0
2015.11.16 22:28:44 5: I2C_TSL2561_GetLuminosity: starting new measurement
2015.11.16 22:28:44 5: I2C_TSL2561_Enable: start
2015.11.16 22:28:44 1: TSL2561.firmata: IODev is assigned to 'TSL2561.firmata' but not yet here
2015.11.16 22:28:44 1: TSL2561.firmata: IODev: HASH(0x1f786e8)
2015.11.16 22:28:44 5: I2C_TSL2561_Enable: end
2015.11.16 22:28:44 5: I2C_TSL2561_Disable: start
2015.11.16 22:28:44 1: TSL2561.firmata: IODev is assigned to 'TSL2561.firmata' but not yet here
2015.11.16 22:28:44 1: TSL2561.firmata: IODev: HASH(0x1f786e8)
2015.11.16 22:28:44 5: I2C_TSL2561_Disable: end
2015.11.16 22:28:44 5: I2C_TSL2561_GetLuminosity: calc state 3 acqui state 0
2015.11.16 22:28:44 5: I2C_TSL2561_GetLuminosity: error, aborting
2015.11.16 22:28:44 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 575.
2015.11.16 22:28:44 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 576.
2015.11.16 22:28:44 5: I2C_TSL2561_Poll: 300 s

2015.11.16 22:28:46 4: Connection accepted from FRM:192.168.1.25:1513
2015.11.16 22:28:46 5: FRM:>ff
2015.11.16 22:28:49 3: querying Firmata Firmware Version
2015.11.16 22:28:49 5: FRM:>f079f7
2015.11.16 22:28:49 5: FRM:<f079020643006f006e0066006900670075007200610062006c0065004600690072006d00610074006100f7
2015.11.16 22:28:49 3: Firmata Firmware Version: ConfigurableFirmata V_2_06
2015.11.16 22:28:49 5: FRM:>f069f7
2015.11.16 22:28:49 5: FRM:>f06bf7
2015.11.16 22:28:49 5: FRM:<f06a7f7f7f7f7f7f7f7f7f7f7f7f7f7f0001020304050607f7
2015.11.16 22:28:49 5: FRM:<f06c7f7f0101091c7f01010308091c7f7f010103087f010103087f01017f01017f010103087f7f7f7f7f01017f01017f01017f01017f010106017f010106017f7f7ff7
2015.11.16 22:28:49 5: FRM:>f07a6807f7
2015.11.16 22:28:49 5: FRM:>f41206
2015.11.16 22:28:49 5: FRM:>f41306
2015.11.16 22:28:49 5: FRM:>f0780100f7
2015.11.16 22:28:49 5: FRM Kommunikation mit I2C ...
2015.11.16 22:28:49 5: FRM auf I2C lesen ...
2015.11.16 22:28:49 5: FRM:>f07677082a011600f7
2015.11.16 22:28:49 5: FRM Adresse: 119|Register: 170|22 byte(s)
2015.11.16 22:28:49 5: FRM:>f40201
2015.11.16 22:28:49 5: FRM:>900000
2015.11.16 22:28:49 5: FRM:>f40303
2015.11.16 22:28:49 5: FRM:<f07777002a01200035007b012d014501700105015d016200700136001800190073000000290000010000510176010a003c00f7
2015.11.16 22:28:49 5: onI2CMessage address: '119', register: '170' data: [32,53,251,173,197,240,133,221,98,240,54,24,25,115,0,41,128,0,209,246,10,60]
2015.11.16 22:28:49 5: BMP180 empfangen: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60
2015.11.16 22:28:49 5: in get cal: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60
2015.11.16 22:28:49 5: FRM UPDATE Adresse: 119|Register: 170|Daten: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60


jensb

Hallo thymjan,

um es vorweg zu nehmen, ich habe zwar einen Arduino irgendwo rumliegen, aber noch nie mit Frimata gearbeitet.

In deinem  letztes Logging sind ein paar interessante Stellen:

Zitat
2015.11.16 22:28:41 1: I2C_TSL2561_Define start: 3/TSL2561.firmata I2C_TSL2561 0x39
...
2015.11.16 22:28:44 1: TSL2561.firmata: IODev is assigned to 'TSL2561.firmata' but not yet here
Letztere kommt nicht direkt aus dem TLS2561-Modul und bestätigt die Vermutung, dass der I2C-Zugriff erfolgt, bevor Firmata alles vorbereitet hat, hier nach 3 Sekunden.

Zitat
2015.11.16 22:28:34 1: BMP180_Define start: 2/BMP180 I2C_BMP180
...
2015.11.16 22:28:42 5: I2C_BMP180_Poll: start
2015.11.16 22:28:42 5: I2C_BMP180_Poll: 5 min
...
2015.11.16 22:28:49 3: Firmata Firmware Version: ConfigurableFirmata V_2_06
....
2015.11.16 22:28:49 5: BMP180 empfangen: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60
Das BMP180-Modul wartet bis Firmata bereit ist, bevor es "richtig" loslegt, hier ca. 15 Sekunden.

Der Unterschied liegt u.U. daran, dass das BMP180-Modul im XXX_Initialize das IODevice nur initialisiert, wenn FHEM betriebsbereit ist und für die Nachtinitialisierung die InitFn bei FHEM registriert, während das TSL2561-Modul noch keine nachträgliche Initialisierung unterstützt.

Ich könnte fürs erste versuchen, einen Hack zum Testen zur Verfügung zu stellen, in dem der Initialisierungsablauf ähnlich wie im BMP180-Modul durchgeführt wird. Falls es klappt, muss aber kaihs entscheiden, ob das Modul angepasst wird.

LG, Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

jensb

Hallo thymjan,

hier eine inoffizielle Version zum Ausprobieren. Mehr ist heute nicht drin und ich werde wahrscheinlich auch bis Sa. nichts weiter machen können. Vielleicht hilft diese Version trotzdem ein Stück weiter.

LG, Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

thymjan

Hallo Jens,

die 'not yet here' Meldung kommt auch aus dem TSL2561-Modul, ich habe da schon rum gepfuscht:

sub I2C_TSL2561_i2cwrite($$$) {
  my ($hash, $reg, @data) = @_;
  my $success = 1;

  if ($hash->{HiPi_used}) {
    eval {
      $hash->{devTSL2561}->bus_write($reg, join (' ',@data));
      I2C_TSL2561_I2CRec($hash, {
        direction => "i2cwrite",
        i2caddress => $hash->{I2C_Address},
        reg => $reg,
        data => join (' ',@data),
      });
    };
    Log3 ($hash, 1, $hash->{NAME} . ': ' . I2C_TSL2561_Catch($@)) if $@;
  } elsif (defined (my $iodev = $hash->{IODev})) {
    eval {
      CallFn($iodev->{NAME}, "I2CWrtFn", $iodev, {
      direction => "i2cwrite",
      i2caddress => $hash->{I2C_Address},
      reg => $reg,
      data => join (' ',@data),
      });
    };
    if (defined $hash->{$iodev->{NAME}.'_SENDSTAT'}) {
      if ($hash->{$iodev->{NAME}.'_SENDSTAT'} eq 'error') {
        readingsSingleUpdate($hash, 'state', STATE_I2C_ERROR, 1);
        $success = 0;
      }
    } else {
      $success = 0;
      Log3 ($hash, 1, $hash->{NAME} . ': ' . "IODev is assigned to '$hash->{NAME}' but not yet here");
      Log3 ($hash, 1, $hash->{NAME} . ': ' . "IODev: $hash->{IODev}");
    }
  } else {
    Log3 ($hash, 1, $hash->{NAME} . ': ' . "no IODev assigned to '$hash->{NAME}'");
    $success = 0;
  }

  return $success;
}


Der rote Ausdruck ist durch die fehlende FRM-Firmata Kommunikation noch nicht definiert (siehe post http://forum.fhem.de/index.php/topic,40875.msg347669.html#msg347669)
2015.10.21 11:37:17 5: I2C_TSL2561_Poll: start
2015.10.21 11:37:17 5: I2C_TSL2561_GetLuminosity: calc state 0 acqui state 0
2015.10.21 11:37:17 5: I2C_TSL2561_GetLuminosity: starting new measurement
2015.10.21 11:37:17 5: I2C_TSL2561_Enable: start
2015.10.21 11:37:17 5: FRM:>f07639080a010100f7
2015.10.21 11:37:17 5: SW: f07639080a010100f7
Use of uninitialized value in string eq at ./FHEM/51_I2C_TSL2561.pm line 1360.
2015.10.21 11:37:17 5: I2C_TSL2561_Enable: end
2015.10.21 11:37:17 5: I2C_TSL2561_Disable: start
2015.10.21 11:37:17 5: FRM:>f076390000010000f7
2015.10.21 11:37:17 5: SW: f076390000010000f7
2015.10.21 11:37:17 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/51_I2C_TSL2561.pm line 1396.
2015.10.21 11:37:17 5: I2C_TSL2561_Disable: end
2015.10.21 11:37:17 5: I2C_TSL2561_GetLuminosity: calc state 3 acqui state 0
2015.10.21 11:37:17 5: I2C_TSL2561_GetLuminosity: error, aborting
2015.10.21 11:37:17 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 574.
2015.10.21 11:37:17 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 575.
2015.10.21 11:37:17 5: I2C_TSL2561_Poll: 300 s


Stefan

jensb

Hallo Stefan,

gut zu wissen, hatte aber vom Ablauf des Loggings bereits diese Ecke vermutet.

Bitte probier die Testversion aus. Es ist aber recht wahrscheinlich, dass sie u.a. an dieser Stelle noch etwas Feinschliff benötigt, um z.B. die Perl-Fehlermeldungen los zu werden.

LG, Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

thymjan

Hi Jens,

Danke für Deine Anpassung, hab dein Modul eingespielt. Im log sieht man keine große Veränderung:
2015.11.17 20:39:13 1: Including fhem.cfg
2015.11.17 20:39:14 3: telnetPort: port 7072 opened
2015.11.17 20:39:15 3: WEB: port 8083 opened
2015.11.17 20:39:15 3: WEBphone: port 8084 opened
2015.11.17 20:39:15 3: WEBtablet: port 8085 opened
2015.11.17 20:39:16 2: eventTypes: loaded 637 events from ./log/eventTypes.txt
2015.11.17 20:39:18 3: Connecting to database SQLite:dbname=/opt/fhem/fhem.db with user
2015.11.17 20:39:18 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established for pid 20593
2015.11.17 20:39:18 3: Connection to db SQLite:dbname=/opt/fhem/fhem.db established
2015.11.17 20:39:19 1: BMP180_Define start: 2/BMP180 I2C_BMP180
[...]
2015.11.17 20:39:25 1: I2C_TSL2561_Define start: 3/TSL2561.firmata I2C_TSL2561 0x39
2015.11.17 20:39:25 1: Including ./log/fhem.save
2015.11.17 20:39:26 3: FRM_1: port 3031 opened
2015.11.17 20:39:26 0: Featurelevel: 5.6
2015.11.17 20:39:26 0: Server started with 65 defined entities (version $Id: fhem.pl 9868 2015-11-12 18:04:37Z rudolfkoenig $, os linux, user fhem, pid 20593)
2015.11.17 20:39:26 5: I2C_BMP180_Poll: start
2015.11.17 20:39:26 5: I2C_BMP180_Poll: 5 min
2015.11.17 20:39:26 5: I2C_TSL2561_Poll: start
2015.11.17 20:39:26 5: I2C_TSL2561_GetLuminosity: calc state 0 acqui state 0
2015.11.17 20:39:26 5: I2C_TSL2561_GetLuminosity: starting new measurement
2015.11.17 20:39:26 5: I2C_TSL2561_Enable: start
Use of uninitialized value in string eq at ./FHEM/51_I2C_TSL2561.pm line 1366.
2015.11.17 20:39:26 5: I2C_TSL2561_Enable: end
2015.11.17 20:39:26 5: I2C_TSL2561_Disable: start
2015.11.17 20:39:26 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/51_I2C_TSL2561.pm line 1402.
2015.11.17 20:39:26 5: I2C_TSL2561_Disable: end
2015.11.17 20:39:26 5: I2C_TSL2561_GetLuminosity: calc state 3 acqui state 0
2015.11.17 20:39:26 5: I2C_TSL2561_GetLuminosity: error, aborting
2015.11.17 20:39:26 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 580.
2015.11.17 20:39:26 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/51_I2C_TSL2561.pm line 581.
2015.11.17 20:39:26 5: I2C_TSL2561_Poll: 300 s
2015.11.17 20:39:30 4: Connection accepted from FRM:192.168.1.25:1582
2015.11.17 20:39:30 5: FRM:>ff
2015.11.17 20:39:33 3: querying Firmata Firmware Version
2015.11.17 20:39:33 5: FRM:>f079f7
2015.11.17 20:39:33 5: FRM:<f079020643006f006e0066006900670075007200610062006c0065004600690072006d00610074006100f7
2015.11.17 20:39:33 3: Firmata Firmware Version: ConfigurableFirmata V_2_06
2015.11.17 20:39:33 5: FRM:>f069f7
2015.11.17 20:39:33 5: FRM:>f06bf7
2015.11.17 20:39:33 5: FRM:<f06a7f7f7f7f7f7f7f7f7f7f7f7f7f7f0001020304050607f7f06c7f7f0101091c7f01010308091c7f7f010103087f010103087f01017f01017f010103087f7f7f7f7f01017f01017f01017f01017f010106017f010106017f7f7ff7
2015.11.17 20:39:33 5: FRM:>f07a6807f7
2015.11.17 20:39:33 5: FRM:>f41206
2015.11.17 20:39:33 5: FRM:>f41306
2015.11.17 20:39:33 5: FRM:>f0780100f7
2015.11.17 20:39:33 5: FRM Kommunikation mit I2C ...
2015.11.17 20:39:33 5: FRM auf I2C lesen ...
2015.11.17 20:39:33 5: FRM:>f07677082a011600f7
2015.11.17 20:39:33 5: FRM Adresse: 119|Register: 170|22 byte(s)
2015.11.17 20:39:33 5: FRM:>f40201
2015.11.17 20:39:33 5: FRM:>900000
2015.11.17 20:39:33 5: FRM:>f40303
2015.11.17 20:39:33 5: FRM:<f07777002a01200035007b012d014501700105015d016200700136001800190073000000290000010000510176010a003c00f7
2015.11.17 20:39:33 5: onI2CMessage address: '119', register: '170' data: [32,53,251,173,197,240,133,221,98,240,54,24,25,115,0,41,128,0,209,246,10,60]
2015.11.17 20:39:33 5: BMP180 empfangen: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60
2015.11.17 20:39:33 5: in get cal: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60
2015.11.17 20:39:33 5: FRM UPDATE Adresse: 119|Register: 170|Daten: 32 53 251 173 197 240 133 221 98 240 54 24 25 115 0 41 128 0 209 246 10 60


Modul versucht immer noch Zugriff auf I2C-Bus zu bekommen bevor FRM bereit ist. Bereits in XXXpoll wird ja schon auf I2C geschrieben.

Gruß,
Stefan

jensb

Hallo Stefan,

hast du mal bis zum 2. Poll gewartet oder set update ausgelöst? In XXXX_Poll sind derzeit noch keine Verriegelungen, so dass es natürlich nach wie vor zu Fehlern kommt, bis Firmata da ist, falls mein Ansatz überhaupt greift.

LG, Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

klausw

Stimmt, im define die Kommunikation zu starten ist nicht optimal.
Das I2C_****_Init hat nicht nur die Aufgabe zu warten bis das Physikalische Modul (hier FRM) fertig initialisiert ist, es soll auch bei einer Verbindungsunterbrechung das Ganze wieder Initialisieren. Macht bei Anbindung über Netzwerk durchaus Sinn.

Was mich weiterhin irritiert ist die Verwendung der Funktion I2C_TSL2561_I2CRec

$hash->{I2CRecFn} wird vom IODEV aufgerufen, wenn eine Antwort auf einen Befehl der über CallFn abgesetzt wurde zurück kommt.
Das heisst, diese Funktion sollte nicht von innerhalb des Moduls 51_I2C_TSL2561 aufgerufen werden. Es kann in diesem Fall schließlich nicht sichergestellt werden, ob schon eine Antwort vorliegt.

Die Verbindung muss asynchron laufen:

Slave Modul (TSL2561) sendet Anfrage an IODEV in dem es die I2CWrtFn des IODEV aufruft:
CallFn($iodev->{NAME}, "I2CWrtFn", $iodev, {
direction  => "i2cread",
i2caddress => $hash->{I2C_Address},
reg => $reg,
nbyte => $nbyte
});

kann natürlich auch i2cwrite sein.

Das IODEV verarbeitet jetzt diese Anfrage. Wärenddessen macht das Slave Modul (TSL2561) nix.

Wenn Das IODEV die Antwort vom I2C Chip hat dann schickt es die Antwort an die $hash->{I2CRecFn} des Slave Moduls

Dieses kann die Antwort verarbeiten.

Das aktuelle Konstrukt im TSL2561 Modul funktioniert vermutlich nur Zufällig auf dem Pi.





RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

thymjan

#26
Dann ist doch auch die direkte Überprüfung von XX_SENDSTAT in sub XX_i2cwrite und sub XX_i2cread nicht im Sinne des Erfinders, oder? Hab mir vorher an dem Konstrukt
if ($hash->{$iodev->{NAME}.'_SENDSTAT'} eq 'error')
die Zähne ausgebissen und hab's dann schließlich auskommentiert.

Habe mein FRM-Modul mit log-Infos zugepflastert für genauere Rückmeldungen. Ist im Anhang.

Habe mir auch überlegt, dass die Poll-Funktion einfacher gestaltet werden sollte. Ein Großteil könnte doch in eine Measurement-Funktion ausgelagert werden, die nur während einer Messung ausgeführt wird und nicht gleich beim Start beim "einfachen" Festlegen des Poll-Intervals.

klausw

Zitat von: thymjan am 18 November 2015, 13:58:23
Dann ist doch auch die direkte Überprüfung von XX_SENDSTAT in sub XX_i2cwrite und sub XX_i2cread nicht im Sinne des Erfinders, oder? Hab mir vorher an dem Konstrukt
if ($hash->{$iodev->{NAME}.'_SENDSTAT'} eq 'error')
die Zähne ausgebissen und hab's dann schließlich auskommentiert.

Nee, die Überprüfung sollte ausschließlich in der I2CRecFn erfolgen. Woanders macht sie keinen Sinn.

i2c read und write sollten auch maximal Funktionen sein, die einen Lese/Schreibbefehl absetzen. Sie dürfen keinesfalls auf eine Antwort warten.
Die Antwort kommt von allein über die I2CRecFn. Von dort muss auch die Verarbeitung der gelesenen Werte angetriggert werden.

Das SHT21 Modul ist evtl. ein gutes Beispiel. Im BMP180 ist halt auch noch der alte HiPi Kram drin. Der macht es etwas unübersichtlich.

Eine Separate Funktion um die Rohdaten in lesbare Werte zu Wandeln ist sehr sinnvoll.

Das TSL2561 ist halt ursprünglich für den direkten Einsatz am Pi konzipiert gewesen. Das war das BMP Modul auch, dort musste ich einiges umändern.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

thymjan

Bin nun einen Schritt weiter. Die Kommunikation mit dem Sensor funktioniert jetzt (angelehnt an das Modul für den BMP180).
Das Modul wartet jetzt auch auf $main::init_done bevor es zu lesen/schreiben anfängt.
Musste dazu viel Code nach "hinten packen" also z.B. aus Define nach Init usw.
HiPi habe ich erst mal rausgeschmissen.

Nun müssen die State-Machines wieder zum Laufen gebracht werden... eine kleine Herausforderung.
Wo ich den Code aus der alten Poll-Funktion hin packen soll, weis ich auch noch nicht.

Der aktuelle Stand (liest noch keine Messwerte aus) im Anhang.

2015.11.19 20:21:45 0: Server shutdown
2015.11.19 20:21:50 1: Including fhem.cfg
2015.11.19 20:21:50 3: telnetPort: port 7072 opened
2015.11.19 20:21:52 3: WEB: port 8083 opened
2015.11.19 20:21:52 3: WEBphone: port 8084 opened
2015.11.19 20:21:52 3: WEBtablet: port 8085 opened
2015.11.19 20:21:53 2: eventTypes: loaded 645 events from ./log/eventTypes.txt
[...]
2015.11.19 20:22:03 1: I2C_TSL2561_Define start: 3/Lichtsensor I2C_TSL2561 0x39
2015.11.19 20:22:03 1: I2C_TSL2561_Define Lichtsensor I2C_TSL2561 0x39
2015.11.19 20:22:03 1: Including ./log/fhem.save
2015.11.19 20:22:04 3: FRM_1: port 3031 opened
2015.11.19 20:22:04 0: Featurelevel: 5.6
2015.11.19 20:22:04 0: Server started with 64 defined entities (version $Id: fhem.pl 9868 2015-11-12 18:04:37Z rudolfkoenig $, os linux, user fhem, pid 2184)
2015.11.19 20:22:07 5: I2C_TSL2561_Poll: start
2015.11.19 20:22:07 5: I2C_TSL2561_Enable: start
2015.11.19 20:22:07 5: I2C_TSL2561_Enable: end
2015.11.19 20:22:07 5: I2C_TSL2561_Poll: 5 min
2015.11.19 20:22:08 4: Connection accepted from FRM:192.168.1.25:1773
2015.11.19 20:22:08 5: FRM:>ff
2015.11.19 20:22:11 3: querying Firmata Firmware Version
2015.11.19 20:22:11 5: FRM:>f079f7
2015.11.19 20:22:11 5: FRM:<f079020643006f006e0066006900670075007200610062006c0065004600690072006d00610074006100f7
2015.11.19 20:22:11 3: Firmata Firmware Version: ConfigurableFirmata V_2_06
2015.11.19 20:22:11 5: FRM:>f069f7
2015.11.19 20:22:11 5: FRM:>f06bf7
2015.11.19 20:22:11 5: FRM:<f06a7f7f7f7f7f7f7f7f7f7f7f7f7f7f0001020304050607f7f06c7f7f0101091c7f01010308091c7f7f010103087f010103087f01017f01017f010103087f7f7f7f7f01017f01017f01017f01017f010106017f010106017f7f7ff7
2015.11.19 20:22:11 5: FRM:>f07a6807f7
2015.11.19 20:22:11 5: FRM:>f41206
2015.11.19 20:22:11 5: FRM:>f41306
2015.11.19 20:22:11 5: FRM:>f0780100f7
2015.11.19 20:22:11 1: I2C_TSL2561_Init start: 0/
2015.11.19 20:22:11 5: I2C_TSL2561_FirstCall: start
2015.11.19 20:22:11 5: FRM: Kommunikation mit I2C ...
2015.11.19 20:22:11 5: FRM: auf I2C lesen ...
2015.11.19 20:22:11 5: FRM:>f076390800010100f7
2015.11.19 20:22:11 5: FRM: Adresse: 57|Register: 128|1 byte(s)
2015.11.19 20:22:11 5: I2C_TSL2561_FirstCall: end
2015.11.19 20:22:11 5: FRM:>f40201
2015.11.19 20:22:11 5: FRM:>900000
2015.11.19 20:22:11 5: FRM:>f40303
2015.11.19 20:22:11 5: FRM:<f077390000010000f7
2015.11.19 20:22:11 5: FRM: onI2CMessage address: '57', register: '128' data: 0
2015.11.19 20:22:11 5: FRM: UPDATE Adresse: 57|Register: 128|Daten: 0
2015.11.19 20:22:11 5: FRM: UPDATE FRM_1_SENDSTAT => "Ok"
2015.11.19 20:22:11 5: Lichtsensor RX register 128 (Reg 0), 1 byte: 0
2015.11.19 20:22:11 5: I2C_TSL2561_I2CRcvControl: Sensor is disabled, Power off
2015.11.19 20:22:16 5: I2C_TSL2561_Enable: start
2015.11.19 20:22:16 5: FRM: Kommunikation mit I2C ...
2015.11.19 20:22:16 5: FRM: auf I2C lesen ...
2015.11.19 20:22:16 5: FRM:>f07639080a010100f7
2015.11.19 20:22:16 5: FRM: Adresse: 57|Register: 138|1 byte(s)
2015.11.19 20:22:16 5: FRM: Kommunikation mit I2C ...
2015.11.19 20:22:16 5: FRM: auf I2C schreiben ...
2015.11.19 20:22:16 5: FRM: Adresse: 57|Register: 128|Wert: 3
2015.11.19 20:22:16 5: FRM:>f076390000010300f7
2015.11.19 20:22:16 5: FRM: Kommunikation mit I2C ...
2015.11.19 20:22:16 5: FRM: auf I2C lesen ...
2015.11.19 20:22:16 5: FRM:>f076390800010100f7
2015.11.19 20:22:16 5: FRM: Adresse: 57|Register: 128|1 byte(s)
2015.11.19 20:22:16 5: I2C_TSL2561_Enable: end
2015.11.19 20:22:16 5: FRM:<f07739000a015000f7f077390000010300f7
2015.11.19 20:22:16 5: FRM: onI2CMessage address: '57', register: '138' data: [80]
2015.11.19 20:22:16 5: FRM: UPDATE Adresse: 57|Register: 138|Daten: 80
2015.11.19 20:22:16 5: FRM: UPDATE FRM_1_SENDSTAT => "Ok"
2015.11.19 20:22:16 5: Lichtsensor RX register 138 (Reg 10), 1 byte: 80
2015.11.19 20:22:16 5: I2C_TSL2561_I2CRcvID: sensorId TSL2561 Package T/FN/CL Rev. 0
2015.11.19 20:22:16 5: FRM: onI2CMessage address: '57', register: '128' data: [3]
2015.11.19 20:22:16 5: FRM: UPDATE Adresse: 57|Register: 128|Daten: 3
2015.11.19 20:22:16 5: FRM: UPDATE FRM_1_SENDSTAT => "Ok"
2015.11.19 20:22:16 5: Lichtsensor RX register 128 (Reg 0), 1 byte: 3
2015.11.19 20:22:16 5: I2C_TSL2561_I2CRcvControl: Sensor is enabled, Power on
2015.11.19 20:22:25 5: I2C_TSL2561_GetLuminosity: start
2015.11.19 20:22:25 5: I2C_TSL2561_GetLuminosity: calc state 0 acqui state 1
2015.11.19 20:22:25 5: I2C_TSL2561_GetLuminosity: starting new measurement
2015.11.19 20:22:25 5: I2C_TSL2561_GetData: start...
2015.11.19 20:22:25 5: FRM: Kommunikation mit I2C ...

klausw

Moin,

Zeile 339 ist so richtig, Habe ich von Norbert geklaut.
Da wird init mit eval aufgerufen. Also im fall eines Fehlers schmiert dann nicht das ganze FHEM ab sondern es gibt eine Meldung zurück "$@", die über die Funktion Catch besser lesbar formattiert wird.
An Init werden alle Variablen, mit Ausnahme des Namens durchgereicht.

Wozu wird die Poll Funktion eigentlich benötigt? Es sollte reichen wenn du als poll Funktion einfach sie set Funktion mit readvalues aufrufst.

Alle I2C Befehle (also auch write) bekommen eine Rückmeldung über die I2C_TSL2561_I2CRec.
Dort sollte eigentlich die einzige State Machine drinnen sein. Schließlich steht und fällt alles mit der Antwortzeit vom Chip.
Für die State Machines könntest du eine Interne Variable verwenden um die aktuelle Position in der State Machine zu speichern (beim BMP konnte man mit der Registeradresse arbeiten, die mit an das I2C_TSL2561_I2CRec übergeben wird, aber evtl. ist das für dich nicht eindeutig genug ).
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280