@wandelbots/nova-js 4.9.1 → 4.10.0

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.
package/src/asyncapi.yaml CHANGED
@@ -23,6 +23,37 @@ components:
23
23
  maxLength: 200
24
24
  description: |
25
25
  A description of the cell.
26
+ ControllerNetworkInterface:
27
+ title: ControllerNetworkInterface
28
+ description: |
29
+ Direct network interface for the robot controller. When set, the controller
30
+ gets its own interface on the specified port with the given addresses to
31
+ reach the controller's network.
32
+ type: object
33
+ required:
34
+ - addresses
35
+ - interface
36
+ properties:
37
+ interface:
38
+ description: |
39
+ Network port identifier. Either a bare port name, e.g., `enp3s0` or a
40
+ node-qualified identifier, e.g., `wandelbox-abc123-enp3s0`. Use the
41
+ node-qualified form on multi-node clusters to pin the interface to a
42
+ specific node.
43
+
44
+ Cannot be changed in-place. Delete and add the controller again to another port.
45
+ type: string
46
+ pattern: ^[A-Za-z0-9]([A-Za-z0-9._-]*[A-Za-z0-9])?$
47
+ example: wandelbox-abc123-enp3s0
48
+ addresses:
49
+ description: IPv4 addresses to assign to the interface, in address/prefix format, e.g., `192.168.1.10/24`.
50
+ type: array
51
+ minItems: 1
52
+ items:
53
+ type: string
54
+ pattern: ^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}/([0-9]|[12][0-9]|3[0-2])$
55
+ example:
56
+ - 192.168.1.10/24
26
57
  AbbController:
27
58
  title: AbbController
28
59
  description: |
@@ -44,6 +75,8 @@ components:
44
75
  x-is-discriminator: true
45
76
  controller_ip:
46
77
  type: string
78
+ network_interface:
79
+ $ref: '#/components/schemas/ControllerNetworkInterface'
47
80
  controller_port:
48
81
  description: |
49
82
  Default values: 80, 443. If custom value is set, field is required.
@@ -61,35 +94,6 @@ components:
61
94
  port:
62
95
  type: integer
63
96
  default: 32112
64
- ControllerNetworkInterface:
65
- title: ControllerNetworkInterface
66
- description: |
67
- Optional dedicated network interface for a physical robot controller.
68
-
69
- When set, the controller is given its own network interface on the selected
70
- physical network port (`pf`) with the given `address`, so it can reach the
71
- robot network directly.
72
- type: object
73
- required:
74
- - address
75
- - pf
76
- properties:
77
- address:
78
- description: |
79
- IPv4 address in CIDR notation to assign to the controller's network
80
- interface, for example `192.168.1.10/24`. The value must be a valid IPv4
81
- address followed by a prefix length between 0 and 32.
82
- type: string
83
- pattern: ^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}/([0-9]|[12][0-9]|3[0-2])$
84
- example: 192.168.1.10/24
85
- pf:
86
- description: |
87
- Name of the node's physical network port that connects to the robot
88
- network, for example `enp10s0f0`. The controller's interface is provided
89
- from this port.
90
- type: string
91
- pattern: ^[A-Za-z0-9][A-Za-z0-9._-]{0,14}$
92
- example: enp10s0f0
93
97
  FanucController:
94
98
  title: FanucController
95
99
  description: The configuration of a physical FANUC robot controller has to contain IP address of the controller.
@@ -108,6 +112,12 @@ components:
108
112
  type: string
109
113
  network_interface:
110
114
  $ref: '#/components/schemas/ControllerNetworkInterface'
115
+ stream_motion:
116
+ type: boolean
117
+ default: false
118
+ description: |
119
+ Enable the FANUC Stream Motion interface. When enabled, the GCI server
120
+ communicates with the controller via the Stream Motion interface.
111
121
  KukaController:
112
122
  title: KukaController
113
123
  description: |
@@ -129,6 +139,10 @@ components:
129
139
  x-is-discriminator: true
130
140
  controller_ip:
131
141
  type: string
142
+ network_interface:
143
+ description: |
144
+ The addresses must be ordered as KLI first and RSI second.
145
+ $ref: '#/components/schemas/ControllerNetworkInterface'
132
146
  controller_port:
133
147
  type: integer
134
148
  default: 54600
@@ -150,6 +164,93 @@ components:
150
164
  default: false
151
165
  description: |
152
166
  If true, uses slower cycle time of 12ms instead of 4ms.
167
+ StaubliController:
168
+ title: StaubliController
169
+ description: |
170
+ The configuration of a physical STÄUBLI robot controller has to contain an IP address.
171
+ Additionally, an RTI server configuration has to be specified in order to control the robot.
172
+ Deploying the server is a functionality of this API.
173
+ type: object
174
+ required:
175
+ - kind
176
+ - controller_ip
177
+ - controller_port
178
+ - command_port
179
+ - rti_server
180
+ properties:
181
+ kind:
182
+ type: string
183
+ enum:
184
+ - StaubliController
185
+ x-go-type-skip-optional-pointer: true
186
+ x-is-discriminator: true
187
+ controller_ip:
188
+ type: string
189
+ network_interface:
190
+ $ref: '#/components/schemas/ControllerNetworkInterface'
191
+ controller_port:
192
+ type: integer
193
+ default: 4021
194
+ command_port:
195
+ type: integer
196
+ default: 30150
197
+ rti_server:
198
+ description: The RTI server runs inside of the cell.
199
+ type: object
200
+ required:
201
+ - ip
202
+ - port
203
+ properties:
204
+ ip:
205
+ type: string
206
+ port:
207
+ type: integer
208
+ default: 30152
209
+ TechmanController:
210
+ title: TechmanController
211
+ description: |
212
+ The configuration of a physical Techman robot controller has to contain an IP address.
213
+ Additionally an RTRS server configuration has to be specified to obtain state from the robot.
214
+ type: object
215
+ required:
216
+ - kind
217
+ - controller_ip
218
+ - rtrs
219
+ properties:
220
+ kind:
221
+ type: string
222
+ enum:
223
+ - TechmanController
224
+ x-go-type-skip-optional-pointer: true
225
+ x-is-discriminator: true
226
+ controller_ip:
227
+ type: string
228
+ network_interface:
229
+ $ref: '#/components/schemas/ControllerNetworkInterface'
230
+ tmsvr_port:
231
+ type: integer
232
+ default: 5891
233
+ description: TCP port for the TMSVR channel on the robot controller.
234
+ tmsct_port:
235
+ type: integer
236
+ default: 5890
237
+ description: TCP port for the TMSCT channel on the robot controller.
238
+ rtrs:
239
+ description: RTRS server configuration for real-time communication.
240
+ type: object
241
+ required:
242
+ - ip
243
+ properties:
244
+ ip:
245
+ type: string
246
+ tmrts_port:
247
+ type: integer
248
+ default: 5895
249
+ description: TCP port for the TMRTS state reporting channel.
250
+ tmrtc_port:
251
+ type: integer
252
+ default: 5896
253
+ description: TCP port for the TMRTC real-time control channel.
153
254
  UniversalrobotsController:
154
255
  title: UniversalrobotsController
155
256
  description: The configuration of a physical Universal Robots controller has to contain IP address of the controller.
@@ -166,13 +267,18 @@ components:
166
267
  x-is-discriminator: true
167
268
  controller_ip:
168
269
  type: string
270
+ network_interface:
271
+ $ref: '#/components/schemas/ControllerNetworkInterface'
169
272
  Manufacturer:
170
273
  type: string
171
274
  enum:
172
275
  - abb
276
+ - bostondynamics
173
277
  - fanuc
174
278
  - kuka
175
279
  - staubli
280
+ - techman
281
+ - unitree
176
282
  - universalrobots
177
283
  - yaskawa
178
284
  MotionGroupModel:
@@ -310,6 +416,94 @@ components:
310
416
  x-is-discriminator: true
311
417
  controller_ip:
312
418
  type: string
419
+ network_interface:
420
+ $ref: '#/components/schemas/ControllerNetworkInterface'
421
+ BostondynamicsController:
422
+ title: BostondynamicsController
423
+ description: |
424
+ The configuration of a Boston Dynamics robot controller.
425
+ Requires the hostname or IP address of the robot and authentication credentials.
426
+ type: object
427
+ required:
428
+ - kind
429
+ - controller_ip
430
+ - password
431
+ properties:
432
+ kind:
433
+ type: string
434
+ enum:
435
+ - BostondynamicsController
436
+ x-go-type-skip-optional-pointer: true
437
+ x-is-discriminator: true
438
+ controller_ip:
439
+ type: string
440
+ description: The hostname or IP address of the robot.
441
+ robot_type:
442
+ type: string
443
+ enum:
444
+ - spot
445
+ default: spot
446
+ description: The Boston Dynamics robot model type.
447
+ password:
448
+ type: string
449
+ description: The authentication password for the robot.
450
+ username:
451
+ type: string
452
+ default: admin
453
+ description: The authentication username for the robot.
454
+ network_interface:
455
+ type: string
456
+ default: eth0
457
+ description: The network interface used to communicate with the robot.
458
+ stream_quality:
459
+ type: integer
460
+ default: 75
461
+ description: JPEG quality for camera streams (1-100).
462
+ stream_fps:
463
+ type: number
464
+ default: 10
465
+ description: Frames per second for camera streams.
466
+ UnitreeController:
467
+ title: UnitreeController
468
+ description: |
469
+ The configuration of a Unitree robot controller.
470
+ Supports Go2, G1, B2, and H1 robot models.
471
+ Requires the IP address of the robot and the robot model type.
472
+ type: object
473
+ required:
474
+ - kind
475
+ - controller_ip
476
+ - robot_type
477
+ properties:
478
+ kind:
479
+ type: string
480
+ enum:
481
+ - UnitreeController
482
+ x-go-type-skip-optional-pointer: true
483
+ x-is-discriminator: true
484
+ controller_ip:
485
+ type: string
486
+ description: The IP address of the Unitree robot.
487
+ robot_type:
488
+ type: string
489
+ enum:
490
+ - go2
491
+ - g1
492
+ - b2
493
+ - h1
494
+ description: The Unitree robot model type.
495
+ network_interface:
496
+ type: string
497
+ default: enp1s0f1
498
+ description: The network interface used for DDS discovery.
499
+ dds_unicast_mode:
500
+ type: boolean
501
+ default: false
502
+ description: Enable DDS unicast mode for environments where multicast is unavailable.
503
+ enable_lease:
504
+ type: boolean
505
+ default: false
506
+ description: Enable exclusive lease-based control of the robot.
313
507
  RobotController:
314
508
  type: object
315
509
  description: The configuration of a physical or virtual robot controller.
@@ -328,11 +522,16 @@ components:
328
522
  - $ref: '#/components/schemas/AbbController'
329
523
  - $ref: '#/components/schemas/FanucController'
330
524
  - $ref: '#/components/schemas/KukaController'
525
+ - $ref: '#/components/schemas/StaubliController'
526
+ - $ref: '#/components/schemas/TechmanController'
331
527
  - $ref: '#/components/schemas/UniversalrobotsController'
332
528
  - $ref: '#/components/schemas/VirtualController'
333
529
  - $ref: '#/components/schemas/YaskawaController'
530
+ - $ref: '#/components/schemas/BostondynamicsController'
531
+ - $ref: '#/components/schemas/UnitreeController'
334
532
  discriminator: kind
335
533
  x-go-type-name: ControllerConfig
534
+ x-go-raw-message: true
336
535
  ImageCredentials:
337
536
  type: object
338
537
  description: |
@@ -489,7 +688,7 @@ components:
489
688
  The configuration can be customized, e.g., robot controllers, also within apps.
490
689
  required:
491
690
  - name
492
- additionalProperties: {}
691
+ additionalProperties: true
493
692
  properties:
494
693
  name:
495
694
  $ref: '#/components/schemas/CellName'
@@ -1114,6 +1313,7 @@ components:
1114
1313
  description: Array of input/output identifiers to retrieve the values for.
1115
1314
  items:
1116
1315
  type: string
1316
+ minLength: 1
1117
1317
  update_type:
1118
1318
  type: string
1119
1319
  description: |
@@ -1159,6 +1359,114 @@ components:
1159
1359
  - io: io3
1160
1360
  value: 3.14
1161
1361
  value_type: float
1362
+ AsyncRequestHeaders:
1363
+ type: object
1364
+ required:
1365
+ - replyTo
1366
+ properties:
1367
+ replyTo:
1368
+ type: string
1369
+ description: |
1370
+ Unique inbox subject the caller is subscribed to. The server publishes the response to this address. Use a per-request unique subject, e.g., NATS inbox _INBOX.*.
1371
+ IOUpdateType:
1372
+ type: string
1373
+ description: |
1374
+ Type of update for a stream of input/output values.
1375
+ - changes: Only send updates when the value changes.
1376
+ - full: Send the full list of values at the update rate.
1377
+ enum:
1378
+ - changes
1379
+ - full
1380
+ SubscribeIOs:
1381
+ type: object
1382
+ required:
1383
+ - ios
1384
+ properties:
1385
+ ios:
1386
+ type: array
1387
+ description: Array of input/output identifiers to stream the values for.
1388
+ minItems: 1
1389
+ items:
1390
+ type: string
1391
+ minLength: 1
1392
+ update_type:
1393
+ $ref: '#/components/schemas/IOUpdateType'
1394
+ default: full
1395
+ ttl_seconds:
1396
+ type: number
1397
+ description: |
1398
+ The subscription's time to live (TTL), in seconds: once it elapses the subscription expires and
1399
+ streaming stops. Fractional values are allowed. Any non-negative value is accepted and clamped server-side to
1400
+ the range 5..300 seconds. Clients should renew the subscription at roughly a third of this interval.
1401
+ default: 30
1402
+ minimum: 0
1403
+ IOSubscriptionCreated:
1404
+ type: object
1405
+ required:
1406
+ - subscription_id
1407
+ - expires_at
1408
+ properties:
1409
+ subscription_id:
1410
+ type: string
1411
+ description: |
1412
+ Server-issued, subject-safe identifier of the created subscription.
1413
+ Values for this subscription are published on the
1414
+ `{instance}.v2.cells.{cell}.controllers.{controller}.ios.{subscription_id}` subject.
1415
+ expires_at:
1416
+ type: string
1417
+ format: date-time
1418
+ description: Timestamp at which the subscription expires, unless it is renewed.
1419
+ UpdateIOSubscription:
1420
+ type: object
1421
+ required:
1422
+ - subscription_id
1423
+ properties:
1424
+ subscription_id:
1425
+ type: string
1426
+ description: Server-issued identifier of the subscription to update.
1427
+ ios:
1428
+ type: array
1429
+ description: |
1430
+ Array of input/output identifiers to stream the values for.
1431
+ When omitted the current selection is kept unchanged. An empty array is rejected.
1432
+ minItems: 1
1433
+ items:
1434
+ type: string
1435
+ minLength: 1
1436
+ update_type:
1437
+ $ref: '#/components/schemas/IOUpdateType'
1438
+ ttl_seconds:
1439
+ type: number
1440
+ description: |
1441
+ The subscription's time to live (TTL), in seconds. When omitted the current value is kept unchanged.
1442
+ Fractional values are allowed. Any non-negative value is accepted and clamped server-side to
1443
+ the range 5..300 seconds.
1444
+ minimum: 0
1445
+ IOSubscriptionLease:
1446
+ type: object
1447
+ required:
1448
+ - expires_at
1449
+ properties:
1450
+ expires_at:
1451
+ type: string
1452
+ format: date-time
1453
+ description: Timestamp at which the subscription expires, unless it is renewed again.
1454
+ RenewIOSubscription:
1455
+ type: object
1456
+ required:
1457
+ - subscription_id
1458
+ properties:
1459
+ subscription_id:
1460
+ type: string
1461
+ description: Server-issued identifier of the subscription to renew.
1462
+ CancelIOSubscription:
1463
+ type: object
1464
+ required:
1465
+ - subscription_id
1466
+ properties:
1467
+ subscription_id:
1468
+ type: string
1469
+ description: Server-issued identifier of the subscription to cancel.
1162
1470
  RobotSystemMode:
1163
1471
  enum:
1164
1472
  - MODE_CONTROLLER_NOT_CONFIGURED
@@ -1276,6 +1584,20 @@ components:
1276
1584
  description: |
1277
1585
  Indicates which joint of the motion group is in a limit.
1278
1586
  If a joint is in its limit, only this joint can be moved. Movements that affect any other joints are not executed.
1587
+ CartesianVelocity:
1588
+ title: CartesianVelocity
1589
+ type: object
1590
+ required:
1591
+ - translation
1592
+ - rotation
1593
+ properties:
1594
+ translation:
1595
+ $ref: '#/components/schemas/Vector3d'
1596
+ rotation:
1597
+ $ref: '#/components/schemas/Vector3d'
1598
+ description: |
1599
+ Defines a cartesian velocity in 3D space.
1600
+ The unit of the translation velocity is mm/s and the unit of the rotation velocity is rad/s.
1279
1601
  JoggingRunning:
1280
1602
  title: JoggingRunning
1281
1603
  type: object
@@ -1541,7 +1863,7 @@ components:
1541
1863
  discriminator: kind
1542
1864
  description: |
1543
1865
  Details about the state of the motion execution.
1544
- The details are either for a jogging or a trajectory.
1866
+ The details are either for a jogging, a trajectory, or an action chunk.
1545
1867
  If NOVA is not controlling this motion group at the moment, this field is omitted.
1546
1868
  MotionGroupState:
1547
1869
  required:
@@ -1598,8 +1920,13 @@ components:
1598
1920
  Pose of the flange.
1599
1921
  Positions are in [mm].
1600
1922
  Orientations are in [rad].
1601
- The pose is relative to the response_coordinate_system specified in the request.
1923
+ The pose is relative to the response coordinate system specified in the request.
1602
1924
  For robot arms, a flange pose is always returned. For positioners, the flange might not be available, depending on the model.
1925
+ flange_velocity:
1926
+ $ref: '#/components/schemas/CartesianVelocity'
1927
+ description: |
1928
+ Cartesian velocity of the flange.
1929
+ The velocity is relative to the response coordinate system specified in the request.
1603
1930
  tcp:
1604
1931
  type: string
1605
1932
  description: |
@@ -1611,8 +1938,13 @@ components:
1611
1938
  Pose of the TCP selected on the robot control panel.
1612
1939
  Positions are in [mm].
1613
1940
  Orientations are in [rad].
1614
- The pose is relative to the response_coordinate_system specified in the request.
1941
+ The pose is relative to the response coordinate system specified in the request.
1615
1942
  Might not be returned for positioners as some do not support TCPs, depending on the model.
1943
+ tcp_velocity:
1944
+ $ref: '#/components/schemas/CartesianVelocity'
1945
+ description: |
1946
+ Cartesian velocity of the TCP selected on the robot control panel.
1947
+ The velocity is relative to the response coordinate system specified in the request.
1616
1948
  coordinate_system:
1617
1949
  type: string
1618
1950
  description: |
@@ -1729,9 +2061,11 @@ components:
1729
2061
  lower_limit:
1730
2062
  type: number
1731
2063
  format: double
2064
+ description: Lower position limit in rad.
1732
2065
  upper_limit:
1733
2066
  type: number
1734
2067
  format: double
2068
+ description: Upper position limit in rad.
1735
2069
  description: The upper_limit must be greater then the lower_limit.
1736
2070
  JointLimits:
1737
2071
  title: JointLimits
@@ -1739,22 +2073,28 @@ components:
1739
2073
  properties:
1740
2074
  position:
1741
2075
  $ref: '#/components/schemas/LimitRange'
2076
+ description: Joint position limits in rad.
1742
2077
  velocity:
1743
2078
  type: number
1744
2079
  format: double
2080
+ description: Joint velocity limit in rad/s.
1745
2081
  acceleration:
1746
2082
  type: number
1747
2083
  format: double
2084
+ description: Joint acceleration limit in rad/s².
1748
2085
  jerk:
1749
2086
  type: number
1750
2087
  format: double
1751
2088
  description: |
2089
+ Joint jerk limit in rad/s³.
2090
+
1752
2091
  > **NOTE**
1753
2092
  >
1754
2093
  > This limit type is experimental and its behavior may change in future releases.
1755
2094
  torque:
1756
2095
  type: number
1757
2096
  format: double
2097
+ description: Joint torque limit in Nm.
1758
2098
  CartesianLimits:
1759
2099
  title: CartesianLimits
1760
2100
  type: object
@@ -1762,26 +2102,34 @@ components:
1762
2102
  velocity:
1763
2103
  type: number
1764
2104
  format: double
2105
+ description: Cartesian velocity limit in mm/s.
1765
2106
  acceleration:
1766
2107
  type: number
1767
2108
  format: double
2109
+ description: Cartesian acceleration limit in mm/s².
1768
2110
  jerk:
1769
2111
  type: number
1770
2112
  format: double
1771
2113
  description: |
2114
+ Cartesian jerk limit in mm/s³.
2115
+
1772
2116
  > **NOTE**
1773
2117
  >
1774
2118
  > This limit type is experimental and its behavior may change in future releases.
1775
2119
  orientation_velocity:
1776
2120
  type: number
1777
2121
  format: double
2122
+ description: Orientation velocity limit in rad/s.
1778
2123
  orientation_acceleration:
1779
2124
  type: number
1780
2125
  format: double
2126
+ description: Orientation acceleration limit in rad/s².
1781
2127
  orientation_jerk:
1782
2128
  type: number
1783
2129
  format: double
1784
2130
  description: |
2131
+ Orientation jerk limit in rad/s³.
2132
+
1785
2133
  > **NOTE**
1786
2134
  >
1787
2135
  > This limit type is experimental and its behavior may change in future releases.
@@ -2103,28 +2451,6 @@ components:
2103
2451
  type: boolean
2104
2452
  description: |
2105
2453
  Indicates whether the system is connected to the internet.
2106
- connection_type:
2107
- type: string
2108
- description: |
2109
- Type of the active network link (e.g., ethernet, wifi, cellular, vpn, unknown).
2110
- enum:
2111
- - ethernet
2112
- - wifi
2113
- - cellular
2114
- - vpn
2115
- - unknown
2116
- signal_strength:
2117
- type: integer
2118
- format: int32
2119
- description: |
2120
- Received signal strength in dBm for wireless interfaces; negative values indicate weaker signals.
2121
- link_quality:
2122
- type: number
2123
- format: float
2124
- minimum: 0
2125
- maximum: 1
2126
- description: |
2127
- Normalized link quality metric from 0 (poor) to 1 (excellent) when provided by the interface.
2128
2454
  latency_ms:
2129
2455
  type: number
2130
2456
  format: float
@@ -2183,6 +2509,100 @@ components:
2183
2509
  example: application/json
2184
2510
  data:
2185
2511
  $ref: '#/components/schemas/NetworkState'
2512
+ AsyncReplyHeaders:
2513
+ type: object
2514
+ required:
2515
+ - Status
2516
+ properties:
2517
+ Status:
2518
+ type: string
2519
+ description: |
2520
+ HTTP status code indicating the result of the operation, e.g., "200" for success, "400" for bad request, "404" for not found, "500" for server error.
2521
+ Description:
2522
+ type: string
2523
+ description: Human-readable error message. Only present when Status is not 2xx.
2524
+ NetworkBackend:
2525
+ type: string
2526
+ description: Network attachment method used to expose the interface to workloads.
2527
+ enum:
2528
+ - macvlan
2529
+ - sriov
2530
+ NetworkLinkState:
2531
+ type: string
2532
+ description: Link state of the physical interface.
2533
+ enum:
2534
+ - up
2535
+ - down
2536
+ NetworkInterface:
2537
+ type: object
2538
+ required:
2539
+ - name
2540
+ - interface
2541
+ - node
2542
+ - backend
2543
+ - link
2544
+ properties:
2545
+ name:
2546
+ type: string
2547
+ description: Host network interface name, e.g., enp0s31f6.
2548
+ interface:
2549
+ type: string
2550
+ description: Stable identifier for this interface. Pass it as the `interface` field in ARP scan request, e.g., wandelbox-abc123-enp3s0.
2551
+ node:
2552
+ type: string
2553
+ description: Hostname that exposes this interface.
2554
+ backend:
2555
+ $ref: '#/components/schemas/NetworkBackend'
2556
+ link:
2557
+ $ref: '#/components/schemas/NetworkLinkState'
2558
+ addresses:
2559
+ type: array
2560
+ description: IP/CIDR addresses currently assigned to the interface. Omitted when not available.
2561
+ items:
2562
+ type: string
2563
+ NetworkInterfacesRequest:
2564
+ type: object
2565
+ description: Empty request. No parameters needed.
2566
+ NetworkInterfacesReply:
2567
+ type: array
2568
+ items:
2569
+ $ref: '#/components/schemas/NetworkInterface'
2570
+ ArpScanRequest:
2571
+ type: object
2572
+ required:
2573
+ - interface
2574
+ - cidr
2575
+ properties:
2576
+ interface:
2577
+ type: string
2578
+ description: Interface to scan. Use the `interface` value from the network interfaces list, e.g., wandelbox-abc123-enp3s0.
2579
+ cidr:
2580
+ type: string
2581
+ description: IP range to scan in CIDR notation, e.g., 192.168.1.0/24.
2582
+ timeout:
2583
+ type: integer
2584
+ format: int64
2585
+ minimum: 100
2586
+ description: Scan timeout in milliseconds. Defaults to 5000 if omitted or zero.
2587
+ ArpScanReply:
2588
+ type: array
2589
+ items:
2590
+ $ref: '#/components/schemas/Device'
2591
+ Device:
2592
+ type: object
2593
+ required:
2594
+ - ip
2595
+ - mac
2596
+ properties:
2597
+ ip:
2598
+ type: string
2599
+ description: IPv4 address of the discovered device.
2600
+ mac:
2601
+ type: string
2602
+ description: MAC address of the discovered device.
2603
+ vendor:
2604
+ type: string
2605
+ description: Hardware manufacturer name derived from the MAC address, omitted when unknown.
2186
2606
  OperatingState:
2187
2607
  format: enum
2188
2608
  type: string
@@ -2581,7 +3001,13 @@ operations:
2581
3001
  selectRobotControllerIOs:
2582
3002
  action: receive
2583
3003
  title: Select Input/Output Values
2584
- description: Select input/output values published by the controller.
3004
+ description: |
3005
+ Select input/output values published by the controller on the shared `...ios` subject.
3006
+
3007
+ This is the reserved, never-expiring default stream, shared by all clients that use it. For
3008
+ independent per-client streams with their own update type and time to live use the `ios.subscribe`
3009
+ operations instead. Malformed requests (non-string or empty entries in `ios`, an invalid
3010
+ `update_type`) are rejected and leave the current selection unchanged.
2585
3011
  tags:
2586
3012
  - name: Controller
2587
3013
  channel:
@@ -2599,6 +3025,88 @@ operations:
2599
3025
  - name: Controller
2600
3026
  channel:
2601
3027
  $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios'
3028
+ subscribeRobotControllerIOs:
3029
+ action: receive
3030
+ title: Subscribe to Input/Output Values
3031
+ description: |
3032
+ Create a per-client subscription that streams the selected input/output values on a dedicated,
3033
+ subscription-specific subject.
3034
+
3035
+ The server generates a subject-safe `subscription_id` and returns it in the reply; values are then
3036
+ published on `{instance}.v2.cells.{cell}.controllers.{controller}.ios.{subscription_id}`. The
3037
+ subscription expires after `ttl_seconds` unless it is renewed. A subscription that would push the
3038
+ union of all subscriptions' ports beyond the controller's realtime input/output capacity is rejected.
3039
+ tags:
3040
+ - name: Controller
3041
+ channel:
3042
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe'
3043
+ reply:
3044
+ channel:
3045
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.reply'
3046
+ address:
3047
+ location: $message.header#/replyTo
3048
+ updateRobotControllerIOSubscription:
3049
+ action: receive
3050
+ title: Update an Input/Output Subscription
3051
+ description: |
3052
+ Partially update an existing subscription by its server-issued `subscription_id`. Only the supplied
3053
+ fields (`ios`, `update_type`, `ttl_seconds`) are changed; omitted fields are kept unchanged, so the
3054
+ time to live or the update type can be changed without resending the port list. An update that would
3055
+ push the union of all subscriptions' ports beyond the controller's realtime input/output capacity is
3056
+ rejected and leaves the subscription unchanged.
3057
+
3058
+ A successful update also renews the lease: `expires_at` is reset to the current time plus the
3059
+ subscription's time to live, even when `ttl_seconds` is omitted.
3060
+ tags:
3061
+ - name: Controller
3062
+ channel:
3063
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.update'
3064
+ reply:
3065
+ channel:
3066
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.update.reply'
3067
+ address:
3068
+ location: $message.header#/replyTo
3069
+ renewRobotControllerIOSubscription:
3070
+ action: receive
3071
+ title: Renew an Input/Output Subscription
3072
+ description: |
3073
+ Extend the lease of an existing subscription identified by its server-issued `subscription_id`.
3074
+ Clients should renew at roughly a third of the subscription's time to live. A subscription that has
3075
+ already expired is not found and must be created again.
3076
+ tags:
3077
+ - name: Controller
3078
+ channel:
3079
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.renew'
3080
+ reply:
3081
+ channel:
3082
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.renew.reply'
3083
+ address:
3084
+ location: $message.header#/replyTo
3085
+ cancelRobotControllerIOSubscription:
3086
+ action: receive
3087
+ title: Cancel an Input/Output Subscription
3088
+ description: |
3089
+ Cancel an existing subscription identified by its server-issued `subscription_id`. Streaming on the
3090
+ subscription's subject stops and its ports are removed from the union read from the controller.
3091
+ tags:
3092
+ - name: Controller
3093
+ channel:
3094
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.cancel'
3095
+ reply:
3096
+ channel:
3097
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.cancel.reply'
3098
+ address:
3099
+ location: $message.header#/replyTo
3100
+ publishRobotControllerIOSubscription:
3101
+ action: send
3102
+ title: Subscription Input/Output Values
3103
+ description: |
3104
+ Publishes updates of input/output values for a single subscription on its dedicated
3105
+ `...ios.{subscription_id}` subject. Each subscription receives its own `full` or `changes` view.
3106
+ tags:
3107
+ - name: Controller
3108
+ channel:
3109
+ $ref: '#/channels/{instance}.v2.cells.{cell}.controllers.{controller}.ios.{subscription_id}'
2602
3110
  publishRobotControllersState:
2603
3111
  action: send
2604
3112
  title: State of Robot Controller
@@ -2661,6 +3169,34 @@ operations:
2661
3169
  - name: Events
2662
3170
  channel:
2663
3171
  $ref: '#/channels/{instance}.v2.events.system.network.status.changed'
3172
+ getNetworkInterfaces:
3173
+ action: receive
3174
+ title: List Network Interfaces
3175
+ description: |
3176
+ Lists all managed network interfaces available for controller connections and ARP scanning.
3177
+ tags:
3178
+ - name: Network
3179
+ channel:
3180
+ $ref: '#/channels/{instance}.v2.system.network.interfaces'
3181
+ reply:
3182
+ channel:
3183
+ $ref: '#/channels/{instance}.v2.system.network.interfaces.reply'
3184
+ address:
3185
+ location: $message.header#/replyTo
3186
+ arpScan:
3187
+ action: receive
3188
+ title: Run ARP Scan
3189
+ description: |
3190
+ Runs an ARP scan on the target interface and returns all discovered devices.
3191
+ tags:
3192
+ - name: Network
3193
+ channel:
3194
+ $ref: '#/channels/{instance}.v2.system.network.arpscan'
3195
+ reply:
3196
+ channel:
3197
+ $ref: '#/channels/{instance}.v2.system.network.arpscan.reply'
3198
+ address:
3199
+ location: $message.header#/replyTo
2664
3200
  eventCellCreated:
2665
3201
  action: send
2666
3202
  title: Cell Created
@@ -3015,6 +3551,131 @@ channels:
3015
3551
  contentType: application/json
3016
3552
  payload:
3017
3553
  $ref: '#/components/schemas/StreamIOValuesResponse'
3554
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe':
3555
+ address: '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe'
3556
+ parameters:
3557
+ instance:
3558
+ description: Unique identifier addressing an instance in all API calls.
3559
+ default: nova
3560
+ cell:
3561
+ description: Unique identifier addressing a cell in all API calls.
3562
+ controller:
3563
+ description: Unique identifier to address a controller in a cell.
3564
+ messages:
3565
+ SubscribeIOs:
3566
+ contentType: application/json
3567
+ headers:
3568
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3569
+ payload:
3570
+ $ref: '#/components/schemas/SubscribeIOs'
3571
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.reply':
3572
+ address: null
3573
+ messages:
3574
+ Response:
3575
+ contentType: application/json
3576
+ payload:
3577
+ $ref: '#/components/schemas/IOSubscriptionCreated'
3578
+ Error:
3579
+ contentType: application/json
3580
+ payload:
3581
+ $ref: '#/components/schemas/Error'
3582
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.update':
3583
+ address: '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.update'
3584
+ parameters:
3585
+ instance:
3586
+ description: Unique identifier addressing an instance in all API calls.
3587
+ default: nova
3588
+ cell:
3589
+ description: Unique identifier addressing a cell in all API calls.
3590
+ controller:
3591
+ description: Unique identifier to address a controller in a cell.
3592
+ messages:
3593
+ UpdateIOSubscription:
3594
+ contentType: application/json
3595
+ headers:
3596
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3597
+ payload:
3598
+ $ref: '#/components/schemas/UpdateIOSubscription'
3599
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.update.reply':
3600
+ address: null
3601
+ messages:
3602
+ Response:
3603
+ contentType: application/json
3604
+ payload:
3605
+ $ref: '#/components/schemas/IOSubscriptionLease'
3606
+ Error:
3607
+ contentType: application/json
3608
+ payload:
3609
+ $ref: '#/components/schemas/Error'
3610
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.renew':
3611
+ address: '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.renew'
3612
+ parameters:
3613
+ instance:
3614
+ description: Unique identifier addressing an instance in all API calls.
3615
+ default: nova
3616
+ cell:
3617
+ description: Unique identifier addressing a cell in all API calls.
3618
+ controller:
3619
+ description: Unique identifier to address a controller in a cell.
3620
+ messages:
3621
+ RenewIOSubscription:
3622
+ contentType: application/json
3623
+ headers:
3624
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3625
+ payload:
3626
+ $ref: '#/components/schemas/RenewIOSubscription'
3627
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.renew.reply':
3628
+ address: null
3629
+ messages:
3630
+ Response:
3631
+ contentType: application/json
3632
+ payload:
3633
+ $ref: '#/components/schemas/IOSubscriptionLease'
3634
+ Error:
3635
+ contentType: application/json
3636
+ payload:
3637
+ $ref: '#/components/schemas/Error'
3638
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.cancel':
3639
+ address: '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.cancel'
3640
+ parameters:
3641
+ instance:
3642
+ description: Unique identifier addressing an instance in all API calls.
3643
+ default: nova
3644
+ cell:
3645
+ description: Unique identifier addressing a cell in all API calls.
3646
+ controller:
3647
+ description: Unique identifier to address a controller in a cell.
3648
+ messages:
3649
+ CancelIOSubscription:
3650
+ contentType: application/json
3651
+ headers:
3652
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3653
+ payload:
3654
+ $ref: '#/components/schemas/CancelIOSubscription'
3655
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.subscribe.cancel.reply':
3656
+ address: null
3657
+ messages:
3658
+ Response:
3659
+ contentType: application/json
3660
+ payload:
3661
+ $ref: '#/components/schemas/Error'
3662
+ '{instance}.v2.cells.{cell}.controllers.{controller}.ios.{subscription_id}':
3663
+ address: '{instance}.v2.cells.{cell}.controllers.{controller}.ios.{subscription_id}'
3664
+ parameters:
3665
+ instance:
3666
+ description: Unique identifier addressing an instance in all API calls.
3667
+ default: nova
3668
+ cell:
3669
+ description: Unique identifier addressing a cell in all API calls.
3670
+ controller:
3671
+ description: Unique identifier to address a controller in the cell.
3672
+ subscription_id:
3673
+ description: Server-issued identifier of the subscription this stream belongs to.
3674
+ messages:
3675
+ IOValues:
3676
+ contentType: application/json
3677
+ payload:
3678
+ $ref: '#/components/schemas/StreamIOValuesResponse'
3018
3679
  '{instance}.v2.cells.{cell}.controllers.{controller}.state':
3019
3680
  address: '{instance}.v2.cells.{cell}.controllers.{controller}.state'
3020
3681
  parameters:
@@ -3189,6 +3850,54 @@ channels:
3189
3850
  duplicate_window: '300 # 5 minutes for duplicate detection'
3190
3851
  subjects:
3191
3852
  - nova.v2.events.>
3853
+ '{instance}.v2.system.network.interfaces':
3854
+ address: '{instance}.v2.system.network.interfaces'
3855
+ parameters:
3856
+ instance:
3857
+ description: Unique identifier addressing an instance in all API calls.
3858
+ default: nova
3859
+ messages:
3860
+ NetworkInterfacesRequest:
3861
+ name: NetworkInterfacesRequest
3862
+ contentType: application/json
3863
+ headers:
3864
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3865
+ payload:
3866
+ $ref: '#/components/schemas/NetworkInterfacesRequest'
3867
+ '{instance}.v2.system.network.interfaces.reply':
3868
+ address: null
3869
+ messages:
3870
+ NetworkInterfacesReply:
3871
+ name: NetworkInterfacesReply
3872
+ contentType: application/json
3873
+ headers:
3874
+ $ref: '#/components/schemas/AsyncReplyHeaders'
3875
+ payload:
3876
+ $ref: '#/components/schemas/NetworkInterfacesReply'
3877
+ '{instance}.v2.system.network.arpscan':
3878
+ address: '{instance}.v2.system.network.arpscan'
3879
+ parameters:
3880
+ instance:
3881
+ description: Unique identifier addressing an instance in all API calls.
3882
+ default: nova
3883
+ messages:
3884
+ ArpScanRequest:
3885
+ name: ArpScanRequest
3886
+ contentType: application/json
3887
+ headers:
3888
+ $ref: '#/components/schemas/AsyncRequestHeaders'
3889
+ payload:
3890
+ $ref: '#/components/schemas/ArpScanRequest'
3891
+ '{instance}.v2.system.network.arpscan.reply':
3892
+ address: null
3893
+ messages:
3894
+ ArpScanReply:
3895
+ name: ArpScanReply
3896
+ contentType: application/json
3897
+ headers:
3898
+ $ref: '#/components/schemas/AsyncReplyHeaders'
3899
+ payload:
3900
+ $ref: '#/components/schemas/ArpScanReply'
3192
3901
  '{instance}.v2.events.cells.{cell}.created':
3193
3902
  address: '{instance}.v2.events.cells.{cell}.created'
3194
3903
  parameters: