93 lines
2.7 KiB
Python
93 lines
2.7 KiB
Python
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
|
|
|