def decode_0x56(message, subtype, seqnbr, id1, id2): """ 0x56 Wind sensors """ result = list() try: display_subtype = RFX.rfx_subtype_56[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) direction = ((int(ByteToHex(message[6]), 16) * 256) + \ int(ByteToHex(message[7]), 16)) result.append({ 'key': 'Wind direction', 'value': direction, 'unit': 'degrees' }) av_speed = 'not implemented' if subtype != '05': av_speed = ((int(ByteToHex(message[8]), 16) * 256) + \ int(ByteToHex(message[9]), 16)) * 0.1 result.append({ 'key': 'Wind speed (average)', 'value': av_speed, 'unit': 'm/s' }) gust = ((int(ByteToHex(message[10]), 16) * 256) + \ int(ByteToHex(message[11]), 16)) * 0.1 result.append({'key': 'Wind gust', 'value': gust, 'unit': 'm/s'}) temperature = 'not implemented' windchill = 'not implemented' if subtype == "04": temperature = rfxdecode.decode_temperature(message[12], message[13]) windchill = rfxdecode.decode_temperature(message[14], message[15]) result.append({'key': 'Temperature', 'value': temperature, 'unit': 'C'}) result.append({'key': 'Wind chill', 'value': windchill, 'unit': 'C'}) signal = rfxdecode.decode_signal(message[16]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[16]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('battery', battery), ('signal_level', signal), ('id', sensor_id), ('temperature', temperature), ('wind_average_speed', av_speed), ('wind_gust', gust), ('wind_direction', direction), ('wind_chill', windchill)] return result, output_extra
def decode_0x50(message, subtype, seqnbr, id1, id2): """ 0x50 - Temperature sensors """ result = list() try: display_subtype = RFX.rfx_subtype_50[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) temperature = rfxdecode.decode_temperature(message[6], message[7]) result.append({'key': 'Temperature', 'value': temperature, 'unit': 'C'}) signal = rfxdecode.decode_signal(message[8]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[8]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('battery', battery), ('signal_level', signal), ('temperature', temperature)] return result, output_extra
def decode_0x20(message, subtype, seqnbr, id1, id2): """ 0x20 Security1 Credit: Dimitri Clatot """ result = list() try: display_subtype = RFX.rfx_subtype_20[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 + ByteToHex(message[6]) result.append({'key': 'Id', 'value': sensor_id}) try: status = RFX.rfx_subtype_20_status[ByteToHex(message[7])] except KeyError: status = '0x' + ByteToHex(message[7]) result.append({'key': 'Status', 'value': status}) battery = rfxdecode.decode_battery(message[8]) result.append({'key': 'Battery', 'value': battery}) signal = rfxdecode.decode_signal(message[8]) result.append({'key': 'Signal level', 'value': signal}) output_extra = [('battery', battery), ('signal_level', signal), ('id', sensor_id), ('status', status)] return result, output_extra
def decode_0x12(message, subtype, seqnbr): """ 0x12 Lighting3 """ result = list() try: display_subtype = RFX.rfx_subtype_12[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) system = ByteToHex(message[4]) result.append({'System': 'Command', 'value': system}) if testBit(int(ByteToHex(message[5]), 16), 0) == 1: channel = 1 elif testBit(int(ByteToHex(message[5]), 16), 1) == 2: channel = 2 elif testBit(int(ByteToHex(message[5]), 16), 2) == 4: channel = 3 elif testBit(int(ByteToHex(message[5]), 16), 3) == 8: channel = 4 elif testBit(int(ByteToHex(message[5]), 16), 4) == 16: channel = 5 elif testBit(int(ByteToHex(message[5]), 16), 5) == 32: channel = 6 elif testBit(int(ByteToHex(message[5]), 16), 6) == 64: channel = 7 elif testBit(int(ByteToHex(message[5]), 16), 7) == 128: channel = 8 elif testBit(int(ByteToHex(message[6]), 16), 0) == 1: channel = 9 elif testBit(int(ByteToHex(message[6]), 16), 1) == 2: channel = 10 else: channel = 255 result.append({'key': 'Channel', 'value': channel}) try: command = RFX.rfx_subtype_12_cmnd[ByteToHex(message[7])] except KeyError: command = '0x' + ByteToHex(message[7]) result.append({'key': 'Command', 'value': command}) battery = rfxdecode.decode_battery(message[8]) result.append({'key': 'Battery', 'value': battery}) signal = rfxdecode.decode_signal(message[8]) result.append({'key': 'Signal level', 'value': signal}) output_extra = [('battery', battery), ('signal', signal), ('system', system), ('command', command), ('channel', channel)] return result, output_extra
def decode_0x5b(message, subtype, seqnbr, id1, id2): """ 0x5B Current Sensor """ result = list() try: display_subtype = RFX.rfx_subtype_5B[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) count = int(ByteToHex(message[6]), 16) result.append({'key': 'Counter', 'value': count}) channel1 = (int(ByteToHex(message[7]), 16) * 0x100 + int(ByteToHex(message[8]), 16)) * 0.1 result.append({'key': 'Channel #1', 'value': channel1, 'unit': 'A'}) channel2 = (int(ByteToHex(message[9]), 16) * 0x100 + int(ByteToHex(message[10]), 16)) * 0.1 result.append({'key': 'Channel #2', 'value': channel2, 'unit': 'A'}) channel3 = (int(ByteToHex(message[11]), 16) * 0x100 + int(ByteToHex(message[12]), 16)) * 0.1 result.append({'key': 'Channel #3', 'value': channel3, 'unit': 'A'}) total = float(( int(ByteToHex(message[13]), 16) * 0x10000000000 + \ int(ByteToHex(message[14]), 16) * 0x100000000 + \ int(ByteToHex(message[15]), 16) * 0x1000000 + \ int(ByteToHex(message[16]), 16) * 0x10000 + \ int(ByteToHex(message[17]), 16) * 0x100 + \ int(ByteToHex(message[18]), 16)) / 223.666) result.append({'key': 'Total', 'value': total, 'unit': 'Wh'}) signal = rfxdecode.decode_signal(message[19]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[19]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('counter', count), ('channel1', channel1), ('channel2', channel2), ('channel3', channel3), ('total', total), ('battery', battery), ('signal_level', signal)] return result, output_extra
def decode_0x5a(message, subtype, seqnbr, id1, id2): """ 0x5A Energy sensor Credit: Jean-Michel ROY """ result = list() try: display_subtype = RFX.rfx_subtype_5A[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) count = int(ByteToHex(message[6]), 16) result.append({'key': 'Count', 'value': count}) instant = int(ByteToHex(message[7]), 16) * 0x1000000 + \ int(ByteToHex(message[8]), 16) * 0x10000 + \ int(ByteToHex(message[9]), 16) * 0x100 + \ int(ByteToHex(message[10]), 16) result.append({'key': 'Instant usage', 'value': instant}) usage = int(( int(ByteToHex(message[11]), 16) * 0x10000000000 + \ int(ByteToHex(message[12]), 16) * 0x100000000 + \ int(ByteToHex(message[13]), 16) * 0x1000000 + \ int(ByteToHex(message[14]), 16) * 0x10000 + \ int(ByteToHex(message[15]), 16) * 0x100 + \ int(ByteToHex(message[16]), 16)) / 223.666) result.append({'key': 'Total usage', 'value': usage}) signal = rfxdecode.decode_signal(message[17]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[17]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('instant_usage', instant), ('total_usage', usage), ('battery', battery), ('signal_level', signal)] return result, output_extra
def decode_0x55(message, subtype, seqnbr, id1, id2): """ 0x55 Rain sensors """ result = list() try: display_subtype = RFX.rfx_subtype_55[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) rainrate_high = ByteToHex(message[6]) rainrate_low = ByteToHex(message[7]) rainrate = 'not implemented' if subtype == '01': rainrate = int(rainrate_high, 16) * 0x100 + int(rainrate_low, 16) elif subtype == '02': rainrate = float( int(rainrate_high, 16) * 0x100 + int(rainrate_low, 16)) / 100 result.append({'key': 'Rainrate', 'value': rainrate, 'unit': 'mm/h'}) raintotal = 'not implemented' if subtype != '06': raintotal = float( \ (int(ByteToHex(message[8]), 16) * 0x1000) + \ (int(ByteToHex(message[9]), 16) * 0x100) + \ int(ByteToHex(message[10]), 16)) / 10 result.append({'key': 'Rain', 'value': raintotal, 'unit': 'mm'}) signal = rfxdecode.decode_signal(message[11]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[11]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('rainrate', rainrate), ('raintotal', raintotal), ('battery', battery), ('id', sensor_id), ('signal_level', signal)] return result, output_extra
def decode_0x58(message, subtype, seqnbr, id1, id2): """ 0x58 Date/Time sensor """ result = list() try: display_subtype = RFX.rfx_subtype_58[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) date_yy = int(ByteToHex(message[6]), 16) date_mm = int(ByteToHex(message[7]), 16) date_dd = int(ByteToHex(message[8]), 16) date_string = "20%s-%s-%s" % (str(date_yy).zfill(2), str(date_mm).zfill(2), str(date_dd).zfill(2)) result.append({'key': 'Date (yy-mm-dd)', 'value': date_string}) date_dow = int(ByteToHex(message[9]), 16) result.append({'key': 'Day of week (1-7)', 'value': date_dow}) time_hr = int(ByteToHex(message[10]), 16) time_min = int(ByteToHex(message[11]), 16) time_sec = int(ByteToHex(message[12]), 16) time_string = "%s:%s:%s" % (str(time_hr), str(time_min), str(time_sec)) result.append({'key': 'Time', 'value': time_string}) signal = rfxdecode.decode_signal(message[13]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[13]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('time', time_string), ('date', date_string), ('day_of_week', date_dow), ('battery', battery), ('signal_level', signal)] return result, output_extra
def decode_0x52(message, subtype, seqnbr, id1, id2): """ 0x52 Temperature and humidity sensors """ result = list() try: display_subtype = RFX.rfx_subtype_52[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) temperature = rfxdecode.decode_temperature(message[6], message[7]) result.append({'key': 'Temperature', 'value': temperature, 'unit': 'C'}) humidity = int(ByteToHex(message[8]), 16) result.append({'key': 'Humidity', 'value': humidity, 'unit': '%'}) try: humidity_status = RFX.rfx_subtype_52_humstatus[ByteToHex(message[9])] except KeyError: humidity_status = '0x' + ByteToHex(message[9]) result.append({'key': 'Humidity Status', 'value': humidity_status}) signal = rfxdecode.decode_signal(message[10]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[10]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('humidity_status', humidity_status), ('temperature', temperature), ('humidity', humidity), ('battery', battery), ('signal_level', signal)] return result, output_extra
def decode_0x57(message, subtype, seqnbr, id1, id2): """ 0x57 UV Sensor """ result = list() try: display_subtype = RFX.rfx_subtype_57[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) ultra_violet = int(ByteToHex(message[6]), 16) * 10 result.append({'key': 'Ultra Violet', 'value': ultra_violet}) temperature = 'not implemented' if subtype == '03': temperature = rfxdecode.decode_temperature(message[6], message[8]) result.append({'key': 'Temperature', 'value': temperature, 'unit': 'C'}) signal = rfxdecode.decode_signal(message[9]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[9]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('id', sensor_id), ('ultra_violet', ultra_violet), ('temperature', temperature), ('battery', battery), ('signal_level', signal)] return result, output_extra
def decode_0x54(message, subtype, seqnbr, id1, id2, config_barometric=0): """ 0x54 Temperature, humidity and barometric sensors Credit: Jean-Baptiste Bodart """ result = list() try: display_subtype = RFX.rfx_subtype_54[subtype] except KeyError: display_subtype = '0x' + subtype result.append({'key': 'Subtype', 'value': display_subtype}) result.append({'key': 'Sequence number', 'value': seqnbr}) sensor_id = id1 + id2 result.append({'key': 'Id', 'value': sensor_id}) temperature = rfxdecode.decode_temperature(message[6], message[7]) result.append({'key': 'Temperature', 'value': temperature, 'unit': 'C'}) humidity = int(ByteToHex(message[8]), 16) result.append({'key': 'Humidity', 'value': humidity, 'unit': '%'}) try: humidity_status = RFX.rfx_subtype_54_humstatus[ByteToHex(message[9])] except KeyError: humidity_status = '0x' + ByteToHex(message[9]) result.append({'key': 'Humidity Status', 'value': humidity_status}) barometric_high = ByteToHex(message[10]) barometric_low = ByteToHex(message[11]) barometric_high = clearBit(int(barometric_high, 16), 7) barometric_high = barometric_high << 8 barometric = barometric_high + int(barometric_low, 16) + int(config_barometric) result.append({ 'key': 'Barometric pressure', 'value': humidity_status, 'unit': 'hPa' }) try: forecast = RFX.rfx_subtype_54_forecast[ByteToHex(message[12])] except KeyError: forecast = '0x' + ByteToHex(message[12]) result.append({'key': 'Forecast Status', 'value': forecast}) signal = rfxdecode.decode_signal(message[13]) result.append({'key': 'Signal level', 'value': signal}) battery = rfxdecode.decode_battery(message[13]) result.append({'key': 'Battery', 'value': battery}) output_extra = [('battery', battery), ('signal_level', signal), ('id', sensor_id), ('forecast_status', forecast), ('humidity_status', humidity_status), ('humidity', humidity), ('barometric_pressure', barometric), ('temperature', temperature)] return result, output_extra