I2C BME280 & TSL2561 support + two I2C buses (#158)
* I2C BME280 support * Support for 2 I2C busses * I2C TSL2561 support * Ability to set the TSL2561 gain manually
This commit is contained in:
parent
c7c6dc9efe
commit
3960110290
|
@ -11,3 +11,4 @@ Settings_*.h
|
||||||
.scripts
|
.scripts
|
||||||
.DS_Store
|
.DS_Store
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
|
build/
|
|
@ -30,12 +30,15 @@ lib_deps_external =
|
||||||
adafruit/Adafruit Unified Sensor @ ^1.1.4
|
adafruit/Adafruit Unified Sensor @ ^1.1.4
|
||||||
beegee-tokyo/DHT sensor library for ESPx @ ^1.18
|
beegee-tokyo/DHT sensor library for ESPx @ ^1.18
|
||||||
starmbi/hp_BH1750 @ ^1.0.0
|
starmbi/hp_BH1750 @ ^1.0.0
|
||||||
|
adafruit/Adafruit BME280 Library@^2.2.2
|
||||||
|
adafruit/Adafruit TSL2561@^1.1.0
|
||||||
|
|
||||||
[env:esp32]
|
[env:esp32]
|
||||||
platform = ${common_env_data.platform}
|
platform = ${common_env_data.platform}
|
||||||
framework = ${common_env_data.framework}
|
framework = ${common_env_data.framework}
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
lib_deps = ${common_env_data.lib_deps_external}
|
lib_deps =
|
||||||
|
${common_env_data.lib_deps_external}
|
||||||
board_build.partitions = partitions_singleapp.csv
|
board_build.partitions = partitions_singleapp.csv
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
upload_speed = 1500000
|
upload_speed = 1500000
|
||||||
|
@ -47,7 +50,8 @@ build_flags =
|
||||||
platform = ${common_env_data.platform}
|
platform = ${common_env_data.platform}
|
||||||
framework = ${common_env_data.framework}
|
framework = ${common_env_data.framework}
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
lib_deps = ${common_env_data.lib_deps_external}
|
lib_deps =
|
||||||
|
${common_env_data.lib_deps_external}
|
||||||
board_build.partitions = partitions_singleapp.csv
|
board_build.partitions = partitions_singleapp.csv
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
|
@ -59,7 +63,8 @@ build_flags =
|
||||||
platform = ${common_env_data.platform}
|
platform = ${common_env_data.platform}
|
||||||
framework = ${common_env_data.framework}
|
framework = ${common_env_data.framework}
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
lib_deps = ${common_env_data.lib_deps_external}
|
lib_deps =
|
||||||
|
${common_env_data.lib_deps_external}
|
||||||
board_build.partitions = partitions_singleapp.csv
|
board_build.partitions = partitions_singleapp.csv
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
upload_speed = 1500000
|
upload_speed = 1500000
|
||||||
|
@ -118,7 +123,8 @@ build_flags =
|
||||||
platform = ${common_env_data.platform}
|
platform = ${common_env_data.platform}
|
||||||
framework = ${common_env_data.framework}
|
framework = ${common_env_data.framework}
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
lib_deps = ${common_env_data.lib_deps_external}
|
lib_deps =
|
||||||
|
${common_env_data.lib_deps_external}
|
||||||
board_build.partitions = partitions_singleapp.csv
|
board_build.partitions = partitions_singleapp.csv
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
build_flags =
|
build_flags =
|
||||||
|
|
|
@ -43,6 +43,14 @@
|
||||||
// Number of seconds between update checks
|
// Number of seconds between update checks
|
||||||
#define CHECK_FOR_UPDATES_INTERVAL 300
|
#define CHECK_FOR_UPDATES_INTERVAL 300
|
||||||
|
|
||||||
|
// I2C Defaults
|
||||||
|
#define DEFAULT_I2C_BUS_1_SDA 21
|
||||||
|
#define DEFAULT_I2C_BUS_1_SCL 22
|
||||||
|
#define DEFAULT_I2C_BUS 1
|
||||||
|
|
||||||
|
// TSL2561 Defaults
|
||||||
|
#define DEFAULT_TSL2561_I2C_GAIN "auto"
|
||||||
|
|
||||||
#ifdef VERSION
|
#ifdef VERSION
|
||||||
#define DEFAULT_AUTO_UPDATE true
|
#define DEFAULT_AUTO_UPDATE true
|
||||||
#define DEFAULT_OTA_UPDATE false
|
#define DEFAULT_OTA_UPDATE false
|
||||||
|
|
197
src/main.cpp
197
src/main.cpp
|
@ -1,4 +1,5 @@
|
||||||
#include <main.h>
|
#include "main.h"
|
||||||
|
|
||||||
bool sendTelemetry(int totalSeen, int totalFpSeen, int totalFpQueried, int totalFpReported)
|
bool sendTelemetry(int totalSeen, int totalFpSeen, int totalFpQueried, int totalFpReported)
|
||||||
{
|
{
|
||||||
if (!online)
|
if (!online)
|
||||||
|
@ -18,7 +19,7 @@ bool sendTelemetry(int totalSeen, int totalFpSeen, int totalFpQueried, int total
|
||||||
{
|
{
|
||||||
if (sendDiscoveryConnectivity() && sendDiscoveryUptime() && sendDiscoveryFreeMem() && sendSwitchDiscovery("Status LED", "config") && sendNumberDiscovery("Max Distance", "config") && sendSwitchDiscovery("Active Scan", "config") && sendSwitchDiscovery("Query", "config") && sendDiscoveryMotion()
|
if (sendDiscoveryConnectivity() && sendDiscoveryUptime() && sendDiscoveryFreeMem() && sendSwitchDiscovery("Status LED", "config") && sendNumberDiscovery("Max Distance", "config") && sendSwitchDiscovery("Active Scan", "config") && sendSwitchDiscovery("Query", "config") && sendDiscoveryMotion()
|
||||||
#ifdef SENSORS
|
#ifdef SENSORS
|
||||||
&& sendDiscoveryHumidity() && sendDiscoveryTemperature() && sendDiscoveryLux()
|
&& sendDiscoveryHumidity() && sendDiscoveryTemperature() && sendDiscoveryLux() && sendDiscoveryBME280Temperature() && sendDiscoveryBME280Humidity() && sendDiscoveryBME280Pressure() && sendDiscoveryTSL2561Lux()
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -150,9 +151,35 @@ void connectToWifi()
|
||||||
dht11Pin = WiFiSettings.integer("dht11_pin", 0, "DHT11 sensor pin (0 for disable)");
|
dht11Pin = WiFiSettings.integer("dht11_pin", 0, "DHT11 sensor pin (0 for disable)");
|
||||||
dht22Pin = WiFiSettings.integer("dht22_pin", 0, "DHT22 sensor pin (0 for disable)");
|
dht22Pin = WiFiSettings.integer("dht22_pin", 0, "DHT22 sensor pin (0 for disable)");
|
||||||
|
|
||||||
BH1750_I2c = WiFiSettings.string("BH1750_I2c", "", "Ambient Light Sensor - I2C address of BH1750 Sensor, like 0x23 or 0x5C.");
|
WiFiSettings.heading("I2C Settings");
|
||||||
I2CDebug = WiFiSettings.checkbox("I2CDebug", false, "Debug I2C address. Look at the serial log to get the correct address.");
|
|
||||||
|
I2CDebug = WiFiSettings.checkbox("I2CDebug", false, "Debug I2C addreses. Look at the serial log to get the correct address");
|
||||||
|
|
||||||
|
WiFiSettings.html("h4", "Bus 1:");
|
||||||
|
I2C_Bus_1_SDA = WiFiSettings.integer("I2C_Bus_1_SDA", 0, 39, DEFAULT_I2C_BUS_1_SDA, "SDA pin (0 to disable)");
|
||||||
|
I2C_Bus_1_SCL = WiFiSettings.integer("I2C_Bus_1_SCL", 0, 39, DEFAULT_I2C_BUS_1_SCL, "SCL pin (0 to disable)");
|
||||||
|
|
||||||
|
WiFiSettings.html("h4", "Bus 2:");
|
||||||
|
|
||||||
|
I2C_Bus_2_SDA = WiFiSettings.integer("I2C_Bus_2_SDA", 0, "SDA pin (0 to disable)");
|
||||||
|
I2C_Bus_2_SCL = WiFiSettings.integer("I2C_Bus_2_SCL", 0, "SCL pin (0 to disable)");
|
||||||
|
|
||||||
|
WiFiSettings.heading("I2C Sensors");
|
||||||
|
|
||||||
|
WiFiSettings.html("h4", "BH1750 - Ambient Light Sensor:");
|
||||||
|
BH1750_I2c_Bus = WiFiSettings.integer("BH1750_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
|
BH1750_I2c = WiFiSettings.string("BH1750_I2c", "", "I2C address (0x23 or 0x5C)");
|
||||||
|
|
||||||
|
WiFiSettings.html("h4", "BME280 - Weather Sensor:");
|
||||||
|
BME280_I2c_Bus = WiFiSettings.integer("BME280_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
|
BME280_I2c = WiFiSettings.string("BME280_I2c", "", "I2C address (0x76 or 0x77)");
|
||||||
|
|
||||||
|
WiFiSettings.html("h4", "TSL2561 - Ambient Light Sensor:");
|
||||||
|
TSL2561_I2c_Bus = WiFiSettings.integer("TSL2561_I2c_Bus", 1, 2, DEFAULT_I2C_BUS, "I2C Bus");
|
||||||
|
TSL2561_I2c = WiFiSettings.string("TSL2561_I2c", "", "I2C address (0x39, 0x49 or 0x29)");
|
||||||
|
TSL2561_I2c_Gain = WiFiSettings.string("TSL2561_I2c_Gain", DEFAULT_TSL2561_I2C_GAIN, "Gain (auto, 1x or 16x)");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WiFiSettings.hostname = "espresense-" + kebabify(room);
|
WiFiSettings.hostname = "espresense-" + kebabify(room);
|
||||||
|
|
||||||
if (!WiFiSettings.connect(true, 60))
|
if (!WiFiSettings.connect(true, 60))
|
||||||
|
@ -188,8 +215,14 @@ void connectToWifi()
|
||||||
Serial.print("DHT22 Sensor: ");
|
Serial.print("DHT22 Sensor: ");
|
||||||
Serial.println(dht22Pin ? "enabled" : "disabled");
|
Serial.println(dht22Pin ? "enabled" : "disabled");
|
||||||
Serial.print("BH1750_I2c Sensor: ");
|
Serial.print("BH1750_I2c Sensor: ");
|
||||||
|
Serial.println(BH1750_I2c + " on bus " + BH1750_I2c_Bus);
|
||||||
|
Serial.print("BME280_I2c Sensor: ");
|
||||||
|
Serial.println(BME280_I2c + " on bus " + BME280_I2c_Bus);
|
||||||
|
Serial.print("TSL2561_I2c Sensor: ");
|
||||||
|
Serial.println(TSL2561_I2c + " on bus " + TSL2561_I2c_Bus);
|
||||||
Serial.println(BH1750_I2c);
|
Serial.println(BH1750_I2c);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
localIp = WiFi.localIP().toString();
|
localIp = WiFi.localIP().toString();
|
||||||
id = slugify(room);
|
id = slugify(room);
|
||||||
roomsTopic = CHANNEL + "/rooms/" + id;
|
roomsTopic = CHANNEL + "/rooms/" + id;
|
||||||
|
@ -472,13 +505,21 @@ void setup()
|
||||||
bool state = false;
|
bool state = false;
|
||||||
|
|
||||||
// if (! BH1750.begin(BH1750_TO_GROUND))
|
// if (! BH1750.begin(BH1750_TO_GROUND))
|
||||||
if (BH1750_I2c == "0x23")
|
if (BH1750_I2c == "0x23" && BH1750_I2c_Bus == 1)
|
||||||
{
|
{
|
||||||
state = BH1750.begin(BH1750_TO_GROUND);
|
state = BH1750.begin(BH1750_TO_GROUND, &Wire);
|
||||||
}
|
}
|
||||||
else if (BH1750_I2c == "0x5C")
|
else if (BH1750_I2c == "0x5C" && BH1750_I2c_Bus == 1)
|
||||||
{
|
{
|
||||||
state = BH1750.begin(BH1750_TO_VCC);
|
state = BH1750.begin(BH1750_TO_VCC, &Wire);
|
||||||
|
}
|
||||||
|
else if (BH1750_I2c == "0x23" && BH1750_I2c_Bus == 2)
|
||||||
|
{
|
||||||
|
state = BH1750.begin(BH1750_TO_GROUND, &Wire1);
|
||||||
|
}
|
||||||
|
else if (BH1750_I2c == "0x5C" && BH1750_I2c_Bus == 2)
|
||||||
|
{
|
||||||
|
state = BH1750.begin(BH1750_TO_VCC, &Wire1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state)
|
if (!state)
|
||||||
|
@ -509,9 +550,18 @@ void setup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (I2C_Bus_1_SDA != 0 && I2C_Bus_1_SDA != 0) {
|
||||||
|
Wire.begin(I2C_Bus_1_SDA, I2C_Bus_1_SCL);
|
||||||
|
Serial.println("\nInitialized I2C Bus 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (I2C_Bus_2_SDA != 0 && I2C_Bus_2_SDA != 0) {
|
||||||
|
Wire1.begin(I2C_Bus_2_SDA, I2C_Bus_2_SCL);
|
||||||
|
Serial.println("\nInitialized I2C Bus 2");
|
||||||
|
}
|
||||||
|
|
||||||
if (I2CDebug)
|
if (I2CDebug)
|
||||||
{
|
{
|
||||||
Wire.begin();
|
|
||||||
Serial.println("\nI2C Scanner");
|
Serial.println("\nI2C Scanner");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -629,6 +679,102 @@ void luxLoop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bme280Loop() {
|
||||||
|
|
||||||
|
if (BME280_I2c == "0x76" && BME280_I2c_Bus == 1) {
|
||||||
|
BME280_status = BME280.begin(0x76, &Wire);
|
||||||
|
} else if (BME280_I2c == "0x77" && BME280_I2c_Bus == 1) {
|
||||||
|
BME280_status = BME280.begin(0x77, &Wire);
|
||||||
|
} else if (BME280_I2c == "0x76" && BME280_I2c_Bus == 2) {
|
||||||
|
BME280_status = BME280.begin(0x76, &Wire1);
|
||||||
|
} else if (BME280_I2c == "0x77" && BME280_I2c_Bus == 2) {
|
||||||
|
BME280_status = BME280.begin(0x77, &Wire1);
|
||||||
|
} else {
|
||||||
|
Serial.println("BME280 - Invalid I2C address");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!BME280_status) {
|
||||||
|
Serial.println("Couldn't find a BME280 sensor, check your wiring and I2C address!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BME280.setSampling(Adafruit_BME280::MODE_NORMAL,
|
||||||
|
Adafruit_BME280::SAMPLING_X16, // Temperature
|
||||||
|
Adafruit_BME280::SAMPLING_X16, // Pressure
|
||||||
|
Adafruit_BME280::SAMPLING_X16, // Humidity
|
||||||
|
Adafruit_BME280::FILTER_X16,
|
||||||
|
//Adafruit_BME280::FILTER_OFF,
|
||||||
|
Adafruit_BME280::STANDBY_MS_1000
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
float temperature = BME280.readTemperature();
|
||||||
|
float humidity = BME280.readHumidity();
|
||||||
|
float pressure = BME280.readPressure() / 100.0F;
|
||||||
|
|
||||||
|
if (millis() - bme280PreviousMillis >= sensorInterval) {
|
||||||
|
|
||||||
|
mqttClient.publish((roomsTopic + "/bme280_temperature").c_str(), 0, 1, String(temperature).c_str());
|
||||||
|
mqttClient.publish((roomsTopic + "/bme280_humidity").c_str(), 0, 1, String(humidity).c_str());
|
||||||
|
mqttClient.publish((roomsTopic + "/bme280_pressure").c_str(), 0, 1, String(pressure).c_str());
|
||||||
|
|
||||||
|
bme280PreviousMillis = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsl2561Loop() {
|
||||||
|
|
||||||
|
int tsl2561_address;
|
||||||
|
|
||||||
|
if (TSL2561_I2c == "0x39") {
|
||||||
|
tsl2561_address = 0x39;
|
||||||
|
} else if (TSL2561_I2c == "0x29") {
|
||||||
|
tsl2561_address = 0x29;
|
||||||
|
} else if (TSL2561_I2c == "0x49") {
|
||||||
|
tsl2561_address = 0x49;
|
||||||
|
} else {
|
||||||
|
Serial.println("TSL2561 - Invalid I2C address");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(tsl2561_address);
|
||||||
|
|
||||||
|
if (TSL2561_I2c_Bus == 1) {
|
||||||
|
tsl.begin(&Wire);
|
||||||
|
} else if (TSL2561_I2c_Bus == 2) {
|
||||||
|
tsl.begin(&Wire1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSL2561_I2c_Gain == "auto") {
|
||||||
|
tsl.enableAutoRange(true);
|
||||||
|
} else if (TSL2561_I2c_Gain == "1x") {
|
||||||
|
tsl.setGain(TSL2561_GAIN_1X);
|
||||||
|
} else if (TSL2561_I2c_Gain == "16x") {
|
||||||
|
tsl.setGain(TSL2561_GAIN_16X);
|
||||||
|
} else {
|
||||||
|
Serial.println("TSL2561 - Invalid gain");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS);
|
||||||
|
|
||||||
|
sensors_event_t event;
|
||||||
|
tsl.getEvent(&event);
|
||||||
|
|
||||||
|
if (event.light) {
|
||||||
|
if (millis() - tsl2561PreviousMillis >= sensorInterval) {
|
||||||
|
mqttClient.publish((roomsTopic + "/tsl2561_lux").c_str(), 0, 1, String(event.light).c_str());
|
||||||
|
|
||||||
|
tsl2561PreviousMillis = millis();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Serial.println("TSL2561 - Sensor overloaded");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void l2cScanner()
|
void l2cScanner()
|
||||||
{
|
{
|
||||||
if (!I2CDebug) return;
|
if (!I2CDebug) return;
|
||||||
|
@ -644,7 +790,7 @@ void l2cScanner()
|
||||||
error = Wire.endTransmission();
|
error = Wire.endTransmission();
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
{
|
{
|
||||||
Serial.print("I2C device found at address 0x");
|
Serial.print("I2C device found on bus 1 at address 0x");
|
||||||
|
|
||||||
if (address < 16)
|
if (address < 16)
|
||||||
{
|
{
|
||||||
|
@ -656,7 +802,34 @@ void l2cScanner()
|
||||||
}
|
}
|
||||||
else if (error == 4)
|
else if (error == 4)
|
||||||
{
|
{
|
||||||
Serial.print("Unknow error at address 0x");
|
Serial.print("Unknow error on bus 1 at address 0x");
|
||||||
|
if (address < 16)
|
||||||
|
{
|
||||||
|
Serial.print("0");
|
||||||
|
}
|
||||||
|
Serial.println(address, HEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (address = 1; address < 127; address++)
|
||||||
|
{
|
||||||
|
Wire1.beginTransmission(address);
|
||||||
|
error = Wire1.endTransmission();
|
||||||
|
if (error == 0)
|
||||||
|
{
|
||||||
|
Serial.print("I2C device found on bus 2 at address 0x");
|
||||||
|
|
||||||
|
if (address < 16)
|
||||||
|
{
|
||||||
|
Serial.print("0");
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println(address, HEX);
|
||||||
|
nDevices++;
|
||||||
|
}
|
||||||
|
else if (error == 4)
|
||||||
|
{
|
||||||
|
Serial.print("Unknow error on bus 2 at address 0x");
|
||||||
if (address < 16)
|
if (address < 16)
|
||||||
{
|
{
|
||||||
Serial.print("0");
|
Serial.print("0");
|
||||||
|
@ -689,6 +862,8 @@ void loop()
|
||||||
#ifdef SENSORS
|
#ifdef SENSORS
|
||||||
dhtLoop();
|
dhtLoop();
|
||||||
luxLoop();
|
luxLoop();
|
||||||
|
bme280Loop();
|
||||||
|
tsl2561Loop();
|
||||||
l2cScanner();
|
l2cScanner();
|
||||||
#endif
|
#endif
|
||||||
WiFiSettings.httpLoop();
|
WiFiSettings.httpLoop();
|
||||||
|
|
141
src/main.h
141
src/main.h
|
@ -27,13 +27,38 @@
|
||||||
#ifdef SENSORS
|
#ifdef SENSORS
|
||||||
#include <DHTesp.h>
|
#include <DHTesp.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
// I2C
|
||||||
|
int I2C_Bus_1_SDA;
|
||||||
|
int I2C_Bus_1_SCL;
|
||||||
|
int I2C_Bus_2_SDA;
|
||||||
|
int I2C_Bus_2_SCL;
|
||||||
|
bool I2CDebug;
|
||||||
|
|
||||||
|
unsigned long sensorInterval = 60000;
|
||||||
|
|
||||||
|
//GY-302 lux sensor
|
||||||
#include <hp_BH1750.h>
|
#include <hp_BH1750.h>
|
||||||
hp_BH1750 BH1750;
|
hp_BH1750 BH1750;
|
||||||
long ms_BH1750;
|
long ms_BH1750;
|
||||||
float lux_BH1750;
|
float lux_BH1750;
|
||||||
int lux_BH1750_MQTT;
|
int lux_BH1750_MQTT;
|
||||||
String BH1750_I2c;
|
String BH1750_I2c;
|
||||||
bool I2CDebug;
|
int BH1750_I2c_Bus;
|
||||||
|
|
||||||
|
//I2C BME280 sensor
|
||||||
|
#include <Adafruit_BME280.h>
|
||||||
|
Adafruit_BME280 BME280;
|
||||||
|
long BME280_status;
|
||||||
|
String BME280_I2c;
|
||||||
|
int BME280_I2c_Bus;
|
||||||
|
unsigned long bme280PreviousMillis = 0;
|
||||||
|
|
||||||
|
//I2C TSL2561 sensor
|
||||||
|
#include <Adafruit_TSL2561_U.h>
|
||||||
|
String TSL2561_I2c;
|
||||||
|
int TSL2561_I2c_Bus;
|
||||||
|
String TSL2561_I2c_Gain;
|
||||||
|
unsigned long tsl2561PreviousMillis = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
AsyncMqttClient mqttClient;
|
AsyncMqttClient mqttClient;
|
||||||
|
@ -473,8 +498,122 @@ bool sendDiscoveryLux()
|
||||||
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/lux/config";
|
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/lux/config";
|
||||||
return pub(discoveryTopic.c_str(), 0, true, buffer);
|
return pub(discoveryTopic.c_str(), 0, true, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sendDiscoveryBME280Temperature()
|
||||||
|
{
|
||||||
|
if (BME280_I2c.isEmpty()) return true;
|
||||||
|
|
||||||
|
DynamicJsonDocument doc(1200);
|
||||||
|
commonDiscovery(&doc);
|
||||||
|
doc["~"] = roomsTopic;
|
||||||
|
doc["name"] = "ESPresense " + room + " BME280 Temperature";
|
||||||
|
doc["uniq_id"] = Sprintf("espresense_%06" PRIx64 "_bme280_temperature", ESP.getEfuseMac() >> 24);
|
||||||
|
doc["avty_t"] = "~/status";
|
||||||
|
doc["stat_t"] = "~/bme280_temperature";
|
||||||
|
doc["dev_cla"] = "temperature";
|
||||||
|
doc["unit_of_meas"] = "°C";
|
||||||
|
doc["frc_upd"] = true;
|
||||||
|
|
||||||
|
char buffer[1200];
|
||||||
|
serializeJson(doc, buffer);
|
||||||
|
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/bme280_temperature/config";
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
if (mqttClient.publish(discoveryTopic.c_str(), 0, true, buffer))
|
||||||
|
return true;
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sendDiscoveryBME280Humidity()
|
||||||
|
{
|
||||||
|
if (BME280_I2c.isEmpty()) return true;
|
||||||
|
|
||||||
|
DynamicJsonDocument doc(1200);
|
||||||
|
commonDiscovery(&doc);
|
||||||
|
doc["~"] = roomsTopic;
|
||||||
|
doc["name"] = "ESPresense " + room + " BME280 Humidity";
|
||||||
|
doc["uniq_id"] = Sprintf("espresense_%06" PRIx64 "_bme280_humidity", ESP.getEfuseMac() >> 24);
|
||||||
|
doc["avty_t"] = "~/status";
|
||||||
|
doc["stat_t"] = "~/bme280_humidity";
|
||||||
|
doc["dev_cla"] = "humidity";
|
||||||
|
doc["unit_of_meas"] = "%";
|
||||||
|
doc["frc_upd"] = true;
|
||||||
|
|
||||||
|
char buffer[1200];
|
||||||
|
serializeJson(doc, buffer);
|
||||||
|
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/bme280_humidity/config";
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
if (mqttClient.publish(discoveryTopic.c_str(), 0, true, buffer))
|
||||||
|
return true;
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sendDiscoveryBME280Pressure()
|
||||||
|
{
|
||||||
|
if (BME280_I2c.isEmpty()) return true;
|
||||||
|
|
||||||
|
DynamicJsonDocument doc(1200);
|
||||||
|
commonDiscovery(&doc);
|
||||||
|
doc["~"] = roomsTopic;
|
||||||
|
doc["name"] = "ESPresense " + room + " BME280 Pressure";
|
||||||
|
doc["uniq_id"] = Sprintf("espresense_%06" PRIx64 "_bme280_pressure", ESP.getEfuseMac() >> 24);
|
||||||
|
doc["avty_t"] = "~/status";
|
||||||
|
doc["stat_t"] = "~/bme280_pressure";
|
||||||
|
doc["dev_cla"] = "pressure";
|
||||||
|
doc["unit_of_meas"] = "hPa";
|
||||||
|
doc["frc_upd"] = true;
|
||||||
|
|
||||||
|
char buffer[1200];
|
||||||
|
serializeJson(doc, buffer);
|
||||||
|
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/bme280_pressure/config";
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
if (mqttClient.publish(discoveryTopic.c_str(), 0, true, buffer))
|
||||||
|
return true;
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sendDiscoveryTSL2561Lux()
|
||||||
|
{
|
||||||
|
if (TSL2561_I2c.isEmpty()) return true;
|
||||||
|
|
||||||
|
DynamicJsonDocument doc(1200);
|
||||||
|
commonDiscovery(&doc);
|
||||||
|
doc["~"] = roomsTopic;
|
||||||
|
doc["name"] = "ESPresense " + room + " TSL2561 Lux";
|
||||||
|
doc["uniq_id"] = Sprintf("espresense_%06" PRIx64 "_tsl2561_lux", ESP.getEfuseMac() >> 24);
|
||||||
|
doc["avty_t"] = "~/status";
|
||||||
|
doc["stat_t"] = "~/tsl2561_lux";
|
||||||
|
doc["dev_cla"] = "illuminance";
|
||||||
|
doc["unit_of_meas"] = "lx";
|
||||||
|
doc["frc_upd"] = true;
|
||||||
|
|
||||||
|
char buffer[1200];
|
||||||
|
serializeJson(doc, buffer);
|
||||||
|
String discoveryTopic = "homeassistant/sensor/espresense_" + ESPMAC + "/tsl2561_lux/config";
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
if (mqttClient.publish(discoveryTopic.c_str(), 0, true, buffer))
|
||||||
|
return true;
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool sendSwitchDiscovery(String name, String entityCategory)
|
bool sendSwitchDiscovery(String name, String entityCategory)
|
||||||
{
|
{
|
||||||
auto slug = slugify(name);
|
auto slug = slugify(name);
|
||||||
|
|
Loading…
Reference in New Issue