[Gelöst] MQTT2-Server Funktionstest von Linux Seite aus

Begonnen von Rewe2000, 09 Juli 2023, 10:29:43

Vorheriges Thema - Nächstes Thema

Rewe2000

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
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Otto123

#1
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

rudolfkoenig

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.cfgEine parallel laufende FHEM Installation wird nicht gestoert.

Rewe2000

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
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky