Skip to content

Commit 2cbd44a

Browse files
committed
issue-130: Added a connect decorator for read/write functions
1 parent 653f8a5 commit 2cbd44a

File tree

1 file changed

+51
-30
lines changed

1 file changed

+51
-30
lines changed

luxtronik/__init__.py

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -74,43 +74,64 @@ def __del__(self):
7474
"Disconnected from Luxtronik heatpump %s:%s", self._host, self._port
7575
)
7676

77-
def read(self):
78-
"""Read data from heatpump."""
79-
return self._read_after_write(parameters=None)
80-
81-
def write(self, parameters):
82-
"""Write parameter to heatpump."""
83-
return self._read_after_write(parameters=parameters)
84-
85-
def _read_after_write(self, parameters):
77+
def _lock_and_connect(self, func):
8678
"""
87-
Read and/or write value from and/or to heatpump.
88-
This method is essentially a wrapper for the _read() and _write()
89-
methods.
79+
Decorator around various read/write functions to connect first.
80+
81+
This method is essentially a wrapper for the _read() and _write() methods.
9082
Locking is being used to ensure that only a single socket operation is
9183
performed at any point in time. This helps to avoid issues with the
9284
Luxtronik controller, which seems unstable otherwise.
93-
If write is true, all parameters will be written to the heat pump
94-
prior to reading back in all data from the heat pump. If write is
95-
false, no data will be written, but all available data will be read
96-
from the heat pump.
85+
"""
86+
87+
def inner(*args, **kwargs):
88+
with self._lock:
89+
is_none = self._socket is None
90+
if is_none:
91+
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
92+
if is_none or is_socket_closed(self._socket):
93+
self._socket.connect((self._host, self._port))
94+
LOGGER.info(
95+
"Connected to Luxtronik heat pump %s:%s", self._host, self._port
96+
)
97+
return func(*args, **kwargs)
98+
99+
return inner
100+
101+
def read(self):
102+
"""
103+
Read data from heat pump.
104+
All available data will be read from the heat pump.
105+
"""
106+
decorated_read = self._lock_and_connect(self._read)
107+
return decorated_read()
108+
109+
def read_parameters(self):
110+
"""Read parameters from heat pump."""
111+
decorated_read = self._lock_and_connect(self._read_parameters)
112+
return decorated_read()
113+
114+
def read_calculations(self):
115+
"""Read calculations from heat pump."""
116+
decorated_read = self._lock_and_connect(self._read_calculations)
117+
return decorated_read()
118+
119+
def read_visibilities(self):
120+
"""Read visibilities from heat pump."""
121+
decorated_read = self._lock_and_connect(self._read_visibilities)
122+
return decorated_read()
123+
124+
def write(self, parameters):
125+
"""
126+
Write parameter to heat pump.
127+
All parameters will be written to the heat pump
128+
prior to reading back in all data from the heat pump.
97129
:param Parameters() parameters Parameter dictionary to be written
98130
to the heatpump before reading all available data
99-
from the heatpump. At 'None' it is read only.
131+
from the heat pump.
100132
"""
101-
102-
with self._lock:
103-
is_none = self._socket is None
104-
if is_none:
105-
self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
106-
if is_none or is_socket_closed(self._socket):
107-
self._socket.connect((self._host, self._port))
108-
LOGGER.info(
109-
"Connected to Luxtronik heatpump %s:%s", self._host, self._port
110-
)
111-
if parameters is not None:
112-
return self._write(parameters)
113-
return self._read()
133+
decorated_write = self._lock_and_connect(self._write)
134+
return decorated_write(parameters)
114135

115136
def _read(self):
116137
parameters = self._read_parameters()

0 commit comments

Comments
 (0)