FHEM > Sonstiges

Anbindung von Kia UVO an fhem

<< < (2/8) > >>

gadget:

--- Zitat von: Eckat am 27 April 2021, 14:45:43 ---Könntest du das mit der MQTT Anbindung für UVO näher erläutern?

--- Ende Zitat ---

Ich habe auf dem Raspi (Raspian Stretch 9.13) , auf dem auch fhem läuft, unter dem User pi  bluelinky https://github.com/Hacksore/bluelinky installiert.
npm und nodejs hatte ich eh schon drauf.


Falls noch nicht vorhanden:


--- Code: ---
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nodejs npm
sudo npm cache clean -f
sudo npm update npm -g
sudo npm install -g n
sudo n stable

sudo shutdown -r now

npm --version
6.14.12
node --version
v10.24.1


--- Ende Code ---

Bluelinky dann installiert (als User pi) mit



--- Code: ---mkdir /home/pi/bluelinky
cd /home/pi/bluelinky
npm install bluelinky
npm install async-mqtt


--- Ende Code ---


Weiterhin habe ich sowieso einen eingenständigen MQTT Server laufen (Mosquitto), aber hierfür würde der fhem-eigene MQTT2_SERVER auch locker ausreichen.

Benötigt werden:

Ip-Adresse des MQTT-Servers  MQTTIP
Port des MQTT-Server MQTTPORT  (üblicherweise 1883)
Username MQTT-Server:  MQTTUSER
zugehöriges Passwort: MQTTPW

Von UVO braucht man

UVO-Username:  UVOUSER
UVO-Passwort: UVOPW
UVO-Pin:  UVOPIN
Die VIN des Autos: UVOVIN



Als MQTT-Topic verwende  ich BluelinkCarStatus/VIN

Als Vorlage für mein Skript habe ich bluelinky-mqtt-ha verwendet.

Die ganzen Zugangsdaten habe ich direkt in mein Skript (kia.js) geschrieben (  !! ich habe von Javascript so gut wie keinen blassen Schimmer !!).  Das ist von der Sicherheit her eher unschön. Man kann mit den Daten ja z.B. das Auto entriegeln und den Standort abfragen ....

Die kia.js  schaut dann so aus und liegt in /home/pi/bluelinky


--- Code: ---const BlueLinky = require('bluelinky');
const MQTT = require("async-mqtt");

const client = new BlueLinky({
  username: 'UVOUSER',
  password: 'UVOPW',
  brand: 'kia',
  region: 'EU',
  pin: 'UVOPIN'
});

client.on('ready', async () => {
  const vehicle = client.getVehicle('UVOVIN');
  try {
    const odo = await vehicle.odometer();
    console.log(odo); 
    const status = await vehicle.status({ parsed: false, refresh: true });
    console.log(status);
    const location = await vehicle.location();
    console.log(location);

    const mqttClient = await MQTT.connectAsync("mqtt://MQTTIP:MQTTPORT", { username:"MQTTUSER", password:"MQTTPW" })
    console.log("Sending to MQTT server");
    if ((status.evStatus.batteryStatus > 0) && (odo.value > 0)) {  // wird gelegentlich falsch mit 0 ausgelesen, dann nicht senden
        try {
                var options={
                retain:true,
                qos:1};
                await mqttClient.publish(
                   "BluelinkCarStatus/UVOVIN",
                   JSON.stringify({
                     odo: odo.value,
                     soc: status.evStatus.batteryStatus,
                     range: status.evStatus.drvDistance[0].rangeByFuel.evModeRange.value,
                     locked: status.doorLock,
                     battery12V: status.battery.batSoc,
                     longitude: location.longitude,
                     latitude: location.latitude,
                   }),options
                );

                // This line doesn't run until the server responds to the publish
                await mqttClient.end();
                // This line doesn't run until the client has disconnected without error
                console.log("mqtt call Done");
        } catch (e){
                // Do something about it!
                console.log(e.stack);
                process.exit();
        }
    } // if
  } catch (err) {
    // log the error from the command invocation
  }
});

client.on('error', async (err) => {
  // something went wrong with login
});

--- Ende Code ---

Auf Kommandozeile kann man dann als user pi ausführen mit


--- Code: ---cd /home/pi/bluelinky
node kia.js

--- Ende Code ---

Auf fhem Seite nimmt dieses MQTT-Device die Daten dann entgegen:
UVOVIN natürlich wieder mit der eigenen VIN ersetzten, IODev auf das passende MQTT2_SERVER Device verweisen, wenn man den fhem-eigenen MQTT-Server verwendet ist das i.d.R. m2s.


--- Code: ---defmod kia MQTT_DEVICE
attr kia DbLogInclude .*
attr kia IODev mein_MQTT_Server
attr kia autoSubscribeReadings BluelinkCarStatus/+
attr kia group Auto
attr kia icon car
attr kia stateFormat SOC: UVOVIN_soc % Reichweite: UVOVIN_range km km-Stand: UVOVIN_odo km
attr kia subscribeReading_UVOVIN BluelinkCarStatus/UVOVIN
attr kia userReadings battery {ReadingsNum($name,"UVOVIN_battery12V","") > 30 ? "ok" : "low"},\


--- Ende Code ---


Und mit diesem Helper werden aus den JSON-Strings Readings:


--- Code: ---defmod ej_kia expandJSON kia:.*
attr ej_kia addReadingsPrefix 1
attr ej_kia addStateEvent 1
attr ej_kia room hidden

--- Ende Code ---

und mit diesem Mechanismus starte ich das Skript regelmäßig (sollte man nicht allzu oft machen weil der UVO-Account dann irgendwann geblockt wird)


--- Code: ---defmod getuvo dummy
attr getuvo event-on-change-reading state
attr getuvo icon car
attr getuvo room Zeitsteuerung
attr getuvo webCmd on:off

defmod di_uvoUpdate DOIF ## Alle 40 min wenn kein Ladevorgang\
( ([+:40]) and ([?goeCharger1:state] ne "charging") and ([?goeCharger2:state] ne "charging"))\
   (set getuvo on) \
   (set getuvo off) \
DOELSEIF\
## Alle 20 Minuten bei Ladevorgang\
( ([+:20]) and (([?goeCharger1:state] eq "charging") or ([?goeCharger2:state] eq "charging")))\
   (set getuvo on)\
   (set getuvo off)\

attr di_uvoUpdate do always
attr di_uvoUpdate room Zeitsteuerung
attr di_uvoUpdate wait 0,30:0,30

defmod getuvoOn notify getuvo:on {system ("cd /home/pi/bluelinky && node kia.js &")}
attr getuvoOn room Zeitsteuerung


--- Ende Code ---

Grüße, gadget

Eckat:
Vielen, vielen Dank  :)

Da habe ich ja am Wochenende was zu tun  ;D

Det20:
Hallo,

inzwischen ist mein Sorento da und natürlich möchte ich auslesen/steuern, was geht.
Das Script habe ich soweit angepasst, allerdings passiert ... nix.

Mit dem MQTT habe ich noch nie etwas gemacht, hoffe, alles so eingestellt zu haben, wie es sein muss (allowed-Device fehlt hier).

Ein Device wird nicht automatisch angelegt und "nrclients" bleibt auch bei 0, Reading wird auch nicht auf aktuelle Uhrzeit aktualisiert, da kommt also nix an. Wenn ich mich per Telnet verbinde, wird zumindest die Uhrzeit vom Reading aktualisiert.


--- Code: ---Internals:
   Clients    :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
   ClientsKeepOrder 1
   DEF        1883 global
   FD         22
   FUUID      60d308de-f33f-4070-f6f3-39c86e9a91108539
   NAME       MQTT2_FHEM_Server
   NR         1282
   PORT       1883
   STATE      Initialized
   TYPE       MQTT2_SERVER
   .attraggr:
   .attrminint:
   MatchList:
     1:MQTT2_DEVICE ^.
     2:MQTT_GENERIC_BRIDGE ^.
   READINGS:
     2021-06-23 12:22:27   lastPublish     BluelinkCarStatus/xxxxxxxxxxxxxxxx:
     2021-06-23 12:29:36   nrclients       0
     2021-06-23 12:29:36   state           Initialized
   clients:
   retain:
Attributes:
   autocreate simple

--- Ende Code ---

Habe im Script (kia.js) gesehen, dass dort MQTT verwendet wird, nicht MQTT2. Macht das einen Unterschied?

Oder gibt es einen anderen Weg als das NODE Teil?

VG

gadget:
Funktioniert denn die Abfrage der Daten bei UVO prinzipiell wenn du
--- Code: ---node kia.js
--- Ende Code ---
auf der Kommandozeile ausführst ?
Ob überhaupt was an den MQTT Server gesendet wird kannst Du z.B. mit dem https://mqtt-explorer.com/ überprüfen.
Wofür hast Du eine MQTT_GENERIC_BRIDGE angelegt ?

Det20:

--- Zitat von: gadget am 23 Juni 2021, 14:15:25 ---Funktioniert denn die Abfrage der Daten bei UVO prinzipiell wenn du
--- Code: ---node kia.js
--- Ende Code ---
auf der Kommandozeile ausführst ?

--- Ende Zitat ---

Da kommt nix. Kein Output, kein Fehler, einfach 5 sekunden lang Pause und dann direkt wieder Prompt. Ohne irgendwelchen output.


--- Zitat von: gadget am 23 Juni 2021, 14:15:25 ---Wofür hast Du eine MQTT_GENERIC_BRIDGE angelegt ?

--- Ende Zitat ---

Habe ich nicht oder nicht mit Absicht. Erstellt wird er mit


--- Code: ---defmod MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server autocreate simple
attr MQTT2_FHEM_Server room AAA
attr MQTT2_FHEM_Server verbose 5

--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln