DevIO erkennt abgeschaltetes Gerät sehr spät

Begonnen von Alder251, 28 Juni 2019, 16:41:34

Vorheriges Thema - Nächstes Thema

Alder251

Hallo,
um meinen Irobot Roomba 564 wlan#fähig zu machen habe ich mir einen Wemos D1 mini / ESP8266 und mit der
auf https://github.com/incmve/roomba-esp8266 aufgeführten Anleitung in Betrieb genommen. Funktioniert auch.

Nun werden von der Platine über die serielle Schnitstelle Steuerbefehle an den  Roomba gesendet bzw. von dort ausgelesem.
Um mit Fhem direkt Steuercodes an die serielle Schnittstelle senden zu können habe ich mir auf der Platine einen TCP-Server eingerichtet und
aus dem FHEM-Wiki das Beispielprogramm für TCP-Verbindungen kopiert. Dort habe ich die Set-Befehle von on/off/statusrequest in  clean/spot/dock abgeändert. Funktioniert soweit gut.

Mein Problem ist nun:
Schalte ich die Spannungsversorgung für die Platine ab, also die Verbindung ist tot, erkennt das das DevIO nicht automatisch. Sende ich einen Befehl an den Roomba, dann schaltet mein Modul erst nach ca. 15min auf disconnected und versucht alle 3 sek. neu zu verbinden. Schalte ich die Versorgung wieder ein, dann steht es nach ca. 15sek wieder auf opened.

Zitat
2019.06.28 15:09:33 5: SW: get_status
.
.
.
2019.06.28 15:25:43 5: Roombot (Roomba) - Read!
2019.06.28 15:25:43 1: 192.168.70.3:8888 disconnected, waiting to reappear (Roomba)
2019.06.28 15:25:43 5: Roombot (Roomba) - Ready!
2019.06.28 15:25:43 5: Roombot (Roomba) - Callback!
2019.06.28 15:25:43 5: Roombot (Roomba) - error while connecting:
2019.06.28 15:25:48 5: Roombot (Roomba) - Ready!
2019.06.28 15:25:48 5: HttpUtils url=http://192.168.70.3:8888/
2019.06.28 15:25:48 4: IP: 192.168.70.3 -> 192.168.70.3
2019.06.28 15:25:51 5: Roombot (Roomba) - Callback!
2019.06.28 15:25:51 5: Roombot (Roomba) - error while connecting: connect to http://192.168.70.3:8888 timed out
2019.06.28 15:25:55 5: Roombot (Roomba) - Ready!
2019.06.28 15:25:55 5: Roombot (Roomba) - Callback!
2019.06.28 15:25:55 5: Roombot (Roomba) - error while connecting:
.
.
.
2019.06.28 15:35:29 5: Roombot (Roomba) - Ready!
2019.06.28 15:35:29 5: HttpUtils url=http://192.168.70.3:8888/
2019.06.28 15:35:29 4: IP: 192.168.70.3 -> 192.168.70.3
2019.06.28 15:35:29 5: Roombot (Roomba) - Init!
2019.06.28 15:35:29 5: SW: get_status

2019.06.28 15:35:29 1: 192.168.70.3:8888 reappeared (Roomba)
2019.06.28 15:35:29 5: Roombot (Roomba) - Callback!
2019.06.28 15:35:29 5: Roombot (Roomba) - error while connecting:
2019.06.28 15:35:29 5: Roombot (Roomba) - Read!
2019.06.28 15:35:29 5: Roombot (Roomba) - received: Connected to Roombot IP:
2019.06.28 15:35:29 5: Roombot (Roomba) - Read!
2019.06.28 15:35:29 5: Roombot (Roomba) - received: 192.168.70.3


Laut FHEMwiki erkennt das DevIO ja selbstständig, wenn ein Gerät abgeschaltet wird. Muß ich dennoch mit einem internalTimer zyklisch Daten an das Gerät senden um einen Verbindungsabbruch zu erkennen?

rudolfkoenig

ZitatSchalte ich die Spannungsversorgung für die Platine ab, also die Verbindung ist tot, erkennt das das DevIO nicht automatisch.
Was genau meinst du mit "DevIO"?
Ich vermute: dein Modul (Roombot?) verwendet FHEM/DevIO.pm, um eine TCP Verbindung zu einem Geraet aufzubauen.

Generell: TCP sieht zwar ein keepalive vor (wenn das Programm es bestellt, DevIO.pm tut es), das wird vom Linux aber nur etwa alle zwei Stunden aktiv.
MW kann man es nur Systemweit verstellen, d.h es betrifft alle Netzwerkverbindungen.
Wenn einem die 2 Stunden nicht reichen, dann muss man irgendwelche "sinnlosen" Pakete versenden.
Selbst wenn diese von der anderen Seite nicht beantwortet werden, wird der TCP-Stack im Kernel feststellen, dass das Senden nicht geklappt hat, und benachrichtigt den Sender entsprechend.

ZitatSende ich einen Befehl an den Roomba, dann schaltet mein Modul erst nach ca. 15min auf disconnected
Das passt nicht, das Modul sollte innerhalb von Sekunden benachrichtigt werden.

Alder251

ZitatWas genau meinst du mit "DevIO"?
Ich vermute: dein Modul (Roombot?) verwendet FHEM/DevIO.pm, um eine TCP Verbindung zu einem Geraet aufzubauen.
Genau! Habe mir bisher nur das Beispiel aus der Wiki kopiert und entsprechend (Modulname, set-Befehle) angepaßt.

ZitatWenn einem die 2 Stunden nicht reichen, dann muss man irgendwelche "sinnlosen" Pakete versenden.
Kann ich ja machen, bekomme dann aber trotzdem erst nach 15 min den Status "disconnect".

Sehe ich doch richtig: mit dem Beispiel aus der Wiki müßte das ohne das Setzen weiterer Internals schon erkannt werden, oder?

rudolfkoenig

ZitatSehe ich doch richtig: mit dem Beispiel aus der Wiki müßte das ohne das Setzen weiterer Internals schon erkannt werden, oder?
Ich kenne den Beispiel nicht, nach ersten ueberfliegen meine ich, dass weder die Rueckgabe von DevIO_SimpleRead in ReadFn, noch das "disconnected" Status im ReadyFn ausgewertet wird. D.h. die Funktionen werden vermutlich korrekt aufgerufen, aber eine Statusaenderung wird nicht ueberprueft. Die Instanz muesste aber (wg. DevIO) den Status disconnected haben und ein "DISCONNECTED" Event generieren.

Evtl. hilft dir das Studieren von 00_MQTT2_CLIENT.pm (mein letztes Modul mit DevIO), auch wenn es nicht unbedingt als Lehrbeispiel gedacht ist.