diff --git a/README.md b/README.md index 3f778b6..05e9ca2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,25 @@ # screen_status_to_mqtt +### Build: +```powershell +pyinstaller.exe -F -n ScreenStatusToMQTT --hidden-import=win32timezone --paths .\venv\Lib\site-packages\ .\main.py +``` + +### Install + +Copy `build/ScreenStatusToMQTT.exe` to `C:\Program Files\ScreenStatusToMQTT` + +In powershell as admin: +```powershell +# Install autostart +.\ScreenStatusToMQTT.exe --startup auto install + +# Start it +.\ScreenStatusToMQTT.exe start + +# Stop it +.\ScreenStatusToMQTT.exe stop + +# Uninstall +.\ScreenStatusToMQTT.exe remove +``` \ No newline at end of file diff --git a/main.py b/main.py index 6b17b51..fbd00f9 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ import logging import socket import sys +from pathlib import Path from time import sleep import servicemanager @@ -8,20 +9,22 @@ import win32event import win32service import win32serviceutil +import app_path +from mqtt_client import MqttClient from win32_notification_receiver import Win32NotificationReceiver -logPath = 'C:/Users/seb65/Documents/Gitea/screen_status_to_mqtt/' +Path(app_path.base_pash).mkdir(parents=True, exist_ok=True) logging.basicConfig( level=logging.DEBUG, - format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s", + format="%(asctime)s [%(name)-12.12s] [%(levelname)-5.5s] %(message)s", handlers=[ - logging.FileHandler(logPath + "debug.log"), + logging.FileHandler(app_path.log_path), logging.StreamHandler() ] ) -logger = logging.getLogger() +logger = logging.getLogger("Main") class ScreenStatusToMqttService(win32serviceutil.ServiceFramework): @@ -30,6 +33,7 @@ class ScreenStatusToMqttService(win32serviceutil.ServiceFramework): _svc_description_ = "Send your screen status to MQTT Broker" win32_notification_receiver: Win32NotificationReceiver = None + mqtt_client: MqttClient = None running_flag = False def __init__(self, args): @@ -39,9 +43,10 @@ class ScreenStatusToMqttService(win32serviceutil.ServiceFramework): def SvcStop(self): logger.info("Stopping Service...") - self.running_flag = False self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + self.mqtt_client.disconnect() win32event.SetEvent(self.hWaitStop) + self.running_flag = False def SvcDoRun(self): self.running_flag = True @@ -62,7 +67,16 @@ class ScreenStatusToMqttService(win32serviceutil.ServiceFramework): logger.warning(control) def main(self): - self.win32_notification_receiver = Win32NotificationReceiver(self.ssh) + logger.info("********************** Starting Service ********************** ") + try: + self.mqtt_client = MqttClient("ScreenStatusMQTT") + self.mqtt_client.init_connection() + + self.win32_notification_receiver = Win32NotificationReceiver(self.ssh, self.mqtt_client) + except Exception: + logger.exception("Error during init:") + sys.exit(1) + while self.running_flag: sleep(1) diff --git a/requirements.txt b/requirements.txt index cfe3195..fb27867 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ -pywin32=303 -comtypes=1.1.11 -pyinstaller=4.10 \ No newline at end of file +pywin32==303 +comtypes==1.1.11 +pyinstaller==4.10 +paho-mqtt==1.6.1 +PyYaml==6.0 \ No newline at end of file diff --git a/sm_win_service.py b/sm_win_service.py deleted file mode 100644 index e69de29..0000000 diff --git a/win32_notification_receiver.py b/win32_notification_receiver.py index 64535af..c9c0096 100644 --- a/win32_notification_receiver.py +++ b/win32_notification_receiver.py @@ -9,18 +9,21 @@ from ctypes import POINTER, windll, Structure, cast, CFUNCTYPE, c_int, c_uint, c from comtypes import GUID from ctypes.wintypes import HANDLE, DWORD +from mqtt_client import MqttClient + PBT_POWERSETTINGCHANGE = 0x8013 # 32787 GUID_CONSOLE_DISPLAY_STATE = "{6FE69556-704A-47A0-8F24-C28D936FDA47}" GUID_MONITOR_POWER_ON = "{02731015-4510-4526-99E6-E5A17EBD1AEA}" -logger = logging.getLogger() +logger = logging.getLogger("Win32Notif") class Win32NotificationReceiver(): running_flag = False - def __init__(self, recipient): + def __init__(self, recipient, mqtt_client: MqttClient): super().__init__() + self.mqtt_client = mqtt_client self.recipient = recipient self.__prepare_win32gui_message() @@ -55,14 +58,19 @@ class Win32NotificationReceiver(): if power_setting == GUID_CONSOLE_DISPLAY_STATE: if data[0] == 0: logger.debug("Display off") + self.mqtt_client.publish_status("display", "Off") if data[0] == 1: logger.debug("Display on") + self.mqtt_client.publish_status("display", "On") if data[0] == 2: logger.debug("Display dimmed") + self.mqtt_client.publish_status("display", "Dimmed") elif power_setting == GUID_MONITOR_POWER_ON: if data[0] == 0: logger.debug("Monitor off") + self.mqtt_client.publish_status("monitor", "OFF") if data[0] == 1: logger.debug("Monitor on") + self.mqtt_client.publish_status("monitor", "ON") else: logger.warning("unknown GUID")