im Prinzip entscheidet aber der Sender ob es Retained ist, oder nicht. Wir als MQTT Broker setzen dies nur um. Ich habe bzgl. Tasmota @KaiS mal gefragt wie er das sieht.
Meine Recherche zu dem Thema ergab, dass wir das Retained Flag korrekt auswerten und eine Retained Nachricht nur gelöscht wird, wenn diese mit leerem Topic an uns gesendet wurde. Siehe hier: Retained Messages - MQTT Essentials: Part 8
There is also a very simple way to delete the retained message of a topic: send a retained message with a zero-byte payload on the topic where you want to delete the previous retained message. The broker deletes the retained message and new subscribers no longer get a retained message for that topic. Often, it is not even necessary to delete, because each new retained message overwrites the previous one.
paresy
PS: Grad im Code nachgesehen - IP-Symcon löscht dies auch korrekt, wenn ein leerer Payload gesendet wurde
Ihr habt das Problem richtig erkannt.
Ich glaube hier wird der Restart Befehl nicht gelöscht. Ich frage mich ob das nicht eigentlich der ESP tun müsste.
Wenn ich @paresy richtig verstanden habe, wird nach erfolgreicher Ausführung eigentlich die Message überschrieben. Müsste das nicht dann eigentlich Tasmota erledigen?
Wenn Retain in der Instanz abgehakt ist, dann wird die Nachricht her als Retain versendet.
So sollte zumindest sein. Ich prüfe das morgen mal.
IPS leitet Reboot weiter an ESP, da auf den Topic abboniert.
ESP bootet neu
ESP abboniert wieder alle Topics
Dabei ist auch das Reboot Topic, welches sofort einen Reboot an den ESP sendet, da die Nachricht ja als Retained markiert ist
ESP bootet neu und startet die Schleife
Im Prinzip kommt der ESP da nicht raus, es sei denn er würde
a) das Reboot Topic nicht abonnieren
b) vor dem Abonnieren das Reboot Topic explizit zurücksetzen (Leere Payload an Reboot Topic mit Retain Flag!)
Aber wie kann ich das beeinflussen?
Wenn ich neu starten will und der ESP nicht erreichbar ist, dann muss ich es ja mit dem Retain Flag senden.
Also müsste eigentlich der ESP dafür sorgen, oder?
Oder genau das ist notwendig. Aber dann müsste der ESP, sobald er das Reboot empfängt, ein Publish Reboot (Retained) mit leerem Payload senden BEVOR er den eigentlich Reboot durchführt, damit der Broker die Meldung beim nächsten Subscribe nicht mehr sendet.
Vielleicht sollte jemand beim Tasmota Entwickler mal nachfragen, wie er dazu steht.
Das löst definitiv das Problem - erlaubt aber nicht mehr, wie von dir beschrieben, dass ein Gerät neu bootet, sobald es „wieder“ verfügbar ist. (Da es aktuell aber immer zu einer Reboot Loop in diesem Fall führt, würde ich den Workaround definitiv erst einmal einbauen, bis jemand Interesse hat mit dem Tasmota Entwickler zu schreiben, ob er diesen Use-Case überhaupt für Interessant findet)
Die Antwort ist noch nicht so aussagekräftig, mal abwarten, ob noch mehr kommt.
This is true for any command.
There might be use case where one wants a command to be retained (while I don’t see any good reasons for now), so arbitrarily deciding to clear the command topic after each command could be heavy.
I would mostly qualify this as a problem between the chair and the broker mis-using the retain flag.
Aus meiner Sicht wäre es zumindest bei restart sehr sinnvoll das retain wegzulassen.
Eine etwas bessere Antwort und eine Idee zum Testen ;-).
The confirm is indeed necessary. That can be preempted by giving Restart the argument (payload) „1“. Without that, nothing gets executed, but the prompt {"Restart":"1 to restart, 2 to halt"} appears Basically, you can’d send a meaningful restart without it already being confirmed. Sending commands retained is normally a really bad plan.
Blockquote25.03.2021 11:59:38 | 13269 | MESSAGE | VariableManager | [Program\IPSLibrary\data\core\IPSLogger\IPSLogger\HtmlOut_MsgId] = 816859
25.03.2021 11:59:38 | 00000 | CUSTOM | PHP | Error: Warning: First parameter must either be an object or the name of an existing class
Error in Script /var/lib/symcon/modules/.store/info.schnittcher.ips.tasmota/Tasmota/module.php on Line 233
134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
37 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
in IPSLogger_PhpErrorHandler
233 in modules/.store/info.schnittcher.ips.tasmota/Tasmota/module.php (call property_exists)
3 in /- (call ReceiveData)
25.03.2021 11:59:38 | 16787 | MESSAGE | VariableManager | [Program\IPSLibrary\data\core\IPSLogger\IPSLogger\SingleOut_Msg] =
Error: Notice: Undefined property: stdClass::$Button5
Error in Script /var/lib/symcon/modules/.store/info.schnittcher.ips.tasmota/Tasmota/module.php on Line 233
Mittlerweile ist Deine Beta Version installiert. Das Log wird geflutet.
ich komme dem Fehler leider nicht auf die Schliche. Es ist immer die eine Instanz. Ich habe die nun schon mehrfach neu angelegt. Leider ohne Erfolg. Ich habe auch schon das Tasmota Modul getauscht (S20 gegen Gosund) auch das hat nichts gebracht.