haussteuerung:display_panel
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| haussteuerung:display_panel [2025/12/27 06:48] – [Updates] dominik | haussteuerung:display_panel [2025/12/27 08:11] (current) – [Service] dominik | ||
|---|---|---|---|
| Line 9: | Line 9: | ||
| * '' | * '' | ||
| * I2C Aktivieren | * I2C Aktivieren | ||
| + | * 1Wire aktivieren | ||
| * umstellen von Wayland auf X11 | * umstellen von Wayland auf X11 | ||
| * Screen Blanking aus ! | * Screen Blanking aus ! | ||
| Line 153: | Line 154: | ||
| } | } | ||
| </ | </ | ||
| - | ==== Display ==== | + | ===== Display |
| - | + | Das Display kann über den GPIO Pin 36 vom Raspberry Pi an- und abgeschaltet werden. Das geht über ein einfaches toggeln. Am Ende macht das Python Script (gestartet als Service) aber noch einiges mehr... < | |
| - | * Venv einrichten | + | import |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * Compile VL53 Lib ... | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * VL53L0X.py in den Scriptordner kopieren ... | + | |
| - | * Tests starten ... | + | |
| - | + | ||
| - | ==== Tests ==== | + | |
| - | === VL === | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | ===== Motion Detect ===== | + | |
| - | * Sensor : VL53L0X | + | |
| - | + | ||
| - | * Altes Script \\ < | + | |
| import time | import time | ||
| - | import VL53L0X | ||
| - | import os | ||
| - | import subprocess | ||
| - | import RPi.GPIO as GPIO | ||
| - | from pynput import mouse | ||
| - | def on_move(x, y): | + | # GPIO-Setup |
| - | | + | GPIO.setmode(GPIO.BOARD) |
| - | print(' | + | GPIO.setwarnings(False) |
| - | sys.stdout.flush() | + | |
| - | | + | |
| - | print(" | + | |
| - | def on_click(x, y, button, pressed): | + | # Pin 36 (GPIO 16) für Display ON/OFF |
| - | | + | GPIO.setup(36, GPIO.OUT) |
| - | print(' | + | |
| - | sys.stdout.flush() | + | |
| - | Display_Last_Action = time.time() | + | |
| - | print(" | + | |
| - | + | ||
| - | def on_scroll(x, | + | |
| - | global Display_Last_Action | + | |
| - | print(' | + | |
| - | sys.stdout.flush() | + | |
| - | Display_Last_Action = time.time() | + | |
| - | print(" | + | |
| def toggleOnOff(): | def toggleOnOff(): | ||
| Line 211: | Line 170: | ||
| time.sleep(0.4) | time.sleep(0.4) | ||
| GPIO.output(36, | GPIO.output(36, | ||
| - | print(" | + | print(" |
| - | sys.stdout.flush() | + | |
| - | + | ||
| - | listener = mouse.Listener( | + | |
| - | on_move=on_move, | + | |
| - | on_click=on_click, | + | |
| - | on_scroll=on_scroll) | + | |
| - | listener.start() | + | |
| - | # Last Time Event happend on Display | + | # Toggle ausführen |
| - | Display_Last_Action = time.time() | + | toggleOnOff() |
| - | Display_State | + | </ |
| - | Display_Timeout_Sec = 180 | + | |
| - | # RPi.GPIO Layout verwenden (wie Pin-Nummern) | + | ==== Funktionen ==== |
| - | GPIO.setmode(GPIO.BOARD) | + | * Display an / aus |
| - | # RuntimeWarning: | + | * Raspberry |
| - | GPIO.setwarnings(False) | + | * Schalten des Displays über HA |
| + | * Melden von Bewegung an HA (MQTT) | ||
| + | * einfaches Systemn Monitoring | ||
| - | # Pin 36 (GPIO 16) auf Output setzen | + | ==== Venv einrichten ==== |
| - | GPIO.setup(36, | + | * '' |
| - | # Pin 38 (GPIO 20) auf Output setzen | + | * '' |
| - | GPIO.setup(38, GPIO.OUT) | + | * '' |
| - | # Pin 40 (GPIO 21) auf Output setzen | + | * '' |
| - | GPIO.setup(40, | + | |
| - | # Create a VL53L0X object | + | * Compile VL53 Lib ... |
| - | tof = VL53L0X.VL53L0X(i2c_bus=1, | + | * '' |
| - | tof.open() | + | * '' |
| - | tof.start_ranging(VL53L0X.Vl53l0xAccuracyMode.BETTER) | + | * '' |
| + | * VL53L0X.py in den Scriptordner kopieren ... \\ '' | ||
| + | * Tests starten ... | ||
| - | while 1: | ||
| - | # Distanz vom VL53L0X Sensor messen | ||
| - | distance = tof.get_distance() | ||
| - | # | ||
| - | # Display ggf. abschalten | ||
| - | if time.time()-Display_Last_Action >= Display_Timeout_Sec: | ||
| - | if Display_State == True: | ||
| - | # | ||
| - | toggleOnOff() | ||
| - | Display_State = False | ||
| - | print(" | ||
| - | sys.stdout.flush() | ||
| - | # Abstand vom Sensor pruefen | + | |
| - | if distance < 900: | + | |
| - | print(" | + | |
| - | sys.stdout.flush() | + | |
| - | Display_Last_Action = time.time() | + | |
| - | print(" | + | |
| - | # Display ggf. wieder einschalten | + | ===== Motion Detect ===== |
| - | if time.time()-Display_Last_Action < Display_Timeout_Sec: | + | * Sensor : VL53L0X |
| - | if Display_State | + | |
| - | # | + | |
| - | toggleOnOff() | + | |
| - | Display_State | + | |
| - | | + | |
| - | sys.stdout.flush() | + | |
| - | # Display Einschalten | + | ==== Service ==== |
| - | #os.system('DISPLAY=:0 xdotool key " | + | * Aktivieren \\ '' |
| - | ### | + | * Log ansehen \\ '' |
| - | # | + | * '' |
| - | #subprocess.call(" | + | [Unit] |
| + | Description=Smart Display Controller (venv/User Mode) | ||
| + | # Wir warten, bis das Netzwerk und die Grafikoberfläche da sind | ||
| + | After=network-online.target graphical.target | ||
| + | Wants=network-online.target | ||
| - | time.sleep(0.1) | + | [Service] |
| + | # --- User Context --- | ||
| + | User=pi | ||
| + | Group=pi | ||
| - | tof.stop_ranging() | + | # --- Arbeitsverzeichnis --- |
| - | tof.close() | + | # Setzt das Verzeichnis, |
| - | </code> | + | WorkingDirectory=/home/ |
| - | * Service \\ <code display.service> | + | |
| - | pi@SHome-Display-VPN-DNS:/ $ cat lib/ | + | # --- Environment |
| - | [Unit] | + | # Diese Variablen sind wichtig für DDC/CI oder xrandr Interaktionen |
| - | Description=Display Controller | + | |
| - | + | ||
| - | [Service] | + | |
| Environment=DISPLAY=: | Environment=DISPLAY=: | ||
| Environment=XAUTHORITY=/ | Environment=XAUTHORITY=/ | ||
| - | ExecStart=/usr/bin/python /home/pi/DisplayOn/MotionDetect.py | + | # Erzwingt unbuffered Output, damit Logs sofort im Journal erscheinen |
| + | Environment=PYTHONUNBUFFERED=1 | ||
| + | |||
| + | # --- ExecStart: Der Trick für das venv --- | ||
| + | # Statt ' | ||
| + | # PASSE DEN PFAD ZUM VENV AN, falls dein Ordner anders heißt (z.B. .venv)! | ||
| + | ExecStart=/home/ | ||
| + | |||
| + | # --- Restart Verhalten --- | ||
| Restart=always | Restart=always | ||
| - | RestartSec=30s | + | RestartSec=10s |
| - | KillMode=process | + | |
| - | TimeoutSec=infinity | + | |
| - | + | ||
| [Install] | [Install] | ||
| WantedBy=graphical.target | WantedBy=graphical.target | ||
| - | |||
| </ | </ | ||
haussteuerung/display_panel.1766814494.txt.gz · Last modified: by dominik
