diff --git a/.player_heartbeat b/.player_heartbeat index 7fb3ab0..2fd304d 100644 --- a/.player_heartbeat +++ b/.player_heartbeat @@ -1 +1 @@ -1768670593.7002711 \ No newline at end of file +1768672780.5973904 \ No newline at end of file diff --git a/install.sh b/install.sh index 4fb1cc9..b9a295c 100644 --- a/install.sh +++ b/install.sh @@ -151,7 +151,33 @@ setup_raspberry_pi_power_management() { else echo "hdmi_blanking=0" | sudo tee -a /boot/config.txt > /dev/null fi - echo "✓ HDMI screen blanking disabled" + + # Disable HDMI CEC (can interfere with power management) + if grep -q "hdmi_ignore_cec_init" /boot/config.txt; then + sudo sed -i 's/^hdmi_ignore_cec_init=.*/hdmi_ignore_cec_init=1/' /boot/config.txt + else + echo "hdmi_ignore_cec_init=1" | sudo tee -a /boot/config.txt > /dev/null + fi + + # Force HDMI mode to always be on + if grep -q "hdmi_force_hotplug" /boot/config.txt; then + sudo sed -i 's/^hdmi_force_hotplug=.*/hdmi_force_hotplug=1/' /boot/config.txt + else + echo "hdmi_force_hotplug=1" | sudo tee -a /boot/config.txt > /dev/null + fi + + # Disable HDMI sleep mode + if grep -q "hdmi_ignore_edid" /boot/config.txt; then + sudo sed -i 's/^hdmi_ignore_edid=.*/hdmi_ignore_edid=0xa5000080/' /boot/config.txt + else + echo "hdmi_ignore_edid=0xa5000080" | sudo tee -a /boot/config.txt > /dev/null + fi + + echo "✓ HDMI configuration locked in /boot/config.txt" + echo " - HDMI blanking disabled" + echo " - HDMI CEC disabled" + echo " - HDMI hotplug forced" + echo " - HDMI sleep mode disabled" fi # Disable screensaver and screen blanking in X11 @@ -295,7 +321,71 @@ EOF chmod +x "$KEEPALIVE_SCRIPT" echo "✓ Screen keep-alive service created" - # Create systemd service to run keep-alive service + # Create systemd service to keep HDMI powered on + echo "Creating HDMI power control service..." + sudo tee /etc/systemd/system/hdmi-poweron.service > /dev/null << 'EOF' +[Unit] +Description=Keep HDMI Display Powered On +After=multi-user.target display-manager.service + +[Service] +Type=simple +ExecStart=/bin/bash -c 'while true; do /usr/bin/tvservice -p 2>/dev/null; sleep 30; done' +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + + sudo systemctl daemon-reload + sudo systemctl enable hdmi-poweron.service + sudo systemctl start hdmi-poweron.service + echo "✓ HDMI power control service enabled" + + # Create aggressive display keep-alive script + echo "Creating aggressive display keep-alive script..." + DISPLAY_KEEPALIVE="$SCRIPT_DIR/.display-keepalive.sh" + cat > "$DISPLAY_KEEPALIVE" << 'EOF' +#!/bin/bash +# Aggressive display keep-alive for Raspberry Pi +# Prevents HDMI from powering down + +DISPLAY_TIMEOUT=30 + +while true; do + # Keep HDMI powered on (tvservice command) + if command -v tvservice &> /dev/null; then + /usr/bin/tvservice -p 2>/dev/null + fi + + # Disable screensaver + if command -v xset &> /dev/null; then + DISPLAY=:0 xset s off 2>/dev/null + DISPLAY=:0 xset -dpms 2>/dev/null + DISPLAY=:0 xset dpms force on 2>/dev/null + DISPLAY=:0 xset s reset 2>/dev/null + fi + + # Move mouse to trigger activity + if command -v xdotool &> /dev/null; then + DISPLAY=:0 xdotool mousemove_relative 1 1 2>/dev/null + DISPLAY=:0 xdotool mousemove_relative -1 -1 2>/dev/null + fi + + # Disable monitor power saving + if command -v xrandr &> /dev/null; then + DISPLAY=:0 xrandr --output HDMI-1 --power-profile performance 2>/dev/null || true + fi + + sleep $DISPLAY_TIMEOUT +done +EOF + + chmod +x "$DISPLAY_KEEPALIVE" + echo "✓ Display keep-alive script created" + + # Update systemd screen keep-alive service to use this script sudo tee /etc/systemd/system/screen-keepalive.service > /dev/null << EOF [Unit] Description=Keep Screen Awake During Signage Player @@ -304,9 +394,12 @@ PartOf=graphical-session.target [Service] Type=simple -ExecStart=/bin/bash -c 'while true; do xset s reset 2>/dev/null; sleep 30; done' +User=$ACTUAL_USER +ExecStart=/bin/bash $DISPLAY_KEEPALIVE Restart=always RestartSec=5 +Environment="DISPLAY=:0" +Environment="XAUTHORITY=%h/.Xauthority" [Install] WantedBy=graphical-session.target @@ -314,7 +407,7 @@ EOF sudo systemctl daemon-reload sudo systemctl enable screen-keepalive.service - echo "✓ Systemd screen keep-alive service enabled" + echo "✓ Aggressive screen keep-alive service enabled" echo "" echo "⚠️ Note: Some changes require a system reboot to take effect." diff --git a/src/main.py b/src/main.py index 1f3358e..4f15e9e 100644 --- a/src/main.py +++ b/src/main.py @@ -934,17 +934,28 @@ class SignagePlayer(Widget): 1. xset s reset - Reset screensaver timeout 2. xset dpms force on - Force display on 3. xdotool - Move mouse to trigger activity + 4. tvservice - Keep HDMI powered on (Raspberry Pi) + 5. xrandr - Disable monitor power saving """ try: # Method 1: Reset screensaver timer using xset - os.system('xset s reset 2>/dev/null') + os.system('DISPLAY=:0 xset s reset 2>/dev/null') # Method 2: Force display on - os.system('xset dpms force on 2>/dev/null') + os.system('DISPLAY=:0 xset dpms force on 2>/dev/null') - # Method 3: Move mouse slightly (subtle, user won't notice) - if os.system('xdotool mousemove_relative 1 1 2>/dev/null') == 0: - os.system('xdotool mousemove_relative -1 -1 2>/dev/null') + # Method 3: Disable DPMS + os.system('DISPLAY=:0 xset -dpms 2>/dev/null') + + # Method 4: Move mouse slightly (subtle, user won't notice) + if os.system('DISPLAY=:0 xdotool mousemove_relative 1 1 2>/dev/null') == 0: + os.system('DISPLAY=:0 xdotool mousemove_relative -1 -1 2>/dev/null') + + # Method 5: Keep HDMI powered on (Raspberry Pi specific) + os.system('/usr/bin/tvservice -p 2>/dev/null') + + # Method 6: Disable monitor power saving via xrandr + os.system('DISPLAY=:0 xrandr --output HDMI-1 --power-profile performance 2>/dev/null || true') Logger.debug("SignagePlayer: Screen activity signal sent (display kept awake)")