[gelöst] MQTT2 und ESP8266

Begonnen von JörgK, 13 März 2021, 14:37:38

Vorheriges Thema - Nächstes Thema

JörgK

Moin zusammen,

seit ein paar Tagen habe ich ein Brett vorm Kopf. Irgendwie komme ich nicht richtig weiter. Auch Google und YouTube war bisher nicht wirklich erfolgreich. Ich brauch halt kein Video in dem ein komplettes System per Komandozeile aufgesetzt wird. Mein Problem ist viel weiter hinten in der Kette. Auch durch die FHEM-Doku bin ich nicht richtig durchgestiegen.

Ich habe vor beliebige Sensoren und auch Aktoren über ESP8266 oder ESP32 per MQTT an FHEM anzubinden. Den Code für den ESP wollte ich selber erstellen, also kein Tasmota oder so.

Mit reinen Sensoren ist mir das schon ganz "einfach" gelungen, weil die Readings automatisch erstellt werden. Bei Devices mit entsprechenden Templates ging dies auch automatisch. Nur beim "Senden" von Informationen aus dem FHEM-Device heraus stehe ich beim eigenen Device auf dem Schlauch.
Jetzt wollte ganz am Anfang anfangen und habe für den ESP8266 das Beispielprogramm "mqtt_publish_in_callback" umgebaut um die Kommunikation mit FHEM zu testen.

FHEM Konfiguration:
MQTT2_SERVER Broker ist myMQTTBroker
MQTT Client auf dem ESP8266 ist MQTT2_arduinoClient


/*
Publishing in the callback

  - connects to an MQTT server
  - subscribes to the topic "inTopic"
  - when a message is received, republishes it to "outTopic"
 
  This example shows how to publish messages within the
  callback function. The callback function header needs to
  be declared before the PubSubClient constructor and the
  actual callback defined afterwards.
  This ensures the client reference in the callback function
  is valid.
 
*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = "WLAN"; // cannot be longer than 32 characters!
const char *pass = "PASSWORT"; //

// Update these with values suitable for your network.
IPAddress server(192, 168, 1, 2);

WiFiClient wclient;
PubSubClient client(wclient, server);

// Callback function
void callback(const MQTT::Publish& pub) {
  // In order to republish this payload, a copy must be made
  // as the orignal payload buffer will be overwritten whilst
  // constructing the PUBLISH packet.

  // Copy the payload to a new message
  MQTT::Publish newpub("outTopic", pub.payload(), pub.payload_len());
  client.publish(newpub);
}

void setup() {
  // Setup console
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      if (client.connect("arduinoClient")) {
client.publish("outTopic","hello world");
client.set_callback(callback);
client.subscribe("inTopic");
      }
    }

    if (client.connected())
      client.loop();
  }
}


In dem Beispiel wird die empfangene Botschaft "inTopic" wieder ans Reading "outTopic" an FHEM gesendet.
In FHEM wird auch das Reading "outTopic" angelegt und richtig beschrieben, bzw. mit "hello world" initialisiert.

Jetzt die große Frage: Wie kann ich in FHEM das "inTopic" senden und ins Device MQTT2_arduinoClient einbinden?
Später will ich dann mit der empfangenen Botschaft "inTopic" Aktionen auf dem ESP ausführen.

Vielleicht ist die Lösung auch nur eine Befehlszeile entfernt  ;D

Gruß Jörg.

Otto123

#1
Hallo Jörg,

kann sein ich versteh Dich falsch, aber Du willst innerhalb FHEM eine publish Nachricht absetzen die auch im MQTT2_Device landen soll?
Dann stellts Du den myMQTTBroker das attr rePublish 1 und wenn Du ein set myMQTTBroker publish base/topic/willi 1 absetzt wird ein Device welches auf den topic hört diese Nachricht empfangen.

Einfach an das externe Device senden geht allein mit dem publish Befehl

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

Beta-User

@Otto: Vermutlich will er nicht nur "irgendwie" publishen, sondern das an einen "virtuellen Ort" binden, also vermutlich:

@JörgK
Einfach in setList (oder getList) eintragen von dem MQTT2_DEVICE, das bei dir anscheinend "MQTT2_arduinoClient" heißt?
Da stehen die Anweisungen drin, die von diesem Device aus zu einem publish führen können.
Eine Vielzahl von Beispielen (auch für on/off und Freitext bzw. JSON) findest du in der attrTemplate-file.

Ggf. wäre es hilfreich, wenn du ein list von diesem Device einstellen könntest, falls das nach diesem Schubs noch erforderlich ist.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

JörgK

Hallo Otto,

danke für die schnelle Antwort  :D

Du hast mein Problem richtig verstanden. Ich denke meine Lösung liegt in der richtigen Adressierung des Devices.

set myMQTTBroker publish /base/topic/willi 1

base =  MQTT2_arduinoClient oder myMQTTBroker
topic =  inTopic
willi  =  weitere Ebenen habe ich nicht.
1      =  Wert als String

Oder?

Gruß Jörg

JörgK

Hallo Beta-User,

dein Schubs bringt mich der Lösung weiter näher  ;)

Im Shelly habe ich in der setList folgendes gefunden:
off:noArg shellies/shelly1-ABC/relay/0/command off
on:noArg shellies/shelly1-ABC/relay/0/command on
x_update:noArg shellies/shelly1-ABC/command update_fw
x_mqttcom shellies/shelly1-ABC/command $EVTPART1


Die Interpretation der Pfade kann ich allerdings gerade nicht auf mein Beispiel umbauen.
"shellies/shelly1-ABC"

shelly1-ABC ist bei mir MQTT2_arduinoClient
Aber welcher Pfad ist "shellies" bei mir?

Gruß Jörg

Beta-User

Zitat von: JörgK am 13 März 2021, 15:46:04
shelly1-ABC ist bei mir MQTT2_arduinoClient

Vermutlich ist diese Annahme nicht korrekt: Du hast m.E. nur "inTopic" (als flachen Text, dahinter verbirgt sich wohl kein komplexer strukturierter Topic-Pfad).
Du kannst das im Sketch anpassen, allerdings finde ich in deinem Sketch leider die Stelle nicht, wo das subscribe (auf "inTopic") festgelegt wird... Das müßte irgendwo anders stehen


Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

JörgK

#6
Hallo Beta-User,

das war es!!!

Im Set-Befehl von FHEM ist gar nicht das Ziel adressiert  :o

Ich versuche die ganze Zeit das Device mit anzugeben.......

Das heißt jetzt für mich, dass im Client (beim ESP) die komplette Pfadstruktur im subscribe angeben werden muss und dass eine Unterscheidung bei den Clients gemacht wird.

Danke für eure Hilfe  ;D

Übrigens das client.subscribe("inTopic"); steht in der loop()  ::)
Das kommt aus den Beispielen der ESP-Lib.
Ich packe es NATÜRLICH in die setup-Fkn  ;D

Gruß Jörg