tic2mqtt/tic_hist.py

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