diff --git a/docs/prerequisites/devices.md b/docs/prerequisites/devices.md index 7fe5d35..7503bb8 100644 --- a/docs/prerequisites/devices.md +++ b/docs/prerequisites/devices.md @@ -44,6 +44,7 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so | iNode Energy Meter (1)||power/energy/battery| | Thermobeacon|WS02|temperature/humidity/volt| | ATorch Battery Capacity Monitor|DT24|volt/amp/watt| +| Eddystone TLM|protocol|temperature/count/volt/time| Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/) diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index e664fab..a22df36 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -565,6 +565,20 @@ void DT24Discovery(const char* mac, const char* sensorModel) { createDiscoveryFromList(mac, DT24sensor, DT24parametersCount, "DT24", "ATorch", sensorModel); } +void EddystoneTLMDiscovery(const char* mac, const char* sensorModel) { +# define EddystoneTLMparametersCount 4 + Log.trace(F("EddystoneTLMDiscovery" CR)); + const char* EddystoneTLMsensor[EddystoneTLMparametersCount][8] = { + {"sensor", "EddystoneTLM-volt", mac, "", jsonVolt, "", "", "V"}, + {"sensor", "EddystoneTLM-temp", mac, "temperature", jsonTempc, "", "", "°C"}, + {"sensor", "EddystoneTLM-count", mac, "", jsonCount, "", "", ""}, + {"sensor", "EddystoneTLM-time", mac, "", jsonTime, "", "", ""} + //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement + }; + + createDiscoveryFromList(mac, EddystoneTLMsensor, EddystoneTLMparametersCount, "EddystoneTLM", "SensorBlue", sensorModel); +} + # else void MiFloraDiscovery(const char* mac, const char* sensorModel) {} void VegTrugDiscovery(const char* mac, const char* sensorModel) {} @@ -588,6 +602,7 @@ void MHO_C401Discovery(const char* mac, const char* sensorModel) {} void INodeEMDiscovery(const char* mac, const char* sensorModel) {} void WS02Discovery(const char* mac, const char* sensorModel) {} void DT24Discovery(const char* mac, const char* sensorModel) {} +void EddystoneTLMDiscovery(const char* mac, const char* sensorModel) {} # endif # ifdef ESP32 @@ -1146,6 +1161,7 @@ void launchBTDiscovery() { if (p->sensorModel == CGH1) CLEARGRASSCGH1Discovery(macWOdots.c_str(), "CGH1"); if (p->sensorModel == CGD1) CLEARGRASSCGD1Discovery(macWOdots.c_str(), "CGD1"); if (p->sensorModel == WS02) WS02Discovery(macWOdots.c_str(), "WS02"); + if (p->sensorModel == EDDYSTONE_TLM) EddystoneTLMDiscovery(macWOdots.c_str(), "EDDYSTONE_TLM"); if (p->sensorModel == MIBAND) MiBandDiscovery(macWOdots.c_str(), "MIBAND"); if ((p->sensorModel == XMTZC04HM) || (p->sensorModel == XMTZC05HM)) MiScaleDiscovery(macWOdots.c_str(), "XMTZC0xHM"); @@ -1349,6 +1365,15 @@ JsonObject& process_bledata(JsonObject& BLEdata) { createOrUpdateDevice(mac, device_flags_init, XMTZC05HM); return process_scale_v2(BLEdata); } + // || strstr(service_datauuid, "0x2080") != NULL + Log.trace(F("Is it an EddystoneTLM?" CR)); + if (strncmp(&service_data[0], "20", 2) == 0 && strstr(service_datauuid, "0xfeaa") != NULL) { + Log.trace(F("Eddystone TLM" CR)); + BLEdata.set("model", "EDDYSTONE_TLM"); + if (device->sensorModel == -1) + createOrUpdateDevice(mac, device_flags_init, EDDYSTONE_TLM); + return process_eddystonetlm(BLEdata); + } } } else { Log.trace(F("Non valid service data, removing it" CR)); @@ -1521,6 +1546,18 @@ JsonObject& process_scale_v2(JsonObject& BLEdata) { return BLEdata; } +JsonObject& process_eddystonetlm(JsonObject& BLEdata) { + const char* servicedata = BLEdata["servicedata"].as(); + + BLEdata.set("volt", (float)value_from_hex_data(servicedata, 4, 4, false) / 1000); + BLEdata.set("tempc", (float)value_from_hex_data(servicedata, 8, 2, false)); + BLEdata.set("tempf", (float)convertTemp_CtoF(value_from_hex_data(servicedata, 8, 2, false))); + BLEdata.set("count", value_from_hex_data(servicedata, 12, 8, false)); + BLEdata.set("time", value_from_hex_data(servicedata, 20, 8, false) / 100); + + return BLEdata; +} + JsonObject& process_inkbird_th1(JsonObject& BLEdata) { const char* manufacturerdata = BLEdata["manufacturerdata"].as(); diff --git a/main/config_BT.h b/main/config_BT.h index 25c44c5..c675768 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -144,6 +144,7 @@ enum ble_sensor_model { IBSTH2, IBT4XS, DT24, + EDDYSTONE_TLM, }; /*-------------------PIN DEFINITIONS----------------------*/ diff --git a/main/config_mqttDiscovery.h b/main/config_mqttDiscovery.h index bc9ee94..e81d250 100644 --- a/main/config_mqttDiscovery.h +++ b/main/config_mqttDiscovery.h @@ -79,6 +79,8 @@ extern void createDiscovery(const char* sensor_type, # define jsonId "{{ value_json.id }}" # define jsonAddress "{{ value_json.address }}" # define jsonOpen "{{ value_json.open }}" +# define jsonTime "{{ value_json.time }}" +# define jsonCount "{{ value_json.count }}" #else // Home assistant autodiscovery value key definition # define jsonBatt "{{ value_json.batt | is_defined }}" # define jsonLux "{{ value_json.lux | is_defined }}" @@ -111,6 +113,8 @@ extern void createDiscovery(const char* sensor_type, # define jsonId "{{ value_json.id | is_defined }}" # define jsonAddress "{{ value_json.address | is_defined }}" # define jsonOpen "{{ value_json.open | is_defined }}" +# define jsonTime "{{ value_json.time | is_defined }}" +# define jsonCount "{{ value_json.count | is_defined }}" #endif #endif