116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
"""
|
||
Protocolo de apagado completo del PC (VERSION DE PRUEBA - SIN SHUTDOWN)
|
||
|
||
Pasos:
|
||
1. Cerrar ventanas abiertas
|
||
2. Apagar luces Alexa: "barras" y "cuartillo" (via Home Assistant)
|
||
3. Apagar pantalla (Tapo via tunel RPi)
|
||
4. [COMENTADO] Shutdown del PC
|
||
|
||
Uso:
|
||
python protocolo_apagado_test.py
|
||
"""
|
||
import os
|
||
import sys
|
||
import time
|
||
import subprocess
|
||
import urllib.request
|
||
from dotenv import load_dotenv
|
||
|
||
# Fix encoding para Windows
|
||
if sys.platform == 'win32':
|
||
import codecs
|
||
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer, 'strict')
|
||
sys.stderr = codecs.getwriter('utf-8')(sys.stderr.buffer, 'strict')
|
||
|
||
# Cargar variables de entorno locales (.env de biblioteca_negocio_prolongo)
|
||
dotenv_path = r"C:\Users\juanm\Documents\GitHub\biblioteca_negocio_prolongo\.env"
|
||
load_dotenv(dotenv_path)
|
||
|
||
# Permitir importar modulos del repo de negocio (ha_alexa).
|
||
_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||
if _SCRIPT_DIR not in sys.path:
|
||
sys.path.insert(0, _SCRIPT_DIR)
|
||
try:
|
||
import infra_paths
|
||
infra_paths.bootstrap_biblioteca_paths()
|
||
except Exception:
|
||
pass
|
||
|
||
def cerrar_ventanas():
|
||
"""Cierra todas las ventanas excepto terminal/OpenCode"""
|
||
print("1. Cerrando ventanas abiertas (excepto terminal de OpenCode)...")
|
||
ps_command = """
|
||
$procesos = Get-Process | Where-Object { $_.MainWindowHandle -ne 0 -and $_.ProcessName -notmatch 'OpenCode|WindowsTerminal|cmd|powershell|Code|conhost' }
|
||
foreach ($p in $procesos) {
|
||
try {
|
||
$p.CloseMainWindow() | Out-Null
|
||
Start-Sleep -Milliseconds 200
|
||
if (-not $p.HasExited) { $p.Kill() }
|
||
} catch {}
|
||
}
|
||
"""
|
||
subprocess.run(["powershell", "-Command", ps_command], capture_output=True)
|
||
print(" ✓ Ventanas cerradas.")
|
||
|
||
def apagar_luces_alexa():
|
||
"""Apaga las luces 'barras' y 'cuartillo' via HOME ASSISTANT (sustituye a VoiceMonkey)."""
|
||
print("2. Apagando luces de Alexa via Home Assistant (barras + cuartillo)...")
|
||
try:
|
||
from ha_alexa import command
|
||
except Exception as e:
|
||
print(f" ✗ [ERROR] No se pudo cargar ha_alexa: {e}")
|
||
return
|
||
for nombre in ("barras", "cuartillo"):
|
||
ok = command(f"apaga {nombre}")
|
||
print(f" {'✓' if ok else '✗'} apagar '{nombre}'")
|
||
|
||
def apagar_pantalla_tapo():
|
||
"""Apaga el enchufe Tapo de la pantalla via tunel RPi"""
|
||
print("3. Apagando pantalla (Tapo) via túnel RPi...")
|
||
|
||
# Script Python que se ejecutará en la RPi
|
||
tapo_script = """from PyP100 import PyP100
|
||
p100 = PyP100.P100('192.168.50.224', 'hermes211@gmail.com', 'Nelo@36666')
|
||
p100.handshake()
|
||
p100.login()
|
||
p100.turnOff()"""
|
||
|
||
# Comando SSH en dos saltos: local -> VPS -> RPi
|
||
cmd = [
|
||
"ssh", "-i", r"C:\Users\juanm\Documents\GitHub\contabo",
|
||
"root@185.187.169.109",
|
||
f"ssh -i /root/.ssh/pi_deploy -p 2222 -o StrictHostKeyChecking=no pi@127.0.0.1 'python3 -c \"{tapo_script}\"'"
|
||
]
|
||
|
||
try:
|
||
result = subprocess.run(cmd, capture_output=True, timeout=15, text=True)
|
||
if result.returncode == 0:
|
||
print(" ✓ Pantalla apagada.")
|
||
else:
|
||
print(f" ✗ Error al apagar pantalla (código {result.returncode})")
|
||
if result.stderr:
|
||
print(f" stderr: {result.stderr.strip()}")
|
||
except subprocess.TimeoutExpired:
|
||
print(" ✗ Timeout al apagar pantalla (>15s)")
|
||
except Exception as e:
|
||
print(f" ✗ Excepción al apagar pantalla: {e}")
|
||
|
||
def shutdown_pc():
|
||
"""Apaga el PC en 10 segundos"""
|
||
print("4. [COMENTADO] Apagando el PC en 10 segundos...")
|
||
print(" ℹ️ Shutdown deshabilitado en modo prueba.")
|
||
# os.system("shutdown /s /t 10")
|
||
|
||
if __name__ == "__main__":
|
||
print("=" * 60)
|
||
print(" PROTOCOLO DE APAGADO (TEST - SIN SHUTDOWN)")
|
||
print("=" * 60)
|
||
cerrar_ventanas()
|
||
apagar_luces_alexa()
|
||
apagar_pantalla_tapo()
|
||
shutdown_pc()
|
||
print("=" * 60)
|
||
print(" PROTOCOLO COMPLETADO")
|
||
print("=" * 60)
|