Jump to content

Auslesen von Sensoren über ESP32 Ethernet Brick und MQTT


basti571

Recommended Posts

Hallo zusammen,

ich würde gerne einen Hall Sensor 2.0 Bricklet und einen Drehstromzähler auslesen und die Daten per Node-Red auf einem PC weiterverarbeiten.

Dazu habe ich mir folgendes gedacht:

- Der ESP32 Ethernet Brick ist über ein Ethernetkabel an meinen PC angeschlossen

- Der Hall Bricklet ist ganz normal an den ESP Brick angeschlossen

- Der Drehstromzähler, welcher über RS485 seinen Stand durchgibt ist mit einem dazwischen geschaltenen RS485 Bricklet an des ESP Brick angschlossen.

Der ESP Brick soll jetzt als MQTT-Client die Daten der beiden "Sensoren" an den Broker auf dem PC schicken, damit NodeRed diese als weiterer Client bekommt. Dazu will ich in der Arduino IDE ein Programm schreiben was genau das macht und dieses auf den ESP laden. Ich habe gelesen, dass es mittlerweile eine MQTT-API gibt. Hier weiß ich jedoch nicht wie diese angewendet wird. Wenn ich in der Arduino IDE eine eigene Firmware für den ESP schreibe, trage ich dann hier auch, wie in der Anleitung der MQTT-API beschrieben, die Adresse des Brokers etc. ein?

Ich habe außerdem gelesen, dass die Verwendung des ESP32-Bricks über Ethernet viel zusätzlicher Programmierungsaufwand bedeutet. Wäre es hier sinnvoller einfach einen Master-Brick 3.2 zu verwenden und per USB anzuschließen? Worüber die Verbindung geht ist mir prinzipiell egal.

Vielleicht zerdenke ich das ganze auch und es gibt eine einfachere Lösung. Falls mir jemand weiterhelfen könnte, wäre ich sehr dankbar.

Grüße

 

 

 

Link to comment
Share on other sites

Die MQTT-API ist praktisch eine Schnittstelle zwischen einem MQTT-Broker und einem PC mit Brick Daemon und angeschlossenem Master Brick. Mit einem ESP kannst du das nicht verwenden.

Willst du den ESP benutzen, kannst du entweder die Arduino IDE benutzen, womit du wahrscheinlich einiges selbst machen musst, also z.B. Ethernet aktivieren, MQTT-Verbindung aufbauen und Daten darüber versenden, etc.

Alternativ kannst du unsere ESP32 Firmware benutzen. Da ist der Einarbeitungsaufwand wahrscheinlich größer, aber dafür ist einiges schon fertig und es gibt ein Tutorial zum Bauen eigener Module für neue Funktionalität. Ethernet und MQTT sind schon fertig. Wenn du die Module drin hast, kannst du die Einstellungen einfach über das Webinterface des ESP anpassen. Legst du einen neuen „State“ für irgendwelche Daten an, werden die dann automatisch per MQTT bereitgestellt.

Hier mal als Beispiel ein Modul, das ich benutze, um einfach die Temperatur von einem Humidity Bricklet per MQTT bereitzustellen:

#include "module_dependencies.h"
#include "temperature.h"

#include "bindings/hal_common.h"
extern TF_HAL hal;

#include "api.h"
#include "event_log.h"

void Temperature::pre_setup() {
    state = Config::Object({
        {"temperature", Config::Int(-27316, -27316, 65535)}, // in centicelsius (cC)
    });
}

static void temperature_cb(TF_HumidityV2 * /*device*/, int16_t temperature, void *user_data) {
    ConfigRoot *state = static_cast<ConfigRoot *>(user_data);
    state->get("temperature")->updateInt(temperature);
}

void Temperature::setup() {
    if (tf_humidity_v2_create(&bricklet_humidity, nullptr, &hal) == TF_E_OK) {
        tf_humidity_v2_register_temperature_callback(&bricklet_humidity, temperature_cb, &state);
        tf_humidity_v2_set_temperature_callback_configuration(&bricklet_humidity, 500, false, 'x', 0, 0);
        initialized = true;
    }

    if (initialized) {
        logger.printfln("Ready");
    } else {
        logger.printfln("No Humidity Bricklet 2.0 found");
    }
}

void Temperature::register_urls() {
    api.addState("temperature/state", &state);
}
  1. In pre_setup einen State anlegen, der hier nur einen Temperaturwert enthält.
  2. In setup das Bricklet einrichten und den Callback für die Temperatur aktivieren.
  3. Der Callback schreibt einfach die Temperaturwerte in den State.
  4. In register_urls den State registrieren, damit er automatisch per MQTT bereitgestellt wird.

Das Auslesen eines RS485-Zählers ist da natürlich deutlich aufwändiger. Außer, du willst zufällig einen Eastron SDM72DM, SDM72DMv2 oder SDM630 auslesen. Das haben wir schon fertig und wenn du die Module „meters“ und „meters_rs485_bricklet“ einbaust, bist du praktisch fertig. Für andere Zähler kannst du dir letzteres Modul ansehen und etwas Ähnliches für deinen Zähler implementieren oder alternativ das Modul erweitern.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...