Skip to content

Commit

Permalink
Merge pull request #68 from matthias-bs/10-bresser-lightning-sensor
Browse files Browse the repository at this point in the history
Added lightning sensor decoder
  • Loading branch information
matthias-bs committed Jul 9, 2023
2 parents 014a24b + d034f13 commit 9eb9241
Show file tree
Hide file tree
Showing 7 changed files with 280 additions and 96 deletions.
132 changes: 74 additions & 58 deletions examples/BresserWeatherSensorBasic/BresserWeatherSensorBasic.ino
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
// 20220810 Changed to modified WeatherSensor class; fixed Soil Moisture Sensor Handling
// 20220815 Changed to modified WeatherSensor class; added support of multiple sensors
// 20221227 Replaced DEBUG_PRINT/DEBUG_PRINTLN by Arduino logging functions
// 20230624 Added Bresser Lightning Sensor decoder
//
// ToDo:
// -
Expand Down Expand Up @@ -81,66 +82,81 @@ void loop()
int decode_status = weatherSensor.getMessage();

if (decode_status == DECODE_OK) {

Serial.printf("Id: [%8X] Typ: [%X] Battery: [%s] ",
weatherSensor.sensor[i].sensor_id,
weatherSensor.sensor[i].s_type,
weatherSensor.sensor[i].battery_ok ? "OK " : "Low");
#ifdef BRESSER_6_IN_1
Serial.printf("Ch: [%d] ", weatherSensor.sensor[i].chan);
#endif
if (weatherSensor.sensor[i].temp_ok) {
Serial.printf("Temp: [%5.1fC] ",
weatherSensor.sensor[i].temp_c);
if (weatherSensor.sensor[i].s_type != SENSOR_TYPE_LIGHTNING) {
Serial.printf("Id: [%8X] Typ: [%X] Battery: [%s] ",
weatherSensor.sensor[i].sensor_id,
weatherSensor.sensor[i].s_type,
weatherSensor.sensor[i].battery_ok ? "OK " : "Low");
#ifdef BRESSER_6_IN_1
Serial.printf("Ch: [%d] ", weatherSensor.sensor[i].chan);
#endif
if (weatherSensor.sensor[i].temp_ok) {
Serial.printf("Temp: [%5.1fC] ",
weatherSensor.sensor[i].temp_c);
} else {
Serial.printf("Temp: [---.-C] ");
}
if (weatherSensor.sensor[i].humidity_ok) {
Serial.printf("Hum: [%3d%%] ",
weatherSensor.sensor[i].humidity);
}
else {
Serial.printf("Hum: [---%%] ");
}
if (weatherSensor.sensor[i].wind_ok) {
Serial.printf("Wind max: [%4.1fm/s] Wind avg: [%4.1fm/s] Wind dir: [%5.1fdeg] ",
weatherSensor.sensor[i].wind_gust_meter_sec,
weatherSensor.sensor[i].wind_avg_meter_sec,
weatherSensor.sensor[i].wind_direction_deg);
} else {
Serial.printf("Wind max: [--.-m/s] Wind avg: [--.-m/s] Wind dir: [---.-deg] ");
}
if (weatherSensor.sensor[i].rain_ok) {
Serial.printf("Rain: [%7.1fmm] ",
weatherSensor.sensor[i].rain_mm);
} else {
Serial.printf("Rain: [-----.-mm] ");
}
if (weatherSensor.sensor[i].moisture_ok) {
Serial.printf("Moisture: [%2d%%] ",
weatherSensor.sensor[i].moisture);
}
else {
Serial.printf("Moisture: [--%%] ");
}
#if defined BRESSER_6_IN_1 || defined BRESSER_7_IN_1
if (weatherSensor.sensor[i].uv_ok) {
Serial.printf("UV index: [%1.1f] ",
weatherSensor.sensor[i].uv);
}
else {
Serial.printf("UV index: [-.-%%] ");
}
#endif
#ifdef BRESSER_7_IN_1
if (weatherSensor.sensor[i].light_ok) {
Serial.printf("Light (Klux): [%2.1fKlux] ",
weatherSensor.sensor[i].light_klx);
}
else {
Serial.printf("Light (lux): [--.-Klux] ");
}
#endif

} else {
Serial.printf("Temp: [---.-C] ");
Serial.printf("Id: [%8X] Typ: [%X] Battery: [%s] ",
weatherSensor.sensor[i].sensor_id,
weatherSensor.sensor[i].s_type,
weatherSensor.sensor[i].battery_ok ? "OK " : "Low");
Serial.printf("Lightning Counter: [%3d] ", weatherSensor.sensor[i].lightning_count);
if (weatherSensor.sensor[i].lightning_distance_km != 0) {
Serial.printf("Distance: [%2dkm] ", weatherSensor.sensor[i].lightning_distance_km);
} else {
Serial.printf("Distance: [----] ");
}
Serial.printf("unknown1: [0x%03X] ", weatherSensor.sensor[i].lightning_unknown1);
Serial.printf("unknown2: [0x%04X] ", weatherSensor.sensor[i].lightning_unknown2);
}
if (weatherSensor.sensor[i].humidity_ok) {
Serial.printf("Hum: [%3d%%] ",
weatherSensor.sensor[i].humidity);
}
else {
Serial.printf("Hum: [---%%] ");
}
if (weatherSensor.sensor[i].wind_ok) {
Serial.printf("Wind max: [%4.1fm/s] Wind avg: [%4.1fm/s] Wind dir: [%5.1fdeg] ",
weatherSensor.sensor[i].wind_gust_meter_sec,
weatherSensor.sensor[i].wind_avg_meter_sec,
weatherSensor.sensor[i].wind_direction_deg);
} else {
Serial.printf("Wind max: [--.-m/s] Wind avg: [--.-m/s] Wind dir: [---.-deg] ");
}
if (weatherSensor.sensor[i].rain_ok) {
Serial.printf("Rain: [%7.1fmm] ",
weatherSensor.sensor[i].rain_mm);
} else {
Serial.printf("Rain: [-----.-mm] ");
}
if (weatherSensor.sensor[i].moisture_ok) {
Serial.printf("Moisture: [%2d%%] ",
weatherSensor.sensor[i].moisture);
}
else {
Serial.printf("Moisture: [--%%] ");
}
#if defined BRESSER_6_IN_1 || defined BRESSER_7_IN_1
if (weatherSensor.sensor[i].uv_ok) {
Serial.printf("UV index: [%1.1f] ",
weatherSensor.sensor[i].uv);
}
else {
Serial.printf("UV index: [-.-%%] ");
}
#endif
#ifdef BRESSER_7_IN_1
if (weatherSensor.sensor[i].light_ok) {
Serial.printf("Light (Klux): [%2.1fKlux] ",
weatherSensor.sensor[i].light_klx);
}
else {
Serial.printf("Light (lux): [--.-Klux] ");
}
#endif
Serial.printf("RSSI: [%5.1fdBm]\n", weatherSensor.sensor[i].rssi);
} // if (decode_status == DECODE_OK)
delay(100);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,12 @@ void publishWeatherdata(bool complete)
if (weatherSensor.sensor[i].moisture_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"moisture\":%d", weatherSensor.sensor[i].moisture);
}
if (weatherSensor.sensor[i].lightning_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_count\":%d", weatherSensor.sensor[i].lightning_count);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_distance_km\":%d", weatherSensor.sensor[i].lightning_distance_km);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown1\":\"0x%03X\"", weatherSensor.sensor[i].lightning_unknown1);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown2\":\"0x%04X\"", weatherSensor.sensor[i].lightning_unknown2);
}
sprintf(&mqtt_payload[strlen(mqtt_payload)], "}");
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], "}");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,12 @@ void publishWeatherdata(bool complete)
if (weatherSensor.sensor[i].moisture_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"moisture\":%d", weatherSensor.sensor[i].moisture);
}
if (weatherSensor.sensor[i].lightning_ok || complete) {
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_count\":%d", weatherSensor.sensor[i].lightning_count);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_distance_km\":%d", weatherSensor.sensor[i].lightning_distance_km);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown1\":\"0x%03X\"", weatherSensor.sensor[i].lightning_unknown1);
sprintf(&mqtt_payload[strlen(mqtt_payload)], ",\"lightning_unknown2\":\"0x%04X\"", weatherSensor.sensor[i].lightning_unknown2);
}
sprintf(&mqtt_payload[strlen(mqtt_payload)], "}");
sprintf(&mqtt_payload2[strlen(mqtt_payload2)], "}");

Expand Down
57 changes: 39 additions & 18 deletions examples/BresserWeatherSensorMQTTCustom/src/WeatherSensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
// 20230328 Added MSG_BUF_SIZE
// 20230330 Added changes for Adafruit Feather 32u4 LoRa Radio
// 20230412 Added workaround for Professional Wind Gauge / Anemometer, P/N 7002531
// 20230624 Added Bresser Lightning Sensor decoder
// 20230708 Added SENSOR_TYPE_WEATHER_7IN1 and startup flag
//
// ToDo:
Expand All @@ -73,19 +74,21 @@


// Sensor Types
// 0 - Weather Station 5-in-1; PN 7002510..12/7902510..12
// 1 - Weather Station 6-in-1; PN 7002585
// 2 - Thermo-/Hygro-Sensor 6-in-1; PN 7009999
// 4 - Soil Moisture Sensor 6-in-1; PN 7009972
// 9 - Professional Rain Gauge (5-in-1 decoder)
// 0 - Weather Station 5-in-1; PN 7002510..12/7902510..12
// 1 - Weather Station 6-in-1; PN 7002585
// - Professional Wind Gauge 6-in-1; PN 7002531
// 2 - Thermo-/Hygro-Sensor 6-in-1; PN 7009999
// 3 - Lightning Sensor PN 7009976
// 4 - Soil Moisture Sensor 6-in-1; PN 7009972
// 9 - Professional Rain Gauge (5-in-1 decoder)
// 11 - Weather Sensor 7-in-1 7-in-1; PN 7003300
// ? - Air Quality Sensor
// ? - Water Leakage Sensor
// ? - Pool Thermometer
// ? - Lightning Sensor
#define SENSOR_TYPE_WEATHER0 0 // Weather Station
#define SENSOR_TYPE_WEATHER1 1 // Weather Station
#define SENSOR_TYPE_THERMO_HYGRO 2 // Thermo-/Hygro-Sensor
#define SENSOR_TYPE_LIGHTNING 3 // Lightning Sensor
#define SENSOR_TYPE_SOIL 4 // Soil Temperature and Moisture (from 6-in-1 decoder)
#define SENSOR_TYPE_RAIN 9 // Professional Rain Gauge (from 5-in-1 decoder)
#define SENSOR_TYPE_WEATHER_7IN1 11 // Weather Sensor 7-in-1
Expand Down Expand Up @@ -195,6 +198,7 @@ class WeatherSensor {
bool rain_ok = false; //!< rain gauge level o.k.
bool battery_ok = false; //!< battery o.k.
bool moisture_ok = false; //!< moisture o.k. (only 6-in-1)
bool lightning_ok = false; //!< lightning o.k. (only lightning)
float temp_c; //!< temperature in degC
float light_klx; //!< Light KLux (only 7-in-1)
float light_lux; //!< Light lux (only 7-in-1)
Expand All @@ -213,9 +217,13 @@ class WeatherSensor {
uint16_t wind_gust_meter_sec_fp1; //!< wind speed (gusts) in m/s (fixed point int w. 1 decimal)
uint16_t wind_avg_meter_sec_fp1; //!< wind speed (avg) in m/s (fixed point int w. 1 decimal)
#endif
uint8_t humidity; //!< humidity in %
uint8_t moisture; //!< moisture in % (only 6-in-1)
float rssi; //!< received signal strength indicator in dBm
uint8_t humidity; //!< humidity in %
uint8_t moisture; //!< moisture in % (only 6-in-1)
uint8_t lightning_distance_km; //!< lightning distance in km (only lightning)
uint8_t lightning_count; //!< lightning strike counter (only lightning)
uint8_t lightning_unknown1; //!< unknown part 1
uint16_t lightning_unknown2; //!< unknown part 2
float rssi; //!< received signal strength indicator in dBm
};

typedef struct Sensor sensor_t; //!< Shortcut for struct Sensor
Expand Down Expand Up @@ -243,15 +251,16 @@ class WeatherSensor {
{
for (int i=0; i< NUM_SENSORS; i++) {
if ((type == 0xFF) || (sensor[i].s_type == type)) {
sensor[i].valid = false;
sensor[i].complete = false;
sensor[i].temp_ok = false;
sensor[i].humidity_ok = false;
sensor[i].light_ok = false;
sensor[i].uv_ok = false;
sensor[i].wind_ok = false;
sensor[i].rain_ok = false;
sensor[i].moisture_ok = false;
sensor[i].valid = false;
sensor[i].complete = false;
sensor[i].temp_ok = false;
sensor[i].humidity_ok = false;
sensor[i].light_ok = false;
sensor[i].uv_ok = false;
sensor[i].wind_ok = false;
sensor[i].rain_ok = false;
sensor[i].moisture_ok = false;
sensor[i].lightning_ok = false;
}
}
};
Expand Down Expand Up @@ -347,6 +356,18 @@ class WeatherSensor {
*/
DecodeStatus decodeBresser7In1Payload(uint8_t *msg, uint8_t msgSize);
#endif
#ifdef BRESSER_LIGHTNING
/*!
\brief Decode BRESSER_LIGHTNING message. (similar to 7-in-1)

\param msg Message buffer.

\param msgSize Message size in bytes.

\returns Decode status.
*/
DecodeStatus decodeBresserLightningPayload(uint8_t *msg, uint8_t msgSize);
#endif

protected:
/*!
Expand Down
Loading

0 comments on commit 9eb9241

Please sign in to comment.