#!/usr/bin/python3.7 import re, serial, logging, datetime, time from influxdb import InfluxDBClient # Logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) handler = logging.FileHandler('/home/pi/rpi_serial.log') handler.setLevel(logging.WARNING) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) # InfluxDB client = InfluxDBClient(host="localhost", port=8086) client.switch_database("solar") # Regex Prep regex = r"(\d{2}\.\d{2}\.\d{4})\s*(\d{2}:\d{2}:\d{2})\s*(\d{1,2})\s*(\d+\.\d{1})\s*(\d+\.\d{2})\s*(\d+)\s*(\d+\.\d{1})\s*(\d+\.\d{2})\s*(\d+)\s*(\d+)" pattern = re.compile(regex) # Setup serial_port = '/dev/ttyUSB0' def field_janitor(value_list): fields = {'mode': value_list[0][2], 'generatorspannung': float(value_list[0][3]), 'generatorstrom': float(value_list[0][4]), 'generatorleistung': float(value_list[0][5]), 'netzspannung': float(value_list[0][6]), 'netzstrom': float(value_list[0][7]), 'eingespeiste_leistung': float(value_list[0][8]), 'temperatur': float(value_list[0][9]) } return fields try: ser = serial.Serial(serial_port) logger.info("Connected to Serial Port, start polling") except: logger.error("Couldn't connect to serial port {}".format(serial_port)) raise while True: line = ser.readline().decode('utf-8') logger.info(line) value_list = pattern.findall(line) print(len(value_list)) if value_list and len(value_list[0]) == 10: measure = {} measure['measurement'] = "Tannenstrasse" date = datetime.datetime.strptime(value_list[0][0] + "-" + value_list[0][1], "%d.%m.%Y-%X").strftime('%s') # Winterzeit eine Stunde zurückstellen, Wechselrichter ist immer auf Winterzeit if time.localtime().tm_isdst == 0: date = int(date) - 3600 measure['time'] = int(date) measure['fields'] = field_janitor(value_list) client.write_points([measure], time_precision="s") else: logger.warning("received invalid line: {}".format(line))