Hallo,
ich hänge mal wieder und benötige eure Hilfe bei meinem Problem.
Ich habe meinen KIA e-Niro in der Vergangenheit über die KIA-App mit Bluelinky auf einem Raspi4 abgefragt und die Daten dann über MQTT2 an Fhem gesendet. Das hat auch solange prima geklappt, bis der Hersteller der App den Zugang modifiziert hat. In der Vergangenheit hatte ich ein Update von Bluelinky ausgeführt und die Verbindung hatte wieder funktioniert, aktuell ist dies aber nicht mehr der Fall.
Nun hätte ich gerne den MQTT2 Server von der Linux Seite aus getestet, ob dieser noch problemlos funktioniert, nicht dass dieser die Daten nicht mehr weiterleitet.
Gibt es über die Linux Kommandozeile eine Möglichkeit die Verbindung zu testen, damit ich mir nach Fhem einige Werte senden kann?
Dies würde mir sehr helfen, denn somit könnte ich feststellen ob mein Problem bei MQTT oder der App-Abfrage unter nodejs selbst liegt.
Ich hänge hier die benötigten Infos mit an, solltet Ihr noch etwas benötigen, so bitte ich um Info.
MQTT2-Server unter Fhem:
Internals:
Clients :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF 1883 global
FD 17
FUUID 63fe290e-f33f-7df9-9192-ec51f179475371a6
NAME MQTT2_Server
NR 581
PORT 1883
STATE Initialized
TYPE MQTT2_SERVER
eventCount 1
MatchList:
1:MQTT2_DEVICE ^.
2:MQTT_GENERIC_BRIDGE ^.
READINGS:
2023-07-08 20:28:17 nrclients 0
2023-07-08 20:49:06 state Initialized
clients:
Attributes:
DbLogExclude .*
autocreate simple
clientId M_ZF_842E
comment Dieser MQTT2_Server "MQTT2_Server" empfängt die Fahrzeugdaten von "node" "kia.js" unter Linux und leitet diese an das MQTT2_DEVICE "MQTT2_M_ZF_842E" weiter.
group MQTT
icon car
room Kommunikation,Wallbox
MQTT2_DEVICE unter Fhem:
Internals:
CID M_ZF_842E
DEF M_ZF_842E
FUUID 63ff881f-f33f-7df9-a34a-3447e0c66cc4ca57
IODev MQTT2_Server
NAME MQTT2_M_ZF_842E
NR 586
STATE SOC: 78 % Kilometer: 22.181,1 km Reichweite: 397 km
TYPE MQTT2_DEVICE
READINGS:
2023-07-08 20:28:17 IODev MQTT2_Server
2023-06-28 23:01:33 Kilometerstand 22.181,1
2023-06-28 23:01:33 battery ok
2023-06-28 23:01:33 battery12V 83
2023-06-28 23:01:33 latitude xx.xxxxx
2023-06-28 23:01:33 locked true
2023-06-28 23:01:33 longitude xx.xxxxx
2023-06-28 23:01:33 odo 22181.1
2023-06-28 23:01:33 range 397
2023-06-28 23:01:33 soc 78
hmccu:
Attributes:
DbLogExclude .*
DbLogInclude soc:43200,Kilometerstand:43200,locked:43200,battery12V:43200
comment Dieses MQTT2_DEVICE "MQTT2_M_ZF_842E" empfängt die Fahrzeugdaten vom MQTT2_SERVER "MQTT2_Server" und stellt diese in Fhem zur Verfügung.
Hinweis:
Als attr "clientId" wurde das Kennzeichen des Fahrzeugs "M_ZF_842E" gesetzt, damit nicht für jeden Datensatz ein eigenes MQTT2_DEVICE mit einer zufälligen "clientId" erzeugt wird.
Dieses Device wird vom "MQTT2_SERVER" automatisch angelegt, wenn das Attribut "autocreate simple" gesetzt wurde.
Eine eimalige sichtbare Abfrage, lässt sich mit dem Befehl auf der Fhem Komandozeile ausführen: "{system ("cd /home/reinhard/bluelinky && node kia.js > &")}"
Im userReadings "Kilometerstand" wird das reading "odo", über die Funktion "tausender" in "99myUtils.pm" in eine lesbare deutsche Schreibweise, mit einer Nachkommastelle umgewandelt.
event-on-change-reading .*
group MQTT
icon car
readingList M_ZF_842E:BluelinkCarStatus/xxxxxxxxxxxxxxxxx:.* { json2nameValue($EVENT) }
room Kommunikation,Wallbox
stateFormat SOC: soc % Kilometer: Kilometerstand km Reichweite: range km
userReadings battery {ReadingsNum($name,"battery12V",00) > 30 ? "ok" : "low"}, Kilometerstand { tausender (sprintf("%.1f", ReadingsNum("$name","odo",0))) }
Mit folgendem Node.js Script stelle ich die Daten für den MQTT2_Server bereit:
const BlueLinky = require('bluelinky');
const MQTT = require("async-mqtt");
const client = new BlueLinky({
username: 'Benutzername',
password: 'Passwort',
brand: 'kia',
region: 'EU',
pin: 'Geheim'
});
client.on('ready', async () => {
const vehicle = client.getVehicle('Fahrgestellnummer');
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://127.0.0.1:1883", { username:"Benutzer-Raspi", password:"Passwort-Raspi" })
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/Fahrgestellnummer",
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
});
Grundsätzlich ist alles bis vor wenigen Tagen problemlos gelaufen, deshalb will ich zunächst mal MQTT ausschließen.
So wie es für mich aussieht sollte der Login mit meinen Benutzerdaten unter Node.js klappen.
Gebe ich direkt auf der Linux Kommandozeile den Abfrageaufruf:
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ cd /home/reinhard/bluelinky
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ node kia.js
reinhard@Fhem-Bullseye-SSD:~/bluelinky $
ein, so kommt jedoch überhaupt keine Rückmeldung und auch kein Fehler. Nur die App am Android Handy stellt sich von Deutsch wieder auf Englisch zurück.
Schreibe ich den Usernamen in den Anmeldedaten falsch, so wird ein Fehler angezeigt, das ist ja auch eine korrekte Reaktion.
Ich verwende bei Bluelinky die aktuelle Version 8.1.1 und für node und npm folgende Versionen:
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ node -v
v20.4.0
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ npm -v
9.7.2
Alles läuft auf einem Raspi4 unter Linux Bullsey (Debian), Linux selbst und Fhem ist aktuell.
Ich hoffe ihr könnt mir da einen Tipp geben.
Gruß Reinhard
Hallo Reinhard,
Zitat von: Rewe2000 am 09 Juli 2023, 10:29:43Gibt es über die Linux Kommandozeile eine Möglichkeit die Verbindung zu testen, damit ich mir nach Fhem einige Werte senden kann?
ja das geht, hier hatte ich mal damit experimentiert -> https://heinz-otto.blogspot.com/2019/11/mqtt-ich-muss-das-testen.html
Du brauchst
apt install mosquitto-clients
Gruß Otto
ZitatGibt es über die Linux Kommandozeile eine Möglichkeit die Verbindung zu testen, damit ich mir nach Fhem einige Werte senden kann?
mosquitto_pub, ueblicherweise Teil des mosquitto Paketes.
Auf dem MQTT-Server selbst, mit dem Standard-Port 1883, ohne Beutzer/Passwort reicht:
mosquitto_pub -t topic -m message
Weitere, oefters verwendete Parameter:
mosquitto_pub -h host -p port -u username -P password -i mqtt_client_id -t topic -m message
Mit FHEM:
in einer FHEM Installation eine neue Konfigurationsdatei anlegen, z.Bsp. unter dem Namen mqtt_test.cfg:
define m2c MQTT2_CLIENT localhost:1883
define n notify global:INITIALIZED sleep 0.5;; set m2c publish myTopic myMessage;; sleep 0.5;; shutdown
Und danach FHEM aufrufen mit:
perl fhem.pl mqtt_test.cfg
Eine parallel laufende FHEM Installation wird nicht gestoert.
Hallo euch beiden,
vielen Dank für die hilfreichen Tipps, ich habe den mosquitto-client nachinstalliert und dann wie von Rudi die Parameter mit Username/Passwort verwendet. Dies zeigt mir, die Probleme bei mir liegen nicht an MQTT und Fhem.
@Otto: Was hast du eigentlich nicht in deinen Blog dokumentiert, ich werde zukünftig erst die Suche bei dir bemühen, sollte ich erneut an meine geistigen Grenzen stoßen.
Sollte jemand das gleiche Problem haben, hier nochmals die Vorgehensweise wie ich es getestet habe.
Unter Raspi4 den Mosquito-Client nachinstallieren:
sudo apt install mosquitto-clients
Dann über die Linux Console folgenden Befehl absetzen:
sudo mosquitto_pub -h 127.0.0.1 -p 1883 -u Benutzer -P Kennwort -t Testmessage -m 'Meldung alles ist OK'
In Fhem kommen dann bei mir im MQTT2-Log folgende Daten an:
2023-07-09_17:36:57 MQTT2_RH_ZY_342E Testmessage: Meldung alles ist OK
Ich habe aktuell noch ein Problem mit Meldungen unter Linux in Zusammenhang mit node und npm, aber dazu mache ich einen neuen Betrag unter Einplatinencomputer.
Nochmals Danke für die schnelle Hilfe.
Gruß Reinhard