Hallo ntruchsess,
ich wollte eigentlich untersuchen, warum der I2C_TSL2561 Schwierigkeiten unter Firmata hat, bin bei der Vorbereitung aber auf etwas anderes gestoßen. Aufgefallen ist es mir erst, nachdem ich mein Breadboard abgeschaltet habe. Die I2C-Module pollen dann trotzdem weiter, aber Firmata antwortet natürlich nicht mehr. Nach einiger Zeit erfolgt der TCP Disconnect, und FRM_FirmataDevice_Close löscht {FirmataDevice}->{io}. Der Hash von {FirmataDevice} existiert aber trotzdem noch, so dass ein I2C-Modul beim nächsten Aufruf von I2CWrtFn scheinbar ein gültiges {FirmataDevice} hat und versucht, den I2C-Zugriff auszuführen. Das endet dann so:
2015.12.14 20:30:28 1: 4040 disconnected, waiting to reappear (FRM:192.168.XXX.YYY:49190)
Can't call method "packet_i2c_request" on an undefined value at FHEM/lib/Device/Firmata/Platform.pm line 581
Device::Firmata::Platform::i2c_write('Device::Firmata::Platform=HASH(0x3dc2e20)', 119, 244, 46) called at ./FHEM/10_FRM.pm line 674
main::FRM_I2C_Write('HASH(0x37945f8)', 'HASH(0x3df7830)') called at fhem.pl line 3110
main::CallFn('Firmata', 'I2CWrtFn', 'HASH(0x37945f8)', 'HASH(0x3df7830)') called at ./FHEM/51_I2C_BMP180.pm line 460
main::I2C_BMP180_i2cwrite('HASH(0x379c300)', 244, 46) called at ./FHEM/51_I2C_BMP180.pm line 383
main::I2C_BMP180_readUncompensatedTemperature('HASH(0x379c300)') called at ./FHEM/51_I2C_BMP180.pm line 247
main::I2C_BMP180_Set('HASH(0x379c300)', 'Luftdruck', 'readValues') called at ./FHEM/51_I2C_BMP180.pm line 217
main::I2C_BMP180_Poll('HASH(0x379c300)') called at fhem.pl line 2725
main::HandleTimeout() called at fhem.pl line 584
Habe die Firmata-Verbunden-Prüfung in eine eigene sub ausgelagert und um eine Prüfung auf {io} erweitert. Damit ist der Absturz durch I2C-IO während eines Disconnects weg. Ob das allerdings die richtige Lösung für das Problem ist, weiß ich nicht. Habe außerdem FRM_Tcp_Connection_Close leicht modifiziert, um den FRM-Modul-STATE nach dem Disconnect auf "listening" zurückzusetzen und das SocketDevice aus dem FRM-Modul zu löschen.
Bitte sieh dir den Patch diesbezüglich an und sag mir bitte was du davon hältst.
Grüße,
Jens
Hallo Jens,
danke für den Patch. Ist zwar nicht wirklich sauber gelöst, sollte aber so erst mal funktionieren. Der Check ob firmatadevice->{io} existiert ist gegen die interne Implementierung der Firmata-lib geschrieben, so was sollte besser über das Interface der Library also durch Bereitstellen einer methode á la 'firmatadevice->isconnected' in der lib selbst implementiert werden. Ich hab nur aktuell recht wenig Zeit dafür und gucke nur recht sporadisch rein.
Ich hab Deinen Patch ins FHEM-svn commited (https://sourceforge.net/p/fhem/code/10416/)
Gruß,
Norbert
Hallo Norbert,
vielen Dank für die Rückmeldung und den Commit. Das sollte man sicherlich noch mal überarbeiten, aber ich wollte da nicht so viel ändern, ohne mich mit dir abzustimmen.
Grüße,
Jens