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:02] – [X11VNC] 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 36: | Line 37: | ||
| * UI Tools \\ '' | * UI Tools \\ '' | ||
| * Nutzloses Zeug \\ '' | * Nutzloses Zeug \\ '' | ||
| + | |||
| + | ===== ser2net ===== | ||
| + | * Der Zigbee Stick hängt am Display über USB. Damit der in HA genutzt werden kann nutzen wir ser2net. | ||
| + | * -> https:// | ||
| + | |||
| ===== Browser ===== | ===== Browser ===== | ||
| Line 122: | Line 128: | ||
| ===== Fullscreen ===== | ===== Fullscreen ===== | ||
| - | + | * für Fullscreen Kontroller brauchen wir die HA Integration " | |
| - | ==== Display ==== | + | * auf dem Endgerät dann die Seite öffnen \\ http:// |
| - | + | * Register aktivieren | |
| - | * Venv einrichten | + | * sinnvollen Namen in Browser ID eingeben |
| - | * '' | + | * Jetzt sollte der Browser als Device in HA auftauchen |
| - | * '' | + | * Wir brauchen BroiwserMod um JavaScript auszuführen um Fullscreen Toggel hinzubekommen |
| - | * '' | + | * Das Ausblenden von HA Elementen passiert mit '' |
| - | * '' | + | * Konfig vom kiosk-mode passiert im YAML Modus des Dashboards! \\ < |
| - | * Compile VL53 Lib ... | + | kiosk_mode: |
| - | * '' | + | user_settings: |
| - | * '' | + | - users: |
| - | * '' | + | - wohnzimmer |
| - | * '' | + | hide_sidebar: |
| - | * '' | + | hide_header: |
| - | * VL53L0X.py in den Scriptordner kopieren ... | + | hide_assistant: |
| - | | + | </ |
| - | + | * Den Fullscreen Button kann man so erstellen: | |
| - | ==== Tests ==== | + | * Button mit Interaktion -> Aktion ausführen |
| - | === VL === | + | * Target Browser auswählen -> WZ Display (dafür braucht man browser_mod) |
| - | + | * Code : <code javascript> | |
| - | + | | |
| - | + | document.documentElement.requestFullscreen(); | |
| - | + | } else { | |
| - | ===== Motion Detect | + | |
| - | * Sensor : VL53L0X | + | |
| - | + | </ | |
| - | * Altes Script | + | ===== Display On / Off ===== |
| + | 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 | ||
| + | import | ||
| 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 181: | 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 |
| - | if Display_State | + | |
| - | # | + | |
| - | toggleOnOff() | + | |
| - | Display_State | + | |
| - | print(" | + | |
| - | sys.stdout.flush() | + | |
| - | + | ||
| - | # Display Einschalten | + | |
| - | # | + | |
| - | ### | + | |
| - | # | + | |
| - | # | + | |
| - | time.sleep(0.1) | + | ==== Service ==== |
| - | + | * Aktivieren \\ '' | |
| - | tof.stop_ranging() | + | * Log ansehen |
| - | tof.close() | + | * '' |
| - | </ | + | |
| - | * Service | + | |
| - | pi@SHome-Display-VPN-DNS: | + | |
| [Unit] | [Unit] | ||
| - | Description=Display Controller | + | Description=Smart Display Controller |
| - | + | # Wir warten, bis das Netzwerk und die Grafikoberfläche da sind | |
| + | After=network-online.target graphical.target | ||
| + | Wants=network-online.target | ||
| [Service] | [Service] | ||
| + | # --- User Context --- | ||
| + | User=pi | ||
| + | Group=pi | ||
| + | |||
| + | # --- Arbeitsverzeichnis --- | ||
| + | # Setzt das Verzeichnis, | ||
| + | WorkingDirectory=/ | ||
| + | |||
| + | # --- Environment --- | ||
| + | # Diese Variablen sind wichtig für DDC/CI oder xrandr Interaktionen | ||
| 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.1766811729.txt.gz · Last modified: by dominik
