20-sep: Home Assistant en VPS para control luces Alexa (gratis)

This commit is contained in:
juanminsanz
2026-09-20 21:12:35 +02:00
parent aab08f5fce
commit dff7262ebd
8 changed files with 864 additions and 0 deletions

View File

@@ -0,0 +1,126 @@
"""
Protocolo de apagado completo del PC usando HOME ASSISTANT (version PRODUCCION).
Pasos:
1. Cerrar ventanas abiertas
2. Apagar luces Alexa via Home Assistant: "barras" y "cuartillo"
3. Apagar pantalla (Tapo via tunel RPi)
4. Shutdown del PC en 10 segundos
Uso:
python protocolo_apagado_homeassistant.py
"""
import os
import sys
import subprocess
import requests
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)
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(" [OK] Ventanas cerradas.")
def apagar_luces_homeassistant():
"""Apaga las luces 'barras' y 'cuartillo' via Home Assistant REST API"""
print("2. Apagando luces de Alexa via Home Assistant (barras + cuartillo)...")
url = os.getenv("HOMEASSISTANT_URL")
token = os.getenv("HOMEASSISTANT_TOKEN")
if not url or not token:
print(" [ERROR] Falta HOMEASSISTANT_URL o HOMEASSISTANT_TOKEN en .env")
return
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
luces = ["barras", "cuartillo"]
for luz in luces:
entity_id = f"light.{luz}"
try:
response = requests.post(
f"{url}/api/services/light/turn_off",
headers=headers,
json={"entity_id": entity_id},
timeout=10
)
if response.status_code == 200:
print(f" [OK] Senial enviada para apagar '{luz}'")
else:
print(f" [ERROR] Error HTTP {response.status_code} al apagar '{luz}'")
except Exception as e:
print(f" [ERROR] Error al apagar '{luz}': {e}")
def apagar_pantalla_tapo():
"""Apaga el enchufe Tapo de la pantalla via tunel RPi"""
print("3. Apagando pantalla (Tapo) via tunel RPi...")
# Script Python que se ejecutara 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(" [OK] Pantalla apagada.")
else:
print(f" [ERROR] Error al apagar pantalla (codigo {result.returncode})")
if result.stderr:
print(f" stderr: {result.stderr.strip()}")
except subprocess.TimeoutExpired:
print(" [ERROR] Timeout al apagar pantalla (>15s)")
except Exception as e:
print(f" [ERROR] Excepcion al apagar pantalla: {e}")
def shutdown_pc():
"""Apaga el PC en 10 segundos"""
print("4. Apagando el PC en 10 segundos...")
os.system("shutdown /s /t 10")
if __name__ == "__main__":
print("=" * 60)
print(" PROTOCOLO DE APAGADO (HOME ASSISTANT)")
print("=" * 60)
cerrar_ventanas()
apagar_luces_homeassistant()
apagar_pantalla_tapo()
shutdown_pc()
print("=" * 60)
print(" PROTOCOLO COMPLETADO")
print("=" * 60)