Add support for Mokosmart beacons. (#1003)

This commit is contained in:
h2zero authored and GitHub committed 2021-06-30 22:16:29 -05:00
1 parent 706262c9bb
commit 76f880dc15
3 files changed
+69

No files matched your search

+2
View File
@@ -46,6 +46,8 @@ Added to that it retrieves the measures from the devices below. By default the d
| Thermobeacon|WS02|temperature/humidity/volt|
| ATorch Battery Capacity Monitor (c)|DT24|volt/amp/watt|
| Eddystone TLM|protocol|temperature/count/volt/time|
| Mokosmart (1)|M1|x_axis/y_axis/z_axis/battery|
| Mokosmart (1)|H4|temperature/humidity/volt|
Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/)
+65
View File
@@ -1117,10 +1117,21 @@ JsonObject& process_bledata(JsonObject& BLEdata) {
BLEdevice* device = getDeviceByMac(mac);
if (BLEdata.containsKey("servicedata")) {
Log.trace(F("Checking BLE service data validity" CR));
const char* service_uuid = (const char*)BLEdata["servicedatauuid"];
const char* service_data = (const char*)(BLEdata["servicedata"] | "");
int service_len = strlen(service_data);
if (valid_service_data(service_data, service_len)) {
Log.trace(F("Searching BLE device data %s size %d" CR), service_data, strlen(service_data));
Log.trace(F("Is it a mokoBeacon?" CR));
if (strcmp(service_uuid, "0xff01") == NULL) {
createOrUpdateDevice(mac, device_flags_init, MOKOBEACON);
return process_mokobeacon(BLEdata);
}
Log.trace(F("Is it a mokoBeaconX Pro?" CR));
if (strcmp(service_uuid, "0xfeab") == NULL) {
createOrUpdateDevice(mac, device_flags_init, MOKOBEACONXPRO);
return process_mokobeaconXPro(BLEdata);
}
Log.trace(F("Is it a mi flora ?" CR));
if (strstr(service_data, "209800") != NULL) {
Log.trace(F("mi flora data reading" CR));
@@ -1664,6 +1675,60 @@ JsonObject& process_ws02(JsonObject& BLEdata) {
return BLEdata;
}
JsonObject& process_mokobeacon(JsonObject& BLEdata) {
const char* servicedata = BLEdata["servicedata"].as<const char*>();
long battery = value_from_hex_data(servicedata, 0, 2, false);
int x_axis = (int)value_from_hex_data(servicedata, 14, 4, false);
int y_axis = (int)value_from_hex_data(servicedata, 18, 4, false);
int z_axis = (int)value_from_hex_data(servicedata, 22, 4, false);
BLEdata.set("x_axis", x_axis);
BLEdata.set("y_axis", y_axis);
BLEdata.set("z_axis", z_axis);
BLEdata.set("batt", battery);
return BLEdata;
}
JsonObject& process_mokobeaconXPro(JsonObject& BLEdata) {
const char* servicedata = BLEdata["servicedata"].as<const char*>();
int length = strlen(servicedata);
if (length >= 24) {
if (strncmp(servicedata, "40", 2) == NULL) {
double voltage = (double)value_from_hex_data(servicedata, 6, 4, false) / 1000;
BLEdata.set("volt", (double)voltage);
} else if (strncmp(servicedata, "60", 2) == NULL) {
int x_axis = (int)value_from_hex_data(servicedata, 12, 4, false);
int y_axis = (int)value_from_hex_data(servicedata, 16, 4, false);
int z_axis = (int)value_from_hex_data(servicedata, 20, 4, false);
if (length > 24) {
double voltage = (double)value_from_hex_data(servicedata, 24, 4, false) / 1000;
BLEdata.set("volt", (double)voltage);
}
BLEdata.set("x_axis", x_axis);
BLEdata.set("y_axis", y_axis);
BLEdata.set("z_axis", z_axis);
return BLEdata;
} else if (strncmp(servicedata, "70", 2) == NULL) {
double temperature = (double)value_from_hex_data(servicedata, 6, 4, false) / 10;
double humidity = (double)value_from_hex_data(servicedata, 10, 4, false) / 10;
double voltage = (double)value_from_hex_data(servicedata, 14, 4, false) / 1000;
BLEdata.set("tempc", (double)temperature);
BLEdata.set("tempf", (double)convertTemp_CtoF(temperature));
BLEdata.set("hum", (double)humidity);
BLEdata.set("volt", (double)voltage);
return BLEdata;
}
}
return BLEdata;
}
void hass_presence(JsonObject& HomePresence) {
int BLErssi = HomePresence["rssi"];
Log.trace(F("BLErssi %d" CR), BLErssi);
+2
View File
@@ -152,6 +152,8 @@ enum ble_sensor_model {
IBT4XS,
DT24,
EDDYSTONE_TLM,
MOKOBEACON,
MOKOBEACONXPRO,
GENERIC,
};