rpi_serial.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/python3.7
  2. import re, serial, logging, datetime, time
  3. from influxdb import InfluxDBClient
  4. # Logging
  5. logging.basicConfig(level=logging.INFO)
  6. logger = logging.getLogger(__name__)
  7. handler = logging.FileHandler('/home/pi/rpi_serial.log')
  8. handler.setLevel(logging.WARNING)
  9. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  10. handler.setFormatter(formatter)
  11. logger.addHandler(handler)
  12. # InfluxDB
  13. client = InfluxDBClient(host="localhost", port=8086)
  14. client.switch_database("solar")
  15. # Regex Prep
  16. 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+)"
  17. pattern = re.compile(regex)
  18. # Setup
  19. serial_port = '/dev/ttyUSB0'
  20. def field_janitor(value_list):
  21. fields = {'mode': value_list[0][2],
  22. 'generatorspannung': float(value_list[0][3]),
  23. 'generatorstrom': float(value_list[0][4]),
  24. 'generatorleistung': float(value_list[0][5]),
  25. 'netzspannung': float(value_list[0][6]),
  26. 'netzstrom': float(value_list[0][7]),
  27. 'eingespeiste_leistung': float(value_list[0][8]),
  28. 'temperatur': float(value_list[0][9]) }
  29. return fields
  30. try:
  31. ser = serial.Serial(serial_port)
  32. logger.info("Connected to Serial Port, start polling")
  33. except:
  34. logger.error("Couldn't connect to serial port {}".format(serial_port))
  35. raise
  36. while True:
  37. line = ser.readline().decode('utf-8')
  38. logger.info(line)
  39. value_list = pattern.findall(line)
  40. print(len(value_list))
  41. if value_list and len(value_list[0]) == 10:
  42. measure = {}
  43. measure['measurement'] = "Tannenstrasse"
  44. date = datetime.datetime.strptime(value_list[0][0] + "-" + value_list[0][1], "%d.%m.%Y-%X").strftime('%s')
  45. # Winterzeit eine Stunde zurückstellen, Wechselrichter ist immer auf Winterzeit
  46. if time.localtime().tm_isdst == 0:
  47. date = int(date) - 3600
  48. measure['time'] = int(date)
  49. measure['fields'] = field_janitor(value_list)
  50. client.write_points([measure], time_precision="s")
  51. else:
  52. logger.warning("received invalid line: {}".format(line))