diff --git a/config.py b/config.py new file mode 100644 index 0000000..feba194 --- /dev/null +++ b/config.py @@ -0,0 +1,4 @@ +WIFI_SSID = "" +WIFI_PASS = "" +MQTT_BROKER = "" +MQTT_ID = "HAN01" diff --git a/main.py b/main.py new file mode 100644 index 0000000..1d97643 --- /dev/null +++ b/main.py @@ -0,0 +1,106 @@ +import network +import time +import config +from machine import Pin, UART, Timer +from umqtt.simple import MQTTClient + +prefix = config.MQTT_ID + "/" + +led = machine.Pin("LED", machine.Pin.OUT) +led.value(1) + +wlan = network.WLAN(network.STA_IF) +wlan.active(True) +wlan.connect(config.WIFI_SSID, config.WIFI_PASS) + +timer = Timer() + +while not wlan.isconnected() and wlan.status() >= 0: + print("Waiting to connect:") + time.sleep(1) + +print("Connected!") +led.value(0) + +client = MQTTClient(config.MQTT_ID, config.MQTT_BROKER,user=None, password=None, keepalive=300, ssl=False, ssl_params={}) +client.connect() +client.publish(prefix + 'status', "connected") + +uart = machine.UART(0, 115200,invert=UART.INV_RX) + +def readUntil(uartObject, termination, maxlen=-1, includeTermination=True): + terminatedFlag=False + result = '' + while maxlen < 0 or len(result) < maxlen: + if uartObject.any(): + result += chr(uartObject.read(1)[0]) + for terminal in termination: + if result.endswith(terminal): + terminatedFlag=True + if not includeTermination: + result = result[:-len(terminal)] + break + if(terminatedFlag==True): + return result + time.sleep_us(10) + return result + +def parse_han_protocol(data): + data = data.replace("'b'", "") + data_list = data.split("\\r\\n") + data_dir = {} + + for line in data_list: + try: + if line.startswith("1-0:1.8.0"): + data_dir["kWh"] = str(float(line.split("(")[1].split("*")[0])) + if line.startswith("1-0:1.7.0"): + data_dir["kW"] = str(float(line.split("(")[1].split("*")[0])) + if line.startswith("1-0:21.7.0"): + data_dir["L1_kW"] = str(float(line.split("(")[1].split("*")[0])) + if line.startswith("1-0:41.7.0"): + data_dir["L2_kW"] = str(float(line.split("(")[1].split("*")[0])) + if line.startswith("1-0:61.7.0"): + data_dir["L3_kW"] = str(float(line.split("(")[1].split("*")[0])) + except: + pass + + return data_dir + +data = "" + +while True: + led.value(0) + + if uart.any(): + led.value(1) + try: + rx_data = str(uart.readline()) + except Exception as e: + print(e) + client.publish(prefix + "error", str(e).encode()) + + if "!" in rx_data: + try: + data_dir = parse_han_protocol(data) + for key in data_dir: + client.publish(prefix + key, data_dir[key].encode()) + except Exception as e: + print(e) + client.publish(prefix + "error", str(e).encode()) + + data = "" + + else: + try: + data = data + rx_data + except Exception as e: + print(e) + client.publish(prefix + "error", str(e).encode()) + + + + + + +