BMW E-Fahrzeuge auslesen mit bimmerconnected

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • marcb
    LoxBus Spammer
    • 19.08.2017
    • 301

    #1

    BMW E-Fahrzeuge auslesen mit bimmerconnected

    Ich versuche schon länger den Ladezustand der Antriebsbatterie meines BMW 225XE (Plugin Hybrid) auszulesen um das laden mit PV-Strom zu optimieren.
    Jetzt habe ich die API "bimmer_connected" gefunden: https://bimmer-connected.readthedocs...est/index.html

    Mein Ziel ist die API unter Python3 auf dem Loxberry zu installieren und mit einem Python Skript die gewünschten Werte aus der API zum Miniserver zu schicken.
    Leider habe ich nur sehr rudimentäre Python-Kenntnisse, kann hier jemand helfen, insbesondere
    a) Einbinden und Zugriff auf die API mit Python
    b) Senden der Werte zum Miniserver?


    Bisher habe ich folgendes probiert bzw. überlegt:

    1. Versuch unter Windows:
    Python installiert und dann die API mit: pip install bimmer-connected
    Mit der API wird eine ausführbare Datei (.EXE) mitinstalliert die man direkt aufrufen kann und die alle Infos anzeigt
    (mit entsprechendem Parameter kann man darüber auch Befehle senden z.B. Klimatisierung, Türen u.a.).
    Aufruf: bimmerconnected status <BmwConnectedLogin> <BmwConnectedPasswort> rest_of_world

    Weitere Schritte
    a) Quick and Dirty Lösung über .cmd
    Die Ausgabe des Aufrufs oben wird in eine Datei geschrieben und dann über einen Webserver bereitgestellt (z.B. auf den Loxberry nach webfrontend kopieren) und dann vom MS aus mit einem virtuellen HTTP Eingang + Befehlserkennung ausgelesen.

    Den Befehlsaufruf (start der .cmd) müsste dann noch automatisiert werden sodass dieser synchron zum Abfragezyklus des Virtuellen HTTP Eingangs (z.B. 1 Minute vorher) erfolgt.
    Oder: Skript bei jedem öffnen des Garagentores oder beim einstecken in die Wallbox aufzurufen.

    b) Python Skript holt gewünschte Daten aus API und schickt diese per UDP an Miniserver
    Ablauf:
    - Einbinden der API in das Python Skript
    - Aufruf der gewünschten Daten und speichern in einer Variablen
    - Senden der Variablen über UDP an einen virtuellen UDP-Eingang + Eingangsbefehl mit Befehlserkennung
    - Das Skript muss dann noch automatisiert gestartet werden (zu bestimmten Zeiten oder bei bestimmten Ereignissen)

    Leider fehlen mir die Programmierkenntnisse, um die API in das Skript einzubinden und daraus Werte abzurufen.

    Weiterhin habe ich Probleme beim Senden per UDP (habe mich an mehreren Beiträgen hier orientiert):
    Skript:
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.sendto("Test=123", ("192.168.11.20", 7000))

    Fehler:
    File "C:\Users\Marc\Desktop\test2miniserver.py", line 3, in <module>
    sock.sendto("Test=123", ("192.168.11.20", 7000))
    TypeError: a bytes-like object is required, not 'str'


    c) API und das Skript analog zu b) auf dem Loxberry (weniger fehleranfällig)
    Python3 ist ja vorhanden, die API konnte ich auch schon installierten mit pip3 install bimmer-connected
    Auch hier wäre nun die Frage
    a) wie die Einbindung / der Zugriff zur API aus dem Python-Skript erfolgt
    b) wie die Werte aus dem Python-Skript zum Miniserver erfolgen (per UDP oder MQTT?)

    Ich freue mich auf Eure Vorschläge!!
    Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
    KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)
  • Christian Fenzl
    Lebende Foren Legende
    • 31.08.2015
    • 11238

    #2
    Dieses bimmer-connected ist ja keine API, sondern ein CLI Tool, d.h. es ist fix-fertig, um es aus der Commandline auszuführen.

    Du hast ja schon Sachen in LoxBerry XL gemacht, so könntest du die CLI-Aufrufe von PHP aus machen, und den Response (ich hab noch keinen Beispiel-Response gesehen) einfach an MQTT senden.

    Im Code des CLI's habe ich den Parameter --json gesehen, das heißt, du kannst die Daten sogar direkt als json abfragen.

    Die Intervalle und Zeit-Geschichten würde ich in Loxone machen, das ist übersichtlicher als Cronjobs anzulegen.

    lg, Christian
    Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

    Kommentar

    • marcb
      LoxBus Spammer
      • 19.08.2017
      • 301

      #3
      Es ist primär eine API (eine Sammlung von Python Befehlen) und zum testen gibt es ein CLI dazu.
      Aber die Idee alles über PHP und CLI zu machen gefällt mir :-)

      Leider kann ich das CLI auf dem Loxberry nicht finden (unter Windows liegen unter PythonXX\Scripts die ausführbaren Programme).

      Folgende Infos würden mir weiterhelfen:
      - wo werden auf dem Loxberry die ausführbare Python Dateien abgelegt?
      - wie rufe ich unter PHP ein ausführbares Programm auf (hat jemand ein Beispiel?)
      - wie sende ich aus php an MQTT?

      Ich habe mal die Standard-Ausgabe der EXE unten angefügt (die Ausgabe als JSON ist auch möglich).

      bimmerconnected.txt
      Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
      KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)

      Kommentar


      • marcb
        marcb kommentierte
        Kommentar bearbeiten
        die letzte Frage (aus PHP senden an MQTT) hat sich schon geklärt
    • Christian Fenzl
      Lebende Foren Legende
      • 31.08.2015
      • 11238

      #4
      Bezüglich Python - keine Ahnung, wird das nicht in dem Verzeichnis abgelegt, in dem du dich gerade befindest?
      Mit
      find / -name bimmerconnected
      kannst du sonst danach suchen.

      Mit exec() oder shell_exec() führst du externe Programme innerhalb eines Scripts aus, die Rückgabe des Aufrufs ist der Output.

      lg, Christian

      Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

      Kommentar

      • marcb
        LoxBus Spammer
        • 19.08.2017
        • 301

        #5
        so, nachdem ich die API nochmal neu auf dem LB installiert habe funktioniert dort der CLI Aufruf

        Ich habe dann ein PHP-Skript nach Vorgabe für Loxberry XL angelegt und von dort das CLI mit exec() aufgerufen, damit wird das Ergebnis in ein Array gespeichert und anschließend komplett ausgegeben:

        <?php
        require_once "loxberry_XL.php";
        exec("bimmerconnected status <BmwConnectedLogin> <BmwConnectedPasswort> rest_of_world", $lines, $result);
        foreach ($lines as $k => $v) {
        echo "$k $v<br>\n";
        }
        ?>

        Ergebnis:
        0 Found 1 vehicles: 225xe iPerformance
        1 VIN: WBAXXXXXXXXXXXXXX
        2 Mileage: (31350, 'km')
        3 Vehicle data:
        4 {
        5 "attributes": {
        6 "vin": "WBAXXXXXXXXXXXXXX",
        7 "model": "225xe iPerformance",
        8 "year": 2018,
        9 "brand": "BMW",
        10 "headUnit": "ID5",
        11 "isLscSupported": true,
        12 "driveTrain": "PLUGIN_HYBRID",
        ....
        657 v=}

        Also insgesamt 657 Zeilen mit jeweils einer "Variablen" und einem Wert.

        Dann habe ich das PHP Skript so geändert dass nur die gewünschten Zeilen ausgegeben werden:

        <?php
        require_once "loxberry_XL.php";
        exec("bimmerconnected status <BmwConnectedLogin> <BmwConnectedPasswort> rest_of_world", $lines, $result);
        echo $lines[0],"<br>\n" ;
        echo $lines[1],"<br>\n" ;
        echo $lines[2],"<br>\n" ;
        ?>

        Ich habe dann einen virtuellen HTTP-Eingang angelegt der das PHP Skript alle 3600s aufruft und darunter einen Eingang Befehl mit Befehlserkennung.

        Soweit funktioniert es, ABER
        - der CLI Aufruf dauert 6 Sekunden, der maximal einstellbare Timeout beim virtuellen HTTP-Eingang sind 8s - also etwas "knapp"
        - was passiert wenn man 2 Fahrzeuge hat? Verschieben sich dann die Zeilen?
        - ich möchte den Aufruf des CLI vom MS antriggern (immer nur dann wenn das Auto "heimkommt")

        Ziel ist den Aufruf des Skriptes vom MS zu triggern (über einen virtuellen Ausgang + Befehl) und dann vom Skript die Werte über MQTT an den MS zu senden

        Hierfür benötige ich noch folgende Tipps:
        - wie bekomme ich die Werte in Variablen (es muss ja in jeder Zeile vorne und hinten etwas "weggeschnitten" werden).
        - evtl ist das einfacher wenn ich die Option nutze und die Daten als JSON vom CLI anfordere?
        Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
        KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)

        Kommentar

        • Christian Fenzl
          Lebende Foren Legende
          • 31.08.2015
          • 11238

          #6
          Wie sieht denn der Output aus, wenn du --json verwendest?

          Den Call machst einfach per virtuellem Ausgang und Virtuellem Ausgangsbefehl.

          Wenn ein json-Output kommt, sendest du den Output einfach direkt an MQTT:
          $mqtt->publish("bimmer", implode("", $output)) ;

          bimmer/# subscribest du im MQTT Gateway. In der Incoming Overview schaust du, was daher kommt.
          Zuletzt geändert von Christian Fenzl; 03.03.2022, 13:20.
          Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

          Kommentar

          • marcb
            LoxBus Spammer
            • 19.08.2017
            • 301

            #7
            Das wäre natürlich die perfekte Lösung alle Werte via MQTT an den MS zu senden. Aber ich habe damit noch ein paar Probleme:

            wenn ich den Output als JSON ausgeben lasse und anzeige sieht es gut aus:

            mit "echo implode("", $output);" ​​sehen die ersten Zeilen so aus:
            [{"attributes": {"vin": "WBAXXXXXXXXXX", "model": "225xe iPerformance", "year": 2018, "brand": "BMW", "headUnit": "ID5", "isLscSupported": true, "driveTrain": "PLUGIN_HYBRID",

            wenn ich das ganze dann an MQTT sende mit $mqtt->publish("bimmer", implode("", $output));
            kommt folgendes den Loxberry MQTT Inputs an:
            bimmer_HASH(0x560b0d0abf10) Copy 1 06.03. 18:07:35
            Irgendwas passt also nicht bei der Übergabe via MQTT
            Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
            KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)

            Kommentar

            • Christian Fenzl
              Lebende Foren Legende
              • 31.08.2015
              • 11238

              #8
              Was ist der Output des Scripts selbst (ohne dein PHP) und wie sieht dein Script jetzt aus?
              Output scheint bei dir noch ein Array zu sein, entweder das kommt so vom Bimmer-Script oder irgendwas passt in deinem PHP nicht.
              Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

              Kommentar

              • marcb
                LoxBus Spammer
                • 19.08.2017
                • 301

                #9
                Wenn ich das Bimmer-Skript mit dem Parameter für JSON aufrufe also bimmerconnected status <BmwConnectedLogin> <BmwConnectedPasswort> rest_of_world -j" sieht es so aus (wie oben):
                Ausgabe:
                [{"attributes": {"vin": "WBAXXXXXXXXXX", "model": "225xe iPerformance", "year": 2018, "brand": "BMW", "headUnit": "ID5", "isLscSupported": true, "driveTrain": "PLUGIN_HYBRID", .............

                Wenn ich es mit exec in die Variable output schreiben lasse und dann
                a) echo $output wird angezeigt Array
                b) echo $output[0] kommt dasselbe wie wenn das Bimmer-Skript aufgerufen wird

                -> es handelt sich also um ein Array wobei der gesamte JSON-Code im ersten Feld des Array steht.

                Die Frage ist also in welche Form muss das JSON umgewandelt werden damit es sich bei MQTT "ankommt" und wie macht man das?
                Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
                KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)

                Kommentar

                • Christian Fenzl
                  Lebende Foren Legende
                  • 31.08.2015
                  • 11238

                  #10
                  Versuch:
                  PHP-Code:
                  $jsonstr=implode("", $output)) ;
                  $mqtt->publish("bimmer", json_encode( json_decode($jsonstr, true)[0])) ; 
                  
                  Das gelieferte json enthält alle Daten in einem Array [...].
                  Es geht darum, das erste Element dieses Arrays herauszukitzeln.
                  Zuletzt geändert von Christian Fenzl; 07.03.2022, 05:42.
                  Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                  Kommentar

                  • marcb
                    LoxBus Spammer
                    • 19.08.2017
                    • 301

                    #11
                    BINGO!! Vielen herzlichen Dank, so funktioniert es! Mit json_decode hatte ich schon experimentiert, auf die Idee mit dem json_encode davor wäre ich nie gekommen.....

                    Allerdings wird jetzt das MQTT Gateway bzw. der MS mit 657 Werten überschüttet und ich brauche davon nur ein paar. Ist aber nicht so tragisch da ich ja das Sktipt nur bei Bedarf starte.

                    Gibt es trotzdem es eine einfache Möglichkeit zumindest im MQTT Gateway alle inputs auf einmal auf "do not forward" zu setzen - also ohne 650 Häkchen einzeln setzen zu müssen?
                    Loxone (für Visualisierung und Komfortfunktionen): MS2, 2x KNX + DMX + Air Ext, 2x Audio Server + 4x Stereo Ext, Baudisch ECO an MS + Fritzbox, NFC Code Touch)
                    KNX (autark für alle Grundfunktionen): >100 KNX-Geräte (Aktoren, Sensoren, Glastaster...)

                    Kommentar

                    • Christian Fenzl
                      Lebende Foren Legende
                      • 31.08.2015
                      • 11238

                      #12
                      Sonst nur per Filter.
                      Oder das decodierte json im PHP selbst aussieben.
                      Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                      Kommentar

                      • antwort
                        Azubi
                        • 12.04.2021
                        • 5

                        #13
                        Hallo Zusammen,

                        ich versuche gerade die Abfrage eines Mini's mit BimmerConnected auf dem Loxberry nachzubauen.

                        Ich habe über das Terminal BimmerConnected installiert und das Skript unter \\loxberry\XL\user abgelegt

                        PHP-Code:
                        <?php
                        require_once "loxberry_XL.php";
                        exec("bimmerconnected status <BmwConnectedLogin> <BmwConnectedPasswort> rest_of_world", $lines, $result);
                        echo $lines[0],"<br>\n" ;
                        echo $lines[1],"<br>\n" ;
                        echo $lines[2],"<br>\n" ;
                        ?>
                        Ist das bis hier korrekt?
                        Wie kann ich im Terminal testen ob BimmerConnected grundsätzlich funktioniert ohne automatisierten Skriptaufruf?
                        Muss ich im Skript bei den Zugangsdaten die Kleiner/Größer Zeichen wegmachen oder?
                        Was muss ich noch einrichten bzgl. des Skriptaufrufs über Loxone und bzgl. der Abfrage der Werte über Loxone?

                        Vielen Dank für Eure Hilfe.

                        Liebe Grüße

                        Kommentar

                        • Christian Fenzl
                          Lebende Foren Legende
                          • 31.08.2015
                          • 11238

                          #14
                          Die spitzen Klammern gehören natürlich weg, und User/Pass eingesetzt.

                          Du kannst das Script direkt per ./scriptname.php aufrufen.

                          das Tool selber kenne ich aber nicht.

                          lg Christian
                          Hilfe für die Menschen der Ukraine: https://www.loxforum.com/forum/proje...Cr-die-ukraine

                          Kommentar

                          Lädt...