Un router Zigbee à 3 €

Bonjour,
Voici un retour d’expérience sur un router Zigbee réalisé à partir d’une carte pas chère ESP32-C6 WeAct et Arduino IDE.

J’ai mis ce router dans mon chalet au font du jardin, il c’est lié à une ampoule extérieure situé à 43m.
Je lui ai associé un bouton pour vérifier qu’il routait bien

J’ai ajouté une sonde Dallas, pour vérifier son bon fonctionnement au quotidien

Je suis assez surpris par sa distance de connexion avec une simple antenne intégrée.

Maintenant je dois lui connecter des détecteurs d’ouverture filaire.

5 « J'aime »

Bonjour je suis intéressé par ton code tu n’as pas utilisé esphome mais directement arduino ide cets bien ça ? J’ai cru comprendre que la partie zigbee 'était pas encore implémenté dans esphome.

J’ai dans l’idée de mettre une sonde Dallas vers le skimmer de la piscine et Decteur ultrason pour avoir la hauteur d eau et pouvoir remplir quand je suis absent avant que ça désamorce. Je pense mettre un petit panneau solaire et batterie.

Egalement intéressé par le code Arduino de ton ESP32. Merci.

Bonjour,
Oui j’utilise Arduino IDE, avec le dernier Aduino Core for ESP32
La documentation pour l’installer est ici:

Une fois installé vous aurez accés aux exemples et notamment celui du router

Je posterai ce soir mon code y ajoutant une sonde Dallas

Pour le détecteur d’ultrason tu as un exemple de gestion Analogique

J’avais posté un modèle qui pourrait répondre à ton besoin sur batterie et PV

1 « J'aime »

Le code avec l’aide de chatGPT

//routeur zigbee ds18b20


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

#include "Zigbee.h"

/* Zigbee light bulb configuration */
#define USE_CUSTOM_ZIGBEE_CONFIG 1
#define ZIGBEE_EXTENDER_ENDPOINT 1

#ifndef LED_BUILTIN
#define LED_BUILTIN 4
#endif

uint8_t led = LED_BUILTIN;
uint8_t button = BOOT_PIN;

ZigbeeRangeExtender zbExtender = ZigbeeRangeExtender(ZIGBEE_EXTENDER_ENDPOINT);

#include "OneWireNg_CurrentPlatform.h"
#include "drivers/DSTherm.h"
#include "utils/Placeholder.h"
#include "Zigbee.h"

#define OW_PIN 2  // Broche de connexion du DS18B20
//#define TEMP_SENSOR_ENDPOINT_NUMBER 10
#define BUTTON_PIN BOOT_PIN

ZigbeeTempSensor zbTempSensor(ZIGBEE_EXTENDER_ENDPOINT);
static Placeholder<OneWireNg_CurrentPlatform> ow;

/************************** Identify ******************************/
// Create a task on identify call to handle the identify function
void identify(uint16_t time) {
  static uint8_t blink = 1;
  log_d("Identify called for %d seconds", time);
  if (time == 0) {
    digitalWrite(led, LOW);
    return;
  }
  digitalWrite(led, blink);
  blink = !blink;
}

/********************* Arduino functions **************************/
void setup() {
  Serial.begin(115200);
  
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  // Initialisation du bus 1-Wire
  new (&ow) OneWireNg_CurrentPlatform(OW_PIN, false);

  // Configuration du capteur Zigbee
  zbTempSensor.setManufacturerAndModel("Espressif", "ZigbeeTempSensor");
  zbTempSensor.setMinMaxValue(-55, 125); // Plage de température du DS18B20
  zbTempSensor.setTolerance(0.25);

  // Ajout de l'endpoint Zigbee
  Zigbee.addEndpoint(&zbTempSensor);

  // Init LED and turn it OFF (if LED_PIN == RGB_BUILTIN, the rgbLedWrite() will be used under the hood)
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  // Init button for factory reset
  pinMode(button, INPUT_PULLUP);

  // Optional: Set callback function for device identify
  zbExtender.onIdentify(identify);

  // Optional: Set Zigbee device name and model
  zbExtender.setManufacturerAndModel("Espressif", "ZigbeeRangeExtender");

  // Add endpoint to Zigbee Core
  Serial.println("Adding Zigbee Extender endpoint to Zigbee Core");
  Zigbee.addEndpoint(&zbExtender);

#if USE_CUSTOM_ZIGBEE_CONFIG
  // Optional: Create a custom Zigbee configuration for Zigbee Extender
  esp_zb_cfg_t zigbeeConfig = ZIGBEE_DEFAULT_ROUTER_CONFIG();
  zigbeeConfig.nwk_cfg.zczr_cfg.max_children = 20;  // 10 is default

  // When all EPs are registered, start Zigbee with custom config
  if (!Zigbee.begin(&zigbeeConfig)) {
#else
  // When all EPs are registered, start Zigbee as ROUTER device
  if (!Zigbee.begin(ZIGBEE_ROUTER)) {
#endif
    Serial.println("Zigbee failed to start!");
    Serial.println("Rebooting...");
    ESP.restart();
  }
  Serial.println("Connecting to network");
  while (!Zigbee.connected()) {
    Serial.print(".");
    delay(100);
  }
  Serial.println();
  
  // Lancement de la tâche de lecture du capteur
  xTaskCreate(temp_sensor_value_update, "temp_sensor_update", 2048, NULL, 10, NULL);
  zbTempSensor.setReporting(1, 0, 1);
}

void temp_sensor_value_update(void *arg) {
  DSTherm drv(ow);
  Placeholder<DSTherm::Scratchpad> scrpd;
  for (;;) {
    drv.convertTempAll(DSTherm::MAX_CONV_TIME, false);
    if (drv.readScratchpadSingle(scrpd) == OneWireNg::EC_SUCCESS) {
      float temperature = scrpd->getTemp2() / 16.0;
      Serial.printf("Temperature DS18B20: %.2f°C\r\n", temperature);
      zbTempSensor.setTemperature(temperature);
    } else {
      Serial.println("Erreur de lecture du capteur DS18B20");
    }
    delay(1000);
  }
}

void loop() {
  // Checking button for factory reset
  if (digitalRead(button) == LOW) {  // Push button pressed
    // Key debounce handling
    delay(100);
    int startTime = millis();
    while (digitalRead(button) == LOW) {
      delay(50);
      if ((millis() - startTime) > 3000) {
        // If key pressed for more than 3secs, factory reset Zigbee and reboot
        Serial.println("Resetting Zigbee to factory and rebooting in 1s.");
        delay(1000);
        Zigbee.factoryReset();
      }
    }
  zbTempSensor.reportTemperature();
  }
  delay(100);
}