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.

TomLee

Offensichtlich beschränkt sich meine Frage auf einen kleinen Kreis hier.

Auch nur Gedanken zu dem Thema wären hilfreich.

betateilchen

Zitat von: TomLee am 13 Juni 2025, 21:39:03Auch nur Gedanken zu dem Thema wären hilfreich.

Meine Vermutung ist (aufgrund des Zeitversatzes), dass die doppelten Nachrichten im Umfeld Deiner mqtt-Konfiguration bzw. FHEM/z2m erzeugt werden. Beispielsweise könnten die Nachrichten beim mqtt-Server ankommen, der sie dann selbst wieder per publish an andere clients weiterschickt. Damit wird quasi ein "Echo" erzeugt.

Bei mir kommen keine doppelten Nachrichten in FHEM an.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatBei mir kommen keine doppelten Nachrichten in FHEM an.

Mit Zigbee2MQTT version 2.4.0?

TomLee

ZitatMeine Vermutung ist (aufgrund des Zeitversatzes), dass die doppelten Nachrichten im Umfeld Deiner mqtt-Konfiguration bzw. FHEM/z2m erzeugt werden. Beispielsweise könnten die Nachrichten beim mqtt-Server ankommen, der sie dann selbst wieder per publish an andere clients weiterschickt. Damit wird quasi ein "Echo" erzeugt.

Danke.

Interessanter Ansatz, weil genau so was mag ich nicht ausschliessen.
Ich schau mir das mit verbose 5 am MQTT2_Server die Tage mal an, ob das wirklich der Fall sein sollte.


betateilchen

Zitat von: TomLee am 13 Juni 2025, 22:20:17
ZitatBei mir kommen keine doppelten Nachrichten in FHEM an.

Mit Zigbee2MQTT version 2.4.0?

2.4.0-dev commit: 6a8d2085
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Wenn der MQTT2-Server was weiterschicken sollte, würde in der zweiten Spalte des Output vom Traffic-Monitor doch statt der CID, SENT stehen?

TomLee

#23
Raus scheint da wirklich was gesendet zu werden. Verstehen tu ich es aber erstmal nicht:

2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0(171)(1)(0)(26)zigbee2mqtt/bridge/logging{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":199,\"occupancy\":true}'"}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/bridge/logging:{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":199,\"occupancy\":true}'"}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/bridge/logging:{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":199,\"occupancy\":true}'"}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0(171)(1)(0)(26)zigbee2mqtt/bridge/logging{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":199,\"occupancy\":true}'"}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/bridge/logging\000{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\\"linkquality\\":199,\\"occupancy\\":true}'"}
2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0D(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/0x543204fffe3d996c:{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/0x543204fffe3d996c:{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0D(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/0x543204fffe3d996c\000{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0D(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/0x543204fffe3d996c:{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/0x543204fffe3d996c:{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0D(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/0x543204fffe3d996c\000{"linkquality":199,"occupancy":true}
2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0(172)(1)(0)(26)zigbee2mqtt/bridge/logging{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":191,\"occupancy\":false}'"}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/bridge/logging:{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":191,\"occupancy\":false}'"}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/bridge/logging:{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":191,\"occupancy\":false}'"}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0(172)(1)(0)(26)zigbee2mqtt/bridge/logging{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\"linkquality\":191,\"occupancy\":false}'"}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/bridge/logging\000{"level":"info","message":"z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0x543204fffe3d996c', payload '{\\"linkquality\\":191,\\"occupancy\\":false}'"}
2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0E(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/0x543204fffe3d996c:{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/0x543204fffe3d996c:{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0E(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/0x543204fffe3d996c\000{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5: in@127.0.0.1:37192 PUBLISH: 0E(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 4:   MQTT2_Server_127.0.0.1_37192 zigbee_pi PUBLISH zigbee2mqtt/0x543204fffe3d996c:{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5:   MQTT2_Server_127.0.0.1_37192 zigbee_pi => zigbee2mqtt/0x543204fffe3d996c:{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5: out@127.0.0.1:37192 PUBLISH: 0E(0)(30)zigbee2mqtt/0x543204fffe3d996c{"linkquality":191,"occupancy":false}
2025.06.14 12:51:09 5: MQTT2_Server: dispatch autocreate=simple\000zigbee_pi\000zigbee2mqtt/0x543204fffe3d996c\000{"linkquality":191,"occupancy":false}

defmod MQTT2_Server MQTT2_SERVER 1883 global
attr MQTT2_Server ignoreRegexp shellies/[^:"]+/command|shellies/[^:"]+/command|cmnd/[^:"]+:|homeassistant/[^:"]+/config|tasmota/discovery/[^/:]+/(config|sensors)|devcontrol/[0-8]+/[0-8]+
attr MQTT2_Server respectRetain 0
attr MQTT2_Server room IOs

setstate MQTT2_Server 2025-06-14 12:54:51 lastPublish ebusd/700/Hc1ExcessTemp/get:
setstate MQTT2_Server 2025-06-14 13:00:29 nrclients 18
setstate MQTT2_Server 2025-06-12 10:10:35 state Initialized


defmod zigbee_0x543204fffe3d996c MQTT2_DEVICE zigbee_0x543204fffe3d996c
attr zigbee_0x543204fffe3d996c devStateIcon Motion..true:people_sensor Motion..false:motion_detector
attr zigbee_0x543204fffe3d996c devicetopic zigbee2mqtt/0x543204fffe3d996c
attr zigbee_0x543204fffe3d996c readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/availability:.* { json2nameValue($EVENT) }
attr zigbee_0x543204fffe3d996c room MQTT2_DEVICE
attr zigbee_0x543204fffe3d996c stateFormat Motion: occupancy
attr zigbee_0x543204fffe3d996c webCmd :

setstate zigbee_0x543204fffe3d996c Motion: false
setstate zigbee_0x543204fffe3d996c 2025-06-12 10:09:57 IODev MQTT2_Server
setstate zigbee_0x543204fffe3d996c 2025-06-14 13:00:31 associatedWith MQTT2_zigbee_bridge
setstate zigbee_0x543204fffe3d996c 2025-06-14 13:03:44 linkquality 199
setstate zigbee_0x543204fffe3d996c 2025-06-14 13:03:44 occupancy false
setstate zigbee_0x543204fffe3d996c 2025-06-14 13:00:31 state online

TomLee

#24
Im Frontend wird das Debug-Log default nicht mehr angezeigt ::)
Im Terminal sehe ich mit mosquitto_ sub und in z2m das die Ereignisse doppelt von z2m gepublisht werden.

Das ich nicht die dev-Version nutze, les ich an den Änderungen nicht raus, das es daran liegen könnte.
Kann sowas evtl. auch an der verwendeten Coordinator-Firmwareversion liegen ? Hab bei meinem Conbee 2 nie ein update gemacht. Der hat noch 0x26580700 aus 2020 drauf.