Wie schnell läuft man wohl jeden Tag durch seinen Hausflur und variiert dies vielleicht im Tagesverlauf oder wer parkt schneller in der heimischen Garage ein?
Es wäre doch praktisch dies aufzuzeichnen und auszuwerten und genau darum geht es in diesem Post.
In der Vergangenheit haben wir uns bereits die Geschwindigkeit von Personen und Objekten in der Konsole ausgeben lassen. Wenn dich das interessiert schau hier vorbei: Radar Geschwindigkeitsmesser mit Arduino oder ESP32
Heute kümmern wir uns darum das die Daten via MQTT an Home Assistant gesendet werden und was ihr dann damit anstellt bleibt euch überlassen 🙂
Programmieren des Mikrocontrollers
Der Code sollte auf mehr oder weniger allen üblichen Mikrocontrollern laufen Hauptsache sie haben WLAN Funktionalität. Es spielt keine Rolle ob Arduino, ESP32 oder sonstige alternativen. Ich setze voraus das du MQTT bereits in Home Assistant eingerichtet hast. Das ursprüngliche Skript wurde um WLAN und MQTT Funktionalität ergänzt. Allerdings musst du die Variablen oben im Skript ausfüllen und für dein Netzwerk anpassen. Wenn du keine besonders komplexe Home Assistant Installation aufgesetzt hast entspricht der MQTT Server dem Home Assistant Server und als Benutzer musst du einen Home Assistant Benutzer anlegen. Es kann sich lohnen hierfür einen eigenen Benutzer zu erstellen.
#include <WiFi.h>
#include <PubSubClient.h>
// WLAN-Konfiguration
const char* ssid = "DEIN_WLAN_SSID"; // Ersetze durch deinen WLAN-SSID
const char* password = "DEIN_WLAN_PASSWORT"; // Ersetze durch dein WLAN-Passwort
// MQTT-Server-Konfiguration
const char* mqttServer = "DEIN_MQTT_SERVER"; // Ersetze durch die Adresse deines MQTT-Servers
const int mqttPort = 1883; // MQTT-Port (standardmäßig 1883)
const char* mqttUser = "DEIN_MQTT_USER"; // Ersetze durch deinen MQTT-Benutzernamen
const char* mqttPassword = "DEIN_MQTT_PASSWORT"; // Ersetze durch dein MQTT-Passwort
const char* mqttTopic = "homeassistant/sensor/speed_sensor/state"; // Home Assistant MQTT-Sensor Topic
WiFiClient espClient;
PubSubClient client(espClient);
const int sensorPin = 26; // GPIO-Pin, an dem der Sensor angeschlossen ist
const float frequency = 10.525e9; // Frequenz des Mikrowellen-Sensors in Hz
const float c = 3e8; // Lichtgeschwindigkeit in m/s
const int measureDuration = 100; // Messdauer in Millisekunden
const int numMeasurements = 10; // Anzahl der Messungen zur Mittelung
volatile unsigned long pulseCount = 0;
void IRAM_ATTR handlePulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200); // Serielle Kommunikation mit 115200 Baudrate
pinMode(sensorPin, INPUT); // Sensor-Pin als Eingang festlegen
attachInterrupt(digitalPinToInterrupt(sensorPin), handlePulse, RISING);
// Verbindung mit dem WLAN herstellen
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Verbinde mit WLAN...");
}
Serial.println("Mit WLAN verbunden");
// MQTT-Client einrichten
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
Serial.println("Verbinde mit MQTT-Server...");
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
Serial.println("Mit MQTT-Server verbunden");
} else {
Serial.print("Fehler beim Verbinden mit MQTT: ");
Serial.println(client.state());
delay(2000);
}
}
// Konfiguriere den Home Assistant MQTT-Sensor (Discovery)
String configTopic = "homeassistant/sensor/speed_sensor/config";
String configPayload = "{\"name\": \"Speed Sensor\", \"state_topic\": \"" + String(mqttTopic) + "\", \"unit_of_measurement\": \"km/h\", \"value_template\": \"{{ value }}\"}";
client.publish(configTopic.c_str(), configPayload.c_str(), true); // true für retain, um die Konfigurationsnachricht beizubehalten
}
void loop() {
float totalSpeed = 0.0;
unsigned long startTime = millis(); // Startzeit für die Schleife
for (int i = 0; i < numMeasurements; i++) {
unsigned long measurementStartTime = millis(); // Startzeit für die Messung
pulseCount = 0;
// 100 ms messen
delay(measureDuration);
unsigned long duration = millis() - measurementStartTime;
unsigned long pulses = pulseCount;
float pulseFrequency = (float)pulses / duration * 1000; // Pulsfrequenz in Hz
float speed_m_s = pulseFrequency * c / (2 * frequency); // Geschwindigkeit in m/s
float speed_km_h = speed_m_s * 3.6; // Geschwindigkeit in km/h
totalSpeed += speed_km_h;
}
float averageSpeed = totalSpeed / numMeasurements;
Serial.print("Durchschnittliche Geschwindigkeit: ");
Serial.print(averageSpeed);
Serial.println(" km/h");
// Übermittle Daten an den MQTT-Server für Home Assistant
if (client.connected()) {
String payload = String(averageSpeed);
client.publish(mqttTopic, payload.c_str());
}
// MQTT-Client Loop (zum Senden und Empfangen von Nachrichten)
client.loop();
// Warten Sie für den Rest der Sekunde, damit die Ausgabe jede Sekunde erfolgt
unsigned long endTime = millis();
unsigned long loopDuration = endTime - startTime;
if (loopDuration < 1000) {
delay(1000 - loopDuration);
}
}
Wer sich einen Überblick verschaffen möchte ob alles funktioniert kann einen Blick in die Konsole des Mikrocontrollers werfen. Dort sollten WLAN und MQTT Fehler aufgeführt werden. Wer noch tiefer einsteigen möchte kann sich einen MQTT Explorer installieren und genau nachschauen was auf dem MQTT Server los ist. Dort sollte dann auch dein ESP/Arduino auftauchen und fleißig die gemessene Geschwindigkeit übermitteln.
Home Assistant Integration
Wenn du das MQTT Topic im Skript nicht angepasst hast wird Home Assistant mittels MQTT Discovery die Entität automatisch erkennen. Es sollte nur wenige Minuten dauern bis die neue Entität namens „Speed Sensor“ in Home Assistant auftaucht. Das könnte dann so aussehen:
Feintuning
Sind die Messwerte ungenau oder der Sensor reagiert nicht richtig kann es nicht schaden die Ausrichtung zu prüfen und über den Drehregler am Sensor die Sensibilität einzustellen. Ich habe auf eine Entfernung von 3-5 Metern recht gute Messergebnisse erzielt. Wie präzise diese sind kann ich natürlich nicht sagen, aber sie scheinen plausibel und sind für meine Zwecke absolut ausreichend 😉
Schreibe einen Kommentar