ESP32-C6 - Hat schon jemand Erfahrungen mit Selbstbau-Zigbee?

Begonnen von Beta-User, 16 April 2025, 10:38:19

Vorheriges Thema - Nächstes Thema

TomLee

#15
Zitat von: betateilchen am 17 April 2025, 16:39:03Mit dem C6 habe ich schon einige der Zigbee-Beispiel-sketches, die in der Arduino IDE mitgeliefert werden, ausprobiert und sie haben alle auf Anhieb funktioniert.


---



Mit einem ESP32 C6 Super Mini funzt das Zigbee_Color_Dimmable_Light bei mir auch auf Anhieb.
Hast Du eine Konverter-Datei erstellt, das dein Device "Unterstützt" (Reiter Über->Unterstützungsstatus) wird?
Mit der aktuellen Arduino IDE 2.3.6 und der Bibliothekversion esp32 3.2.0 steht da bei mir ohne zutun "Nicht unterstützt (how_to_add_support)".

Mein Gedanke war ein HIGH/LOW auszuwerten, weder mit Zigbee_Color_Dimmer_Switch, Zigbee_Occupancy_Sensor oder Zigbee_On_Off_Switch war mir das heute nach meinen ersten Gehversuchen gelungen.
Bin erstmal ratlos.

edit:
Lösung: Macht man keinen Neustart von z2m nach dem neu flashen eines anderen Sketches, wird das Device immer als Zigbee_Model des zuvor gelöschten Device erkannt.


TomLee

Den Zigbee_Occupancy_Sensor.ino Sketch hab mir leicht angepasst:

#ifndef ZIGBEE_MODE_ZCZR
#error "Zigbee router mode is not selected in Tools->Zigbee mode"
#endif

#include "Zigbee.h"

/* Zigbee occupancy sensor configuration */
#define OCCUPANCY_SENSOR_ENDPOINT_NUMBER 10
uint8_t button = BOOT_PIN;
uint8_t sensor_pin = 4;  // GPIO4
ZigbeeOccupancySensor zbOccupancySensor = ZigbeeOccupancySensor(OCCUPANCY_SENSOR_ENDPOINT_NUMBER);

void setup() {
  Serial.begin(115200);

  // Init Button + Sensor
  pinMode(button, INPUT_PULLUP);     // BOOT-Taste mit internem Pullup
  pinMode(sensor_pin, INPUT_PULLUP); // GPIO4 mit internem Pullup

  // Geräteinformationen
  zbOccupancySensor.setManufacturerAndModel("ESP32-C6", "DIY-LD2410B");
  // determine powersource
  zbOccupancySensor.setPowerSource(ZB_POWER_SOURCE_MAINS);

  // Endpoint registrieren
  Zigbee.addEndpoint(&zbOccupancySensor);

  Serial.println("Starte Zigbee im Router-Modus...");
  if (!Zigbee.begin(ZIGBEE_ROUTER)) {
    Serial.println("Zigbee konnte nicht gestartet werden!");
    ESP.restart();
  }

  // Netzwerk 180 Sekunden nach Boot offen lassen
  Zigbee.setRebootOpenNetwork(180);

  Serial.println("Warte auf Netzwerkverbindung...");
  while (!Zigbee.connected()) {
    Serial.print(".");
    delay(100);
  }
  Serial.println("\nVerbunden als Router.");
}

void loop() {
  static bool occupancy = false;

  // GPIO4 → LOW = Bewegung, HIGH = keine Bewegung
  if (digitalRead(sensor_pin) == LOW && !occupancy) {
    zbOccupancySensor.setOccupancy(true);
    zbOccupancySensor.report();
    Serial.println("Bewegung erkannt → occupancy = true");
    occupancy = true;
  } else if (digitalRead(sensor_pin) == HIGH && occupancy) {
    zbOccupancySensor.setOccupancy(false);
    zbOccupancySensor.report();
    Serial.println("Keine Bewegung → occupancy = false");
    occupancy = false;
  }

  // Factory Reset bei langem Tastendruck
  if (digitalRead(button) == LOW) {
    delay(100);  // Entprellung
    int startTime = millis();
    while (digitalRead(button) == LOW) {
      delay(50);
      if ((millis() - startTime) > 3000) {
        Serial.println("Factory Reset in 1 Sekunde...");
        delay(1000);
        Zigbee.factoryReset();
      }
    }
  }

  delay(100);
}

(Optionale) Konverter-Datei:
import * as m from 'zigbee-herdsman-converters/lib/modernExtend';

export default {
    zigbeeModel: ['DIY-LD2410B'],
    model: 'DIY-LD2410B',
    vendor: 'ESP32-C6',
    description: 'Automatically definition',
    extend: [m.occupancy()],
    meta: {},
};

Im seriellen Monitor sehe ich das die Ereignisse nur einmal gesendet werden:
Bewegung erkannt → occupancy = true
Keine Bewegung → occupancy = false

in z2m ist im Debug-Log nur folgendes zu sehen:
[2025-06-12 12:47:31] z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{"linkquality":183,"occupancy":true}'
[2025-06-12 12:47:31] z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{"linkquality":207,"occupancy":false}'

in FHEM kommen die Ereignisse aber immer doppelt an:
12:47:31.867 zigbee_pi zigbee2mqtt/bridge/logging {"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":183,\"occupancy\":true}'"}
12:47:31.892 zigbee_pi zigbee2mqtt/0x543204fffe3d996c {"linkquality":183,"occupancy":true}
12:47:31.932 zigbee_pi zigbee2mqtt/0x543204fffe3d996c {"linkquality":183,"occupancy":true}
12:47:31.970 zigbee_pi zigbee2mqtt/bridge/logging {"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":207,\"occupancy\":false}'"}
12:47:31.989 zigbee_pi zigbee2mqtt/0x543204fffe3d996c {"linkquality":207,"occupancy":false}
12:47:32.016 zigbee_pi zigbee2mqtt/0x543204fffe3d996c {"linkquality":207,"occupancy":false}

Ist in dem Thema irgendwer soweit drin das er mir sagen kann warum die Events in FHEM doppelt ankommen?
Mein Gedanke war das z2m da was falsch interpretiert, darum hab ich eine Konverter-Datei erstellt. Damit wird das Device auch supported, aber es bleibt beim gleichen Verhalten mit den doppelten Events.