From 1c4e50d790646c48473d880265bcb75ac6253686 Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Sun, 11 Mar 2018 21:30:10 +0100 Subject: [PATCH] Initial commit --- .gitignore | 3 +++ config.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mockup.py | 31 +++++++++++++++++++++++++++++++ update.py | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 .gitignore create mode 100644 config.py create mode 100644 mockup.py create mode 100644 update.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b1c2c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +__pycache__ +virtenv diff --git a/config.py b/config.py new file mode 100644 index 0000000..acd539f --- /dev/null +++ b/config.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +import serial # for parity constants + +SERIAL = '/dev/ttyUSB0' +BAUD_RATE = 4800 +STOP_BITS = 1 +PARITY = None + +DATA_INTERVAL = 60 +ARCHIVE_INTERVAL = 60 * 60 # 1h +KEEP_INTERVAL = 365 * 24 * 60 * 60 # 1 year + +# Manual claims poly should be 0x8404, internet says xmodem +CRC_TYPE = 'xmodem' + +STORED_VALUES = [ + 'U_bat', + 'U_mod1', + 'U_mod2', + 'I_pv_in', + 'I_load_total', + 'load_switch', + 'max_charge_bat_day', + 'max_charge_load_day' +] + + +FORMAT = ['Version', + 'Date', + 'Time', + 'U_bat', + 'U_mod1', + 'U_mod2', + 'SOC', + 'SOH', + 'I_bat_total', + 'I_pv_max1', + 'I_pv_max2', + 'I_pv_in', + 'I_charge_total', + 'I_load_device', + 'I_load_total', + 'T_bat', + 'error', + 'charge_mode', + 'load_switch', + 'relais_aux1', + 'relais_aux2', + 'max_charge_bat_day', + 'max_charge_bat_ever', + 'max_charge_load_day', + 'max_charge_load_ever', + 'derating'] diff --git a/mockup.py b/mockup.py new file mode 100644 index 0000000..7412331 --- /dev/null +++ b/mockup.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +import crcmod +from random import randint + +from config import * + +from update import parse_line + +calc_crc = crcmod.predefined.mkCrcFun(CRC_TYPE) + +def gen_line(): + values = [str(randint(0,1000)) for _ in range(0,len(FORMAT))] + payload = ";".join(values) + ";" + crc = calc_crc(payload.encode('ascii')) + crc_str = chr((crc & 0xFF00) >> 8) + chr(crc & 0xFF) + + return payload + crc_str + "\r\n" + + + +def main(): + line = gen_line() + result = parse_line(line) + + print(result) + + + + +if __name__ == '__main__': + main() diff --git a/update.py b/update.py new file mode 100644 index 0000000..33db62e --- /dev/null +++ b/update.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +import serial +import crcmod + +from config import * + +calc_crc = crcmod.predefined.mkCrcFun(CRC_TYPE) + +def parse_line(line): + if line[-2:] != "\r\n": + return {key : None for key in FORMAT} + line = line[:-2] + + crc_str = line[-2:] + payload = line[0:-2] + crc = (ord(crc_str[0]) << 8) | ord(crc_str[1]) + if crc != calc_crc(payload.encode('ascii')): + return {key : None for key in FORMAT} + + parts = payload.split(';') + parts = [p.strip() for p in parts] + parts = [x if x != '#' else None for x in parts] + data = zip(FORMAT, parts) + + return dict(data) + + +def main(): + pass + + +if __name__ == '__main__': + main()