Blog

Geschwindigkeitsradar im Hausflur - Home Assistant Integration

2/1/2024 3 Min. Lesezeit Mikrocontroller
Geschwindigkeitsradar im Hausflur - Home Assistant Integration

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, das aufzuzeichnen und auszuwerten – und genau darum geht es in diesem Post.


Hintergrund

In der Vergangenheit haben wir uns bereits die Geschwindigkeit von Personen und Objekten direkt in der Konsole ausgeben lassen.

Heute kümmern wir uns darum, dass die Daten via MQTT an Home Assistant gesendet werden.

Was ihr dann damit anstellt, bleibt natürlich euch überlassen.


Programmieren des Mikrocontrollers

Der Code sollte auf allen üblichen Mikrocontrollern laufen – Hauptsache, sie haben WLAN-Funktionalität.

Es spielt keine Rolle, ob Arduino, ESP32 oder sonstige Alternativen.

Voraussetzung:
MQTT ist bereits in Home Assistant eingerichtet.

Das ursprüngliche Skript wurde um WLAN- und MQTT-Funktionalität ergänzt.

Die Variablen im Code müsst ihr für euer Netzwerk anpassen.

Falls ihr keine besonders komplexe Home-Assistant-Installation habt, entspricht der MQTT-Server in der Regel eurem Home-Assistant-Server.

Dafür braucht ihr einen Benutzer in Home Assistant – es lohnt sich, hierfür einen eigenen MQTT-User zu erstellen.


Beispielcode

#include 
#include 

// WLAN-Konfiguration
const char* ssid = "DEIN_WLAN_SSID";          // WLAN-SSID
const char* password = "DEIN_WLAN_PASSWORT"; // WLAN-Passwort

// MQTT-Server-Konfiguration
const char* mqttServer = "DEIN_MQTT_SERVER";
const int mqttPort = 1883;
const char* mqttUser = "DEIN_MQTT_USER";
const char* mqttPassword = "DEIN_MQTT_PASSWORT";
const char* mqttTopic = "homeassistant/sensor/speed_sensor/state";

WiFiClient espClient;
PubSubClient client(espClient);

const int sensorPin = 26;
const float frequency = 10.525e9;
const float c = 3e8;
const int measureDuration = 100;
const int numMeasurements = 10;

volatile unsigned long pulseCount = 0;

void IRAM_ATTR handlePulse() {
  pulseCount++;
}

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(sensorPin), handlePulse, RISING);

  // WLAN verbinden
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Verbinde mit WLAN...");
  }
  Serial.println("Mit WLAN verbunden");

  // MQTT verbinden
  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);
    }
  }

  // Home Assistant 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);
}

void loop() {
  float totalSpeed = 0.0;
  unsigned long startTime = millis();

  for (int i = 0; i < numMeasurements; i++) {
    unsigned long measurementStartTime = millis();
    pulseCount = 0;

    // Messung (100 ms)
    delay(measureDuration);

    unsigned long duration = millis() - measurementStartTime;
    unsigned long pulses = pulseCount;

    float pulseFrequency = (float)pulses / duration * 1000;
    float speed_m_s = pulseFrequency * c / (2 * frequency);
    float speed_km_h = speed_m_s * 3.6;

    totalSpeed += speed_km_h;
  }

  float averageSpeed = totalSpeed / numMeasurements;

  Serial.print("Durchschnittliche Geschwindigkeit: ");
  Serial.print(averageSpeed);
  Serial.println(" km/h");

  if (client.connected()) {
    String payload = String(averageSpeed);
    client.publish(mqttTopic, payload.c_str());
  }

  client.loop();

  unsigned long endTime = millis();
  unsigned long loopDuration = endTime - startTime;
  if (loopDuration < 1000) {
    delay(1000 - loopDuration);
  }
}

Debugging

Wer prüfen möchte, ob alles funktioniert, kann einen Blick in die Konsole des Mikrocontrollers werfen.

Dort sollten WLAN- und MQTT-Fehler sichtbar sein.

Noch detaillierter wird es mit einem MQTT Explorer:

Damit lässt sich genau verfolgen, welche Daten der ESP/Arduino an den MQTT-Server übermittelt.


Home Assistant Integration

Wenn du das MQTT-Topic im Skript nicht angepasst hast, erkennt Home Assistant die Entität automatisch via MQTT Discovery.

Nach wenigen Minuten sollte die Entität „Speed Sensor“ in Home Assistant erscheinen.


Feintuning

Falls die Messwerte ungenau sind oder der Sensor nicht zuverlässig reagiert:

  • Ausrichtung prüfen
  • Drehregler am Sensor für Sensibilität einstellen

Bei meinen Tests habe ich auf 3–5 Metern Entfernung brauchbare Ergebnisse erhalten.

Ob die Messung absolut präzise ist, kann ich nicht garantieren – aber für meine Zwecke reicht es völlig.