From c16c61c5c48a123232e45e993139fcafc3adaccc Mon Sep 17 00:00:00 2001 From: DigiH <17110652+DigiH@users.noreply.github.com> Date: Fri, 20 Mar 2026 16:58:24 +0100 Subject: [PATCH] Remove Airpods Status property Remove Airpods Status property, until a more space saving bit-wise decoding can be confirmed --- docs/devices/AppleAirPods.md | 2 +- src/decoder.h | 2 +- src/devices/APPLEAIRPODS_json.h | 52 ++------------------------------- tests/BLE/test_ble.cpp | 30 +++++++++---------- 4 files changed, 19 insertions(+), 67 deletions(-) diff --git a/docs/devices/AppleAirPods.md b/docs/devices/AppleAirPods.md index 68941dd22..6713405d1 100644 --- a/docs/devices/AppleAirPods.md +++ b/docs/devices/AppleAirPods.md @@ -8,7 +8,7 @@ |Communication|BLE broadcast| |Frequency|2.4Ghz| |Power Source|Rechargeable battery| -|Exchanged Data|model version, color, status, (left, right, case) battery level*, (left, right, case) charging state| +|Exchanged Data|model version, color, (left, right, case) battery level*, (left, right, case) charging state| |Encrypted|No| |Device Tracker|✅| diff --git a/src/decoder.h b/src/decoder.h index 6a2c048b7..3b8955519 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -210,7 +210,7 @@ class TheengsDecoder { const char* dev_name, const char* svc_uuid, const char* mac_id); std::string sanitizeJsonKey(const char* key_in); - size_t m_docMax = 12200; + size_t m_docMax = 11800; size_t m_minSvcDataLen = 4; size_t m_minMfgDataLen = 10; }; diff --git a/src/devices/APPLEAIRPODS_json.h b/src/devices/APPLEAIRPODS_json.h index a17ea186e..d1a668dfa 100644 --- a/src/devices/APPLEAIRPODS_json.h +++ b/src/devices/APPLEAIRPODS_json.h @@ -1,4 +1,4 @@ -const char* _APPLEAIRPODS_json = "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"tag\":\"1218\",\"condition\":[\"manufacturerdata\",\"=\",58,\"index\",0,\"4c00071901\"],\"properties\":{\"version\":{\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",10,4],\"lookup\":[\"0220\",\"AirPods 1st gen.\",\"0f20\",\"AirPods 2nd gen.\",\"0e20\",\"AirPods Pro 1st gen.\",\"1420\",\"AirPods Pro 2 Lightning\",\"2420\",\"AirPods Pro 2 USB-C\",\"0a20\",\"AirPods Max Lightning\",\"0320\",\"Powerbeats³\",\"0520\",\"BeatsX\",\"0620\",\"Beats Solo³\"]},\"color\":{\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",22,2],\"lookup\":[\"00\",\"white\",\"01\",\"black\",\"02\",\"red\",\"03\",\"blue\",\"04\",\"pink\",\"05\",\"gray\",\"06\",\"silver\",\"07\",\"gold\",\"08\",\"rose gold\",\"09\",\"space gray\",\"0a\",\"dark blue\",\"0b\",\"light blue\",\"0c\",\"yellow\",\"11\",\"green\"]},\"status\":{\"condition\":[\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",14,2],\"lookup\":[\"05\",\"both in case\",\"14\",\"both in case\",\"15\",\"both in case\",\"25\",\"both in case\",\"34\",\"both in case\",\"35\",\"both in case\",\"55\",\"both in case\",\"75\",\"both in case\",\"00\",\"L in case - R out of case\",\"11\",\"L in case - R out of case\",\"71\",\"L in case - R out of case\",\"02\",\"L in case - R in ear\",\"13\",\"L in case - R in ear\",\"24\",\"L in case - R in ear\",\"73\",\"L in case - R in ear\",\"20\",\"R in case - L out of case\",\"31\",\"R in case - L out of case\",\"51\",\"R in case - L out of case\",\"04\",\"R in case - L in ear\",\"22\",\"R in case - L in ear\",\"33\",\"R in case - L in ear\",\"53\",\"R in case - L in ear\",\"01\",\"both out of case\",\"21\",\"both out of case\",\"03\",\"R in ear - L out of case\",\"29\",\"R in ear - L out of case\",\"23\",\"L in ear - R out of case\",\"09\",\"L in ear - R out of case\",\"0b\",\"both in ears\",\"2b\",\"both in ears\"]},\"_status\":{\"condition\":[\"manufacturerdata\",10,\"0a20\"],\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",14,2],\"lookup\":[\"25\",\"in case\",\"34\",\"in case\",\"35\",\"in case\",\"75\",\"in case\",\"21\",\"out of case\",\"2b\",\"on ears\"]},\"batt_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",16,1],\"post_proc\":[\"*\",10,\"max\",100]},\"_batt_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",17,1],\"post_proc\":[\"*\",10,\"max\",100]},\"batt_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",17,1],\"post_proc\":[\"*\",10,\"max\",100]},\"_batt_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",16,1],\"post_proc\":[\"*\",10,\"max\",100]},\"batt_case\":{\"condition\":[\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",19,1],\"post_proc\":[\"*\",10,\"max\",100]},\"charging_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,1,false,true]},\"_charging_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,0,false,true]},\"charging_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,0,false,true]},\"_charging_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,1,false,true]},\"charging_case\":{\"condition\":[\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,2,false,true]}}}"; +const char* _APPLEAIRPODS_json = "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"tag\":\"1218\",\"condition\":[\"manufacturerdata\",\"=\",58,\"index\",0,\"4c00071901\"],\"properties\":{\"version\":{\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",10,4],\"lookup\":[\"0220\",\"AirPods 1st gen.\",\"0f20\",\"AirPods 2nd gen.\",\"0e20\",\"AirPods Pro 1st gen.\",\"1420\",\"AirPods Pro 2 Lightning\",\"2420\",\"AirPods Pro 2 USB-C\",\"0a20\",\"AirPods Max Lightning\",\"0320\",\"Powerbeats³\",\"0520\",\"BeatsX\",\"0620\",\"Beats Solo³\"]},\"color\":{\"decoder\":[\"string_from_hex_data\",\"manufacturerdata\",22,2],\"lookup\":[\"00\",\"white\",\"01\",\"black\",\"02\",\"red\",\"03\",\"blue\",\"04\",\"pink\",\"05\",\"gray\",\"06\",\"silver\",\"07\",\"gold\",\"08\",\"rose gold\",\"09\",\"space gray\",\"0a\",\"dark blue\",\"0b\",\"light blue\",\"0c\",\"yellow\",\"11\",\"green\"]},\"batt_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",16,1],\"post_proc\":[\"*\",10,\"max\",100]},\"_batt_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",17,1],\"post_proc\":[\"*\",10,\"max\",100]},\"batt_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",17,1],\"post_proc\":[\"*\",10,\"max\",100]},\"_batt_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",16,1],\"post_proc\":[\"*\",10,\"max\",100]},\"batt_case\":{\"condition\":[\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"value_from_hex_data\",\"manufacturerdata\",19,1],\"post_proc\":[\"*\",10,\"max\",100]},\"charging_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,1,false,true]},\"_charging_r\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,0,false,true]},\"charging_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,1,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,0,false,true]},\"_charging_l\":{\"condition\":[\"manufacturerdata\",14,\"bit\",1,0,\"&\",\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,1,false,true]},\"charging_case\":{\"condition\":[\"manufacturerdata\",10,\"!\",\"0a20\"],\"decoder\":[\"bit_static_value\",\"manufacturerdata\",18,2,false,true]}}}"; /*R""""( { "brand":"Apple/Beats", @@ -36,50 +36,6 @@ const char* _APPLEAIRPODS_json = "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods "0c", "yellow", "11", "green"] }, - "status":{ - "condition":["manufacturerdata", 10, "!", "0a20"], - "decoder":["string_from_hex_data", "manufacturerdata", 14, 2], - "lookup":["05", "both in case", - "14", "both in case", - "15", "both in case", - "25", "both in case", - "34", "both in case", - "35", "both in case", - "55", "both in case", - "75", "both in case", - "00", "L in case - R out of case", - "11", "L in case - R out of case", - "71", "L in case - R out of case", - "02", "L in case - R in ear", - "13", "L in case - R in ear", - "24", "L in case - R in ear", - "73", "L in case - R in ear", - "20", "R in case - L out of case", - "31", "R in case - L out of case", - "51", "R in case - L out of case", - "04", "R in case - L in ear", - "22", "R in case - L in ear", - "33", "R in case - L in ear", - "53", "R in case - L in ear", - "01", "both out of case", - "21", "both out of case", - "03", "R in ear - L out of case", - "29", "R in ear - L out of case", - "23", "L in ear - R out of case", - "09", "L in ear - R out of case", - "0b", "both in ears", - "2b", "both in ears"] - }, - "_status":{ - "condition":["manufacturerdata", 10, "0a20"], - "decoder":["string_from_hex_data", "manufacturerdata", 14, 2], - "lookup":["25", "in case", - "34", "in case", - "35", "in case", - "75", "in case", - "21", "out of case", - "2b", "on ears"] - }, "batt_r":{ "condition":["manufacturerdata", 14, "bit", 1, 1], "decoder":["value_from_hex_data", "manufacturerdata", 16, 1], @@ -128,7 +84,7 @@ const char* _APPLEAIRPODS_json = "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods } })"""";*/ -const char* _APPLEAIRPODS_json_props = "{\"properties\":{\"version\":{\"unit\":\"string\",\"name\":\"model version\"},\"color\":{\"unit\":\"string\",\"name\":\"color\"},\"status\":{\"unit\":\"string\",\"name\":\"status\"},\"batt_r\":{\"unit\":\"%\",\"name\":\"battery\"},\"batt_l\":{\"unit\":\"%\",\"name\":\"battery\"},\"batt_case\":{\"unit\":\"%\",\"name\":\"battery\"},\"charging_r\":{\"unit\":\"status\",\"name\":\"battery_charging\"},\"charging_l\":{\"unit\":\"status\",\"name\":\"battery_charging\"},\"charging_case\":{\"unit\":\"status\",\"name\":\"battery_charging\"}}}"; +const char* _APPLEAIRPODS_json_props = "{\"properties\":{\"version\":{\"unit\":\"string\",\"name\":\"model version\"},\"color\":{\"unit\":\"string\",\"name\":\"color\"},\"batt_r\":{\"unit\":\"%\",\"name\":\"battery\"},\"batt_l\":{\"unit\":\"%\",\"name\":\"battery\"},\"batt_case\":{\"unit\":\"%\",\"name\":\"battery\"},\"charging_r\":{\"unit\":\"status\",\"name\":\"battery_charging\"},\"charging_l\":{\"unit\":\"status\",\"name\":\"battery_charging\"},\"charging_case\":{\"unit\":\"status\",\"name\":\"battery_charging\"}}}"; /*R""""( { "properties":{ @@ -140,10 +96,6 @@ const char* _APPLEAIRPODS_json_props = "{\"properties\":{\"version\":{\"unit\":\ "unit":"string", "name":"color" }, - "status":{ - "unit":"string", - "name":"status" - }, "batt_r":{ "unit":"%", "name":"battery" diff --git a/tests/BLE/test_ble.cpp b/tests/BLE/test_ble.cpp index bf2b444f8..5cfc0af71 100644 --- a/tests/BLE/test_ble.cpp +++ b/tests/BLE/test_ble.cpp @@ -170,21 +170,21 @@ const char* expected_mfg[] = { "{\"brand\":\"Onset\",\"model\":\"Hobo Water Level Sensor\",\"model_id\":\"HOBOMX2001\",\"type\":\"UNIQ\",\"lvl_cm\":-13.5448277,\"lvl_in\":-5.332609331}", "{\"brand\":\"Onset\",\"model\":\"Hobo Water Level Sensor\",\"model_id\":\"HOBOMX2001\",\"type\":\"UNIQ\",\"lvl_cm\":-21.30009234,\"lvl_in\":-8.385863126}", "{\"brand\":\"SwitchBot\",\"model\":\"Outdoor Meter\",\"model_id\":\"W340001X\",\"type\":\"THB\",\"tempc\":25.5,\"tempf\":77.9,\"hum\":50,\"mac\":\"AA:BB:CC:DD:EE:FF\"}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 1st gen.\",\"color\":\"white\",\"status\":\"R in case - L in ear\",\"batt_r\":100,\"batt_l\":50,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 1st gen.\",\"color\":\"white\",\"status\":\"L in case - R in ear\",\"batt_r\":90,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"L in case - R out of case\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":false,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both in case\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"R in case - L out of case\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":true,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both out of case\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"L in case - R out of case\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":70,\"charging_r\":false,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"R in case - L out of case\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both in case\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both in case\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both in case\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":60,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"R in ear - L out of case\",\"batt_r\":90,\"batt_l\":80,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"L in ear - R out of case\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"status\":\"both in ears\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", - "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Max Lightning\",\"color\":\"green\",\"status\":\"on ears\",\"batt_r\":90,\"charging_r\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 1st gen.\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":50,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 1st gen.\",\"color\":\"white\",\"batt_r\":90,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":false,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":30,\"charging_r\":true,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":70,\"charging_r\":false,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":70,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":90,\"batt_l\":90,\"batt_case\":60,\"charging_r\":true,\"charging_l\":true,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":90,\"batt_l\":80,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":100,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Pro 2 Lightning\",\"color\":\"white\",\"batt_r\":100,\"batt_l\":90,\"batt_case\":100,\"charging_r\":false,\"charging_l\":false,\"charging_case\":false}", + "{\"brand\":\"Apple/Beats\",\"model\":\"AirPods (Pro)/Solo|Studio Buds\",\"model_id\":\"APPLEAIRPODS\",\"type\":\"AUDIO\",\"track\":true,\"prmac\":true,\"version\":\"AirPods Max Lightning\",\"color\":\"green\",\"batt_r\":90,\"charging_r\":false}", "{\"brand\":\"Teltonika\",\"model\":\"FMT100\",\"model_id\":\"FMT100\",\"type\":\"TRACK\",\"acts\":true,\"track\":true,\"device\":\"FMT100 2G vehicle tracker\"}", "{\"brand\":\"Govee\",\"model\":\"Smart Thermo-Hygrometer\",\"model_id\":\"H5100/01/02/04/05/08/74/77\",\"type\":\"THB\",\"cidc\":false,\"acts\":true,\"tempc\":23.4,\"tempf\":74.12,\"batt\":100}", "{\"brand\":\"Govee\",\"model\":\"Smart Thermo-Hygrometer\",\"model_id\":\"H5100/01/02/04/05/08/74/77\",\"type\":\"THB\",\"cidc\":false,\"acts\":true,\"tempc\":2.2,\"tempf\":35.96,\"batt\":97}",