def decode(msg, hex=False): """msg: payload as one of hex string, list, or bytearray""" bytes_ = bytearray(binascii.a2b_hex(msg) if hex else msg) version = bytes_[0] if version != PROTOCOL_VERSION: raise ValueError( "protocol version {} doesn't match v2".format(version)) devid = struct.unpack('>H', bytes_[1:3])[0] bin_flags = bin(struct.unpack('>H', bytes_[3:5])[0]) flags = bin_flags[2:].zfill(struct.calcsize('>H') * 8)[::-1] words = [ struct.unpack('>H', bytes_[i:i + 2])[0] for i in range(5, len(bytes_), 2) ] cur = 0 result = {'Device ID': devid, 'Protocol version': version} for flag, sensor in zip(flags, SENSORS): if flag != '1': continue x = words[cur:cur + sensor["length"]] cur += sensor["length"] for value in sensor['values']: if 'convert' not in value: continue result[value['name']] = { 'value': value['convert'](x), 'unit': value.get('unit', None) } return result
def decode(msg, EUI, hex=False): """msg: payload as one of hex string, list, or bytearray""" bytes_ = bytearray(binascii.a2b_hex(msg) if hex else msg) version = bytes_[0] if version != PROTOCOL_VERSION: raise ValueError( "protocol version {} doesn't match v2".format(version)) devid = struct.unpack(">H", bytes_[1:3])[0] bin_flags = bin(struct.unpack(">H", bytes_[3:5])[0]) flags = bin_flags[2:].zfill(struct.calcsize(">H") * 8)[::-1] words = [ struct.unpack(">H", bytes_[i:i + 2])[0] for i in range(5, len(bytes_), 2) ] cur = 0 result = {"Device ID": devid, "Protocol version": version} SENSORS = get_SENSOR(EUI) for flag, sensor in zip(flags, SENSORS): if flag != "1": continue x = words[cur:cur + sensor["length"]] cur += sensor["length"] for value in sensor["values"]: if "convert" not in value: continue result[value["name"]] = { "value": value["convert"](x), "unit": value.get("unit", None) } return (result)
def decode(msg, hex=False): """ msg: payload as one of hex string, list, or bytearray return: { "Device ID": 4838, "Protocol version": 2, "Dielectric permittivity": { "value": 1.0392113047231324, "unit": null }, "Volumetric water content": { "value": 0.002387260000000002, "unit": "m\u00b3\u22c5m\u207b\u00b3" }, "Soil temperature": { "value": 20.6, "unit": "\u00b0C" }, "Electrical conductivity": { "value": 0, "unit": "\u00b5S\u22c5cm\u207b\u00b9" }, "Battery voltage": { "value": 3.037, "unit": "V" } } """ bytes_ = bytearray(binascii.a2b_hex(msg) if hex else msg) version = bytes_[0] if version != PROTOCOL_VERSION: raise ValueError( "protocol version {} doesn't match v2".format(version)) devid = struct.unpack('>H', bytes_[1:3])[0] bin_flags = bin(struct.unpack('>H', bytes_[3:5])[0]) flags = bin_flags[2:].zfill(struct.calcsize('>H') * 8)[::-1] words = [ struct.unpack('>H', bytes_[i:i + 2])[0] for i in range(5, len(bytes_), 2) ] cur = 0 result = {'Device ID': devid, 'Protocol version': version} for flag, sensor in zip(flags, SENSORS): if flag != '1': continue x = words[cur:cur + sensor["length"]] cur += sensor["length"] for value in sensor['values']: if 'convert' not in value: continue result[value['name']] = { 'value': value['convert'](x), 'unit': value.get('unit', None) } return result