Nachtrag. Die Cloud ist nur notwendig, wenn die Map benutzt werden soll. Wer den LBS offline laufen lassen will, braucht die IP-Adresse vom Roboter und Roboter-Token. Diese Informationen werden auch vom token_extractor ausgegeben.
Heisst: Wer die Cloud-Map weiterhin nutzen will:
1) Xiaomi-Cloud-Token an E7 übergeben
2) E2+E3 = Leer lassen
Wer den Roboter offline ohne Map nutzen will:
Den Token-extractor verwenden und IP-Adresse und Roboter-Token rauskopieren.
1) E2,E3, E7 leer lassen
2) E10 = IP vom Roboter
3) E11 = Token vom Roboter
Dann lässt sich dieser komplett ohne Cloud nutzen, allerdings entfällt leider die Map.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Xiaomi / Roboroc Baustein 19001929
Einklappen
X
-
edit; erst grade jetzt dein post gesehen.... werde testen, merci für deine hilfe
hab jetzt mal edomi neu gestartet, die log einträge haben sich verändert, aber es geht leider immer noch nicht
lbs log
errorlog:HTML-Code:2025-10-13 22:10:42 274038 16395 Kritisch Login failed.{"notificationUrl":"https:\/\/account.xiaomi.com\/fe\/service\/identity\/authStart?sid=xiaomiio&context=D2MR_[---lange kryptische Zeichenfolge---]&_locale=de_CH","result":"ok","code":0,"miDemo":0,"captchaUrl":null,"description":"\u6210\u529f","location":"","securityStatus":16,"pwd":0,"child":0,"desc":"\u6210\u529f"} 2025-10-13 22:10:42 276133 16395 Kritisch Login fehlgeschlagen! 2025-10-13 22:10:42 276283 16395 Debug cloud->isAccessible:N-E10=-E11= 2025-10-13 22:10:42 276374 16395 Kritisch IP/Token leer! Baustein muss richtig konfiguriert werden! Abbruch 2025-10-13 22:10:42 278584 16395 Debug Ausführungszeit: 2.5475239753723 [s]
HTML-Code:2025-10-13 22:10:41 103512 ? 16395 Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001929.php | Fehlercode: 2 | Zeile: 946 | rand() expects exactly 2 parameters, 1 given
Zuletzt geändert von mmarkus; 13.10.2025, 21:26.
Einen Kommentar schreiben:
-
Die haben die Authentifizierung vollständig geändert, mit 2 FA und zusätzlich Link.
Ich hab das Skript hier abgeändert, damit die Credentails ausgegeben werden.
Das Ding lädt ihr runter und braucht auch python3 auf dem Rechner.
https://github.com/PiotrMachowski/Xi...n_extractor.py
Dann sucht ihr diese Funktion (Aktuell Zeile 131):
Und fügt oberhalb von "cookies = {" folgendes ein:Code:def execute_api_call_encrypted(self, url, params): def execute_api_call_encrypted(self, url, params): headers = { "Accept-Encoding": "identity", "User-Agent": self._agent, "Content-Type": "application/x-www-form-urlencoded", "x-xiaomi-protocal-flag-cli": "PROTOCAL-HTTP2", "MIOT-ENCRYPT-ALGORITHM": "ENCRYPT-RC4", } cookies = { "userId": str(self.userId), "yetAnotherServiceToken": str(self._serviceToken), "serviceToken": str(self._serviceToken), "locale": "en_GB", "timezone": "GMT+02:00", "is_daylight": "1", "dst_offset": "3600000", "channel": "MI_APP_STORE" } millis = round(time.time() * 1000) nonce = self.generate_nonce(millis) signed_nonce = self.signed_nonce(nonce) fields = self.generate_enc_params(url, "POST", signed_nonce, nonce, params, self._ssecurity) response = self._session.post(url, headers=headers, cookies=cookies, params=fields) if response.status_code == 200: decoded = self.decrypt_rc4(self.signed_nonce(fields["_nonce"]), response.text) return json.loads(decoded) return None
sieht dann so aus:Code:print ("serviceToken: "+self._serviceToken) print ("SSec: "+self._ssecurity) print ("Uid:"+str(self.userId)) output = f"{self._serviceToken}\n{self._ssecurity}\n{self.userId}" print(output)
Wichtig, bei python muss alles richtig eingerückt sein.Code:def execute_api_call_encrypted(self, url, params): headers = { "Accept-Encoding": "identity", "User-Agent": self._agent, "Content-Type": "application/x-www-form-urlencoded", "x-xiaomi-protocal-flag-cli": "PROTOCAL-HTTP2", "MIOT-ENCRYPT-ALGORITHM": "ENCRYPT-RC4", } print ("serviceToken: "+self._serviceToken) print ("SSec: "+self._ssecurity) print ("Uid:"+str(self.userId)) output = f"{self._serviceToken}\n{self._ssecurity}\n{self.userId}" print(output) cookies = { "userId": str(self.userId), "yetAnotherServiceToken": str(self._serviceToken), "serviceToken": str(self._serviceToken), "locale": "en_GB", "timezone": "GMT+02:00", "is_daylight": "1", "dst_offset": "3600000", "channel": "MI_APP_STORE" } millis = round(time.time() * 1000) nonce = self.generate_nonce(millis) signed_nonce = self.signed_nonce(nonce) fields = self.generate_enc_params(url, "POST", signed_nonce, nonce, params, self._ssecurity) response = self._session.post(url, headers=headers, cookies=cookies, params=fields) if response.status_code == 200: decoded = self.decrypt_rc4(self.signed_nonce(fields["_nonce"]), response.text) return json.loads(decoded) return None
Aufruf:
XXXX= E-Mail AdresseCode:python3 token_extractor.py -uXXXX -pYYYY -sde
YYYY= Passwort
Nachdem ihr die Captcha und die URL aufgerufen habt, gibt das Skript dann den Auth-Token aus. Ist dann irgendwas was so aussieht:
asdfoiuartuhrtuiz
fsidu48==
weouirweui
Also, 3 Zeilen mit Zeilenumbrüche.
Das kopiert ihr nun in Edomi rein, wichtig ist, dass die Zeilenumbrüche stimmen. Das ist dann der Xiamo Cloud Token, was dem LBS an E7 übergeben werden muss.
Danach LBS über E1 mit "1" im Live-Modus triggern und schauen, ob wieder alles geht.
Einen Kommentar schreiben:
-
hmm, wüsste ich nichts von, habs aber grad probiert, war auch tatsächlich in der APP auch abgemeldet. hat aber leider nicht funktioniert, login auf website und APP geht, baustein aber nicht
Einen Kommentar schreiben:
-
Hallo zusammen
Aktuell macht der LBS bei mir irgendwie nichts mehr. Seit dem Update auf 1.22 kann der Baustein sich nicht mehr einloggen/ Verbinden mit der Cloud.
Im Log steht zwar etwas von Captcha eingabe, aber an A10 habe ich kein Token und auch im Log steht nichts von IP und Token.
Mach ich irgendetwas falsch?
Customlog:
Errorlog:HTML-Code:2025-10-12 21:35:39 683198 1612301 Kritisch try to login with captcha-code /usr/local/edomi/www/data/tmp/2FAXiaomi.json 2025-10-12 21:35:39 683728 1612301 Kritisch captcha code not entered!! 2025-10-12 21:35:39 684066 1612301 Kritisch Login failed.null 2025-10-12 21:35:39 685574 1612301 Kritisch Login fehlgeschlagen! 2025-10-12 21:35:39 685682 1612301 Debug cloud->isAccessible:N-E10=-E11= 2025-10-12 21:35:39 685770 1612301 Kritisch IP/Token leer! Baustein muss richtig konfiguriert werden! Abbruch 2025-10-12 21:35:39 688043 1612301 Debug Ausführungszeit: 0.0063560009002686 [s]
HTML-Code:2025-10-12 21:35:39 683871 ? 1612301 Datei: /usr/local/edomi/www/data/liveproject/lbs/EXE19001929.php | Fehlercode: 8 | Zeile: 1232 | Undefined variable: result ERROR
robo.jpg
Einen Kommentar schreiben:
-
So, Xiaomi scheint da nochmal was geändert zu haben. Ich habs jetzt wieder angepasst, dass es geht. (SW 1.22)
Die Frage ist aber, wie lange das jetzt hält.
Langfristig wird es wahrscheinlich nicht mehr ohne die 2FA gehen, mit Captcha Eingabe. Die Funktion hab ich im LBS schon eingebunden, aber irgendwie funktioniert es nicht, wenn der LBS erneut damit gestartet wird. Müsste ich ganz tief mit dem debuggen einsteigen, aber momentan fehlt mir die Zeit dafür.
Anleitung für die "Zukunft", falls es nur noch mit 2FA mit captcha gehen sollte:
Variante 1 - mit Maps aus der Cloud usw.
Der LBS gibt am A10 den Cloud-Token aus. Diesen einfach über eine Klemme ausgeben lassen und in einer remanenten Variable in Edomi speichern.
Beim Neustart des LBS muss dieser Token dann an E7 übergeben werden.
Variante 2 - ohne Maps, nur Robotersteuerung:
Log-Level auf 2 hochsetzen. Nachdem erfolgreichen Login in der Cloud schreibt der LBS die IP und auch den Token des Roboters in die Log-Datei.
Diese Werte dann an E10 (IP) und E11 (Token) übergeben. Dann lässt sich der Roboter ohne cloud steuern.
Einen Kommentar schreiben:
-
So, für alle, die nach einem Neustart von Edomi festgestellt haben, dass der Roboter nicht mehr geht, gibt es jetzt ein Update.
Herzlichen Dank an dieser Stelle auch an Philipp , der mir mit dem Bugfix zuvorgekommen ist. Die Version 1.21 hab ich jetzt hochgeladen.
- Likes 3
Einen Kommentar schreiben:
-
So, nun liege ich nach meiner Knie-OP flach und habe mich mal weiter gekümmert. Zu allererste: Es funktioniert wieder. Aus dem "Warum" werde ich aber nicht schlau.
Edomi und der Roborock waren immer schon in unterschiedlichen VLAN's mit entsprechenden Firewall-Regeln, mehr nicht. Es funktionierte immer.
Nun habe ich eine Edomi-Testinstallation im IoT-Netzwerk installiert, wo der Roborock beheimatet ist, und es funktionierte auf Anhieb. Diese habe ich dann in das Netzwerk geschoben, was das produktive Edomi läuft und schon ging es nicht mehr.
Firewall-Regeln habe ich die letzten Tage alle komplett neu erstellt. Keine Altlasten. War also gerade im Thema.
Durch die neue Installation des LBS habe ich nochmal die Hilfe durchgelesen und sah unten das Masquerading. Habe ich vorher noch nie gemacht und da war auch nichts eingetragen. Habe ich definitiv vorher nicht genutzt.
Nun habe ich ein zusätzlich zu den Firwall-Regeln ein Masquerading von Edomi (IP) zum Roborock (IP) hinzugefügt (UDP, Port 54321) und es funktioniert wieder.
Zusammenfassung:
Edomi und Roborock in verschiednen VLAN's (immer schon)
Vorher für 1,5 Jahre: Firewallregeln, kein Masquerading
Jetzt (plötzlich) Masquerading notwendig, von Edomi IP auf Roborock IP mit Port 54321 (UDP)
Router ist ein Unifi Dream Machine Pro. Ich weiß nicht, warum es ohne Firewall-Regel und ausschließlich mit Masquerading die ganze Zeit funktioniert, aber das war definitiv nicht eingerichtet vorher. Bis vorhin wusste ich nicht einmal, was Masquerading überhaupt ist.
Wahrscheinlich ging es nach einem Firmwareupdate (Roborock und/oder Dream Machine Pro) nicht mehr, was ich aber trotzdem sehr merkwürdig finde.
Vielen Dank auf jeden Fall für die Hilfe.
Viele Grüße
Nils
Falls es jemand gebrauchen kann, habe ich einmal 3 Bilder angehängt. Firewall-Regeln und Masquerade.
Masquerade (Network v. 8.5.6): Settings > Routing > NAT...
- Likes 1
Einen Kommentar schreiben:
-
Ich fasse das nicht komisch auf, alles gut.
Log:
Da die Hilfe vom LBS sagt "E9 : Debug: [0..2], 0= aus, 2 = maximal" und ich ihn auf 2 habe, meinst Du wohl nicht das Log.
- Im Systemlog steht nichts
- Den Inhalt des Individuellen Log des Bausteines habe ich komplett geschickt (Post #531)
- Im PROC-KNX stehen nur TUNNELING_ACK und TUNNELING_REQUEST von PA's
In welches Log muss ich schauen?
Allgemeines:
Ich habe den S8 seit fast 18 Monaten. Ich bin mir sicher, dass er im VLAN ist und zwar seit Anfang an und ich habe ihn seither immer mit Edomi oder der Smartphone-App gesteuert. Keine andere Software steuert den S8 und es gibt nur eine Edomi-Instanz. Daran hat sich nichts geändert. Die einzige Änderung ist, dass Edomi den S8 seit ca. 1,5 Wochen auf einmal nicht mehr steuern kann.
- Roborock S8 (10.0.23.203) im IoT-Netzwerk (wie schon immer)
- Edomi (192.168.20.50) als Docker (Rocky Linux von Starwarsfan)
- Router ist eine Unifi Dream Machine Pro
Ping vom Edomi-Docker aus zum Roborock:
Curl zum S8:Code:[root@1e3e0a9939d3 /]# ping 10.0.23.203 PING 10.0.23.203 (10.0.23.203) 56(84) bytes of data. 64 bytes from 10.0.23.203: icmp_seq=1 ttl=253 time=0.677 ms 64 bytes from 10.0.23.203: icmp_seq=2 ttl=253 time=0.539 ms 64 bytes from 10.0.23.203: icmp_seq=3 ttl=253 time=0.697 ms
Bei anderen Seiten bekomme ich auch ganz viele Infos und keine Fehlermeldungen.
Trigger hatte ich seit Anbeginn einach nur eine 1. Er hat ja Daten geschickt, wenn er einen Befehl bekam und war immer an der Ladestation. Da in der Hilfe steht, einfach eine 1 und keine komplizierte Logik, nicht zurücksetzen... habe ich daran bisher auch nichts geändert. Lief immer.Code:[root@1e3e0a9939d3 /]# curl 10.0.23.203 <html> <head> <script type="text/javascript" src="js/utility.js"> </script> <script type="text/javascript" src="js/storage.js"> </script> <script type="text/javascript" src="js/bigint.js"> </script> <script type="text/javascript" src="js/encrypt.js"> </script> <script type="text/javascript" src="js/ajax.js"> </script> <script type="text/javascript" src="js/login.js"> </script> <script type="text/javascript" src="js/pagecommon.js"> </script> <script type="text/javascript" language="javascript"> function Initialize() { //update communication channel encrypt flag: var sEncryptFlag = document.body.getAttribute("comm_channel_encrypt_flag"); var iEncryptFlag = parseInt(sEncryptFlag); if (isNaN(iEncryptFlag)) iEncryptFlag = 0; LocalStorage.Instance().Set("logo_comm_channel_encrypt_flag", iEncryptFlag); //local storage test: var sResultValue; var sTestKey = "local_storage_test"; var sTestValue = sTestKey + "_value"; try { LocalStorage.Instance().Set(sTestKey, sTestValue); sResultValue = LocalStorage.Instance().Get(sTestKey); } catch (e) { //do nothing. } if (sResultValue != sTestValue) { var sErrorInfo = document.body.getAttribute("local_storage_test_fail"); if (sErrorInfo) alert(sErrorInfo) else alert("local storage is disabled, please enable it."); } var bAutoLoginSuccessfully = false; if (LocalStorage.Instance().Get("logo_current_autologin")) { //auto login: var sPublicKey1 = document.body.getAttribute("logo_public_key1"); var sPublicKey2 = document.body.getAttribute("logo_public_key2"); var sPassword = LocalStorage.Instance().Get("logo_current_password"); //if(sPublicKey1 && sPublicKey2) { LocalLogin(sPublicKey1, sPublicKey2, sPassword, true, LocalStorage.Instance().Get("logo_current_logto_customized_site")); bAutoLoginSuccessfully = true; } } if (!bAutoLoginSuccessfully) { //try to navigate to real start page: var iCurLanguage = LocalStorage.Instance().Get("logo_current_language"); if (typeof iCurLanguage == "undefined" || iCurLanguage == null) iCurLanguage = 1; window.location.replace("/logo_login.shtm?!App-Language=" + iCurLanguage); } } </script> </head> <body onload="Initialize();" comm_channel_encrypt_flag="0" logo_ms_state="0" local_storage_test_fail="Local storage is disabled. Please enable it."> </body> </html>
Ich weiß nur leider noch nicht, welche Log Du genau meinst. Zertifikate muss ich mir mal anschauen, aber da weiß ich gerade nicht wie und muss nun leider für meine Knie-OP Sachen packen. Wenn ich Ende der Woche (hoffentlich) wieder zu Hause bin, kann ich dann weiter schauen.
Ein abgelaufenes Zertifikat könnte halt erklären, warum es schlagartig nicht mehr funktioniert, aber da muss ich mich vorher mal kurz einlesen, wie und wo ich das prüfen kann.
Viele Grüße
Nils
Einen Kommentar schreiben:
-
Bitte nicht falsch verstehen. Ich versuche Dir zu helfen, aber ich möchte Dir nicht alles aus der Nase ziehen.
D.h. bitte komplette Info - inkl. Aussagekräftigem Log, und worunter den Edomi genau läuft. Für die Log Edomi neu starten und vorher Debug auf höhste Stufe stellen.
Wenn in der Log steht, dass "Info Exec ist bereits aktiv. Aufruf Intervall prüfen" dann scheint irgendwo noch eine vorherige Abfrage aktiv zu sein. Laufzeit von 20 Sekunden ist auch sehr hoch, sicher, dass du kein VLAN oder ähnliches hast ? Geh per SSH shell auf deinem Edomi-Host und ping die IP vom Roboter an. Prüf in dem Zug auch, ob curl richtig funktioniert oder ob irgendwelche CA-Zertifikate bei deinem Edomi-Host abgelaufen sind. Könnte passieren, wenn du Edomi unter Centos hast.
Der LBS sollte übrigens mit einem Trigger laufen, ich habe Systemstart und alle 5 Minuten, damit die Daten entsprechend aktualisiert werden.
Einen Kommentar schreiben:
-
Da ist nichts besonderes:
E1 (Abfragen): 1 (Ohne Logik, immer 1)
E2 (Xiaomi-Cloud user): Meine e-Mail-Adresse
E3 (Xiaomi-Cloud password): Mein Passwort
E4 (Xiaomi Server) : de
E5 (Xiaomi Geräte-ID) : 0 (Ich habe nur ein Gerät)
-----
E9 (Debug): 2
E12 (valetudo): 0
-----
E14 (Steuer-Kommando):
E20 (Segment-Reinigung):
E25 (Saug,-Stufe, Wisch-Mpdus, Mop-Modus):
-----
E30 (Roboter automatisch befreien): 3
-----
E40 (Gültigkeit Statistiken): 24
-----
E41 (LiveMap Aktualisierungsintervall): 1
Die nicht genannten sind leer, also nichts eingetragen.
Wenn ich einen Raum saugen möchte, ist das eine Sequenz:
Hier z.B. Windfang:
E25 (Saug,-Stufe, Wisch-Mpdus, Mop-Modus): 104,200
5s Warten
E20 (Segment-Reinigung): 20
20 ist die RaumID vom Windfang. Das ganze nutze ich schon seit mehreren Monaten.
A10 (Xiaomi Cloud Token) hat immer eine Ausgabe
A34 (Baustein Aktiv) ist 20s 1 und danach wieder 0
Auch hier ansonsten keine Ausgabe
Viele Grüße
Nils
Einen Kommentar schreiben:
-
Schick bitte einmal die Beschattung vom LBS.
A10 ist nur interessant, wenn du mehrere Roboter hast, sonst ist das zu ignorieren.
Einen Kommentar schreiben:
-
Aus diesem habe ich dass er nicht reagiert. A10 gibt übrigens einen Token aus und ich habe nur einen einzigen Roborock und keine weiteren Geräte von Xiaomi.
Debug steht auf 2.
Eben einmal ausgelöst. Er soll er einen Raum saugen. Das hier ist davon dann die Ausgabe.
Code:{EDOMI,CUSTOMLOG_LBS_XIAOMI_19001929_0.log,28.09.2024,15:37:36,654112,1904}{Zeitstempel,ms,PID,LogLevel,Meldung} 2024-09-28 15:37:36 653620 1904 Debug Cloud-Daten aus Cache verwenden. Kein Login! 2024-09-28 15:37:36 654835 1904 Debug V3=[hier-stand-die-Ausgabe-von-A10] 2024-09-28 15:37:36 655122 1904 Debug cloud->isAccessible:Y-E10=-E11= 2024-09-28 15:37:36 655333 1904 Debug RoborockMe:: ip = [IP-vom-Roborock]; token = [hier-stand-ein-token]; SequenceID: 0 2024-09-28 15:37:41 257503 15499 Info Exec ist bereits aktiv. Aufruf Intervall prüfen 2024-09-28 15:37:56 671641 1904 Debug roborocMe:: ok 2024-09-28 15:37:56 672095 1904 Info Roboter reagiert nicht. 2024-09-28 15:37:56 677620 1904 Debug Ausführungszeit: 20.028375148773 [s]
Einen Kommentar schreiben:
-
Der LBS läuft ganz normal und funktioniert wie es soll. Prüf mal die log.
Einen Kommentar schreiben:


Einen Kommentar schreiben: