Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    357

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.5k

[Vorlage] Xiaomi Airpurifier 3H u.a. inkl. Token auslesen.

Geplant Angeheftet Gesperrt Verschoben JavaScript
474 Beiträge 50 Kommentatoren 101.8k Aufrufe 41 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Siggi0904S Offline
    Siggi0904S Offline
    Siggi0904
    schrieb am zuletzt editiert von
    #446

    Siehe auch https://github.com/Pittini/iobroker-nodemihome

    Da habe ich auch den Fehler gemeldet, da ich das Problem auch habe.
    Leider wurde der Fehler von @Pittini abgelehnt.

    Leider hilft auch kein neustart vom JS-Adapter.

    haselchenH 1 Antwort Letzte Antwort
    0
    • Siggi0904S Siggi0904

      Siehe auch https://github.com/Pittini/iobroker-nodemihome

      Da habe ich auch den Fehler gemeldet, da ich das Problem auch habe.
      Leider wurde der Fehler von @Pittini abgelehnt.

      Leider hilft auch kein neustart vom JS-Adapter.

      haselchenH Offline
      haselchenH Offline
      haselchen
      Most Active
      schrieb am zuletzt editiert von
      #447

      @siggi0904

      Da wurde nichts abgelehnt.
      Das möchte ich hier klarstellen. Keine Ahnung wie Du darauf kommst.
      @Pittini hat es in seinem letzten Beitrag erklärt:

      „Ja, es scheint dass da etwas an der Login Prozedur geändert wurde. Das ist sehr schade, denn der Entwickler der node-mihome reagiert schon seit Jahren nicht mehr, somit ist das Skript leider tot.“

      Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

      Siggi0904S 1 Antwort Letzte Antwort
      0
      • haselchenH haselchen

        @siggi0904

        Da wurde nichts abgelehnt.
        Das möchte ich hier klarstellen. Keine Ahnung wie Du darauf kommst.
        @Pittini hat es in seinem letzten Beitrag erklärt:

        „Ja, es scheint dass da etwas an der Login Prozedur geändert wurde. Das ist sehr schade, denn der Entwickler der node-mihome reagiert schon seit Jahren nicht mehr, somit ist das Skript leider tot.“

        Siggi0904S Offline
        Siggi0904S Offline
        Siggi0904
        schrieb am zuletzt editiert von
        #448

        @haselchen ganz entspannt. Es wurde nur darauf hingewiesen, dass ich den JS neustarten soll und dann sei das Problem behoeben. Das hatte ich getan und konnte den Fehler so nicht korrigieren.

        Nach eigener Recherche am HA-Adapter konnte ich zeigen, dass die Anmeldung auf OAuth umgestellt wurde. Im Repo von Pittini hatte ich das aufgezeigt. https://github.com/Pittini/iobroker-nodemihome/issues/77

        Und auch dort schrieb ich, dass es toll wäre, wenn sich man finden würde, der die Anmeldung umstellen würde. Da ich hierbei nicht helfen kann, wäre die Idee vom node-mihome Paket wegzugehen und es, wie HA selbst zu implementieren.

        Leider fehlen mir dazu aber die Kenntnisse.

        haselchenH 1 Antwort Letzte Antwort
        0
        • Siggi0904S Siggi0904

          @haselchen ganz entspannt. Es wurde nur darauf hingewiesen, dass ich den JS neustarten soll und dann sei das Problem behoeben. Das hatte ich getan und konnte den Fehler so nicht korrigieren.

          Nach eigener Recherche am HA-Adapter konnte ich zeigen, dass die Anmeldung auf OAuth umgestellt wurde. Im Repo von Pittini hatte ich das aufgezeigt. https://github.com/Pittini/iobroker-nodemihome/issues/77

          Und auch dort schrieb ich, dass es toll wäre, wenn sich man finden würde, der die Anmeldung umstellen würde. Da ich hierbei nicht helfen kann, wäre die Idee vom node-mihome Paket wegzugehen und es, wie HA selbst zu implementieren.

          Leider fehlen mir dazu aber die Kenntnisse.

          haselchenH Offline
          haselchenH Offline
          haselchen
          Most Active
          schrieb am zuletzt editiert von
          #449

          @siggi0904

          Ich bin (bei dem Wetter) sehr entspannt ☺️
          Nur die Wortwahl „abgelehnt“ hatte einen negativen Touch.
          Habs , wie gesagt , jetzt über HA geregelt und bring mir den DP in Iobroker.

          Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

          Siggi0904S 1 Antwort Letzte Antwort
          0
          • haselchenH haselchen

            @siggi0904

            Ich bin (bei dem Wetter) sehr entspannt ☺️
            Nur die Wortwahl „abgelehnt“ hatte einen negativen Touch.
            Habs , wie gesagt , jetzt über HA geregelt und bring mir den DP in Iobroker.

            Siggi0904S Offline
            Siggi0904S Offline
            Siggi0904
            schrieb am zuletzt editiert von Siggi0904
            #450

            @haselchen alles gut, so war das sicher nicht gemeint.

            Gibt es Entwickler, denen man das Thema Mihome vorschlagen kann?
            Denn scheinbar sind ja alle MiHome-Adapter ohne Funktion.

            Siehe auch dem Mihome-Vacuum, der auch das gleiche Problem hat.

            Ich möchte dafür ungern ein HA aufsetzen, was gefühlt viel zu groß ist
            und eigentlich eher eine Lösung für die Mihome-Geräte gefunden werden könnte.

            haselchenH 1 Antwort Letzte Antwort
            0
            • Siggi0904S Siggi0904

              @haselchen alles gut, so war das sicher nicht gemeint.

              Gibt es Entwickler, denen man das Thema Mihome vorschlagen kann?
              Denn scheinbar sind ja alle MiHome-Adapter ohne Funktion.

              Siehe auch dem Mihome-Vacuum, der auch das gleiche Problem hat.

              Ich möchte dafür ungern ein HA aufsetzen, was gefühlt viel zu groß ist
              und eigentlich eher eine Lösung für die Mihome-Geräte gefunden werden könnte.

              haselchenH Offline
              haselchenH Offline
              haselchen
              Most Active
              schrieb am zuletzt editiert von
              #451

              @siggi0904

              Sehr,sehr gute Frage.
              Man kann nur versuchen ein paar Entwickler/Tester (die mit dem Thema MI-Home schon zu tun hatten) hier zu pinnen, ob die weiter wissen.

              @dirkhe
              @apollon77
              @mcm1957
              @Meistertr

              Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

              1 Antwort Letzte Antwort
              1
              • D Offline
                D Offline
                dirkhe
                Developer
                schrieb am zuletzt editiert von
                #452

                @haselchen für den mihome-vacuum muss ich mir das anschauen, aber das ist nichts,was mal eben in ener halben stunde erledigt ist. Wen das dann mal implementiert ist,könnte man darüber nachdenken, die kommunikation in einer lib zu kapselni(ist es teilweise schon) und diese lib zu sharen

                haselchenH 1 Antwort Letzte Antwort
                0
                • D dirkhe

                  @haselchen für den mihome-vacuum muss ich mir das anschauen, aber das ist nichts,was mal eben in ener halben stunde erledigt ist. Wen das dann mal implementiert ist,könnte man darüber nachdenken, die kommunikation in einer lib zu kapselni(ist es teilweise schon) und diese lib zu sharen

                  haselchenH Offline
                  haselchenH Offline
                  haselchen
                  Most Active
                  schrieb am zuletzt editiert von haselchen
                  #453

                  @dirkhe

                  Ist ja nicht für mich 😉
                  Bei mir funktioniert alles , zwar über HA, aber es geht .
                  Dem Fragesteller @Siggi0904 geht es vielmehr um die Aktualisierung des Skriptes.
                  Ich hab euch angepinnt, weil ihr mit Xiaomi bzw. Mihome zu tun habt.

                  Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                  Siggi0904S 1 Antwort Letzte Antwort
                  0
                  • haselchenH haselchen

                    @dirkhe

                    Ist ja nicht für mich 😉
                    Bei mir funktioniert alles , zwar über HA, aber es geht .
                    Dem Fragesteller @Siggi0904 geht es vielmehr um die Aktualisierung des Skriptes.
                    Ich hab euch angepinnt, weil ihr mit Xiaomi bzw. Mihome zu tun habt.

                    Siggi0904S Offline
                    Siggi0904S Offline
                    Siggi0904
                    schrieb am zuletzt editiert von
                    #454

                    @haselchen @dirkhe ja, generell geht es um eine Bibliothek die die jeweiligen Adapter oder Scripte nutzen können. Denn die Verbindung über HA ist ja nur ein Umweg.

                    Ganz verrückt wäre ja, wenn alle MiHome-Geräte (Staubsauger, Ventilator, Sensoren etc.) in einem Adapter verwaltet werden könnten. Dann könnte man auch die Arbeiten zusammenführen und alle Entwickler können zusammenarbeiten.

                    Ist denn der Code des node-mihome Moduls für den JS-Adpater frei zugänglich und könnte geforked werden?

                    Danke.

                    1 Antwort Letzte Antwort
                    1
                    • tobasiumT Offline
                      tobasiumT Offline
                      tobasium
                      schrieb am zuletzt editiert von
                      #455

                      Also ich stelle mich gerne als Tester Bereit. Selber kann ich da leider wenig realisieren. Vielleicht können wir zu dem Thema auch einfach einen neuen Thread aufmachen ?

                      1 Antwort Letzte Antwort
                      0
                      • D Offline
                        D Offline
                        dirkhe
                        Developer
                        schrieb am zuletzt editiert von
                        #456

                        Ich habe das im mihome-vacuum adapter überarbeitet. Es funktioniert jetzt erst mal wieder. Vlt könnt ihr das script direkt bei euch mit einbinden
                        https://github.com/iobroker-community-adapters/ioBroker.mihome-vacuum/blob/master/lib/XiaomiCloudConnector.js

                        B 1 Antwort Letzte Antwort
                        0
                        • D dirkhe

                          Ich habe das im mihome-vacuum adapter überarbeitet. Es funktioniert jetzt erst mal wieder. Vlt könnt ihr das script direkt bei euch mit einbinden
                          https://github.com/iobroker-community-adapters/ioBroker.mihome-vacuum/blob/master/lib/XiaomiCloudConnector.js

                          B Offline
                          B Offline
                          Beowolf
                          schrieb am zuletzt editiert von Beowolf
                          #457

                          @dirkhe

                          Ist das richtig, das das skript hier hin kommt?

                          /opt/iobroker/node_modules/iobroker.mihome-vacuum/lib/

                          Wenn ja, der Inhalt der Datei die dort schon liegt ist identisch mit der auf github.

                          Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                          1 Antwort Letzte Antwort
                          0
                          • D Offline
                            D Offline
                            dirkhe
                            Developer
                            schrieb am zuletzt editiert von
                            #458

                            @beowolf Die überarbeitung hatte nur kurz funktioniert, das scheint nicht mehr zu gehen.
                            Als ich das oben geschrieben habe, funktionierte es noch und ich dachte, ihr könntest das in das für den allgemeinen mihome adapter einbinden. Aber hat sich ja eredigt

                            1 Antwort Letzte Antwort
                            1
                            • tobasiumT Offline
                              tobasiumT Offline
                              tobasium
                              schrieb am zuletzt editiert von tobasium
                              #459

                              Hallo Zusammen,

                              ich habe mal mit Hilfe der KI das Script von Pittini so umgebaut das es Lokal lauffähig ist.

                              Genutzt wird jetzt IP und Token. Aktuell bin ich noch am testen. Musste auch das ein oder andere Gerät in der Xiaomi App nochmal koppeln. Aber scheint sich inzwischen gefangen zu haben. Wollte glaub zuerst zu schnell übers Ziel hinaus. Weniger ist manchmal eben doch mehr.

                              Aber vielleicht will ja jemand auch nur mit einzelnen Geräten testen.

                              nodeme- 0.2.31-local.txt

                              Token hab ich aus meiner angepassten MIHome App geht aber auch mit etwas mühe über den Extractor.

                              Freu mich immer über ein Feedback.

                              haselchenH 1 Antwort Letzte Antwort
                              0
                              • tobasiumT tobasium

                                Hallo Zusammen,

                                ich habe mal mit Hilfe der KI das Script von Pittini so umgebaut das es Lokal lauffähig ist.

                                Genutzt wird jetzt IP und Token. Aktuell bin ich noch am testen. Musste auch das ein oder andere Gerät in der Xiaomi App nochmal koppeln. Aber scheint sich inzwischen gefangen zu haben. Wollte glaub zuerst zu schnell übers Ziel hinaus. Weniger ist manchmal eben doch mehr.

                                Aber vielleicht will ja jemand auch nur mit einzelnen Geräten testen.

                                nodeme- 0.2.31-local.txt

                                Token hab ich aus meiner angepassten MIHome App geht aber auch mit etwas mühe über den Extractor.

                                Freu mich immer über ein Feedback.

                                haselchenH Offline
                                haselchenH Offline
                                haselchen
                                Most Active
                                schrieb am zuletzt editiert von haselchen
                                #460

                                @tobasium

                                Moin,
                                erstmal cool , dass sich jemand gefunden hat, der sich dem Thema annimmt!!

                                Jetzt kommt der Fallstrick.
                                Der Token.
                                Ich habs mit allen Mitteln versucht.
                                Keine Chance.
                                Man muss dazu sagen, ein älteres Android Handy/Tablet wird benötigt.
                                Mein 3 Jahre altes Tablet hat die alte Mihome App nicht geöffnet.
                                Die anderen Anleitungen Linux/Docker endeten in Fehlermeldungen trotz aktuellem OS.

                                Also für den Otto-Normal-User ist das schon ne Nuss, die es zu knacken gilt :nerd_face:
                                Trotzdem Danke, dass Du da (hoffentlich) am Ball bleibst.

                                Edit:
                                Hat mir keine Ruhe gelassen.
                                Jetzt habe ich mit dem Windows Tool alle Xiaomi Daten.
                                Allerdings legt das Skript einen Ordner an, mit genau nur den Daten.
                                Name, Token....
                                Keine Geräte Daten.

                                dac0bd59-cfe2-44ce-b490-36e687edbd0b-grafik.png

                                Dazu noch ne Warnung.

                                javascript.0	2025-11-13 09:47:23.685	info	State value to set for "javascript.0.MiHomeAll.357158741.info.rssi" has to be type "number" but received type "object"
                                javascript.0	2025-11-13 09:47:23.622	warn	Read-only state "javascript.0.MiHomeAll.357158741.info.rssi" has been written without ack-flag with value "null"
                                javascript.0	2025-11-13 09:47:23.487	info	script.js.MiHome: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                javascript.0	2025-11-13 09:47:23.486	info	script.js.MiHome: Preparing device Mi Luftreiniger Pro Schlafzimmer
                                javascript.0	2025-11-13 09:47:23.486	info	script.js.MiHome: Found 1 local devices.
                                
                                

                                Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                                1 Antwort Letzte Antwort
                                0
                                • Siggi0904S Offline
                                  Siggi0904S Offline
                                  Siggi0904
                                  schrieb am zuletzt editiert von
                                  #461

                                  Ich bin auch stark daran interessiert, dass ich meine drei Xiaomi-Geräte auch wieder auslesen und steuern könnte.

                                  Vielleicht bekommt es @tobasium ja, hin die gemeldeten Themen anzugehen.

                                  @haselchen könntest du vielleicht mal beschreiben, wie das mit dem Windows-Tool funktioniert?

                                  Danke im Voraus.

                                  1 Antwort Letzte Antwort
                                  0
                                  • crunchipC Offline
                                    crunchipC Offline
                                    crunchip
                                    Forum Testing Most Active
                                    schrieb am zuletzt editiert von crunchip
                                    #462

                                    hab mich mal auch auf die schnelle daran versucht, Datenpunkte werden angelegt, sollte funktionieren, hab hier nur mal meinen 3H eingetragen

                                    const SkriptVersion = "0.3.4-fixed"; // vom 14.11.2025 - LOKALE STEUERUNG MIT TOKENS - MIoT STRUKTUR - REORGANISIERT - Power read-only
                                    
                                    const mihome = require('node-mihome');
                                    
                                    // ============================================
                                    // 🔑 KONFIGURATION - TOKENS & LOKALE IPs
                                    // ============================================
                                    // Token-Auslesen: https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor
                                    
                                    const devices = [
                                       {
                                           name: "Mi Air Purifier 3/3H",
                                           model: "zhimi.airpurifier.mb3",
                                           did: "xxxxxxxxx",
                                           localip: "10.1.1.92",
                                           token: "xxxxxxxxxxxxxxxxxxxxxxxxx",
                                           enabled: true
                                       }
                                    ];
                                    
                                    const praefix0 = "javascript.0.MiHomeDE";
                                    const refresh = 10000;
                                    const logging = true;
                                    
                                    // ============================================
                                    // DEVICE DEFINITIONS - MIoT STRUKTUR - REORGANISIERT
                                    // ============================================
                                    
                                    const DefineDevice = [];
                                    
                                    // Luftreiniger MB3 (3H)
                                    DefineDevice[0] = {
                                       model: "zhimi.airpurifier.mb3",
                                       description: "Purifier 3H",
                                       setter: {
                                           "air-purifier.mode": async function (obj, val) { 
                                               try { 
                                                   await device[obj].setMode(val);
                                                   log("✅ Mode set to: " + val);
                                               } catch(e) { 
                                                   log("❌ setMode error: " + e.message, "error"); 
                                               } 
                                           },
                                           "air-purifier.fan-level": async function (obj, val) { 
                                               try { 
                                                   await device[obj].setFanLevel(val);
                                                   log("✅ Fan level set to: " + val);
                                               } catch(e) { 
                                                   log("❌ setFanLevel error: " + e.message, "error"); 
                                               } 
                                           },
                                           "motor-speed.favorite-fan-level": async function (obj, val) { 
                                               try { 
                                                   await device[obj].setFavLevel(val);
                                                   log("✅ Favorite level set to: " + val);
                                               } catch(e) { 
                                                   log("❌ setFavLevel error: " + e.message, "error"); 
                                               } 
                                           },
                                           "indicator-light.on": async function (obj, val) { 
                                               try { 
                                                   await device[obj].setLcdBrightness(val ? 2 : 0);
                                                   log("✅ Indicator light set to: " + (val ? 'on' : 'off'));
                                               } catch(e) { 
                                                   log("❌ setLcdBrightness error: " + e.message, "error"); 
                                               } 
                                           },
                                           "physical-controls-locked.physical-controls-locked": async function (obj, val) { 
                                               try { 
                                                   await device[obj].setChildLock(val);
                                                   log("✅ Child lock set to: " + val);
                                               } catch(e) { 
                                                   log("❌ setChildLock error: " + e.message, "error"); 
                                               } 
                                           }
                                       },
                                       control: [
                                           { name: "air-purifier.on", type: "boolean", role: "switch", read: true, write: false },
                                           { name: "air-purifier.mode", type: "number", read: true, write: true, min: 0, max: 3, states: { 0: "auto", 1: "sleep", 2: "favorite", 3: "fanset" } },
                                           { name: "air-purifier.fan-level", type: "number", read: true, write: true, min: 1, max: 3 },
                                           { name: "motor-speed.favorite-fan-level", type: "number", read: true, write: true, min: 0, max: 14 },
                                           { name: "indicator-light.on", type: "boolean", role: "switch", read: true, write: true },
                                           { name: "physical-controls-locked.physical-controls-locked", type: "boolean", role: "switch", read: true, write: true }
                                       ],
                                       sensor: [
                                           { name: "alarm.alarm", type: "boolean", role: "switch", read: true, write: false },
                                           { name: "indicator-light.brightness", type: "number", read: true, write: false, min: 0, max: 2 },
                                           { name: "environment.temperature", type: "number", role: "value.temperature", read: true, write: false, unit: "°C" },
                                           { name: "motor-speed.motor-speed", type: "number", read: true, write: false, unit: "rpm" },
                                           { name: "use-time.use-time", type: "number", read: true, write: false, unit: "h" },
                                           { name: "environment.relative-humidity", type: "number", role: "value.humidity", read: true, write: false, unit: "%" },
                                           { name: "environment.pm2_5-density", type: "number", read: true, write: false, unit: "μg/m³" },
                                           { name: "filter.filter-life-level", type: "number", read: true, write: false, unit: "%" },
                                           { name: "filter.filter-used-time", type: "number", read: true, write: false, unit: "h" }
                                       ]
                                    };
                                    
                                    // ============================================
                                    // AB HIER NICHT ÄNDERN
                                    // ============================================
                                    
                                    let device = [];
                                    const States = [];
                                    let DpCount = 0;
                                    let GenericDpRefreshIntervalObj;
                                    const DefineDeviceInfo = [
                                       { id: "localip", name: "IP Address", type: "string", read: true, write: false },
                                       { id: "token", name: "Token", type: "string", read: true, write: false },
                                       { id: "did", name: "Device ID", type: "string", read: true, write: false },
                                       { id: "model", name: "Model", type: "string", read: true, write: false },
                                       { id: "isOnline", name: "Is Online", type: "boolean", read: true, write: false }
                                    ];
                                    
                                    log("Starting AllMyMi V." + SkriptVersion);
                                    log("Devices configured: " + devices.length);
                                    
                                    function CorrectChannelId(cid) {
                                       let temp = cid;
                                       if (typeof temp !== "string") {
                                           temp = JSON.stringify(cid);
                                       }
                                       temp = cid.replace(/\./g, "-");
                                       temp = cid.replace(/:/g, ".");
                                       return temp;
                                    }
                                    
                                    function PrepareGenericDps(did) {
                                       if (logging) log("Preparing generic DPs for: " + did);
                                       
                                       for (let y in DefineDeviceInfo) {
                                           States[DpCount] = {
                                               id: praefix0 + "." + did + ".info." + DefineDeviceInfo[y].id,
                                               initial: "",
                                               forceCreation: false,
                                               common: {
                                                   read: DefineDeviceInfo[y].read,
                                                   write: DefineDeviceInfo[y].write,
                                                   name: DefineDeviceInfo[y].name,
                                                   type: DefineDeviceInfo[y].type,
                                                   role: "value",
                                                   unit: DefineDeviceInfo[y].unit || ""
                                               }
                                           };
                                           DpCount++;
                                       }
                                    }
                                    
                                    function PrepareDeviceDps(did, model) {
                                       if (logging) log("Preparing device DPs for model: " + model);
                                       
                                       for (let x in DefineDevice) {
                                           if (DefineDevice[x].model === model) {
                                               // Control Datenpunkte
                                               if (DefineDevice[x].control) {
                                                   for (let y in DefineDevice[x].control) {
                                                       let channelId = CorrectChannelId(DefineDevice[x].control[y].name);
                                                       States[DpCount] = {
                                                           id: praefix0 + "." + did + ".control." + channelId,
                                                           initial: "",
                                                           forceCreation: false,
                                                           common: DefineDevice[x].control[y]
                                                       };
                                                       DpCount++;
                                                   }
                                               }
                                               
                                               // Sensor Datenpunkte
                                               if (DefineDevice[x].sensor) {
                                                   for (let y in DefineDevice[x].sensor) {
                                                       let channelId = CorrectChannelId(DefineDevice[x].sensor[y].name);
                                                       States[DpCount] = {
                                                           id: praefix0 + "." + did + ".sensor." + channelId,
                                                           initial: "",
                                                           forceCreation: false,
                                                           common: DefineDevice[x].sensor[y]
                                                       };
                                                       DpCount++;
                                                   }
                                               }
                                           }
                                       }
                                    }
                                    
                                    function CreateStates() {
                                       if (logging) log("Creating States...");
                                       let numStates = States.length;
                                       log("Total states to create: " + numStates);
                                    
                                       if (numStates === 0) {
                                           log("❌ No states to create! Check device configuration.", "error");
                                           return;
                                       }
                                    
                                       States.forEach(function (state) {
                                           createState(state.id, state.initial, state.forceCreation, state.common, function () {
                                               numStates--;
                                               if (numStates === 0) {
                                                   log("✅ " + States.length + " States created!");
                                                   
                                                   setObject(praefix0, { 
                                                       type: 'channel', 
                                                       common: { name: "MiHome Local Control" }, 
                                                       native: {} 
                                                   });
                                                   
                                                   for (let i = 0; i < devices.length; i++) {
                                                       if (devices[i].enabled) {
                                                           setObject(praefix0 + "." + devices[i].did, {
                                                               type: 'device',
                                                               common: { name: devices[i].name },
                                                               native: {}
                                                           });
                                                           
                                                           setObject(praefix0 + "." + devices[i].did + ".control", {
                                                               type: 'channel',
                                                               common: { name: "Control" },
                                                               native: {}
                                                           });
                                                           
                                                           setObject(praefix0 + "." + devices[i].did + ".sensor", {
                                                               type: 'channel',
                                                               common: { name: "Sensor" },
                                                               native: {}
                                                           });
                                                       }
                                                   }
                                                   
                                                   Init();
                                               }
                                           });
                                       });
                                    }
                                    
                                    async function Init() {
                                       log("🚀 Initializing local device connections...");
                                    
                                       mihome.miioProtocol.init();
                                    
                                       let deviceCount = 0;
                                       
                                       for (let i = 0; i < devices.length; i++) {
                                           if (!devices[i].enabled) {
                                               if (logging) log("Device " + devices[i].name + " is disabled, skipping");
                                               continue;
                                           }
                                    
                                           try {
                                               log("Connecting to: " + devices[i].name + " (" + devices[i].localip + ")");
                                               
                                               device[deviceCount] = mihome.device({
                                                   id: devices[i].did,
                                                   model: devices[i].model,
                                                   address: devices[i].localip,
                                                   token: devices[i].token,
                                                   refresh: refresh
                                               });
                                    
                                               device[deviceCount].model = devices[i].model;
                                               device[deviceCount].deviceConfig = devices[i];
                                               device[deviceCount].deviceIndex = i;
                                               device[deviceCount].isOnline = false;
                                               device[deviceCount].data = {};
                                    
                                               device[deviceCount].on('properties', (data) => {
                                                   if (typeof data !== "undefined" && Object.keys(data).length > 0) {
                                                       RefreshDps(deviceCount, data);
                                                   }
                                               });
                                    
                                               device[deviceCount].on('connected', () => {
                                                   log("✅ Device connected: " + devices[i].name);
                                                   device[deviceCount].isOnline = true;
                                                   setState(praefix0 + "." + devices[i].did + ".info.isOnline", true, true);
                                               });
                                    
                                               device[deviceCount].on('disconnected', () => {
                                                   log("⚠️ Device disconnected: " + devices[i].name);
                                                   device[deviceCount].isOnline = false;
                                                   setState(praefix0 + "." + devices[i].did + ".info.isOnline", false, true);
                                               });
                                    
                                               await device[deviceCount].init();
                                               log("✅ Device initialized: " + devices[i].name);
                                    
                                               // Set device info
                                               setState(praefix0 + "." + devices[i].did + ".info.did", devices[i].did, true);
                                               setState(praefix0 + "." + devices[i].did + ".info.model", devices[i].model, true);
                                               setState(praefix0 + "." + devices[i].did + ".info.localip", devices[i].localip, true);
                                               setState(praefix0 + "." + devices[i].did + ".info.isOnline", true, true);
                                    
                                               CreateDpTrigger(deviceCount);
                                    
                                               deviceCount++;
                                    
                                           } catch (e) {
                                               log("❌ Error connecting to " + devices[i].name + ": " + e.message, "error");
                                           }
                                       }
                                    
                                       log("✅ Initialization complete! " + deviceCount + " devices connected.");
                                    
                                       GenericDpRefreshIntervalObj = setInterval(function () {
                                           RefreshGenericDpsTicker();
                                       }, refresh);
                                    }
                                    
                                    async function RefreshGenericDpsTicker() {
                                       // Periodical status updates
                                       for (let i = 0; i < device.length; i++) {
                                           if (device[i]) {
                                               setState(praefix0 + "." + device[i].deviceConfig.did + ".info.isOnline", device[i].isOnline, true);
                                           }
                                       }
                                    }
                                    
                                    function RefreshDps(deviceIndex, data) {
                                       let deviceId = device[deviceIndex].deviceConfig.did;
                                       let model = device[deviceIndex].model;
                                    
                                       if (logging) log("Updating properties for: " + device[deviceIndex].deviceConfig.name);
                                    
                                       for (let x in DefineDevice) {
                                           if (DefineDevice[x].model === model) {
                                               // Control Datenpunkte
                                               if (DefineDevice[x].control) {
                                                   for (let y in DefineDevice[x].control) {
                                                       let propName = DefineDevice[x].control[y].name;
                                                       let propType = DefineDevice[x].control[y].type;
                                                       let channelId = CorrectChannelId(propName);
                                                       
                                                       if (data[propName] !== undefined) {
                                                           let value = data[propName];
                                                           
                                                           // TYPE CONVERSION
                                                           if (propType === "boolean") {
                                                               if (typeof value === "string") {
                                                                   value = (value === "true" || value === "on" || value === "1" || value === true || value === 1);
                                                               } else {
                                                                   value = !!value;
                                                               }
                                                           } 
                                                           else if (propType === "number") {
                                                               if (typeof value === "string") {
                                                                   value = parseFloat(value) || 0;
                                                               } else if (typeof value !== "number") {
                                                                   value = Number(value) || 0;
                                                               }
                                                           }
                                    
                                                           setState(praefix0 + "." + deviceId + ".control." + channelId, value, true);
                                                           
                                                           if (logging) log("Set control." + propName + " = " + value);
                                                       }
                                                   }
                                               }
                                               
                                               // Sensor Datenpunkte
                                               if (DefineDevice[x].sensor) {
                                                   for (let y in DefineDevice[x].sensor) {
                                                       let propName = DefineDevice[x].sensor[y].name;
                                                       let propType = DefineDevice[x].sensor[y].type;
                                                       let channelId = CorrectChannelId(propName);
                                                       
                                                       if (data[propName] !== undefined) {
                                                           let value = data[propName];
                                                           
                                                           // TYPE CONVERSION
                                                           if (propType === "boolean") {
                                                               if (typeof value === "string") {
                                                                   value = (value === "true" || value === "on" || value === "1" || value === true || value === 1);
                                                               } else {
                                                                   value = !!value;
                                                               }
                                                           } 
                                                           else if (propType === "number") {
                                                               if (typeof value === "string") {
                                                                   value = parseFloat(value) || 0;
                                                               } else if (typeof value !== "number") {
                                                                   value = Number(value) || 0;
                                                               }
                                                           }
                                    
                                                           setState(praefix0 + "." + deviceId + ".sensor." + channelId, value, true);
                                                           
                                                           if (logging) log("Set sensor." + propName + " = " + value);
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                    }
                                    
                                    function CreateDpTrigger(deviceIndex) {
                                       let deviceId = device[deviceIndex].deviceConfig.did;
                                       let model = device[deviceIndex].model;
                                    
                                       for (let x in DefineDevice) {
                                           if (DefineDevice[x].model === model) {
                                               // Nur Control Datenpunkte sind steuerbar
                                               if (DefineDevice[x].control) {
                                                   for (let y in DefineDevice[x].control) {
                                                       if (DefineDevice[x].control[y].write) {
                                                           let propName = DefineDevice[x].control[y].name;
                                                           let channelId = CorrectChannelId(propName);
                                                           let dpPath = praefix0 + "." + deviceId + ".control." + channelId;
                                    
                                                           on({ id: dpPath, change: "ne", ack: false }, function (dp) {
                                                               if (logging) log("Command received: " + propName + " = " + dp.state.val);
                                                               
                                                               if (DefineDevice[x].setter[propName]) {
                                                                   DefineDevice[x].setter[propName](deviceIndex, dp.state.val);
                                                               }
                                                           });
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                    }
                                    
                                    onStop(function () {
                                       log("Stopping script...");
                                       for (let x in device) {
                                           if (device[x]) {
                                               try {
                                                   device[x].destroy();
                                               } catch(e) {
                                                   log("Error destroying device: " + e.message);
                                               }
                                           }
                                       }
                                       if (GenericDpRefreshIntervalObj) {
                                           clearInterval(GenericDpRefreshIntervalObj);
                                       }
                                    }, 10);
                                    
                                    // ============================================
                                    // SCRIPT START
                                    // ============================================
                                    log("Configuration:");
                                    log("- Devices: " + devices.length);
                                    log("- Refresh: " + refresh + "ms");
                                    log("- Root path: " + praefix0);
                                    
                                    // Prepare datapoints
                                    for (let i = 0; i < devices.length; i++) {
                                       if (devices[i].enabled) {
                                           log("📝 Preparing DPs for: " + devices[i].name);
                                           PrepareGenericDps(devices[i].did);
                                           PrepareDeviceDps(devices[i].did, devices[i].model);
                                       }
                                    }
                                    
                                    log("🔍 Total datapoints prepared: " + DpCount);
                                    
                                    CreateStates();
                                    

                                    Edit:
                                    hab das Script jetzt nochmal angepasst, vom einfachen miIO-Protocol wieder auf die Original MIoT-Struktur
                                    Steuerung funktioniert wieder, Sensordaten werden allerdings nicht ausgelesen

                                    umgestiegen von Proxmox auf Unraid

                                    haselchenH 1 Antwort Letzte Antwort
                                    1
                                    • crunchipC crunchip

                                      hab mich mal auch auf die schnelle daran versucht, Datenpunkte werden angelegt, sollte funktionieren, hab hier nur mal meinen 3H eingetragen

                                      const SkriptVersion = "0.3.4-fixed"; // vom 14.11.2025 - LOKALE STEUERUNG MIT TOKENS - MIoT STRUKTUR - REORGANISIERT - Power read-only
                                      
                                      const mihome = require('node-mihome');
                                      
                                      // ============================================
                                      // 🔑 KONFIGURATION - TOKENS & LOKALE IPs
                                      // ============================================
                                      // Token-Auslesen: https://github.com/PiotrMachowski/Xiaomi-cloud-tokens-extractor
                                      
                                      const devices = [
                                         {
                                             name: "Mi Air Purifier 3/3H",
                                             model: "zhimi.airpurifier.mb3",
                                             did: "xxxxxxxxx",
                                             localip: "10.1.1.92",
                                             token: "xxxxxxxxxxxxxxxxxxxxxxxxx",
                                             enabled: true
                                         }
                                      ];
                                      
                                      const praefix0 = "javascript.0.MiHomeDE";
                                      const refresh = 10000;
                                      const logging = true;
                                      
                                      // ============================================
                                      // DEVICE DEFINITIONS - MIoT STRUKTUR - REORGANISIERT
                                      // ============================================
                                      
                                      const DefineDevice = [];
                                      
                                      // Luftreiniger MB3 (3H)
                                      DefineDevice[0] = {
                                         model: "zhimi.airpurifier.mb3",
                                         description: "Purifier 3H",
                                         setter: {
                                             "air-purifier.mode": async function (obj, val) { 
                                                 try { 
                                                     await device[obj].setMode(val);
                                                     log("✅ Mode set to: " + val);
                                                 } catch(e) { 
                                                     log("❌ setMode error: " + e.message, "error"); 
                                                 } 
                                             },
                                             "air-purifier.fan-level": async function (obj, val) { 
                                                 try { 
                                                     await device[obj].setFanLevel(val);
                                                     log("✅ Fan level set to: " + val);
                                                 } catch(e) { 
                                                     log("❌ setFanLevel error: " + e.message, "error"); 
                                                 } 
                                             },
                                             "motor-speed.favorite-fan-level": async function (obj, val) { 
                                                 try { 
                                                     await device[obj].setFavLevel(val);
                                                     log("✅ Favorite level set to: " + val);
                                                 } catch(e) { 
                                                     log("❌ setFavLevel error: " + e.message, "error"); 
                                                 } 
                                             },
                                             "indicator-light.on": async function (obj, val) { 
                                                 try { 
                                                     await device[obj].setLcdBrightness(val ? 2 : 0);
                                                     log("✅ Indicator light set to: " + (val ? 'on' : 'off'));
                                                 } catch(e) { 
                                                     log("❌ setLcdBrightness error: " + e.message, "error"); 
                                                 } 
                                             },
                                             "physical-controls-locked.physical-controls-locked": async function (obj, val) { 
                                                 try { 
                                                     await device[obj].setChildLock(val);
                                                     log("✅ Child lock set to: " + val);
                                                 } catch(e) { 
                                                     log("❌ setChildLock error: " + e.message, "error"); 
                                                 } 
                                             }
                                         },
                                         control: [
                                             { name: "air-purifier.on", type: "boolean", role: "switch", read: true, write: false },
                                             { name: "air-purifier.mode", type: "number", read: true, write: true, min: 0, max: 3, states: { 0: "auto", 1: "sleep", 2: "favorite", 3: "fanset" } },
                                             { name: "air-purifier.fan-level", type: "number", read: true, write: true, min: 1, max: 3 },
                                             { name: "motor-speed.favorite-fan-level", type: "number", read: true, write: true, min: 0, max: 14 },
                                             { name: "indicator-light.on", type: "boolean", role: "switch", read: true, write: true },
                                             { name: "physical-controls-locked.physical-controls-locked", type: "boolean", role: "switch", read: true, write: true }
                                         ],
                                         sensor: [
                                             { name: "alarm.alarm", type: "boolean", role: "switch", read: true, write: false },
                                             { name: "indicator-light.brightness", type: "number", read: true, write: false, min: 0, max: 2 },
                                             { name: "environment.temperature", type: "number", role: "value.temperature", read: true, write: false, unit: "°C" },
                                             { name: "motor-speed.motor-speed", type: "number", read: true, write: false, unit: "rpm" },
                                             { name: "use-time.use-time", type: "number", read: true, write: false, unit: "h" },
                                             { name: "environment.relative-humidity", type: "number", role: "value.humidity", read: true, write: false, unit: "%" },
                                             { name: "environment.pm2_5-density", type: "number", read: true, write: false, unit: "μg/m³" },
                                             { name: "filter.filter-life-level", type: "number", read: true, write: false, unit: "%" },
                                             { name: "filter.filter-used-time", type: "number", read: true, write: false, unit: "h" }
                                         ]
                                      };
                                      
                                      // ============================================
                                      // AB HIER NICHT ÄNDERN
                                      // ============================================
                                      
                                      let device = [];
                                      const States = [];
                                      let DpCount = 0;
                                      let GenericDpRefreshIntervalObj;
                                      const DefineDeviceInfo = [
                                         { id: "localip", name: "IP Address", type: "string", read: true, write: false },
                                         { id: "token", name: "Token", type: "string", read: true, write: false },
                                         { id: "did", name: "Device ID", type: "string", read: true, write: false },
                                         { id: "model", name: "Model", type: "string", read: true, write: false },
                                         { id: "isOnline", name: "Is Online", type: "boolean", read: true, write: false }
                                      ];
                                      
                                      log("Starting AllMyMi V." + SkriptVersion);
                                      log("Devices configured: " + devices.length);
                                      
                                      function CorrectChannelId(cid) {
                                         let temp = cid;
                                         if (typeof temp !== "string") {
                                             temp = JSON.stringify(cid);
                                         }
                                         temp = cid.replace(/\./g, "-");
                                         temp = cid.replace(/:/g, ".");
                                         return temp;
                                      }
                                      
                                      function PrepareGenericDps(did) {
                                         if (logging) log("Preparing generic DPs for: " + did);
                                         
                                         for (let y in DefineDeviceInfo) {
                                             States[DpCount] = {
                                                 id: praefix0 + "." + did + ".info." + DefineDeviceInfo[y].id,
                                                 initial: "",
                                                 forceCreation: false,
                                                 common: {
                                                     read: DefineDeviceInfo[y].read,
                                                     write: DefineDeviceInfo[y].write,
                                                     name: DefineDeviceInfo[y].name,
                                                     type: DefineDeviceInfo[y].type,
                                                     role: "value",
                                                     unit: DefineDeviceInfo[y].unit || ""
                                                 }
                                             };
                                             DpCount++;
                                         }
                                      }
                                      
                                      function PrepareDeviceDps(did, model) {
                                         if (logging) log("Preparing device DPs for model: " + model);
                                         
                                         for (let x in DefineDevice) {
                                             if (DefineDevice[x].model === model) {
                                                 // Control Datenpunkte
                                                 if (DefineDevice[x].control) {
                                                     for (let y in DefineDevice[x].control) {
                                                         let channelId = CorrectChannelId(DefineDevice[x].control[y].name);
                                                         States[DpCount] = {
                                                             id: praefix0 + "." + did + ".control." + channelId,
                                                             initial: "",
                                                             forceCreation: false,
                                                             common: DefineDevice[x].control[y]
                                                         };
                                                         DpCount++;
                                                     }
                                                 }
                                                 
                                                 // Sensor Datenpunkte
                                                 if (DefineDevice[x].sensor) {
                                                     for (let y in DefineDevice[x].sensor) {
                                                         let channelId = CorrectChannelId(DefineDevice[x].sensor[y].name);
                                                         States[DpCount] = {
                                                             id: praefix0 + "." + did + ".sensor." + channelId,
                                                             initial: "",
                                                             forceCreation: false,
                                                             common: DefineDevice[x].sensor[y]
                                                         };
                                                         DpCount++;
                                                     }
                                                 }
                                             }
                                         }
                                      }
                                      
                                      function CreateStates() {
                                         if (logging) log("Creating States...");
                                         let numStates = States.length;
                                         log("Total states to create: " + numStates);
                                      
                                         if (numStates === 0) {
                                             log("❌ No states to create! Check device configuration.", "error");
                                             return;
                                         }
                                      
                                         States.forEach(function (state) {
                                             createState(state.id, state.initial, state.forceCreation, state.common, function () {
                                                 numStates--;
                                                 if (numStates === 0) {
                                                     log("✅ " + States.length + " States created!");
                                                     
                                                     setObject(praefix0, { 
                                                         type: 'channel', 
                                                         common: { name: "MiHome Local Control" }, 
                                                         native: {} 
                                                     });
                                                     
                                                     for (let i = 0; i < devices.length; i++) {
                                                         if (devices[i].enabled) {
                                                             setObject(praefix0 + "." + devices[i].did, {
                                                                 type: 'device',
                                                                 common: { name: devices[i].name },
                                                                 native: {}
                                                             });
                                                             
                                                             setObject(praefix0 + "." + devices[i].did + ".control", {
                                                                 type: 'channel',
                                                                 common: { name: "Control" },
                                                                 native: {}
                                                             });
                                                             
                                                             setObject(praefix0 + "." + devices[i].did + ".sensor", {
                                                                 type: 'channel',
                                                                 common: { name: "Sensor" },
                                                                 native: {}
                                                             });
                                                         }
                                                     }
                                                     
                                                     Init();
                                                 }
                                             });
                                         });
                                      }
                                      
                                      async function Init() {
                                         log("🚀 Initializing local device connections...");
                                      
                                         mihome.miioProtocol.init();
                                      
                                         let deviceCount = 0;
                                         
                                         for (let i = 0; i < devices.length; i++) {
                                             if (!devices[i].enabled) {
                                                 if (logging) log("Device " + devices[i].name + " is disabled, skipping");
                                                 continue;
                                             }
                                      
                                             try {
                                                 log("Connecting to: " + devices[i].name + " (" + devices[i].localip + ")");
                                                 
                                                 device[deviceCount] = mihome.device({
                                                     id: devices[i].did,
                                                     model: devices[i].model,
                                                     address: devices[i].localip,
                                                     token: devices[i].token,
                                                     refresh: refresh
                                                 });
                                      
                                                 device[deviceCount].model = devices[i].model;
                                                 device[deviceCount].deviceConfig = devices[i];
                                                 device[deviceCount].deviceIndex = i;
                                                 device[deviceCount].isOnline = false;
                                                 device[deviceCount].data = {};
                                      
                                                 device[deviceCount].on('properties', (data) => {
                                                     if (typeof data !== "undefined" && Object.keys(data).length > 0) {
                                                         RefreshDps(deviceCount, data);
                                                     }
                                                 });
                                      
                                                 device[deviceCount].on('connected', () => {
                                                     log("✅ Device connected: " + devices[i].name);
                                                     device[deviceCount].isOnline = true;
                                                     setState(praefix0 + "." + devices[i].did + ".info.isOnline", true, true);
                                                 });
                                      
                                                 device[deviceCount].on('disconnected', () => {
                                                     log("⚠️ Device disconnected: " + devices[i].name);
                                                     device[deviceCount].isOnline = false;
                                                     setState(praefix0 + "." + devices[i].did + ".info.isOnline", false, true);
                                                 });
                                      
                                                 await device[deviceCount].init();
                                                 log("✅ Device initialized: " + devices[i].name);
                                      
                                                 // Set device info
                                                 setState(praefix0 + "." + devices[i].did + ".info.did", devices[i].did, true);
                                                 setState(praefix0 + "." + devices[i].did + ".info.model", devices[i].model, true);
                                                 setState(praefix0 + "." + devices[i].did + ".info.localip", devices[i].localip, true);
                                                 setState(praefix0 + "." + devices[i].did + ".info.isOnline", true, true);
                                      
                                                 CreateDpTrigger(deviceCount);
                                      
                                                 deviceCount++;
                                      
                                             } catch (e) {
                                                 log("❌ Error connecting to " + devices[i].name + ": " + e.message, "error");
                                             }
                                         }
                                      
                                         log("✅ Initialization complete! " + deviceCount + " devices connected.");
                                      
                                         GenericDpRefreshIntervalObj = setInterval(function () {
                                             RefreshGenericDpsTicker();
                                         }, refresh);
                                      }
                                      
                                      async function RefreshGenericDpsTicker() {
                                         // Periodical status updates
                                         for (let i = 0; i < device.length; i++) {
                                             if (device[i]) {
                                                 setState(praefix0 + "." + device[i].deviceConfig.did + ".info.isOnline", device[i].isOnline, true);
                                             }
                                         }
                                      }
                                      
                                      function RefreshDps(deviceIndex, data) {
                                         let deviceId = device[deviceIndex].deviceConfig.did;
                                         let model = device[deviceIndex].model;
                                      
                                         if (logging) log("Updating properties for: " + device[deviceIndex].deviceConfig.name);
                                      
                                         for (let x in DefineDevice) {
                                             if (DefineDevice[x].model === model) {
                                                 // Control Datenpunkte
                                                 if (DefineDevice[x].control) {
                                                     for (let y in DefineDevice[x].control) {
                                                         let propName = DefineDevice[x].control[y].name;
                                                         let propType = DefineDevice[x].control[y].type;
                                                         let channelId = CorrectChannelId(propName);
                                                         
                                                         if (data[propName] !== undefined) {
                                                             let value = data[propName];
                                                             
                                                             // TYPE CONVERSION
                                                             if (propType === "boolean") {
                                                                 if (typeof value === "string") {
                                                                     value = (value === "true" || value === "on" || value === "1" || value === true || value === 1);
                                                                 } else {
                                                                     value = !!value;
                                                                 }
                                                             } 
                                                             else if (propType === "number") {
                                                                 if (typeof value === "string") {
                                                                     value = parseFloat(value) || 0;
                                                                 } else if (typeof value !== "number") {
                                                                     value = Number(value) || 0;
                                                                 }
                                                             }
                                      
                                                             setState(praefix0 + "." + deviceId + ".control." + channelId, value, true);
                                                             
                                                             if (logging) log("Set control." + propName + " = " + value);
                                                         }
                                                     }
                                                 }
                                                 
                                                 // Sensor Datenpunkte
                                                 if (DefineDevice[x].sensor) {
                                                     for (let y in DefineDevice[x].sensor) {
                                                         let propName = DefineDevice[x].sensor[y].name;
                                                         let propType = DefineDevice[x].sensor[y].type;
                                                         let channelId = CorrectChannelId(propName);
                                                         
                                                         if (data[propName] !== undefined) {
                                                             let value = data[propName];
                                                             
                                                             // TYPE CONVERSION
                                                             if (propType === "boolean") {
                                                                 if (typeof value === "string") {
                                                                     value = (value === "true" || value === "on" || value === "1" || value === true || value === 1);
                                                                 } else {
                                                                     value = !!value;
                                                                 }
                                                             } 
                                                             else if (propType === "number") {
                                                                 if (typeof value === "string") {
                                                                     value = parseFloat(value) || 0;
                                                                 } else if (typeof value !== "number") {
                                                                     value = Number(value) || 0;
                                                                 }
                                                             }
                                      
                                                             setState(praefix0 + "." + deviceId + ".sensor." + channelId, value, true);
                                                             
                                                             if (logging) log("Set sensor." + propName + " = " + value);
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                      }
                                      
                                      function CreateDpTrigger(deviceIndex) {
                                         let deviceId = device[deviceIndex].deviceConfig.did;
                                         let model = device[deviceIndex].model;
                                      
                                         for (let x in DefineDevice) {
                                             if (DefineDevice[x].model === model) {
                                                 // Nur Control Datenpunkte sind steuerbar
                                                 if (DefineDevice[x].control) {
                                                     for (let y in DefineDevice[x].control) {
                                                         if (DefineDevice[x].control[y].write) {
                                                             let propName = DefineDevice[x].control[y].name;
                                                             let channelId = CorrectChannelId(propName);
                                                             let dpPath = praefix0 + "." + deviceId + ".control." + channelId;
                                      
                                                             on({ id: dpPath, change: "ne", ack: false }, function (dp) {
                                                                 if (logging) log("Command received: " + propName + " = " + dp.state.val);
                                                                 
                                                                 if (DefineDevice[x].setter[propName]) {
                                                                     DefineDevice[x].setter[propName](deviceIndex, dp.state.val);
                                                                 }
                                                             });
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                      }
                                      
                                      onStop(function () {
                                         log("Stopping script...");
                                         for (let x in device) {
                                             if (device[x]) {
                                                 try {
                                                     device[x].destroy();
                                                 } catch(e) {
                                                     log("Error destroying device: " + e.message);
                                                 }
                                             }
                                         }
                                         if (GenericDpRefreshIntervalObj) {
                                             clearInterval(GenericDpRefreshIntervalObj);
                                         }
                                      }, 10);
                                      
                                      // ============================================
                                      // SCRIPT START
                                      // ============================================
                                      log("Configuration:");
                                      log("- Devices: " + devices.length);
                                      log("- Refresh: " + refresh + "ms");
                                      log("- Root path: " + praefix0);
                                      
                                      // Prepare datapoints
                                      for (let i = 0; i < devices.length; i++) {
                                         if (devices[i].enabled) {
                                             log("📝 Preparing DPs for: " + devices[i].name);
                                             PrepareGenericDps(devices[i].did);
                                             PrepareDeviceDps(devices[i].did, devices[i].model);
                                         }
                                      }
                                      
                                      log("🔍 Total datapoints prepared: " + DpCount);
                                      
                                      CreateStates();
                                      

                                      Edit:
                                      hab das Script jetzt nochmal angepasst, vom einfachen miIO-Protocol wieder auf die Original MIoT-Struktur
                                      Steuerung funktioniert wieder, Sensordaten werden allerdings nicht ausgelesen

                                      haselchenH Offline
                                      haselchenH Offline
                                      haselchen
                                      Most Active
                                      schrieb am zuletzt editiert von haselchen
                                      #463

                                      @crunchip

                                      Was hast Du am Skript verändert?
                                      Außer dem Datenpunkt.

                                      Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                                      crunchipC 1 Antwort Letzte Antwort
                                      0
                                      • haselchenH haselchen

                                        @crunchip

                                        Was hast Du am Skript verändert?
                                        Außer dem Datenpunkt.

                                        crunchipC Offline
                                        crunchipC Offline
                                        crunchip
                                        Forum Testing Most Active
                                        schrieb am zuletzt editiert von crunchip
                                        #464

                                        @haselchen was meinst du mit nur dem Datenpunkt.
                                        Habe das ursprüngliche Script hergekommen und so wie @tobasium mittels perplexity ein neues erstellen lassen

                                        Probleme waren

                                        • Xiaomi hat ihre APIs mehrfach geändert

                                        • Authentifizierungsmethoden sind nicht mehr aktuell

                                        • 2FA könnte blockierend sein

                                        Problem Lösung
                                        Session ungültig ✅await mihome.miCloudProtocol.logout()vor Login
                                        Fehler wird ignoriert ✅ Proper Exception Handling mitloginSuccessFlag
                                        Keine Fehlerbehandlung ✅ Aussagekräftige Error-Messages
                                        Script läuft weiter ✅returnnach Login-Fehler

                                        Was der neue Code macht:
                                        ✅ Zeigt genau, wo der Login fehlschlägt

                                        ✅ Gibt die Credentials an (für Debugging)

                                        ✅ Zeigt ob node-mihome korrekt geladen ist

                                        ✅ Listet eine Fehlerbeseitungs-Checkliste auf

                                        ✅ Gibt komplette Error-Details aus

                                        ⚠️ Wichtig - Häufige Fehler:
                                        ❌ Token zu kurz/lang → Muss exakt 32 Zeichen sein
                                        ❌ IP falsch → Muss die lokale IP sein (z.B. 192.168.x.x), nicht die Cloud-ID
                                        ❌ Model falsch → Aus Extractor kopieren, exakt!
                                        ❌ Gerät offline → Device muss erreichbar sein

                                        umgestiegen von Proxmox auf Unraid

                                        haselchenH 1 Antwort Letzte Antwort
                                        1
                                        • crunchipC crunchip

                                          @haselchen was meinst du mit nur dem Datenpunkt.
                                          Habe das ursprüngliche Script hergekommen und so wie @tobasium mittels perplexity ein neues erstellen lassen

                                          Probleme waren

                                          • Xiaomi hat ihre APIs mehrfach geändert

                                          • Authentifizierungsmethoden sind nicht mehr aktuell

                                          • 2FA könnte blockierend sein

                                          Problem Lösung
                                          Session ungültig ✅await mihome.miCloudProtocol.logout()vor Login
                                          Fehler wird ignoriert ✅ Proper Exception Handling mitloginSuccessFlag
                                          Keine Fehlerbehandlung ✅ Aussagekräftige Error-Messages
                                          Script läuft weiter ✅returnnach Login-Fehler

                                          Was der neue Code macht:
                                          ✅ Zeigt genau, wo der Login fehlschlägt

                                          ✅ Gibt die Credentials an (für Debugging)

                                          ✅ Zeigt ob node-mihome korrekt geladen ist

                                          ✅ Listet eine Fehlerbeseitungs-Checkliste auf

                                          ✅ Gibt komplette Error-Details aus

                                          ⚠️ Wichtig - Häufige Fehler:
                                          ❌ Token zu kurz/lang → Muss exakt 32 Zeichen sein
                                          ❌ IP falsch → Muss die lokale IP sein (z.B. 192.168.x.x), nicht die Cloud-ID
                                          ❌ Model falsch → Aus Extractor kopieren, exakt!
                                          ❌ Gerät offline → Device muss erreichbar sein

                                          haselchenH Offline
                                          haselchenH Offline
                                          haselchen
                                          Most Active
                                          schrieb am zuletzt editiert von
                                          #465

                                          @crunchip

                                          Dann hast Du nicht sein Skript genommen?!
                                          Okay , dann muss ich eure Beiden vergleichen , wo die Unterschiede sind .

                                          Synology DS218+ & 2 x Fujitsu Esprimo (VM/Container) + FritzBox7590 + 2 AVM 3000 Repeater & Homematic & HUE & Osram & Xiaomi, NPM 10.9.4, Nodejs 22.21.0 ,JS Controller 7.0.7 ,Admin 7.7.19

                                          crunchipC 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          478

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe