🎉 Initial commit
This commit is contained in:
parent
2cbd8f0494
commit
eaf5083442
3
.idea/.gitignore
vendored
Normal file
3
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
4
.idea/misc.xml
Normal file
4
.idea/misc.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/screen_status_to_mqtt.iml" filepath="$PROJECT_DIR$/.idea/screen_status_to_mqtt.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
8
.idea/screen_status_to_mqtt.iml
Normal file
8
.idea/screen_status_to_mqtt.iml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
76
main.py
Normal file
76
main.py
Normal file
@ -0,0 +1,76 @@
|
||||
import logging
|
||||
import socket
|
||||
import sys
|
||||
from time import sleep
|
||||
|
||||
import servicemanager
|
||||
import win32event
|
||||
import win32service
|
||||
import win32serviceutil
|
||||
|
||||
from win32_notification_receiver import Win32NotificationReceiver
|
||||
|
||||
logPath = 'C:/Users/seb65/Documents/Gitea/screen_status_to_mqtt/'
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s",
|
||||
handlers=[
|
||||
logging.FileHandler(logPath + "debug.log"),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
class ScreenStatusToMqttService(win32serviceutil.ServiceFramework):
|
||||
_svc_name_ = "ScreenStatusToMqtt"
|
||||
_svc_display_name_ = "Screen Status To MQTT"
|
||||
_svc_description_ = "Send your screen status to MQTT Broker"
|
||||
|
||||
win32_notification_receiver: Win32NotificationReceiver = None
|
||||
running_flag = False
|
||||
|
||||
def __init__(self, args):
|
||||
super().__init__(args)
|
||||
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
|
||||
socket.setdefaulttimeout(60)
|
||||
|
||||
def SvcStop(self):
|
||||
logger.info("Stopping Service...")
|
||||
self.running_flag = False
|
||||
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
|
||||
win32event.SetEvent(self.hWaitStop)
|
||||
|
||||
def SvcDoRun(self):
|
||||
self.running_flag = True
|
||||
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
|
||||
servicemanager.PYS_SERVICE_STARTED,
|
||||
(self._svc_name_, ''))
|
||||
if self.ssh is None:
|
||||
logger.critical("Can't be run in debug mode !")
|
||||
sys.exit(1)
|
||||
else:
|
||||
self.main()
|
||||
|
||||
def SvcOtherEx(self, control, event_type, data):
|
||||
if control == win32service.SERVICE_CONTROL_POWEREVENT:
|
||||
self.win32_notification_receiver.event_handler(event_type, data)
|
||||
else:
|
||||
logger.warning("Unsupported control: ")
|
||||
logger.warning(control)
|
||||
|
||||
def main(self):
|
||||
self.win32_notification_receiver = Win32NotificationReceiver(self.ssh)
|
||||
while self.running_flag:
|
||||
sleep(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) == 1:
|
||||
servicemanager.Initialize()
|
||||
servicemanager.PrepareToHostSingle(ScreenStatusToMqttService)
|
||||
servicemanager.StartServiceCtrlDispatcher()
|
||||
else:
|
||||
win32serviceutil.HandleCommandLine(ScreenStatusToMqttService)
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
pywin32=303
|
||||
comtypes=1.1.11
|
||||
pyinstaller=4.10
|
0
sm_win_service.py
Normal file
0
sm_win_service.py
Normal file
68
win32_notification_receiver.py
Normal file
68
win32_notification_receiver.py
Normal file
@ -0,0 +1,68 @@
|
||||
import threading
|
||||
|
||||
import win32con
|
||||
import win32api
|
||||
import win32gui
|
||||
import time
|
||||
import logging
|
||||
from ctypes import POINTER, windll, Structure, cast, CFUNCTYPE, c_int, c_uint, c_void_p, c_bool
|
||||
from comtypes import GUID
|
||||
from ctypes.wintypes import HANDLE, DWORD
|
||||
|
||||
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()
|
||||
|
||||
|
||||
class Win32NotificationReceiver():
|
||||
running_flag = False
|
||||
|
||||
def __init__(self, recipient):
|
||||
super().__init__()
|
||||
self.recipient = recipient
|
||||
self.__prepare_win32gui_message()
|
||||
|
||||
def __prepare_win32gui_message(self):
|
||||
guids_info = {
|
||||
"GUID_MONITOR_POWER_ON": GUID_MONITOR_POWER_ON,
|
||||
"GUID_CONSOLE_DISPLAY_STATE": GUID_CONSOLE_DISPLAY_STATE,
|
||||
}
|
||||
logger.info("----")
|
||||
for name, guid_info in guids_info.items():
|
||||
logger.info(self.recipient)
|
||||
result = windll.user32.RegisterPowerSettingNotification(HANDLE(self.recipient), GUID(guid_info), DWORD(1))
|
||||
logger.info(f'registering {name}')
|
||||
logger.info(f"result: {hex(result)}")
|
||||
logger.info(f"lastError: {win32api.GetLastError()}")
|
||||
logger.info("----")
|
||||
|
||||
def event_handler(self, event_type, raw_data):
|
||||
if event_type == PBT_POWERSETTINGCHANGE:
|
||||
logger.debug("Power setting changed...")
|
||||
logger.debug("raw_data:")
|
||||
logger.debug(raw_data)
|
||||
|
||||
power_setting = str(raw_data[0])
|
||||
logger.debug("Power Setting: ")
|
||||
logger.debug(power_setting)
|
||||
|
||||
data = list(raw_data[1])
|
||||
logger.debug("Data: ")
|
||||
logger.debug(data)
|
||||
|
||||
if power_setting == GUID_CONSOLE_DISPLAY_STATE:
|
||||
if data[0] == 0:
|
||||
logger.debug("Display off")
|
||||
if data[0] == 1:
|
||||
logger.debug("Display on")
|
||||
if data[0] == 2:
|
||||
logger.debug("Display dimmed")
|
||||
elif power_setting == GUID_MONITOR_POWER_ON:
|
||||
if data[0] == 0:
|
||||
logger.debug("Monitor off")
|
||||
if data[0] == 1:
|
||||
logger.debug("Monitor on")
|
||||
else:
|
||||
logger.warning("unknown GUID")
|
Loading…
Reference in New Issue
Block a user