| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #!/usr/bin/python3.7
- import re, serial, logging, datetime
- from influxdb import InfluxDBClient
- # Logging
- logging.basicConfig(level=logging.INFO)
- logger = logging.getLogger(__name__)
- handler = logging.FileHandler('rpi_serial.log')
- handler.setLevel(logging.INFO)
- 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')
- print(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')
- measure['time'] = int(date) - 3600
- measure['fields'] = field_janitor(value_list)
- client.write_points([measure], time_precision="s")
- else:
- logger.warning("received invalid line: {}".format(line))
|