[PATCH] 10_FRM.pm I2C-IO während TCP Disconnect verursacht Absturz

Begonnen von jensb, 19 Dezember 2015, 15:45:16

Vorheriges Thema - Nächstes Thema

jensb

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

ntruchsess

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

Gruß,

Norbert
while (!asleep()) {sheep++};

jensb

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