Skip to content

Commit

Permalink
Add Eddystone TLM BLE protocol
Browse files Browse the repository at this point in the history
supporting battery, temperature, count and time from start in s
  • Loading branch information
1technophile committed Jun 8, 2021
1 parent db2d271 commit 3f26515
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/prerequisites/devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/)

Expand Down
37 changes: 37 additions & 0 deletions main/ZgatewayBT.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand All @@ -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
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -1521,6 +1546,18 @@ JsonObject& process_scale_v2(JsonObject& BLEdata) {
return BLEdata;
}

JsonObject& process_eddystonetlm(JsonObject& BLEdata) {
const char* servicedata = BLEdata["servicedata"].as<const char*>();

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<const char*>();

Expand Down
1 change: 1 addition & 0 deletions main/config_BT.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ enum ble_sensor_model {
IBSTH2,
IBT4XS,
DT24,
EDDYSTONE_TLM,
};

/*-------------------PIN DEFINITIONS----------------------*/
Expand Down
4 changes: 4 additions & 0 deletions main/config_mqttDiscovery.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}"
Expand Down Expand Up @@ -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

0 comments on commit 3f26515

Please sign in to comment.