# https://www.instructables.com/id/Arduino-Python-Communication-via-USB/ # in /etc/systemd/system/startup-commands.service (s. https://www.nodebucket.de/index.php/apps/cms_pico/pico/server/setup): # ExecStart = su tilman -c 'python3 /media/hd/admin/doorbell/doorbell.py >> /media/hd/admin/doorbell/doorbell.log 2>&1 &' import serial import urllib.request import logging import logging.handlers as handlers import time import json logger = logging.getLogger('Rotating Log') logger.setLevel(logging.INFO) logHandler = handlers.RotatingFileHandler('/mnt/admin/doorbell/doorbell.log', maxBytes=1000000, backupCount=2) logHandler.setLevel(logging.INFO) logHandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s - %(message)s', '%Y-%m-%d %H:%M:%S')) logger.addHandler(logHandler) logger.info('Initializing') arduino = serial.Serial('/dev/Doorbell', 9600, timeout=.1) # for ESP32 #arduino.setDTR(False) #arduino.setRTS(False) last_ring = time.time() headers = { "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI1YWM2YzBkZTY4ZWY0NTE1YjQ2NzNmNGRlZWQ3YWUxZCIsImlhdCI6MTc4NDA1NTE4OCwiZXhwIjoyMDk5NDE1MTg4fQ.8s50h9BNVSIDlCxmOZIM_gPLHoRBrSpOKvOX-sjFN8U", "Content-Type": "application/json" } while True: data = arduino.readline()[:-2] #the last bit gets rid of the new-line chars if data: try: data = data.decode('utf8') except (UnicodeDecodeError) as ude: logger.error(ude) else: logger.info(data) if (data == 'RING'): try: response = urllib.request.urlopen('http://192.168.178.60/bell/on', timeout=5).read().decode('utf-8') # send MQTT if last ring was more than 5 seconds ago if ((time.time() - last_ring) > 5): last_ring = time.time() data = json.dumps({'payload': 'RING', 'topic': 'lewe/doorbell', 'retain': 'False'}).encode('utf8') request = urllib.request.Request("https://ha.nodebucket.de/api/services/mqtt/publish", data, headers) response = urllib.request.urlopen(request) except Exception: logger.error("Could not ring doorbell") time.sleep(300) elif (data == 'CLICK'): if ((time.time() - last_ring) > 5): last_ring = time.time() data = json.dumps({'payload': 'CLICK', 'topic': 'lewe/doorbell', 'retain': 'False'}).encode('utf8') request = urllib.request.Request("https://ha.nodebucket.de/api/services/mqtt/publish", data, headers) response = urllib.request.urlopen(request)