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.
@@ -4,22 +4,18 @@ This service handles auto report status operations for modules through Conbus te
4
4
  """
5
5
 
6
6
  import logging
7
- from datetime import datetime
8
7
  from typing import Callable, Optional
9
8
 
10
9
  from twisted.internet.posixbase import PosixReactorBase
11
10
 
12
- from xp.models import ConbusClientConfig
11
+ from xp.models import ConbusClientConfig, ConbusDatapointResponse
13
12
  from xp.models.conbus.conbus_autoreport import ConbusAutoreportResponse
14
- from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
15
13
  from xp.models.telegram.datapoint_type import DataPointType
16
- from xp.models.telegram.system_function import SystemFunction
17
- from xp.models.telegram.telegram_type import TelegramType
18
- from xp.services.protocol import ConbusProtocol
14
+ from xp.services.conbus.conbus_datapoint_service import ConbusDatapointService
19
15
  from xp.services.telegram.telegram_service import TelegramService
20
16
 
21
17
 
22
- class ConbusAutoreportGetService(ConbusProtocol):
18
+ class ConbusAutoreportGetService(ConbusDatapointService):
23
19
  """
24
20
  Service for receiving telegrams from Conbus servers.
25
21
 
@@ -34,78 +30,35 @@ class ConbusAutoreportGetService(ConbusProtocol):
34
30
  reactor: PosixReactorBase,
35
31
  ) -> None:
36
32
  """Initialize the Conbus client send service"""
37
- super().__init__(cli_config, reactor)
38
- self.telegram_service = telegram_service
39
- self.serial_number: str = ""
40
- self.finish_callback: Optional[Callable[[ConbusAutoreportResponse], None]] = (
33
+ super().__init__(telegram_service, cli_config, reactor)
34
+ self.service_callback: Optional[Callable[[ConbusAutoreportResponse], None]] = (
41
35
  None
42
36
  )
43
- self.service_response: ConbusAutoreportResponse = ConbusAutoreportResponse(
44
- success=False,
45
- serial_number=self.serial_number,
46
- )
47
37
 
48
38
  # Set up logging
49
39
  self.logger = logging.getLogger(__name__)
50
40
 
51
- def connection_established(self) -> None:
52
- self.logger.debug("Connection established, retrieving autoreport status...")
53
- self.send_telegram(
54
- telegram_type=TelegramType.SYSTEM,
55
- serial_number=self.serial_number,
56
- system_function=SystemFunction.READ_DATAPOINT,
57
- data_value=str(DataPointType.AUTO_REPORT_STATUS.value),
58
- )
59
-
60
- def telegram_sent(self, telegram_sent: str) -> None:
61
- self.service_response.sent_telegram = telegram_sent
62
-
63
- def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
64
-
65
- self.logger.debug(f"Telegram received: {telegram_received}")
66
- if not self.service_response.received_telegrams:
67
- self.service_response.received_telegrams = []
68
- self.service_response.received_telegrams.append(telegram_received.frame)
41
+ def finish_service_callback(
42
+ self, datapoint_response: ConbusDatapointResponse
43
+ ) -> None:
69
44
 
70
- if (
71
- not telegram_received.checksum_valid
72
- or telegram_received.telegram_type != TelegramType.REPLY
73
- or telegram_received.serial_number != self.serial_number
74
- ):
75
- self.logger.debug("Not a reply")
76
- return
45
+ self.logger.debug("Parsing datapoint response")
46
+ autoreport_status = ""
47
+ if datapoint_response.success and datapoint_response.datapoint_telegram:
48
+ autoreport_status = datapoint_response.datapoint_telegram.data_value
77
49
 
78
- reply_telegram = self.telegram_service.parse_reply_telegram(
79
- telegram_received.frame
50
+ service_response = ConbusAutoreportResponse(
51
+ success=datapoint_response.success,
52
+ serial_number=self.serial_number,
53
+ auto_report_status=autoreport_status,
54
+ error=datapoint_response.error,
55
+ sent_telegram=datapoint_response.sent_telegram,
56
+ received_telegrams=datapoint_response.received_telegrams,
57
+ timestamp=datapoint_response.timestamp,
80
58
  )
81
- if (
82
- not reply_telegram
83
- or reply_telegram.system_function != SystemFunction.READ_DATAPOINT
84
- or reply_telegram.datapoint_type != DataPointType.AUTO_REPORT_STATUS
85
- ):
86
- self.logger.debug("Not an autoreport reply")
87
- return
88
-
89
- autoreport_status = reply_telegram.data_value
90
- self.succeed(autoreport_status)
91
-
92
- def succeed(self, autoreport_status: str) -> None:
93
- self.logger.debug("Received autoreport status: {autoreport_status}")
94
- self.service_response.success = True
95
- self.service_response.serial_number = self.serial_number
96
- self.service_response.timestamp = datetime.now()
97
- self.service_response.auto_report_status = autoreport_status
98
- if self.finish_callback:
99
- self.finish_callback(self.service_response)
100
-
101
- def failed(self, message: str) -> None:
102
- self.logger.debug(f"Failed with message: {message}")
103
- self.service_response.success = False
104
- self.service_response.serial_number = self.serial_number
105
- self.service_response.timestamp = datetime.now()
106
- self.service_response.error = message
107
- if self.finish_callback:
108
- self.finish_callback(self.service_response)
59
+
60
+ if self.service_callback:
61
+ self.service_callback(service_response)
109
62
 
110
63
  def get_autoreport_status(
111
64
  self,
@@ -117,20 +70,16 @@ class ConbusAutoreportGetService(ConbusProtocol):
117
70
  Get the current auto report status for a specific module.
118
71
 
119
72
  Args:
120
- serial_number: 10-digit module serial number
121
- finish_callback: callback function to call when the autoreport status is
122
- timeout_seconds: timeout in seconds
123
-
124
- Returns:
125
- ConbusAutoreportResponse with operation result and auto report status
73
+ :param serial_number: 10-digit module serial number
74
+ :param finish_callback: callback function to call when the linknumber status is
75
+ :param timeout_seconds: timeout in seconds
126
76
 
127
- Raises:
128
- ConbusAutoreportError: If the operation fails
129
77
  """
130
-
131
78
  self.logger.info("Starting get_autoreport_status")
132
79
  if timeout_seconds:
133
80
  self.timeout_seconds = timeout_seconds
134
- self.finish_callback = finish_callback
135
81
  self.serial_number = serial_number
82
+ self.datapoint_type = DataPointType.AUTO_REPORT_STATUS
83
+ self.finish_callback = self.finish_service_callback
84
+ self.service_callback = finish_callback
136
85
  self.start_reactor()
@@ -12,6 +12,7 @@ from twisted.internet.posixbase import PosixReactorBase
12
12
  from xp.models import ConbusClientConfig, ConbusDatapointResponse
13
13
  from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
14
14
  from xp.models.telegram.datapoint_type import DataPointType
15
+ from xp.models.telegram.reply_telegram import ReplyTelegram
15
16
  from xp.models.telegram.system_function import SystemFunction
16
17
  from xp.models.telegram.telegram_type import TelegramType
17
18
  from xp.services.protocol import ConbusProtocol
@@ -93,13 +94,16 @@ class ConbusDatapointService(ConbusProtocol):
93
94
  return
94
95
 
95
96
  self.logger.debug("Received datapoint telegram")
97
+ self.succeed(datapoint_telegram)
98
+
99
+ def succeed(self, datapoint_telegram: ReplyTelegram) -> None:
100
+ self.logger.debug("Succeed querying datapoint")
96
101
  self.service_response.success = True
97
102
  self.service_response.timestamp = datetime.now()
98
103
  self.service_response.serial_number = self.serial_number
99
104
  self.service_response.system_function = SystemFunction.READ_DATAPOINT
100
105
  self.service_response.datapoint_type = self.datapoint_type
101
106
  self.service_response.datapoint_telegram = datapoint_telegram
102
-
103
107
  if self.finish_callback:
104
108
  self.finish_callback(self.service_response)
105
109
 
@@ -107,6 +111,7 @@ class ConbusDatapointService(ConbusProtocol):
107
111
  self.logger.debug(f"Failed with message: {message}")
108
112
  self.service_response.success = False
109
113
  self.service_response.timestamp = datetime.now()
114
+ self.service_response.serial_number = self.serial_number
110
115
  self.service_response.error = message
111
116
  if self.finish_callback:
112
117
  self.finish_callback(self.service_response)
@@ -9,18 +9,14 @@ from typing import Callable, Optional
9
9
 
10
10
  from twisted.internet.posixbase import PosixReactorBase
11
11
 
12
- from xp.models import ConbusClientConfig
12
+ from xp.models import ConbusClientConfig, ConbusDatapointResponse
13
13
  from xp.models.conbus.conbus_lightlevel import ConbusLightlevelResponse
14
- from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
15
14
  from xp.models.telegram.datapoint_type import DataPointType
16
- from xp.models.telegram.reply_telegram import ReplyTelegram
17
- from xp.models.telegram.system_function import SystemFunction
18
- from xp.models.telegram.telegram_type import TelegramType
19
- from xp.services.protocol import ConbusProtocol
15
+ from xp.services.conbus.conbus_datapoint_service import ConbusDatapointService
20
16
  from xp.services.telegram.telegram_service import TelegramService
21
17
 
22
18
 
23
- class ConbusLightlevelGetService(ConbusProtocol):
19
+ class ConbusLightlevelGetService(ConbusDatapointService):
24
20
  """
25
21
  Service for receiving telegrams from Conbus servers.
26
22
 
@@ -35,93 +31,46 @@ class ConbusLightlevelGetService(ConbusProtocol):
35
31
  reactor: PosixReactorBase,
36
32
  ) -> None:
37
33
  """Initialize the Conbus client send service"""
38
- super().__init__(cli_config, reactor)
39
- self.telegram_service = telegram_service
40
- self.serial_number: str = ""
34
+ super().__init__(telegram_service, cli_config, reactor)
41
35
  self.output_number: int = 0
42
- self.finish_callback: Optional[Callable[[ConbusLightlevelResponse], None]] = (
36
+ self.service_callback: Optional[Callable[[ConbusLightlevelResponse], None]] = (
43
37
  None
44
38
  )
45
- self.service_response: ConbusLightlevelResponse = ConbusLightlevelResponse(
46
- success=False,
47
- serial_number=self.serial_number,
48
- output_number=self.output_number,
49
- level=0,
50
- timestamp=datetime.now(),
51
- )
52
39
 
53
40
  # Set up logging
54
41
  self.logger = logging.getLogger(__name__)
55
42
 
56
- def connection_established(self) -> None:
57
- self.logger.debug("Connection established, retrieving lightlevel status...")
58
- self.send_telegram(
59
- telegram_type=TelegramType.SYSTEM,
60
- serial_number=self.serial_number,
61
- system_function=SystemFunction.READ_DATAPOINT,
62
- data_value=str(DataPointType.MODULE_LIGHT_LEVEL.value),
63
- )
64
-
65
- def telegram_sent(self, telegram_sent: str) -> None:
66
- self.service_response.sent_telegram = telegram_sent
67
-
68
- def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
69
-
70
- self.logger.debug(f"Telegram received: {telegram_received}")
71
- if not self.service_response.received_telegrams:
72
- self.service_response.received_telegrams = []
73
- self.service_response.received_telegrams.append(telegram_received.frame)
43
+ def finish_service_callback(
44
+ self, datapoint_response: ConbusDatapointResponse
45
+ ) -> None:
74
46
 
75
- if (
76
- not telegram_received.checksum_valid
77
- or telegram_received.telegram_type != TelegramType.REPLY
78
- or telegram_received.serial_number != self.serial_number
79
- ):
80
- self.logger.debug("Not a reply")
81
- return
47
+ self.logger.debug("Parsing datapoint response")
82
48
 
83
- reply_telegram = self.telegram_service.parse_reply_telegram(
84
- telegram_received.frame
49
+ level = 0
50
+ if datapoint_response.success and datapoint_response.datapoint_telegram:
51
+ for output_data in datapoint_response.datapoint_telegram.data_value.split(
52
+ ","
53
+ ):
54
+ if ":" in output_data:
55
+ output_str, level_str = output_data.split(":")
56
+ if int(output_str) == self.output_number:
57
+ level_str = level_str.replace("[%]", "")
58
+ level = int(level_str)
59
+ break
60
+
61
+ service_response = ConbusLightlevelResponse(
62
+ success=datapoint_response.success,
63
+ serial_number=self.serial_number,
64
+ output_number=self.output_number,
65
+ level=level,
66
+ error=datapoint_response.error,
67
+ sent_telegram=datapoint_response.sent_telegram,
68
+ received_telegrams=datapoint_response.received_telegrams,
69
+ timestamp=datetime.now(),
85
70
  )
86
71
 
87
- if (
88
- not reply_telegram
89
- or reply_telegram.system_function != SystemFunction.READ_DATAPOINT
90
- or reply_telegram.datapoint_type != DataPointType.MODULE_LIGHT_LEVEL
91
- ):
92
- self.logger.debug("Not a lightlevel telegram")
93
- return
94
-
95
- self.logger.debug("Received lightlevel status telegram")
96
- lightlevel = self.extract_lightlevel(reply_telegram)
97
- self.succeed(lightlevel)
98
-
99
- def extract_lightlevel(self, reply_telegram: ReplyTelegram) -> int:
100
- level = 0
101
- for output_data in reply_telegram.data_value.split(","):
102
- if ":" in output_data:
103
- output_str, level_str = output_data.split(":")
104
- if int(output_str) == self.output_number:
105
- level_str = level_str.replace("[%]", "")
106
- level = int(level_str)
107
- break
108
- return level
109
-
110
- def succeed(self, lightlevel: int) -> None:
111
- self.service_response.success = True
112
- self.service_response.timestamp = datetime.now()
113
- self.service_response.serial_number = self.serial_number
114
- self.service_response.level = lightlevel
115
- if self.finish_callback:
116
- self.finish_callback(self.service_response)
117
-
118
- def failed(self, message: str) -> None:
119
- self.logger.debug(f"Failed with message: {message}")
120
- self.service_response.success = False
121
- self.service_response.timestamp = datetime.now()
122
- self.service_response.error = message
123
- if self.finish_callback:
124
- self.finish_callback(self.service_response)
72
+ if self.service_callback:
73
+ self.service_callback(service_response)
125
74
 
126
75
  def get_light_level(
127
76
  self,
@@ -143,7 +92,10 @@ class ConbusLightlevelGetService(ConbusProtocol):
143
92
  self.logger.info("Starting get_lightlevel_status")
144
93
  if timeout_seconds:
145
94
  self.timeout_seconds = timeout_seconds
146
- self.finish_callback = finish_callback
147
95
  self.serial_number = serial_number
148
96
  self.output_number = output_number
97
+ self.datapoint_type = DataPointType.MODULE_LIGHT_LEVEL
98
+
99
+ self.finish_callback = self.finish_service_callback
100
+ self.service_callback = finish_callback
149
101
  self.start_reactor()
@@ -0,0 +1,86 @@
1
+ """Conbus Link Number Service for setting module link numbers.
2
+
3
+ This service handles setting link numbers for modules through Conbus telegrams.
4
+ """
5
+
6
+ import logging
7
+ from typing import Callable, Optional
8
+
9
+ from twisted.internet.posixbase import PosixReactorBase
10
+
11
+ from xp.models import ConbusClientConfig, ConbusDatapointResponse
12
+ from xp.models.conbus.conbus_linknumber import ConbusLinknumberResponse
13
+ from xp.models.telegram.datapoint_type import DataPointType
14
+ from xp.services.conbus.conbus_datapoint_service import ConbusDatapointService
15
+ from xp.services.telegram.telegram_service import TelegramService
16
+
17
+
18
+ class ConbusLinknumberGetService(ConbusDatapointService):
19
+ """
20
+ Service for receiving telegrams from Conbus servers.
21
+
22
+ Uses composition with ConbusService to provide receive-only functionality
23
+ for collecting waiting event telegrams from the server.
24
+ """
25
+
26
+ def __init__(
27
+ self,
28
+ telegram_service: TelegramService,
29
+ cli_config: ConbusClientConfig,
30
+ reactor: PosixReactorBase,
31
+ ) -> None:
32
+ """Initialize the Conbus client send service"""
33
+ super().__init__(telegram_service, cli_config, reactor)
34
+ self.service_callback: Optional[Callable[[ConbusLinknumberResponse], None]] = (
35
+ None
36
+ )
37
+
38
+ # Set up logging
39
+ self.logger = logging.getLogger(__name__)
40
+
41
+ def finish_service_callback(
42
+ self, datapoint_response: ConbusDatapointResponse
43
+ ) -> None:
44
+
45
+ self.logger.debug("Parsing datapoint response")
46
+ link_number_value = 0
47
+ if datapoint_response.success and datapoint_response.datapoint_telegram:
48
+ link_number_value = int(datapoint_response.datapoint_telegram.data_value)
49
+
50
+ linknumber_response = ConbusLinknumberResponse(
51
+ success=datapoint_response.success,
52
+ result="SUCCESS" if datapoint_response.success else "FAILURE",
53
+ link_number=link_number_value,
54
+ serial_number=self.serial_number,
55
+ error=datapoint_response.error,
56
+ sent_telegram=datapoint_response.sent_telegram,
57
+ received_telegrams=datapoint_response.received_telegrams,
58
+ timestamp=datapoint_response.timestamp,
59
+ )
60
+
61
+ if self.service_callback:
62
+ self.service_callback(linknumber_response)
63
+
64
+ def get_linknumber(
65
+ self,
66
+ serial_number: str,
67
+ finish_callback: Callable[[ConbusLinknumberResponse], None],
68
+ timeout_seconds: Optional[float] = None,
69
+ ) -> None:
70
+ """
71
+ Get the current auto report status for a specific module.
72
+
73
+ Args:
74
+ :param serial_number: 10-digit module serial number
75
+ :param finish_callback: callback function to call when the linknumber status is
76
+ :param timeout_seconds: timeout in seconds
77
+
78
+ """
79
+ self.logger.info("Starting get_linknumber")
80
+ if timeout_seconds:
81
+ self.timeout_seconds = timeout_seconds
82
+ self.serial_number = serial_number
83
+ self.datapoint_type = DataPointType.LINK_NUMBER
84
+ self.finish_callback = self.finish_service_callback
85
+ self.service_callback = finish_callback
86
+ self.start_reactor()
@@ -0,0 +1,155 @@
1
+ """Conbus Link Number Service for setting module link numbers.
2
+
3
+ This service handles setting link numbers for modules through Conbus telegrams.
4
+ """
5
+
6
+ import logging
7
+ from datetime import datetime
8
+ from typing import Callable, Optional
9
+
10
+ from twisted.internet.posixbase import PosixReactorBase
11
+
12
+ from xp.models import ConbusClientConfig
13
+ from xp.models.conbus.conbus_linknumber import ConbusLinknumberResponse
14
+ from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
15
+ from xp.models.telegram.datapoint_type import DataPointType
16
+ from xp.models.telegram.system_function import SystemFunction
17
+ from xp.models.telegram.telegram_type import TelegramType
18
+ from xp.services.protocol import ConbusProtocol
19
+ from xp.services.telegram.telegram_service import TelegramService
20
+
21
+
22
+ class ConbusLinknumberSetService(ConbusProtocol):
23
+ """
24
+ Service for setting module link numbers via Conbus telegrams.
25
+
26
+ Handles link number assignment by sending F04D04 telegrams and processing
27
+ ACK/NAK responses from modules.
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ telegram_service: TelegramService,
33
+ cli_config: ConbusClientConfig,
34
+ reactor: PosixReactorBase,
35
+ ) -> None:
36
+ """Initialize the Conbus link number set service"""
37
+ super().__init__(cli_config, reactor)
38
+ self.telegram_service = telegram_service
39
+ self.serial_number: str = ""
40
+ self.link_number: int = 0
41
+ self.finish_callback: Optional[Callable[[ConbusLinknumberResponse], None]] = (
42
+ None
43
+ )
44
+ self.service_response: ConbusLinknumberResponse = ConbusLinknumberResponse(
45
+ success=False, serial_number=self.serial_number, result=""
46
+ )
47
+
48
+ # Set up logging
49
+ self.logger = logging.getLogger(__name__)
50
+
51
+ def connection_established(self) -> None:
52
+ self.logger.debug(
53
+ f"Connection established, setting link number {self.link_number}..."
54
+ )
55
+
56
+ # Validate parameters before sending
57
+ if not self.serial_number or len(self.serial_number) != 10:
58
+ self.failed(f"Serial number must be 10 digits, got: {self.serial_number}")
59
+ return
60
+
61
+ if not (0 <= self.link_number <= 99):
62
+ self.failed(f"Link number must be between 0-99, got: {self.link_number}")
63
+ return
64
+
65
+ # Send F04D04{link_number} telegram
66
+ # F04 = WRITE_CONFIG, D04 = LINK_NUMBER datapoint type
67
+ self.send_telegram(
68
+ telegram_type=TelegramType.SYSTEM,
69
+ serial_number=self.serial_number,
70
+ system_function=SystemFunction.WRITE_CONFIG,
71
+ data_value=f"{DataPointType.LINK_NUMBER.value}{self.link_number:02d}",
72
+ )
73
+
74
+ def telegram_sent(self, telegram_sent: str) -> None:
75
+ self.service_response.sent_telegram = telegram_sent
76
+
77
+ def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
78
+ self.logger.debug(f"Telegram received: {telegram_received}")
79
+
80
+ if not self.service_response.received_telegrams:
81
+ self.service_response.received_telegrams = []
82
+ self.service_response.received_telegrams.append(telegram_received.frame)
83
+
84
+ if (
85
+ not telegram_received.checksum_valid
86
+ or telegram_received.telegram_type != TelegramType.REPLY
87
+ or telegram_received.serial_number != self.serial_number
88
+ ):
89
+ self.logger.debug("Not a reply for our serial number")
90
+ return
91
+
92
+ # Parse the reply telegram
93
+ reply_telegram = self.telegram_service.parse_reply_telegram(
94
+ telegram_received.frame
95
+ )
96
+
97
+ if not reply_telegram:
98
+ self.logger.debug("Failed to parse reply telegram")
99
+ return
100
+
101
+ # Check for ACK or NAK response
102
+ if reply_telegram.system_function == SystemFunction.ACK:
103
+ self.logger.debug("Received ACK response")
104
+ self.succeed(SystemFunction.ACK)
105
+ elif reply_telegram.system_function == SystemFunction.NAK:
106
+ self.logger.debug("Received NAK response")
107
+ self.failed("Module responded with NAK")
108
+ else:
109
+ self.logger.debug(
110
+ f"Unexpected system function: {reply_telegram.system_function}"
111
+ )
112
+
113
+ def succeed(self, system_function: SystemFunction) -> None:
114
+ self.logger.debug("Successfully set link number")
115
+ self.service_response.success = True
116
+ self.service_response.timestamp = datetime.now()
117
+ self.service_response.serial_number = self.serial_number
118
+ self.service_response.result = "ACK"
119
+ self.service_response.link_number = self.link_number
120
+ if self.finish_callback:
121
+ self.finish_callback(self.service_response)
122
+
123
+ def failed(self, message: str) -> None:
124
+ self.logger.debug(f"Failed with message: {message}")
125
+ self.service_response.success = False
126
+ self.service_response.timestamp = datetime.now()
127
+ self.service_response.serial_number = self.serial_number
128
+ self.service_response.result = "NAK"
129
+ self.service_response.error = message
130
+ if self.finish_callback:
131
+ self.finish_callback(self.service_response)
132
+
133
+ def set_linknumber(
134
+ self,
135
+ serial_number: str,
136
+ link_number: int,
137
+ finish_callback: Callable[[ConbusLinknumberResponse], None],
138
+ timeout_seconds: Optional[float] = None,
139
+ ) -> None:
140
+ """
141
+ Set the link number for a specific module.
142
+
143
+ Args:
144
+ serial_number: 10-digit module serial number
145
+ link_number: Link number to set (0-99)
146
+ finish_callback: Callback function to call when operation completes
147
+ timeout_seconds: Optional timeout in seconds
148
+ """
149
+ self.logger.info("Starting set_linknumber")
150
+ if timeout_seconds:
151
+ self.timeout_seconds = timeout_seconds
152
+ self.serial_number = serial_number
153
+ self.link_number = link_number
154
+ self.finish_callback = finish_callback
155
+ self.start_reactor()