Skip to content

Commit 9c12fe3

Browse files
committed
Add support for Mokosmart beacons.
1 parent d2ff32d commit 9c12fe3

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed

docs/prerequisites/devices.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ Added to that it retrieves the measures from the devices below. By default the d
4646
| Thermobeacon|WS02|temperature/humidity/volt|
4747
| ATorch Battery Capacity Monitor (c)|DT24|volt/amp/watt|
4848
| Eddystone TLM|protocol|temperature/count/volt/time|
49+
| Mokosmart (1)|M1|x_axis/y_axis/z_axis/battery|
50+
| Mokosmart (1)|H4|temperature/humidity/volt|
4951

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

main/ZgatewayBT.ino

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,10 +1110,21 @@ JsonObject& process_bledata(JsonObject& BLEdata) {
11101110
BLEdevice* device = getDeviceByMac(mac);
11111111
if (BLEdata.containsKey("servicedata")) {
11121112
Log.trace(F("Checking BLE service data validity" CR));
1113+
const char* service_uuid = (const char*)BLEdata["servicedatauuid"];
11131114
const char* service_data = (const char*)(BLEdata["servicedata"] | "");
11141115
int service_len = strlen(service_data);
11151116
if (valid_service_data(service_data, service_len)) {
11161117
Log.trace(F("Searching BLE device data %s size %d" CR), service_data, strlen(service_data));
1118+
Log.trace(F("Is it a mokoBeacon?" CR));
1119+
if (strcmp(service_uuid, "0xff01") == NULL) {
1120+
createOrUpdateDevice(mac, device_flags_init, MOKOBEACON);
1121+
return process_mokobeacon(BLEdata);
1122+
}
1123+
Log.trace(F("Is it a mokoBeaconX Pro?" CR));
1124+
if (strcmp(service_uuid, "0xfeab") == NULL) {
1125+
createOrUpdateDevice(mac, device_flags_init, MOKOBEACONXPRO);
1126+
return process_mokobeaconXPro(BLEdata);
1127+
}
11171128
Log.trace(F("Is it a mi flora ?" CR));
11181129
if (strstr(service_data, "209800") != NULL) {
11191130
Log.trace(F("mi flora data reading" CR));
@@ -1657,6 +1668,60 @@ JsonObject& process_ws02(JsonObject& BLEdata) {
16571668
return BLEdata;
16581669
}
16591670

1671+
JsonObject& process_mokobeacon(JsonObject& BLEdata) {
1672+
const char* servicedata = BLEdata["servicedata"].as<const char*>();
1673+
1674+
long battery = value_from_hex_data(servicedata, 0, 2, false);
1675+
int x_axis = (int)value_from_hex_data(servicedata, 14, 4, false);
1676+
int y_axis = (int)value_from_hex_data(servicedata, 18, 4, false);
1677+
int z_axis = (int)value_from_hex_data(servicedata, 22, 4, false);
1678+
1679+
BLEdata.set("x_axis", x_axis);
1680+
BLEdata.set("y_axis", y_axis);
1681+
BLEdata.set("z_axis", z_axis);
1682+
BLEdata.set("batt", battery);
1683+
1684+
return BLEdata;
1685+
}
1686+
1687+
JsonObject& process_mokobeaconXPro(JsonObject& BLEdata) {
1688+
const char* servicedata = BLEdata["servicedata"].as<const char*>();
1689+
int length = strlen(servicedata);
1690+
1691+
if (length >= 24) {
1692+
if (strncmp(servicedata, "40", 2) == NULL) {
1693+
double voltage = (double)value_from_hex_data(servicedata, 6, 4, false) / 1000;
1694+
BLEdata.set("volt", (double)voltage);
1695+
1696+
} else if (strncmp(servicedata, "60", 2) == NULL) {
1697+
int x_axis = (int)value_from_hex_data(servicedata, 12, 4, false);
1698+
int y_axis = (int)value_from_hex_data(servicedata, 16, 4, false);
1699+
int z_axis = (int)value_from_hex_data(servicedata, 20, 4, false);
1700+
if (length > 24) {
1701+
double voltage = (double)value_from_hex_data(servicedata, 24, 4, false) / 1000;
1702+
BLEdata.set("volt", (double)voltage);
1703+
}
1704+
1705+
BLEdata.set("x_axis", x_axis);
1706+
BLEdata.set("y_axis", y_axis);
1707+
BLEdata.set("z_axis", z_axis);
1708+
return BLEdata;
1709+
1710+
} else if (strncmp(servicedata, "70", 2) == NULL) {
1711+
double temperature = (double)value_from_hex_data(servicedata, 6, 4, false) / 10;
1712+
double humidity = (double)value_from_hex_data(servicedata, 10, 4, false) / 10;
1713+
double voltage = (double)value_from_hex_data(servicedata, 14, 4, false) / 1000;
1714+
1715+
BLEdata.set("tempc", (double)temperature);
1716+
BLEdata.set("tempf", (double)convertTemp_CtoF(temperature));
1717+
BLEdata.set("hum", (double)humidity);
1718+
BLEdata.set("volt", (double)voltage);
1719+
return BLEdata;
1720+
}
1721+
}
1722+
return BLEdata;
1723+
}
1724+
16601725
void hass_presence(JsonObject& HomePresence) {
16611726
int BLErssi = HomePresence["rssi"];
16621727
Log.trace(F("BLErssi %d" CR), BLErssi);

main/config_BT.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ enum ble_sensor_model {
152152
IBT4XS,
153153
DT24,
154154
EDDYSTONE_TLM,
155+
MOKOBEACON,
156+
MOKOBEACONXPRO,
155157
GENERIC,
156158
};
157159

0 commit comments

Comments
 (0)