wandelbots_api_client 26.6.0.dev34__py3-none-any.whl → 26.6.0.dev36__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.
Files changed (26) hide show
  1. wandelbots_api_client/__init__.py +1 -1
  2. wandelbots_api_client/api_client.py +1 -1
  3. wandelbots_api_client/configuration.py +1 -1
  4. wandelbots_api_client/v2/__init__.py +1 -1
  5. wandelbots_api_client/v2/api/bus_inputs_outputs_api.py +38 -4
  6. wandelbots_api_client/v2/api_client.py +1 -1
  7. wandelbots_api_client/v2/configuration.py +1 -1
  8. wandelbots_api_client/v2/models/__init__.py +1 -0
  9. wandelbots_api_client/v2/models/add_virtual_controller_motion_group_request.py +1 -1
  10. wandelbots_api_client/v2/models/app.py +1 -1
  11. wandelbots_api_client/v2/models/motion_group_from_json.py +2 -2
  12. wandelbots_api_client/v2/models/motion_group_from_type.py +1 -1
  13. wandelbots_api_client/v2/models/profinet_input_output_config.py +21 -6
  14. wandelbots_api_client/v2/models/profinet_io.py +1 -1
  15. wandelbots_api_client/v2/models/profinet_io_data.py +1 -1
  16. wandelbots_api_client/v2/models/profinet_slot_offset.py +98 -0
  17. wandelbots_api_client/v2/models/virtual_controller.py +18 -2
  18. wandelbots_api_client/v2_pydantic/__init__.py +1 -1
  19. wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py +38 -4
  20. wandelbots_api_client/v2_pydantic/api_client.py +1 -1
  21. wandelbots_api_client/v2_pydantic/configuration.py +1 -1
  22. wandelbots_api_client/v2_pydantic/models/__init__.py +4 -2
  23. wandelbots_api_client/v2_pydantic/models/models.py +131 -78
  24. {wandelbots_api_client-26.6.0.dev34.dist-info → wandelbots_api_client-26.6.0.dev36.dist-info}/METADATA +2 -2
  25. {wandelbots_api_client-26.6.0.dev34.dist-info → wandelbots_api_client-26.6.0.dev36.dist-info}/RECORD +26 -25
  26. {wandelbots_api_client-26.6.0.dev34.dist-info → wandelbots_api_client-26.6.0.dev36.dist-info}/WHEEL +0 -0
@@ -13,7 +13,7 @@ Generated by OpenAPI Generator (https://openapi-generator.tech)
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.6.0.dev34"
16
+ __version__ = "26.6.0.dev36"
17
17
 
18
18
  from . import models
19
19
  from . import api
@@ -83,7 +83,7 @@ class ApiClient:
83
83
  self.default_headers[header_name] = header_value
84
84
  self.cookie = cookie
85
85
  # Set default User-Agent.
86
- self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev34"
86
+ self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev36"
87
87
  self.client_side_validation = configuration.client_side_validation
88
88
 
89
89
  async def __aenter__(self):
@@ -512,7 +512,7 @@ class Configuration:
512
512
  "OS: {env}\n"
513
513
  "Python Version: {pyversion}\n"
514
514
  "Version of the API: 1.6.0 dev\n"
515
- "SDK Package Version: 26.6.0.dev34".format(env=sys.platform, pyversion=sys.version)
515
+ "SDK Package Version: 26.6.0.dev36".format(env=sys.platform, pyversion=sys.version)
516
516
  )
517
517
 
518
518
  def get_host_settings(self) -> List[HostSetting]:
@@ -13,7 +13,7 @@ Generated by OpenAPI Generator (https://openapi-generator.tech)
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.6.0.dev34"
16
+ __version__ = "26.6.0.dev36"
17
17
 
18
18
  from . import api
19
19
  from . import api_client
@@ -35,6 +35,7 @@ from wandelbots_api_client.v2.models.profinet_description import ProfinetDescrip
35
35
  from wandelbots_api_client.v2.models.profinet_io import ProfinetIO
36
36
  from wandelbots_api_client.v2.models.profinet_io_data import ProfinetIOData
37
37
  from wandelbots_api_client.v2.models.profinet_input_output_config import ProfinetInputOutputConfig
38
+ from wandelbots_api_client.v2.models.profinet_slot_offset import ProfinetSlotOffset
38
39
  from wandelbots_api_client.v2.models.snap7_io import Snap7IO
39
40
  from wandelbots_api_client.v2.models.snap7_io_data import Snap7IOData
40
41
 
@@ -3837,6 +3838,12 @@ class BUSInputsOutputsApi:
3837
3838
  async def get_profinet_ios_from_file(
3838
3839
  self,
3839
3840
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3841
+ offsets: Annotated[
3842
+ Optional[List[ProfinetSlotOffset]],
3843
+ Field(
3844
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
3845
+ ),
3846
+ ] = None,
3840
3847
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3841
3848
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3842
3849
  _request_timeout: Union[
@@ -3849,10 +3856,12 @@ class BUSInputsOutputsApi:
3849
3856
  ) -> str:
3850
3857
  """PROFINET Inputs/Outputs to File
3851
3858
 
3852
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
3859
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3853
3860
 
3854
3861
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3855
3862
  :type cell: str
3863
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
3864
+ :type offsets: List[ProfinetSlotOffset]
3856
3865
  :param input_offset:
3857
3866
  :type input_offset: int
3858
3867
  :param output_offset:
@@ -3881,6 +3890,7 @@ class BUSInputsOutputsApi:
3881
3890
 
3882
3891
  _param = self._get_profinet_ios_from_file_serialize(
3883
3892
  cell=cell,
3893
+ offsets=offsets,
3884
3894
  input_offset=input_offset,
3885
3895
  output_offset=output_offset,
3886
3896
  _request_auth=_request_auth,
@@ -3907,6 +3917,12 @@ class BUSInputsOutputsApi:
3907
3917
  async def get_profinet_ios_from_file_with_http_info(
3908
3918
  self,
3909
3919
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3920
+ offsets: Annotated[
3921
+ Optional[List[ProfinetSlotOffset]],
3922
+ Field(
3923
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
3924
+ ),
3925
+ ] = None,
3910
3926
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3911
3927
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3912
3928
  _request_timeout: Union[
@@ -3919,10 +3935,12 @@ class BUSInputsOutputsApi:
3919
3935
  ) -> ApiResponse[str]:
3920
3936
  """PROFINET Inputs/Outputs to File
3921
3937
 
3922
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
3938
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3923
3939
 
3924
3940
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3925
3941
  :type cell: str
3942
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
3943
+ :type offsets: List[ProfinetSlotOffset]
3926
3944
  :param input_offset:
3927
3945
  :type input_offset: int
3928
3946
  :param output_offset:
@@ -3951,6 +3969,7 @@ class BUSInputsOutputsApi:
3951
3969
 
3952
3970
  _param = self._get_profinet_ios_from_file_serialize(
3953
3971
  cell=cell,
3972
+ offsets=offsets,
3954
3973
  input_offset=input_offset,
3955
3974
  output_offset=output_offset,
3956
3975
  _request_auth=_request_auth,
@@ -3977,6 +3996,12 @@ class BUSInputsOutputsApi:
3977
3996
  async def get_profinet_ios_from_file_without_preload_content(
3978
3997
  self,
3979
3998
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3999
+ offsets: Annotated[
4000
+ Optional[List[ProfinetSlotOffset]],
4001
+ Field(
4002
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
4003
+ ),
4004
+ ] = None,
3980
4005
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3981
4006
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3982
4007
  _request_timeout: Union[
@@ -3989,10 +4014,12 @@ class BUSInputsOutputsApi:
3989
4014
  ) -> RESTResponseType:
3990
4015
  """PROFINET Inputs/Outputs to File
3991
4016
 
3992
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
4017
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3993
4018
 
3994
4019
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3995
4020
  :type cell: str
4021
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
4022
+ :type offsets: List[ProfinetSlotOffset]
3996
4023
  :param input_offset:
3997
4024
  :type input_offset: int
3998
4025
  :param output_offset:
@@ -4021,6 +4048,7 @@ class BUSInputsOutputsApi:
4021
4048
 
4022
4049
  _param = self._get_profinet_ios_from_file_serialize(
4023
4050
  cell=cell,
4051
+ offsets=offsets,
4024
4052
  input_offset=input_offset,
4025
4053
  output_offset=output_offset,
4026
4054
  _request_auth=_request_auth,
@@ -4042,6 +4070,7 @@ class BUSInputsOutputsApi:
4042
4070
  def _get_profinet_ios_from_file_serialize(
4043
4071
  self,
4044
4072
  cell,
4073
+ offsets,
4045
4074
  input_offset,
4046
4075
  output_offset,
4047
4076
  _request_auth,
@@ -4052,7 +4081,9 @@ class BUSInputsOutputsApi:
4052
4081
 
4053
4082
  _host = None
4054
4083
 
4055
- _collection_formats: Dict[str, str] = {}
4084
+ _collection_formats: Dict[str, str] = {
4085
+ "offsets": "csv",
4086
+ }
4056
4087
 
4057
4088
  _path_params: Dict[str, str] = {}
4058
4089
  _query_params: List[Tuple[str, str]] = []
@@ -4065,6 +4096,9 @@ class BUSInputsOutputsApi:
4065
4096
  if cell is not None:
4066
4097
  _path_params["cell"] = cell
4067
4098
  # process the query parameters
4099
+ if offsets is not None:
4100
+ _query_params.append(("offsets", offsets))
4101
+
4068
4102
  if input_offset is not None:
4069
4103
  _query_params.append(("input_offset", input_offset))
4070
4104
 
@@ -85,7 +85,7 @@ class ApiClient:
85
85
  self.default_headers[header_name] = header_value
86
86
  self.cookie = cookie
87
87
  # Set default User-Agent.
88
- self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev34"
88
+ self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev36"
89
89
  self.client_side_validation = configuration.client_side_validation
90
90
 
91
91
  async def __aenter__(self):
@@ -512,7 +512,7 @@ class Configuration:
512
512
  "OS: {env}\n"
513
513
  "Python Version: {pyversion}\n"
514
514
  "Version of the API: 2.6.0 dev\n"
515
- "SDK Package Version: 26.6.0.dev34".format(env=sys.platform, pyversion=sys.version)
515
+ "SDK Package Version: 26.6.0.dev36".format(env=sys.platform, pyversion=sys.version)
516
516
  )
517
517
 
518
518
  def get_host_settings(self) -> List[HostSetting]:
@@ -336,6 +336,7 @@ from wandelbots_api_client.v2.models.profinet_io_direction import ProfinetIODire
336
336
  from wandelbots_api_client.v2.models.profinet_io_type_enum import ProfinetIOTypeEnum
337
337
  from wandelbots_api_client.v2.models.profinet_input_output_config import ProfinetInputOutputConfig
338
338
  from wandelbots_api_client.v2.models.profinet_slot_description import ProfinetSlotDescription
339
+ from wandelbots_api_client.v2.models.profinet_slot_offset import ProfinetSlotOffset
339
340
  from wandelbots_api_client.v2.models.profinet_sub_slot_description import ProfinetSubSlotDescription
340
341
  from wandelbots_api_client.v2.models.program import Program
341
342
  from wandelbots_api_client.v2.models.program_run import ProgramRun
@@ -27,7 +27,7 @@ ADDVIRTUALCONTROLLERMOTIONGROUPREQUEST_ONE_OF_SCHEMAS = ["MotionGroupFromJson",
27
27
 
28
28
  class AddVirtualControllerMotionGroupRequest(BaseModel):
29
29
  """
30
- Request body wrapper for `addVirtualControllerMotionGroup`. Allow callers to either reference a predefined motion group model or upload a full JSON configuration that the backend extracts into a motion group description.
30
+ Request body wrapper for `addVirtualControllerMotionGroup`. Allow either referencing a predefined motion group model or uploading a JSON configuration that the backend converts into a motion group description.
31
31
  """
32
32
 
33
33
  # data type: MotionGroupFromType
@@ -34,7 +34,7 @@ class App(BaseModel):
34
34
  """ # noqa: E501
35
35
 
36
36
  name: Annotated[str, Field(min_length=1, strict=True)] = Field(
37
- description="The name of the provided application. The name must be unique within the cell and is used as a identifier for addressing the application in all API calls , e.g., when updating the application. It also defines where the application is reachable (/$cell/$name). It must be a valid k8s label name as defined by [RFC 1035](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names). "
37
+ description="The name of the provided application. The name must be unique within the cell and is used as an identifier for addressing the application in all API calls , e.g., when updating the application. It also defines where the application is reachable (/$cell/$name). It must be a valid k8s label name as defined by [RFC 1035](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names). "
38
38
  )
39
39
  app_icon: Annotated[str, Field(min_length=1, strict=True)] = Field(
40
40
  description="The path of the icon for the App (/$cell/$name/$app_icon)."
@@ -30,14 +30,14 @@ class MotionGroupFromJson(BaseModel):
30
30
 
31
31
  motion_group: StrictStr = Field(description="Unique identifier for the motion group to be added.")
32
32
  json_data: StrictStr = Field(
33
- description="Full JSON configuration of the virtual robot controller. This can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration). "
33
+ description="JSON configuration of the virtual robot controller, can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration). "
34
34
  )
35
35
  extracted_motion_group_id: StrictStr = Field(
36
36
  description="The identifier of the motion group that needs to be extracted from the provided JSON configuration. "
37
37
  )
38
38
  initial_joint_position: Optional[StrictStr] = Field(
39
39
  default=None,
40
- description="Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
40
+ description="Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians. The array length must match the robot's degrees of freedom, e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
41
41
  )
42
42
  __properties: ClassVar[List[str]] = ["motion_group", "json_data", "extracted_motion_group_id", "initial_joint_position"]
43
43
 
@@ -34,7 +34,7 @@ class MotionGroupFromType(BaseModel):
34
34
  )
35
35
  initial_joint_position: Optional[StrictStr] = Field(
36
36
  default=None,
37
- description="Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted; if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
37
+ description="Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians. The array length must match the robot's degrees of freedom, e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted; if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
38
38
  )
39
39
  __properties: ClassVar[List[str]] = ["motion_group", "motion_group_model", "initial_joint_position"]
40
40
 
@@ -17,8 +17,9 @@ import re # noqa: F401
17
17
  import json
18
18
 
19
19
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
20
- from typing import Any, ClassVar, Dict, List
20
+ from typing import Any, ClassVar, Dict, List, Optional
21
21
  from typing_extensions import Annotated
22
+ from wandelbots_api_client.v2.models.profinet_slot_offset import ProfinetSlotOffset
22
23
  from typing import Optional, Set
23
24
  from typing_extensions import Self
24
25
  from pydantic_core import to_jsonable_python
@@ -32,13 +33,19 @@ class ProfinetInputOutputConfig(BaseModel):
32
33
  config: StrictStr = Field(
33
34
  description="Content of the input/output variable configuration XML file. The XML File has to be embedded as a string by escaping quotes, line breaks and so forth. "
34
35
  )
35
- input_offset: Annotated[int, Field(le=2147483647, strict=True, ge=0)] = Field(
36
- description="Offset in bytes for the address of the input (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content."
36
+ offsets: Optional[List[ProfinetSlotOffset]] = Field(
37
+ default=None,
38
+ description="Per-slot offsets for translating controller addresses to PROFINET device-local byte addresses. Use this field for multi-slot devices. If omitted, the deprecated `input_offset` and `output_offset` fields are used for backward compatibility. ",
37
39
  )
38
- output_offset: Annotated[int, Field(le=2147483647, strict=True, ge=0)] = Field(
39
- description="Offset in bytes for the address of the output (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content."
40
+ input_offset: Optional[Annotated[int, Field(le=2147483647, strict=True, ge=0)]] = Field(
41
+ default=0,
42
+ description="Offset in bytes for the addresses of input variables from the perspective of the controller. This field is deprecated and replaced by `offsets` to support per-slot offsets. The offset is subtracted from the byte addresses of the sent XML content. ",
40
43
  )
41
- __properties: ClassVar[List[str]] = ["config", "input_offset", "output_offset"]
44
+ output_offset: Optional[Annotated[int, Field(le=2147483647, strict=True, ge=0)]] = Field(
45
+ default=0,
46
+ description="Offset in bytes for the addresses of output variables from the perspective of the controller. This field is deprecated and replaced by `offsets` to support per-slot offsets. The offset is subtracted from the byte addresses of the sent XML content. ",
47
+ )
48
+ __properties: ClassVar[List[str]] = ["config", "offsets", "input_offset", "output_offset"]
42
49
 
43
50
  model_config = ConfigDict(
44
51
  validate_by_name=True,
@@ -77,6 +84,13 @@ class ProfinetInputOutputConfig(BaseModel):
77
84
  exclude=excluded_fields,
78
85
  exclude_none=True,
79
86
  )
87
+ # override the default output from pydantic by calling `to_dict()` of each item in offsets (list)
88
+ _items = []
89
+ if self.offsets:
90
+ for _item_offsets in self.offsets:
91
+ if _item_offsets:
92
+ _items.append(_item_offsets.to_dict())
93
+ _dict["offsets"] = _items
80
94
  return _dict
81
95
 
82
96
  @classmethod
@@ -91,6 +105,7 @@ class ProfinetInputOutputConfig(BaseModel):
91
105
  _obj = cls.model_validate(
92
106
  {
93
107
  "config": obj.get("config"),
108
+ "offsets": [ProfinetSlotOffset.from_dict(_item) for _item in obj["offsets"]] if obj.get("offsets") is not None else None,
94
109
  "input_offset": obj.get("input_offset") if obj.get("input_offset") is not None else 0,
95
110
  "output_offset": obj.get("output_offset") if obj.get("output_offset") is not None else 0,
96
111
  }
@@ -37,7 +37,7 @@ class ProfinetIO(BaseModel):
37
37
  description="The direction of the input/output variable, indicating whether it is an input or output for the PROFINET device, e.g., NOVA's PROFINET service. "
38
38
  )
39
39
  byte_address: Annotated[int, Field(le=65535, strict=True, ge=0)] = Field(
40
- description="The byte address in the PROFINET device's process image, with offset 0. The slot is automatically determined based on this address and the configured slot layout. For example, with two slots of 64 bytes each: - Bytes 0-63: Slot 1 - Bytes 64-127: Slot 2 When importing from a tag table, e.g., TIA Portal, use `input_offset`/`output_offset` to convert global PLC addresses to device-local addresses: `device_byte_address` = `plc_byte_address` - offset "
40
+ description="The byte address in the PROFINET device's process image, with offset 0. The slot is automatically determined based on this address and the configured slot layout. For example, with two slots of 64 bytes each: - Bytes 0-63: Slot 1 - Bytes 64-127: Slot 2 When importing from a tag table, e.g., TIA Portal, use per-slot `offsets` (or the deprecated `input_offset`/`output_offset`) to convert global PLC addresses to device-local addresses: `device_byte_address` = `plc_byte_address` - offset "
41
41
  )
42
42
  bit_address: Optional[Annotated[int, Field(le=7, strict=True, ge=0)]] = Field(
43
43
  default=None,
@@ -37,7 +37,7 @@ class ProfinetIOData(BaseModel):
37
37
  description="The direction of the input/output variable, indicating whether it is an input or output for the PROFINET device, e.g., NOVA's PROFINET service. "
38
38
  )
39
39
  byte_address: Annotated[int, Field(le=65535, strict=True, ge=0)] = Field(
40
- description="The byte address in the PROFINET device's process image, with offset 0. The slot is automatically determined based on this address and the configured slot layout. For example, with two slots of 64 bytes each: - Bytes 0-63: Slot 1 - Bytes 64-127: Slot 2 When importing from a tag table, e.g., TIA Portal, use `input_offset`/`output_offset` to convert global PLC addresses to device-local addresses: `device_byte_address` = `plc_byte_address` - offset "
40
+ description="The byte address in the PROFINET device's process image, with offset 0. The slot is automatically determined based on this address and the configured slot layout. For example, with two slots of 64 bytes each: - Bytes 0-63: Slot 1 - Bytes 64-127: Slot 2 When importing from a tag table, e.g., TIA Portal, use per-slot `offsets` (or the deprecated `input_offset`/`output_offset`) to convert global PLC addresses to device-local addresses: `device_byte_address` = `plc_byte_address` - offset "
41
41
  )
42
42
  bit_address: Optional[Annotated[int, Field(le=7, strict=True, ge=0)]] = Field(
43
43
  default=None,
@@ -0,0 +1,98 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Wandelbots NOVA API
5
+
6
+ Interact with robots in an easy and intuitive way.
7
+
8
+ The version of the OpenAPI document: 2.6.0 dev
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+ from __future__ import annotations
15
+ import pprint
16
+ import re # noqa: F401
17
+ import json
18
+
19
+ from pydantic import BaseModel, ConfigDict, Field
20
+ from typing import Any, ClassVar, Dict, List
21
+ from typing_extensions import Annotated
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+ from pydantic_core import to_jsonable_python
25
+
26
+
27
+ class ProfinetSlotOffset(BaseModel):
28
+ """
29
+ ProfinetSlotOffset
30
+ """ # noqa: E501
31
+
32
+ slot: Annotated[int, Field(le=2147483647, strict=True, ge=0)] = Field(
33
+ description="The number/index of the PROFINET slot these offsets apply to. Per default, slot 0 is reserved for the device access point (DAP). Slots that are part of the cyclic input/output data exchange start at number 1. "
34
+ )
35
+ input_offset: Annotated[int, Field(le=2147483647, strict=True, ge=0)] = Field(
36
+ description="This slot's offset in bytes for the addresses of input variables from the perspective of the controller. For imported tag tables, this offset is subtracted from the controller byte addresses. "
37
+ )
38
+ output_offset: Annotated[int, Field(le=2147483647, strict=True, ge=0)] = Field(
39
+ description="This slot's offset in bytes for the addresses of output variables from the perspective of the controller. For imported tag tables, this offset is subtracted from the controller byte addresses. "
40
+ )
41
+ __properties: ClassVar[List[str]] = ["slot", "input_offset", "output_offset"]
42
+
43
+ model_config = ConfigDict(
44
+ validate_by_name=True,
45
+ validate_by_alias=True,
46
+ validate_assignment=True,
47
+ protected_namespaces=(),
48
+ )
49
+
50
+ def to_str(self) -> str:
51
+ """Returns the string representation of the model using alias"""
52
+ return pprint.pformat(self.model_dump(by_alias=True))
53
+
54
+ def to_json(self) -> str:
55
+ """Returns the JSON representation of the model using alias"""
56
+ return json.dumps(to_jsonable_python(self.to_dict()))
57
+
58
+ @classmethod
59
+ def from_json(cls, json_str: str) -> Optional[Self]:
60
+ """Create an instance of ProfinetSlotOffset from a JSON string"""
61
+ return cls.from_dict(json.loads(json_str))
62
+
63
+ def to_dict(self) -> Dict[str, Any]:
64
+ """Return the dictionary representation of the model using alias.
65
+
66
+ This has the following differences from calling pydantic's
67
+ `self.model_dump(by_alias=True)`:
68
+
69
+ * `None` is only added to the output dict for nullable fields that
70
+ were set at model initialization. Other fields with value `None`
71
+ are ignored.
72
+ """
73
+ excluded_fields: Set[str] = set([])
74
+
75
+ _dict = self.model_dump(
76
+ by_alias=True,
77
+ exclude=excluded_fields,
78
+ exclude_none=True,
79
+ )
80
+ return _dict
81
+
82
+ @classmethod
83
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
84
+ """Create an instance of ProfinetSlotOffset from a dict"""
85
+ if obj is None:
86
+ return None
87
+
88
+ if not isinstance(obj, dict):
89
+ return cls.model_validate(obj)
90
+
91
+ _obj = cls.model_validate(
92
+ {
93
+ "slot": obj.get("slot"),
94
+ "input_offset": obj.get("input_offset") if obj.get("input_offset") is not None else 0,
95
+ "output_offset": obj.get("output_offset") if obj.get("output_offset") is not None else 0,
96
+ }
97
+ )
98
+ return _obj
@@ -18,6 +18,8 @@ import json
18
18
 
19
19
  from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator
20
20
  from typing import Any, ClassVar, Dict, List, Optional
21
+ from typing_extensions import Annotated
22
+ from wandelbots_api_client.v2.models.add_virtual_controller_motion_group_request import AddVirtualControllerMotionGroupRequest
21
23
  from wandelbots_api_client.v2.models.manufacturer import Manufacturer
22
24
  from typing import Optional, Set
23
25
  from typing_extensions import Self
@@ -42,9 +44,13 @@ class VirtualController(BaseModel):
42
44
  )
43
45
  initial_joint_position: Optional[StrictStr] = Field(
44
46
  default=None,
45
- description="Initial joint position of the first motion group from the virtual robot controller. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
47
+ description="Initial joint position of the first motion group from the virtual robot controller. Provides the joint position as a JSON array of float values in radians. The array length must match the robot's degrees of freedom, e.g., `\"[0, 0, 0, 0, 0, 0]\"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. ",
46
48
  )
47
- __properties: ClassVar[List[str]] = ["kind", "manufacturer", "type", "json", "initial_joint_position"]
49
+ motion_groups: Optional[Annotated[List[AddVirtualControllerMotionGroupRequest], Field(max_length=10)]] = Field(
50
+ default=None,
51
+ description="Adds a motion group configuration for the virtual robot controller. > **NOTE** > > Set only one of the two options, **motion_group_model**, or **json_data** - **motion_group_model**: Identifies a single motion group. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types - **json_data**: JSON configuration of the virtual robot controller, can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration) - **extracted_motion_group_id**: Motion group identifier to extract from the provided JSON configuration, required when using json_data - **motion_group**: Unique identifier for the motion group - **initial_joint_position**: Specifies the initial joint position for the added motion group ",
52
+ )
53
+ __properties: ClassVar[List[str]] = ["kind", "manufacturer", "type", "json", "initial_joint_position", "motion_groups"]
48
54
 
49
55
  @field_validator("kind")
50
56
  def kind_validate_enum(cls, value):
@@ -90,6 +96,13 @@ class VirtualController(BaseModel):
90
96
  exclude=excluded_fields,
91
97
  exclude_none=True,
92
98
  )
99
+ # override the default output from pydantic by calling `to_dict()` of each item in motion_groups (list)
100
+ _items = []
101
+ if self.motion_groups:
102
+ for _item_motion_groups in self.motion_groups:
103
+ if _item_motion_groups:
104
+ _items.append(_item_motion_groups.to_dict())
105
+ _dict["motion_groups"] = _items
93
106
  return _dict
94
107
 
95
108
  @classmethod
@@ -108,6 +121,9 @@ class VirtualController(BaseModel):
108
121
  "type": obj.get("type"),
109
122
  "json": obj.get("json"),
110
123
  "initial_joint_position": obj.get("initial_joint_position"),
124
+ "motion_groups": [AddVirtualControllerMotionGroupRequest.from_dict(_item) for _item in obj["motion_groups"]]
125
+ if obj.get("motion_groups") is not None
126
+ else None,
111
127
  }
112
128
  )
113
129
  return _obj
@@ -13,7 +13,7 @@ Generated by OpenAPI Generator (https://openapi-generator.tech)
13
13
  Do not edit the class manually.
14
14
  """ # noqa: E501
15
15
 
16
- __version__ = "26.6.0.dev34"
16
+ __version__ = "26.6.0.dev36"
17
17
 
18
18
  from . import api
19
19
  from . import api_client
@@ -35,6 +35,7 @@ from wandelbots_api_client.v2_pydantic.models import ProfinetDescription
35
35
  from wandelbots_api_client.v2_pydantic.models import ProfinetIO
36
36
  from wandelbots_api_client.v2_pydantic.models import ProfinetIOData
37
37
  from wandelbots_api_client.v2_pydantic.models import ProfinetInputOutputConfig
38
+ from wandelbots_api_client.v2_pydantic.models import ProfinetSlotOffset
38
39
  from wandelbots_api_client.v2_pydantic.models import Snap7IO
39
40
  from wandelbots_api_client.v2_pydantic.models import Snap7IOData
40
41
 
@@ -3837,6 +3838,12 @@ class BUSInputsOutputsApi:
3837
3838
  async def get_profinet_ios_from_file(
3838
3839
  self,
3839
3840
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3841
+ offsets: Annotated[
3842
+ Optional[List[ProfinetSlotOffset]],
3843
+ Field(
3844
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
3845
+ ),
3846
+ ] = None,
3840
3847
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3841
3848
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3842
3849
  _request_timeout: Union[
@@ -3849,10 +3856,12 @@ class BUSInputsOutputsApi:
3849
3856
  ) -> str:
3850
3857
  """PROFINET Inputs/Outputs to File
3851
3858
 
3852
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
3859
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3853
3860
 
3854
3861
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3855
3862
  :type cell: str
3863
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
3864
+ :type offsets: List[ProfinetSlotOffset]
3856
3865
  :param input_offset:
3857
3866
  :type input_offset: int
3858
3867
  :param output_offset:
@@ -3881,6 +3890,7 @@ class BUSInputsOutputsApi:
3881
3890
 
3882
3891
  _param = self._get_profinet_ios_from_file_serialize(
3883
3892
  cell=cell,
3893
+ offsets=offsets,
3884
3894
  input_offset=input_offset,
3885
3895
  output_offset=output_offset,
3886
3896
  _request_auth=_request_auth,
@@ -3907,6 +3917,12 @@ class BUSInputsOutputsApi:
3907
3917
  async def get_profinet_ios_from_file_with_http_info(
3908
3918
  self,
3909
3919
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3920
+ offsets: Annotated[
3921
+ Optional[List[ProfinetSlotOffset]],
3922
+ Field(
3923
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
3924
+ ),
3925
+ ] = None,
3910
3926
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3911
3927
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3912
3928
  _request_timeout: Union[
@@ -3919,10 +3935,12 @@ class BUSInputsOutputsApi:
3919
3935
  ) -> ApiResponse[str]:
3920
3936
  """PROFINET Inputs/Outputs to File
3921
3937
 
3922
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
3938
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3923
3939
 
3924
3940
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3925
3941
  :type cell: str
3942
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
3943
+ :type offsets: List[ProfinetSlotOffset]
3926
3944
  :param input_offset:
3927
3945
  :type input_offset: int
3928
3946
  :param output_offset:
@@ -3951,6 +3969,7 @@ class BUSInputsOutputsApi:
3951
3969
 
3952
3970
  _param = self._get_profinet_ios_from_file_serialize(
3953
3971
  cell=cell,
3972
+ offsets=offsets,
3954
3973
  input_offset=input_offset,
3955
3974
  output_offset=output_offset,
3956
3975
  _request_auth=_request_auth,
@@ -3977,6 +3996,12 @@ class BUSInputsOutputsApi:
3977
3996
  async def get_profinet_ios_from_file_without_preload_content(
3978
3997
  self,
3979
3998
  cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")],
3999
+ offsets: Annotated[
4000
+ Optional[List[ProfinetSlotOffset]],
4001
+ Field(
4002
+ description="Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters. "
4003
+ ),
4004
+ ] = None,
3980
4005
  input_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3981
4006
  output_offset: Optional[Annotated[int, Field(strict=True, ge=0)]] = None,
3982
4007
  _request_timeout: Union[
@@ -3989,10 +4014,12 @@ class BUSInputsOutputsApi:
3989
4014
  ) -> RESTResponseType:
3990
4015
  """PROFINET Inputs/Outputs to File
3991
4016
 
3992
- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal.
4017
+ **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify per-slot byte offsets for input and output variable addresses to get an XML tag map that is ready for pasting to third party software, e.g., TIA portal. For backward compatibility, the legacy `input_offset` and `output_offset` query parameters remain available, but deprecated.
3993
4018
 
3994
4019
  :param cell: Unique identifier addressing a cell in all API calls. (required)
3995
4020
  :type cell: str
4021
+ :param offsets: Per-slot offsets used to convert device-local byte addresses to controller byte addresses for export. If this parameter is provided, it is preferred over the deprecated `input_offset` and `output_offset` query parameters.
4022
+ :type offsets: List[ProfinetSlotOffset]
3996
4023
  :param input_offset:
3997
4024
  :type input_offset: int
3998
4025
  :param output_offset:
@@ -4021,6 +4048,7 @@ class BUSInputsOutputsApi:
4021
4048
 
4022
4049
  _param = self._get_profinet_ios_from_file_serialize(
4023
4050
  cell=cell,
4051
+ offsets=offsets,
4024
4052
  input_offset=input_offset,
4025
4053
  output_offset=output_offset,
4026
4054
  _request_auth=_request_auth,
@@ -4042,6 +4070,7 @@ class BUSInputsOutputsApi:
4042
4070
  def _get_profinet_ios_from_file_serialize(
4043
4071
  self,
4044
4072
  cell,
4073
+ offsets,
4045
4074
  input_offset,
4046
4075
  output_offset,
4047
4076
  _request_auth,
@@ -4052,7 +4081,9 @@ class BUSInputsOutputsApi:
4052
4081
 
4053
4082
  _host = None
4054
4083
 
4055
- _collection_formats: Dict[str, str] = {}
4084
+ _collection_formats: Dict[str, str] = {
4085
+ "offsets": "csv",
4086
+ }
4056
4087
 
4057
4088
  _path_params: Dict[str, str] = {}
4058
4089
  _query_params: List[Tuple[str, str]] = []
@@ -4065,6 +4096,9 @@ class BUSInputsOutputsApi:
4065
4096
  if cell is not None:
4066
4097
  _path_params["cell"] = cell
4067
4098
  # process the query parameters
4099
+ if offsets is not None:
4100
+ _query_params.append(("offsets", offsets))
4101
+
4068
4102
  if input_offset is not None:
4069
4103
  _query_params.append(("input_offset", input_offset))
4070
4104
 
@@ -85,7 +85,7 @@ class ApiClient:
85
85
  self.default_headers[header_name] = header_value
86
86
  self.cookie = cookie
87
87
  # Set default User-Agent.
88
- self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev34"
88
+ self.user_agent = "Wandelbots-Nova-API-Python-Client/26.6.0.dev36"
89
89
  self.client_side_validation = configuration.client_side_validation
90
90
 
91
91
  async def __aenter__(self):
@@ -512,7 +512,7 @@ class Configuration:
512
512
  "OS: {env}\n"
513
513
  "Python Version: {pyversion}\n"
514
514
  "Version of the API: 2.6.0 dev\n"
515
- "SDK Package Version: 26.6.0.dev34".format(env=sys.platform, pyversion=sys.version)
515
+ "SDK Package Version: 26.6.0.dev36".format(env=sys.platform, pyversion=sys.version)
516
516
  )
517
517
 
518
518
  def get_host_settings(self) -> List[HostSetting]:
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
- # filename: tmpkeqga2at
3
- # timestamp: 2026-06-25T08:50:09+00:00
2
+ # filename: tmplufo57rb
3
+ # timestamp: 2026-06-26T13:12:46+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -347,6 +347,7 @@ from .models import (
347
347
  ProfinetIOs,
348
348
  ProfinetInputOutputConfig,
349
349
  ProfinetSlotDescription,
350
+ ProfinetSlotOffset,
350
351
  ProfinetSubSlotDescription,
351
352
  Program,
352
353
  ProgramRun,
@@ -780,6 +781,7 @@ __all__ = [
780
781
  "ProfinetIOs",
781
782
  "ProfinetInputOutputConfig",
782
783
  "ProfinetSlotDescription",
784
+ "ProfinetSlotOffset",
783
785
  "ProfinetSubSlotDescription",
784
786
  "Program",
785
787
  "ProgramRun",
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: models.yaml
3
- # timestamp: 2026-06-25T08:50:09+00:00
3
+ # timestamp: 2026-06-26T13:12:46+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
  from pydantic import AnyUrl, AwareDatetime, BaseModel, EmailStr, Field, RootModel
@@ -182,6 +182,74 @@ class Manufacturer(Enum):
182
182
  YASKAWA = "yaskawa"
183
183
 
184
184
 
185
+ class MotionGroupModel(RootModel[str]):
186
+ root: str = Field(
187
+ ...,
188
+ examples=["ABB_1010_037_15", "FANUC_ARC_Mate_100iD", "KUKA_KR10_R1100", "UniversalRobots_UR10", "Yaskawa_AR1440"],
189
+ title="MotionGroupModel",
190
+ )
191
+ """
192
+ Identifies a single motion group model.
193
+ See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types.
194
+
195
+ """
196
+
197
+
198
+ class MotionGroupFromType(BaseModel):
199
+ motion_group: str
200
+ """
201
+ Unique identifier for the motion group to be added.
202
+ """
203
+ motion_group_model: MotionGroupModel
204
+ initial_joint_position: str | None = None
205
+ """
206
+ Initial joint position of the added motion group.
207
+ Provides the joint position as a JSON array of float values in radians. The array length
208
+ must match the robot's degrees of freedom, e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
209
+ If the provided array length does not match the robot's DOF, the array will be adjusted; if it is longer, extra values will be truncated;
210
+ if it is shorter, missing values will be filled with zeros.
211
+
212
+ """
213
+
214
+
215
+ class MotionGroupFromJson(BaseModel):
216
+ motion_group: str
217
+ """
218
+ Unique identifier for the motion group to be added.
219
+ """
220
+ json_data: str
221
+ """
222
+ JSON configuration of the virtual robot controller, can be obtained from the physical controller's configuration
223
+ via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration).
224
+
225
+ """
226
+ extracted_motion_group_id: str
227
+ """
228
+ The identifier of the motion group that needs to be extracted from the provided JSON configuration.
229
+
230
+ """
231
+ initial_joint_position: str | None = None
232
+ """
233
+ Initial joint position of the added motion group.
234
+ Provides the joint position as a JSON array of float values in radians. The array length
235
+ must match the robot's degrees of freedom, e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
236
+ If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated;
237
+ if it is shorter, missing values will be filled with zeros.
238
+
239
+ """
240
+
241
+
242
+ class AddVirtualControllerMotionGroupRequest(RootModel[MotionGroupFromType | MotionGroupFromJson]):
243
+ root: MotionGroupFromType | MotionGroupFromJson = Field(..., title="AddVirtualControllerMotionGroupRequest")
244
+ """
245
+ Request body wrapper for `addVirtualControllerMotionGroup`.
246
+ Allow either referencing a predefined motion group model or
247
+ uploading a JSON configuration that the backend converts into a
248
+ motion group description.
249
+
250
+ """
251
+
252
+
185
253
  class VirtualController(BaseModel):
186
254
  """
187
255
  The configuration of a virtual robot controller has to contain the manufacturer string,
@@ -225,12 +293,28 @@ class VirtualController(BaseModel):
225
293
  initial_joint_position: str | None = None
226
294
  """
227
295
  Initial joint position of the first motion group from the virtual robot controller.
228
- Provides the joint position as a JSON array of float values in radians, where the array length
229
- must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
296
+ Provides the joint position as a JSON array of float values in radians. The array length
297
+ must match the robot's degrees of freedom, e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
230
298
  If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated;
231
299
  if it is shorter, missing values will be filled with zeros.
232
300
 
233
301
  """
302
+ motion_groups: list[AddVirtualControllerMotionGroupRequest] | None = Field(None, max_length=10)
303
+ """
304
+ Adds a motion group configuration for the virtual robot controller.
305
+
306
+ > **NOTE**
307
+ >
308
+ > Set only one of the two options, **motion_group_model**, or **json_data**
309
+
310
+ - **motion_group_model**: Identifies a single motion group. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types
311
+ - **json_data**: JSON configuration of the virtual robot controller, can be obtained from the physical controller's configuration
312
+ via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration)
313
+ - **extracted_motion_group_id**: Motion group identifier to extract from the provided JSON configuration, required when using json_data
314
+ - **motion_group**: Unique identifier for the motion group
315
+ - **initial_joint_position**: Specifies the initial joint position for the added motion group
316
+
317
+ """
234
318
 
235
319
 
236
320
  class YaskawaController(BaseModel):
@@ -383,7 +467,7 @@ class App(BaseModel):
383
467
  name: str = Field(..., min_length=1, pattern="^[a-z][a-z0-9-]{0,61}[a-z0-9]$")
384
468
  """
385
469
  The name of the provided application.
386
- The name must be unique within the cell and is used as a identifier for addressing the application in all API calls
470
+ The name must be unique within the cell and is used as an identifier for addressing the application in all API calls
387
471
  , e.g., when updating the application.
388
472
 
389
473
  It also defines where the application is reachable (/$cell/$name).
@@ -1184,19 +1268,6 @@ class MotionGroupModelDescription(BaseModel):
1184
1268
  """
1185
1269
 
1186
1270
 
1187
- class MotionGroupModel(RootModel[str]):
1188
- root: str = Field(
1189
- ...,
1190
- examples=["ABB_1010_037_15", "FANUC_ARC_Mate_100iD", "KUKA_KR10_R1100", "UniversalRobots_UR10", "Yaskawa_AR1440"],
1191
- title="MotionGroupModel",
1192
- )
1193
- """
1194
- Identifies a single motion group model.
1195
- See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types.
1196
-
1197
- """
1198
-
1199
-
1200
1271
  class MotionGroupConfiguration(BaseModel):
1201
1272
  """
1202
1273
  Response for motion group configuration lookup.
@@ -5882,61 +5953,6 @@ class MotionGroupInfos(RootModel[list[MotionGroupInfo]]):
5882
5953
  return iter(self.root)
5883
5954
 
5884
5955
 
5885
- class MotionGroupFromType(BaseModel):
5886
- motion_group: str
5887
- """
5888
- Unique identifier for the motion group to be added.
5889
- """
5890
- motion_group_model: MotionGroupModel
5891
- initial_joint_position: str | None = None
5892
- """
5893
- Initial joint position of the added motion group.
5894
- Provides the joint position as a JSON array of float values in radians, where the array length
5895
- must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
5896
- If the provided array length does not match the robot's DOF, the array will be adjusted; if it is longer, extra values will be truncated;
5897
- if it is shorter, missing values will be filled with zeros.
5898
-
5899
- """
5900
-
5901
-
5902
- class MotionGroupFromJson(BaseModel):
5903
- motion_group: str
5904
- """
5905
- Unique identifier for the motion group to be added.
5906
- """
5907
- json_data: str
5908
- """
5909
- Full JSON configuration of the virtual robot controller.
5910
- This can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration).
5911
-
5912
- """
5913
- extracted_motion_group_id: str
5914
- """
5915
- The identifier of the motion group that needs to be extracted from the provided JSON configuration.
5916
-
5917
- """
5918
- initial_joint_position: str | None = None
5919
- """
5920
- Initial joint position of the added motion group.
5921
- Provides the joint position as a JSON array of float values in radians, where the array length
5922
- must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot.
5923
- If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated;
5924
- if it is shorter, missing values will be filled with zeros.
5925
-
5926
- """
5927
-
5928
-
5929
- class AddVirtualControllerMotionGroupRequest(RootModel[MotionGroupFromType | MotionGroupFromJson]):
5930
- root: MotionGroupFromType | MotionGroupFromJson = Field(..., title="AddVirtualControllerMotionGroupRequest")
5931
- """
5932
- Request body wrapper for `addVirtualControllerMotionGroup`.
5933
- Allow callers to either reference a predefined motion group model or
5934
- upload a full JSON configuration that the backend extracts into a
5935
- motion group description.
5936
-
5937
- """
5938
-
5939
-
5940
5956
  class SafetyGeometrySphere(BaseModel):
5941
5957
  """
5942
5958
  Sphere shape defined by a center point and a radius.
@@ -6591,8 +6607,8 @@ class ProfinetIOData(BaseModel):
6591
6607
  - Bytes 0-63: Slot 1
6592
6608
  - Bytes 64-127: Slot 2
6593
6609
 
6594
- When importing from a tag table, e.g., TIA Portal, use `input_offset`/`output_offset`
6595
- to convert global PLC addresses to device-local addresses:
6610
+ When importing from a tag table, e.g., TIA Portal, use per-slot `offsets`
6611
+ (or the deprecated `input_offset`/`output_offset`) to convert global PLC addresses to device-local addresses:
6596
6612
  `device_byte_address` = `plc_byte_address` - offset
6597
6613
 
6598
6614
  """
@@ -6649,6 +6665,28 @@ class ProfinetIOs(RootModel[list[ProfinetIO]]):
6649
6665
  return iter(self.root)
6650
6666
 
6651
6667
 
6668
+ class ProfinetSlotOffset(BaseModel):
6669
+ slot: int = Field(..., examples=[1], ge=0, le=2147483647)
6670
+ """
6671
+ The number/index of the PROFINET slot these offsets apply to.
6672
+ Per default, slot 0 is reserved for the device access point (DAP).
6673
+ Slots that are part of the cyclic input/output data exchange start at number 1.
6674
+
6675
+ """
6676
+ input_offset: int = Field(0, examples=[100], ge=0, le=2147483647)
6677
+ """
6678
+ This slot's offset in bytes for the addresses of input variables from the perspective of the controller.
6679
+ For imported tag tables, this offset is subtracted from the controller byte addresses.
6680
+
6681
+ """
6682
+ output_offset: int = Field(0, examples=[800], ge=0, le=2147483647)
6683
+ """
6684
+ This slot's offset in bytes for the addresses of output variables from the perspective of the controller.
6685
+ For imported tag tables, this offset is subtracted from the controller byte addresses.
6686
+
6687
+ """
6688
+
6689
+
6652
6690
  class ProfinetInputOutputConfig(BaseModel):
6653
6691
  config: str = Field(
6654
6692
  ...,
@@ -6661,13 +6699,28 @@ class ProfinetInputOutputConfig(BaseModel):
6661
6699
  The XML File has to be embedded as a string by escaping quotes, line breaks and so forth.
6662
6700
 
6663
6701
  """
6664
- input_offset: int = Field(0, examples=[100], ge=0, le=2147483647)
6702
+ offsets: list[ProfinetSlotOffset] | None = Field(
6703
+ None, examples=[[{"slot": 1, "input_offset": 100, "output_offset": 800}, {"slot": 2, "input_offset": 164, "output_offset": 864}]]
6704
+ )
6665
6705
  """
6666
- Offset in bytes for the address of the input (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content.
6706
+ Per-slot offsets for translating controller addresses to PROFINET device-local byte addresses.
6707
+ Use this field for multi-slot devices.
6708
+ If omitted, the deprecated `input_offset` and `output_offset` fields are used for backward compatibility.
6709
+
6667
6710
  """
6668
- output_offset: int = Field(0, examples=[800], ge=0, le=2147483647)
6711
+ input_offset: int = Field(0, deprecated=True, examples=[100], ge=0, le=2147483647)
6669
6712
  """
6670
- Offset in bytes for the address of the output (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content.
6713
+ Offset in bytes for the addresses of input variables from the perspective of the controller.
6714
+ This field is deprecated and replaced by `offsets` to support per-slot offsets.
6715
+ The offset is subtracted from the byte addresses of the sent XML content.
6716
+
6717
+ """
6718
+ output_offset: int = Field(0, deprecated=True, examples=[800], ge=0, le=2147483647)
6719
+ """
6720
+ Offset in bytes for the addresses of output variables from the perspective of the controller.
6721
+ This field is deprecated and replaced by `offsets` to support per-slot offsets.
6722
+ The offset is subtracted from the byte addresses of the sent XML content.
6723
+
6671
6724
  """
6672
6725
 
6673
6726
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wandelbots_api_client
3
- Version: 26.6.0.dev34
3
+ Version: 26.6.0.dev36
4
4
  Summary: Wandelbots Python Client: Interact with robots in an easy and intuitive way.
5
5
  Author: Copyright (c) 2025 Wandelbots GmbH
6
6
  Author-email: Copyright (c) 2025 Wandelbots GmbH <contact@wandelbots.com>
@@ -31,7 +31,7 @@ Description-Content-Type: text/markdown
31
31
  Interact with robots in an easy and intuitive way.
32
32
 
33
33
  - Compatible API version: 1.6.0 dev (can be found at the home screen of your instance -> API)
34
- - Package version: 26.6.0.dev34
34
+ - Package version: 26.6.0.dev36
35
35
 
36
36
  ## Requirements.
37
37
  Python >=3.11, Python < 4.0
@@ -1,4 +1,4 @@
1
- wandelbots_api_client/__init__.py,sha256=uwWvTx_D1cm2v1BSLf_xumFboU22ocX_N5C3PBIRsGE,1006
1
+ wandelbots_api_client/__init__.py,sha256=BgJexXT_ypt8GY56zGOW1sZxEIYom0gby9hfjlp5850,1006
2
2
  wandelbots_api_client/api/__init__.py,sha256=piFvcUqVadKhV50ReEqZToWDDC4g0frxtAfyafQlDkY,2187
3
3
  wandelbots_api_client/api/application_api.py,sha256=-5DwphV1M6vjTIoLAnbCZQ0qMyhItyUOa34mBVwwy6k,69180
4
4
  wandelbots_api_client/api/cell_api.py,sha256=tyIzo-u_9MYFugxzG1KVS8yu7lPLDmjNbjMI25bnavE,64318
@@ -28,10 +28,10 @@ wandelbots_api_client/api/virtual_robot_api.py,sha256=wJTD35wDNe_4yQSDDZclMJs35u
28
28
  wandelbots_api_client/api/virtual_robot_behavior_api.py,sha256=bs-KPZ-3bVg_1_ue_8ZCpHPAPRTdaHpFCWcbxVKNcb0,32218
29
29
  wandelbots_api_client/api/virtual_robot_mode_api.py,sha256=10-Uegk-HtigwJnAMPMDrhtkDOnZdh7ESJ0kD_nOXfo,72987
30
30
  wandelbots_api_client/api/virtual_robot_setup_api.py,sha256=Twl6ZmHhHoa9-kBcVNV1TibwTErvBhIPTAVi_5eSil4,114644
31
- wandelbots_api_client/api_client.py,sha256=tX7f7H4rVqz_goQ-lsjg_ulPWpH_nOX-yf-th7bq7dk,26427
31
+ wandelbots_api_client/api_client.py,sha256=Y27OKhdI75VOlOuETOBN3iLkJ9-rdUgIKS2EJq39_W4,26427
32
32
  wandelbots_api_client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
33
33
  wandelbots_api_client/authorization.py,sha256=JERTe2xyuipN5rznFtCkfFVib1LeuUHroTRERYhEzYI,9405
34
- wandelbots_api_client/configuration.py,sha256=aOTB0bYPWB-qmVwmXTq64FOVNziOqSFB-UqqF15Jc-g,18044
34
+ wandelbots_api_client/configuration.py,sha256=SKyjC956fHSHAWIANF9cnFK9hHblXfFR7OZTvvOyJSo,18044
35
35
  wandelbots_api_client/exceptions.py,sha256=JycLLlMu4Vcf4EGkp_XQN5l53je8c24OYUvT4w86FxM,6393
36
36
  wandelbots_api_client/models/__init__.py,sha256=LtudGp9PcPN_DoWK1SuIU0TfCX1BDosgsIhYvoZ7ZgY,23912
37
37
  wandelbots_api_client/models/abb_controller.py,sha256=TAwe89bqD2wPPsr-Fu_ibV9AquDfI1UzlAns33P0RIs,4054
@@ -327,10 +327,10 @@ wandelbots_api_client/models/virtual_robot_configuration.py,sha256=FiYA1J2cx_fN_
327
327
  wandelbots_api_client/models/yaskawa_controller.py,sha256=7JEYdmDPS-vaCCMB9036FuGszqZP0TivmVL7S1yf_dQ,3140
328
328
  wandelbots_api_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  wandelbots_api_client/rest.py,sha256=1dKCKmzslgorZRAC3aYw0_SA8lnuB2b-1nyBoORhoCc,7250
330
- wandelbots_api_client/v2/__init__.py,sha256=mwOnBXQWFvc6QQPIlC65xraK6PuKMpNSyDqvKkpCqvk,1032
330
+ wandelbots_api_client/v2/__init__.py,sha256=0UqTIEmo2txCLJjMjKZ0FF_XhVfiDs27chsJkVIEq-I,1032
331
331
  wandelbots_api_client/v2/api/__init__.py,sha256=P0yGp2xWLeEPi0maOq33OfqhAM3pyWPwtc5AJpdTp8Y,1967
332
332
  wandelbots_api_client/v2/api/application_api.py,sha256=nVY1ZFCeazTJOou0UKhtAaFURbixCIFAl-AIAFvn4-8,69559
333
- wandelbots_api_client/v2/api/bus_inputs_outputs_api.py,sha256=4PyltlWL5AKmc7zcSjrb9eYQbO4lyfi6iPIN1RkwCd0,264684
333
+ wandelbots_api_client/v2/api/bus_inputs_outputs_api.py,sha256=3V_7OHnjzC0LnS-jAnEhb_Yv90TGnAP-egURffcUIcs,267414
334
334
  wandelbots_api_client/v2/api/cell_api.py,sha256=LNF-C9mrwS7-FyCQ4wd7-IpbsJuUMitJ-wotCXiTNwY,98357
335
335
  wandelbots_api_client/v2/api/controller_api.py,sha256=oMIaPzt3e1J96Kfs_OCimDWTf2aZGMUpnTOB9nBuczo,162803
336
336
  wandelbots_api_client/v2/api/controller_inputs_outputs_api.py,sha256=xDVCv9n4Q-rJr1m7ISbucc_bck1zAaJJXWdM2N57ko4,61619
@@ -354,11 +354,11 @@ wandelbots_api_client/v2/api/version_api.py,sha256=1dAhtFz73CmB6F8fMOgsLGjCWq4w6
354
354
  wandelbots_api_client/v2/api/virtual_controller_api.py,sha256=nQ_rkwRufKGKGHB3QIjm7i771tqKRJGlt8nGxWupMPI,291431
355
355
  wandelbots_api_client/v2/api/virtual_controller_behavior_api.py,sha256=ByeJFFto88jrhAu8LpXAuHosXXIKpks5rSY8ZOWUdG4,41046
356
356
  wandelbots_api_client/v2/api/virtual_controller_inputs_outputs_api.py,sha256=OcQg8mxoQqZLHpByvSY3iqWNLia8rsxlvdpwlc02wb0,42027
357
- wandelbots_api_client/v2/api_client.py,sha256=3LWJDMrRsg7CaQMAjtjg1vQLhYRP5i1MPrNrlUQkXM0,27803
357
+ wandelbots_api_client/v2/api_client.py,sha256=5GutTeySJ_UbH1OA_AMmDAM82X3M4Bf_YDdBxlEMjW4,27803
358
358
  wandelbots_api_client/v2/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
359
- wandelbots_api_client/v2/configuration.py,sha256=1smJH51cjJgSaRTeCgxBsb-wQ0tIWLrikHR363nCKck,18047
359
+ wandelbots_api_client/v2/configuration.py,sha256=iSYCVMxa_7ilBkRTPMIn5OZm4xQ_LAI4wvtr1edU1S8,18047
360
360
  wandelbots_api_client/v2/exceptions.py,sha256=7XIPwMCrxI3N-TgSYabwGXMOROXRQdrJA2wOpyaRC1A,6393
361
- wandelbots_api_client/v2/models/__init__.py,sha256=QWkXRd6Se0Fb4H9WKZP6x_Dcv9t7JU0v4EPvHq9SKDY,36327
361
+ wandelbots_api_client/v2/models/__init__.py,sha256=dy4y6VNcCHGWUDaVkI1Ca4BCgxOb7j7byoFm6zfSiio,36411
362
362
  wandelbots_api_client/v2/models/abb_confdata.py,sha256=lXK9rOsDRyCc2urbmVISftopF5LEbANjZ1R-1jXeLNg,3378
363
363
  wandelbots_api_client/v2/models/abb_configured_pose.py,sha256=Lg-eaUD80RzyQRshY3vm5BIq3_qFPZdz3kQk0ue9w_w,3144
364
364
  wandelbots_api_client/v2/models/abb_controller.py,sha256=P7QY_bKvz5fbW_nub4o2yROATVzb8xNr4cBetw5reSk,3741
@@ -369,9 +369,9 @@ wandelbots_api_client/v2/models/add_trajectory_error.py,sha256=4ZZNgmkVjrCXUyqmo
369
369
  wandelbots_api_client/v2/models/add_trajectory_error_data.py,sha256=yBwEjh44aaCSsfT-8BX0Dn8S8IYeLKURQ2-lkgKt0_Q,12037
370
370
  wandelbots_api_client/v2/models/add_trajectory_request.py,sha256=v1AkFMCRtyps9TZIJATZPgezaDjdNrE5subG013_08c,3340
371
371
  wandelbots_api_client/v2/models/add_trajectory_response.py,sha256=nLQ5NJ8Wa4mYHTmcVn26mMaN7vu-RNl9HF0XUYV71Zc,4107
372
- wandelbots_api_client/v2/models/add_virtual_controller_motion_group_request.py,sha256=WI0MW_7hNW8mjHzlIVfWHj8OrxRr_RCp_6T4KmtRbhM,6003
372
+ wandelbots_api_client/v2/models/add_virtual_controller_motion_group_request.py,sha256=oNPZMJ0nbKEh33m7qS8SR3MZ61_h7h4QQSOTZNC2Hq0,5992
373
373
  wandelbots_api_client/v2/models/api_version.py,sha256=GSg2sjNUXrPsfKYW9qESM_uOj_yS4RjMKp7aAlMzmh8,2434
374
- wandelbots_api_client/v2/models/app.py,sha256=sJKGN_mgD0OrS69Q-_l7ZhejWE1NTm9sViwvJDtRNss,7400
374
+ wandelbots_api_client/v2/models/app.py,sha256=Kf4_xcKsqXDfZ4-GuHCPMJwKKH4X-7ZrSqHu-ApEWYI,7401
375
375
  wandelbots_api_client/v2/models/axis_range.py,sha256=_NFRBYPhK6f9sbQ3OkYiYPpBGXuqTHwGHc0ypElZIBs,2852
376
376
  wandelbots_api_client/v2/models/behavior.py,sha256=aT7Zk899s7cTeA0kbBW94Mm6c1tvz0kPctHC_1WR_NU,1760
377
377
  wandelbots_api_client/v2/models/blending_auto.py,sha256=2z9xoc8xJHOcu7bMejDKFEGZ_XaEJCBhSI0KpT_YWDc,3350
@@ -601,8 +601,8 @@ wandelbots_api_client/v2/models/motion_command_blending.py,sha256=OagbqpBKZIngWk
601
601
  wandelbots_api_client/v2/models/motion_command_path.py,sha256=qw5dxdoD_SIBGjZT_cYn4kCjYb144fwICSdKfnPC7wg,11990
602
602
  wandelbots_api_client/v2/models/motion_group_configuration.py,sha256=jUrLoRAFpJqCrsQla-OjwEqWzmMQejKHPhT8EPOgiJY,3333
603
603
  wandelbots_api_client/v2/models/motion_group_description.py,sha256=c20KRlvuBgTBAzeYs8kZEmy_unaS-h9PP4KtpCV4cKs,12906
604
- wandelbots_api_client/v2/models/motion_group_from_json.py,sha256=G5GXa-_oRq_hlLAg1DYAP7zNw8ro525IjACn1zbwOoM,3865
605
- wandelbots_api_client/v2/models/motion_group_from_type.py,sha256=sQ2kM1tM3XsEdlBWAsYNKlsh5k1Nb8QpQiadkHdaX0Q,3521
604
+ wandelbots_api_client/v2/models/motion_group_from_json.py,sha256=2a6Qbl1Xz1GC6oWBWrqpP91cuHeSS253GpGL6UZdocs,3843
605
+ wandelbots_api_client/v2/models/motion_group_from_type.py,sha256=ebph-vm7XwrPohFqq_pgMHWWPtB7QcnTT1RtB-7GG_4,3509
606
606
  wandelbots_api_client/v2/models/motion_group_info.py,sha256=19eCUMmVa-MP3xlaG-PzTc1AiHaprd-29I6CBtXprRw,2926
607
607
  wandelbots_api_client/v2/models/motion_group_joints.py,sha256=e9UjESBc6j_sXqzIMFb8bVHZ4y-yTU-9wJ9RNC11CTM,3394
608
608
  wandelbots_api_client/v2/models/motion_group_model_description.py,sha256=9C5oRCJnToIdzy9TAVQFXhY1NdY8jnD_0ItCc363ebo,3182
@@ -664,12 +664,13 @@ wandelbots_api_client/v2/models/pose_waypoint.py,sha256=l8EW-HerSCc21sI9kuaS2yoq
664
664
  wandelbots_api_client/v2/models/pose_waypoints_request.py,sha256=wUACg_Jw5mPt5QKrEAt446DdGYOUhUL6YmN2tKNbZZA,4129
665
665
  wandelbots_api_client/v2/models/pose_waypoints_response.py,sha256=MfoepIztvujmRgp7ShYPCQzIT97PiajWnKyer3WYtUo,2902
666
666
  wandelbots_api_client/v2/models/profinet_description.py,sha256=l2BAa64K7pKkrrEmES7MMrTm4mivIR_J-oo__kuPvGM,4346
667
- wandelbots_api_client/v2/models/profinet_input_output_config.py,sha256=izimgFrY6cCQgXeKrjNCRVhkVZGLRH9JyV3HQXDM3A0,3531
668
- wandelbots_api_client/v2/models/profinet_io.py,sha256=eBAPWzh8uvzhl_O2dxlsfHdUezNjM71BK1hKfxeyo5o,4447
669
- wandelbots_api_client/v2/models/profinet_io_data.py,sha256=AEbZ_IINxVqJfKPUIWF1LyKWTJGEGVBtzj-sLDNOxx8,4187
667
+ wandelbots_api_client/v2/models/profinet_input_output_config.py,sha256=mG7OvtYDqHxemTA6HqUvVbiutRU5KAiNXxMz3RCydWk,4668
668
+ wandelbots_api_client/v2/models/profinet_io.py,sha256=CDhb0HiCNycdb8L-CMzMAVfsc6hTb0U2G2EQPHmPxqQ,4486
669
+ wandelbots_api_client/v2/models/profinet_io_data.py,sha256=2bfupZwvekC3Rlt_s7FnHaRjdzEGekpNBbrq2-oeapg,4226
670
670
  wandelbots_api_client/v2/models/profinet_io_direction.py,sha256=TVmv7_FFbyVlfQYCYVnvZawz9klogGXjsZwKyaNwd8o,981
671
671
  wandelbots_api_client/v2/models/profinet_io_type_enum.py,sha256=6NIVhjyI1FxQa2XYzrj05He-ftkIcTx9kxA0tYuzjeA,1276
672
672
  wandelbots_api_client/v2/models/profinet_slot_description.py,sha256=O_eR16-TiMuOk8U1e9w6DqdF4EeTsb9uxzzwpuhMGus,4344
673
+ wandelbots_api_client/v2/models/profinet_slot_offset.py,sha256=oaVil37VWX9FQGxwdPeM1t4gmC2p_1uYQGk8ALnPe_M,3634
673
674
  wandelbots_api_client/v2/models/profinet_sub_slot_description.py,sha256=fIMpmKvPuSpkrVQCGeiP_woCZGpOTJKJEmXqPDvMTZg,3115
674
675
  wandelbots_api_client/v2/models/program.py,sha256=il2MNLh7_1qPr2P1tAxeP9swBmFrYoyLQKkPMwBIigE,3436
675
676
  wandelbots_api_client/v2/models/program_run.py,sha256=YXMrkZc9f3mPj1tMtSJ9yvflfPpnGXpqmmQPn2OOUZU,4469
@@ -750,7 +751,7 @@ wandelbots_api_client/v2/models/update_nova_version_request.py,sha256=Ud4caP7pki
750
751
  wandelbots_api_client/v2/models/user.py,sha256=VFWqbqojbO9chOLy9GplTbF4-33XbsjbJ3FOzmkZRAA,2819
751
752
  wandelbots_api_client/v2/models/validation_error.py,sha256=75BIzg8BvvAyiV4hSXxg-7we9WxWEzVKnsQe6D4n2YE,3119
752
753
  wandelbots_api_client/v2/models/validation_error2.py,sha256=DsUSXwFuMgD_ALT4tENHQg0yWnz6Al0n7ovAO_Dc0VY,2523
753
- wandelbots_api_client/v2/models/virtual_controller.py,sha256=TbcM22fvxXhg5PYXrlyR18J4Lwul_93ijQKDYTWQ7IY,4479
754
+ wandelbots_api_client/v2/models/virtual_controller.py,sha256=B4mPkKx4-lVgnT7HFlK0-nUBh3VqaHHAw1tXiwL45is,6211
754
755
  wandelbots_api_client/v2/models/virtual_robot_configuration.py,sha256=YT0CMFyiyg7OrIVpIbm9x6oHFlsy1EiVKSNWss91YOY,2817
755
756
  wandelbots_api_client/v2/models/wait_for_io_event_request.py,sha256=-etzsegz0Y-yZt58hmmXhcd8BUAbEoVEoVbGlMIzm_g,3065
756
757
  wandelbots_api_client/v2/models/yaskawa_controller.py,sha256=vNtXL8T3-KADzU1__0YWJ7_9QikLML4VFsbv2nz3owU,2843
@@ -760,10 +761,10 @@ wandelbots_api_client/v2/models/zod_validation_error_error_details_inner.py,sha2
760
761
  wandelbots_api_client/v2/models/zod_validation_error_error_details_inner_path_inner.py,sha256=BJFV1ZqYKcQauiUfZ10UhbRxVhOL0DjQyHzHhlQ-hUA,5652
761
762
  wandelbots_api_client/v2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
762
763
  wandelbots_api_client/v2/rest.py,sha256=pzalGbo_80nNBxbupQKYjZjOpOgPbYrEJtCfm236vL4,7253
763
- wandelbots_api_client/v2_pydantic/__init__.py,sha256=O3Mgz76iCAl4WpKUPCG4v6_PzMRoJrGXB-iJayQtEM0,1041
764
+ wandelbots_api_client/v2_pydantic/__init__.py,sha256=OAe_xLM4NSXP9wMaEZrTqrGoVzY6gY61OTa0IQUTxoE,1041
764
765
  wandelbots_api_client/v2_pydantic/api/__init__.py,sha256=P0yGp2xWLeEPi0maOq33OfqhAM3pyWPwtc5AJpdTp8Y,1967
765
766
  wandelbots_api_client/v2_pydantic/api/application_api.py,sha256=vU-xA4SdVSJuXu7EAO7tTK9yJjSkMR1Y5_76RZdBp-E,69591
766
- wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py,sha256=WXa9c8h4BnJcrlMmMAYF7l1XsyCWgo8jAdoTGSmL-zE,264638
767
+ wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py,sha256=CKmqk0PsMcT0Cp-2zEQDIS65dTWJJonJ83vkCAWEjn8,267356
767
768
  wandelbots_api_client/v2_pydantic/api/cell_api.py,sha256=KzWiJ_n_mTiwLcPNFADSRCmfwvohyEiYvtxb4413O2c,98340
768
769
  wandelbots_api_client/v2_pydantic/api/controller_api.py,sha256=b8_tWpqOSn_9jZj8hWRvwkxPcKZinyCSw5rQFLE5-Y4,162740
769
770
  wandelbots_api_client/v2_pydantic/api/controller_inputs_outputs_api.py,sha256=0XVnWUZedSIj2mIqCiukJYL-CqYoMYfK9QPbBWJ3aCs,61597
@@ -787,14 +788,14 @@ wandelbots_api_client/v2_pydantic/api/version_api.py,sha256=TTJwo3cWTBgxpeDO2S-S
787
788
  wandelbots_api_client/v2_pydantic/api/virtual_controller_api.py,sha256=rdrD4YOLnKKg_ILuzc37Ku_VMMJh2MUsR2a8frZraXc,291365
788
789
  wandelbots_api_client/v2_pydantic/api/virtual_controller_behavior_api.py,sha256=3mNzqQUb8JM_E7iZ4MJGg7rnEGdL9VFFqjLlrMa6bss,41027
789
790
  wandelbots_api_client/v2_pydantic/api/virtual_controller_inputs_outputs_api.py,sha256=LItWYQPUCu8mh2XAA9gOudhYTNMzIjtzY1ijXoV4w2E,42039
790
- wandelbots_api_client/v2_pydantic/api_client.py,sha256=e_O01CuouY66j9ndvpbvZ6gtlujbKgYewtePW68lfnA,27857
791
+ wandelbots_api_client/v2_pydantic/api_client.py,sha256=NUEk_PkCr-EdTP2PWM6uMdgcZkWtp8qHbdnasIjd2Io,27857
791
792
  wandelbots_api_client/v2_pydantic/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
792
- wandelbots_api_client/v2_pydantic/configuration.py,sha256=Z6Y2Pspn6YaqG7LOdyURtkR4rqR21fFUlGVPG22ZWaA,18056
793
+ wandelbots_api_client/v2_pydantic/configuration.py,sha256=E4BJzedzJdDEPIaeI_m30mtc9h9pvTTAXpXF5a4hOJc,18056
793
794
  wandelbots_api_client/v2_pydantic/exceptions.py,sha256=7XIPwMCrxI3N-TgSYabwGXMOROXRQdrJA2wOpyaRC1A,6393
794
- wandelbots_api_client/v2_pydantic/models/__init__.py,sha256=kguhEDgEhFnV8fgdTujgzM3i59uAJWk47MaGT3KbXxQ,22287
795
- wandelbots_api_client/v2_pydantic/models/models.py,sha256=Z3D_YYezTrbzkib2Oj8Q4c6apkZne2hS72v-EdMwVPE,205815
795
+ wandelbots_api_client/v2_pydantic/models/__init__.py,sha256=gflmYOF-E0LVQOAqcHiGb1GpifDZ0n7HBqPr7iUBA0s,22337
796
+ wandelbots_api_client/v2_pydantic/models/models.py,sha256=ifk2xGZEvCdfrRkJrhvlucnwQjMckf71PDi-ITKGL5c,208356
796
797
  wandelbots_api_client/v2_pydantic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
797
798
  wandelbots_api_client/v2_pydantic/rest.py,sha256=EDM0lK-GKehCIR2PgMyO_5a5MGlOHws5c7Ue3j0FeSc,7262
798
- wandelbots_api_client-26.6.0.dev34.dist-info/WHEEL,sha256=WvwXFgRajeoYkfRVmDhkP4Qlqo31Mk687zIO2QQoFmw,80
799
- wandelbots_api_client-26.6.0.dev34.dist-info/METADATA,sha256=7w3osu75mR3Fy-92iIHrOiyt1vGB1AUxtHpn9obCIgk,7693
800
- wandelbots_api_client-26.6.0.dev34.dist-info/RECORD,,
799
+ wandelbots_api_client-26.6.0.dev36.dist-info/WHEEL,sha256=WvwXFgRajeoYkfRVmDhkP4Qlqo31Mk687zIO2QQoFmw,80
800
+ wandelbots_api_client-26.6.0.dev36.dist-info/METADATA,sha256=nr99iA8KaWN4gS2E5dtmheabqwleoCADDZnBXMSI6_A,7693
801
+ wandelbots_api_client-26.6.0.dev36.dist-info/RECORD,,