mettre en veille ou arrêter un PC sous windows 7 avec domoticz ?

Vous utilisez Windows © pour votre domotique avec Domoticz, ca ne fait rien on vous aime bien quand même. Ce forum est pour vous.
53l3cu5
Messages : 31
Inscription : 09 juil. 2021, 19:47

Re: mettre en veille ou arrêter un PC sous windows 7 avec domoticz ?

Message par 53l3cu5 »

Pour ceux que ça intéresse j'ai poussé le délire un peu plus loin en ajoutant des commandes de pilotage de mon pc comme "play/pause", "stop", "monte le son", "baisse le son" ou "Passer à la piste suivante" en plus de "shutdown".

Pour avoir un temps de réponse très rapide j'utilise le protocole mqtt.
Sur le Raspberry Pi j'ai installé mosquito
Voici comment est configurer mon fichier /etc/mosquitto/mosquitto.conf:

Code : Tout sélectionner

per_listener_settings true
pid_file /run/mosquitto/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false 
listener 1883  
password_file /etc/mosquitto/passwd
Sur Windows j'ai installé la librairie en ligne de commande

Code : Tout sélectionner

pip install paho-mqtt
pip install pyautogui
Ensuite j'ai écrit un script en python qui servira de serveur. Il comporte plusieurs sécurité pour éviter les déconnexion où les bugs. Le fichier s'appelle serverWin.py

Code : Tout sélectionner

import ctypes
import time
import paho.mqtt.client as mqtt
import os
import pyautogui
from env import USERNAME, PASSWORD
import logging
import argparse

# Créer un objet ArgumentParser pour lire les arguments de la ligne de commande
parser = argparse.ArgumentParser()
parser.add_argument("-l", "--log_path", help="chemin où enregistrer le fichier log")

# Lire les arguments de la ligne de commande
args = parser.parse_args()

# Configurer la journalisation
logging.basicConfig(
	level=logging.DEBUG,
	format='%(asctime)s %(levelname)s %(message)s',
	handlers=[
		# Envoyer les messages à la console
		logging.StreamHandler(),
		# Envoyer les messages à un fichier log
		logging.FileHandler(args.log_path) if args.log_path else logging.FileHandler('serverWin.log')
	]
)

logging.debug("start")
broker_address = "192.168.1.72"
broker_port = 1883
username = USERNAME
password = PASSWORD
topic = "domoticz/out"

# Obtenir le handle de la console
kernel32 = ctypes.windll.kernel32
console_window_handle = kernel32.GetConsoleWindow()

# Utiliser le handle pour masquer la fenêtre
ctypes.windll.user32.ShowWindow(console_window_handle, 0)
start_first_time = time.time()
hide_window = False

# Fonction de callback pour gérer les messages MQTT reçus
def on_message(client, userdata, message):
	payload = message.payload.decode("utf-8")
	logging.debug("Message : " + payload)
	
	if payload == "shutdown":
		logging.debug("Arrêt de l'ordinateur en cours...")
		os.system("shutdown /s /t 0")
	elif payload == "reboot":
		logging.debug("Redémarrage de l'ordinateur en cours...")
		os.system("shutdown /r /t 0")
	elif payload == "exit":
		logging.debug("Fermeture du programme...")
		client.disconnect()
		exit()
	elif payload == "show":
		logging.debug("Affiche la console...")
		ctypes.windll.user32.ShowWindow(console_window_handle, 1)
	elif payload == "hide":
		logging.debug("Masque la console...")
		ctypes.windll.user32.ShowWindow(console_window_handle, 0)
	elif payload == "next":
		logging.debug("Passer à la piste suivante...")
		pyautogui.press('nexttrack')
	elif payload == "prev":
		logging.debug("Passer à la piste d'avant...")
		pyautogui.press('prevtrack')
	elif payload == "stop":
		logging.debug("Stoper la piste en cours...")
		pyautogui.press('stop')
	elif payload == "playpause":
		logging.debug("Joue la piste en cours...")
		pyautogui.press('playpause')
	elif payload == "volumedown":
		logging.debug("Baisse le son...")
		pyautogui.press('volumedown')
		pyautogui.press('volumedown')
		pyautogui.press('volumedown')
		pyautogui.press('volumedown')
		pyautogui.press('volumedown')
	elif payload == "volumeup":
		logging.debug("Monte le son...")
		pyautogui.press('volumeup')
		pyautogui.press('volumeup')
		pyautogui.press('volumeup')
		pyautogui.press('volumeup')
		pyautogui.press('volumeup')

# Fonction de callback pour gérer la perte de connexion MQTT
def on_disconnect(client, userdata, rc):
	logging.warning("Connexion interrompue. Tentative de reconnexion...")
	while True:
		try:
			client.reconnect()
			break
		except:
			logging.error("Echec de la reconnexion. Nouvelle tentative dans 5 secondes...")
			time.sleep(5)

# Configuration du client MQTT et connexion au broker
logging.debug("Configuration du client MQTT et connexion au broker")
client = mqtt.Client()
client.username_pw_set(username, password)
client.connect(broker_address, broker_port)

# Abonnement au topic MQTT
logging.debug("Abonnement au topic MQTT : "+ topic)
client.subscribe(topic)

# Configuration de la fonction de callback pour les messages MQTT reçus
client.on_message = on_message

# Configuration de la fonction de callback pour la perte de connexion MQTT
client.on_disconnect = on_disconnect

# Boucle principale pour écouter les messages MQTT en continu
while True:
	try:
		# Ajout d'une mesure de performance pour la boucle principale
		start_time = time.time()

		rc = client.loop()
		if rc != 0:
			logging.warning("Connexion perdue. Tentative de reconnexion dans 5 secondes...")
			time.sleep(5)
			client.reconnect()

		# Ajout d'une notification pour les temps de réponse élevés
		response_time = time.time() - start_time
		if response_time > 1.2:
			logging.warning("Temps de réponse élevé : {} secondes".format(response_time))

		# Vérifier si le temps écoulé depuis le début du programme dépasse 5 secondes
		elapsed_time = time.time() - start_first_time
		if elapsed_time > 5 and not hide_window:
			logging.debug("Masquage de la fenêtre de la console...")
			ctypes.windll.user32.ShowWindow(console_window_handle, 0)
			hide_window = True

	# Gestion des erreurs potentielles
	except Exception as e:
		logging.error("Erreur détectée : {}".format(str(e)))
		time.sleep(5)
		try:
			os.system("python serverWin.py")
		except Exception as e:
			logging.error("Erreur détectée : {}".format(str(e)))

# mosquitto_pub -h 192.168.1.72 -t domoticz/out -u User -P MotDePasse -m "shutdown"
il fonctionne avec un autre fichier env.py qui contient le nom d'utilisateur mosquito ainsi que le mot de passe. Il doit être enregistré au même endroit que serverWin.py

Code : Tout sélectionner

USERNAME = "User"
PASSWORD = "MotDePasse"
Enfin il faut rendre le programme exécutable au démarrage. Pour ça il faut créer un autre fichier. Place le fichier serverWin.bat dans le dossier de démarrage de Windows. Tu peux y accéder en tapant shell:startup dans la barre de recherche de Windows.
Ce fichier doit contenir le texte suivant:

Code : Tout sélectionner

@echo on
python chemin_vers_serverWin.py -l chemin_vers_serverWin.log
-l chemin_vers_serverWin.log permet de choisir où le journal des événements et des erreurs va être enregistré. Si tu ne précise aucun argument après chemin_vers_serverWin.py alors le journal des événements sera enregistré à côté de serverWin.bat ce qui aura pour conséquence d'ouvrir le journal des événements à chaque démarrage de Windows.

Maintenant, il ne reste plus qu'à tester sur le Raspberry Pi que le serveur fonctionne bien avec la commande

Code : Tout sélectionner

mosquitto_pub -h 192.168.1.72 -t domoticz/out -u User -P MotDePasse -m "shutdown"
bien sûr il ne faut pas oublier de remplacer 192.168.1.72 par votre propre IP ou DNS
Répondre