@@ -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+
16601725void hass_presence (JsonObject& HomePresence) {
16611726 int BLErssi = HomePresence[" rssi" ];
16621727 Log.trace (F (" BLErssi %d" CR), BLErssi);
0 commit comments