Skip to content

Commit 5a89a99

Browse files
committed
Switched to a factory-based implemenation
1 parent 4f4ec32 commit 5a89a99

File tree

7 files changed

+2261
-2069
lines changed

7 files changed

+2261
-2069
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ l.write(parameters)
107107

108108
# If you're not sure what values to write, you can get all available options:
109109

110-
print(parameters.get("ID_Ba_Hz_akt").options) # returns a list of possible values to write, ['Automatic', 'Second heatsource', 'Party', 'Holidays', 'Off'] for example
110+
print(parameters.get("ID_Ba_Hz_akt").options()) # returns a list of possible values to write, ['Automatic', 'Second heatsource', 'Party', 'Holidays', 'Off'] for example
111111
```
112112

113113
**NOTE:** Writing values to the heat pump is particulary dangerous as this is

luxtronik/__init__.py

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from luxtronik.calculations import Calculations
1313
from luxtronik.parameters import Parameters
1414
from luxtronik.visibilities import Visibilities
15+
from luxtronik.datatypes import Base
1516
from luxtronik.discover import discover # noqa: F401
1617

1718
# endregion Imports
@@ -51,7 +52,6 @@ def __init__(self, host, port=8889, safe=True):
5152
self._port = port
5253
self._safe = safe
5354
self._socket = None
54-
self.read()
5555

5656
def __del__(self):
5757
if self._socket is not None:
@@ -62,15 +62,17 @@ def __del__(self):
6262
"Disconnected from Luxtronik heatpump %s:%s", self._host, self._port
6363
)
6464

65-
def read(self):
65+
def read(self) -> (Calculations, Parameters, Visibilities):
6666
"""Read data from heatpump."""
6767
return self._read_after_write(parameters=None)
6868

69-
def write(self, parameters):
69+
def write(self, parameters: Parameters) -> (Calculations, Parameters, Visibilities):
7070
"""Write parameter to heatpump."""
7171
return self._read_after_write(parameters=parameters)
7272

73-
def _read_after_write(self, parameters):
73+
def _read_after_write(
74+
self, parameters: Parameters
75+
) -> (Calculations, Parameters, Visibilities):
7476
"""
7577
Read and/or write value from and/or to heatpump.
7678
This method is essentially a wrapper for the _read() and _write()
@@ -100,32 +102,44 @@ def _read_after_write(self, parameters):
100102
return self._write(parameters)
101103
return self._read()
102104

103-
def _read(self):
105+
def _read(self) -> (Calculations, Parameters, Visibilities):
104106
parameters = self._read_parameters()
105107
calculations = self._read_calculations()
106108
visibilities = self._read_visibilities()
107109
return calculations, parameters, visibilities
108110

109-
def _write(self, parameters):
110-
for index, value in parameters.queue.items():
111-
if not isinstance(index, int) or not isinstance(value, int):
111+
def _write(
112+
self, parameters: Parameters
113+
) -> (Calculations, Parameters, Visibilities):
114+
for index, param in parameters:
115+
if not isinstance(index, int) or not isinstance(param, Base):
112116
LOGGER.warning(
113117
"%s: Parameter id '%s' or value '%s' invalid!",
114118
self._host,
115119
index,
116-
value,
120+
param,
117121
)
118122
continue
119-
LOGGER.info("%s: Parameter '%d' set to '%s'", self._host, index, value)
120-
data = struct.pack(">iii", 3002, index, value)
123+
if not param.writeable and self._safe:
124+
LOGGER.warning(
125+
"%s: Parameter '%s' not safe for writing!", self._host, param.name
126+
)
127+
continue
128+
heatpump_value = param.raw
129+
LOGGER.info(
130+
"%s: Parameter '%d' set to '%s' = '%s'",
131+
self._host,
132+
index,
133+
param.value,
134+
heatpump_value,
135+
)
136+
data = struct.pack(">iii", 3002, index, heatpump_value)
121137
LOGGER.debug("%s: Data %s", self._host, data)
122138
self._socket.sendall(data)
123139
cmd = struct.unpack(">i", self._socket.recv(4))[0]
124140
LOGGER.debug("%s: Command %s", self._host, cmd)
125141
val = struct.unpack(">i", self._socket.recv(4))[0]
126142
LOGGER.debug("%s: Value %s", self._host, val)
127-
# Flush queue after writing all values
128-
parameters.queue = {}
129143
# Give the heatpump a short time to handle the value changes/calculations:
130144
time.sleep(WAIT_TIME_AFTER_PARAMETER_WRITE)
131145
# Read the new values based on our parameter changes:
@@ -145,7 +159,7 @@ def _read_parameters(self):
145159
# not logging this as error as it would be logged on every read cycle
146160
LOGGER.debug("%s: %s", self._host, err)
147161
LOGGER.info("%s: Read %d parameters", self._host, length)
148-
parameters = Parameters(safe=self._safe)
162+
parameters = Parameters()
149163
parameters.parse(data)
150164
return parameters
151165

0 commit comments

Comments
 (0)