Created
February 21, 2020 17:01
-
-
Save a1ien/6f346362fdef92c4adbad4ad41798af6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import logging | |
import struct | |
import aioblescan as aiobs | |
TH_STRUCT = struct.Struct("<hH") | |
H_STRUCT = struct.Struct("<H") | |
T_STRUCT = struct.Struct("<h") | |
CND_STRUCT = struct.Struct("<H") | |
ILL_STRUCT = struct.Struct("<I") | |
_LOGGER = logging.getLogger(__name__) | |
XIAOMI_TYPE_DICT = { | |
b'\x20\x98\x00': ["HHCCJCY01", 1], | |
b'\x20\xAA\x01': ["LYWSDCGQ", 0], | |
b'\x20\x5B\x04': ["LYWSD02", 1], | |
b'\x30\x47\x03': ["CGG1", 0], | |
b'\x20\x5D\x01': ["HHCCPOT002", 1] | |
} | |
data_dump = [ | |
# "043E300D01130000097737342D580100FF00B000000000000000000016020106121695FE5020AA01FA097737342D580A100163", | |
# "043E330D01130000097737342D580100FF00AE00000000000000000019020106151695FE5020AA01FB097737342D580D1004EA007A01", | |
# "043E330D01130000097737342D580100FF00B000000000000000000019020106151695FE5020AA0103097737342D580D1004EB007601", | |
# "043E310D01130000097737342D580100FF00B600000000000000000017020106131695FE5020AA0104097737342D580610027501", | |
# "043E330D01130000097737342D580100FF00B100000000000000000019020106151695FE5020AA0105097737342D580D1004EA007501", | |
# "043E330D01130000097737342D580100FF00B600000000000000000019020106151695FE5020AA0106097737342D580D1004EB007501", | |
# "043E330D01130000097737342D580100FF00AE00000000000000000019020106151695FE5020AA0107097737342D580D1004EA007901", | |
# "043E330D01130000097737342D580100FF00B100000000000000000019020106151695FE5020AA0108097737342D580D1004EA007901", | |
# "043E300D01130000097737342D580100FF00B300000000000000000016020106121695FE5020AA0109097737342D580A100163", | |
# "043E310D01130000097737342D580100FF00AF00000000000000000017020106131695FE5020AA010A097737342D58041002EA00", | |
# "043E330D01130000097737342D580100FF00B300000000000000000019020106151695FE5020AA010C097737342D580D1004EB007C01", | |
# "043E330D01130000097737342D580100FF00B100000000000000000019020106151695FE5020AA010D097737342D580D1004EA007E01", | |
# "043E310D01130000097737342D580100FF00AE00000000000000000017020106131695FE5020AA010F097737342D580610027B01", | |
# "043E330D01130000097737342D580100FF00B600000000000000000019020106151695FE5020AA0117097737342D580D1004EC007C01", | |
# "043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044F78B8727D5B3F090610024A01E1", | |
# "043E2502010000E98036342D5819020106151695FE5020AA01A3E98036342D580D1004FA00FA00BB", | |
# "043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FB78B8727D5B3F090610024A01D5", | |
# "043E2302010000E98036342D5817020106131695FE5020AA01A4E98036342D58061002F900B9", | |
# "043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FD78B8727D5B3F090610024A01E1", | |
# "043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FE78B8727D5B3F090410020A01DE", | |
"043E2502010000E98036342D5819020106151695FE5020AA01A3E98036342D580D1004FA00FA00BB", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FB78B8727D5B3F090610024A01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01A4E98036342D58061002F900B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FD78B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FE78B8727D5B3F090410020A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B04FF78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040078B8727D5B3F090410020A01DE", | |
"043E2502010000E98036342D5819020106151695FE5020AA01A6E98036342D580D1004FA00FA00BB", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040178B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040278B8727D5B3F090410020B01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040378B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040478B8727D5B3F090410020B01D7", | |
"043E2502010000E98036342D5819020106151695FE5020AA01A8E98036342D580D1004FA00FB00C6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040578B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040678B8727D5B3F090410020B01D7", | |
"043E2202010000E98036342D5816020106121695FE5020AA01A9E98036342D580A100164B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040778B8727D5B3F090610024A01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01AAE98036342D58041002FB00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040978B8727D5B3F090610024A01D6", | |
"043E2502010000E98036342D5819020106151695FE5020AA01ABE98036342D580D1004FA00FC00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040B78B8727D5B3F090610024A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040D78B8727D5B3F090610024A01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01ADE98036342D580D1004FB00FB00C3", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B040F78B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041078B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01AEE98036342D580D1004FA00FB00B8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041278B8727D5B3F090410020B01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041278B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01AFE98036342D58061002FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041378B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041478B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B0E98036342D580D1004FB00FB00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041578B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041578B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041678B8727D5B3F090410020B01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041878B8727D5B3F090410020B01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041878B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B2E98036342D580D1004FC00FD00B7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041978B8727D5B3F090610024A01D7", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B3E98036342D580D1004FA00FB00C6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041B78B8727D5B3F090610024A01E1", | |
"043E2302010000E98036342D5817020106131695FE5020AA01B4E98036342D58041002FB00B6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041D78B8727D5B3F090610024A01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B5E98036342D580D1004FB00FB00C9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B041F78B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042078B8727D5B3F090410020B01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B6E98036342D580D1004FB00FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042178B8727D5B3F090610024A01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042278B8727D5B3F090410020B01D7", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B7E98036342D580D1004FB00FB00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042378B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042478B8727D5B3F090410020B01D7", | |
"043E2202010000E98036342D5816020106121695FE5020AA01B8E98036342D580A100164B5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042578B8727D5B3F090610024A01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01B9E98036342D580D1004FA00FB00C8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042778B8727D5B3F090610024A01DE", | |
"043E2302010000E98036342D5817020106131695FE5020AA01BAE98036342D58061002FC00C9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042978B8727D5B3F090610024A01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01BBE98036342D580D1004FA00FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042B78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042D78B8727D5B3F090610024A01D6", | |
"043E2502010000E98036342D5819020106151695FE5020AA01BDE98036342D580D1004FB00FC00B6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B042F78B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043078B8727D5B3F090410020A01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01BEE98036342D580D1004F900FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043178B8727D5B3F090610024A01E1", | |
"043E2302010000E98036342D5817020106131695FE5020AA01BFE98036342D58041002FA00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043378B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043478B8727D5B3F090410020B01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C0E98036342D580D1004FA00FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043578B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043678B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C1E98036342D580D1004FA00FB00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043878B8727D5B3F090410020B01E4", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C2E98036342D580D1004FB00FC00C5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043978B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043A78B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C3E98036342D580D1004FA00FB00B6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043B78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043C78B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01C4E98036342D58061002FA00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043D78B8727D5B3F090610024A01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C5E98036342D580D1004FB00FB00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B043F78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044078B8727D5B3F090410020B01D7", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C6E98036342D580D1004FB00FB00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044178B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044278B8727D5B3F090410020B01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044378B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044478B8727D5B3F090410020B01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044578B8727D5B3F090610024A01D6", | |
"043E2502010000E98036342D5819020106151695FE5020AA01C9E98036342D580D1004FA00FB00CA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044778B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044878B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01CAE98036342D58041002FA00C9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044978B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044A78B8727D5B3F090410020B01D3", | |
"043E2502010000E98036342D5819020106151695FE5020AA01CBE98036342D580D1004FA00FA00B8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044B78B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044C78B8727D5B3F090410020B01D3", | |
"043E2502010000E98036342D5819020106151695FE5020AA01CCE98036342D580D1004FA00FC00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044D78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B044F78B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045078B8727D5B3F090410020A01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045178B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045278B8727D5B3F090410020A01D6", | |
"043E2302010000E98036342D5817020106131695FE5020AA01CFE98036342D58061002FB00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045378B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045478B8727D5B3F090410020A01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01D0E98036342D580D1004FC00F900B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045578B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045678B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01D1E98036342D580D1004FB00FB00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045878B8727D5B3F090410020B01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045978B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045A78B8727D5B3F090410020B01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045D78B8727D5B3F090610024A01D7", | |
"043E2502010000E98036342D5819020106151695FE5020AA01D5E98036342D580D1004FB00FA00BA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B045F78B8727D5B3F090610024A01E1", | |
"043E2202010000E98036342D5816020106121695FE5020AA01D6E98036342D580A100164C8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046178B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046278B8727D5B3F090410020B01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046378B8727D5B3F090610024A01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01D8E98036342D580D1004FA00FB00B1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046578B8727D5B3F090610024A01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01D9E98036342D580D1004FB00FC00C3", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046778B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046878B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01DAE98036342D58061002FA00C8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046978B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046978B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046A78B8727D5B3F090410020B01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01DBE98036342D580D1004FB00FB00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046B78B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046C78B8727D5B3F090410020B01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046D78B8727D5B3F090610024A01D6", | |
"043E2502010000E98036342D5819020106151695FE5020AA01DDE98036342D580D1004FB00FB00C1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046F78B8727D5B3F090610024A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B046F78B8727D5B3F090610024A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047078B8727D5B3F090410020B01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047178B8727D5B3F090610024A01D7", | |
"043E2302010000E98036342D5817020106131695FE5020AA01DFE98036342D58041002FB00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047478B8727D5B3F090410020B01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01E0E98036342D580D1004FA00FA00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047578B8727D5B3F090610024A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047678B8727D5B3F090410020B01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047778B8727D5B3F090610024A01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047878B8727D5B3F090410020B01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047978B8727D5B3F090610024A01EE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047A78B8727D5B3F090410020B01D5", | |
"043E2502010000E98036342D5819020106151695FE5020AA01E3E98036342D580D1004FA00FC00B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047B78B8727D5B3F090610024A01D7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047C78B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01E4E98036342D58061002FB00C7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047D78B8727D5B3F090610024A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047E78B8727D5B3F090410020B01D5", | |
"043E2202010000E98036342D5816020106121695FE5020AA01E5E98036342D580A100164B9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B047F78B8727D5B3F090610024A01E4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048178B8727D5B3F090610024A01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048278B8727D5B3F090410020A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048378B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048578B8727D5B3F090610024A01DA", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048678B8727D5B3F090410020B01D3", | |
"043E2502010000E98036342D5819020106151695FE5020AA01E9E98036342D580D1004FB00FB00B7", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048778B8727D5B3F090610024A01D4", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048878B8727D5B3F090410020B01D3", | |
"043E2302010000E98036342D5817020106131695FE5020AA01EAE98036342D58041002FB00C8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048978B8727D5B3F090610024A01D6", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048A78B8727D5B3F090410020B01E1", | |
"043E2502010000E98036342D5819020106151695FE5020AA01EBE98036342D580D1004FA00FB00C9", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048C78B8727D5B3F090410020A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048D78B8727D5B3F090610024A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048E78B8727D5B3F090410020A01E1", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B048F78B8727D5B3F090610024A01DE", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B049078B8727D5B3F090410020A01D5", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B049078B8727D5B3F090410020A01D4", | |
"043E2502010000E98036342D5819020106151695FE5020AA01EEE98036342D580D1004FB00FB00C8", | |
"043E280201000078B8727D5B3F1C02010603021A18141695FE70205B049278B8727D5B3F090410020B01D5", | |
"043E2302010000E98036342D5817020106131695FE5020AA01EFE98036342D58061002FC00C9", | |
] | |
def parse_xiomi_value(hexvalue, typecode): | |
"""Convert value depending on its type.""" | |
vlength = len(hexvalue) | |
if vlength == 4: | |
if typecode == 0x0D: | |
(temp, humi) = TH_STRUCT.unpack(hexvalue) | |
return {"temperature": temp / 10, "humidity": humi / 10} | |
if vlength == 2: | |
if typecode == 0x06: | |
(humi,) = H_STRUCT.unpack(hexvalue) | |
return {"humidity": humi / 10} | |
if typecode == 0x04: | |
(temp,) = T_STRUCT.unpack(hexvalue) | |
return {"temperature": temp / 10} | |
if typecode == 0x09: | |
(cond,) = CND_STRUCT.unpack(hexvalue) | |
return {"conductivity": cond} | |
if vlength == 1: | |
if typecode == 0x0A: | |
return {"battery": hexvalue[0]} | |
if typecode == 0x08: | |
return {"moisture": hexvalue[0]} | |
if vlength == 3: | |
if typecode == 0x07: | |
(illum,) = ILL_STRUCT.unpack(hexvalue + b'\x00') | |
return {"illuminance": illum} | |
return {} | |
def parse_raw_message(data): | |
"""Parse the raw data.""" | |
if data is None: | |
return None | |
# check for Xiaomi service data | |
xiaomi_index = data.find(b'\x16\x95\xFE', 15) | |
if xiaomi_index == -1: | |
return None | |
# check for no BR/EDR + LE General discoverable mode flags | |
adv_index = data.find(b"\x02\x01\x06", 14, 17) | |
if adv_index == -1: | |
return None | |
# check for BTLE msg size | |
msg_length = data[2] + 3 | |
if msg_length != len(data): | |
return None | |
# check for MAC presence in message and in service data | |
xiaomi_mac_reversed = data[xiaomi_index + 8:xiaomi_index + 14] | |
source_mac_reversed = data[adv_index - 7:adv_index - 1] | |
if xiaomi_mac_reversed != source_mac_reversed: | |
return None | |
# check if RSSI is valid | |
(rssi,) = struct.unpack("<b", data[msg_length - 1:msg_length]) | |
if not 0 >= rssi >= -127: | |
return None | |
try: | |
sensor_type, toffset = XIAOMI_TYPE_DICT[ | |
data[xiaomi_index + 4:xiaomi_index + 7] | |
] | |
except KeyError: | |
_LOGGER.debug( | |
"Unknown sensor type: %s", ''.join('{:02x}'.format(x) for x in data[xiaomi_index + 4:xiaomi_index + 7]), | |
) | |
return None | |
# xiaomi data length = message length | |
# -all bytes before XiaomiUUID | |
# -3 bytes Xiaomi UUID + ADtype | |
# -1 byte rssi | |
# -3+1 bytes sensor type | |
# -1 byte packet_id | |
# -6 bytes MAC | |
# - sensortype offset | |
xdata_length = msg_length - xiaomi_index - 15 - toffset | |
if xdata_length < 3: | |
return None | |
xdata_point = xiaomi_index + (14 + toffset) | |
xnext_point = xdata_point + 3 | |
# check if xiaomi data start and length is valid | |
if xdata_length != len(data[xdata_point:-1]): | |
return None | |
packet_id = data[xiaomi_index + 7] | |
result = { | |
"rssi": rssi, | |
"mac": ''.join('{:02x}'.format(x) for x in xiaomi_mac_reversed[::-1]), | |
"type": sensor_type, | |
"packet": packet_id, | |
} | |
# loop through xiaomi payload | |
# assume that the data may have several values of different types, | |
# although I did not notice this behavior with my LYWSDCGQ sensors | |
while True: | |
xvalue_typecode = data[xdata_point] | |
try: | |
xvalue_length = data[xdata_point + 2] | |
except ValueError as error: | |
_LOGGER.error("xvalue_length conv. error: %s", error) | |
result = {} | |
break | |
xnext_point = xdata_point + 3 + xvalue_length | |
xvalue = data[xdata_point + 3:xnext_point] | |
res = parse_xiomi_value(xvalue, xvalue_typecode) | |
if res: | |
result.update(res) | |
if xnext_point > msg_length - 3: | |
break | |
xdata_point = xnext_point | |
return result | |
if __name__ == '__main__': | |
logging.basicConfig(level=10) | |
for data in data_dump: | |
_LOGGER.debug(parse_raw_message(bytes.fromhex(data))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment