HomeAssistant MQTT Component / Last will topic

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
iLLneSs
Beiträge: 5
Registriert: 26. Dez 2018 11:43
Answers: 0

HomeAssistant MQTT Component / Last will topic

Beitrag von iLLneSs »

Moin,

nach langer Zeit wollte ich mich mal wieder der Hausautomation widmen und einen ESP32 Devkit mit MQTT an Openhab 3 anbinden.

In OH nutze ich das HomeAssistant MQTT Component thing. Funktioniert auch soweit und sogar mit auto discovery.

Mir ist dabei aufgefallen das OH nicht merkt wenn das Gerät Offline geht. Zu dem Thema bin ich dann auf das Last will topic gestoßen.
Hier ist jetzt mein Problem...irgendwie steh ich hier aufm Schlauch. Wie verwende ich das jetzt? Wie ich das verstanden habe muss ich doch eigentlich nur auf einen Topic (z.B. home/sensor/status) ein "online" schicken. Dieser wird dann beim disconnecten vom broker wieder auf "offline" gesetzt, richtig?
Für das Last will topic gibt es keine Eingabe möglichkeit im HomeAssistant MQTT thing, im generic mqtt thing geht das aber. Geht das überhaupt da?

Evtl. hat ja schon einer das gleiche Problem gehabt.

Hier noch Codeschnipsel aus dem ESP32 zur übersicht:

PubSubClient wird für MQTT genutzt

Code: Alles auswählen

#include <PubSubClient.h>
String stateTopic = "home/plants/1/state";
Status publishen

Code: Alles auswählen

 DynamicJsonDocument doc(1024);
    char buffer[256];

    doc["humidity"] = humidity;
    doc["temperature"]   = temperature;
  
    size_t n = serializeJson(doc, buffer);

    bool published = client.publish(stateTopic.c_str(), buffer, n);
Discovery message senden

Code: Alles auswählen

void sendMQTTTemperatureDiscoveryMsg() {
  int sensorNumber = 1;
  String stateTopic = "home/plants/" + String(sensorNumber) + "/state";
  String discoveryTopic = "homeassistant/sensor/plant_sensor_" + String(sensorNumber) + "/temperature/config";

   DynamicJsonDocument doc(1024);
  char buffer[256];

  doc["name"] = "Gewächshaus Temperatur 1";
  doc["stat_t"]   = stateTopic;
  doc["unit_of_meas"] = "°C";
  doc["dev_cla"] = "temperature";
  doc["frc_upd"] = true;
  doc["val_tpl"] = "{{ value_json.temperature|default(0) }}";

  size_t n = serializeJson(doc, buffer);

  client.publish(discoveryTopic.c_str(), buffer, n);
}
Grüße Alex

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: HomeAssistant MQTT Component / Last will topic

Beitrag von udo1toni »

Nein. Das LastWillTopic ist ein spezielles Topic. Du musst dieses im ESP32 erst mal als LWT definieren und beim Verbinden mit dem Broker dem Broker mitteilen, welchen Wert der Broker setzen soll, wenn er eine Trennung des Clients erkennt.
Wenn sich der Client korrekt abmeldet, muss er LWT übrigens aktiv auf offline setzen, der Broker tut dies nur bei ungeplantem Kommunikationsabbruch.

Wie es direkt auf dem EPS32 geht, weiß ich nicht, aber mal als Beispiel, wie ich es in Python gemacht habe (nur der essenzielle Teil...)

Code: Alles auswählen

#!/usr/bin/python

from paho.mqtt import client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    client.publish(MQTT_PATH+"LWT", payload="Online", qos=0, retain=True)
    logging.info("Connected with result code "+str(rc))
    if rc: logging.warning("Connecting resulted with" +str(rc))
    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe(MY_COMMAND)
    logging.info("Subscribed to "+str(MY_COMMAND))


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.will_set(MQTT_PATH+"LWT", payload="Offline", qos=0, retain=True)

client.connect(MQTT_SERVER, MQTT_PORT, MQTT_RECONNECT)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

iLLneSs
Beiträge: 5
Registriert: 26. Dez 2018 11:43
Answers: 0

Re: HomeAssistant MQTT Component / Last will topic

Beitrag von iLLneSs »

Moin,

ok danke. Grunsätzlich funktioniert es jetzt. Jedoch kann das "HomeAssistant MQTT Component" anscheinend nichts damit anfangen. Wenn ich eine "Generic MQTT Thing" anlege geht es. Hier kann ich auch einen Last will Topic wählen.

Der Versuch das direkt im Code zu machen beim HomeAssistant MQTT ging auch nicht:

Code: Alles auswählen

UID: mqtt:homeassistant_humidity:ea58938595:humidity
label: Gewächshaus Luftfeuchtigkeit 1 (Sensor)
thingTypeUID: mqtt:homeassistant_humidity
configuration:
  payloadNotAvailable: alive
  payloadAvailable: dead
  availabilityTopic: home/plants/1/availability
  topics:
    - sensor/plant_sensor_1/humidity
  basetopic: homeassistant
bridgeUID: mqtt:broker:ea58938595

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: HomeAssistant MQTT Component / Last will topic

Beitrag von udo1toni »

Ich bin mir ziemlich sicher, dass HomeAssistant MQTT Component alles automatisch setzt. Wenn dort etwas nicht gesetzt ist, kannst Du das nicht einfach so dazu konfigurieren. Ich dachte, Du beziehst Dich auf den ESP Client und wie Du ihn als generic MQTT Thing mit Availability einbinden kannst...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

iLLneSs
Beiträge: 5
Registriert: 26. Dez 2018 11:43
Answers: 0

Re: HomeAssistant MQTT Component / Last will topic

Beitrag von iLLneSs »

Ja das habe ich gemerkt das ich das jetzt nicht einfach so machen kann. Die HomeAssistant Component senden das LWT wohl auf homeassistant/status. Dort möchte ich das aber nicht.

Schlussendlich habe ich mich jetzt für das Generic MQTT entschieden. Das Autodisovery ist zwar ganz nett aber der on/offline Status ist mir wichtiger.

Das "willTopic" nur im Generic MQTT Thing unter Avilability Topic eintragen dann geht es so:

Code: Alles auswählen

String willTopic = "home/greenhouse_esp32_1/availability";

Code: Alles auswählen

while (!client.connected()) {
    Serial.print(".");
   
   if(client.connect(mqttName.c_str(), mqttUser, mqttPassword, willTopic.c_str(),0, 1, "OFF")){
      client.publish(willTopic.c_str(),"ON",true); [/b]
      Serial.println("Connected to MQTT");
 
    } else {

      Serial.println("failed with state ");
      Serial.print(client.state());
      delay(2000);

    }
  }
... als LWT definieren ...
Irgendwie war das der Knackpunkt. Danke.

Gruß Alex

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: HomeAssistant MQTT Component / Last will topic

Beitrag von udo1toni »

Immer gerne :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten