Ankündigung

Einklappen
Keine Ankündigung bisher.

Xiaomi / Roboroc Baustein 19001929

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • sipiyou
    antwortet
    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.

    Einen Kommentar schreiben:


  • mmarkus
    antwortet
    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
    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]  ​
    errorlog:

    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:


  • sipiyou
    antwortet
    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):

    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​
    Und fügt oberhalb von "cookies = {" folgendes ein:

    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)
    sieht dann so aus:
    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
    Wichtig, bei python muss alles richtig eingerückt sein.

    Aufruf:
    Code:
    python3 token_extractor.py -uXXXX -pYYYY -sde
    XXXX= E-Mail Adresse
    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:


  • mmarkus
    antwortet
    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:


  • eXec
    antwortet
    mmarkus
    Moien, war das nicht so, dass man sich alle x Tage auf der Website einloggen musste und den Account aktiv zu halten?`Ich bin mir nicht mehr sicher...

    Einen Kommentar schreiben:


  • mmarkus
    antwortet
    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:

    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]  ​
    Errorlog:

    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:


  • sipiyou
    antwortet
    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:


  • sipiyou
    antwortet
    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.

    Einen Kommentar schreiben:


  • Marino
    antwortet
    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...
    Angehängte Dateien

    Einen Kommentar schreiben:


  • Marino
    antwortet
    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:
    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​
    Curl zum S8:
    Bei anderen Seiten bekomme ich auch ganz viele Infos und keine Fehlermeldungen.
    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>​
    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.


    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:


  • sipiyou
    antwortet
    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:


  • Marino
    antwortet
    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:


  • sipiyou
    antwortet
    Schick bitte einmal die Beschattung vom LBS.

    A10 ist nur interessant, wenn du mehrere Roboter hast, sonst ist das zu ignorieren.

    Einen Kommentar schreiben:


  • Marino
    antwortet
    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:


  • sipiyou
    antwortet
    Der LBS läuft ganz normal und funktioniert wie es soll. Prüf mal die log.

    Einen Kommentar schreiben:

Lädt...
X