Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Test Adapter Midea Dimstal Klimaanlagen v0.0.x

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Test Adapter Midea Dimstal Klimaanlagen v0.0.x

    This topic has been deleted. Only users with topic management privileges can see it.
    • BananaJoe
      BananaJoe Most Active @Markus 8 last edited by

      @markus-8 öhm? Ich bin nicht sicher ob ich dein Problem richtig verstehe.
      Du willst es über Alexa einbinden?

      • Geräte in der "NetHome Plus" App hinzufügen und passend benennen ("Klimanlage Wohnzimmer", "Klimaanlage Schlafzimmer"
      • Alexa Skill aktivieren: https://www.amazon.de/Nethome-Plus-Smart-Home-Skill/dp/B07HR9CW1Y und mit dem NetHome Konto verknüpfen. Die Klimaanlagen sollten danach in der Alexa App auftauchen und steuerbar sein.

      Zum steuern per ioBroker an ein beliebiges Echo-Gerät in den Datenpunkt "textCommand", z.B.

      alexa2.0.Echo-Devices.G090RXXXXXXXXXX.Commands.textCommand
      

      das gleiche schreiben was du sonst sagen würdest:

      • "schalte Klimaanlage Wohnzimmer ein"
      • "setze Klimaanlage Schlafzimmer auf 23 Grad"
        usw.

      Du willst die Werte der Klimaanlage in ioBroker haben? Installiere diesen Adapter hier und richte diesen mit deinen Zugangsdaten aus der App ein. Abfragen klappt scheinbar immer.
      Ob du über die Datenpunkte steuern kannst, musst du ausprobieren - wenn es nicht geht, gehe halt dafür den Alexa-Weg.

      M 3 Replies Last reply Reply Quote 0
      • M
        Markus 8 @BananaJoe last edited by

        @bananajoe Ich bin nicht Fit mit dem getexte bin schon Älter und englisch nun Ja Du hattes oben einen Beitrag
        Dimstal klimanlage / Nethome app / Mideon adapter und hast es mit alexa verknüpft und da kontest du rüber steuern auch im Io broker mittels Skipt. So und so hatte ich es auch sorichtig rund gelaufen ist die sache nie aber irgend wie ging schonmal die nachtabsenkung und mit glück konnte ich über Vis auch mal die Teperatur ändern. Da in letzter zeit garnichts merh ging habe ich ich mal alles möglich gelöscht und neu aufgesetzt. nun habe ich das Problem das ich die klimanlage ( Dimstal) vom mideon adapter nicht mehr in IOT.0 in die Alexageräte bekomme und ich meine mich zu erinnern das ich damals was gefunden hatte wo man in der mideon app bzw. der dort vorhandenen Klimaanlage in irgend einem datenpunkt etwas hizufügen muss ( geschweifte klammern, ein ganzes wort oder sowas und dann frist IOT das dan bei den Alexageräten da fehlt mir also was hoffe du erätst 🙂 was ich meine

        1 Reply Last reply Reply Quote 0
        • M
          Markus 8 @BananaJoe last edited by

          @bananajoe Die Klima ist schon in alexa und im iobroker auch in der Midea App so und ein bischen steuern nonte ich mittels Skript boar frag mich sämtliche daten konte ich unter Iobroker im Ordner alexa Smarthomgeräte finden und mer schlecht als recht steuern irgend wie bekomme ich die klima da aber nicht mehr hin mit Ihren ganzen datenpunkten und die adpterversionen habe ich nicht geändert ich bin schwierig ich weiß wende mich daher auch selten an euch

          Thomas Braun 1 Reply Last reply Reply Quote 0
          • Thomas Braun
            Thomas Braun Most Active @Markus 8 last edited by

            @markus-8

            So ein paar Satzzeichen, Absätze usw. würden den ganzen Sermon vielleicht besser lesbar machen...

            M 1 Reply Last reply Reply Quote 2
            • M
              Markus 8 @BananaJoe last edited by

              @bananajoe OK stelle die frage mal anders :Dimstal Klimanlage die In medion und Alexa vorhanden ist wie bekomme ich dise auch in den IOT.= adapter unter Smarthomegeräte das versteht man glaube ich besser.

              BananaJoe 1 Reply Last reply Reply Quote 0
              • M
                Markus 8 @Thomas Braun last edited by

                @thomas-braun Habt Mitleid mit mir ich poste eigendlich nie was Ich bin zeitalter C64

                Thomas Braun 1 Reply Last reply Reply Quote 0
                • Thomas Braun
                  Thomas Braun Most Active @Markus 8 last edited by

                  @markus-8 Und damals gab es keine Satzzeichen?

                  M 1 Reply Last reply Reply Quote 0
                  • M
                    Markus 8 @Thomas Braun last edited by

                    @thomas-braun Meine Fresse sind wir im rechtschreibkurs das kotzt mich an bin dan mal raus

                    Thomas Braun 1 Reply Last reply Reply Quote 0
                    • Thomas Braun
                      Thomas Braun Most Active @Markus 8 last edited by

                      @markus-8 Tschüss!

                      1 Reply Last reply Reply Quote 0
                      • BananaJoe
                        BananaJoe Most Active @Markus 8 last edited by

                        @markus-8 sagte in Test Adapter Midea Dimstal Klimaanlagen v0.0.x:

                        @bananajoe OK stelle die frage mal anders :Dimstal Klimanlage die In medion und Alexa vorhanden ist wie bekomme ich dise auch in den IOT.= adapter unter Smarthomegeräte das versteht man glaube ich besser.

                        Du meinst den iobroker.iot Adapter oder und was genau in dem Adapter ich nutze den Adapter eigentlich nur um beliebiges als Gerät in Alexa / des Echos darzustellen denn du kannst dir ja einen belieben Datenpunkt vom Typ "Logikwert" anlegen, z.B. 0_userdata.0.Wohnzimmer.Klimaanlage und diesen dann im iot-Adapter als Alexa-Gerät darstellen und dann machts du ein Skript was auf den Datenpunkt reagiert was also die eigentliche Arbeit macht aber warum denn überhaupt den iot.0 denn die Klimaanlagen können doch nativ Alexa (oder Google) und ja, wenn du alles immer in einem Satz schreibst ist es schwer zu lesen und zu verstehen denn auch ich finde ein paar mal Enter/Return würde schon helfen.

                        1 Reply Last reply Reply Quote 0
                        • BananaJoe
                          BananaJoe Most Active last edited by BananaJoe

                          Ich habe hier mal ein Update zur Steuerung meiner Dimstal-Anlage. Die kann ich mit diesem Adapter (oder über den HAM-Weg) zwar abrufen, aber nicht steuern.
                          Und zwar habe ich noch eine andere CLI-gefunden welche erheblich(!) schneller reagiert als die midea-beautiful-air-cli die ich in einem Beitrag weiter oben erwähnt (und modifiziert habe):

                          https://pypi.org/project/msmart-ng/

                          lässt ebenfalls einfach per pip installieren:

                          pip install msmart-ng
                          

                          Ein

                          msmart-ng discover
                          

                          findet auch die Geräte im lokalen Netzwerk. Da diese CLI ohne Zugansdaten zur Cloud auskommt, sieht man in der Ausgabe dann halt keine Gerätenamen. Statt des Discover (welches das wohl auch immer ein neues Token + Key erzeugt) kann man auch die Daten nehmen die man schon von der midea-beautiful-air-cli nutzt.

                          Die Steuerung ist ggf. etwas rudimentär, wenn man das in ein eigenes Python-Skript einbindet geht ggf. mehr.
                          Ich habe jedenfalls 20 Minuten im Quellcode herumgesucht bis ich den simplen "Power On" bzw. "Power Off" Mechanismus gefunden habe.

                          Ich selbe brauche nicht viel mehr als Ein- und Aus, das ginge mit

                          msmart-ng control --token c19a404c808656a83c...08f19efc0b6a5 --key d714e6c7ad56...ea32d44776474fb --id 534971451351917 -d 192.168.1.30 power_state=True
                          

                          oder eben power_state=False

                          Temperatur ginge mit

                          msmart-ng control --token c19a404c808656a83c...08f19efc0b6a5 --key d714e6c7ad56...ea32d44776474fb --id 534971451351917 -d 192.168.1.30 target_temperature=23
                          

                          mehrere Parameter lassen sich verbinden.

                          Weitere Parameter stehen in den Beispielen auf der Webseite bzw. habe ich mir (wie den korrekten Namen der Power-Funktion) aus dem Quellcode gesucht (ab Zeile 75): https://github.com/mill1000/midea-msmart/blob/main/msmart/device/AC/device.py

                          Der Befehl kann auch den Status abfragen, leider ist die Rückgabe vom Format her ein ziemlicher Müll:

                          INFO:msmart.lan:Creating new connection to 192.168.1.29:6444.
                          INFO:msmart.lan:Authenticating with 192.168.1.29:6444.
                          INFO:msmart.lan:Authentication with 192.168.1.29:6444 successful. Expiration: 2024-08-01T23:18:52+00:00, Local key: 95193cc436284c72a20aefd9411d299320e9e6a963e140a8f1f17028d141c83b
                          INFO:msmart.cli:Querying device state.
                          INFO:msmart.cli:{'ip': '192.168.1.29', 'port': 6444, 'id': 534971917145135, 'online': True, 'supported': True, 'type': <DeviceType.AIR_CONDITIONER: 172>, 'name': None, 'sn': None, 'key': '37c4b...24a16', 'token': '0cfd4e93fdec...9943c49', 'power': False, 'mode': <OperationalMode.COOL: 2>, 'fan_speed': <FanSpeed.AUTO: 102>, 'swing_mode': <SwingMode.BOTH: 15>, 'horizontal_swing_angle': <SwingAngle.OFF: 0>, 'vertical_swing_angle': <SwingAngle.OFF: 0>, 'target_temperature': 22.0, 'indoor_temperature': 25.0, 'outdoor_temperature': 29.2, 'target_humidity': 0, 'indoor_humidity': None, 'eco': False, 'turbo': False, 'freeze_protection': False, 'sleep': False, 'display_on': True, 'beep': False, 'fahrenheit': False, 'filter_alert': False, 'follow_me': False, 'purifier': False, 'self_clean': False, 'total_energy_usage': None, 'current_energy_usage': None, 'real_time_power_usage': None}
                          

                          Also kein richtiges JSON mit den ' und <> etc, per Suchen und ersetzen habe ich da jedenfalls kein sauberes JSON draus gezaubert.

                          Es gäbe - statt der Angabe von --token, --key und --id auch die Möglichkeit einfach --auto anzugeben, dann macht der aber jedes mal ein disovery für die Daten was die Ausführung wieder verzögert.

                          1 Reply Last reply Reply Quote 0
                          • G
                            Greenhorn last edited by

                            Hallo,
                            vielleicht ließt ja noch jemand mit 😉
                            Ich habe eine Midea Wärmepumpe die mittels Midea SmartHome-App steuerbar ist. Soweit so gut. Ich hätte sie aber gerne im IoBroker, in der Hoffnung dort ein paar mehr Werte zu sehen.
                            Nun habe ich den Adapter installiert und mich dort mit UID und Passwort angemeldet aber leider zeigt das log "Login failed, Konto existiert nicht" (?) Die eingebenen Daten sind aber richtig...
                            Vielleicht hat jemand einen Tipp woran es liegen könnte?
                            Viele Grüße

                            BananaJoe 1 Reply Last reply Reply Quote 0
                            • BananaJoe
                              BananaJoe Most Active @Greenhorn last edited by

                              @greenhorn Der Adapter ist für Klimaanlagen, also die "Midea Air" App. Das werden ganz andere Server sein.
                              Also falscher Adapter dafür

                              G 1 Reply Last reply Reply Quote 0
                              • G
                                Greenhorn @BananaJoe last edited by

                                @bananajoe
                                OK, schade, aber trotzdem danke 👍

                                1 Reply Last reply Reply Quote 0
                                • BananaJoe
                                  BananaJoe Most Active last edited by BananaJoe

                                  @bananajoe sagte in Test Adapter Midea Dimstal Klimaanlagen v0.0.x:

                                  Ich habe hier mal ein Update zur Steuerung meiner Dimstal-Anlage. Die kann ich mit diesem Adapter (oder über den HAM-Weg) zwar abrufen, aber nicht steuern.
                                  Und zwar habe ich noch eine andere CLI-gefunden welche erheblich(!) schneller reagiert als die midea-beautiful-air-cli die ich in einem Beitrag weiter oben erwähnt (und modifiziert habe):

                                  https://pypi.org/project/msmart-ng/

                                  Ich spiel hier mal den Totengräber für meinen eigenen Beitrag:
                                  Es gibt eine neuere Version von msmart-ng
                                  Beim testen habe ich festgestellt das mein Beispielaufruf falsch ist, das -d ist überflüssig bzw. aktiviert nur den Debug-Modus. Der (vor-)letzte Parameter muss immer die IP-Adresse sein, richtig wäre also:

                                  msmart-ng control --token c19a404c808656a83c...08f19efc0b6a5 --key d714e6c7ad56...ea32d44776474fb --id 534971451351917 -192.168.1.30 power_state=True
                                  

                                  Zudem habe ich entdeckt, das die eingebaute Hilfe mehr bietet als gedacht:

                                  msmart-ng query -h
                                  

                                  liefert die ganzen Parameter für die Abfrage:

                                  usage: msmart-ng query [-h] [-d] [--region {DE,KR,US}] [--account ACCOUNT] [--password PASSWORD] [--capabilities] [--auto] [--id DEVICE_ID] [--token TOKEN] [--key KEY] host
                                  
                                  Query information from a device on the local network.
                                  
                                  positional arguments:
                                    host                 Hostname or IP address of device.
                                  
                                  options:
                                    -h, --help           show this help message and exit
                                    -d, --debug          Enable debug logging.
                                    --region {DE,KR,US}  Country/region for built-in cloud credential selection.
                                    --account ACCOUNT    Manually specify a username for cloud authentication.
                                    --password PASSWORD  Manually specify a password for cloud authentication.
                                    --capabilities       Query device capabilities instead of state.
                                    --auto               Automatically authenticate V3 devices.
                                    --id DEVICE_ID       Device ID for V3 devices.
                                    --token TOKEN        Authentication token for V3 devices.
                                    --key KEY            Authentication key for V3 devices.
                                  

                                  Dementsprechend liefert

                                  msmart-ng control -h
                                  

                                  die Anleitung zur Steuerung:

                                  usage: msmart-ng control [-h] [-d] [--region {DE,KR,US}] [--account ACCOUNT] [--password PASSWORD] [--capabilities] [--auto] [--id DEVICE_ID] [--token TOKEN] [--key KEY]
                                                           host setting=value [setting=value ...]
                                  
                                  Control a device on the local network.
                                  
                                  positional arguments:
                                    host                 Hostname or IP address of device.
                                    setting=value        Space separated key-value pairs of settings to control.
                                  
                                  options:
                                    -h, --help           show this help message and exit
                                    -d, --debug          Enable debug logging.
                                    --region {DE,KR,US}  Country/region for built-in cloud credential selection.
                                    --account ACCOUNT    Manually specify a username for cloud authentication.
                                    --password PASSWORD  Manually specify a password for cloud authentication.
                                    --capabilities       Query device capabilities before sending commands.
                                    --auto               Automatically authenticate V3 devices.
                                    --id DEVICE_ID       Device ID for V3 devices.
                                    --token TOKEN        Authentication token for V3 devices.
                                    --key KEY            Authentication key for V3 devices.
                                  

                                  Da ich das ganze aus ioBroker-Skripts heraus startet, habe ich dafür ein eigenes Environment für den Benutzer ioBroker eingerichtet, in der Bash per SSH:
                                  Zum Benutzer ioBroker wechseln:

                                  sudo -u iobroker /usr/bin/bash
                                  

                                  In das Home-Verzeichnis des Benutzers ioBroker wechseln

                                  cd ~
                                  

                                  Python Environment anlegen (falls noch nicht vorhanden):

                                  python3 -m venv python-venv
                                  

                                  und in die Umgebung wechseln:

                                  source python-venv/bin/activate
                                  

                                  Jetzt kann man per pip das Modul installieren

                                  pip install msmart-ng
                                  

                                  und dann per

                                  msmart-ng
                                  

                                  Nutzen. Vor der Nutzung muss dann aber immer erst das Envirtonment geladen werden.
                                  Intelligenter weise wird das in den nachinstallierten Python-Modulen gleich richtig hinterlegt:

                                  which msmart-ng
                                  

                                  Ausgabe:

                                  /home/iobroker/python-venv/bin/msmart-ng
                                  

                                  Inhalt:

                                  cat /home/iobroker/python-venv/bin/msmart-ng
                                  

                                  Die erste Zeile ist

                                  #!/home/iobroker/python-venv/bin/python3
                                  

                                  Womit die richtige Umgebung genutzt wird.
                                  In euren ioBroker Skripten müsst Ihr dann z.B. im Exec Block von Blockly beim Befehl Parameter den ganzen Pfad aufrufen:

                                  /home/iobroker/python-venv/bin/msmart-ng
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • U
                                    uweabc last edited by Homoran

                                    Ich habe vor einiger Zeit mal ein JavaScript für msmart-ng gebastelt. Dies habe ich mit den Erkenntnissen von BananaJoe neu überarbeitet. Anbei das JavaScript. midea.js

                                    Steuert eine Midea-Klimaanlage direkt über das Python-Programm 'msmart-ng' lokal im WLAN.

                                    Das Gerät wurde einmalig mit der Android-App in das WLAN integriert.
                                    Anschließend wurde der Internetzugang für diese Gerät über die FritzBox deaktiviert, um eine Fremdsteuerung zu unterbinden.
                                    Keine Cloud erforderlich für dieses JavaScript!

                                    Dieses JavaScript übernimmt folgende Funktionen:
                                    - Es liest die aktuellen Werte des Geräts im lokalen Netzwerk ab, siehe dazu Variable 'mideaPortaSplit'.
                                    Variable 'mideaPortaSplit' muss entsprechend geändert werden. Dazu id, ip, token und key entsprechend ändern.
                                    - Es erstellt eigenständig die passenden Objekte in ioBroker (unter javascript.0.midea.*).
                                    - Wird ein schreibbares Objekt geändert, so schreibt das JavaScript die Änderung direkt ins Gerät,
                                    indem es die Befehle über 'msmart-ng' sendet.
                                    Gültige Werte für FanSpeed / OperationalMode / SwingMode / SwingAngle / RateSelect / BreezeMode / AuxHeatMode
                                    siehe Variable 'AirConditioner'.
                                    - Der Loglevel (javascript.0.media.loglevel) kann während der Laufzeit des Skripts angepasst werden.
                                    Mögliche Werte sind 0=aus, 1=minimal, 2=alles.

                                    BananaJoe Homoran 2 Replies Last reply Reply Quote 0
                                    • BananaJoe
                                      BananaJoe Most Active @uweabc last edited by

                                      @uweabc

                                      ist die Verwendung von Apostophen statt Hochkommas Absicht?
                                      Zeile 163 und folgend,
                                      Zeile 173
                                      Zeile 196
                                      ???

                                      U 1 Reply Last reply Reply Quote 0
                                      • Homoran
                                        Homoran Global Moderator Administrators @uweabc last edited by

                                        @uweabc bitte das Script nicht als Datei/Link posten.
                                        Hier in code-tags einstellen!

                                        U 1 Reply Last reply Reply Quote 0
                                        • U
                                          uweabc @Homoran last edited by uweabc

                                          @homoran
                                          Danke für den Hinweis. Ich bin da vorsichtig. Leider ändert der code-tag den Sourcecode an manchen Stellen, also der gibt den Code nicht 1:1 wieder der eingeben wurde.

                                          1 Reply Last reply Reply Quote 0
                                          • U
                                            uweabc @BananaJoe last edited by uweabc

                                            @bananajoe
                                            @BananaJoe
                                            Ja, das ist die normale Formatierung bei JavaScript mit Variablen.
                                            Zur Sicherheit nochmal hier den Code mit leichten Verbesserungen (leider ändert der code-tag den Sourcecode, also die {1} ignorieren!):

                                            /*
                                                Steuert eine Midea-Klimaanlage direkt über das Python-Programm 'msmart-ng' (siehe unten Installation 'msmart-ng') lokal im WLAN.
                                                
                                                Das Gerät wurde einmalig mit der Android-App in das WLAN integriert. 
                                                Anschließend wurde der Internetzugang für diese Gerät über die FritzBox deaktiviert, um eine Fremdsteuerung zu unterbinden.
                                                Keine Cloud erforderlich für dieses JavaScript!
                                            
                                                Dieses JavaScript übernimmt folgende Funktionen:  
                                                - Es liest die aktuellen Werte des Geräts im lokalen Netzwerk ab, siehe dazu Variable 'mideaPortaSplit'.  
                                                  Variable 'mideaPortaSplit' muss entsprechend geändert werden. Dazu id, ip, token und key entsprechend ändern.
                                                - Es erstellt eigenständig die passenden Objekte in ioBroker (unter javascript.0.midea.*).  
                                                - Wird ein schreibbares Objekt geändert, so schreibt das JavaScript die Änderung direkt ins Gerät, 
                                                  indem es die Befehle über 'msmart-ng' sendet.
                                                  Gültige Werte für FanSpeed / OperationalMode / SwingMode / SwingAngle / RateSelect / BreezeMode / AuxHeatMode
                                                  siehe Variable 'AirConditioner'.
                                                - Der Loglevel (javascript.0.media.loglevel) kann während der Laufzeit des Skripts angepasst werden. 
                                                  Mögliche Werte sind 0=aus, 1=minimal, 2=alles.
                                            
                                                Idee abgeleitet aus den Beitrag: https://forum.iobroker.net/topic/33198/test-adapter-midea-dimstal-klimaanlagen-v0-0-x/346?lang=de
                                            
                                                Installation 'msmart-ng':
                                                =========================
                                                Zum Benutzer ioBroker wechseln:
                                                    sudo -u iobroker /usr/bin/bash
                                                In das Home-Verzeichnis des Benutzers ioBroker wechseln
                                                    cd ~
                                                Python Environment anlegen (falls noch nicht vorhanden):
                                                    python3 -m venv python-venv
                                                und in die Umgebung wechseln:
                                                    source python-venv/bin/activate
                                                Jetzt kann man per pip das Modul installieren
                                                    pip install msmart-ng
                                                und dann per
                                                    msmart-ng
                                                Nutzen. Vor der Nutzung muss dann aber immer erst das Envirtonment geladen werden.
                                                Intelligenter weise wird das in den nachinstallierten Python-Modulen gleich richtig hinterlegt:
                                                    which msmart-ng
                                                Ausgabe:
                                                    /home/iobroker/python-venv/bin/msmart-ng
                                                Inhalt:
                                                    cat /home/iobroker/python-venv/bin/msmart-ng
                                                Die erste Zeile ist
                                                    #!/home/iobroker/python-venv/bin/python3
                                                Womit die richtige Umgebung genutzt wird.
                                                In ioBroker Skripten den ganzen Pfad aufrufen:
                                                    /home/iobroker/python-venv/bin/msmart-ng
                                            */
                                            
                                            // id + token + key ermittelbar über 'msmart-ng query --region DE --auto 192.168.178.205'
                                            const mideaPortaSplit = { 
                                                ip: '192.168.178.205',
                                                id: '999832117233304',
                                                token: 'BadBad132c05bab57aad3833ce247729d2f880e6fd5b8e1d2ca0eec82395d7edb85cf70d339faf7d0c8baf3b8275d86b183d430347bae6eba4a009cb38d1147f',
                                                key: 'BadBadc06c854aa6ba7b200174327ed7fc9fb0fd0032407992403b9e4104c1d3',
                                                controlSettings: [], // temp. Speicher für alle änderbaren Objekte, für on({id: device.controlSettings, change: 'any'}...
                                            };
                                            
                                            const basePath = 'javascript.0.midea'; // Basis-Objektpfad
                                            var LOGLEVEL = 2; // 0=aus, 1=minimal, 2=alles
                                            const msmartLoglevel = basePath + '.loglevel';
                                            const region = 'DE'; // --region {DE,KR,US}
                                            const msmart_ng = '/home/iobroker/python-venv/bin/msmart-ng';
                                            
                                            // enums siehe https://github.com/mill1000/midea-msmart/blob/main/msmart/device/AC/device.py
                                            class AirConditioner {
                                                static FanSpeed = {
                                                    AUTO: 102,
                                                    MAX: 100,
                                                    HIGH: 80,
                                                    MEDIUM: 60,
                                                    LOW: 40,
                                                    SILENT: 20,
                                                    DEFAULT: 102
                                                };
                                            
                                                static OperationalMode = {
                                                    AUTO: 1,
                                                    COOL: 2,
                                                    DRY: 3,
                                                    HEAT: 4,
                                                    FAN_ONLY: 5,
                                                    SMART_DRY: 6,
                                                    DEFAULT: 5
                                                };
                                            
                                                static SwingMode = {
                                                    OFF: 0x0,
                                                    VERTICAL: 0xC,
                                                    HORIZONTAL: 0x3,
                                                    BOTH: 0xF,
                                                    DEFAULT: 0
                                                };
                                            
                                                static SwingAngle = {
                                                    OFF: 0,
                                                    POS_1: 1,
                                                    POS_2: 25,
                                                    POS_3: 50,
                                                    POS_4: 75,
                                                    POS_5: 100,
                                                    DEFAULT: 0
                                                };
                                            
                                                static RateSelect = {
                                                    OFF: 100,
                                                    GEAR_50: 50,
                                                    GEAR_75: 75,
                                                    LEVEL_1: 1,
                                                    LEVEL_2: 20,
                                                    LEVEL_3: 40,
                                                    LEVEL_4: 60,
                                                    LEVEL_5: 80,
                                                    DEFAULT: 100
                                                };
                                            
                                                static BreezeMode = {
                                                    OFF: 1,
                                                    BREEZE_AWAY: 2,
                                                    BREEZE_MILD: 3,
                                                    BREEZELESS: 4,
                                                    DEFAULT: 1
                                                };
                                            
                                                static AuxHeatMode = {
                                                    OFF: 0,
                                                    AUX_HEAT: 1,
                                                    AUX_ONLY: 2,
                                                    DEFAULT: 0
                                                };
                                            }
                                            
                                            function convertToValidJSON(str) {
                                                str = str.replace(/<[^>]*:\s*(\d+)>/g, '$1'); // Entfernt alles in <...>, Zahl nach : bleibt erhalten
                                                str = str.replace(/\bNone\b/g, 'null'); // Ersetzt 'None' durch null
                                                str = str.replace(/'/g, '"'); // Optional: Ersetze einzelne Anführungszeichen durch doppelte
                                                str = str.replace(/\bTrue\b/g, 'true').replace(/\bFalse\b/g, 'false'); // Ersetze True/False durch true/false
                                                str = str.replace('"power"', '"power_state"'); // Korrektur power control
                                                return str;
                                            }
                                            
                                            function extractJsonFromLine(line) {
                                                const index = line.indexOf('{');
                                                if (index !== -1) {
                                                    try {
                                                        const jsonStr = convertToValidJSON(line.substring(index));
                                                        if (LOGLEVEL > 1) log(jsonStr);
                                                        return JSON.parse(jsonStr);
                                                    } catch (e) {
                                                        console.error('JSON konnte nicht geparst werden' + e);
                                                        return null;
                                                    }
                                                }
                                                return null;
                                            }
                                            
                                            // msmart-ng query 
                                            // usage: msmart-ng query [-h] [-d] [--region {DE,KR,US}] [--account ACCOUNT] [--password PASSWORD] [--capabilities] 
                                            //                        [--auto] 
                                            //                        [--id DEVICE_ID] [--token TOKEN] [--key KEY]
                                            //                        host
                                            function queryDevice(device) {
                                                const queryMsmart = msmart_ng +
                                                    ' query' + 
                                                    ` --region ${region}` +
                                                    ` --token ${device.token}` +
                                                    ` --key ${device.key}` +
                                                    ` --id ${device.id}` +
                                                    ` ${device.ip}`;
                                            
                                                if (LOGLEVEL > 1) log(queryMsmart);
                                            
                                                exec(queryMsmart, (error, stdout, stderr) => {
                                                    if (error) {
                                                        console.error(`Fehler beim Ausführen: ${error}`);
                                                        return;
                                                    }
                                            
                                                    // Funktion, um nach JSON zu suchen
                                                    [stdout, stderr].forEach(output => {
                                                        const lines = output.split('\n');
                                                        for (let line of lines) {
                                                            if (line.includes('INFO:msmart.cli:')) {
                                                                const data = extractJsonFromLine(line);
                                                                if (data) {
                                                                    handleData(device, data);
                                                                    break; // nur die erste gefundene JSON-Zeile
                                                                }
                                                            }
                                                        }
                                                    });
                                                });
                                            }
                                            
                                            function handleData(device, data) {
                                                const installOnControlSettings = (device.controlSettings.length == 0);
                                                const id = data.id ? data.id.toString() : 'device';
                                                const devicePath = `${basePath}.${id}`;
                                            
                                                Object.keys(data).forEach(key => {
                                                    var keyL = key.toLowerCase();
                                                    if (keyL === 'id') return;
                                                    if (keyL === 'sn') return;
                                                    if (keyL === 'key') return;
                                                    if (keyL === 'token') return;
                                                    
                                                    const value = data[key];
                                                    const statePath = `${devicePath}.${key}`;
                                            
                                                    // Konfiguration für createState
                                                    var isControl = true;
                                                    if ((keyL === 'ip') ||
                                                        (keyL === 'online') ||
                                                        (keyL === 'port') ||
                                                        (keyL === 'type') ||
                                                        (keyL === 'name')) {
                                                        isControl = false;
                                                    }
                                                    const stateOptions = {
                                                        type: typeof value,
                                                        name: key,
                                                        read: true,
                                                    };
                                            
                                                    // Zusätzliche Eigenschaften basierend auf dem Schlüssel
                                                    if (typeof value !== 'boolean') {
                                                        if (keyL.includes('temperature')) {
                                                            stateOptions.unit = '°C';
                                                            stateOptions.role = 'value.temperature';
                                                            stateOptions.type = 'number';
                                                            if (!keyL.includes('target_'))
                                                                isControl = false;
                                                        } else if (keyL.includes('humidity')) {
                                                            stateOptions.unit = '%';
                                                            stateOptions.role = 'value.humidity';
                                                            stateOptions.min = 0;
                                                            stateOptions.max = 100;
                                                            stateOptions.type = 'number';
                                                            if (!keyL.includes('target_'))
                                                                isControl = false;
                                                        } else if (keyL.includes('energy')) {
                                                            stateOptions.unit = 'Wh';
                                                            stateOptions.min = 0;
                                                            stateOptions.max = 999999999;
                                                            stateOptions.type = 'number';
                                                            isControl = false;
                                                        } else if (keyL.includes('power')) {
                                                            stateOptions.unit = 'W';
                                                            stateOptions.role = 'value.power';
                                                            stateOptions.min = 0;
                                                            stateOptions.max = 4000;
                                                            stateOptions.type = 'number';
                                                            isControl = false;
                                                        }
                                                    }
                                                    stateOptions.write = isControl;
                                                    if (value != null) stateOptions.def = value;
                                            
                                                    // State erstellen, falls nicht vorhanden
                                                    createState(statePath, stateOptions, () => {
                                                        // Nach Erstellung Wert holen und ggf aktualisieren
                                                        getState(statePath, (err, state) => {
                                                            if (err || !state) {
                                                                setState(statePath, value, true);
                                                            } else {
                                                                if (state.val !== value) {
                                                                    if (LOGLEVEL > 1) log(`${statePath}:${value}`);
                                                                    setState(statePath, value, true);
                                                                }
                                                            }
                                                        });
                                                    });
                                                    if (installOnControlSettings && 
                                                        stateOptions.write && 
                                                        !device.controlSettings.includes(statePath)) {
                                                        device.controlSettings.push(statePath);
                                                    }
                                                });
                                                if (installOnControlSettings) {
                                                    // Events
                                                    on({id: device.controlSettings, change: 'any'}, function (obj) {
                                                        if (obj.state.ack) return; // Diese Änderung wurde vom Skript selbst gemacht, ignorieren
                                                        if (LOGLEVEL > 0) log(`geändert ${obj.id} auf ${obj.state.val}`);
                                                        var parts = obj.id.split('.');
                                                        controlDevice(device, parts[4] ,obj.state.val);
                                                    });
                                                }
                                            }
                                            
                                            // msmart-ng control
                                            // usage: msmart-ng control [-h] [-d] [--region {DE,KR,US}] [--account ACCOUNT] [--password PASSWORD] 
                                            //                          [--capabilities] 
                                            //                          [--auto] 
                                            //                          [--id DEVICE_ID] [--token TOKEN] [--key KEY]
                                            //                          host setting=value [setting=value ...]
                                            function controlDevice(device, setting, value) {
                                                if (LOGLEVEL > 0) log(`control ${device.id}, setting ${setting}=${value}`);
                                            
                                                var pyValue = value;
                                                if (typeof pyValue == 'boolean') {
                                                    pyValue = value == true ? 'True':'False';
                                                }
                                            
                                                const controlMsmart = msmart_ng +
                                                    ' control' +
                                                    ` --region ${region}` +
                                                    ` --token ${device.token}` +
                                                    ` --key ${device.key}` +
                                                    ` --id ${device.id}` +
                                                    ` ${device.ip}` +
                                                    ` ${setting}=${pyValue}`;
                                            
                                                if (LOGLEVEL > 1) log(controlMsmart);
                                            
                                                exec(controlMsmart, (error, stdout, stderr) => {
                                                    if (error) {
                                                        console.error(`Fehler beim Ausführen: ${error}`);
                                                        return;
                                                    }
                                            
                                                    // Funktion, um nach JSON zu suchen
                                                    [stdout, stderr].forEach(output => {
                                                        if (output.includes('ERROR:')) {
                                                            console.error(`Fehler beim Ausführen: ${output}`);
                                                        }
                                                    });
                                                });
                                            }
                                            
                                            function initVar() {
                                                createState(msmartLoglevel, undefined, false, {
                                                    name: 'Loglevel',
                                                    type: 'number',
                                                    def: LOGLEVEL,
                                                    role: 'state'
                                                });
                                                LOGLEVEL = getState(msmartLoglevel).val;
                                            }
                                            
                                            // Main:
                                            initVar();
                                            queryDevice(mideaPortaSplit);
                                            schedule("*/5 * * * *", function () { // alle 5 Minuten
                                                queryDevice(mideaPortaSplit); 
                                            });
                                            
                                            // Events:
                                            on({id: msmartLoglevel, change: 'any'}, function (obj) {
                                                // Loglevel geändert
                                                log(`msmartLoglevel ist ${obj.state.val}`);
                                                LOGLEVEL = obj.state.val;
                                            });
                                            
                                            
                                            BananaJoe 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            765
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            dimstal midea nethome nethome plus
                                            63
                                            363
                                            62912
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo