import re import logging log = logging.getLogger(__name__) TIC_SEP_HIS = b'\x20' msgs = { 'ADCO': { 'len': 12, }, 'OPTARIF': { 'len': 4 }, 'ISOUSC': { 'len': 2, 'unit': 'A' }, 'BASE': { 'len': 9, 'unit': 'Wh' }, 'HCHC': { 'len': 9, 'unit': 'Wh' }, 'HCHP': { 'len': 9, 'unit': 'Wh' }, 'EJPHN': { 'len': 9, 'unit': 'Wh' }, 'EJPHPM': { 'len': 9, 'unit': 'Wh' }, 'BBRHCJB': { 'len': 9, 'unit': 'Wh' }, 'BBRHPJB': { 'len': 9, 'unit': 'Wh' }, 'BBRHCJW': { 'len': 9, 'unit': 'Wh' }, 'BBRHPJW': { 'len': 9, 'unit': 'Wh' }, 'BBRHCJR': { 'len': 9, 'unit': 'Wh' }, 'BBRHPJR': { 'len': 9, 'unit': 'Wh' }, 'PEJP': { 'len': 9, 'unit': 'min' }, 'PTEC': { 'len': 4 }, 'DEMAIN': { 'len': 9 }, 'IINST': { 'len': 3, 'unit': 'A' }, 'IINST1': { 'len': 3, 'unit': 'A' }, 'IINST2': { 'len': 3, 'unit': 'A' }, 'IINST3': { 'len': 3, 'unit': 'A' }, 'ADPS': { 'len': 3, 'unit': 'A' }, 'IMAX': { 'len': 3, 'unit': 'A' }, 'IMAX1': { 'len': 3, 'unit': 'A' }, 'IMAX2': { 'len': 3, 'unit': 'A' }, 'IMAX3': { 'len': 3, 'unit': 'A' }, 'PMAX': { 'len': 5, 'unit': 'W' }, 'PAPP': { 'len': 5, 'unit': 'VA' }, 'HHPHC': { 'len': 1 }, 'MOTDETAT': { 'len': 6 }, 'PPOT': { 'len': 2 }, 'ADIR1': { 'len': 3, 'unit': 'A' }, 'ADIR2': { 'len': 3, 'unit': 'A' }, 'ADIR3': { 'len': 3, 'unit': 'A' }, } class TicHist: def __init__(self): self.sep = TIC_SEP_HIS.decode('ascii') pass def name(self): return "mode historique" def check_sum(self, group): checksum = group[-1] sum = 0 for c in group[:-2]: sum = sum + c sum = (sum & 0x3f) + 0x20 return sum == checksum def decode_group(self, group): group = group[:-2].decode('ascii') fields = group.split(self.sep) msg = {} if len(fields) < 2 or len(fields) > 4: log.warning(f'corrupted group: {group}') return None label = fields[0] value = fields[-1] if not label in msgs: log.warning(f'unknown label: {group}') return None if len(value) != msgs[label]['len']: log.warning(f'bad value length: {group}') return None unit = msgs[label].get('unit') if unit: try: value = int(value) except: log.warning(f'bad numerical value: {group}') return None else: value = re.sub('\s\s+', ' ', value).strip() msg['label'] = label msg['value'] = value if unit: msg['unit'] = unit return msg