Carnet - Homebridge: Wie kriegt man die KFZ-Infos ins Homekit?

Begonnen von bgewehr, 21 Januar 2018, 13:05:24

Vorheriges Thema - Nächstes Thema

bgewehr

Hallo,

ich habe Infos über mein Auto aus dem VW Carnet in fhem extrahiert.

Nun möchte ich gern einige Angaben über Homebridge in HomeKit übertragen:

- location -> Karte mit Autostandort
- Kilometerstand -> Zahl
- Meldungen des Autos -> String ("AdBlue nachfüllen, noch 800km")

Sowas eben.

Ich finde aber bisher gar kein Mittel, um einfach irgendeinen Text oder irgendeinen Zahlenwert in HomeKit zu übertragen.

Ich muss also vermutlich eigene characteristics erstellen.

Gibt es dazu schon eine umfassende Anleitung? Kann ich mir einfach ein deviceType  ausdenken oder gibt es nur wenige vordefinierte?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

KernSani

Homekit unterstützt meines Wissens nur die vordefinierten Charakteristiken und Services... Ich fürchte da wirst du dich schwer tun... (wenn sich bei homekit nicht im letzten Jahr einiges geändert hat)
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

LexPoud

Hallo,

wie hast du die CarNet Integration denn gemacht?
Kannst du dazu ein paar Tipps geben?
FHEM on Synology, Homematic Devices

bgewehr

#3
Ich habe auf meinem Raspberrypi eine abgewandelte Version von carnet_py (danke an wez3 für die Vorlage) im cronjob laufen, die die Antworten des Dienstes als json String an meinen mosquitto mqtt Broker postet. Die Json strings werden mit einem fhem Modul expandJSON geparst und in einzelne Readings gesplittet. Auf dem Rückweg kann ich auch per Fhem Befehl messages an Car-Net senden, die per python Script in einer CMD line an den Dienst gesendet werden. Leider ist die Eingabe der PIN für schreibende Aktionen wie ,,Standheizung aktivieren" beim Verbrennermodell in den Python Modulen noch nicht vollständig umgesetzt, daher brauchte ich zum Einschalten der Standheizung eine andere Lösung. Ich habe mit Fischertechnik einen Automaten gebaut, der den Knopf drücken kann und habe ihn mit einem batteriebetriebenen Homematic Modul eingebunden. Geht natürlich nur zuhause damit. Das Ding macht aber nun zuverlässig um 06:30 an Werktagen bei unter 6 Grad die Standheizung an. Das geht dann auch per Siri-Command ,,schalte die Heizung in Arteon ein" mittels homebridge. Ausschalten und zwischen Kühlen und Heizen umschalten geht aber auch per API direkt.

Voraussetzungen:
- fhem
- homebridge
- mosquitto mqtt broker (sudo apt-get install mosquitto)
- python3 (ich habe 3.4.2, versuche python3 -V)
- paho mqtt modul für python (pip install paho-mqtt)

Ganz schönes Gefummel:

Klont Euch das Repo hier auf den Raspi:

https://github.com/bgewehr/volkswagen-carnet-client

Konfig wie in README.md beschrieben.

Test der Konfiguration und der Voraussetzungen auf Python-Seite mit Aufruf im github-Klon-Ordner:

python3 ./we_connect_client.py -u <username> -p <password> -c retrieveCarNetInfo


Müsste Informationen zum Fahrzeug und allerlei Infos ausgeben.

Um MQTT hinzuzufügen und dennoch die Updates von reneboer einfach mitnehmen zu können, habe ich einen kleinen wrapper gebaut names my-car.py, der die Funktionen der we_connect_client.py importiert und eine eigene Funktion mqtt hinzufügt. Der Wrapper kann für alle Aufrufe verwendet werden, es müsste also ebenso gut auch folgendes funktionieren:

python3 ./my-car.py -u <username> -p <password> -c retrieveCarNetInfo


In meiner (root-) Crontab auf dem Raspberry steht folgendes (sudo crontab -e) (muss nicht root sein, dann sorgt für passende Rechte):

*/10 * * * * python3 /home/bananapi/carnet/volkswagen-carnet-client/my-car.py -u <username> -p <password> -c mqtt


Dies führt alle 10 Minuten den python job aus und sendet die Ergebnisse an den installierten MQTT-broker.

In fhem empfange ich die Daten mit einem MQTT device:

MQTT Server bekannt machen:
define MQTT_fhem MQTT <myMqttServerIpOrHostName>:1883

MQTT Device:

define carnet MQTT_DEVICE
attr carnet IODev MQTT_fhem
attr carnet autoSubscribeReadings /carnet/+


Damit stehen die Daten aus dem Carnet als lange JSON Strings zur Verfügung, deswegen breche ich sie mit expandJSON in einzelne Readings auf:

define carnetexpand expandJSON carnet:.*

Das sind viele (!!) Readings.

Hier hole ich mir die wichtigsten zusammen:

define carnet_info readingsGroup carnet:remoteAuxiliaryHeating_status_outdoorTemp carnet:vehicleDetails_distanceCovered carnet:remoteAuxiliaryHeating_status_operationMode carnetHeating:.*
attr carnet_info mapping {'carnet.vehicleDetails_distanceCovered'=>'Kilometerstand','carnet.remoteAuxiliaryHeating_status_outdoorTemp'=>'Aussentemperatur','carnet.remoteAuxiliaryHeating_status_operationMode'=>'Modus Standheizung','carnetHeating.state'=>'Status Standheizung'}
attr carnet_info setList heating_on heating_off heating_cool heating_auto


Außerdem habe ich ein device im Homekit-Raum, welches die wichtigen Parameter bereitstellt und die Zeitsteuerung aktivieren und deaktivieren kann:

define carnetHeating dummy
attr carnetHeating event-on-change-reading state,currentState
attr carnetHeating genericDeviceType thermostat
attr carnetHeating homebridgeMapping clear Model=carnet:completeVehicleJson_model Manufacturer=carnet:vehicleDetails_serviceInspectionData CurrentHeatingCoolingState=currentState,values=off:0;;;;HEATING_on:1;;;;VENTILATION_on:2;;;;AUTOMATIC:3,valud=off TargetHeatingCoolingState=state,values=off:0;;;;HEATING_on:1;;;;VENTILATION_on:2;;;;AUTOMATIC:3,cmds=OFF:off;;;;HEAT:HEATING_on;;;;AUTO:AUTOMATIC;;;;COOL:VENTILATION_on CurrentTemperature=carnet:remoteAuxiliaryHeating_status_outdoorTemp,nochache=1 TargetTemperature=carnet:remoteAuxiliaryHeating_status_outdoorTemp,nocache=1 RotationSpeed=carnet:vehicleDetails_distanceCovered,minValue=0,maxValue=200000,factor=1000,unit= CurrentRelativeHumidity=carnet:vehicleStatusData_fuelRange,minValue=0,maxValue=1100,factor=1,unit=
attr carnetHeating setList off HEATING_on AUTOMATIC VENTILATION_on


Der Dummy wird von einem doif gesetzt:

define carnetHeating_di DOIF ([carnet:remoteAuxiliaryHeating_status_active] eq '1') (setReading carnetHeating currentState [carnet:remoteAuxiliaryHeating_status_operationMode]_on) DOELSE (setReading carnetHeating currentState [carnetHeating])

Damit auch was passiert, wenn man am dummy etwas schaltet, löst dieser doif die entsprechenden Befehle aus:

define carnetAct DOIF ([carnetHeating] eq "VENTILATION_on") (\
"python3 /home/bananapi/carnet/volkswagen-carnet-client/my-car.py -u <username> -p <password> -s <spin> -c startRemoteVentilation >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",\
set wdt_uzsu_Arteon_Heizung disable,\
setreading carnetHeating currentState VENTILATION_on\
)\
DOELSEIF\
([carnetHeating] eq "HEATING_on") (\
"python3 /home/bananapi/carnet/volkswagen-carnet-client/my-car.py -u <username> -p <password> -s <spin> -c startRemoteHeating >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",\
set Arteon_Heizung on,\
set wdt_uzsu_Arteon_Heizung disable,\
setreading carnetHeating currentState HEATING_on\
)\
DOELSEIF\
([carnetHeating] eq "AUTOMATIC") (\
set wdt_uzsu_Arteon_Heizung enable\
)\
DOELSEIF\
([carnetHeating] eq "off") (\
"python3 /home/bananapi/carnet/volkswagen-carnet-client/my-car.py -u <username> -p <password> -s <spin> -c stopRemoteHeating >> /home/bananapi/carnet/volkswagen-carnet-client/carnetFhem.log",\
setreading carnetHeating currentState off,\
set wdt_uzsu_Arteon_Heizung disable\
)


Ich habe noch eine Google-Maps-Karte hinzugefügt, die mir visualisiert, wo das Auto steht:


defmod n_carnetMap notify carnet:location.* {\
my $url = 'https://maps.google.com/maps?width=700&height=440&hl=en&q='.ReadingsVal('carnet','position_lat',0).','.ReadingsVal('carnet','position_lng',0).'&ie=UTF8&t=&z=16&iwloc=B&output=embed';;;;\
fhem("defmod carnetMap weblink iframe ".$url);;;;\
}

defmod carnetMap weblink iframe https://maps.google.com/maps?width=700&height=440&hl=en&q=0,0&ie=UTF8&t=&z=16&iwloc=B&output=embed
attr carnetMap1 htmlattr width="640" height="480"


Damit ist nun erstmalig auch das Einschalten der Standheizung per VW "API" möglich. Schlüssel zum Einschalten der Standheizung per fhem war bisher Fischertechnik (siehe .mov unten!). Daten lesen geht auch ohne. Bisschen doof ist es, dass Apple keine Eigendefinition von Attributen zulässt und das Auto auch noch nicht als devicetype entdeckt hat. Deswegen steht mein Kilometerstand in der Drehgeschwindigkeit und die Restreichweite in der Luftfeuchtigkeit. Aber was soll's...

## MANUELLE STEUERUNG per Fischertechnik-Automat

Die Homematic-Platine an meinem Fischetechnik-Automaten ist klassisch ein switch:

define Arteon_Heizung CUL_HM XYZXYZ
attr Arteon_Heizung IODev hmlan


Ein Weekdaytimer macht dann die Automation:

define wdt_uzsu_Arteon_Heizung WeekdayTimer Arteon_Heizung en !$we|06:30|on (ReadingsVal("OC3","temperature",0) < 6)
attr wdt_uzsu_Arteon_Heizung commandTemplate set $NAME  $EVENT


OC3 ist mein Homematic Wetterfrosch.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

dev0

ZitatDas sind viele (!!) Readings.
Um die Anzahl der Readings/Events zu reduzieren, kann man bei der Definition des expandJSON Moduls angeben welche Readings angelegt/erzeugt werden. Siehe cref:expandJSON:target_regex

TimoD

Hallo fhem Community,

versuche im Moment das Car Net in fhem zu bekommen. Folgende Schritte habe ich bereits ausgeführt:

1. Cronjob angelegt: Ich habe in der Datei vw_carnet_web.py Benutzer / Passwort / VIN eingetragen. Diese unter: home/pi/carnet/volkswagen-carnet-client/ abgespeichert.
2. Dann habe ich in die Datei CRONJOB unter /etc/crontab folgendes eingetragen: */10 * * * * python /home/pi/carnet/volkswagen-carnet-client/vw_carnet_web.py mqtt
3. Im Anschluss habe ich MQTT per  sudo cpan install Net::MQTT:Simple und sudo cpan install Net::MQTT:Constants installiert.
4. Neustart FHEM
5. MQTT Server per define MQTT_fhem MQTT 192.168.178.3:1883 angelegt
6. Device mit folgenden Attributen erstellt:
define carnet MQTT_DEVICE
attr carnet IODev MQTT_fhem
attr carnet autoSubscribeReadings /carnet/+

Leider erhalte ich nun aber unter dem "carnet" Device keine Readings und ich stehe ein wenig auf dem Schlauch :-)

Fragen:
1. Wie sehe ich ob der Cronjob korrekt ausgeführt / Daten von Car Net erhält? (Wird hier irgendwo eine Datei abgelegt? Muss ich den Cronjob initial noch starten?
2. Unter dem MQTT Server MQTT_fhem steht als Status "disconnected" ist dies so korrekt?
3. Wo sollten die Readings auftauchen? Unter dem carnet Device oder?

Ich freue mich auf Eure Rückmeldung und hoffe, dass ich das Teil noch zum laufen bekomme.

Vielen Dank, Grüße Timo

TimoD

Habe folgende ausgabe im Syslog zum Cronjob:

Jan 14 09:50:01 raspberrypi CRON[31590]: (fhem) CMD (/home/pi/carnet/volkswagen-carnet-client/vw_carnet_web.py mqtt)
Jan 14 09:50:01 raspberrypi CRON[31586]: (CRON) info (No MTA installed, discarding output)

Hmm Hilfe?

TimoD

Es läuft,... nun kann ich auch python debuggen,... danke für die Integration,...

TimoD

Allerdings hänge ich nun am cronjob iser wird wohl aufegrufen laut syslog aber leider bekomme ich kein Update:

Jan 14 15:30:01 raspberrypi CRON[7491]: (pi) CMD (/home/pi/carnet/volkswagen-carnet-client/vw_carnet_web.py mqtt)

Wenn ich als User PI folgendes eingebe python /home/pi/carnet/volkswagen-carnet-client/vw_carnet_web.py mqtt

klappt alles. Hat mir noch jemand ein Tipp versuche gerade die Permissions zu prüfen, verstehe es aber nicht ganz,...

Danke :-)

Petrosilius Zwackelmann

Hallo,

ich stecke hier auch fest.

Mein cronjob läuft alle 10 Minuten allerdings scheint dieser als user pi ausgeführt zu werden...

Jan 19 15:00:01 raspberrypi CRON[929]: (pi) CMD (python /opt/fhem/carnet/volkswagen-carnet-client/vw_carnet_web.py mqtt)

Ich habe durch diesen Hinweis ein Rechteproblem vermutet.
Bei mir war initial fhem:dialout als Besitzer:Gruppe angegeben.

Ausführbar sollte die Skripts wahrscheinlich schon sein...
Mit...

sudo chmod 777 /opt/fhem/carnet/volkswagen-carnet-client/lib_mqtt.py
sudo chmod 777 /opt/fhem/carnet/volkswagen-carnet-client/vw_carnet_web.py

sollte jeder die Datei ausführen können.

Bei mir hat das aber auch nicht geholfen.
Ich sehe im Gegensatz zu dir auch bei direkter Eingabe keine Rückmeldung. Die Anmeldung bei carnet scheint aber zu funktionieren.

ein
list MQTT_fhem

ergibt
Internals:
   CFGFN      ./FHEM/00_CARNET.cfg
   DEF        127.0.0.1:1883
   DeviceName 127.0.0.1:1883
   FD         5
   NAME       MQTT_fhem
   NOTIFYDEV  global
   NR         1928
   NTFY_ORDER 50-MQTT_fhem
   PARTIAL   
   STATE      opened
   TYPE       MQTT
   buf       
   msgid      2
   ping_received 1
   timeout    60
   READINGS:
     2019-01-19 15:38:44   connection      active
     2019-01-19 14:51:44   state           opened
   messages:


ein
list carnet
folgendes
Internals:
   CFGFN      ./FHEM/00_CARNET.cfg
   IODev      MQTT_fhem
   NAME       carnet
   NR         1930
   STATE      ???
   TYPE       MQTT_DEVICE
   READINGS:
     2019-01-15 00:12:06   test           
     2019-01-19 14:52:03   transmission-state subscription acknowledged
   message_ids:
   sets:
   subscribe:
     /carnet/+
     /carnet/test
   subscribeExpr:
     ^\/carnet\/([^/]+)$
     ^\/carnet\/test$
   subscribeQos:
     /carnet/+ 
     /carnet/test 0
   subscribeReadings:
     /carnet/test:
       cmd       
       name       test
Attributes:
   IODev      MQTT_fhem
   autoSubscribeReadings /carnet/+
   room       carnet
   subscribeReading_test /carnet/test



Kann hier jemand einen Fehler erkennen?
Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

bgewehr

#10
Spontan fällt mir folgendes ein: ich habe - obwohl man es nicht tun sollte - den cronjob für User root eingerichtet, indem ich sudo crontab -e ausgeführt habe und dort die Zeile ergänzt habe.

Was passiert, wenn Ihr den Python Befehl so

python vw_carnet_web.py retrieveCarNetInfo


eingebt? Bekommt ihr dann die Daten auf der Konsole angezeigt?
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

Wenn ich doch nur Perl könnte. Am liebsten würde ich den Python Ansatz nehmen und in Perl als natives fhem Modul umsetzen, aber das traue ich mir nicht zu.
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Petrosilius Zwackelmann

Hallo Bernd,

leider ergbit
Zitatpython vw_carnet_web.py retrieveCarNetInfo
kein Ausgabe auf der Konsole.

Es dauert 1-2 Sekunden dann erscheint eine neue Eingabezeile.

Gruß Manuel
FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

Petrosilius Zwackelmann

Könnte der Fehler in der MQTT Konfiguration liegen?
Ich habe MQTT.fx installiert und dort eine Verbindung mit dem Raspberry hergestellt.
Ich kann dort ein Subscribe "/carnet/+" eingeben, auch dort kann ich die Daten nicht sehen...

Es werden aber sehrwohl Daten gesendet und empfangen.

Gruß Manuel

FHEM 6 auf RaspPi V3:
HM_LAN / CUNX / HUEBridge /OneWire / Homebridge / SONOS / Harmony

bgewehr

#14
Hast Du in der lib_mqtt Deinen host korrekt eingetragen?


Enter the correct MQTT-broker host and port in the lib_mqtt.py:

MQTT_HOST = "<hostname or IP>"
MQTT_PORT = <port>
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868