#Getting Started: Zigbee vs Z-Wave vs WiFi with ESPHome

1 messages · Page 1 of 1 (latest)

sick pulsar
#

Hello! I wanted to get started with buying some sensors for my home, and I keep wondering what would be the best eco-system to get started with. I've seen people recommend Z-Wave over Zigbee, but the threads were quite old. What is recommended now, in 2025?

I have a cheap lightbulb and switch that I planned to switch to ESPHome, as well as a custom temperature monitor based on the Adafruit BME680 that I coded. Since these are the only devices I own, I do not mind investing in a different eco-system, as long as it is sort-of open and it won't die on me if a company shuts down. I would maybe avoid the eco-system if the cheapest device costs more than 30 euros though...

I've also seen Thread and Matter being discussed, but I did not get to research those yet.

Thank you in advance for your help!

prime knoll
#

Hi, ZigBee is as today cheap, local, vendor independent, and battery friendly. You'll need a ZigBee router like the Smlight SLZB-06 in addition to your HA server, but it worths the cost, about 30 euros/dollars

#

As sensors, etc... I use and recommend the IKEA ones. Smart plugs, remotes, bulbs, etc

#

Ah, and a lot of devices with ZigBee like smartplugs acts as repeaters for the ZigBee network 😉

#

Ah, and you'll need also the Zigbee2MQTT addon also

sick pulsar
#

Nice! Thanks for the recommendations. I think I will stick with ZigBee then and go ahead with the adapter purchase 🙂

halcyon plaza
sick pulsar
sick pulsar
halcyon plaza
#

Less pleased if I have to use anything non OSS but I’ll look into it as I’d love to take advantage of it b

halcyon plaza
#

Yeah it’s a binary blob sadly. And no RP2040 build? I’m far from an open source fanatic but using binaries is very annoying and a little sad. Will ponder on it. Surprising that no one has reverse engineered the calculations.

sick pulsar
# halcyon plaza That would be awsome, thank you. Here’s the code I wrote for temp, humidity and ...

Sorry for the late reply. I didn't see a notification!

Here's my code:

#include <bsec.h>
#include <Wire.h>
#include <SPI.h>

#define STATE_SAVE_PERIOD UINT32_C(480 * 60 * 1000) // 480 minutes - 3 times a day
#define BME_SCL 22
#define BME_SDA 21

Bsec iaqSensor;
RTC_DATA_ATTR uint8_t sensor_state[BSEC_MAX_STATE_BLOB_SIZE] = {0};
String output;

// Refresh the display every 60 minutes
uint32_t displayInterval = 3600000;

void setup()
{
  // I2C
  Wire.begin(BME_SDA, BME_SCL);

  iaqSensor.begin(BME680_I2C_ADDR_SECONDARY, Wire);

  bsec_virtual_sensor_t sensorList[10] = {
      BSEC_OUTPUT_RAW_TEMPERATURE,                     // deg C
      BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE, // deg C
      BSEC_OUTPUT_RAW_HUMIDITY,                        // %
      BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,    // %
      BSEC_OUTPUT_RAW_PRESSURE,                        // hPa
      BSEC_OUTPUT_RAW_GAS,                             // Ohms
      BSEC_OUTPUT_CO2_EQUIVALENT,                      // ppm
      BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,               // ppb
      BSEC_OUTPUT_IAQ,
      BSEC_OUTPUT_STATIC_IAQ,
  };

  iaqSensor.updateSubscription(sensorList, 10, BSEC_SAMPLE_RATE_ULP);
}
#

(contd.)

void loop()
{
  int64_t timestamp = GetTimestamp();

  if (iaqSensor.run(timestamp))
  {
    // Temperature [°C], Raw temperature [°C], Relative humidity [%], Raw humidity [%],
    // Pressure [Pa], IAQ, IAQ accuracy, Static IAQ, Static IAQ accuracy, CO2 Equivalent [ppm],
    // Breath VOC Equivalent [ppb], Gas resistance [Ohms]
    output = String(iaqSensor.temperature);
    output += "," + String(iaqSensor.rawTemperature);
    output += "," + String(iaqSensor.humidity);
    output += "," + String(iaqSensor.rawHumidity);
    output += "," + String(iaqSensor.pressure / 100);
    output += "," + String(iaqSensor.iaq);
    output += "," + String(iaqSensor.iaqAccuracy);
    output += "," + String(iaqSensor.staticIaq);
    output += "," + String(iaqSensor.staticIaqAccuracy);
    output += "," + String(iaqSensor.co2Equivalent);
    output += "," + String(iaqSensor.breathVocEquivalent);
    output += "," + String(iaqSensor.gasResistance);
    
    Serial.println(output);
  }

  uint64_t time_us = ((iaqSensor.nextCall - timestamp) * 1000) - esp_timer_get_time();
  esp_sleep_enable_timer_wakeup(time_us);
  esp_deep_sleep_start();
}