BMW i3-Daten vom Server per MQTT weiterleiten

Begonnen von hasenhirn, 13 Juni 2021, 19:48:44

Vorheriges Thema - Nächstes Thema

Manfi

@potash
Hi,
Versuche seit einiger Zeit die Ur-Lösung von Rumbel durch Deine zu ersetzen, scheitere aber mangels Programmierkenntnissen.
Letzte Version von bimmerconnected ist installiert, funktioniert und liefert Werte. Wenn ich deinen Script starte, bekomme ich allerdings folgende Meldung:

sudo /opt/fhem/BMW2MQTT start
Starting /opt/fhem/BMW2MQTT .Client (null) sending CONNECT
Client (null) received CONNACK (0)
Traceback (most recent call last):
  File "/home/pi/.local/bin/bimmerconnected", line 5, in <module>
    from bimmer_connected.cli import main
ModuleNotFoundError: No module named 'bimmer_connected'
Client (null) sending DISCONNECT
(PID: 779).


LG und frohe Weihnachten  ;)
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

hasenhirn

Hallo Manfi,

BMW hat einige male die Authentifizierung umgestellt und ich hatte irgendwann keine Lust mehr dem hinterher zu programmieren.
Ich bin auf IoBroker umgestiegen da es dort ein gut funktionierendes Modul gibt und ich den Rest von FHEM jetzt nach und nach durch IoBroker ersetze.
Tut mir leid dass ich dir da nicht weiter helfen kann - sorry

LG

Thomas

potash

@Manfi

Hallo Manfi,

ich habe leider erst am Wochenende Zeit für Dein Problem.
Die Lösung mit bimmerconnected funktioniert jedenfalls bei mir auch mit der aktuiellen Authentifizierung.

Noch einen schönen Abend.

Heiko

Raspberry Pi 3, FHEM-Server 5.7

binford6000

#48
Hi,
bei mir läuft das hier seit 2 Monaten stabil:
#!/bin/bash
MQTTHOST="10.3.3.8"
MQTTPORT="1883"
MQTTUSER="mqtt_user"
MQTTPW="mqtt_pass"
#get data from bmw:
echo -e "Hole Daten bei BWM..."
json=$(sudo /usr/local/bin/./bimmerconnected status -j 'user' 'pass' rest_of_world)
echo -e "...fertig"
echo -e "Sende Daten an FHEM..."
mosquitto_pub -h $MQTTHOST -p $MQTTPORT -u $MQTTUSER -P $MQTTPW -t bmw -i bmw -m "$json"
echo -e "...fertig!"


Das zughörige device sieht dann so aus:
defmod bmw.mqtt MQTT2_DEVICE fhem2
attr bmw.mqtt autocreate 0
attr bmw.mqtt readingList fhem2:bmw:.* { my $h1 = json2nameValue($EVENT);;;; my %h2 = map { my $k=$_;;;; $k=~s/^1_//;;;; ($k,$h1->{$_}) } keys %{$h1};;;; \%h2 }


Siehe auch hier:
https://forum.fhem.de/index.php/topic,128932.0/all.html
und hier mit Maps-Anbindung von Boris:
https://forum.fhem.de/index.php/topic,129067.html

VG Sebastian

Manfi

Hi,
Habe deine Variante mal an meine Verhältnisse angepasst:

#!/bin/bash
MQTTHOST="10.1.1.114"
MQTTPORT="1883"
MQTTUSER=""
MQTTPW=""
#get data from bmw:
echo -e "Hole Daten bei BWM..."
json=$(sudo /home/pi/.local/bin/bimmerconnected status -j 'user' 'password' rest_of_world)
echo -e "...fertig"
echo -e "Sende Daten an FHEM..."
mosquitto_pub -h $MQTTHOST -p $MQTTPORT -u $MQTTUSER -P $MQTTPW -t bmw -i bmw -m "$json"
echo -e "...fertig!"




...und bekomme den gleichen Fehler wie bei der Variante von potash:

$ /opt/fhem/530d2MQTT.sh
Hole Daten bei BWM...
Traceback (most recent call last):
  File "/home/pi/.local/bin/bimmerconnected", line 5, in <module>
    from bimmer_connected.cli import main
ModuleNotFoundError: No module named 'bimmer_connected'
...fertig
Sende Daten an FHEM...
...fertig!

bimmerconnected von der Kommandozeile gestartet funktioniert einwandfrei

LG
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

potash

Hallo Manfi,

Da bimmerconnected auf der Kommandozeile funktioniert, von woher wird es aufgerufen?

which bimmerconnected

Versuche doch mal die direkte Übergabe von bimmerconnected auf  mosquitto_pub über die Kommandozeile:

sudo bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l

Einen schönen 3. Advent,

Heiko
Raspberry Pi 3, FHEM-Server 5.7

Manfi

Hi Heiko,

Hier das Resultat:

$ which bimmerconnected                                       
/home/pi/.local/bin/bimmerconnected


$ sudo bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l Client (null) sending CONNECT
Client (null) received CONNACK (0)
sudo: bimmerconnected: command not found
Client (null) sending DISCONNECT


allerdings:

$ bimmerconnected status -j 'user' 'password' rest_of_world | mosquitto_pub -h 10.1.1.114 -p 1883  -t bmw -d  --quiet  -l Client (null) sending CONNECT
Client (null) received CONNACK (0)
DEBUG:asyncio:Using selector: EpollSelector
Client (null) sending PUBLISH (d0, q0, r0, m1, 'bmw', ... (7301 bytes))
Client (null) sending DISCONNECT

funktioniert  ;D
jetzt muß ich das noch in FHEM zum Laufen bringen.

Danke
und auch noch einen schönen Rest-Adventsonntag

LG
Manfi
Hardware: Raspberry Pi2, SignalDuino 433, Sonoff/Tasmota, NodeMCU/ESPEasy, FS10

potash

Hallo Manfi,

ich habe bei mir die Abfrage über einen "service "automatisiert. Angepaßt an Deine Konfiguration sieht der Script dann so aus:
#!/bin/bash
#Service zur Abfrage der BMW Fahrzeugdaten über bimmerconnected

# Definition der Parameter
#Abfrageintevall in Sekunden
INTERVAL=7200
#Nutzername
USER="user"
#Passwort
PASS="password"
MQTTHOST="10.1.1.114"
MQTTPORT=1883
MQTTTOPIC="bmw"


# Lockfile enthält Prozess-ID (PID)
BASENAME=`basename $0`
LOCKFILE="/var/run/${BASENAME}.pid"

# teste auf root
if [ ${UID} -gt 0 ]
then
    echo $"Script muss als Superuser ausgef▒gret werden!"
    exit 1
fi


case "$1" in
    start)
        echo -ne "Starting $0 "
        $0 run &
        while [ ! -e ${LOCKFILE} ]
        do
          echo -ne "."
          sleep 2
        done
        echo "(PID: "`cat ${LOCKFILE}`")."
        exit
        ;;

    stop)
        if [ -e ${LOCKFILE} ]
        then
          CPID=`cat ${LOCKFILE}`
          echo -ne "Stopping $0 with PID $CPID "
          # beenden mit SIGTERM,
          # warte bis PID-File entfernt ist
          while [ -e ${LOCKFILE} ]
          do
             echo -ne "."
             kill ${CPID}
             sleep 2
          done
          echo "[done]"

        else
          echo "$0 is not running."
          exit
        fi
        ;;
    restart)
        $0 stop ; $0 start
        ;;
    run)
    if [ -e ${LOCKFILE} ]
    then
      CPID=`cat ${LOCKFILE}`
      echo "Programm lauft bereits. (PID: ${CPID})"
      exit -1
    else
      # PID File samt PID speichern
      # wird via trap am Programm-Ende wieder
      # entsorgt
      echo $$ > ${LOCKFILE}
      trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
    fi
    while true
    do
     sudo pi /home/pi/.local/bin/bimmerconnected status --json $USER $PASS rest_of_world | mosquitto_pub -h $MQTTHOST -p $MQTTPORT -d -t $MQTTTOPIC -l --quiet
      sleep $INTERVAL
    done
        ;;
    *)
        echo "usage: $0 start|stop|restart|run"
        echo "options:"
        echo "  start: runs program in background"
        echo "   stop: stops background program"
        echo "restart: restart a already running instance"
        echo "    run: run program in foreground, stopps with Strg-C"
        exit
        ;;
esac


Auf FHEM Seite empfängt dann folgendes MQTT2 - DEVICE

define StatusBMW MQTT2_DEVICE
attr StatusBMW autocreate 0
attr StatusBMW readingList /bmw:.* { json2nameValue($EVENT) }


Noch einen schönen Abend, LG Heiko
Raspberry Pi 3, FHEM-Server 5.7

Heiner

Hi,
ich hab Bimmerconnected am laufen, kriege die Daten aber nicht ins fhem.
Beides laeuft auf dem gleichen PI.
Brauchts unbedingt MQTT? Und wenn, gehts auch auf Basis MQTT2 aus fhem, das hab ich naemlich schon in Betrieb und moscitto on top fuert zu problemen.

Danke fuer eure Tipps.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

potash

Hallo Heiner,

für die Übertragung der Ausgabe von Bimmerconnected auf den MQTT2 - Server in FHEM benötigst Du noch einen "MQTT Publisher".
Ich habe den aus dem Mosquitto - Paket verwendet. Dieser läßt sich auch ohne Mosquitto-Server installieren.
Hier das Beispiel für Ubuntu/Debian/Rasbian

sudo apt install mosquitto-clients

LG und schöne Feiertage!

Heiko
Raspberry Pi 3, FHEM-Server 5.7

Heiner

Hi, frohe Weihnachten.
Danke funktioniert.

Wie krieg ich den Time reading fuer die naechste Inspektion auf Jahr und Monat reduziert?

Das Reading zeigt:
2024-07-01T00:00:00.000Z
mit value format und %1i bekomme ich das Jahr aber leider bekome ich auch mit %2i nicht den Monat.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

xasher

Hallo zusammen,

ich habe eine Frage zu den Daten in FHEM. Ich habe das Script am Laufen und die Daten werden an mosquitto übergeben.

Ich kann die Daten auch abrufen auf cli
mosquitto_sub -h localhost -t bmw
[{"data": {"vin": "xxxx", .....usw


In Fhem ist mir der Zusammenhang zum Mosquitto nicht so ganz klar. Fhem und Mosquitto laufen auf demselben Raspi, aber ich bekomme keine Daten angezeigt, wenn ich das wie beschrieben einrichte:

Zitat von: potash am 15 Dezember 2022, 17:08:12

Auf FHEM Seite empfängt dann folgendes MQTT2 - DEVICE

define StatusBMW MQTT2_DEVICE
attr StatusBMW autocreate 0
attr StatusBMW readingList /bmw:.* { json2nameValue($EVENT) }



Hätte jemand einen Hinweis, wo mein Fehler sein könnte?

VG
Alex

rudolfkoenig

Es fehlt eine  MQTT2_CLIENT Instanz, damit FHEM mit mosquitto reden kann.

Mein Rat: wenn man nicht so recht weiss, wozu man mosquitto braucht, dann sollte man es stoppen, und stattdessen MQTT2_SERVER in FHEM definieren. Dann braucht man auch kein MQTT2_CLIENT, und MQTT2_DEVICE wird automatisch angelegt. Siehe auch https://wiki.fhem.de/wiki/MQTT

xasher

Hallo Rudolf,

mit MQTT_Client klappt es jetzt. Danke für den Wink in die richtige Richtung.

Ich habe nochmals ein Verständnisproblem mit der readingList

Ich möchte gerne nur die Werte, die mich interessieren. Bisher legt er alle Readings mit eigenem Namen an (durch json2nameValue)

# Hier attr readingList
/bmw:.* { json2nameValue($EVENT) }
/bmw:.* dataalex


Das json aus "dataalex" habe ich mal angehängt.

wenn ich nur z.B. die vin möchte scheitere ich  kläglich  :-[

/bmw/data/vin:* vinalex
/bmw/.*vin.*: vinalex2

Ich weiß schon garnicht mehr, welche Varianten ich in den letzten Stunden schon probiert habe. Habe ich grundsätzlich ein Problem???

Vielen Dank für weitere Hinweise schon mal.

VG
Alex

rudolfkoenig

ZitatIch möchte gerne nur die Werte, die mich interessieren.
Dafuer muss man weitere Parameter angeben, siehe https://wiki.fhem.de/wiki/MQTT2_DEVICE_-_Schritt_f%C3%BCr_Schritt#json2nameValue.28.29