From cd55f0dfd5966abff3da442cc698ffea171ce788 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Thu, 25 Mar 2021 19:40:35 -0500 Subject: [PATCH] Add CGPR1 Qingping PIR and luminance sensor (#905) --- docs/prerequisites/devices.md | 1 + main/ZgatewayBT.ino | 41 +++++++++++++++++++++++++++++++++++ main/config_BT.h | 1 + 3 files changed, 43 insertions(+) diff --git a/docs/prerequisites/devices.md b/docs/prerequisites/devices.md index 51a10fd..d6a6308 100644 --- a/docs/prerequisites/devices.md +++ b/docs/prerequisites/devices.md @@ -31,6 +31,7 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so | ClearGrass |CGG1|temperature/humidity/battery| | Qingping |CGDK2|temperature/humidity| | Qingping |CGH1|open| +| Qingping |CGPR1|presence/luminance| | ClearGrass alarm clock|CGD1|temperature/humidity| | ClearGrass with atmospheric pressure |CGP1W|temperature/humidity/air pressure| | Clock |LYWDS02|temperature/humidity| diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index e61b693..bf58d00 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -384,6 +384,18 @@ void CLEARGRASSCGDK2Discovery(char* mac, char* sensorModel) { createDiscoveryFromList(mac, CLEARGRASSCGDK2sensor, CLEARGRASSCGDK2parametersCount, "CLEARGRASSCGDK2", "ClearGrass", sensorModel); } +void CLEARGRASSCGPR1Discovery(char* mac, char* sensorModel) { +# define CLEARGRASSCGPR1parametersCount 2 + Log.trace(F("CLEARGRASSCGPR1Discovery" CR)); + char* CLEARGRASSCGPR1sensor[CLEARGRASSCGPR1parametersCount][8] = { + {"sensor", "CLEARGRASSCGPR1-pres", mac, "", jsonPres, "", "", ""}, + {"sensor", "CLEARGRASSCGPR1-lux", mac, "illuminance", jsonLux, "", "", "lx"} + //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement + }; + + createDiscoveryFromList(mac, CLEARGRASSCGPR1sensor, CLEARGRASSCGPR1parametersCount, "CLEARGRASSCGPR1", "ClearGrass", sensorModel); +} + void CLEARGRASSCGH1Discovery(char* mac, char* sensorModel) { # define CLEARGRASSCGH1parametersCount 1 Log.trace(F("CLEARGRASSCGH1Discovery" CR)); @@ -504,6 +516,8 @@ void FormalDiscovery(char* mac, char* sensorModel) {} void LYWSD02Discovery(char* mac, char* sensorModel) {} void CLEARGRASSTRHDiscovery(char* mac, char* sensorModel) {} void CLEARGRASSCGD1Discovery(char* mac, char* sensorModel) {} +void CLEARGRASSCGDK2Discovery(char* mac, char* sensorModel) {} +void CLEARGRASSCGPR1Discovery(char* mac, char* sensorModel) {} void CLEARGRASSTRHKPADiscovery(char* mac, char* sensorModel) {} void MiScaleDiscovery(char* mac, char* sensorModel) {} void MiLampDiscovery(char* mac, char* sensorModel) {} @@ -1011,6 +1025,7 @@ void launchBTDiscovery() { if (p->sensorModel == CGP1W) CLEARGRASSTRHKPADiscovery((char*)macWOdots.c_str(), "CGP1W"); if (p->sensorModel == MUE4094RT) MiLampDiscovery((char*)macWOdots.c_str(), "MUE4094RT"); if (p->sensorModel == CGDK2) CLEARGRASSCGDK2Discovery((char*)macWOdots.c_str(), "CGDK2"); + if (p->sensorModel == CGPR1) CLEARGRASSCGPR1Discovery((char*)macWOdots.c_str(), "CGPR1"); if (p->sensorModel == CGH1) CLEARGRASSCGH1Discovery((char*)macWOdots.c_str(), "CGH1"); if (p->sensorModel == CGD1) CLEARGRASSCGD1Discovery((char*)macWOdots.c_str(), "CGD1"); if (p->sensorModel == MIBAND) MiBandDiscovery((char*)macWOdots.c_str(), "MIBAND"); @@ -1142,6 +1157,14 @@ JsonObject& process_bledata(JsonObject& BLEdata) { createOrUpdateDevice(mac, device_flags_init, CGDK2); return process_cleargrass(BLEdata, false); } + Log.trace(F("Is it a CGPR1?" CR)); + if (service_len > ServicedataMinLength && strncmp(&service_data[0], "4812", 4) == 0 || strncmp(&service_data[0], "0812", 4) == 0) { + Log.trace(F("CGPR1 data reading" CR)); + BLEdata.set("model", "CGPR1"); + if (device->sensorModel == -1) + createOrUpdateDevice(mac, device_flags_init, CGPR1); + return process_cgpr1(BLEdata); + } Log.trace(F("Is it a CGH1?" CR)); if (service_len > ServicedataMinLength && (strncmp(&service_data[0], "c804", 4) == 0 || strncmp(&service_data[0], "8804", 4) == 0 || strncmp(&service_data[0], "0804", 4) == 0 || strncmp(&service_data[0], "4804", 4) == 0)) { Log.trace(F("CGH1 data reading" CR)); @@ -1404,6 +1427,24 @@ JsonObject& process_cleargrass(JsonObject& BLEdata, boolean air) { return BLEdata; } +JsonObject& process_cgpr1(JsonObject& BLEdata) { + const char* servicedata = BLEdata["servicedata"].as(); + int value = -1; + if (strncmp(&servicedata[0], "0812", 4) == 0) { // lux + value = value_from_hex_data(servicedata, 33, 4, true); + if (value >= 0) + BLEdata.set("lux", value); + } else if (strncmp(&servicedata[0], "4812", 4) == 0) { // presence + value = value_from_hex_data(servicedata, 21, 1, false); + if (value == 0) + BLEdata.set("pres", false); + if (value == 1) + BLEdata.set("pres", true); + } + + return BLEdata; +} + JsonObject& process_cgh1(JsonObject& BLEdata) { const char* servicedata = BLEdata["servicedata"].as(); int value = -1; diff --git a/main/config_BT.h b/main/config_BT.h index a265f5d..0c7df76 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -133,6 +133,7 @@ enum ble_sensor_model { CGDK2, LYWSD03MMC_PVVX, CGH1, + CGPR1, }; /*-------------------PIN DEFINITIONS----------------------*/