diff --git a/igsparser/msd.py b/igsparser/msd.py index cfc426b..c27dfdb 100644 --- a/igsparser/msd.py +++ b/igsparser/msd.py @@ -270,22 +270,22 @@ def fieldAccels(self, idx): 0x36: {'name': 'iBS06i', 'fields': ['fieldDummy', 'fieldDummy', 'fieldUser'], 'events': ['button']}, 0x39: {'name': 'iWS01', 'fields': ['fieldTemp', 'fieldHumidity1D'], 'events': ['button']}, # deprecated, for backward compatibility 0x40: {'name': 'iBS06', 'fields': ['fieldDummy', 'fieldDummy', 'fieldUser'], 'events': []}, - 0x41: {'name': 'iBS08T', 'fields': ['fieldTemp', 'fieldHumidity1D', 'fieldUser'], 'events': ['button']}, - 0x42: {'name': 'iBS09R', 'fields': ['fieldDummy', 'fieldRange', 'fieldUser'], 'events': ['button']}, - 0x43: {'name': 'iBS09PS', 'fields': ['fieldValue', 'fieldCounter', 'fieldUser'], 'events': ['detect']}, - 0x44: {'name': 'iBS09PIR', 'fields': ['fieldDummy', 'fieldDummy', 'fieldUser'], 'events': ['pir']}, - 0x45: {'name': 'iBS09LX', 'fields': ['fieldDummy', 'fieldLux', 'fieldUser'], 'events': ['button']}, - 0x48: {'name': 'iBS08', 'fields': ['fieldTempEnv', 'fieldTemp', 'fieldUser'], 'events': ['detect']}, + 0x48: {'name': 'iBS08', 'fields': ['fieldTempEnv', 'fieldTemp', 'fieldUser'], 'events': ['detect']}, # deprecated, for backward compatibility } - ibs07Features = { + # iBS07 only + ibsBC87Features = { 0x39: {'name': 'iWS01', 'fields': ['fieldTemp', 'fieldHumidity1D'], 'events': ['button']}, # deprecated, for backward compatibility + 0x50: {'name': 'iBS07', 'fields': ['fieldTemp', 'fieldHumidity', 'fieldLux', 'fieldAccel'], 'events': ['button']} + } + + # iBS08/iBS09, support 7 fields at max + ibsBC88Features = { 0x41: {'name': 'iBS08T', 'fields': ['fieldTemp', 'fieldHumidity1D'], 'events': ['button']}, 0x42: {'name': 'iBS09R', 'fields': ['fieldDummy', 'fieldRange'], 'events': ['button']}, 0x43: {'name': 'iBS09PS', 'fields': ['fieldDummy', 'fieldCounter'], 'events': ['detect']}, 0x44: {'name': 'iBS09PIR', 'fields': [], 'events': ['pir']}, - 0x45: {'name': 'iBS09LX', 'fields': ['fieldDummy', 'fieldDummy', 'fieldLux'], 'events': ['button']}, - 0x50: {'name': 'iBS07', 'fields': ['fieldTemp', 'fieldHumidity', 'fieldLux', 'fieldAccel'], 'events': ['button']} + 0x45: {'name': 'iBS08TL', 'fields': ['fieldTemp', 'fieldHumidity1D', 'fieldLux'], 'events': ['button']}, } def ingics_ibs(self, features): @@ -315,9 +315,9 @@ def ingics_ibs(self, features): self.events['boot'] = ((extraFlag & 0x10) != 0) self.events = MsdEvents(self.events) - def ingics_ibsBC87(self): - subtype = struct.unpack('B', bytes(self.raw[19:20]))[0] - extraFlag = struct.unpack('B', bytes(self.raw[21:22]))[0] + def ingics_ibsBC87(self, subtypeIdx, features): + subtype = struct.unpack('B', bytes(self.raw[subtypeIdx:subtypeIdx+1]))[0] + extraFlag = struct.unpack('B', bytes(self.raw[subtypeIdx+2:subtypeIdx+3]))[0] eventFlag = struct.unpack('B', bytes(self.raw[6:7]))[0] self.company = 'Ingics' @@ -326,7 +326,7 @@ def ingics_ibsBC87(self): self.events = {} self.eventFlag = eventFlag - feature = self.ibs07Features.get(subtype) + feature = features.get(subtype) if feature is not None: self.type = feature['name'] idx = 7 @@ -454,5 +454,8 @@ def ingics(self): # iBS05/iBS06 self.ingics_ibs(self.ibsFeatures) elif self.mfg == 0x082C and code == 0xBC87: - # iBS07/iBS08/iBS09 - self.ingics_ibsBC87() + # iBS07 + self.ingics_ibsBC87(19, self.ibsBC87Features) + elif self.mfg == 0x082C and code == 0xBC88: + # iBS08/iBS09 + self.ingics_ibsBC87(21, self.ibsBC88Features) diff --git a/setup.py b/setup.py index 7996283..92be109 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="ingics_message_parser", - version="0.4.1", + version="0.5.0", license="MIT License", packages=find_packages(), zip_safe=False diff --git a/tests/test_ibs08.py b/tests/test_ibs08.py index f134d58..06819d2 100644 --- a/tests/test_ibs08.py +++ b/tests/test_ibs08.py @@ -12,14 +12,14 @@ def handler(data, index): MessageParser.parse(message, handler) def test_ibs08t(): - payload = '02010618FF2C0887BC2C01000B0BA301000000000000000041000000' + payload = '0201061AFF2C0888BC2C01000B0BA3010000000000000000000041000000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS08T' assert msd.battery == 3 assert msd.temperature == 28.27 assert msd.humidity == 41.9 assert msd.events.button == False - payload = '02010618FF2C0887BCE600016E281300000000000000000041000000' + payload = '0201061AFF2C0888BCE600016E2813000000000000000000000041000000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS08T' assert msd.battery == 2.3 @@ -28,20 +28,20 @@ def test_ibs08t(): assert msd.events.button == True def test_ibs09r(): - payload = '02010618FF2C0887BC470100AAAA7400000000000000000042100000' + payload = '0201061AFF2C0888BC470100AAAA74000000000000000000000042100000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS09R' assert msd.battery == 3.27 assert msd.range == 116 def test_ibs09ps(): - payload = '02010618FF2C0887BC470120AAAA0100000000000000000043100000' + payload = '0201061AFF2C0888BC470120AAAA01000000000000000000000043100000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS09PS' assert msd.battery == 3.27 assert msd.counter == 1 assert msd.events.detect == True - payload = '02010618FF2C0887BC470100AAAA0000000000000000000043100000' + payload = '0201061AFF2C0888BC470100AAAA00000000000000000000000043100000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS09PS' assert msd.battery == 3.27 @@ -49,28 +49,40 @@ def test_ibs09ps(): assert msd.events.detect == False def test_ibs09pir(): - payload = '02010618FF2C0887BC470110AAAAFFFF000000000000000044100000' + payload = '0201061AFF2C0888BC470110AAAAFFFF0000000000000000000044100000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS09PIR' assert msd.battery == 3.27 assert msd.events.pir == True - payload = '02010618FF2C0887BCFA0000AAAAFFFF000000000000000044100000' + payload = '0201061AFF2C0888BCFA0000AAAAFFFF0000000000000000000044100000' msd = PayloadParser.parse(payload).manufacturerData assert msd.type == 'iBS09PIR' assert msd.battery == 2.50 assert msd.events.pir == False -def test_ibs09lx(): - payload = '02010618FF2C0887BC470101AAAAFFFF010200000000000045100000' +def test_ibs08tl(): + payload = '0201061AFF2C0888BC4701010B0BA3010102000000000000000045100000' msd = PayloadParser.parse(payload).manufacturerData - assert msd.type == 'iBS09LX' + assert msd.type == 'iBS08TL' assert msd.battery == 3.27 + assert msd.temperature == 28.27 + assert msd.humidity == 41.9 assert msd.lux == 513 assert msd.events.button == True - payload = '02010618FF2C0887BC200100AAAAFFFFB90700000000000045100000' + payload = '0201061AFF2C0888BC2001006E281300B907000000000000000045100000' msd = PayloadParser.parse(payload).manufacturerData - assert msd.type == 'iBS09LX' + assert msd.type == 'iBS08TL' assert msd.battery == 2.88 + assert msd.temperature == 103.5 + assert msd.humidity == 1.9 assert msd.lux == 1977 assert msd.events.button == False + payload = '0201061AFF2C0888BC330100870DF5019982000000000000000045020900' + msd = PayloadParser.parse(payload).manufacturerData + assert msd.type == 'iBS08TL' + assert msd.battery == 3.07 + assert msd.temperature == 34.63 + assert msd.humidity == 50.1 + assert msd.lux == 33433 + assert msd.events.button == False