Skip to content

Commit 9fb3d90

Browse files
authored
Add BLE WS02 SensorBlue beacon (#932)
h2zero/NimBLE-Arduino#215
1 parent 1de93d3 commit 9fb3d90

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

docs/prerequisites/devices.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so
3939
| XIAOMI Mi Scale v1 (1)|XMTZC04HM|weight|
4040
| XIAOMI Mi Scale v2 (1)|XMTZC05HM|weight|
4141
| XIAOMI Mi band (1)||steps|
42-
| iNode Energy Meter (1)||power,energy,battery|
42+
| iNode Energy Meter (1)||power/energy/battery|
43+
| Thermobeacon|WS02|temperature/humidity/volt|
4344

4445
Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/)
4546

main/ZgatewayBT.ino

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,19 @@ void INodeEMDiscovery(char* mac, char* sensorModel) {
511511
createDiscoveryFromList(mac, INodeEMsensor, INodeEMparametersCount, "INode-Energy-Meter", "INode", sensorModel);
512512
}
513513

514+
void WS02Discovery(char* mac, char* sensorModel) {
515+
# define WS02parametersCount 3
516+
Log.trace(F("WS02Discovery" CR));
517+
char* WS02sensor[WS02parametersCount][8] = {
518+
{"sensor", "WS02-volt", mac, "", jsonVolt, "", "", "V"},
519+
{"sensor", "WS02-temp", mac, "temperature", jsonTempc, "", "", "°C"},
520+
{"sensor", "WS02-hum", mac, "humidity", jsonHum, "", "", "%"}
521+
//component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement
522+
};
523+
524+
createDiscoveryFromList(mac, WS02sensor, WS02parametersCount, "WS02", "SensorBlue", sensorModel);
525+
}
526+
514527
# else
515528
void MiFloraDiscovery(char* mac, char* sensorModel) {}
516529
void VegTrugDiscovery(char* mac, char* sensorModel) {}
@@ -530,6 +543,7 @@ void InkBirdDiscovery(char* mac, char* sensorModel) {}
530543
void LYWSD03MMCDiscovery(char* mac, char* sensorModel) {}
531544
void MHO_C401Discovery(char* mac, char* sensorModel) {}
532545
void INodeEMDiscovery(char* mac, char* sensorModel) {}
546+
void WS02Discovery(char* mac, char* sensorModel) {}
533547
# endif
534548

535549
# ifdef ESP32
@@ -1027,6 +1041,7 @@ void launchBTDiscovery() {
10271041
if (p->sensorModel == CGPR1) CLEARGRASSCGPR1Discovery((char*)macWOdots.c_str(), "CGPR1");
10281042
if (p->sensorModel == CGH1) CLEARGRASSCGH1Discovery((char*)macWOdots.c_str(), "CGH1");
10291043
if (p->sensorModel == CGD1) CLEARGRASSCGD1Discovery((char*)macWOdots.c_str(), "CGD1");
1044+
if (p->sensorModel == WS02) WS02Discovery((char*)macWOdots.c_str(), "WS02");
10301045
if (p->sensorModel == MIBAND) MiBandDiscovery((char*)macWOdots.c_str(), "MIBAND");
10311046
if ((p->sensorModel == XMTZC04HM) ||
10321047
(p->sensorModel == XMTZC05HM)) MiScaleDiscovery((char*)macWOdots.c_str(), "XMTZC0xHM");
@@ -1262,6 +1277,14 @@ JsonObject& process_bledata(JsonObject& BLEdata) {
12621277
createOrUpdateDevice(mac, device_flags_init, INODE_EM);
12631278
return process_inode_em(BLEdata);
12641279
}
1280+
Log.trace(F("Is it a WS02?" CR));
1281+
if (strlen(manufacturerdata) >= 40 && (strstr(manufacturerdata, "100000001a11") != NULL)) {
1282+
Log.trace(F("WS02 data reading data reading" CR));
1283+
BLEdata.set("model", "WS02");
1284+
if (device->sensorModel == -1)
1285+
createOrUpdateDevice(mac, device_flags_init, WS02);
1286+
return process_ws02(BLEdata);
1287+
}
12651288
# if !pubBLEManufacturerData
12661289
Log.trace(F("Remove manufacturer data" CR));
12671290
BLEdata.remove("manufacturerdata");
@@ -1513,6 +1536,22 @@ JsonObject& process_inode_em(JsonObject& BLEdata) {
15131536
return BLEdata;
15141537
}
15151538

1539+
JsonObject& process_ws02(JsonObject& BLEdata) {
1540+
const char* manufacturerdata = BLEdata["manufacturerdata "].as<const char*>();
1541+
1542+
double temperature = (double)value_from_hex_data(manufacturerdata, 20, 4, true) / 16;
1543+
double humidity = (double)value_from_hex_data(manufacturerdata, 24, 4, true) / 16;
1544+
double voltage = (double)value_from_hex_data(manufacturerdata, 16, 4, true) / 1000;
1545+
1546+
//Set Json values
1547+
BLEdata.set("tempc", (double)temperature);
1548+
BLEdata.set("tempf", (double)convertTemp_CtoF(temperature));
1549+
BLEdata.set("hum", (double)humidity);
1550+
BLEdata.set("volt", (double)voltage);
1551+
1552+
return BLEdata;
1553+
}
1554+
15161555
void hass_presence(JsonObject& HomePresence) {
15171556
int BLErssi = HomePresence["rssi"];
15181557
Log.trace(F("BLErssi %d" CR), BLErssi);

main/config_BT.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ enum ble_sensor_model {
140140
LYWSD03MMC_PVVX,
141141
CGH1,
142142
CGPR1,
143+
WS02,
143144
};
144145

145146
/*-------------------PIN DEFINITIONS----------------------*/

0 commit comments

Comments
 (0)