conson-xp 0.11.21__py3-none-any.whl → 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,137 +1,174 @@
1
- """Conbus Client Send Service for TCP communication with Conbus servers.
1
+ """Conbus Output Service for sending action telegrams to Conbus modules.
2
2
 
3
- This service implements a TCP client that connects to Conbus servers and sends
4
- various types of telegrams including discover, version, and sensor data requests.
3
+ This service handles sending action telegrams (ON/OFF) to module outputs
4
+ and processing ACK/NAK responses.
5
5
  """
6
6
 
7
7
  import logging
8
8
  from datetime import datetime
9
- from typing import Any, Optional
9
+ from typing import Callable, Optional
10
10
 
11
- from xp.models import ConbusDatapointResponse
11
+ from twisted.internet.posixbase import PosixReactorBase
12
+
13
+ from xp.models import ConbusClientConfig
12
14
  from xp.models.conbus.conbus_output import ConbusOutputResponse
15
+ from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
13
16
  from xp.models.telegram.action_type import ActionType
14
- from xp.models.telegram.datapoint_type import DataPointType
17
+ from xp.models.telegram.output_telegram import OutputTelegram
15
18
  from xp.models.telegram.system_function import SystemFunction
16
- from xp.services.conbus.conbus_datapoint_service import ConbusDatapointService
17
- from xp.services.conbus.conbus_service import ConbusService
18
- from xp.services.telegram.telegram_output_service import TelegramOutputService
19
- from xp.services.telegram.telegram_service import TelegramService
19
+ from xp.models.telegram.telegram_type import TelegramType
20
+ from xp.services.protocol import ConbusProtocol
21
+ from xp.services.telegram.telegram_output_service import (
22
+ TelegramOutputService,
23
+ XPOutputError,
24
+ )
20
25
 
21
26
 
22
27
  class ConbusOutputError(Exception):
23
- """Raised when Conbus client send operations fail"""
28
+ """Raised when Conbus output operations fail"""
24
29
 
25
30
  pass
26
31
 
27
32
 
28
- class ConbusOutputService:
33
+ class ConbusOutputService(ConbusProtocol):
29
34
  """
30
- TCP client service for sending telegrams to Conbus servers.
35
+ Service for sending action telegrams to Conbus module outputs.
31
36
 
32
- Manages TCP socket connections, handles telegram generation and transmission,
33
- and processes server responses.
37
+ Manages action telegram transmission (ON/OFF) and processes
38
+ ACK/NAK responses from modules.
34
39
  """
35
40
 
36
41
  def __init__(
37
42
  self,
38
- telegram_service: TelegramService,
39
43
  telegram_output_service: TelegramOutputService,
40
- datapoint_service: ConbusDatapointService,
41
- conbus_service: ConbusService,
44
+ cli_config: ConbusClientConfig,
45
+ reactor: PosixReactorBase,
42
46
  ):
43
- """Initialize the Conbus client send service
47
+ """Initialize the Conbus output service
44
48
 
45
49
  Args:
46
- telegram_service: TelegramService for dependency injection
47
- telegram_output_service: TelegramOutputService for dependency injection
48
- datapoint_service: ConbusDatapointService for dependency injection
49
- conbus_service: ConbusService for dependency injection
50
+ telegram_output_service: TelegramOutputService for telegram generation/parsing
51
+ cli_config: Conbus client configuration
52
+ reactor: Twisted reactor for async operations
50
53
  """
51
-
52
- # Service dependencies
53
- self.telegram_service = telegram_service
54
+ super().__init__(cli_config, reactor)
54
55
  self.telegram_output_service = telegram_output_service
55
- self.datapoint_service = datapoint_service
56
- self.conbus_service = conbus_service
56
+ self.serial_number: str = ""
57
+ self.output_number: int = 0
58
+ self.action_type: ActionType = ActionType.ON_RELEASE
59
+ self.finish_callback: Optional[Callable[[ConbusOutputResponse], None]] = None
60
+ self.service_response: ConbusOutputResponse = ConbusOutputResponse(
61
+ success=False,
62
+ serial_number=self.serial_number,
63
+ output_number=self.output_number,
64
+ action_type=self.action_type,
65
+ timestamp=datetime.now(),
66
+ )
57
67
 
58
68
  # Set up logging
59
69
  self.logger = logging.getLogger(__name__)
60
70
 
61
- def __enter__(self) -> "ConbusOutputService":
62
- return self
63
-
64
- def __exit__(
65
- self,
66
- _exc_type: Optional[type],
67
- _exc_val: Optional[Exception],
68
- _exc_tb: Optional[Any],
69
- ) -> None:
70
- # Cleanup logic if needed
71
- pass
72
-
73
- def get_output_state(self, serial_number: str) -> ConbusDatapointResponse:
74
- # TODO: Migrate to new ConbusDatapointService callback-based API
75
- # Send status query using custom telegram method
76
- response = self.datapoint_service.query_datapoint( # type: ignore[call-arg,func-returns-value]
77
- serial_number=serial_number,
78
- datapoint_type=DataPointType.MODULE_OUTPUT_STATE, # "12"
71
+ def connection_established(self) -> None:
72
+ self.logger.debug(
73
+ f"Connection established, sending action {self.action_type} to output {self.output_number}..."
79
74
  )
80
75
 
81
- return response # type: ignore[no-any-return]
82
-
83
- def get_module_state(self, serial_number: str) -> ConbusDatapointResponse:
84
- # TODO: Migrate to new ConbusDatapointService callback-based API
85
- # Send status query using custom telegram method
86
- response = self.datapoint_service.query_datapoint( # type: ignore[call-arg,func-returns-value]
87
- serial_number=serial_number, datapoint_type=DataPointType.MODULE_STATE
76
+ # Validate parameters before sending
77
+ try:
78
+ self.telegram_output_service.validate_output_number(self.output_number)
79
+ self.telegram_output_service.validate_serial_number(self.serial_number)
80
+ except XPOutputError as e:
81
+ self.failed(str(e))
82
+ return
83
+
84
+ # Send F27D{output:02d}{action} telegram
85
+ # F27 = ACTION, D = data with output number and action type
86
+ self.send_telegram(
87
+ telegram_type=TelegramType.SYSTEM,
88
+ serial_number=self.serial_number,
89
+ system_function=SystemFunction.ACTION,
90
+ data_value=f"{self.output_number:02d}{self.action_type.value}",
88
91
  )
89
92
 
90
- return response # type: ignore[no-any-return]
93
+ def telegram_sent(self, telegram_sent: str) -> None:
94
+ self.service_response.sent_telegram = telegram_sent
91
95
 
92
- def send_action(
93
- self, serial_number: str, output_number: int, action_type: ActionType
94
- ) -> ConbusOutputResponse:
96
+ def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
97
+ self.logger.debug(f"Telegram received: {telegram_received}")
95
98
 
96
- # Parse input number and send action
97
- self.telegram_output_service.validate_output_number(output_number)
99
+ if not self.service_response.received_telegrams:
100
+ self.service_response.received_telegrams = []
101
+ self.service_response.received_telegrams.append(telegram_received.frame)
98
102
 
99
- # Send action telegram using custom telegram method
100
- # Format: F27D{input:02d}AA (Function 27, input number, PRESS action)
101
- action_value = action_type.value
103
+ if (
104
+ not telegram_received.checksum_valid
105
+ or telegram_received.telegram_type != TelegramType.REPLY
106
+ or telegram_received.serial_number != self.serial_number
107
+ ):
108
+ self.logger.debug("Not a reply for our serial number")
109
+ return
102
110
 
103
- input_action = f"{output_number:02d}{action_value}"
104
- response = self.conbus_service.send_telegram(
105
- serial_number,
106
- SystemFunction.ACTION, # "27"
107
- input_action, # "00AA", "01AA", etc.
111
+ # Parse the reply telegram to get ACK/NAK
112
+ output_telegram = self.telegram_output_service.parse_reply_telegram(
113
+ telegram_received.frame
108
114
  )
109
115
 
110
- if (
111
- not response.success
112
- or response.received_telegrams is None
113
- or len(response.received_telegrams) <= 0
116
+ if output_telegram and output_telegram.system_function in (
117
+ SystemFunction.ACK,
118
+ SystemFunction.NAK,
114
119
  ):
115
-
116
- return ConbusOutputResponse(
117
- success=response.success,
118
- serial_number=serial_number,
119
- output_number=output_number,
120
- action_type=action_type,
121
- error=response.error,
122
- timestamp=response.timestamp or datetime.now(),
123
- received_telegrams=response.received_telegrams,
120
+ self.logger.debug(f"Received {output_telegram.system_function} response")
121
+ self.succeed(output_telegram)
122
+ else:
123
+ self.logger.debug(
124
+ f"Unexpected system function: {output_telegram.system_function}"
124
125
  )
125
126
 
126
- telegram = response.received_telegrams[0]
127
- output_telegram = self.telegram_output_service.parse_reply_telegram(telegram)
128
-
129
- return ConbusOutputResponse(
130
- success=response.success,
131
- serial_number=serial_number,
132
- output_number=output_number,
133
- action_type=action_type,
134
- output_telegram=output_telegram,
135
- timestamp=response.timestamp or datetime.now(),
136
- received_telegrams=response.received_telegrams,
137
- )
127
+ def succeed(self, output_telegram: OutputTelegram) -> None:
128
+ self.logger.debug("Successfully sent action to output")
129
+ self.service_response.success = True
130
+ self.service_response.timestamp = datetime.now()
131
+ self.service_response.serial_number = self.serial_number
132
+ self.service_response.output_number = self.output_number
133
+ self.service_response.action_type = self.action_type
134
+ self.service_response.output_telegram = output_telegram
135
+ if self.finish_callback:
136
+ self.finish_callback(self.service_response)
137
+
138
+ def failed(self, message: str) -> None:
139
+ self.logger.debug(f"Failed with message: {message}")
140
+ self.service_response.success = False
141
+ self.service_response.timestamp = datetime.now()
142
+ self.service_response.serial_number = self.serial_number
143
+ self.service_response.output_number = self.output_number
144
+ self.service_response.action_type = self.action_type
145
+ self.service_response.error = message
146
+ if self.finish_callback:
147
+ self.finish_callback(self.service_response)
148
+
149
+ def send_action(
150
+ self,
151
+ serial_number: str,
152
+ output_number: int,
153
+ action_type: ActionType,
154
+ finish_callback: Callable[[ConbusOutputResponse], None],
155
+ timeout_seconds: Optional[float] = None,
156
+ ) -> None:
157
+ """
158
+ Send an action telegram to a module output.
159
+
160
+ Args:
161
+ serial_number: 10-digit module serial number
162
+ output_number: Output number (0-99)
163
+ action_type: Action to perform (ON_RELEASE, OFF_PRESS, etc.)
164
+ finish_callback: Callback function to call when operation completes
165
+ timeout_seconds: Optional timeout in seconds
166
+ """
167
+ self.logger.info("Starting send_action")
168
+ if timeout_seconds:
169
+ self.timeout_seconds = timeout_seconds
170
+ self.serial_number = serial_number
171
+ self.output_number = output_number
172
+ self.action_type = action_type
173
+ self.finish_callback = finish_callback
174
+ self.start_reactor()
@@ -5,124 +5,120 @@ various types of telegrams including discover, version, and sensor data requests
5
5
  """
6
6
 
7
7
  import logging
8
- import threading
9
- from typing import Any, Callable, List, Optional
8
+ from datetime import datetime
9
+ from typing import Callable, Optional
10
+
11
+ from twisted.internet.posixbase import PosixReactorBase
10
12
 
11
13
  from xp.models import (
12
- ConbusRequest,
14
+ ConbusClientConfig,
13
15
  ConbusResponse,
14
16
  )
15
- from xp.services.conbus.conbus_service import ConbusService
16
- from xp.services.telegram.telegram_service import TelegramService
17
-
18
-
19
- class ConbusScanError(Exception):
20
- """Raised when Conbus client send operations fail"""
17
+ from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
18
+ from xp.services.protocol import ConbusProtocol
21
19
 
22
- pass
23
20
 
24
-
25
- class ConbusScanService:
21
+ class ConbusScanService(ConbusProtocol):
26
22
  """
27
- TCP client service for sending telegrams to Conbus servers.
23
+ Service for querying datapoints from Conbus modules.
28
24
 
29
- Manages TCP socket connections, handles telegram generation and transmission,
30
- and processes server responses.
25
+ Uses ConbusProtocol to provide datapoint query functionality
26
+ for reading sensor data and module information.
31
27
  """
32
28
 
33
29
  def __init__(
34
30
  self,
35
- telegram_service: TelegramService,
36
- conbus_service: ConbusService,
37
- ):
38
- """Initialize the Conbus client send service
39
-
40
- Args:
41
- telegram_service: TelegramService for dependency injection
42
- conbus_service: ConbusService for dependency injection
43
- """
44
-
45
- # Service dependencies
46
- self.telegram_service = telegram_service
47
- self.conbus_service = conbus_service
48
-
31
+ cli_config: ConbusClientConfig,
32
+ reactor: PosixReactorBase,
33
+ ) -> None:
34
+ """Initialize the Conbus datapoint service"""
35
+ super().__init__(cli_config, reactor)
36
+ self.serial_number: str = ""
37
+ self.function_code: str = ""
38
+ self.datapoint_value: int = -1
39
+ self.progress_callback: Optional[Callable[[str], None]] = None
40
+ self.finish_callback: Optional[Callable[[ConbusResponse], None]] = None
41
+ self.service_response: ConbusResponse = ConbusResponse(
42
+ success=False,
43
+ serial_number=self.serial_number,
44
+ sent_telegrams=[],
45
+ received_telegrams=[],
46
+ timestamp=datetime.now(),
47
+ )
49
48
  # Set up logging
50
49
  self.logger = logging.getLogger(__name__)
51
50
 
51
+ def connection_established(self) -> None:
52
+ self.logger.debug("Connection established, starting scan")
53
+ self.scan_next_datacode()
54
+
55
+ def scan_next_datacode(self) -> bool:
56
+ self.datapoint_value += 1
57
+ if self.datapoint_value >= 100:
58
+ if self.finish_callback:
59
+ self.finish_callback(self.service_response)
60
+ return False
61
+
62
+ self.logger.debug(f"Scanning next datacode: {self.datapoint_value:02d}")
63
+ data = f"{self.datapoint_value:02d}"
64
+ telegram_body = f"S{self.serial_number}F{self.function_code}D{data}"
65
+ self.sendFrame(telegram_body.encode())
66
+ return True
67
+
68
+ def telegram_sent(self, telegram_sent: str) -> None:
69
+ self.service_response.success = True
70
+ self.service_response.sent_telegrams.append(telegram_sent)
71
+
72
+ def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
73
+ self.logger.debug(f"Telegram received: {telegram_received}")
74
+ if not self.service_response.received_telegrams:
75
+ self.service_response.received_telegrams = []
76
+ self.service_response.received_telegrams.append(telegram_received.frame)
77
+
78
+ if self.progress_callback:
79
+ self.progress_callback(telegram_received.frame)
80
+
81
+ def timeout(self) -> bool:
82
+ self.logger.debug(f"Timeout: {self.timeout_seconds}s")
83
+ continue_scan = self.scan_next_datacode()
84
+ return continue_scan
85
+
86
+ def failed(self, message: str) -> None:
87
+ self.logger.debug(f"Failed with message: {message}")
88
+ self.service_response.success = False
89
+ self.service_response.timestamp = datetime.now()
90
+ self.service_response.error = message
91
+ if self.finish_callback:
92
+ self.finish_callback(self.service_response)
93
+
52
94
  def scan_module(
53
95
  self,
54
96
  serial_number: str,
55
97
  function_code: str,
56
- progress_callback: Optional[Callable[[ConbusResponse, int, int], Any]] = None,
57
- ) -> List[ConbusResponse]:
58
- """Scan all functions and datapoints for a module with live output"""
59
- results = []
60
- total_combinations = 100 # 65536 combinations
61
- count = 0
62
-
63
- for datapoint_hex in range(99):
64
- data = f"{datapoint_hex:02d}"
65
- count += 1
66
-
67
- try:
68
- telegram_body = f"S{serial_number}F{function_code}D{data}"
69
- response = self.conbus_service.send_telegram_body(telegram_body)
70
- results.append(response)
71
-
72
- # Call progress callback with live results
73
- if progress_callback:
74
- progress_callback(response, count, total_combinations)
75
-
76
- # Small delay to prevent overwhelming the server
77
- import time
78
-
79
- time.sleep(0.001) # 1ms delay
80
-
81
- except Exception as e:
82
- # Create error response for failed scan attempt
83
- error_response = ConbusResponse(
84
- success=False,
85
- request=ConbusRequest(
86
- serial_number=serial_number,
87
- function_code=function_code,
88
- data=data,
89
- ),
90
- error=f"Scan failed for F{function_code}D{data}: {e}",
91
- )
92
- results.append(error_response)
93
-
94
- # Call progress callback with error response
95
- if progress_callback:
96
- progress_callback(error_response, count, total_combinations)
97
-
98
- return results
99
-
100
- def scan_module_background(
101
- self,
102
- serial_number: str,
103
- function_code: str,
104
- progress_callback: Optional[Callable[[ConbusResponse, int, int], Any]] = None,
105
- ) -> threading.Thread:
106
- """Scan module in background with immediate output via callback"""
107
- import threading
108
-
109
- def background_scan() -> List[ConbusResponse]:
110
- return self.scan_module(serial_number, function_code, progress_callback)
111
-
112
- # Start background thread
113
- scan_thread = threading.Thread(target=background_scan, daemon=True)
114
- scan_thread.start()
98
+ progress_callback: Callable[[str], None],
99
+ finish_callback: Callable[[ConbusResponse], None],
100
+ timeout_seconds: Optional[float] = None,
101
+ ) -> None:
102
+ """
103
+ Query a specific datapoint from a module.
115
104
 
116
- return scan_thread
105
+ Args:
106
+ serial_number: 10-digit module serial number
107
+ function_code: the function code to scan
108
+ progress_callback: callback to handle progress
109
+ finish_callback: callback function to call when the datapoint is received
110
+ timeout_seconds: timeout in seconds
111
+
112
+ Returns:
113
+ ConbusDatapointResponse with operation result and datapoint value
114
+ """
117
115
 
118
- def __enter__(self) -> "ConbusScanService":
119
- return self
116
+ self.logger.info("Starting query_datapoint")
117
+ if timeout_seconds:
118
+ self.timeout_seconds = timeout_seconds
120
119
 
121
- def __exit__(
122
- self,
123
- _exc_type: Optional[type],
124
- _exc_val: Optional[BaseException],
125
- _exc_tb: Optional[Any],
126
- ) -> None:
127
- # Cleanup logic if needed
128
- pass
120
+ self.serial_number = serial_number
121
+ self.function_code = function_code
122
+ self.progress_callback = progress_callback
123
+ self.finish_callback = finish_callback
124
+ self.start_reactor()
@@ -75,7 +75,7 @@ class ConbusProtocol(protocol.Protocol, protocol.ClientFactory):
75
75
  )
76
76
 
77
77
  self.logger.debug(
78
- f"frameReceived payload: {payload.decode()}, checksum: {checksum}"
78
+ f"frameReceived payload: {payload.decode('latin-1')}, checksum: {checksum}"
79
79
  )
80
80
 
81
81
  # Reset timeout on activity
@@ -83,9 +83,9 @@ class ConbusProtocol(protocol.Protocol, protocol.ClientFactory):
83
83
 
84
84
  telegram_received = TelegramReceivedEvent(
85
85
  protocol=self,
86
- frame=frame.decode(),
87
- telegram=telegram.decode(),
88
- payload=payload.decode(),
86
+ frame=frame.decode("latin-1"),
87
+ telegram=telegram.decode("latin-1"),
88
+ payload=payload.decode("latin-1"),
89
89
  telegram_type=telegram_type,
90
90
  serial_number=serial_number,
91
91
  checksum=checksum,
@@ -112,6 +112,7 @@ class ConbusProtocol(protocol.Protocol, protocol.ClientFactory):
112
112
  self.logger.debug(f"Sending frame: {frame.decode()}")
113
113
  self.transport.write(frame) # type: ignore
114
114
  self.telegram_sent(frame.decode())
115
+ self._reset_timeout()
115
116
 
116
117
  def send_telegram(
117
118
  self,
@@ -145,6 +146,7 @@ class ConbusProtocol(protocol.Protocol, protocol.ClientFactory):
145
146
  self._stop_reactor()
146
147
 
147
148
  def timeout(self) -> bool:
149
+ """Timeout callback, return True to continue waiting for next timeout, False to stop"""
148
150
  self.logger.info("Timeout after: %ss", self.timeout_seconds)
149
151
  self.failed(f"Timeout after: {self.timeout_seconds}s")
150
152
  return False
xp/utils/dependencies.py CHANGED
@@ -25,10 +25,6 @@ from xp.services.conbus.conbus_autoreport_get_service import ConbusAutoreportGet
25
25
  from xp.services.conbus.conbus_autoreport_set_service import ConbusAutoreportSetService
26
26
  from xp.services.conbus.conbus_blink_all_service import ConbusBlinkAllService
27
27
  from xp.services.conbus.conbus_blink_service import ConbusBlinkService
28
- from xp.services.conbus.conbus_connection_pool import (
29
- ConbusConnectionPool,
30
- ConbusSocketConnectionManager,
31
- )
32
28
  from xp.services.conbus.conbus_custom_service import ConbusCustomService
33
29
  from xp.services.conbus.conbus_datapoint_queryall_service import (
34
30
  ConbusDatapointQueryAllService,
@@ -38,12 +34,12 @@ from xp.services.conbus.conbus_datapoint_service import (
38
34
  )
39
35
  from xp.services.conbus.conbus_discover_service import ConbusDiscoverService
40
36
  from xp.services.conbus.conbus_lightlevel_set_service import ConbusLightlevelSetService
41
- from xp.services.conbus.conbus_linknumber_service import ConbusLinknumberService
37
+ from xp.services.conbus.conbus_linknumber_get_service import ConbusLinknumberGetService
38
+ from xp.services.conbus.conbus_linknumber_set_service import ConbusLinknumberSetService
42
39
  from xp.services.conbus.conbus_output_service import ConbusOutputService
43
40
  from xp.services.conbus.conbus_raw_service import ConbusRawService
44
41
  from xp.services.conbus.conbus_receive_service import ConbusReceiveService
45
42
  from xp.services.conbus.conbus_scan_service import ConbusScanService
46
- from xp.services.conbus.conbus_service import ConbusService
47
43
  from xp.services.homekit.homekit_cache_service import HomeKitCacheService
48
44
  from xp.services.homekit.homekit_conbus_service import HomeKitConbusService
49
45
  from xp.services.homekit.homekit_dimminglight_service import HomeKitDimmingLightService
@@ -106,30 +102,13 @@ class ServiceContainer:
106
102
  def _register_services(self) -> None:
107
103
  """Register all services in the container based on dependency graph."""
108
104
 
109
- # ConbusClientConfig (needed by ConbusConnectionPool)
105
+ # ConbusClientConfig
110
106
  self.container.register(
111
107
  ConbusClientConfig,
112
108
  factory=lambda: ConbusClientConfig.from_yaml(self._config_path),
113
109
  scope=punq.Scope.singleton,
114
110
  )
115
111
 
116
- # Core infrastructure layer - ConbusConnectionPool (singleton)
117
- self.container.register(
118
- ConbusSocketConnectionManager,
119
- factory=lambda: ConbusSocketConnectionManager(
120
- cli_config=self.container.resolve(ConbusClientConfig)
121
- ),
122
- scope=punq.Scope.singleton,
123
- )
124
-
125
- self.container.register(
126
- ConbusConnectionPool,
127
- factory=lambda: ConbusConnectionPool(
128
- connection_manager=self.container.resolve(ConbusSocketConnectionManager)
129
- ),
130
- scope=punq.Scope.singleton,
131
- )
132
-
133
112
  # Telegram services layer
134
113
  self.container.register(TelegramService, scope=punq.Scope.singleton)
135
114
  self.container.register(
@@ -143,16 +122,6 @@ class ServiceContainer:
143
122
  self.container.register(TelegramBlinkService, scope=punq.Scope.singleton)
144
123
  self.container.register(LinkNumberService, scope=punq.Scope.singleton)
145
124
 
146
- # ConbusService - depends on ConbusConnectionPool
147
- self.container.register(
148
- ConbusService,
149
- factory=lambda: ConbusService(
150
- client_config=self.container.resolve(ConbusClientConfig),
151
- connection_pool=self.container.resolve(ConbusConnectionPool),
152
- ),
153
- scope=punq.Scope.singleton,
154
- )
155
-
156
125
  # Conbus services layer
157
126
  self.container.register(
158
127
  ConbusDatapointService,
@@ -177,8 +146,8 @@ class ServiceContainer:
177
146
  self.container.register(
178
147
  ConbusScanService,
179
148
  factory=lambda: ConbusScanService(
180
- telegram_service=self.container.resolve(TelegramService),
181
- conbus_service=self.container.resolve(ConbusService),
149
+ cli_config=self.container.resolve(ConbusClientConfig),
150
+ reactor=self.container.resolve(PosixReactorBase),
182
151
  ),
183
152
  scope=punq.Scope.singleton,
184
153
  )
@@ -215,10 +184,9 @@ class ServiceContainer:
215
184
  self.container.register(
216
185
  ConbusOutputService,
217
186
  factory=lambda: ConbusOutputService(
218
- telegram_service=self.container.resolve(TelegramService),
219
187
  telegram_output_service=self.container.resolve(TelegramOutputService),
220
- datapoint_service=self.container.resolve(ConbusDatapointService),
221
- conbus_service=self.container.resolve(ConbusService),
188
+ cli_config=self.container.resolve(ConbusClientConfig),
189
+ reactor=self.container.resolve(PosixReactorBase),
222
190
  ),
223
191
  scope=punq.Scope.singleton,
224
192
  )
@@ -300,12 +268,21 @@ class ServiceContainer:
300
268
  )
301
269
 
302
270
  self.container.register(
303
- ConbusLinknumberService,
304
- factory=lambda: ConbusLinknumberService(
305
- conbus_service=self.container.resolve(ConbusService),
306
- datapoint_service=self.container.resolve(ConbusDatapointService),
307
- link_number_service=self.container.resolve(LinkNumberService),
271
+ ConbusLinknumberGetService,
272
+ factory=lambda: ConbusLinknumberGetService(
273
+ telegram_service=self.container.resolve(TelegramService),
274
+ cli_config=self.container.resolve(ConbusClientConfig),
275
+ reactor=self.container.resolve(PosixReactorBase),
276
+ ),
277
+ scope=punq.Scope.singleton,
278
+ )
279
+
280
+ self.container.register(
281
+ ConbusLinknumberSetService,
282
+ factory=lambda: ConbusLinknumberSetService(
308
283
  telegram_service=self.container.resolve(TelegramService),
284
+ cli_config=self.container.resolve(ConbusClientConfig),
285
+ reactor=self.container.resolve(PosixReactorBase),
309
286
  ),
310
287
  scope=punq.Scope.singleton,
311
288
  )