@@ -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