IO-Devices: Kommandos senden während Funkpakete empfangen werden

Begonnen von kaihs, 14 Dezember 2014, 18:07:14

Vorheriges Thema - Nächstes Thema

kaihs

Ich schlage mich gerade mit Problemen beim FHEMduino rum die aber meines Erachtens grundsätzlicher Natur sind und alle IO-Devices betreffen.

Das Problem tritt auf beim Lesen der Antwort auf ein Kommando das an das Device geschickt wurde (ReadAnswer). Ich sperre im FHEMduino zwar schon während der Ausführung des Kommandos den Empfang von Funknachrichten, aber das scheint nicht in allen Fällen auszureichen.
Es kommt dann zu so was:

2014.12.14 09:35:06 5: Messsage an IO senden Message raw: #isF0F0F0FFFF0F420#
2014.12.14 09:35:06 5: FHEMduino_PT2262 IODev device didn't answer is command correctly: #  raw => isF0F0FFF0FF0F420W0351580dc16W03503802d4fW03503802d4f#


Das ReadAnswer holt nicht nur die Antwort auf das Kommando, sondern auch die bereits danach empfangenen Funknachrichten ab.
Damit kommt es einmal zu einem Fehler bei der Auswertung der Kommandoantwort und Funkpakete gehen woanders verloren.

Dieses Problem müsste doch auch bei anderen IOs auftreten, oder?

Wenn man davon ausgeht, dass es sich immer im ein zeilenorientiertes Protokoll zwischen fhem und IO handelt würde es eigentlich ausreichen, wenn ReadAnswer nur bis zu einem Zeilenumbruch liest.
ReadAnswer ruft allerdings DevIo_SimpleRead auf, das wieder DevIo_DoSimpleRead und dort steht dann:

  if($hash->{USBDev}) {
    $buf = $hash->{USBDev}->input();

  } elsif($hash->{DIODev}) {
    $res = sysread($hash->{DIODev}, $buf, 4096);
    $buf = undef if(!defined($res));

  } elsif($hash->{TCPDev}) {
    $res = sysread($hash->{TCPDev}, $buf, 4096);
    $buf = "" if(!defined($res));

  }


Im Fall eines USB Devices wird also Device::SerialPort->input() aufgerufen. Das gibt einfach alles aus dem Empfangspuffer zurück.

Device::SerialPort bietet mit are_match  und lookfor wohl Möglichkeiten nur bis zu einem bestimmten Zeichen zu lesen. Bei DirectIIO und TCPIP hilft das aber nicht.

Tritt dieses Problem bei CUL und Co. nicht auf?
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

rudolfkoenig

ZitatReadAnswer holt nicht nur die Antwort auf das Kommando, sondern auch die bereits danach empfangenen Funknachrichten ab.

Das Problem ist in CUL_ReadAnswer seit laengerem mit dem regexp Parameter geloest, der Aufrufer spezifiziert damit wie die Antwort auszusehen hat. Falls eine im ReadAnswer gelesene Zeile nicht diesem Muster entspricht, dann wird sie mit CUL_Parse verarbeitet. Natuerlich muessen die vom CUL gelieferten Daten dafuer unterscheidbar sein.

kaihs

Danke für den Hinweis.

FHEMduino.pm wurde offensichtlich auf Basis einer älteren Version von CUL.pm entwickelt.
Ich werde jetzt mal Versuchen die Änderungen von CUL.pm zu mergen.

Kai
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation