Files
smart-home/doorbell/klingel_sender_nano_serial/doorbell.py
T
2026-07-14 18:56:01 +00:00

70 lines
3.3 KiB
Python

# 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')
# Stelle sicher, dass der Symlink /dev/Doorbell auch auf dem neuen Server existiert!
arduino = serial.Serial('/dev/Doorbell', 9600, timeout=.1)
last_ring = time.time()
# Ersetze den String nach "Bearer " durch deinen neu erstellten Token aus Schritt 1
headers = {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI1YWM2YzBkZTY4ZWY0NTE1YjQ2NzNmNGRlZWQ3YWUxZCIsImlhdCI6MTc4NDA1NTE4OCwiZXhwIjoyMDk5NDE1MTg4fQ.8s50h9BNVSIDlCxmOZIM_gPLHoRBrSpOKvOX-sjFN8U",
"Content-Type": "application/json"
}
while True:
data = arduino.readline()[:-2] # Entfernt Newline-Zeichen (\r\n)
if data:
try:
data = data.decode('utf8')
except (UnicodeDecodeError) as ude:
logger.error(f"Decode Error: {ude}")
else:
logger.info(f"Received from Arduino: {data}")
if data == 'RING':
# 1. Lokalen HTTP-Request an den Gong senden
try:
response = urllib.request.urlopen('http://192.168.178.60/bell/on', timeout=5).read().decode('utf-8')
except Exception as e:
logger.error(f"Could not trigger physical bell: {e}")
# 2. MQTT-Meldung an Home Assistant senden (max. alle 5 Sekunden)
if (time.time() - last_ring) > 5:
last_ring = time.time()
try:
payload_data = json.dumps({'payload': 'RING', 'topic': 'lewe/doorbell', 'retain': 'False'}).encode('utf8')
request = urllib.request.Request("https://ha.nodebucket.de/api/services/mqtt/publish", payload_data, headers)
response = urllib.request.urlopen(request, timeout=5)
except Exception as e:
logger.error(f"Could not send MQTT Ring Event to Home Assistant: {e}")
elif data == 'CLICK':
if (time.time() - last_ring) > 5:
last_ring = time.time()
try:
payload_data = json.dumps({'payload': 'CLICK', 'topic': 'lewe/doorbell', 'retain': 'False'}).encode('utf8')
request = urllib.request.Request("https://ha.nodebucket.de/api/services/mqtt/publish", payload_data, headers)
response = urllib.request.urlopen(request, timeout=5)
except Exception as e:
logger.error(f"Could not send MQTT Click Event to Home Assistant: {e}")
# Kleiner Sleep, um die CPU im Idle-Zustand zu entlasten
time.sleep(0.05)