WIFI + MQTT - connect non Blocking

Begonnen von sn0000py, 02 Mai 2017, 09:13:25

Vorheriges Thema - Nächstes Thema

sn0000py

Hallo
ich versuche gerade meinen ESP so zu flashen, das zwar WiFi + MQTT funktm aber das ganze nicht blockiert.
Im Moment habe ich das Problem, das sich der ESP ins WLAN verbindet, aber da ich im Moment den MQTT Broker abgedreht hat, versucht sich der ESP ständig zum MQTT zu verbinden, was jedes mal das ganze System blockiert.
Im Hintergrund lese ich vom I2C ein und schalte Relais, das sollte unabhängig vom WLAN und MQTT Status immer auch noch funktionieren.
Aktuell verwende ich die ESP8266 Basic Library von Pfanne.
Hat wer ideen wie ich das besser lösen kann/soll, oder muss ich auf MQTT verzichten?

networker

#1
Schau dir mal die ESPHelper lib an.

https://github.com/ItKindaWorks/ESPHelper

lG Michael

sn0000py

Danke werde ich mir mal anschauen,
weisst du ob bei der Library die begin und loop nicht blockierend sind, wenn der WLAN oder der MQTT Broker nicht erreichbar sind?

Joker

Zitat von: sn0000py am 02 Mai 2017, 09:13:25
Im Hintergrund lese ich vom I2C ein und schalte Relais, das sollte unabhängig vom WLAN und MQTT Status immer auch noch funktionieren.
Aktuell verwende ich die ESP8266 Basic Library von Pfanne.
Hat wer ideen wie ich das besser lösen kann/soll, oder muss ich auf MQTT verzichten?
Habe gerade mal in die Library rein geschaut. Wie sieht denn deine Loop aus?
Wenn du es so machst wie im Example, dann wird wenn ich es richtig sehe quasi "full speed" ständig die PubSubClient "connect" Funktion aufgerufen. Diese braucht relativ lange bis sie zurück kehrt. Das ist meiner Meinung nach ein kleiner Schwachpunkt dieser Lib- Man sollte die PubSubClient "loop" Funktion so oft wie möglich aufrufen (wenn connected), und wenn nicht connected, dann nur alle paar Sekunden versuchen die Verbindung aufzubauen (und dies am besten non-Blocking ohne delay).

Die andere Frage ist, macht es wirklich Sinn deine Relais zu schalten ohne den Status zu publishen? Oder anders herum, warum musst du den Status überhaupt publishen (oder wofür MQTT?) wenn es auch ohne geht?

sn0000py

den ESP setzte ich zum schalten von 4 Lichter ein (2*Spot und 2*Hauptlichter) per Taster.
Im Normallfall will ich das ganze auch an meinen FHEM Server publishen, und auch vom FHEM Server steuern.
Aber ich will eben auch den Fallback abdecken, egal ob nun der WLAN Router kaputt ist oder der Raspi nicht da ist, das Licht möchte ich trotzdem noch einschalten können, und wenn in der loop Funktionen solche leaks sind, kann man das im Moment total vergessen so ....

sn0000py

Zitat von: networker am 02 Mai 2017, 09:18:00
Schau dir mal die ESPHelper lib an.

https://github.com/ItKindaWorks/ESPHelper

lG Michael
Leider verwendet diese ESPHelper auch den pubsubclient der leider blockierend ist ...

sbiermann

Du kannst mal probieren ob du mit Interrupts arbeiten kannst. Bin ich mir gerade nicht sicher ob das bei i2c auch funktioniert, aber das wäre evtl. eine Lösung um das weiter arbeiten zu ermöglichen.

Joker

Zitat von: sn0000py am 03 Mai 2017, 08:22:51
Leider verwendet diese ESPHelper auch den pubsubclient der leider blockierend ist ...
Hm? Nein, nicht prinzipiell. Du musst es nur so machen wie ich oben schrieb: In der Loop rufst du ständig client.loop() auf wenn die Verbindung zum Broker besteht. Das tut wenn keine Nachrichten ankommen oder verschickt werden sollen quasi gar nichts. Und einen neuen Verbindungsversucht machst du nur alle paar Sekunden. Habe ich beispielsweise in meinem HomeStatusDisplay genau so gemacht. Schau mal dort im File HSDMqtt.cpp die HSDMqtt::handle() an.

Pf@nne

Moin,

was für Ansprüche hast du denn an die MQTT-Verbindung?
In welchem Zyklus soll den überprüft werden ob eine Verbindung besteht?

Du könntest dann mit einem Timer z.B. alle Minute testen ob ein Broker erreichbar ist.
Oder stört dich schon die Zeit die der Client benötigt um einen nicht erreichbaren Broker zu erkennen?

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

sn0000py

ich habe es im moment mal so gemacht das ich alles extra verwende, also mein sketch, und dazu die AsyncMQTT Library, und den OAT Update.

Funktioniert soweit super, es gibt meines erachten zu keinerlei zeit einen lag in der software, egal, ob WIFI läuft oder ned, ob ich den Raspi wo der MQTT Broker läuft abdrehe oder nicht, und wenn der Broker kommt, dann passt immer weider alles.

Giobt es einen Grund warum nicht überall der Async MQTT Client verwendet wird?

Joker

Meine Vermutung ist, dass der einfach nicht so bekannt ist. Und das wiederum dürfte daran liegen dass er vergleichsweise neu ist.