From 8e7c9d336dc3c4c8920eb07cc898ee2e70ff891c Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Wed, 12 Oct 2022 10:54:29 +0200 Subject: [PATCH 1/5] move id outside sensor block --- gateway/src/gateway.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 2870728..17a4ed2 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -61,28 +61,28 @@ void readRcSwitch(JsonDocument& jsonDoc) { } if (GET_TYPE(value) == SensorType::GENERIC) { JsonObject sensor = jsonDoc.createNestedObject("sensor"); - sensor["id"] = ID(value); + jsonDoc["id"] = ID(value); sensor["value"] = GET_VALUE(value); sensor["voltage"] = GET_VCC(value); return; } if (GET_TYPE(value) == SensorType::TEMPERATURE) { JsonObject sensor = jsonDoc.createNestedObject("sensor"); - sensor["id"] = ID(value); + jsonDoc["id"] = ID(value); sensor["temperature"] = GET_TEMP(value); sensor["voltage"] = GET_VCC(value); return; } if (GET_TYPE(value) == SensorType::HUMIDITY) { JsonObject sensor = jsonDoc.createNestedObject("sensor"); - sensor["id"] = ID(value); + jsonDoc["id"] = ID(value); sensor["humidity"] = GET_HUMIDITY(value); sensor["voltage"] = GET_VCC(value); return; } if (GET_TYPE(value) == SensorType::CONTACT) { JsonObject sensor = jsonDoc.createNestedObject("contact"); - sensor["id"] = ID(value); + jsonDoc["id"] = ID(value); sensor["state"] = GET_STATE(value) ? "on" : "off"; sensor["voltage"] = GET_VCC(value); return; From 80a8142e3e6450f55b9a9ec37483f32740940873 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Wed, 12 Oct 2022 16:20:40 +0200 Subject: [PATCH 2/5] stop ser2net to avoid conflicts when uploading --- .drone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.drone.yml b/.drone.yml index 23c1d1d..92054d2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -10,9 +10,11 @@ platform: steps: - name: upload commands: + - service ser2net stop - cd gateway - pio run -e pro-mini - echo -n 'reset' > /dev/ttyUSB0; sleep 1s; avrdude -patmega328p -carduino -P/dev/ttyUSB0 -b115200 -D -Uflash:w:.pio/build/pro-mini/firmware.hex:i -v + - service ser2net start when: target: - production From 11dc1ad9e318d01d052ab80ac2bd4b34dcab863c Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Wed, 12 Oct 2022 21:26:52 +0200 Subject: [PATCH 3/5] don't send 0 voltage --- gateway/src/gateway.cpp | 57 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 17a4ed2..6d5d310 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -43,6 +43,36 @@ void loop() { } } +bool buildSensorJson(JsonDocument& jsonDoc, unsigned long value) { + jsonDoc["id"] = ID(value); + + JsonObject sensor = jsonDoc.createNestedObject("sensor"); + + float voltage = GET_VCC(value); + if (voltage != 0) { + sensor["voltage"] = voltage; + } + + switch (GET_TYPE(value)) { + case SensorType::GENERIC: + sensor["value"] = GET_VALUE(value); + break; + case SensorType::TEMPERATURE: + sensor["temperature"] = GET_TEMP(value); + break; + case SensorType::HUMIDITY: + sensor["humidity"] = GET_HUMIDITY(value); + break; + case SensorType::CONTACT: + sensor["state"] = GET_STATE(value) ? "on" : "off"; + break; + default: + return false; + } + + return true; +} + void readRcSwitch(JsonDocument& jsonDoc) { if (mySwitch.available()) { unsigned long value = mySwitch.getReceivedValue(); @@ -59,32 +89,7 @@ void readRcSwitch(JsonDocument& jsonDoc) { motion["basement"] = value == 1879048230L ? "on" : "off"; return; } - if (GET_TYPE(value) == SensorType::GENERIC) { - JsonObject sensor = jsonDoc.createNestedObject("sensor"); - jsonDoc["id"] = ID(value); - sensor["value"] = GET_VALUE(value); - sensor["voltage"] = GET_VCC(value); - return; - } - if (GET_TYPE(value) == SensorType::TEMPERATURE) { - JsonObject sensor = jsonDoc.createNestedObject("sensor"); - jsonDoc["id"] = ID(value); - sensor["temperature"] = GET_TEMP(value); - sensor["voltage"] = GET_VCC(value); - return; - } - if (GET_TYPE(value) == SensorType::HUMIDITY) { - JsonObject sensor = jsonDoc.createNestedObject("sensor"); - jsonDoc["id"] = ID(value); - sensor["humidity"] = GET_HUMIDITY(value); - sensor["voltage"] = GET_VCC(value); - return; - } - if (GET_TYPE(value) == SensorType::CONTACT) { - JsonObject sensor = jsonDoc.createNestedObject("contact"); - jsonDoc["id"] = ID(value); - sensor["state"] = GET_STATE(value) ? "on" : "off"; - sensor["voltage"] = GET_VCC(value); + if (buildSensorJson(jsonDoc, value)) { return; } } From 0143191cb5f634831320bc5f06dbc629bda4a0e1 Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Wed, 12 Oct 2022 12:19:15 +0200 Subject: [PATCH 4/5] convert values of sensors to float --- gateway/src/gateway.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index 6d5d310..b975d36 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -48,7 +48,7 @@ bool buildSensorJson(JsonDocument& jsonDoc, unsigned long value) { JsonObject sensor = jsonDoc.createNestedObject("sensor"); - float voltage = GET_VCC(value); + float voltage = (float)GET_VCC(value)/1000; if (voltage != 0) { sensor["voltage"] = voltage; } @@ -58,10 +58,10 @@ bool buildSensorJson(JsonDocument& jsonDoc, unsigned long value) { sensor["value"] = GET_VALUE(value); break; case SensorType::TEMPERATURE: - sensor["temperature"] = GET_TEMP(value); + sensor["temperature"] = (float)GET_TEMP(value)/10; break; case SensorType::HUMIDITY: - sensor["humidity"] = GET_HUMIDITY(value); + sensor["humidity"] = (float)GET_HUMIDITY(value)/10; break; case SensorType::CONTACT: sensor["state"] = GET_STATE(value) ? "on" : "off"; From c084a8c5be9294372181bb706922d30470fc84bc Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Thu, 13 Oct 2022 12:13:13 +0200 Subject: [PATCH 5/5] use builtin NaN for 0 voltage --- gateway/src/gateway.cpp | 18 +++++++++--------- libraries/Tiny/Tiny.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gateway/src/gateway.cpp b/gateway/src/gateway.cpp index b975d36..935ad09 100644 --- a/gateway/src/gateway.cpp +++ b/gateway/src/gateway.cpp @@ -1,8 +1,10 @@ #include #include #include -#include #include "Tiny.h" + +#define ARDUINOJSON_ENABLE_NAN 1 +#include #include "Dht.h" @@ -48,20 +50,18 @@ bool buildSensorJson(JsonDocument& jsonDoc, unsigned long value) { JsonObject sensor = jsonDoc.createNestedObject("sensor"); - float voltage = (float)GET_VCC(value)/1000; - if (voltage != 0) { - sensor["voltage"] = voltage; - } + unsigned long voltage = GET_VCC(value); + sensor["voltage"] = voltage == 0 ? NAN : (float)voltage / 1000; switch (GET_TYPE(value)) { case SensorType::GENERIC: sensor["value"] = GET_VALUE(value); break; case SensorType::TEMPERATURE: - sensor["temperature"] = (float)GET_TEMP(value)/10; + sensor["temperature"] = (float)GET_TEMP(value) / 10; break; case SensorType::HUMIDITY: - sensor["humidity"] = (float)GET_HUMIDITY(value)/10; + sensor["humidity"] = (float)GET_HUMIDITY(value) / 10; break; case SensorType::CONTACT: sensor["state"] = GET_STATE(value) ? "on" : "off"; @@ -69,7 +69,7 @@ bool buildSensorJson(JsonDocument& jsonDoc, unsigned long value) { default: return false; } - + return true; } @@ -110,7 +110,7 @@ void runJsonCommand(String cmd) { DeserializationError err = deserializeJson(jsonArray, cmd); if (err == DeserializationError::Ok) { JsonArray array = jsonArray.as(); - for(JsonVariant jsonDoc : array) { + for (JsonVariant jsonDoc : array) { if (jsonDoc.containsKey("rcSwitch")) { JsonObject rcSwitch = jsonDoc["rcSwitch"]; unsigned int protocol = rcSwitch["protocol"]; diff --git a/libraries/Tiny/Tiny.h b/libraries/Tiny/Tiny.h index 67dc4c4..bf3ed9d 100644 --- a/libraries/Tiny/Tiny.h +++ b/libraries/Tiny/Tiny.h @@ -13,7 +13,7 @@ #define GET_TEMP(value) (((unsigned long)value >> 18) & 0x2FF) #define GET_HUMIDITY(value) (((unsigned long)value >> 18) & 0x2FF) #define GET_VALUE(value) (((unsigned long)value >> 18) & 0x2FF) -#define GET_VCC(value) ((value >> 5) & 0x1FFF) +#define GET_VCC(value) (((unsigned long)value >> 5) & 0x1FFF) enum SensorType { GENERIC = 4,