Skip to content

Instantly share code, notes, and snippets.

@a1ien
Created February 21, 2020 17:01
Show Gist options
  • Save a1ien/6f346362fdef92c4adbad4ad41798af6 to your computer and use it in GitHub Desktop.
Save a1ien/6f346362fdef92c4adbad4ad41798af6 to your computer and use it in GitHub Desktop.
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