From 842ba81333178f9a27be58df523460a832614623 Mon Sep 17 00:00:00 2001 From: MiroZ Date: Thu, 13 Jun 2024 13:12:46 -0700 Subject: [PATCH 1/3] sensor stuff --- main/SENSORDATA.md | 80 +++++++++++++++++++++ main/SensorData.h | 47 +++++++++++-- main/sensors/Bme68x.cpp | 16 ++++- main/sensors/Bme68x.h | 4 +- main/sensors/SensorService.cpp | 122 ++++++++++++++++++++++++--------- main/sensors/SensorService.h | 5 ++ 6 files changed, 230 insertions(+), 44 deletions(-) create mode 100644 main/SENSORDATA.md diff --git a/main/SENSORDATA.md b/main/SENSORDATA.md new file mode 100644 index 0000000..8bb43bf --- /dev/null +++ b/main/SENSORDATA.md @@ -0,0 +1,80 @@ +# MQTT message structure +## MSG Header +Every message. Total len 18 bytes. +```mermaid +block-beta + T["TIME
4 bytes
seconds"]:2 + Tm["TIME
4 bytes
useconds"]:2 + MAC["WIFI MAC
6 bytes"]:3 + GRP["Group id
4 bytes"]:2 +``` +# Block messages + +## Radar message +Arrives every 10 seconds. Total len 49 + 18 = 67 bytes +```mermaid +block-beta + MSG_HEADER + B["0x10"] + C["14 uint16
motion energy"] + D["10 uint16
stationary energy"] +``` +
+ +## Sensors message +Arrives every 10 seconds, when gas sensor data has been collected. Total len: 18 + 16 + 5 * number_data_pairs +```mermaid +block-beta + MSG_HEADER:1 + B["0x11"]:1 + C["Pressure
float"]:1 + D["Temperature
float"]:1 + E["light
2 bytes"]:1 + F["humidity
float"]:1 + G["Number of data pairs
byte"]:1 + block:aa:3 + H["index 1
byte"] + I["gas resistance 1
float"] + J["..."] + end +``` + +
+ +# Notification messages + +## Pressure +Total len: 18 + 5 = 23 bytes +```mermaid +block-beta + MSG_HEADER + B["0x01"] + C["value
float"] +``` + +## Temperature +Total len: 18 + 5 = 23 bytes +```mermaid +block-beta + MSG_HEADER + B["0x02"] + C["value
float"] +``` + +## Humidity +Total len: 18 + 5 = 23 bytes +```mermaid +block-beta + MSG_HEADER + B["0x03"] + C["value
float"] +``` + +## Light +Total len: 18 + 3 = 21 bytes +```mermaid +block-beta + MSG_HEADER + B["0x04"] + C["value
2 bytes"] +``` diff --git a/main/SensorData.h b/main/SensorData.h index 64a7b56..4782632 100644 --- a/main/SensorData.h +++ b/main/SensorData.h @@ -1,12 +1,12 @@ /// © MiroZ 2024 #ifndef __SENSOR_DATA_H__ #define __SENSOR_DATA_H__ - #include + #pragma pack(push, 1) -struct MESSAGE_HEADER +struct MESSAGE_HEADER // 19 bytes { uint8_t type; uint32_t sec; @@ -22,12 +22,38 @@ struct MESSAGE_TYPE_VAL_REASON uint8_t reason; }; -struct RADAR +struct RADAR // 49 { uint8_t type; uint16_t vals[24]; }; +struct GAS_HEADER // 2 bytes +{ + uint8_t type; + uint8_t num_measurements; +}; + +struct GAS_DATA //5 bytes +{ + uint8_t index; + float gas_resistance; +}; + +struct OTHERS +{ + float pressure; + float temp; + uint16_t light; +}; + +struct GAS // 6 + num_gas_data * 5 +{ + struct GAS_HEADER header; + float humidity; + struct GAS_DATA data[0]; +}; + #pragma pack(pop) #define HEADER_MESSAGE(name_) \ @@ -98,14 +124,25 @@ struct RADAR #define RADAR_MESSAGE_P(addr_) \ (addr_)->type = MESSAGE_TYPE_RADAR; +#define GAS_MESSAGE(name_, num_vals_) \ + struct GAS name_; \ + name_.header.type = MESSAGE_TYPE_GAS; \ + name_.header.num_measurements = num_vals_; + +#define GAS_MESSAGE_P(addr_, num_vals_) \ + (addr_)->header.type = MESSAGE_TYPE_GAS; \ + (addr_)->header.num_measurements = num_vals_; + #define MESSAGE_TYPE_HEADER 0xa5 #define MESSAGE_TYPE_PRESSURE 0x04 #define MESSAGE_TYPE_RADAR 0x37 #define MESSAGE_TYPE_LIGHT 0x06 #define MESSAGE_TYPE_TEMP 0x07 #define MESSAGE_TYPE_HUMIDITY 0x08 -#define MESSAGE_TYPE_GAS_IX 0x09 -#define MESSAGE_TYPE_GAS_VAL 0x0a +#define MESSAGE_TYPE_GAS_IX 0x09 // deprecated +#define MESSAGE_TYPE_GAS_VAL 0x0a // deprecated +#define MESSAGE_TYPE_GAS 0x0b +#define MESSAGE_TYPE_SENSOR_BLOCK 0x0c void createHeader(struct MESSAGE_HEADER * header); diff --git a/main/sensors/Bme68x.cpp b/main/sensors/Bme68x.cpp index 52a7bd4..aa16f1c 100644 --- a/main/sensors/Bme68x.cpp +++ b/main/sensors/Bme68x.cpp @@ -35,12 +35,16 @@ bool Bme68x::init() return m_operational; } - -void Bme68x::read(struct BME_DATA * data) +/// @brief +/// @param data +/// @return returns true when index 9 is read +bool Bme68x::read(struct BME_DATA * data) { MyLibs::bme68xData bdata; uint8_t left; + bool ret_val = false; + if(m_sensor->fetchData() > 0) { do @@ -50,13 +54,19 @@ void Bme68x::read(struct BME_DATA * data) if (bdata.status == NEW_GAS_MEAS) { int ix = _min(bdata.gas_index, 9); + + ESP_LOGW(TAG, "index: %d", ix); + + data->measurement_bitmask |= (1 << ix); if(ix == 0) data->humidity = bdata.humidity; + else if(ix == 9) + ret_val = true; data->measurement[ix].resistance = bdata.gas_resistance; - data->measurement[ix].temp = bdata.temperature; } } while(left > 0); } + return ret_val; } \ No newline at end of file diff --git a/main/sensors/Bme68x.h b/main/sensors/Bme68x.h index 5dbc06f..3db7ea1 100644 --- a/main/sensors/Bme68x.h +++ b/main/sensors/Bme68x.h @@ -9,13 +9,13 @@ struct GAS_MEASUREMENT { - float temp; float resistance; }; struct BME_DATA { float humidity; + uint16_t measurement_bitmask; struct GAS_MEASUREMENT measurement[10]; }; @@ -30,7 +30,7 @@ public: Bme68x(TwoWire & bus); bool init(); - void read(struct BME_DATA * data); + bool read(struct BME_DATA * data); }; #endif \ No newline at end of file diff --git a/main/sensors/SensorService.cpp b/main/sensors/SensorService.cpp index bca5864..77ad793 100644 --- a/main/sensors/SensorService.cpp +++ b/main/sensors/SensorService.cpp @@ -51,51 +51,105 @@ void SensorService::start() pinMode(LIGHT_SENSOR_PIN, INPUT); } +void SensorService::postBme68xData(float pressure, float temp) +{ + struct msg + { + struct MESSAGE_HEADER header; + struct OTHERS others; + struct GAS gas; + }; + + uint8_t msg_buffer[100]; + + struct msg *data_to_send = (struct msg *)msg_buffer; + + HEADER_MESSAGE_P(&data_to_send->header); + GAS_MESSAGE_P(&data_to_send->gas, 0); + + data_to_send->others.light = m_light_value; + data_to_send->others.pressure = pressure; + data_to_send->others.temp = temp; + + int num_total = 0; + + struct GAS_DATA * p = data_to_send->gas.data; + for(int n = 0; n < 10; n++) + { + if(m_bme_data.measurement_bitmask & (1 << n)) + { + p[num_total].gas_resistance = m_bme_data.measurement[n].resistance; + p[num_total++].index = n; + } + } + + data_to_send->gas.header.num_measurements = num_total; + data_to_send->gas.humidity = m_bme_data.humidity; + + m_app_if.getBuffer()->putBlock((uint8_t*)&data_to_send, sizeof(*data_to_send) + num_total * sizeof(struct GAS_DATA)); + + // clear the blackboard + memset(&m_bme_data, 0, sizeof(m_bme_data)); +} + +/// @brief Actual light value is minimum in 2s window +/// @param light_value +void SensorService::processLight(int light_value) +{ + static uint16_t min_light_val = 0xffff; + static int last_light_val = -1; + static uint64_t last_time = esp_timer_get_time(); + uint64_t now; + + // handle light sensor + if(light_value < min_light_val) + min_light_val = light_value; + + now = esp_timer_get_time(); + + if(now - last_time >= 2000000) // >= 2s + { + ESP_LOGI(TAG, "light: %d", min_light_val); + if(last_light_val >= 0) + { + if(abs(min_light_val - last_light_val) > 4096*5/100) + { + ESP_LOGI(TAG, "light tripped"); + struct msg + { + struct MESSAGE_HEADER header; + struct MESSAGE_TYPE_VAL_REASON light; + }; + + struct msg m; + HEADER_MESSAGE_P(&m.header); + LIGHT_MESSAGE_P(&m.light, min_light_val, 1); + m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m)); + } + } + last_light_val = min_light_val; + m_light_value = min_light_val; + min_light_val = 0xffff; + last_time = now; + } +} + // handles pressure and voc sensor void SensorService::run_i2c_1() { - uint16_t light_val = 0xffff; - int last_light_val = -1; - uint64_t last_time = esp_timer_get_time(), now; - while(true) { m_bmp280->read(m_bmp_data.temp, m_bmp_data.pressure); - m_bme68x->read(&m_bme_data); + bool bme_cycle_finished = m_bme68x->read(&m_bme_data); uint16_t read_light_val = analogRead(LIGHT_SENSOR_PIN); - // handle light sensor - if(read_light_val < light_val) - light_val = read_light_val; - - now = esp_timer_get_time(); - - if(now - last_time >= 2000000) // >= 2s + if(bme_cycle_finished) { - ESP_LOGI(TAG, "light: %d", light_val); - if(last_light_val >= 0) - { - if(abs(light_val - last_light_val) > 4096*5/100) - { - ESP_LOGI(TAG, "light tripped"); - struct msg - { - struct MESSAGE_HEADER header; - struct MESSAGE_TYPE_VAL_REASON light; - }; - - struct msg m; - HEADER_MESSAGE_P(&m.header); - LIGHT_MESSAGE_P(&m.light, light_val, 1); - m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m)); - } - } - last_light_val = light_val; - light_val = 0xffff; - last_time = now; + postBme68xData(m_bmp_data.pressure, m_bmp_data.temp); } - + processLight(read_light_val); + delay(10); } } diff --git a/main/sensors/SensorService.h b/main/sensors/SensorService.h index f7cad4e..3e7cc2a 100644 --- a/main/sensors/SensorService.h +++ b/main/sensors/SensorService.h @@ -28,6 +28,11 @@ protected: AppIF & m_app_if; + void postBme68xData(float pressure, float temp); + void processLight(int light_value); + void processHumidity(float humidity); + uint16_t m_light_value = 0; + public: SensorService(AppIF & app_if); void start(); From ccd3e4ebbe0979026382a8ba4b370f60351792e1 Mon Sep 17 00:00:00 2001 From: MiroZ Date: Mon, 24 Jun 2024 12:12:47 -0700 Subject: [PATCH 2/3] before vacation --- README.md | 17 ++- main/MqttService.cpp | 12 ++- main/SensorData.cpp | 1 - main/SensorData.h | 160 ++++++++++------------------- main/sensors/Bme68x.cpp | 2 - main/sensors/Bmp280.cpp | 6 +- main/sensors/SensorService.cpp | 89 ++++++++-------- main/sensors/SensorService.h | 2 +- utils/DigiCertGlobalRootG3.crt.pem | 15 +++ utils/c1.txt | 38 +++++++ utils/c2.txt | 21 ++++ utils/eventgrid.azure_full.pem | 72 +++++++++++++ utils/mqtt.py | 56 ++++++++++ {plot => utils}/plot.py | 0 14 files changed, 325 insertions(+), 166 deletions(-) create mode 100755 utils/DigiCertGlobalRootG3.crt.pem create mode 100644 utils/c1.txt create mode 100644 utils/c2.txt create mode 100644 utils/eventgrid.azure_full.pem create mode 100755 utils/mqtt.py rename {plot => utils}/plot.py (100%) diff --git a/README.md b/README.md index b726675..e040c1c 100644 --- a/README.md +++ b/README.md @@ -14,4 +14,19 @@ need root certificates openssl s_client -showcerts -connect www.bigfoot-inc.com:443 -openssl s_client -showcerts -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 \ No newline at end of file +openssl s_client -showcerts -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 + +to get full certificate and save it to pem file: +openssl s_client -showcerts -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 /dev/null|openssl x509 -outform PEM >mycertfile.pem + +openssl s_client -showcerts -verify 5 -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 < /dev/null + +openssl s_client -showcerts -verify 5 -connect mqtt-dev-server.westus2-1.ts.eventgrid.azure.net:8883 < /dev/null | + awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/{ if(/BEGIN CERTIFICATE/){a++}; out="cert"a".pem"; print >out}' +for cert in *.pem; do + newname=$(openssl x509 -noout -subject -in $cert | sed -nE 's/.*CN ?= ?(.*)/\1/; s/[ ,.*]/_/g; s/__/_/g; s/_-_/-/; s/^_//g;p' | tr '[:upper:]' '[:lower:]').pem + echo "${newname}"; mv "${cert}" "${newname}" +done + +convert crl to pem +openssl crl -in "Microsoft Azure ECC TLS Issuing CA 08 - xsign.crt" -inform PEM -out "Microsoft Azure ECC TLS Issuing CA 08 - xsign.pem" diff --git a/main/MqttService.cpp b/main/MqttService.cpp index 0b95898..8865925 100644 --- a/main/MqttService.cpp +++ b/main/MqttService.cpp @@ -42,8 +42,18 @@ void MqttService::task() while (!m_mqtt_client->connected()) { ESP_LOGI(TAG, "connecting to mqtt broker..."); - if (m_mqtt_client->connect("Esp32 client", "client1-authn-ID", NULL)) + if (m_mqtt_client->connect("Esp32 client", "client1-authn-ID", NULL)) + { ESP_LOGI(TAG, "connected"); + if(m_mqtt_client->subscribe("my_topic")) + { + ESP_LOGI(TAG, "subscribed"); + } + else + { + ESP_LOGE(TAG, "subscribe failed"); + } + } else { ESP_LOGE(TAG, "failed with state %d", m_mqtt_client->state()); diff --git a/main/SensorData.cpp b/main/SensorData.cpp index 7995b94..d95f531 100644 --- a/main/SensorData.cpp +++ b/main/SensorData.cpp @@ -10,7 +10,6 @@ void createHeader(struct MESSAGE_HEADER * header) { struct timeval tv; gettimeofday(&tv, NULL); - header->type = MESSAGE_TYPE_HEADER; header->sec = tv.tv_sec; header->usec = tv.tv_usec; header->group_id = SETTINGS.device.group_id; diff --git a/main/SensorData.h b/main/SensorData.h index 4782632..01c3c98 100644 --- a/main/SensorData.h +++ b/main/SensorData.h @@ -6,143 +6,89 @@ #pragma pack(push, 1) -struct MESSAGE_HEADER // 19 bytes +struct MESSAGE_HEADER // 18 bytes { - uint8_t type; uint32_t sec; uint32_t usec; uint8_t mac[6]; uint32_t group_id; }; -struct MESSAGE_TYPE_VAL_REASON +struct MESSAGE_RADAR_BLOCK // 67 bytes { - uint8_t type; - uint32_t val; - uint8_t reason; -}; - -struct RADAR // 49 -{ - uint8_t type; + struct MESSAGE_HEADER header; + uint8_t id; uint16_t vals[24]; }; -struct GAS_HEADER // 2 bytes -{ - uint8_t type; - uint8_t num_measurements; -}; - -struct GAS_DATA //5 bytes +struct GAS_DATA { uint8_t index; - float gas_resistance; + float resistance; }; -struct OTHERS +struct MESSAGE_SENSORS_BLOCK { + struct MESSAGE_HEADER header; + uint8_t id; float pressure; - float temp; + float temperature; uint16_t light; + float humidity; + uint8_t num_data; + struct GAS_DATA data[0]; }; -struct GAS // 6 + num_gas_data * 5 +struct MESSAGE_NOTIFY_PRESSURE { - struct GAS_HEADER header; - float humidity; - struct GAS_DATA data[0]; + struct MESSAGE_HEADER header; + uint8_t id; + float value; +}; + +struct MESSAGE_NOTIFY_TEMPERATURE +{ + struct MESSAGE_HEADER header; + uint8_t id; + float value; +}; + +struct MESSAGE_NOTIFY_HUMIDITY +{ + struct MESSAGE_HEADER header; + uint8_t id; + float value; +}; + +struct MESSAGE_NOTIFY_LIGHT // 21 bytes +{ + struct MESSAGE_HEADER header; + uint8_t id; + uint16_t value; }; #pragma pack(pop) -#define HEADER_MESSAGE(name_) \ - struct MESSAGE_HEADER name_; \ - createHeader(&name_); +#define MQTT_MESSAGE_BLOCK_RADAR(msgaddr_) \ + createHeader(&(*msgaddr_).header); \ + (msgaddr_)->id = MESSAGE_TYPE_BLOCK_RADAR; -#define HEADER_MESSAGE_P(addr_) \ - createHeader(addr_); +#define MQTT_MESSAGE_BLOCK_SENSOR(msgaddr_) \ + createHeader(&(*msgaddr_).header); \ + (msgaddr_)->id = MESSAGE_TYPE_BLOCK_SENSOR; -#define PRESSURE_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_PRESSURE; \ - name_.val = val_; name_.reason = reason_; +#define MQTT_MESSAGE_NOTIFY_LIGHT(msgaddr_) \ + createHeader(&(msgaddr_)->header); \ + (msgaddr_)->id = MESSAGE_TYPE_NOTIFY_LIGHT; -#define PRESSURE_MESSAGE_P(addr_, val_, reason_) \ - (addr)->type = MESSAGE_TYPE_PRESSURE; \ - (addr)->val = val_; (addr)->reason = reason_; -#define LIGHT_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_LIGHT; \ - name_.val = val_; name_.reason = reason_; +#define MESSAGE_TYPE_NOTIFY_PRESSURE 0x01 +#define MESSAGE_TYPE_NOTIFY_TEMPERATURE 0x02 +#define MESSAGE_TYPE_NOTIFY_HUMIDITY 0x03 +#define MESSAGE_TYPE_NOTIFY_LIGHT 0x04 -#define LIGHT_MESSAGE_P(addr_, val_, reason_) \ - (addr_)->type = MESSAGE_TYPE_LIGHT; \ - (addr_)->val = val_; (addr_)->reason = reason_; - -#define TEMP_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_TEMP; \ - name_.val = val_; name_.reason = reason_; - -#define TEMP_MESSAGE_P(addr_, val_, reason_) \ - (addr_)->type = MESSAGE_TYPE_TEMP; \ - (addr_)->val = val_; (addr_)->reason = reason_; - -#define HUM_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_HUMIDITY; \ - name_.val = val_; name_.reason = reason_; - -#define HUM_MESSAGE_P(addr_, val_, reason_) \ - (addr_)->type = MESSAGE_TYPE_HUMIDITY; \ - (addr_)->val = val_; (addr_)->reason = reason_; - -#define GAS_IX_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_GAS_IX; \ - name_.val = val_; name_.reason = reason_; - -#define GAS_IX_MESSAGE_P(addr_, val_, reason_) \ - (addr_)->type = MESSAGE_TYPE_GAS_IX; \ - (addr_)->val = val_; (addr_)->reason = reason_; - -#define GAS_VAL_MESSAGE(name_, val_, reason_) \ - struct MESSAGE_TYPE_VAL_REASON name_; \ - name_.type = MESSAGE_TYPE_GAS_VAL; \ - name_.val = val_; name_.reason = reason_; - -#define GAS_VAL_MESSAGE_P(addr_, val_, reason_) \ - (addr_)->type = MESSAGE_TYPE_GAS_VAL; \ - (addr_)->val = val_; (addr_)->reason = reason_; - -#define RADAR_MESSAGE(name_) \ - struct RADAR name_; \ - name_.type = MESSAGE_TYPE_RADAR; - -#define RADAR_MESSAGE_P(addr_) \ - (addr_)->type = MESSAGE_TYPE_RADAR; - -#define GAS_MESSAGE(name_, num_vals_) \ - struct GAS name_; \ - name_.header.type = MESSAGE_TYPE_GAS; \ - name_.header.num_measurements = num_vals_; - -#define GAS_MESSAGE_P(addr_, num_vals_) \ - (addr_)->header.type = MESSAGE_TYPE_GAS; \ - (addr_)->header.num_measurements = num_vals_; - -#define MESSAGE_TYPE_HEADER 0xa5 -#define MESSAGE_TYPE_PRESSURE 0x04 -#define MESSAGE_TYPE_RADAR 0x37 -#define MESSAGE_TYPE_LIGHT 0x06 -#define MESSAGE_TYPE_TEMP 0x07 -#define MESSAGE_TYPE_HUMIDITY 0x08 -#define MESSAGE_TYPE_GAS_IX 0x09 // deprecated -#define MESSAGE_TYPE_GAS_VAL 0x0a // deprecated -#define MESSAGE_TYPE_GAS 0x0b -#define MESSAGE_TYPE_SENSOR_BLOCK 0x0c +#define MESSAGE_TYPE_BLOCK_RADAR 0x10 +#define MESSAGE_TYPE_BLOCK_SENSOR 0x11 void createHeader(struct MESSAGE_HEADER * header); diff --git a/main/sensors/Bme68x.cpp b/main/sensors/Bme68x.cpp index aa16f1c..3da97f1 100644 --- a/main/sensors/Bme68x.cpp +++ b/main/sensors/Bme68x.cpp @@ -55,8 +55,6 @@ bool Bme68x::read(struct BME_DATA * data) { int ix = _min(bdata.gas_index, 9); - ESP_LOGW(TAG, "index: %d", ix); - data->measurement_bitmask |= (1 << ix); if(ix == 0) diff --git a/main/sensors/Bmp280.cpp b/main/sensors/Bmp280.cpp index 82d5018..9121406 100644 --- a/main/sensors/Bmp280.cpp +++ b/main/sensors/Bmp280.cpp @@ -16,7 +16,7 @@ bool Bmp280::init() uint8_t status = m_sensor->begin(0x76); m_sensor->setPresOversampling(OVERSAMPLING_X4); // Set the pressure oversampling to X4 m_sensor->setTempOversampling(OVERSAMPLING_X1); // Set the temperature oversampling to X1 - m_sensor->setIIRFilter(IIR_FILTER_2); // Set the IIR filter to setting 4 + m_sensor->setIIRFilter(IIR_FILTER_4); // Set the IIR filter to setting 4 m_sensor->setTimeStandby(TIME_STANDBY_62MS); m_sensor->startNormalConversion(); // Start BMP280 continuous conversion in NORMAL_MODE @@ -28,9 +28,7 @@ bool Bmp280::init() bool Bmp280::read(float & temp, float & pressure) { if(m_sensor->getTempPres(temp, pressure)) - { return true; - } - return true; + return false; } \ No newline at end of file diff --git a/main/sensors/SensorService.cpp b/main/sensors/SensorService.cpp index 77ad793..de491c6 100644 --- a/main/sensors/SensorService.cpp +++ b/main/sensors/SensorService.cpp @@ -51,42 +51,47 @@ void SensorService::start() pinMode(LIGHT_SENSOR_PIN, INPUT); } +void::SensorService::processPressure(float pressure) +{ + static float filtered = 0; + static uint64_t previous = esp_timer_get_time(); + + if(filtered == 0 && pressure != 0) + filtered = pressure; + + uint64_t now = esp_timer_get_time(); + + ESP_LOGI(TAG, "delta T: %d", (uint32_t)((now-previous)/1000)); + + filtered = 0.95 * filtered + 0.05 * pressure; + previous = now; + ESP_LOGI(TAG, "%0.3f \t%0.3f", pressure, filtered); +} + void SensorService::postBme68xData(float pressure, float temp) { - struct msg - { - struct MESSAGE_HEADER header; - struct OTHERS others; - struct GAS gas; - }; - - uint8_t msg_buffer[100]; - - struct msg *data_to_send = (struct msg *)msg_buffer; - - HEADER_MESSAGE_P(&data_to_send->header); - GAS_MESSAGE_P(&data_to_send->gas, 0); - - data_to_send->others.light = m_light_value; - data_to_send->others.pressure = pressure; - data_to_send->others.temp = temp; + uint8_t msg_buffer[sizeof(struct MESSAGE_SENSORS_BLOCK) + 10*sizeof(struct GAS_DATA)]; + struct MESSAGE_SENSORS_BLOCK * msg = (struct MESSAGE_SENSORS_BLOCK *)msg_buffer; + MQTT_MESSAGE_BLOCK_SENSOR(msg); + msg->humidity = m_bme_data.humidity; + msg->light = m_light_value; + msg->pressure = pressure; + msg->temperature = temp; int num_total = 0; - struct GAS_DATA * p = data_to_send->gas.data; + struct GAS_DATA * p = msg->data; for(int n = 0; n < 10; n++) { if(m_bme_data.measurement_bitmask & (1 << n)) { - p[num_total].gas_resistance = m_bme_data.measurement[n].resistance; + p[num_total].resistance = m_bme_data.measurement[n].resistance; p[num_total++].index = n; } } + msg->num_data = num_total; - data_to_send->gas.header.num_measurements = num_total; - data_to_send->gas.humidity = m_bme_data.humidity; - - m_app_if.getBuffer()->putBlock((uint8_t*)&data_to_send, sizeof(*data_to_send) + num_total * sizeof(struct GAS_DATA)); + m_app_if.getBuffer()->putBlock((uint8_t*)msg, sizeof(*msg) + num_total * sizeof(struct GAS_DATA)); // clear the blackboard memset(&m_bme_data, 0, sizeof(m_bme_data)); @@ -109,22 +114,15 @@ void SensorService::processLight(int light_value) if(now - last_time >= 2000000) // >= 2s { - ESP_LOGI(TAG, "light: %d", min_light_val); if(last_light_val >= 0) { if(abs(min_light_val - last_light_val) > 4096*5/100) { ESP_LOGI(TAG, "light tripped"); - struct msg - { - struct MESSAGE_HEADER header; - struct MESSAGE_TYPE_VAL_REASON light; - }; - - struct msg m; - HEADER_MESSAGE_P(&m.header); - LIGHT_MESSAGE_P(&m.light, min_light_val, 1); - m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m)); + struct MESSAGE_NOTIFY_LIGHT msg; + MQTT_MESSAGE_NOTIFY_LIGHT(&msg); + msg.value = min_light_val; + m_app_if.getBuffer()->putBlock((uint8_t*)&msg, sizeof(msg)); } } last_light_val = min_light_val; @@ -139,14 +137,14 @@ void SensorService::run_i2c_1() { while(true) { - m_bmp280->read(m_bmp_data.temp, m_bmp_data.pressure); + if(m_bmp280->read(m_bmp_data.temp, m_bmp_data.pressure)) + processPressure(m_bmp_data.pressure); + bool bme_cycle_finished = m_bme68x->read(&m_bme_data); uint16_t read_light_val = analogRead(LIGHT_SENSOR_PIN); if(bme_cycle_finished) - { postBme68xData(m_bmp_data.pressure, m_bmp_data.temp); - } processLight(read_light_val); @@ -170,25 +168,18 @@ void SensorService::run_uart() if(m_ld2410->stationary_energy[0] != 0) { - struct msg - { - struct MESSAGE_HEADER header; - struct RADAR radar; - }; - - struct msg m; - HEADER_MESSAGE_P(&m.header); - RADAR_MESSAGE_P(&m.radar); + struct MESSAGE_RADAR_BLOCK msg; + MQTT_MESSAGE_BLOCK_RADAR(&msg); for(int n = 0; n < 24; n++) { if(n < 14) - m.radar.vals[n] = m_ld2410->motion_energy[n] > 0xffff ? 0xffff : (uint16_t)m_ld2410->motion_energy[n]; + msg.vals[n] = m_ld2410->motion_energy[n] > 0xffff ? 0xffff : (uint16_t)m_ld2410->motion_energy[n]; else - m.radar.vals[n] = m_ld2410->stationary_energy[n-14] > 0xffff ? 0xffff : (uint16_t)m_ld2410->stationary_energy[n-14]; + msg.vals[n] = m_ld2410->stationary_energy[n-14] > 0xffff ? 0xffff : (uint16_t)m_ld2410->stationary_energy[n-14]; } - m_app_if.getBuffer()->putBlock((uint8_t*)&m, sizeof(m)); + m_app_if.getBuffer()->putBlock((uint8_t*)&msg, sizeof(msg)); ESP_LOGI(TAG, "delta t: %lld", (now - last_read)/1000); last_read = now; diff --git a/main/sensors/SensorService.h b/main/sensors/SensorService.h index 3e7cc2a..a7f55cf 100644 --- a/main/sensors/SensorService.h +++ b/main/sensors/SensorService.h @@ -30,7 +30,7 @@ protected: void postBme68xData(float pressure, float temp); void processLight(int light_value); - void processHumidity(float humidity); + void processPressure(float pressure); uint16_t m_light_value = 0; public: diff --git a/utils/DigiCertGlobalRootG3.crt.pem b/utils/DigiCertGlobalRootG3.crt.pem new file mode 100755 index 0000000..bc20c1e --- /dev/null +++ b/utils/DigiCertGlobalRootG3.crt.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- diff --git a/utils/c1.txt b/utils/c1.txt new file mode 100644 index 0000000..7deba1e --- /dev/null +++ b/utils/c1.txt @@ -0,0 +1,38 @@ +-----BEGIN CERTIFICATE----- +MIIGZTCCBeugAwIBAgITMwAAF5dJwzxVQmn/kwAAAAAXlzAKBggqhkjOPQQDAzBd +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS4w +LAYDVQQDEyVNaWNyb3NvZnQgQXp1cmUgRUNDIFRMUyBJc3N1aW5nIENBIDA4MB4X +DTI0MDYwNjEwNDYzMloXDTI1MDYwMTEwNDYzMlowbDELMAkGA1UEBhMCVVMxCzAJ +BgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg +Q29ycG9yYXRpb24xHjAcBgNVBAMMFSouZXZlbnRncmlkLmF6dXJlLm5ldDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABCROnPe0MEoTPo7mZV7qBXj/gNaEhuTiIfoqzkkE +mayyKiKUh3M8kcNMFKA6Cw5FQpKcJnFgNdHhgK2an2bY16k1Rl+BGdH7cgeW4KxJ +/8BZGCUrcF0XqVYqU1ta2tPSe6OCBFwwggRYMIIBfgYKKwYBBAHWeQIEAgSCAW4E +ggFqAWgAdgDPEVbu1S58r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAY/tMX1g +AAAEAwBHMEUCIDvK/oTF+17QrKCyrkP+aJu5OOkWwWcdvW+fo0yuDj5TAiEAhIDF +m1B7P4TRY+80nE3klxMaDpXz13W/GFGLu3b/CC0AdwB9WR4S4XgqexxhZ3xe/fjQ +h1wUoE6VnrkDL9kOjC55uAAAAY/tMX5iAAAEAwBIMEYCIQC4AVpEBPNMlmXA6Rgm +jwbxZ12dY4t0y+d3zVmERPSpkQIhAL4eN6aJcxc7AbfCpRVq9MVmmaAgpcin33Ab +Kub+uVlxAHUA4JKz/AwdyOdoNh/eYbmWTQpSeBmKctZyxLBNpW1vVAQAAAGP7TF+ +1gAABAMARjBEAiAmSpLfPIgdhcYH4KeElGfrQAp3mv2UeqXsc+g6Zrl2VgIgP9xH +zAwKA1JmO+GQgQWacfy3opms5EvuTyUL33uw/6UwJwYJKwYBBAGCNxUKBBowGDAK +BggrBgEFBQcDAjAKBggrBgEFBQcDATA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3 +FQiHvdcbgefrRoKBnS6O0AyH8NodXYKE5WmC86c+AgFkAgEmMIG0BggrBgEFBQcB +AQSBpzCBpDBzBggrBgEFBQcwAoZnaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br +aW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBBenVyZSUyMEVDQyUyMFRMUyUyMElzc3Vp +bmclMjBDQSUyMDA4JTIwLSUyMHhzaWduLmNydDAtBggrBgEFBQcwAYYhaHR0cDov +L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMB0GA1UdDgQWBBSd0gLTJBBooJfu +lBbYLw4ogSVu0zAOBgNVHQ8BAf8EBAMCB4AwZQYDVR0RBF4wXIIVKi5ldmVudGdy +aWQuYXp1cmUubmV0giIqLndlc3R1czItMS50cy5ldmVudGdyaWQuYXp1cmUubmV0 +gh8qLndlc3R1czItMS5ldmVudGdyaWQuYXp1cmUubmV0MAwGA1UdEwEB/wQCMAAw +agYDVR0fBGMwYTBfoF2gW4ZZaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w +cy9jcmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBFQ0MlMjBUTFMlMjBJc3N1aW5nJTIw +Q0ElMjAwOC5jcmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEF +BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z +aXRvcnkuaHRtMAgGBmeBDAECAjAfBgNVHSMEGDAWgBStVB0DVHHGL17WWxhYzm4k +xdaiCjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMD +aAAwZQIxAIljbWjBlPPC1hJQEy1Pq4V5fPe+F0zNNuk6paj1ZCoqHahiBpvKpYTp +tZlJVKZtpAIwWnTO0WileYRCYWSniZFtliF/HZvgrLoAWd+NGZzdmhjoavdVYZho +0VvfpbsVVech +-----END CERTIFICATE----- + diff --git a/utils/c2.txt b/utils/c2.txt new file mode 100644 index 0000000..8814023 --- /dev/null +++ b/utils/c2.txt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXDCCAuOgAwIBAgIQDvLl2DaBUgJV6Sxgj7wv9DAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0yMzA2MDgwMDAwMDBaFw0yNjA4MjUyMzU5NTlaMF0xCzAJBgNVBAYTAlVTMR4w +HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLjAsBgNVBAMTJU1pY3Jvc29m +dCBBenVyZSBFQ0MgVExTIElzc3VpbmcgQ0EgMDgwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATlQzoKIJQIe8bd4sX2x9XBtFvoh5m7Neph3MYORvv/rg2Ew7Cfb00eZ+zS +njUosyOUCspenehe0PyKtmq6pPshLu5Ww/hLEoQT3drwxZ5PaYHmGEGoy2aPBeXa +23k5ruijggFiMIIBXjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBStVB0D +VHHGL17WWxhYzm4kxdaiCjAfBgNVHSMEGDAWgBSz20ik+aHF2K42QcwRY2liKbxL +xjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC +MHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl +cnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v +RGlnaUNlcnRHbG9iYWxSb290RzMuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6 +Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMy5jcmwwHQYD +VR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMAoGCCqGSM49BAMDA2cAMGQCMD+q +5Uq1fSGZSKRhrnWKKXlp4DvfZCEU/MF3rbdwAaXI/KVM65YRO9HvRbfDpV3x1wIw +CHvqqpg/8YJPDn8NJIS/Rg+lYraOseXeuNYzkjeY6RLxIDB+nLVDs9QJ3/co89Cd +-----END CERTIFICATE----- + diff --git a/utils/eventgrid.azure_full.pem b/utils/eventgrid.azure_full.pem new file mode 100644 index 0000000..151ca44 --- /dev/null +++ b/utils/eventgrid.azure_full.pem @@ -0,0 +1,72 @@ +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIGZTCCBeugAwIBAgITMwAAF5dJwzxVQmn/kwAAAAAXlzAKBggqhkjOPQQDAzBd +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS4w +LAYDVQQDEyVNaWNyb3NvZnQgQXp1cmUgRUNDIFRMUyBJc3N1aW5nIENBIDA4MB4X +DTI0MDYwNjEwNDYzMloXDTI1MDYwMTEwNDYzMlowbDELMAkGA1UEBhMCVVMxCzAJ +BgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg +Q29ycG9yYXRpb24xHjAcBgNVBAMMFSouZXZlbnRncmlkLmF6dXJlLm5ldDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABCROnPe0MEoTPo7mZV7qBXj/gNaEhuTiIfoqzkkE +mayyKiKUh3M8kcNMFKA6Cw5FQpKcJnFgNdHhgK2an2bY16k1Rl+BGdH7cgeW4KxJ +/8BZGCUrcF0XqVYqU1ta2tPSe6OCBFwwggRYMIIBfgYKKwYBBAHWeQIEAgSCAW4E +ggFqAWgAdgDPEVbu1S58r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAY/tMX1g +AAAEAwBHMEUCIDvK/oTF+17QrKCyrkP+aJu5OOkWwWcdvW+fo0yuDj5TAiEAhIDF +m1B7P4TRY+80nE3klxMaDpXz13W/GFGLu3b/CC0AdwB9WR4S4XgqexxhZ3xe/fjQ +h1wUoE6VnrkDL9kOjC55uAAAAY/tMX5iAAAEAwBIMEYCIQC4AVpEBPNMlmXA6Rgm +jwbxZ12dY4t0y+d3zVmERPSpkQIhAL4eN6aJcxc7AbfCpRVq9MVmmaAgpcin33Ab +Kub+uVlxAHUA4JKz/AwdyOdoNh/eYbmWTQpSeBmKctZyxLBNpW1vVAQAAAGP7TF+ +1gAABAMARjBEAiAmSpLfPIgdhcYH4KeElGfrQAp3mv2UeqXsc+g6Zrl2VgIgP9xH +zAwKA1JmO+GQgQWacfy3opms5EvuTyUL33uw/6UwJwYJKwYBBAGCNxUKBBowGDAK +BggrBgEFBQcDAjAKBggrBgEFBQcDATA8BgkrBgEEAYI3FQcELzAtBiUrBgEEAYI3 +FQiHvdcbgefrRoKBnS6O0AyH8NodXYKE5WmC86c+AgFkAgEmMIG0BggrBgEFBQcB +AQSBpzCBpDBzBggrBgEFBQcwAoZnaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br +aW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBBenVyZSUyMEVDQyUyMFRMUyUyMElzc3Vp +bmclMjBDQSUyMDA4JTIwLSUyMHhzaWduLmNydDAtBggrBgEFBQcwAYYhaHR0cDov +L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMB0GA1UdDgQWBBSd0gLTJBBooJfu +lBbYLw4ogSVu0zAOBgNVHQ8BAf8EBAMCB4AwZQYDVR0RBF4wXIIVKi5ldmVudGdy +aWQuYXp1cmUubmV0giIqLndlc3R1czItMS50cy5ldmVudGdyaWQuYXp1cmUubmV0 +gh8qLndlc3R1czItMS5ldmVudGdyaWQuYXp1cmUubmV0MAwGA1UdEwEB/wQCMAAw +agYDVR0fBGMwYTBfoF2gW4ZZaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w +cy9jcmwvTWljcm9zb2Z0JTIwQXp1cmUlMjBFQ0MlMjBUTFMlMjBJc3N1aW5nJTIw +Q0ElMjAwOC5jcmwwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEF +BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z +aXRvcnkuaHRtMAgGBmeBDAECAjAfBgNVHSMEGDAWgBStVB0DVHHGL17WWxhYzm4k +xdaiCjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwCgYIKoZIzj0EAwMD +aAAwZQIxAIljbWjBlPPC1hJQEy1Pq4V5fPe+F0zNNuk6paj1ZCoqHahiBpvKpYTp +tZlJVKZtpAIwWnTO0WileYRCYWSniZFtliF/HZvgrLoAWd+NGZzdmhjoavdVYZho +0VvfpbsVVech +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDXDCCAuOgAwIBAgIQDvLl2DaBUgJV6Sxgj7wv9DAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0yMzA2MDgwMDAwMDBaFw0yNjA4MjUyMzU5NTlaMF0xCzAJBgNVBAYTAlVTMR4w +HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLjAsBgNVBAMTJU1pY3Jvc29m +dCBBenVyZSBFQ0MgVExTIElzc3VpbmcgQ0EgMDgwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATlQzoKIJQIe8bd4sX2x9XBtFvoh5m7Neph3MYORvv/rg2Ew7Cfb00eZ+zS +njUosyOUCspenehe0PyKtmq6pPshLu5Ww/hLEoQT3drwxZ5PaYHmGEGoy2aPBeXa +23k5ruijggFiMIIBXjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBStVB0D +VHHGL17WWxhYzm4kxdaiCjAfBgNVHSMEGDAWgBSz20ik+aHF2K42QcwRY2liKbxL +xjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC +MHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl +cnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v +RGlnaUNlcnRHbG9iYWxSb290RzMuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6 +Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMy5jcmwwHQYD +VR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMAoGCCqGSM49BAMDA2cAMGQCMD+q +5Uq1fSGZSKRhrnWKKXlp4DvfZCEU/MF3rbdwAaXI/KVM65YRO9HvRbfDpV3x1wIw +CHvqqpg/8YJPDn8NJIS/Rg+lYraOseXeuNYzkjeY6RLxIDB+nLVDs9QJ3/co89Cd +-----END CERTIFICATE----- diff --git a/utils/mqtt.py b/utils/mqtt.py new file mode 100755 index 0000000..b8939c4 --- /dev/null +++ b/utils/mqtt.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +from paho.mqtt import client as mqtt_client +import time + +mqtt_broker = "mqtt-dev-server.westus2-1.ts.eventgrid.azure.net" +mqtt_port = 8883 +mqtt_topic = "wellnuotopics/topic1" +mqtt_client_id = "client1-authn-ID" + +connected = False + +def connect_mqtt(client_id): + def on_connect(client, userdata, flags, rc): + global connected + if rc == 0: + print("Connected to MQTT Broker!") + connected = True + else: + print("Failed to connect, return code %d\n", rc) + + client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, "client_id") + client.tls_set( + ca_certs='eventgrid.azure_full.pem', + certfile='../certs/client1-authn-ID.pem', + keyfile='../certs/client1-authn-ID.key' + ) + + client.username_pw_set(client_id, "") + client.on_connect = on_connect + client.connect(mqtt_broker, mqtt_port) + return client + +def publish(client, topic, msg): + result = client.publish(topic, msg) + # result: [0, 1] + status = result[0] + if status == 0: + print(f"Sent `{msg}` to topic `{topic}`") + else: + print(f"Failed to send message to topic {topic}") + +def main() -> None: + client = connect_mqtt(mqtt_client_id) + client.loop_start() + + while(connected == False): + time.sleep(1) + + publish(client, "wellnuotopics/topic1", "hello") + time.sleep(2) + client.disconnect() + +if __name__ == "__main__": + main() + \ No newline at end of file diff --git a/plot/plot.py b/utils/plot.py similarity index 100% rename from plot/plot.py rename to utils/plot.py From 88979da2d6c05e9e5d6c020b3af91ad38268b1e6 Mon Sep 17 00:00:00 2001 From: MiroZ Date: Sun, 21 Jul 2024 19:15:49 -0700 Subject: [PATCH 3/3] added command processor linked to BLE and mqtt --- README.md | 3 + certs/eventgrid.azure.pem | 1 + main/App.cpp | 14 +- main/App.h | 3 + main/AppIF.h | 2 + main/BleService.cpp | 53 ++------ main/BleService.h | 3 - main/CMakeLists.txt | 1 + main/CommandProcessor.cpp | 226 +++++++++++++++++++++++++++++++++ main/CommandProcessor.h | 31 +++++ main/MqttService.cpp | 44 +++++-- main/Settings.cpp | 6 +- main/Settings.h | 19 ++- main/Wifi.cpp | 12 +- main/sensors/SensorService.cpp | 26 +++- main/utilities.cpp | 42 ++++++ main/utilities.h | 2 + utils/mqtt.py | 7 +- 18 files changed, 419 insertions(+), 76 deletions(-) create mode 100644 main/CommandProcessor.cpp create mode 100644 main/CommandProcessor.h diff --git a/README.md b/README.md index e040c1c..2b8aa14 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +# merge with accepting all incoming changes +git merge [branch] --strategy-option theirs + # MQTT Server MQTT server: diff --git a/certs/eventgrid.azure.pem b/certs/eventgrid.azure.pem index 43860a1..8814023 100755 --- a/certs/eventgrid.azure.pem +++ b/certs/eventgrid.azure.pem @@ -18,3 +18,4 @@ VR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMAoGCCqGSM49BAMDA2cAMGQCMD+q 5Uq1fSGZSKRhrnWKKXlp4DvfZCEU/MF3rbdwAaXI/KVM65YRO9HvRbfDpV3x1wIw CHvqqpg/8YJPDn8NJIS/Rg+lYraOseXeuNYzkjeY6RLxIDB+nLVDs9QJ3/co89Cd -----END CERTIFICATE----- + diff --git a/main/App.cpp b/main/App.cpp index ae17723..8198824 100644 --- a/main/App.cpp +++ b/main/App.cpp @@ -29,6 +29,11 @@ CircBuffer * App::getBuffer() return & m_circ_buffer; } +CommandProcessor * App::getCommandProcessor() +{ + return m_commandProcessor; +} + void App::init() { ESP_LOGW(TAG, "Starting the app..."); @@ -36,8 +41,6 @@ void App::init() m_led = new Led(LED_PIN); m_wifi = new Wifi(); -#if 1 - bool needs_provision = true; if(SETTINGS.wifi.num > 0) @@ -80,7 +83,10 @@ void App::init() otaCheck(); - m_led->setPulse(255, 0, 255); + // m_led->setPulse(255, 0, 255); + m_led->setColor(0, 0, 0); + + m_commandProcessor = new CommandProcessor(*this); m_mqtt_service = new MqttService(*this); m_mqtt_service->start(); @@ -88,8 +94,6 @@ void App::init() m_ble_service = new BleService(*this); m_ble_service->start(); -#endif - m_sensor_service = new SensorService(*this); m_sensor_service->start(); } diff --git a/main/App.h b/main/App.h index 37d40c5..e8a71e4 100644 --- a/main/App.h +++ b/main/App.h @@ -12,6 +12,7 @@ #include "BleService.h" #include "Buffers.h" #include "sensors/SensorService.h" +#include "CommandProcessor.h" #include "AppIF.h" class App : AppIF @@ -23,10 +24,12 @@ protected: SensorService * m_sensor_service = nullptr; CircBuffer m_circ_buffer; Led * m_led = nullptr; + CommandProcessor * m_commandProcessor = nullptr; public: Led * getLed() override; CircBuffer * getBuffer() override; + CommandProcessor * getCommandProcessor() override; public: App(); diff --git a/main/AppIF.h b/main/AppIF.h index 10665b9..733a16c 100644 --- a/main/AppIF.h +++ b/main/AppIF.h @@ -3,12 +3,14 @@ class Led; class CircBuffer; +class CommandProcessor; class AppIF { public: virtual Led * getLed() = 0; virtual CircBuffer * getBuffer() = 0; + virtual CommandProcessor * getCommandProcessor() = 0; }; #endif diff --git a/main/BleService.cpp b/main/BleService.cpp index 30668ec..2a5ccaf 100644 --- a/main/BleService.cpp +++ b/main/BleService.cpp @@ -14,7 +14,7 @@ static const char * TAG = "ble"; BleService::BleService(App & app) : m_app(app) { - m_rw = new ReaderWriter(512); + } void BleService::start() @@ -24,7 +24,7 @@ void BleService::start() uint8_t wifi_mac[8]; esp_read_mac(wifi_mac, ESP_MAC_WIFI_STA); - sprintf(m_name, "WP_%u_%02x%02x%02x", SETTINGS.device.id, wifi_mac[3], wifi_mac[4], wifi_mac[5]); + sprintf(m_name, "WP_%02x%02x%02x", wifi_mac[3], wifi_mac[4], wifi_mac[5]); NimBLEDevice::init(m_name); NimBLEDevice::setMTU(512); @@ -64,49 +64,16 @@ void BleService::onDisconnect(NimBLEServer* pServer) void BleService::onRead(NimBLECharacteristic* pCharacteristic) { - int a = 1234; - pCharacteristic->setValue(a); - ESP_LOGI(TAG, "onRead hello"); + // int a = 1234; + // pCharacteristic->setValue(a); + // ESP_LOGI(TAG, "onRead hello"); } void BleService::onWrite(NimBLECharacteristic* pCharacteristic) { - uint32_t len = pCharacteristic->getDataLength(); - memcpy(m_buffer, pCharacteristic->getValue().c_str(), len); - m_buffer[len] = 0; - - ESP_LOGI(TAG, "'%s'", m_buffer); - - Parser p((char *)m_buffer, "|"); - char buffer[80]; - p.getElementAt(0, buffer, sizeof(buffer)); - - ESP_LOGI(TAG, "command '%s'", buffer); - - if(buffer[0] == 'w') - { - ESP_LOGI(TAG, "Scanning wifi networks..."); - - int num_networks = WiFi.scanNetworks(false, false, false, 0); - - m_rw->reset(); - m_rw->appendf("w|%d|", num_networks); - for(int n = 0; n < num_networks; n++) - { - m_rw->append(WiFi.SSID(n).c_str()); - m_rw->append(","); - m_rw->appendf("%d", WiFi.RSSI(n)); - if(n < num_networks-1) - m_rw->append("|"); - } - ESP_LOGI(TAG, "'%s'", m_rw->getBuffer()); - pCharacteristic->setValue((uint8_t*)m_rw->getBuffer(), m_rw->getLen()); - pCharacteristic->notify(); - } - else if(buffer[0] == 'd') - { - SETTINGS.wifi.num = 0; - SETTINGS_SAVE; - esp_restart(); - } + m_app.getCommandProcessor()->take(); + char * buffer = m_app.getCommandProcessor()->process(pCharacteristic->getValue().c_str(), pCharacteristic->getDataLength()); + pCharacteristic->setValue((uint8_t*)buffer, strlen(buffer)); + pCharacteristic->notify(); + m_app.getCommandProcessor()->give(); } diff --git a/main/BleService.h b/main/BleService.h index 0d33c22..4e6e3c5 100644 --- a/main/BleService.h +++ b/main/BleService.h @@ -5,7 +5,6 @@ #include #include -#include "ReaderWriter.h" class App; @@ -15,13 +14,11 @@ protected: App & m_app; char m_name[32]; - char m_buffer[512]; NimBLEServer * m_server = nullptr; NimBLEService * m_service = nullptr; NimBLECharacteristic * m_characteristic = nullptr; NimBLEAdvertising * m_advertising = nullptr; - ReaderWriter *m_rw = nullptr; void onConnect(NimBLEServer* pServer) override; void onDisconnect(NimBLEServer* pServer) override; diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 03e92da..511dffc 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,6 +1,7 @@ idf_component_register(SRCS main.cpp App.cpp Settings.cpp Led.cpp TaskMgr.cpp Wifi.cpp utilities.cpp ProvisionSoftAP.cpp ReaderWriter.cpp Ota.cpp MqttService.cpp BleService.cpp sensors/Bmp280.cpp sensors/Bme68x.cpp sensors/SensorService.cpp sensors/LD2410.cpp Buffers.cpp SensorData.cpp + CommandProcessor.cpp INCLUDE_DIRS "." EMBED_TXTFILES ../html/logo.png ../html/provision.html EMBED_TXTFILES ../certs/eventgrid.azure.pem ../certs/client1-authn-ID.key ../certs/client1-authn-ID.pem ../certs/bigfoot-inc.pem diff --git a/main/CommandProcessor.cpp b/main/CommandProcessor.cpp new file mode 100644 index 0000000..ca090c6 --- /dev/null +++ b/main/CommandProcessor.cpp @@ -0,0 +1,226 @@ +#include + +#include "CommandProcessor.h" +#include "utilities.h" +#include "Settings.h" +#include + +const char * TAG = "CommandProcessor"; + +CommandProcessor::CommandProcessor(AppIF & app) : m_app(app), m_rw(512) +{ + +} + +#define BUF_LEN 128 + +char * getElementAt(int el, Parser & p, char * buffer) +{ + buffer[0] = 0; + p.getElementAt(el, buffer, BUF_LEN); + return buffer; +} + +bool CommandProcessor::cmdSetGroupId(Parser & p, char * buffer) +{ + int value = 0; + + if(strToInt(getElementAt(1, p, buffer), value)) + { + ESP_LOGW(TAG, "new group value: %u", value); + SETTINGS.device.group_id = value; + SETTINGS_SAVE; + strcpy(m_buffer, "Z|ok"); + return true; + } + strcpy(m_buffer, "Z|fail"); + return false; +} + +bool CommandProcessor::cmdSetWorkingId(Parser & p, char * buffer) +{ + int value = 0; + + if(strToInt(getElementAt(1, p, buffer), value)) + { + ESP_LOGW(TAG, "new device working id: %u", value); + SETTINGS.device.tata_id = value; + SETTINGS_SAVE; + strcpy(m_buffer, "-|ok"); + return true; + } + strcpy(m_buffer, "-|fail"); + return false; +} + +bool CommandProcessor::cmdRestart(Parser & p, char * buffer) +{ + esp_restart(); + return true; +} + +bool CommandProcessor::cmdDeleteStoredSsids(Parser & p, char * buffer) +{ + ESP_LOGW(TAG, "delete stored ssid's"); + SETTINGS.wifi.num = 0; + SETTINGS_SAVE; + strcpy(m_buffer, "d|ok"); + return true; +} + +bool CommandProcessor::cmdReturnCurrentSsid(Parser & p, char * buffer) +{ + ESP_LOGW(TAG, "return current ssid %s and rssi %d", WiFi.SSID().c_str(), WiFi.RSSI()); + + m_rw.reset(); + m_rw.appendf("a|%s,%d", WiFi.SSID().c_str(), WiFi.RSSI()); + + ESP_LOGI(TAG, "'%s'", m_rw.getBuffer()); + // "a|gumball,-42" + strcpy(m_buffer, m_rw.getBuffer()); + return true; +} + +bool CommandProcessor::cmdReturnVisibleNetworks(Parser & p, char * buffer) +{ + ESP_LOGI(TAG, "Scanning wifi networks..."); + + int num_networks = WiFi.scanNetworks(false, false, false, 0); + + m_rw.reset(); + m_rw.appendf("w|%d|", num_networks); + for(int n = 0; n < num_networks; n++) + { + m_rw.append(WiFi.SSID(n).c_str()); + m_rw.append(","); + m_rw.appendf("%d", WiFi.RSSI(n)); + if(n < num_networks - 1) + m_rw.append("|"); + } + + ESP_LOGI(TAG, "'%s'", m_rw.getBuffer()); + // "w|4|gumball,-40|miro,-79|903noe,-84|TheGoodPlace-2.4,-93" + strcpy(m_buffer, m_rw.getBuffer()); + return true; +} + +bool CommandProcessor::cmdAddNetwork(Parser & p, char * buffer) +{ + if(p.getElementAt(1, buffer, BUF_LEN)) + { + ESP_LOGI(TAG, "ssid/pwd: '%s'", buffer); + char ssid[36], pwd[36]; + Parser pp(buffer, ","); + if(pp.getElementAt(0, ssid, sizeof(ssid))) + { + ESP_LOGI(TAG, "ssid: %s", ssid); + if(pp.getElementAt(1, pwd, sizeof(pwd))) + { + ESP_LOGI(TAG, "pwd: %s", pwd); + + if(SETTINGS.wifi.num < SETTINGS_NUM_WIFI_ENTRIES - 1) + { + int ix = SETTINGS.wifi.num; + + strcpy(SETTINGS.wifi.entry[ix].ssid, ssid); + strcpy(SETTINGS.wifi.entry[ix].pwd, pwd); + SETTINGS.wifi.num = ix + 1; + SETTINGS_SAVE; + + strcpy(m_buffer, "W|ok"); + return true; + } + } + } + } + strcpy(m_buffer, "W|fail"); + return false; +} + +bool CommandProcessor::cmdReportAllSettings(Parser & p, char * buffer) +{ + int64_t up_time = esp_timer_get_time(); + + m_rw.reset(); + m_rw.appendf("-,%u", SETTINGS.device.tata_id); //wid + m_rw.append("|"); + m_rw.appendf("Z,%u", SETTINGS.device.group_id); //group id + m_rw.append("|"); + m_rw.appendf("0,%s", SETTINGS.mqtt.device_id); //client id mwtt client id(text) + m_rw.append("|"); + m_rw.appendf("2,%u", up_time/1000000); //time since reboot (seconds) + m_rw.append("|"); + + m_rw.append("5,"); + for(int n = 0; n < SETTINGS.wifi.num; n++) + { + m_rw.append(SETTINGS.wifi.entry[n].ssid); + m_rw.append("\t"); + m_rw.append(SETTINGS.wifi.entry[n].pwd); + if(n < SETTINGS.wifi.num - 1) + m_rw.append("\n"); + } + m_rw.append("|"); + + m_rw.appendf("9,%.3f", SETTINGS.sensors.temperature.temp_offset); //temp offset + + strcpy(m_buffer, m_rw.getBuffer()); + return true; +} + +bool CommandProcessor::cmdSetMqttDevId(Parser & p, char * buffer) +{ + if(p.getElementAt(1, buffer, BUF_LEN)) + { + ESP_LOGI(TAG, "new mqtt dev id: '%s'", buffer); + strcpy(SETTINGS.mqtt.device_id, buffer); + SETTINGS_SAVE; + strcpy(m_buffer, "0|ok"); + return true; + } + strcpy(m_buffer, "0|fail"); + return true; +} + +bool CommandProcessor::cmdSetTemperatureOffset(Parser & p, char * buffer) +{ + float value = 0; + + if(strToFloat(getElementAt(1, p, buffer), value)) + { + ESP_LOGW(TAG, "new temp offset: %f", value); + SETTINGS.sensors.temperature.temp_offset = value; + SETTINGS_SAVE; + strcpy(m_buffer, "9|ok"); + return true; + } + strcpy(m_buffer, "9|fail"); + return false; +} + +#define COMMAND_START if(false){} +#define COMMAND(command, function) else if(strcmp(command, getElementAt(0, p, temp)) == 0) function(p, temp) +#define COMMAND_END else strcpy(m_buffer, "error"); + +char * CommandProcessor::process(const char * data, uint32_t len) +{ + ESP_LOGI(TAG, "%s", data); + + Parser p((char *)data, "|"); + char temp[BUF_LEN]; + + COMMAND_START + COMMAND("Z", cmdSetGroupId); + COMMAND("0", cmdSetMqttDevId); + COMMAND("-", cmdSetWorkingId); + COMMAND("s", cmdRestart); + COMMAND("d", cmdDeleteStoredSsids); + COMMAND("a", cmdReturnCurrentSsid); + COMMAND("w", cmdReturnVisibleNetworks); + COMMAND("W", cmdAddNetwork); + COMMAND("r", cmdReportAllSettings); + COMMAND("9", cmdSetTemperatureOffset); + COMMAND_END; + + return m_buffer; +} \ No newline at end of file diff --git a/main/CommandProcessor.h b/main/CommandProcessor.h new file mode 100644 index 0000000..f2e393e --- /dev/null +++ b/main/CommandProcessor.h @@ -0,0 +1,31 @@ +#include +#include +#include "ReaderWriter.h" +#include "AppIF.h" + +class CommandProcessor : public Mutex +{ +protected: + AppIF & m_app; + Mutex m_mutex; + ReaderWriter m_rw; + char m_buffer[512]; + +public: + CommandProcessor(AppIF & app); + +public: + char * process(const char * data, uint32_t len = 0); + +protected: + bool cmdSetGroupId(Parser & p, char * buffer); + bool cmdSetWorkingId(Parser & p, char * buffer); + bool cmdRestart(Parser & p, char * buffer); + bool cmdDeleteStoredSsids(Parser & p, char * buffer); + bool cmdReturnCurrentSsid(Parser & p, char * buffer); + bool cmdReturnVisibleNetworks(Parser & p, char * buffer); + bool cmdAddNetwork(Parser & p, char * buffer); + bool cmdReportAllSettings(Parser & p, char * buffer); + bool cmdSetTemperatureOffset(Parser & p, char * buffer); + bool cmdSetMqttDevId(Parser & p, char * buffer); +}; \ No newline at end of file diff --git a/main/MqttService.cpp b/main/MqttService.cpp index 8865925..8aa7e0b 100644 --- a/main/MqttService.cpp +++ b/main/MqttService.cpp @@ -6,6 +6,8 @@ #include "TaskMgr.h" #include "app_config.h" #include "Buffers.h" +#include "Settings.h" +#include "CommandProcessor.h" static const char * mqtt_broker = "mqtt-dev-server.westus2-1.ts.eventgrid.azure.net"; static const char * topic = "wellnuotopics/topic1"; @@ -16,8 +18,16 @@ static const char * TAG = "mqtts"; void MqttService::callback(char* topic, uint8_t * payload, uint32_t length) { ESP_LOGI(TAG, "Message arrived in topic: %s\n", topic); + m_app_if.getCommandProcessor()->take(); + payload[length] = 0; ESP_LOGW(TAG, "%s", (char*)payload); + char * buffer = m_app_if.getCommandProcessor()->process((char *)payload, strlen((char *)payload)); + // reply to + ESP_LOGI(TAG, "%s", buffer); + m_mqtt_client->publish("/well_hub", buffer, strlen(buffer)); + + m_app_if.getCommandProcessor()->give(); } MqttService::MqttService(AppIF & app_if) : m_app_if(app_if) @@ -31,28 +41,35 @@ void MqttService::task() { while(true) { - // if(m_app_if.getBuffer()->getSemaphore().take(5000)) // wait for the data to become available - if(m_app_if.getBuffer()->waitForDataAvailable(5000)) + if(m_app_if.getBuffer()->waitForDataAvailable(1000)) { uint8_t len = 0; if(m_app_if.getBuffer()->getBlock(buffer, len)) { - ESP_LOGI(TAG, "got data, len %d", len); - while (!m_mqtt_client->connected()) { - ESP_LOGI(TAG, "connecting to mqtt broker..."); - if (m_mqtt_client->connect("Esp32 client", "client1-authn-ID", NULL)) + ESP_LOGI(TAG, "connecting to mqtt broker, dev id '%s'...", SETTINGS.mqtt.device_id); + if (m_mqtt_client->connect("Esp32 client", SETTINGS.mqtt.device_id, NULL)) { ESP_LOGI(TAG, "connected"); - if(m_mqtt_client->subscribe("my_topic")) - { + uint8_t mac[6]; + WiFi.macAddress(mac); + + char top[64]; + + sprintf(top, "/%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + ESP_LOGI(TAG, "Subscribing to %s", top); + if(m_mqtt_client->subscribe(top)) + ESP_LOGI(TAG, "subscribed"); + else + ESP_LOGE(TAG, "subscribe failed"); + + sprintf(top, "/%08x", SETTINGS.device.group_id); + ESP_LOGI(TAG, "Subscribing to %s", top); + if(m_mqtt_client->subscribe(top)) ESP_LOGI(TAG, "subscribed"); - } else - { ESP_LOGE(TAG, "subscribe failed"); - } } else { @@ -69,7 +86,6 @@ void MqttService::task() m_mqtt_client->loop(); ESP_LOGI(TAG, "publishing..."); - // bool val = m_mqtt_client->publish(topic, "Hi I'm ESP32 ^^"); bool val = m_mqtt_client->publish(topic, buffer, len); if(val) @@ -82,8 +98,10 @@ void MqttService::task() } } } - else + if(m_mqtt_client->connected()) + { m_mqtt_client->loop(); + } } } diff --git a/main/Settings.cpp b/main/Settings.cpp index 0a41184..39f7b1f 100644 --- a/main/Settings.cpp +++ b/main/Settings.cpp @@ -90,6 +90,10 @@ void Settings::setDefaults() m_data->wifi.dns_primary = PP_HTONL(LWIP_MAKEU32(8, 8, 8, 8)); m_data->wifi.dns_secondary = PP_HTONL(LWIP_MAKEU32(8, 8, 4, 4)); - m_data->device.id = 101; + m_data->device.tata_id = 100; m_data->device.group_id = 5101; + + m_data->sensors.temperature.temp_offset = 0; + + strcpy(m_data->mqtt.device_id, "client1-authn-ID"); } \ No newline at end of file diff --git a/main/Settings.h b/main/Settings.h index bc966a9..f82199f 100644 --- a/main/Settings.h +++ b/main/Settings.h @@ -106,10 +106,25 @@ struct LED // general device level settings struct DEVICE { - uint32_t id; + uint32_t tata_id; uint32_t group_id; }; +struct MQTT +{ + char device_id[64]; +}; + +struct TEMPERATURE +{ + float temp_offset; +}; + +struct SENSORS +{ + struct TEMPERATURE temperature; +}; + // struct NV_DATA @@ -118,6 +133,8 @@ struct NV_DATA struct LED led; struct WIFI wifi; struct DEVICE device; + struct MQTT mqtt; + struct SENSORS sensors; }; #pragma pack(pop) diff --git a/main/Wifi.cpp b/main/Wifi.cpp index 2cab67f..c9f2ea6 100644 --- a/main/Wifi.cpp +++ b/main/Wifi.cpp @@ -8,6 +8,8 @@ #include "utilities.h" #include "app_config.h" +#include + static const char *TAG = "Wifi"; #define IGNORE_SSID_MINS 20 @@ -79,11 +81,17 @@ Wifi::WIFI_STATUS Wifi::connectTo(int index) IPAddress secondaryDNS(SETTINGS.wifi.dns_secondary); ESP_LOGI(TAG, "Connecting to %s...", SETTINGS.wifi.entry[index].ssid); + + // set hostname + uint8_t mac[6]; + WiFi.macAddress(mac); + char buffer[32]; + sprintf(buffer, "wellhub-tag%02x%02x%02x", mac[3], mac[4], mac[5]); + WiFi.hostname(buffer); WiFi.mode(WIFI_STA); WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS); - WiFi.hostname("wellhub"); - + WiFi.begin(SETTINGS.wifi.entry[index].ssid, SETTINGS.wifi.entry[index].pwd); int status = WiFi.waitForConnectResult(10000); diff --git a/main/sensors/SensorService.cpp b/main/sensors/SensorService.cpp index de491c6..0aa6db3 100644 --- a/main/sensors/SensorService.cpp +++ b/main/sensors/SensorService.cpp @@ -5,6 +5,8 @@ #include "SensorService.h" #include "Buffers.h" #include "SensorData.h" +#include "Settings.h" +#include "Led.h" static const char *TAG = "sensors"; @@ -33,14 +35,28 @@ void SensorService::start() m_bme68x = new Bme68x(Wire); m_ld2410 = new LD2410(); + bool hw_fault = false; + if(!m_bmp280->init()) + { + hw_fault = true; ESP_LOGE(TAG, "bmp280 sensor error"); + } if(!m_bme68x->init()) + { + hw_fault = true; ESP_LOGE(TAG, "bme68x sensor error"); + } if(!m_ld2410->init()) + { + hw_fault = true; ESP_LOGE(TAG, "ld2410 sensor error"); + } + + if(hw_fault) + m_app_if.getLed()->setColor(255, 0, 0); assert(m_i2c1_task = TaskMgr::getInstance().createTask(std::bind(&SensorService::run_i2c_1, this), I2C1_TASK_NAME, I2C1_TASK_STACK_SIZE, I2C1_TASK_PRIORITY, I2C1_TASK_CORE)); @@ -61,11 +77,11 @@ void::SensorService::processPressure(float pressure) uint64_t now = esp_timer_get_time(); - ESP_LOGI(TAG, "delta T: %d", (uint32_t)((now-previous)/1000)); +// ESP_LOGI(TAG, "delta T: %d", (uint32_t)((now-previous)/1000)); filtered = 0.95 * filtered + 0.05 * pressure; previous = now; - ESP_LOGI(TAG, "%0.3f \t%0.3f", pressure, filtered); +// ESP_LOGI(TAG, "%0.3f \t%0.3f", pressure, filtered); } void SensorService::postBme68xData(float pressure, float temp) @@ -76,7 +92,7 @@ void SensorService::postBme68xData(float pressure, float temp) msg->humidity = m_bme_data.humidity; msg->light = m_light_value; msg->pressure = pressure; - msg->temperature = temp; + msg->temperature = temp + SETTINGS.sensors.temperature.temp_offset; int num_total = 0; @@ -164,7 +180,7 @@ void SensorService::run_uart() if(has_read && esp_timer_get_time() - last_read >= ms_to_us(10000-50)) { int64_t now = esp_timer_get_time(); - ESP_LOGI(TAG, "count %d", (int)m_ld2410->stationary_energy[0]); + // ESP_LOGI(TAG, "count %d", (int)m_ld2410->stationary_energy[0]); if(m_ld2410->stationary_energy[0] != 0) { @@ -181,7 +197,7 @@ void SensorService::run_uart() m_app_if.getBuffer()->putBlock((uint8_t*)&msg, sizeof(msg)); - ESP_LOGI(TAG, "delta t: %lld", (now - last_read)/1000); + // ESP_LOGI(TAG, "delta t: %lld", (now - last_read)/1000); last_read = now; #if 0 diff --git a/main/utilities.cpp b/main/utilities.cpp index 7e7b4ae..2d8dc2d 100644 --- a/main/utilities.cpp +++ b/main/utilities.cpp @@ -27,3 +27,45 @@ void dump_bytes(const void *data, uint32_t len) if (hasMore) ESP_LOGI(TAG, "%s", c); } + +bool strToInt(const char *str, int & val, int base) +{ + if(str == nullptr || str[0] == 0) + { + ESP_LOGE(TAG, "input str invalid"); + return false; + } + + char *endptr; + + val = strtol(str, &endptr, base); + + if(endptr == str || *endptr != 0) + { + ESP_LOGE(TAG, "input str invalid (2)"); + return false; + } + + return true; +} + +bool strToFloat(const char *str, float & val) +{ + if(str == nullptr || str[0] == 0) + { + ESP_LOGE(TAG, "input str invalid"); + return false; + } + + char *endptr; + + val = strtof(str, &endptr); + + if(endptr == str || *endptr != 0) + { + ESP_LOGE(TAG, "input str invalid (2)"); + return false; + } + + return true; +} \ No newline at end of file diff --git a/main/utilities.h b/main/utilities.h index a6d45d9..99df02a 100644 --- a/main/utilities.h +++ b/main/utilities.h @@ -6,5 +6,7 @@ #include void dump_bytes(const void *data, uint32_t len); +bool strToInt(const char *str, int & val, int base = 10); +bool strToFloat(const char *str, float & val); #endif /* __UTILITIES_H__ */ \ No newline at end of file diff --git a/utils/mqtt.py b/utils/mqtt.py index b8939c4..89e22d8 100755 --- a/utils/mqtt.py +++ b/utils/mqtt.py @@ -7,6 +7,7 @@ mqtt_broker = "mqtt-dev-server.westus2-1.ts.eventgrid.azure.net" mqtt_port = 8883 mqtt_topic = "wellnuotopics/topic1" mqtt_client_id = "client1-authn-ID" +mqtt_client_id = "292" connected = False @@ -19,7 +20,7 @@ def connect_mqtt(client_id): else: print("Failed to connect, return code %d\n", rc) - client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, "client_id") + client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, "asdasdadaswd") client.tls_set( ca_certs='eventgrid.azure_full.pem', certfile='../certs/client1-authn-ID.pem', @@ -47,10 +48,10 @@ def main() -> None: while(connected == False): time.sleep(1) - publish(client, "wellnuotopics/topic1", "hello") + publish(client, "/000013ed", "s") time.sleep(2) client.disconnect() if __name__ == "__main__": main() - \ No newline at end of file +