diff --git a/docs/prerequisites/devices.md b/docs/prerequisites/devices.md index 11f2b43..51a10fd 100644 --- a/docs/prerequisites/devices.md +++ b/docs/prerequisites/devices.md @@ -30,6 +30,7 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so | INKBIRD (1)|IBS-TH1|temperature/humidity/battery| | ClearGrass |CGG1|temperature/humidity/battery| | Qingping |CGDK2|temperature/humidity| +| Qingping |CGH1|open| | 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 eca7221..139d14b 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -384,6 +384,17 @@ void CLEARGRASSCGDK2Discovery(char* mac, char* sensorModel) { createDiscoveryFromList(mac, CLEARGRASSCGDK2sensor, CLEARGRASSCGDK2parametersCount, "CLEARGRASSCGDK2", "ClearGrass", sensorModel); } +void CLEARGRASSCGH1Discovery(char* mac, char* sensorModel) { +# define CLEARGRASSCGH1parametersCount 1 + Log.trace(F("CLEARGRASSCGH1Discovery" CR)); + char* CLEARGRASSCGH1sensor[CLEARGRASSCGH1parametersCount][8] = { + {"binary_sensor", "CLEARGRASSCGH1-open", mac, "door", jsonOpen, "True", "False", ""}, + //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement + }; + + createDiscoveryFromList(mac, CLEARGRASSCGH1sensor, CLEARGRASSCGH1parametersCount, "CLEARGRASSCGH1", "ClearGrass", sensorModel); +} + void CLEARGRASSTRHKPADiscovery(char* mac, char* sensorModel) { # define CLEARGRASSTRHKPAparametersCount 3 Log.trace(F("CLEARGRASSTRHKPADiscovery" CR)); @@ -999,6 +1010,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 == 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"); if ((p->sensorModel == XMTZC04HM) || @@ -1129,6 +1141,14 @@ JsonObject& process_bledata(JsonObject& BLEdata) { createOrUpdateDevice(mac, device_flags_init, CGDK2); return process_cleargrass(BLEdata, false); } + 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)); + BLEdata.set("model", "CGH1"); + if (device->sensorModel == -1) + createOrUpdateDevice(mac, device_flags_init, CGH1); + return process_cgh1(BLEdata); + } Log.trace(F("Is it a MHO_C401?" CR)); if (strstr(service_data, "588703") != NULL) { Log.trace(F("MHO_C401 add to list for future connect" CR)); @@ -1383,6 +1403,23 @@ JsonObject& process_cleargrass(JsonObject& BLEdata, boolean air) { return BLEdata; } +JsonObject& process_cgh1(JsonObject& BLEdata) { + const char* servicedata = BLEdata["servicedata"].as(); + int value = -1; + if (strncmp(&servicedata[0], "0804", 4) == 0 || strncmp(&servicedata[0], "8804", 4) == 0) { // state + value = value_from_hex_data(servicedata, 33, 1, false); + } else if (strncmp(&servicedata[0], "4804", 4) == 0 || strncmp(&servicedata[0], "c804", 4) == 0) { // action + value = value_from_hex_data(servicedata, 21, 1, false); + } + + if (value == 0) + BLEdata.set("open", true); + if (value == 1) + BLEdata.set("open", false); + + return BLEdata; +} + JsonObject& process_atc(JsonObject& BLEdata) { const char* servicedata = BLEdata["servicedata"].as(); diff --git a/main/config_BT.h b/main/config_BT.h index a645ad8..b16970c 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -74,7 +74,7 @@ bool bleConnect = AttemptBLECOnnect; #define CRLR_Length 4 #define BLE_CNCT_TIMEOUT 3000 -#define ServicedataMinLength 29 +#define ServicedataMinLength 27 unsigned int BLEinterval = TimeBtwRead; //time between 2 scans unsigned int BLEscanBeforeConnect = ScanBeforeConnect; //Number of BLE scans between connection cycles @@ -123,6 +123,7 @@ enum ble_sensor_model { INODE_EM, CGDK2, LYWSD03MMC_PVVX, + CGH1, }; /*-------------------PIN DEFINITIONS----------------------*/ diff --git a/main/config_mqttDiscovery.h b/main/config_mqttDiscovery.h index 65c6225..78d8550 100644 --- a/main/config_mqttDiscovery.h +++ b/main/config_mqttDiscovery.h @@ -75,6 +75,7 @@ extern void createDiscovery(char* sensor_type, # define jsonPa "{{ float(value_json.pa) * 0.01 }}" # define jsonId "{{ value_json.id }}" # define jsonAddress "{{ value_json.address }}" +# define jsonOpen "{{ value_json.open }}" #else // Home assistant autodiscovery value key definition # define jsonBatt "{{ value_json.batt | is_defined }}" # define jsonLux "{{ value_json.lux | is_defined }}" @@ -103,6 +104,7 @@ extern void createDiscovery(char* sensor_type, # define jsonPa "{{ float(value_json.pa) * 0.01 | is_defined }}" # define jsonId "{{ value_json.id | is_defined }}" # define jsonAddress "{{ value_json.address | is_defined }}" +# define jsonOpen "{{ value_json.open | is_defined }}" #endif #endif