Skip to content

Commit

Permalink
feat: Support new iBS08/09 payload
Browse files Browse the repository at this point in the history
Signed-off-by: Tim Chao <tim.chao@ingics.com>
  • Loading branch information
timscchao committed Dec 26, 2024
1 parent e6a9b3f commit cf85d84
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 28 deletions.
33 changes: 18 additions & 15 deletions igsparser/msd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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'
Expand All @@ -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
Expand Down Expand Up @@ -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)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
36 changes: 24 additions & 12 deletions tests/test_ibs08.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -28,49 +28,61 @@ 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
assert msd.counter == 0
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

0 comments on commit cf85d84

Please sign in to comment.