Erster Stand der Hintergrundprozesse, die auf der Synology unter /volume1/homes/wagner/SolarManager laufen: der Manager selbst, die Sammler je Geraet, die MQTT-Bruecke, der Wecker und - neu hinzugezogen - der AutoAction-Runner, der als Hintergrundprozess hierher gehoert und nicht ins Web-Verzeichnis. Zugangsdaten stehen nicht mehr im Quelltext, sondern in config.ini, die nicht mit eingecheckt wird. Vorlage ist config.ini.example, gelesen wird sie von konfig.py. Betroffen waren solarManager.py (Datenbank und Wattpilot), zeit.py, gatherWaterData.py, wecker.py und skoda_testdaten.py, das sich das Passwort bisher aus dem Quelltext eines anderen Moduls herausgesucht hat. Die Kia-Anbindung ist mit dem Fahrzeug entfallen: kiaTest.py, gatherCarData.py und hyundai_kia_connect_api sind nicht mehr dabei, ebenso gatherInverterData.py, auf das nur noch eine auskommentierte Zeile zeigte. Die mitgelieferten Bibliotheken bleiben im Repository - die NAS hat kein pip, sie muessen neben den Skripten liegen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
367 lines
11 KiB
Python
367 lines
11 KiB
Python
#! python
|
|
#
|
|
# Constants and types for use with Windows API, used by serialwin32.py
|
|
#
|
|
# This file is part of pySerial. https://github.com/pyserial/pyserial
|
|
# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
# pylint: disable=invalid-name,too-few-public-methods,protected-access,too-many-instance-attributes
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from ctypes import c_ulong, c_void_p, c_int64, c_char, \
|
|
WinDLL, sizeof, Structure, Union, POINTER
|
|
from ctypes.wintypes import HANDLE
|
|
from ctypes.wintypes import BOOL
|
|
from ctypes.wintypes import LPCWSTR
|
|
from ctypes.wintypes import DWORD
|
|
from ctypes.wintypes import WORD
|
|
from ctypes.wintypes import BYTE
|
|
_stdcall_libraries = {}
|
|
_stdcall_libraries['kernel32'] = WinDLL('kernel32')
|
|
|
|
INVALID_HANDLE_VALUE = HANDLE(-1).value
|
|
|
|
|
|
# some details of the windows API differ between 32 and 64 bit systems..
|
|
def is_64bit():
|
|
"""Returns true when running on a 64 bit system"""
|
|
return sizeof(c_ulong) != sizeof(c_void_p)
|
|
|
|
# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
|
|
# is either 32 or 64 bits, depending on the type of windows...
|
|
# so test if this a 32 bit windows...
|
|
if is_64bit():
|
|
ULONG_PTR = c_int64
|
|
else:
|
|
ULONG_PTR = c_ulong
|
|
|
|
|
|
class _SECURITY_ATTRIBUTES(Structure):
|
|
pass
|
|
LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
|
|
|
|
|
|
try:
|
|
CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
|
|
except AttributeError:
|
|
# Fallback to non wide char version for old OS...
|
|
from ctypes.wintypes import LPCSTR
|
|
CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
|
|
CreateEventA.restype = HANDLE
|
|
CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
|
|
CreateEvent = CreateEventA
|
|
|
|
CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
|
|
CreateFileA.restype = HANDLE
|
|
CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
|
|
CreateFile = CreateFileA
|
|
else:
|
|
CreateEventW.restype = HANDLE
|
|
CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
|
|
CreateEvent = CreateEventW # alias
|
|
|
|
CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
|
|
CreateFileW.restype = HANDLE
|
|
CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
|
|
CreateFile = CreateFileW # alias
|
|
|
|
|
|
class _OVERLAPPED(Structure):
|
|
pass
|
|
|
|
OVERLAPPED = _OVERLAPPED
|
|
|
|
|
|
class _COMSTAT(Structure):
|
|
pass
|
|
|
|
COMSTAT = _COMSTAT
|
|
|
|
|
|
class _DCB(Structure):
|
|
pass
|
|
|
|
DCB = _DCB
|
|
|
|
|
|
class _COMMTIMEOUTS(Structure):
|
|
pass
|
|
|
|
COMMTIMEOUTS = _COMMTIMEOUTS
|
|
|
|
GetLastError = _stdcall_libraries['kernel32'].GetLastError
|
|
GetLastError.restype = DWORD
|
|
GetLastError.argtypes = []
|
|
|
|
LPOVERLAPPED = POINTER(_OVERLAPPED)
|
|
LPDWORD = POINTER(DWORD)
|
|
|
|
GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
|
|
GetOverlappedResult.restype = BOOL
|
|
GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
|
|
|
|
ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
|
|
ResetEvent.restype = BOOL
|
|
ResetEvent.argtypes = [HANDLE]
|
|
|
|
LPCVOID = c_void_p
|
|
|
|
WriteFile = _stdcall_libraries['kernel32'].WriteFile
|
|
WriteFile.restype = BOOL
|
|
WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
|
|
|
|
LPVOID = c_void_p
|
|
|
|
ReadFile = _stdcall_libraries['kernel32'].ReadFile
|
|
ReadFile.restype = BOOL
|
|
ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
|
|
|
|
CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
|
|
CloseHandle.restype = BOOL
|
|
CloseHandle.argtypes = [HANDLE]
|
|
|
|
ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
|
|
ClearCommBreak.restype = BOOL
|
|
ClearCommBreak.argtypes = [HANDLE]
|
|
|
|
LPCOMSTAT = POINTER(_COMSTAT)
|
|
|
|
ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
|
|
ClearCommError.restype = BOOL
|
|
ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
|
|
|
|
SetupComm = _stdcall_libraries['kernel32'].SetupComm
|
|
SetupComm.restype = BOOL
|
|
SetupComm.argtypes = [HANDLE, DWORD, DWORD]
|
|
|
|
EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
|
|
EscapeCommFunction.restype = BOOL
|
|
EscapeCommFunction.argtypes = [HANDLE, DWORD]
|
|
|
|
GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
|
|
GetCommModemStatus.restype = BOOL
|
|
GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
|
|
|
|
LPDCB = POINTER(_DCB)
|
|
|
|
GetCommState = _stdcall_libraries['kernel32'].GetCommState
|
|
GetCommState.restype = BOOL
|
|
GetCommState.argtypes = [HANDLE, LPDCB]
|
|
|
|
LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
|
|
|
|
GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
|
|
GetCommTimeouts.restype = BOOL
|
|
GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
|
|
|
|
PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
|
|
PurgeComm.restype = BOOL
|
|
PurgeComm.argtypes = [HANDLE, DWORD]
|
|
|
|
SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
|
|
SetCommBreak.restype = BOOL
|
|
SetCommBreak.argtypes = [HANDLE]
|
|
|
|
SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
|
|
SetCommMask.restype = BOOL
|
|
SetCommMask.argtypes = [HANDLE, DWORD]
|
|
|
|
SetCommState = _stdcall_libraries['kernel32'].SetCommState
|
|
SetCommState.restype = BOOL
|
|
SetCommState.argtypes = [HANDLE, LPDCB]
|
|
|
|
SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
|
|
SetCommTimeouts.restype = BOOL
|
|
SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
|
|
|
|
WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
|
|
WaitForSingleObject.restype = DWORD
|
|
WaitForSingleObject.argtypes = [HANDLE, DWORD]
|
|
|
|
WaitCommEvent = _stdcall_libraries['kernel32'].WaitCommEvent
|
|
WaitCommEvent.restype = BOOL
|
|
WaitCommEvent.argtypes = [HANDLE, LPDWORD, LPOVERLAPPED]
|
|
|
|
CancelIoEx = _stdcall_libraries['kernel32'].CancelIoEx
|
|
CancelIoEx.restype = BOOL
|
|
CancelIoEx.argtypes = [HANDLE, LPOVERLAPPED]
|
|
|
|
ONESTOPBIT = 0 # Variable c_int
|
|
TWOSTOPBITS = 2 # Variable c_int
|
|
ONE5STOPBITS = 1
|
|
|
|
NOPARITY = 0 # Variable c_int
|
|
ODDPARITY = 1 # Variable c_int
|
|
EVENPARITY = 2 # Variable c_int
|
|
MARKPARITY = 3
|
|
SPACEPARITY = 4
|
|
|
|
RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
|
|
RTS_CONTROL_DISABLE = 0 # Variable c_int
|
|
RTS_CONTROL_ENABLE = 1 # Variable c_int
|
|
RTS_CONTROL_TOGGLE = 3 # Variable c_int
|
|
SETRTS = 3
|
|
CLRRTS = 4
|
|
|
|
DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
|
|
DTR_CONTROL_DISABLE = 0 # Variable c_int
|
|
DTR_CONTROL_ENABLE = 1 # Variable c_int
|
|
SETDTR = 5
|
|
CLRDTR = 6
|
|
|
|
MS_DSR_ON = 32 # Variable c_ulong
|
|
EV_RING = 256 # Variable c_int
|
|
EV_PERR = 512 # Variable c_int
|
|
EV_ERR = 128 # Variable c_int
|
|
SETXOFF = 1 # Variable c_int
|
|
EV_RXCHAR = 1 # Variable c_int
|
|
GENERIC_WRITE = 1073741824 # Variable c_long
|
|
PURGE_TXCLEAR = 4 # Variable c_int
|
|
FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int
|
|
EV_DSR = 16 # Variable c_int
|
|
MAXDWORD = 4294967295 # Variable c_uint
|
|
EV_RLSD = 32 # Variable c_int
|
|
|
|
ERROR_SUCCESS = 0
|
|
ERROR_NOT_ENOUGH_MEMORY = 8
|
|
ERROR_OPERATION_ABORTED = 995
|
|
ERROR_IO_INCOMPLETE = 996
|
|
ERROR_IO_PENDING = 997 # Variable c_long
|
|
ERROR_INVALID_USER_BUFFER = 1784
|
|
|
|
MS_CTS_ON = 16 # Variable c_ulong
|
|
EV_EVENT1 = 2048 # Variable c_int
|
|
EV_RX80FULL = 1024 # Variable c_int
|
|
PURGE_RXABORT = 2 # Variable c_int
|
|
FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
|
|
PURGE_TXABORT = 1 # Variable c_int
|
|
SETXON = 2 # Variable c_int
|
|
OPEN_EXISTING = 3 # Variable c_int
|
|
MS_RING_ON = 64 # Variable c_ulong
|
|
EV_TXEMPTY = 4 # Variable c_int
|
|
EV_RXFLAG = 2 # Variable c_int
|
|
MS_RLSD_ON = 128 # Variable c_ulong
|
|
GENERIC_READ = 2147483648 # Variable c_ulong
|
|
EV_EVENT2 = 4096 # Variable c_int
|
|
EV_CTS = 8 # Variable c_int
|
|
EV_BREAK = 64 # Variable c_int
|
|
PURGE_RXCLEAR = 8 # Variable c_int
|
|
INFINITE = 0xFFFFFFFF
|
|
|
|
CE_RXOVER = 0x0001
|
|
CE_OVERRUN = 0x0002
|
|
CE_RXPARITY = 0x0004
|
|
CE_FRAME = 0x0008
|
|
CE_BREAK = 0x0010
|
|
|
|
|
|
class N11_OVERLAPPED4DOLLAR_48E(Union):
|
|
pass
|
|
|
|
|
|
class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
|
|
pass
|
|
|
|
|
|
N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
|
|
('Offset', DWORD),
|
|
('OffsetHigh', DWORD),
|
|
]
|
|
|
|
PVOID = c_void_p
|
|
|
|
N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
|
|
N11_OVERLAPPED4DOLLAR_48E._fields_ = [
|
|
('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
|
|
('Pointer', PVOID),
|
|
]
|
|
_OVERLAPPED._anonymous_ = ['_0']
|
|
_OVERLAPPED._fields_ = [
|
|
('Internal', ULONG_PTR),
|
|
('InternalHigh', ULONG_PTR),
|
|
('_0', N11_OVERLAPPED4DOLLAR_48E),
|
|
('hEvent', HANDLE),
|
|
]
|
|
_SECURITY_ATTRIBUTES._fields_ = [
|
|
('nLength', DWORD),
|
|
('lpSecurityDescriptor', LPVOID),
|
|
('bInheritHandle', BOOL),
|
|
]
|
|
_COMSTAT._fields_ = [
|
|
('fCtsHold', DWORD, 1),
|
|
('fDsrHold', DWORD, 1),
|
|
('fRlsdHold', DWORD, 1),
|
|
('fXoffHold', DWORD, 1),
|
|
('fXoffSent', DWORD, 1),
|
|
('fEof', DWORD, 1),
|
|
('fTxim', DWORD, 1),
|
|
('fReserved', DWORD, 25),
|
|
('cbInQue', DWORD),
|
|
('cbOutQue', DWORD),
|
|
]
|
|
_DCB._fields_ = [
|
|
('DCBlength', DWORD),
|
|
('BaudRate', DWORD),
|
|
('fBinary', DWORD, 1),
|
|
('fParity', DWORD, 1),
|
|
('fOutxCtsFlow', DWORD, 1),
|
|
('fOutxDsrFlow', DWORD, 1),
|
|
('fDtrControl', DWORD, 2),
|
|
('fDsrSensitivity', DWORD, 1),
|
|
('fTXContinueOnXoff', DWORD, 1),
|
|
('fOutX', DWORD, 1),
|
|
('fInX', DWORD, 1),
|
|
('fErrorChar', DWORD, 1),
|
|
('fNull', DWORD, 1),
|
|
('fRtsControl', DWORD, 2),
|
|
('fAbortOnError', DWORD, 1),
|
|
('fDummy2', DWORD, 17),
|
|
('wReserved', WORD),
|
|
('XonLim', WORD),
|
|
('XoffLim', WORD),
|
|
('ByteSize', BYTE),
|
|
('Parity', BYTE),
|
|
('StopBits', BYTE),
|
|
('XonChar', c_char),
|
|
('XoffChar', c_char),
|
|
('ErrorChar', c_char),
|
|
('EofChar', c_char),
|
|
('EvtChar', c_char),
|
|
('wReserved1', WORD),
|
|
]
|
|
_COMMTIMEOUTS._fields_ = [
|
|
('ReadIntervalTimeout', DWORD),
|
|
('ReadTotalTimeoutMultiplier', DWORD),
|
|
('ReadTotalTimeoutConstant', DWORD),
|
|
('WriteTotalTimeoutMultiplier', DWORD),
|
|
('WriteTotalTimeoutConstant', DWORD),
|
|
]
|
|
__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
|
|
'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
|
|
'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
|
|
'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
|
|
'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
|
|
'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
|
|
'_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
|
|
'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
|
|
'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
|
|
'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
|
|
'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
|
|
'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
|
|
'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
|
|
'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
|
|
'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
|
|
'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
|
|
'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
|
|
'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
|
|
'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
|
|
'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
|
|
'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
|
|
'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
|
|
'MS_DSR_ON', 'MS_RING_ON',
|
|
'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
|
|
'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']
|