wandelbots-api-client 25.8.0.dev88__py3-none-any.whl → 25.10.0.dev47__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 (526) hide show
  1. wandelbots_api_client/__init__.py +1 -1
  2. wandelbots_api_client/api/controller_api.py +9 -3
  3. wandelbots_api_client/api/controller_ios_api.py +2 -4
  4. wandelbots_api_client/api/motion_api.py +16 -4
  5. wandelbots_api_client/api/motion_group_infos_api.py +2 -0
  6. wandelbots_api_client/api/motion_group_jogging_api.py +10 -4
  7. wandelbots_api_client/api/store_collision_components_api.py +9 -6
  8. wandelbots_api_client/api/virtual_robot_behavior_api.py +5 -2
  9. wandelbots_api_client/api_client.py +1 -1
  10. wandelbots_api_client/configuration.py +1 -1
  11. wandelbots_api_client/models/abb_controller.py +4 -4
  12. wandelbots_api_client/models/abb_controller_egm_server.py +2 -2
  13. wandelbots_api_client/models/activate_license_request.py +1 -1
  14. wandelbots_api_client/models/add_request.py +2 -2
  15. wandelbots_api_client/models/all_joint_positions_request.py +2 -2
  16. wandelbots_api_client/models/all_joint_positions_response.py +1 -1
  17. wandelbots_api_client/models/app.py +7 -7
  18. wandelbots_api_client/models/array_input.py +1 -1
  19. wandelbots_api_client/models/array_output.py +1 -1
  20. wandelbots_api_client/models/blending_auto.py +2 -2
  21. wandelbots_api_client/models/blending_position.py +2 -2
  22. wandelbots_api_client/models/box.py +4 -4
  23. wandelbots_api_client/models/box2.py +5 -5
  24. wandelbots_api_client/models/box3.py +5 -5
  25. wandelbots_api_client/models/capsule.py +2 -2
  26. wandelbots_api_client/models/capsule2.py +3 -3
  27. wandelbots_api_client/models/capsule3.py +3 -3
  28. wandelbots_api_client/models/capture.py +1 -1
  29. wandelbots_api_client/models/cell.py +3 -3
  30. wandelbots_api_client/models/circle.py +2 -2
  31. wandelbots_api_client/models/code_with_arguments.py +2 -2
  32. wandelbots_api_client/models/collider.py +3 -3
  33. wandelbots_api_client/models/collider_input.py +3 -3
  34. wandelbots_api_client/models/collider_output.py +3 -3
  35. wandelbots_api_client/models/collision.py +6 -6
  36. wandelbots_api_client/models/collision_contact.py +2 -2
  37. wandelbots_api_client/models/collision_motion_group.py +2 -2
  38. wandelbots_api_client/models/collision_motion_group_assembly.py +4 -4
  39. wandelbots_api_client/models/collision_robot_configuration_input.py +3 -3
  40. wandelbots_api_client/models/collision_robot_configuration_output.py +3 -3
  41. wandelbots_api_client/models/collision_scene.py +2 -2
  42. wandelbots_api_client/models/collision_scene_assembly.py +5 -5
  43. wandelbots_api_client/models/command.py +6 -6
  44. wandelbots_api_client/models/command_settings.py +3 -3
  45. wandelbots_api_client/models/compound.py +1 -1
  46. wandelbots_api_client/models/container_environment_inner.py +2 -2
  47. wandelbots_api_client/models/container_image.py +3 -3
  48. wandelbots_api_client/models/container_image_secrets_inner.py +1 -1
  49. wandelbots_api_client/models/container_resources.py +1 -1
  50. wandelbots_api_client/models/container_storage.py +2 -2
  51. wandelbots_api_client/models/controller_capabilities.py +2 -2
  52. wandelbots_api_client/models/controller_instance.py +8 -8
  53. wandelbots_api_client/models/controller_instance_list.py +1 -1
  54. wandelbots_api_client/models/convex_hull.py +1 -1
  55. wandelbots_api_client/models/convex_hull2.py +2 -2
  56. wandelbots_api_client/models/convex_hull3.py +2 -2
  57. wandelbots_api_client/models/coordinate_system.py +5 -5
  58. wandelbots_api_client/models/coordinate_systems.py +1 -1
  59. wandelbots_api_client/models/create_program_run200_response.py +1 -1
  60. wandelbots_api_client/models/create_program_run_request.py +1 -1
  61. wandelbots_api_client/models/create_trigger200_response.py +1 -1
  62. wandelbots_api_client/models/create_trigger_request.py +4 -4
  63. wandelbots_api_client/models/cubic_spline.py +1 -1
  64. wandelbots_api_client/models/cubic_spline_cubic_spline_parameter.py +2 -2
  65. wandelbots_api_client/models/cubic_spline_parameter.py +2 -2
  66. wandelbots_api_client/models/cycle_time.py +1 -1
  67. wandelbots_api_client/models/cylinder.py +2 -2
  68. wandelbots_api_client/models/cylinder2.py +3 -3
  69. wandelbots_api_client/models/cylinder3.py +3 -3
  70. wandelbots_api_client/models/dh_parameter.py +5 -5
  71. wandelbots_api_client/models/direction_jogging_request.py +9 -9
  72. wandelbots_api_client/models/error.py +2 -2
  73. wandelbots_api_client/models/execution_result.py +3 -3
  74. wandelbots_api_client/models/external_joint_stream_datapoint.py +2 -2
  75. wandelbots_api_client/models/external_joint_stream_datapoint_value.py +4 -4
  76. wandelbots_api_client/models/fanuc_controller.py +2 -2
  77. wandelbots_api_client/models/feedback_collision.py +4 -4
  78. wandelbots_api_client/models/feedback_joint_limit_exceeded.py +3 -3
  79. wandelbots_api_client/models/feedback_out_of_workspace.py +2 -2
  80. wandelbots_api_client/models/feedback_singularity.py +3 -3
  81. wandelbots_api_client/models/flag.py +1 -1
  82. wandelbots_api_client/models/force_vector.py +3 -3
  83. wandelbots_api_client/models/geometry.py +11 -11
  84. wandelbots_api_client/models/get_all_program_runs200_response.py +1 -1
  85. wandelbots_api_client/models/get_all_triggers200_response.py +1 -1
  86. wandelbots_api_client/models/get_mode_response.py +1 -1
  87. wandelbots_api_client/models/get_trajectory_response.py +1 -1
  88. wandelbots_api_client/models/get_trajectory_sample_response.py +1 -1
  89. wandelbots_api_client/models/google_protobuf_any.py +1 -1
  90. wandelbots_api_client/models/http_exception_response.py +1 -1
  91. wandelbots_api_client/models/http_validation_error.py +1 -1
  92. wandelbots_api_client/models/http_validation_error2.py +1 -1
  93. wandelbots_api_client/models/image_credentials.py +3 -3
  94. wandelbots_api_client/models/info_service_capabilities.py +7 -7
  95. wandelbots_api_client/models/initialize_movement_request.py +5 -5
  96. wandelbots_api_client/models/initialize_movement_response.py +1 -1
  97. wandelbots_api_client/models/initialize_movement_response_init_response.py +2 -2
  98. wandelbots_api_client/models/io.py +5 -5
  99. wandelbots_api_client/models/io_description.py +9 -9
  100. wandelbots_api_client/models/io_value.py +4 -4
  101. wandelbots_api_client/models/ios.py +1 -1
  102. wandelbots_api_client/models/jogging_response.py +3 -3
  103. wandelbots_api_client/models/jogging_service_capabilities.py +2 -2
  104. wandelbots_api_client/models/joint_jogging_request.py +5 -5
  105. wandelbots_api_client/models/joint_limit.py +4 -4
  106. wandelbots_api_client/models/joint_limit_exceeded.py +2 -2
  107. wandelbots_api_client/models/joint_position_request.py +3 -3
  108. wandelbots_api_client/models/joint_trajectory.py +3 -3
  109. wandelbots_api_client/models/joints.py +1 -1
  110. wandelbots_api_client/models/kinematic_service_capabilities.py +3 -3
  111. wandelbots_api_client/models/kuka_controller.py +5 -5
  112. wandelbots_api_client/models/kuka_controller_rsi_server.py +2 -2
  113. wandelbots_api_client/models/license.py +10 -10
  114. wandelbots_api_client/models/license_status.py +2 -2
  115. wandelbots_api_client/models/limit_settings.py +12 -12
  116. wandelbots_api_client/models/limits_override.py +6 -6
  117. wandelbots_api_client/models/list_io_descriptions_response.py +1 -1
  118. wandelbots_api_client/models/list_io_values_response.py +1 -1
  119. wandelbots_api_client/models/list_payloads_response.py +1 -1
  120. wandelbots_api_client/models/list_program_metadata_response.py +1 -1
  121. wandelbots_api_client/models/list_recipe_metadata_response.py +1 -1
  122. wandelbots_api_client/models/list_response.py +1 -1
  123. wandelbots_api_client/models/list_tcps_response.py +1 -1
  124. wandelbots_api_client/models/mode_change_response.py +4 -4
  125. wandelbots_api_client/models/motion_command.py +3 -3
  126. wandelbots_api_client/models/motion_group_behavior_getter.py +1 -1
  127. wandelbots_api_client/models/motion_group_info.py +3 -3
  128. wandelbots_api_client/models/motion_group_infos.py +1 -1
  129. wandelbots_api_client/models/motion_group_instance.py +5 -5
  130. wandelbots_api_client/models/motion_group_instance_list.py +1 -1
  131. wandelbots_api_client/models/motion_group_joints.py +4 -4
  132. wandelbots_api_client/models/motion_group_physical.py +5 -5
  133. wandelbots_api_client/models/motion_group_specification.py +2 -2
  134. wandelbots_api_client/models/motion_group_state.py +12 -12
  135. wandelbots_api_client/models/motion_group_state_joint_limit_reached.py +1 -1
  136. wandelbots_api_client/models/motion_group_state_response.py +2 -2
  137. wandelbots_api_client/models/motion_id.py +1 -1
  138. wandelbots_api_client/models/motion_ids_list_response.py +1 -1
  139. wandelbots_api_client/models/motion_vector.py +3 -3
  140. wandelbots_api_client/models/mounting.py +2 -2
  141. wandelbots_api_client/models/move_request.py +8 -8
  142. wandelbots_api_client/models/move_response.py +2 -2
  143. wandelbots_api_client/models/move_to_trajectory_via_joint_ptp_request.py +4 -4
  144. wandelbots_api_client/models/movement.py +1 -1
  145. wandelbots_api_client/models/movement_error.py +1 -1
  146. wandelbots_api_client/models/movement_error_error.py +1 -1
  147. wandelbots_api_client/models/movement_movement.py +3 -3
  148. wandelbots_api_client/models/op_mode.py +1 -1
  149. wandelbots_api_client/models/opcua_node_value_trigger_config.py +3 -3
  150. wandelbots_api_client/models/optimizer_setup.py +7 -7
  151. wandelbots_api_client/models/out_of_workspace.py +1 -1
  152. wandelbots_api_client/models/path.py +1 -1
  153. wandelbots_api_client/models/path_cartesian_ptp.py +2 -2
  154. wandelbots_api_client/models/path_circle.py +3 -3
  155. wandelbots_api_client/models/path_cubic_spline.py +2 -2
  156. wandelbots_api_client/models/path_joint_ptp.py +2 -2
  157. wandelbots_api_client/models/path_line.py +2 -2
  158. wandelbots_api_client/models/pause_movement_request.py +2 -2
  159. wandelbots_api_client/models/pause_movement_response.py +1 -1
  160. wandelbots_api_client/models/pause_movement_response_pause_response.py +2 -2
  161. wandelbots_api_client/models/pause_on_io.py +2 -2
  162. wandelbots_api_client/models/payload.py +4 -4
  163. wandelbots_api_client/models/plan_collision_free_ptp_request.py +5 -5
  164. wandelbots_api_client/models/plan_failed_on_trajectory_response.py +9 -9
  165. wandelbots_api_client/models/plan_failed_response.py +7 -7
  166. wandelbots_api_client/models/plan_request.py +5 -5
  167. wandelbots_api_client/models/plan_response.py +3 -3
  168. wandelbots_api_client/models/plan_successful_response.py +2 -2
  169. wandelbots_api_client/models/plan_trajectory_failed_response.py +3 -3
  170. wandelbots_api_client/models/plan_trajectory_request.py +5 -5
  171. wandelbots_api_client/models/plan_trajectory_response.py +1 -1
  172. wandelbots_api_client/models/plane2.py +1 -1
  173. wandelbots_api_client/models/plane3.py +1 -1
  174. wandelbots_api_client/models/planned_motion.py +5 -5
  175. wandelbots_api_client/models/planner_pose.py +2 -2
  176. wandelbots_api_client/models/planning_limits.py +12 -12
  177. wandelbots_api_client/models/planning_limits_limit_range.py +2 -2
  178. wandelbots_api_client/models/playback_speed_request.py +2 -2
  179. wandelbots_api_client/models/playback_speed_response.py +1 -1
  180. wandelbots_api_client/models/playback_speed_response_playback_speed_response.py +1 -1
  181. wandelbots_api_client/models/point_cloud.py +1 -1
  182. wandelbots_api_client/models/pose.py +3 -3
  183. wandelbots_api_client/models/pose2.py +2 -2
  184. wandelbots_api_client/models/program_metadata.py +6 -6
  185. wandelbots_api_client/models/program_run.py +10 -10
  186. wandelbots_api_client/models/program_run_object.py +6 -6
  187. wandelbots_api_client/models/program_runner_reference.py +2 -2
  188. wandelbots_api_client/models/pyjectory_datatypes_core_pose.py +2 -2
  189. wandelbots_api_client/models/pyjectory_datatypes_serializer_orientation.py +1 -1
  190. wandelbots_api_client/models/pyjectory_datatypes_serializer_pose.py +1 -1
  191. wandelbots_api_client/models/pyjectory_datatypes_serializer_position.py +1 -1
  192. wandelbots_api_client/models/pyriphery_etcd_etcd_configuration.py +4 -4
  193. wandelbots_api_client/models/pyriphery_hardware_isaac_isaac_configuration.py +4 -4
  194. wandelbots_api_client/models/pyriphery_opcua_opcua_configuration.py +3 -3
  195. wandelbots_api_client/models/pyriphery_pyrae_controller_controller_configuration.py +6 -6
  196. wandelbots_api_client/models/pyriphery_pyrae_robot_robot_configuration.py +7 -7
  197. wandelbots_api_client/models/pyriphery_robotics_configurable_collision_scene_configurable_collision_scene_configuration_input.py +4 -4
  198. wandelbots_api_client/models/pyriphery_robotics_configurable_collision_scene_configurable_collision_scene_configuration_output.py +4 -4
  199. wandelbots_api_client/models/pyriphery_robotics_robotcell_timer_configuration.py +2 -2
  200. wandelbots_api_client/models/pyriphery_robotics_simulation_robot_with_view_open3d_configuration.py +3 -3
  201. wandelbots_api_client/models/pyriphery_robotics_simulation_simulated_io_configuration.py +2 -2
  202. wandelbots_api_client/models/pyriphery_robotics_simulation_simulated_opcua_configuration.py +2 -2
  203. wandelbots_api_client/models/quaternion.py +4 -4
  204. wandelbots_api_client/models/recipe_metadata.py +7 -7
  205. wandelbots_api_client/models/rectangle.py +2 -2
  206. wandelbots_api_client/models/rectangle2.py +3 -3
  207. wandelbots_api_client/models/rectangle3.py +3 -3
  208. wandelbots_api_client/models/rectangular_capsule.py +3 -3
  209. wandelbots_api_client/models/rectangular_capsule2.py +4 -4
  210. wandelbots_api_client/models/rectangular_capsule3.py +4 -4
  211. wandelbots_api_client/models/robot_controller.py +2 -2
  212. wandelbots_api_client/models/robot_controller_state.py +7 -7
  213. wandelbots_api_client/models/robot_link_geometry.py +2 -2
  214. wandelbots_api_client/models/robot_state.py +2 -2
  215. wandelbots_api_client/models/robot_tcp.py +4 -4
  216. wandelbots_api_client/models/robot_tcps.py +1 -1
  217. wandelbots_api_client/models/rotation_angles.py +2 -2
  218. wandelbots_api_client/models/safety_configuration.py +5 -5
  219. wandelbots_api_client/models/safety_setup.py +4 -4
  220. wandelbots_api_client/models/safety_setup_safety_settings.py +2 -2
  221. wandelbots_api_client/models/safety_setup_safety_zone.py +4 -4
  222. wandelbots_api_client/models/safety_zone.py +3 -3
  223. wandelbots_api_client/models/safety_zone_limits.py +2 -2
  224. wandelbots_api_client/models/safety_zone_violation.py +1 -1
  225. wandelbots_api_client/models/service_status.py +2 -2
  226. wandelbots_api_client/models/service_status_status.py +3 -3
  227. wandelbots_api_client/models/set_io.py +2 -2
  228. wandelbots_api_client/models/set_playback_speed.py +2 -2
  229. wandelbots_api_client/models/single_joint_limit.py +2 -2
  230. wandelbots_api_client/models/singularity.py +2 -2
  231. wandelbots_api_client/models/sphere.py +1 -1
  232. wandelbots_api_client/models/sphere2.py +2 -2
  233. wandelbots_api_client/models/sphere3.py +2 -2
  234. wandelbots_api_client/models/standstill.py +1 -1
  235. wandelbots_api_client/models/standstill_standstill.py +3 -3
  236. wandelbots_api_client/models/start_movement_request.py +5 -5
  237. wandelbots_api_client/models/start_on_io.py +2 -2
  238. wandelbots_api_client/models/status.py +3 -3
  239. wandelbots_api_client/models/stop_response.py +3 -3
  240. wandelbots_api_client/models/stream_move_backward.py +1 -1
  241. wandelbots_api_client/models/stream_move_forward.py +1 -1
  242. wandelbots_api_client/models/stream_move_playback_speed.py +1 -1
  243. wandelbots_api_client/models/stream_move_response.py +3 -3
  244. wandelbots_api_client/models/stream_move_to_trajectory.py +1 -1
  245. wandelbots_api_client/models/stream_stop.py +1 -1
  246. wandelbots_api_client/models/tcp_pose.py +4 -4
  247. wandelbots_api_client/models/tcp_pose_request.py +4 -4
  248. wandelbots_api_client/models/tool_geometry.py +2 -2
  249. wandelbots_api_client/models/trajectory_sample.py +11 -11
  250. wandelbots_api_client/models/trigger_object.py +8 -8
  251. wandelbots_api_client/models/universalrobots_controller.py +2 -2
  252. wandelbots_api_client/models/update_nova_version_request.py +1 -1
  253. wandelbots_api_client/models/update_program_metadata_request.py +3 -3
  254. wandelbots_api_client/models/update_recipe_metadata_request.py +3 -3
  255. wandelbots_api_client/models/update_trigger_request.py +3 -3
  256. wandelbots_api_client/models/validation_error.py +3 -3
  257. wandelbots_api_client/models/validation_error2.py +3 -3
  258. wandelbots_api_client/models/vector3d.py +3 -3
  259. wandelbots_api_client/models/version_number.py +8 -8
  260. wandelbots_api_client/models/virtual_controller.py +5 -5
  261. wandelbots_api_client/models/virtual_controller_types.py +3 -0
  262. wandelbots_api_client/models/virtual_robot_configuration.py +2 -2
  263. wandelbots_api_client/models/yaskawa_controller.py +2 -2
  264. wandelbots_api_client/v2/__init__.py +1 -1
  265. wandelbots_api_client/v2/api/application_api.py +9 -9
  266. wandelbots_api_client/v2/api/bus_inputs_outputs_api.py +928 -79
  267. wandelbots_api_client/v2/api/cell_api.py +6 -6
  268. wandelbots_api_client/v2/api/controller_api.py +33 -29
  269. wandelbots_api_client/v2/api/controller_inputs_outputs_api.py +12 -10
  270. wandelbots_api_client/v2/api/jogging_api.py +6 -3
  271. wandelbots_api_client/v2/api/kinematics_api.py +12 -13
  272. wandelbots_api_client/v2/api/license_api.py +6 -6
  273. wandelbots_api_client/v2/api/motion_group_api.py +8 -6
  274. wandelbots_api_client/v2/api/motion_group_models_api.py +11 -47
  275. wandelbots_api_client/v2/api/store_collision_components_api.py +799 -25
  276. wandelbots_api_client/v2/api/store_collision_setups_api.py +262 -4
  277. wandelbots_api_client/v2/api/store_object_api.py +9 -9
  278. wandelbots_api_client/v2/api/trajectory_caching_api.py +12 -12
  279. wandelbots_api_client/v2/api/trajectory_execution_api.py +6 -3
  280. wandelbots_api_client/v2/api/trajectory_planning_api.py +15 -16
  281. wandelbots_api_client/v2/api/virtual_controller_api.py +51 -36
  282. wandelbots_api_client/v2/api/virtual_controller_behavior_api.py +18 -9
  283. wandelbots_api_client/v2/api/virtual_controller_inputs_outputs_api.py +3 -3
  284. wandelbots_api_client/v2/api_client.py +1 -1
  285. wandelbots_api_client/v2/configuration.py +1 -1
  286. wandelbots_api_client/v2/models/__init__.py +44 -26
  287. wandelbots_api_client/v2/models/abb_controller.py +6 -9
  288. wandelbots_api_client/v2/models/abb_controller_egm_server.py +2 -2
  289. wandelbots_api_client/v2/models/activate_license_request.py +1 -1
  290. wandelbots_api_client/v2/models/add_trajectory_error.py +3 -3
  291. wandelbots_api_client/v2/models/add_trajectory_error_data.py +56 -56
  292. wandelbots_api_client/v2/models/add_trajectory_request.py +3 -3
  293. wandelbots_api_client/v2/models/add_trajectory_response.py +2 -2
  294. wandelbots_api_client/v2/models/app.py +9 -9
  295. wandelbots_api_client/v2/models/behavior.py +1 -1
  296. wandelbots_api_client/v2/models/blending_auto.py +4 -3
  297. wandelbots_api_client/v2/models/blending_position.py +2 -2
  298. wandelbots_api_client/v2/models/boolean_value.py +4 -7
  299. wandelbots_api_client/v2/models/box.py +5 -5
  300. wandelbots_api_client/v2/models/{io_description2.py → bus_io_description.py} +14 -14
  301. wandelbots_api_client/v2/models/bus_io_modbus_client.py +104 -0
  302. wandelbots_api_client/v2/models/bus_io_modbus_server.py +115 -0
  303. wandelbots_api_client/v2/models/bus_io_modbus_tcp_client.py +106 -0
  304. wandelbots_api_client/v2/models/bus_io_modbus_tcp_server.py +104 -0
  305. wandelbots_api_client/v2/models/bus_io_modbus_virtual.py +98 -0
  306. wandelbots_api_client/v2/models/bus_io_profinet.py +6 -9
  307. wandelbots_api_client/v2/models/bus_io_profinet_default_route.py +2 -2
  308. wandelbots_api_client/v2/models/bus_io_profinet_ip_config.py +3 -3
  309. wandelbots_api_client/v2/models/bus_io_profinet_network.py +3 -3
  310. wandelbots_api_client/v2/models/bus_io_profinet_virtual.py +3 -6
  311. wandelbots_api_client/v2/models/bus_io_type.py +80 -8
  312. wandelbots_api_client/v2/models/bus_ios_state.py +2 -2
  313. wandelbots_api_client/v2/models/capsule.py +3 -3
  314. wandelbots_api_client/v2/models/cartesian_limits.py +4 -4
  315. wandelbots_api_client/v2/models/cell.py +5 -5
  316. wandelbots_api_client/v2/models/collider.py +3 -3
  317. wandelbots_api_client/v2/models/collision.py +6 -6
  318. wandelbots_api_client/v2/models/collision_contact.py +2 -2
  319. wandelbots_api_client/v2/models/collision_error.py +1 -1
  320. wandelbots_api_client/v2/models/collision_setup.py +4 -4
  321. wandelbots_api_client/v2/models/configuration_archive_status_creating.py +2 -2
  322. wandelbots_api_client/v2/models/configuration_archive_status_error.py +2 -2
  323. wandelbots_api_client/v2/models/configuration_archive_status_success.py +1 -1
  324. wandelbots_api_client/v2/models/configuration_resource.py +3 -3
  325. wandelbots_api_client/v2/models/container_environment_inner.py +2 -2
  326. wandelbots_api_client/v2/models/container_image.py +3 -3
  327. wandelbots_api_client/v2/models/container_image_secrets_inner.py +1 -1
  328. wandelbots_api_client/v2/models/container_resources.py +2 -2
  329. wandelbots_api_client/v2/models/container_storage.py +2 -2
  330. wandelbots_api_client/v2/models/controller_description.py +4 -4
  331. wandelbots_api_client/v2/models/convex_hull.py +2 -2
  332. wandelbots_api_client/v2/models/coordinate_system.py +6 -6
  333. wandelbots_api_client/v2/models/coordinate_system_data.py +5 -5
  334. wandelbots_api_client/v2/models/cubic_spline_parameter.py +2 -2
  335. wandelbots_api_client/v2/models/cycle_time.py +3 -2
  336. wandelbots_api_client/v2/models/cylinder.py +3 -3
  337. wandelbots_api_client/v2/models/dh_parameter.py +5 -5
  338. wandelbots_api_client/v2/models/error.py +2 -2
  339. wandelbots_api_client/v2/models/error_invalid_joint_count.py +3 -3
  340. wandelbots_api_client/v2/models/error_joint_limit_exceeded.py +4 -3
  341. wandelbots_api_client/v2/models/error_joint_position_collision.py +4 -4
  342. wandelbots_api_client/v2/models/error_max_iterations_exceeded.py +2 -2
  343. wandelbots_api_client/v2/models/execute.py +2 -2
  344. wandelbots_api_client/v2/models/execute_jogging_request.py +28 -0
  345. wandelbots_api_client/v2/models/execute_jogging_response.py +25 -0
  346. wandelbots_api_client/v2/models/execute_trajectory_request.py +28 -0
  347. wandelbots_api_client/v2/models/execute_trajectory_response.py +25 -0
  348. wandelbots_api_client/v2/models/external_joint_stream_datapoint.py +2 -2
  349. wandelbots_api_client/v2/models/external_joint_stream_request.py +1 -1
  350. wandelbots_api_client/v2/models/fanuc_controller.py +4 -7
  351. wandelbots_api_client/v2/models/feedback_collision.py +4 -4
  352. wandelbots_api_client/v2/models/feedback_joint_limit_exceeded.py +5 -4
  353. wandelbots_api_client/v2/models/feedback_out_of_workspace.py +2 -2
  354. wandelbots_api_client/v2/models/feedback_singularity.py +3 -3
  355. wandelbots_api_client/v2/models/flag.py +1 -1
  356. wandelbots_api_client/v2/models/float_value.py +4 -7
  357. wandelbots_api_client/v2/models/forward_kinematics422_response.py +1 -1
  358. wandelbots_api_client/v2/models/forward_kinematics_request.py +4 -4
  359. wandelbots_api_client/v2/models/forward_kinematics_response.py +1 -1
  360. wandelbots_api_client/v2/models/forward_kinematics_validation_error.py +5 -5
  361. wandelbots_api_client/v2/models/get_trajectory_response.py +3 -3
  362. wandelbots_api_client/v2/models/http_validation_error.py +1 -1
  363. wandelbots_api_client/v2/models/image_credentials.py +3 -3
  364. wandelbots_api_client/v2/models/{inconsitent_trajectory_size.py → inconsistent_trajectory_size_error.py} +7 -7
  365. wandelbots_api_client/v2/models/{inconsitent_trajectory_size_inconsistent_trajectory_size.py → inconsistent_trajectory_size_error_inconsistent_trajectory_size.py} +7 -7
  366. wandelbots_api_client/v2/models/initialize_jogging_request.py +5 -8
  367. wandelbots_api_client/v2/models/initialize_jogging_response.py +2 -2
  368. wandelbots_api_client/v2/models/initialize_movement_request.py +5 -8
  369. wandelbots_api_client/v2/models/initialize_movement_response.py +3 -3
  370. wandelbots_api_client/v2/models/integer_value.py +4 -7
  371. wandelbots_api_client/v2/models/{invalid_dof.py → invalid_dof_error.py} +7 -7
  372. wandelbots_api_client/v2/models/{invalid_dof_invalid_dof.py → invalid_dof_error_invalid_dof.py} +6 -6
  373. wandelbots_api_client/v2/models/inverse_kinematics422_response.py +1 -1
  374. wandelbots_api_client/v2/models/inverse_kinematics_request.py +6 -6
  375. wandelbots_api_client/v2/models/inverse_kinematics_response.py +1 -1
  376. wandelbots_api_client/v2/models/inverse_kinematics_validation_error.py +5 -5
  377. wandelbots_api_client/v2/models/io_boolean_value.py +5 -8
  378. wandelbots_api_client/v2/models/{io_description_min.py → io_boundary.py} +8 -8
  379. wandelbots_api_client/v2/models/io_description.py +11 -11
  380. wandelbots_api_client/v2/models/io_float_value.py +5 -8
  381. wandelbots_api_client/v2/models/io_integer_value.py +5 -8
  382. wandelbots_api_client/v2/models/jogging_details.py +2 -2
  383. wandelbots_api_client/v2/models/jogging_paused_by_user.py +1 -1
  384. wandelbots_api_client/v2/models/jogging_paused_near_collision.py +2 -2
  385. wandelbots_api_client/v2/models/jogging_paused_near_joint_limit.py +4 -3
  386. wandelbots_api_client/v2/models/jogging_paused_on_io.py +1 -1
  387. wandelbots_api_client/v2/models/jogging_running.py +1 -1
  388. wandelbots_api_client/v2/models/{joint_limit_exceeded.py → joint_limit_exceeded_error.py} +5 -5
  389. wandelbots_api_client/v2/models/joint_limits.py +4 -4
  390. wandelbots_api_client/v2/models/joint_trajectory.py +3 -3
  391. wandelbots_api_client/v2/models/joint_velocity_request.py +4 -7
  392. wandelbots_api_client/v2/models/joint_velocity_response.py +2 -2
  393. wandelbots_api_client/v2/models/kuka_controller.py +6 -9
  394. wandelbots_api_client/v2/models/kuka_controller_rsi_server.py +2 -2
  395. wandelbots_api_client/v2/models/license.py +10 -10
  396. wandelbots_api_client/v2/models/license_status.py +2 -2
  397. wandelbots_api_client/v2/models/limit_range.py +2 -2
  398. wandelbots_api_client/v2/models/limit_set.py +5 -5
  399. wandelbots_api_client/v2/models/limits_override.py +6 -6
  400. wandelbots_api_client/v2/models/list_trajectories_response.py +1 -1
  401. wandelbots_api_client/v2/models/midpoint_insertion_algorithm.py +2 -2
  402. wandelbots_api_client/v2/models/modbus_io.py +105 -0
  403. wandelbots_api_client/v2/models/modbus_io_area.py +40 -0
  404. wandelbots_api_client/v2/models/modbus_io_byte_order.py +40 -0
  405. wandelbots_api_client/v2/models/{http_validation_error2.py → modbus_io_data.py} +21 -26
  406. wandelbots_api_client/v2/models/modbus_io_type_enum.py +39 -0
  407. wandelbots_api_client/v2/models/motion_command.py +3 -3
  408. wandelbots_api_client/v2/models/motion_group_description.py +12 -11
  409. wandelbots_api_client/v2/models/motion_group_info.py +5 -4
  410. wandelbots_api_client/v2/models/motion_group_joints.py +4 -4
  411. wandelbots_api_client/v2/models/motion_group_setup.py +9 -8
  412. wandelbots_api_client/v2/models/motion_group_state.py +16 -15
  413. wandelbots_api_client/v2/models/motion_group_state_joint_limit_reached.py +1 -1
  414. wandelbots_api_client/v2/models/movement_error_response.py +2 -2
  415. wandelbots_api_client/v2/models/{nan_value.py → nan_value_error.py} +7 -7
  416. wandelbots_api_client/v2/models/{nan_value_nan_value.py → nan_value_error_nan_value.py} +4 -4
  417. wandelbots_api_client/v2/models/op_mode.py +1 -1
  418. wandelbots_api_client/v2/models/operation_limits.py +4 -4
  419. wandelbots_api_client/v2/models/path_cartesian_ptp.py +2 -2
  420. wandelbots_api_client/v2/models/path_circle.py +3 -3
  421. wandelbots_api_client/v2/models/path_cubic_spline.py +2 -2
  422. wandelbots_api_client/v2/models/path_joint_ptp.py +2 -2
  423. wandelbots_api_client/v2/models/path_line.py +2 -2
  424. wandelbots_api_client/v2/models/pause_jogging_request.py +3 -6
  425. wandelbots_api_client/v2/models/pause_jogging_response.py +2 -2
  426. wandelbots_api_client/v2/models/pause_movement_request.py +3 -6
  427. wandelbots_api_client/v2/models/pause_movement_response.py +2 -2
  428. wandelbots_api_client/v2/models/pause_on_io.py +3 -3
  429. wandelbots_api_client/v2/models/payload.py +4 -4
  430. wandelbots_api_client/v2/models/plan422_response.py +1 -1
  431. wandelbots_api_client/v2/models/plan_collision_free_failed_response.py +1 -1
  432. wandelbots_api_client/v2/models/plan_collision_free_request.py +4 -4
  433. wandelbots_api_client/v2/models/plan_collision_free_response.py +1 -1
  434. wandelbots_api_client/v2/models/plan_trajectory_failed_response.py +3 -3
  435. wandelbots_api_client/v2/models/plan_trajectory_request.py +3 -3
  436. wandelbots_api_client/v2/models/plan_trajectory_response.py +1 -1
  437. wandelbots_api_client/v2/models/plan_validation_error.py +5 -5
  438. wandelbots_api_client/v2/models/plane.py +1 -1
  439. wandelbots_api_client/v2/models/playback_speed_request.py +6 -8
  440. wandelbots_api_client/v2/models/playback_speed_response.py +2 -2
  441. wandelbots_api_client/v2/models/pose.py +2 -2
  442. wandelbots_api_client/v2/models/profinet_description.py +5 -5
  443. wandelbots_api_client/v2/models/profinet_input_output_config.py +3 -3
  444. wandelbots_api_client/v2/models/profinet_io.py +8 -8
  445. wandelbots_api_client/v2/models/profinet_io_data.py +7 -7
  446. wandelbots_api_client/v2/models/profinet_io_direction.py +1 -1
  447. wandelbots_api_client/v2/models/profinet_slot_description.py +4 -4
  448. wandelbots_api_client/v2/models/profinet_sub_slot_description.py +3 -3
  449. wandelbots_api_client/v2/models/program.py +6 -6
  450. wandelbots_api_client/v2/models/program_run.py +14 -12
  451. wandelbots_api_client/v2/models/program_start_request.py +1 -1
  452. wandelbots_api_client/v2/models/rectangle.py +3 -3
  453. wandelbots_api_client/v2/models/rectangular_capsule.py +4 -4
  454. wandelbots_api_client/v2/models/robot_controller.py +2 -2
  455. wandelbots_api_client/v2/models/robot_controller_state.py +11 -10
  456. wandelbots_api_client/v2/models/robot_tcp.py +5 -5
  457. wandelbots_api_client/v2/models/robot_tcp_data.py +4 -4
  458. wandelbots_api_client/v2/models/rrt_connect_algorithm.py +6 -6
  459. wandelbots_api_client/v2/models/service_status.py +3 -3
  460. wandelbots_api_client/v2/models/service_status_response.py +2 -2
  461. wandelbots_api_client/v2/models/service_status_status.py +3 -3
  462. wandelbots_api_client/v2/models/set_io.py +3 -3
  463. wandelbots_api_client/v2/models/sphere.py +2 -2
  464. wandelbots_api_client/v2/models/start_movement_request.py +11 -12
  465. wandelbots_api_client/v2/models/start_movement_response.py +2 -2
  466. wandelbots_api_client/v2/models/start_on_io.py +3 -3
  467. wandelbots_api_client/v2/models/stream_io_values_response.py +5 -4
  468. wandelbots_api_client/v2/models/tcp_offset.py +2 -2
  469. wandelbots_api_client/v2/models/{tcp_required.py → tcp_required_error.py} +4 -4
  470. wandelbots_api_client/v2/models/tcp_velocity_request.py +5 -8
  471. wandelbots_api_client/v2/models/tcp_velocity_response.py +2 -2
  472. wandelbots_api_client/v2/models/{torque_exceeded.py → torque_exceeded_error.py} +7 -7
  473. wandelbots_api_client/v2/models/{torque_exceeded_torque_exceeded.py → torque_exceeded_error_torque_exceeded.py} +6 -6
  474. wandelbots_api_client/v2/models/trajectory_data.py +5 -5
  475. wandelbots_api_client/v2/models/trajectory_details.py +4 -4
  476. wandelbots_api_client/v2/models/trajectory_ended.py +1 -1
  477. wandelbots_api_client/v2/models/trajectory_id.py +3 -3
  478. wandelbots_api_client/v2/models/trajectory_paused_by_user.py +1 -1
  479. wandelbots_api_client/v2/models/trajectory_paused_on_io.py +1 -1
  480. wandelbots_api_client/v2/models/trajectory_running.py +4 -3
  481. wandelbots_api_client/v2/models/trajectory_wait_for_io.py +1 -1
  482. wandelbots_api_client/v2/models/universalrobots_controller.py +4 -7
  483. wandelbots_api_client/v2/models/update_nova_version_request.py +1 -1
  484. wandelbots_api_client/v2/models/validation_error.py +4 -4
  485. wandelbots_api_client/v2/models/validation_error2.py +3 -3
  486. wandelbots_api_client/v2/models/virtual_controller.py +6 -9
  487. wandelbots_api_client/v2/models/virtual_controller_types.py +3 -0
  488. wandelbots_api_client/v2/models/virtual_robot_configuration.py +2 -2
  489. wandelbots_api_client/v2/models/wait_for_io_event_request.py +2 -2
  490. wandelbots_api_client/v2/models/yaskawa_controller.py +4 -7
  491. wandelbots_api_client/v2_pydantic/__init__.py +51 -0
  492. wandelbots_api_client/v2_pydantic/api/__init__.py +49 -0
  493. wandelbots_api_client/v2_pydantic/api/application_api.py +1822 -0
  494. wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py +4652 -0
  495. wandelbots_api_client/v2_pydantic/api/cell_api.py +2025 -0
  496. wandelbots_api_client/v2_pydantic/api/controller_api.py +3758 -0
  497. wandelbots_api_client/v2_pydantic/api/controller_inputs_outputs_api.py +1408 -0
  498. wandelbots_api_client/v2_pydantic/api/jogging_api.py +126 -0
  499. wandelbots_api_client/v2_pydantic/api/kinematics_api.py +649 -0
  500. wandelbots_api_client/v2_pydantic/api/license_api.py +1074 -0
  501. wandelbots_api_client/v2_pydantic/api/motion_group_api.py +740 -0
  502. wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py +570 -0
  503. wandelbots_api_client/v2_pydantic/api/program_api.py +1200 -0
  504. wandelbots_api_client/v2_pydantic/api/store_collision_components_api.py +4216 -0
  505. wandelbots_api_client/v2_pydantic/api/store_collision_setups_api.py +1435 -0
  506. wandelbots_api_client/v2_pydantic/api/store_object_api.py +1738 -0
  507. wandelbots_api_client/v2_pydantic/api/system_api.py +2454 -0
  508. wandelbots_api_client/v2_pydantic/api/trajectory_caching_api.py +1524 -0
  509. wandelbots_api_client/v2_pydantic/api/trajectory_execution_api.py +126 -0
  510. wandelbots_api_client/v2_pydantic/api/trajectory_planning_api.py +649 -0
  511. wandelbots_api_client/v2_pydantic/api/virtual_controller_api.py +4656 -0
  512. wandelbots_api_client/v2_pydantic/api/virtual_controller_behavior_api.py +1001 -0
  513. wandelbots_api_client/v2_pydantic/api/virtual_controller_inputs_outputs_api.py +1022 -0
  514. wandelbots_api_client/v2_pydantic/api_client.py +810 -0
  515. wandelbots_api_client/v2_pydantic/api_response.py +21 -0
  516. wandelbots_api_client/v2_pydantic/configuration.py +595 -0
  517. wandelbots_api_client/v2_pydantic/exceptions.py +216 -0
  518. wandelbots_api_client/v2_pydantic/models.py +4547 -0
  519. wandelbots_api_client/v2_pydantic/py.typed +0 -0
  520. wandelbots_api_client/v2_pydantic/rest.py +212 -0
  521. {wandelbots_api_client-25.8.0.dev88.dist-info → wandelbots_api_client-25.10.0.dev47.dist-info}/METADATA +16 -15
  522. wandelbots_api_client-25.10.0.dev47.dist-info/RECORD +636 -0
  523. wandelbots_api_client-25.8.0.dev88.dist-info/RECORD +0 -597
  524. {wandelbots_api_client-25.8.0.dev88.dist-info → wandelbots_api_client-25.10.0.dev47.dist-info}/WHEEL +0 -0
  525. {wandelbots_api_client-25.8.0.dev88.dist-info → wandelbots_api_client-25.10.0.dev47.dist-info}/licenses/LICENSE +0 -0
  526. {wandelbots_api_client-25.8.0.dev88.dist-info → wandelbots_api_client-25.10.0.dev47.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,4547 @@
1
+ # generated by datamodel-codegen:
2
+ # filename: public.openapi.yaml
3
+ # timestamp: 2025-11-06T21:59:25+00:00
4
+
5
+ from __future__ import annotations
6
+
7
+ from datetime import date
8
+ from enum import Enum
9
+ from pathlib import Path
10
+ from typing import Annotated, Any, Dict, List, Literal, Optional, Union
11
+
12
+ from pydantic import AwareDatetime, BaseModel, EmailStr, Field, RootModel
13
+
14
+
15
+ class NameList(RootModel):
16
+ """
17
+ A list of names
18
+ """
19
+
20
+ root: List[str]
21
+ """
22
+ A list of names
23
+ """
24
+
25
+ def __getitem__(self, index: int) -> str:
26
+ """
27
+ Make list RootModel directly indexable.
28
+ """
29
+ return self.root[index]
30
+
31
+ def __setitem__(self, index: int, value: str) -> None:
32
+ """
33
+ Make list RootModel directly indexable.
34
+ """
35
+ self.root[index] = value
36
+
37
+ def __len__(self) -> int:
38
+ """
39
+ Make list RootModel directly usable with len().
40
+ """
41
+ return len(self.root)
42
+
43
+ def __iter__(self):
44
+ """
45
+ Make list RootModel directly iterable.
46
+ """
47
+ return iter(self.root)
48
+
49
+
50
+ class CellName(RootModel):
51
+ root: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,30}[a-z0-9]$')]
52
+ """
53
+ A unique name for the cell used as an identifier for addressing the cell in all API calls.
54
+ It must be a valid k8s label name as defined by [RFC 1123](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names).
55
+
56
+ """
57
+
58
+
59
+ class CellDescription(RootModel):
60
+ root: Annotated[str, Field(max_length=200)]
61
+ """
62
+ A description of the cell.
63
+
64
+ """
65
+
66
+
67
+ class EgmServer(BaseModel):
68
+ """
69
+ The EGM server runs inside of the cell, thus its IP must be in the same network as the 'controller_ip'
70
+ """
71
+
72
+ ip: str
73
+ port: int
74
+
75
+
76
+ class AbbController(BaseModel):
77
+ """
78
+ The configuration of a physical ABB robot controller has to contain IP address.
79
+ Additionally an EGM server configuration has to be specified in order to control the robot.
80
+ Deploying the server is a functionality of this API.
81
+
82
+ """
83
+
84
+ kind: Literal['AbbController'] = 'AbbController'
85
+ controller_ip: str
86
+ controller_port: int
87
+ """
88
+ Default values: 80, 443. If custom value is set, field is required.
89
+
90
+ """
91
+ egm_server: EgmServer
92
+ """
93
+ The EGM server runs inside of the cell, thus its IP must be in the same network as the 'controller_ip'
94
+ """
95
+
96
+
97
+ class FanucController(BaseModel):
98
+ """
99
+ The configuration of a physical FANUC robot controller has to contain IP address of the controller.
100
+ """
101
+
102
+ kind: Literal['FanucController'] = 'FanucController'
103
+ controller_ip: str
104
+
105
+
106
+ class RsiServer(BaseModel):
107
+ """
108
+ The RSI server runs inside of the cell.
109
+ """
110
+
111
+ ip: str
112
+ port: int
113
+
114
+
115
+ class KukaController(BaseModel):
116
+ """
117
+ The configuration of a physical KUKA robot controller has to contain an IP address.
118
+ Additionally an RSI server configuration has to be specified in order to control the robot.
119
+ Deploying the server is a functionality of this API.
120
+
121
+ """
122
+
123
+ kind: Literal['KukaController'] = 'KukaController'
124
+ controller_ip: str
125
+ controller_port: int
126
+ rsi_server: RsiServer
127
+ """
128
+ The RSI server runs inside of the cell.
129
+ """
130
+ slow_cycle_rate: Optional[bool] = False
131
+ """
132
+ If true, uses slower cycle time of 12ms instead of 4ms.
133
+
134
+ """
135
+
136
+
137
+ class UniversalrobotsController(BaseModel):
138
+ """
139
+ The configuration of a physical Universal Robots controller has to contain IP address of the controller.
140
+ """
141
+
142
+ kind: Literal['UniversalrobotsController'] = 'UniversalrobotsController'
143
+ controller_ip: str
144
+
145
+
146
+ class Manufacturer(Enum):
147
+ ABB = 'abb'
148
+ FANUC = 'fanuc'
149
+ KUKA = 'kuka'
150
+ UNIVERSALROBOTS = 'universalrobots'
151
+ YASKAWA = 'yaskawa'
152
+
153
+
154
+ class VirtualControllerTypes(Enum):
155
+ ABB_IRB1010_037_15 = 'abb-irb1010_037_15'
156
+ ABB_IRB1100_0475_4 = 'abb-irb1100_0475_4'
157
+ ABB_IRB1100_058_4 = 'abb-irb1100_058_4'
158
+ ABB_IRB1200_7 = 'abb-irb1200_7'
159
+ ABB_IRB1300_09_11 = 'abb-irb1300_09_11'
160
+ ABB_IRB1300_115_10 = 'abb-irb1300_115_10'
161
+ ABB_IRB1300_14_12 = 'abb-irb1300_14_12'
162
+ ABB_IRB1300_14_7 = 'abb-irb1300_14_7'
163
+ ABB_IRB1600_12_10 = 'abb-irb1600_12_10'
164
+ ABB_IRB1600_12_6 = 'abb-irb1600_12_6'
165
+ ABB_IRB1600_145_10 = 'abb-irb1600_145_10'
166
+ ABB_IRB1600_145_6 = 'abb-irb1600_145_6'
167
+ ABB_IRB2600_ID_185_15 = 'abb-irb2600ID_185_15'
168
+ ABB_IRB2600_ID_200_8 = 'abb-irb2600ID_200_8'
169
+ ABB_IRB2600_165_12 = 'abb-irb2600_165_12'
170
+ ABB_IRB2600_165_20 = 'abb-irb2600_165_20'
171
+ ABB_IRB2600_185_12 = 'abb-irb2600_185_12'
172
+ ABB_IRB4600_205_45 = 'abb-irb4600_205_45'
173
+ ABB_IRB4600_205_60 = 'abb-irb4600_205_60'
174
+ ABB_IRB4600_250_20 = 'abb-irb4600_250_20'
175
+ ABB_IRB4600_255_40 = 'abb-irb4600_255_40'
176
+ ABB_IRB6730_210_310 = 'abb-irb6730_210_310'
177
+ FANUC_ARC_MATE_100I_D = 'fanuc-arc_mate_100iD'
178
+ FANUC_ARC_MATE_100I_D16_S = 'fanuc-arc_mate_100iD16S'
179
+ FANUC_ARC_MATE_120I_D = 'fanuc-arc_mate_120iD'
180
+ FANUC_ARC_MATE_120I_D12_L = 'fanuc-arc_mate_120iD12L'
181
+ FANUC_ARC_MATE_120I_D35 = 'fanuc-arc_mate_120iD35'
182
+ FANUC_CR35IB = 'fanuc-cr35ib'
183
+ FANUC_CR7IA = 'fanuc-cr7ia'
184
+ FANUC_CR7IAL = 'fanuc-cr7ial'
185
+ FANUC_CRX10IA = 'fanuc-crx10ia'
186
+ FANUC_CRX10IAL = 'fanuc-crx10ial'
187
+ FANUC_CRX20IAL = 'fanuc-crx20ial'
188
+ FANUC_CRX25IA = 'fanuc-crx25ia'
189
+ FANUC_CRX30IA = 'fanuc-crx30ia'
190
+ FANUC_CRX5IA = 'fanuc-crx5ia'
191
+ FANUC_LR_MATE_200I_D = 'fanuc-lr_mate_200iD'
192
+ FANUC_LR_MATE_200I_D4_S = 'fanuc-lr_mate_200iD4S'
193
+ FANUC_LR_MATE_200I_D7_L = 'fanuc-lr_mate_200iD7L'
194
+ FANUC_M10I_D12 = 'fanuc-m10iD12'
195
+ FANUC_M10I_D16_S = 'fanuc-m10iD16S'
196
+ FANUC_M20I_D25 = 'fanuc-m20iD25'
197
+ FANUC_M20I_D35 = 'fanuc-m20iD35'
198
+ FANUC_M710I_C20_L = 'fanuc-m710iC20L'
199
+ FANUC_M900I_B280_L = 'fanuc-m900iB280L'
200
+ FANUC_M900I_B360_E = 'fanuc-m900iB360E'
201
+ FANUC_R2000IC125L = 'fanuc-r2000ic125l'
202
+ FANUC_R2000IC210F = 'fanuc-r2000ic210f'
203
+ KUKA_KR10_R1100 = 'kuka-kr10_r1100'
204
+ KUKA_KR10_R1100_2 = 'kuka-kr10_r1100_2'
205
+ KUKA_KR10_R900 = 'kuka-kr10_r900'
206
+ KUKA_KR10_R900_2 = 'kuka-kr10_r900_2'
207
+ KUKA_KR120_R2700_2 = 'kuka-kr120_r2700_2'
208
+ KUKA_KR12_R1810_2 = 'kuka-kr12_r1810_2'
209
+ KUKA_KR150_R2 = 'kuka-kr150_r2'
210
+ KUKA_KR16_R1610_2 = 'kuka-kr16_r1610_2'
211
+ KUKA_KR16_R2010_2 = 'kuka-kr16_r2010_2'
212
+ KUKA_KR20_R1810 = 'kuka-kr20_r1810'
213
+ KUKA_KR20_R1810_2 = 'kuka-kr20_r1810_2'
214
+ KUKA_KR210_R2700_2 = 'kuka-kr210_r2700_2'
215
+ KUKA_KR210_R3100_2 = 'kuka-kr210_r3100_2'
216
+ KUKA_KR210_R3300_2 = 'kuka-kr210_r3300_2'
217
+ KUKA_KR240_R2700 = 'kuka-kr240_r2700'
218
+ KUKA_KR250_R2700_2 = 'kuka-kr250_r2700_2'
219
+ KUKA_KR30_R2100 = 'kuka-kr30_r2100'
220
+ KUKA_KR30_R3 = 'kuka-kr30_r3'
221
+ KUKA_KR360_L240_3 = 'kuka-kr360_l240_3'
222
+ KUKA_KR3_R540 = 'kuka-kr3_r540'
223
+ KUKA_KR4_R600 = 'kuka-kr4_r600'
224
+ KUKA_KR500_L340_3 = 'kuka-kr500_l340_3'
225
+ KUKA_KR50_R2500 = 'kuka-kr50_r2500'
226
+ KUKA_KR60_R3 = 'kuka-kr60_r3'
227
+ KUKA_KR6_R1820 = 'kuka-kr6_r1820'
228
+ KUKA_KR6_R700_2 = 'kuka-kr6_r700_2'
229
+ KUKA_KR6_R700_SIXX = 'kuka-kr6_r700_sixx'
230
+ KUKA_KR6_R900 = 'kuka-kr6_r900'
231
+ KUKA_KR6_R900_2 = 'kuka-kr6_r900_2'
232
+ KUKA_KR70_R2100 = 'kuka-kr70_r2100'
233
+ KUKA_LBR_IISY_11_R1300 = 'kuka-lbr_iisy_11_r1300'
234
+ UNIVERSALROBOTS_UR10CB = 'universalrobots-ur10cb'
235
+ UNIVERSALROBOTS_UR10E = 'universalrobots-ur10e'
236
+ UNIVERSALROBOTS_UR12E = 'universalrobots-ur12e'
237
+ UNIVERSALROBOTS_UR16E = 'universalrobots-ur16e'
238
+ UNIVERSALROBOTS_UR20E = 'universalrobots-ur20e'
239
+ UNIVERSALROBOTS_UR3E = 'universalrobots-ur3e'
240
+ UNIVERSALROBOTS_UR5CB = 'universalrobots-ur5cb'
241
+ UNIVERSALROBOTS_UR5E = 'universalrobots-ur5e'
242
+ UNIVERSALROBOTS_UR7E = 'universalrobots-ur7e'
243
+ YASKAWA_AR1440 = 'yaskawa-ar1440'
244
+ YASKAWA_AR1730 = 'yaskawa-ar1730'
245
+ YASKAWA_AR2010 = 'yaskawa-ar2010'
246
+ YASKAWA_AR3120 = 'yaskawa-ar3120'
247
+ YASKAWA_AR700 = 'yaskawa-ar700'
248
+ YASKAWA_AR900 = 'yaskawa-ar900'
249
+ YASKAWA_GP110 = 'yaskawa-gp110'
250
+ YASKAWA_GP12 = 'yaskawa-gp12'
251
+ YASKAWA_GP180 = 'yaskawa-gp180'
252
+ YASKAWA_GP180_120 = 'yaskawa-gp180-120'
253
+ YASKAWA_GP20HL = 'yaskawa-gp20hl'
254
+ YASKAWA_GP215 = 'yaskawa-gp215'
255
+ YASKAWA_GP225 = 'yaskawa-gp225'
256
+ YASKAWA_GP25 = 'yaskawa-gp25'
257
+ YASKAWA_GP250 = 'yaskawa-gp250'
258
+ YASKAWA_GP25_12 = 'yaskawa-gp25_12'
259
+ YASKAWA_GP280 = 'yaskawa-gp280'
260
+ YASKAWA_GP35_L = 'yaskawa-gp35L'
261
+ YASKAWA_GP400 = 'yaskawa-gp400'
262
+ YASKAWA_GP50 = 'yaskawa-gp50'
263
+ YASKAWA_GP600 = 'yaskawa-gp600'
264
+ YASKAWA_GP7 = 'yaskawa-gp7'
265
+ YASKAWA_GP8 = 'yaskawa-gp8'
266
+ YASKAWA_GP88 = 'yaskawa-gp88'
267
+ YASKAWA_HC10DTP = 'yaskawa-hc10dtp'
268
+ YASKAWA_HC20DTP = 'yaskawa-hc20dtp'
269
+
270
+
271
+ class VirtualController(BaseModel):
272
+ """
273
+ The configuration of a virtual robot controller has to contain the manufacturer string,
274
+ an optional joint position string array and either a preset `type` **or** the complete JSON configuration.
275
+
276
+ """
277
+
278
+ kind: Literal['VirtualController'] = 'VirtualController'
279
+ manufacturer: Manufacturer
280
+ type: Optional[VirtualControllerTypes] = None
281
+ json_: Annotated[Optional[str], Field(alias='json')] = None
282
+ """
283
+ Complete JSON configuration of the virtual robot controller.
284
+ Can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](getVirtualControllerConfiguration).
285
+ If provided, the `type` field should not be used.
286
+
287
+ """
288
+ initial_joint_position: Optional[str] = None
289
+ """
290
+ Initial joint position of the first motion group from the virtual robot controller.
291
+ Provide the joint position as a JSON array containing 7 float values,
292
+ each representing a joint position in radians, e.g., "[0, 0, 0, 0, 0, 0, 0]". If the robot has fewer than 7 joints,
293
+ use "0" for each remaining position to ensure the array has exactly 7 values.
294
+
295
+ """
296
+
297
+
298
+ class YaskawaController(BaseModel):
299
+ """
300
+ The configuration of a physical Yaskawa robot controller has to contain IP address of the controller.
301
+ """
302
+
303
+ kind: Literal['YaskawaController'] = 'YaskawaController'
304
+ controller_ip: str
305
+
306
+
307
+ class RobotController(BaseModel):
308
+ """
309
+ The configuration of a physical or virtual robot controller.
310
+ """
311
+
312
+ name: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,61}[a-z0-9]$')]
313
+ """
314
+ Unique name of controller within the cell.
315
+ 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).
316
+
317
+ """
318
+ configuration: Annotated[
319
+ Union[
320
+ AbbController,
321
+ FanucController,
322
+ KukaController,
323
+ UniversalrobotsController,
324
+ VirtualController,
325
+ YaskawaController,
326
+ ],
327
+ Field(discriminator='kind'),
328
+ ]
329
+
330
+
331
+ class ImageCredentials(BaseModel):
332
+ """
333
+ User provided credentials for creating a secret to pull an image from a registry.
334
+
335
+ """
336
+
337
+ registry: str
338
+ user: str
339
+ password: str
340
+
341
+
342
+ class Secret(BaseModel):
343
+ name: str
344
+
345
+
346
+ class ContainerImage(BaseModel):
347
+ """
348
+ A user provided, custom container image and the required credentials to pull it from a registry.
349
+
350
+ """
351
+
352
+ image: Annotated[str, Field(min_length=1)]
353
+ """
354
+ The location of a container image in the form of `<registry>/<image>:<tag>`.
355
+ """
356
+ credentials: Optional[ImageCredentials] = None
357
+ secrets: Optional[List[Secret]] = None
358
+ """
359
+ Known secrets for authentication with the container registry.
360
+ """
361
+
362
+
363
+ class ContainerEnvironmentItem(BaseModel):
364
+ name: str
365
+ value: str
366
+
367
+
368
+ class ContainerEnvironment(RootModel):
369
+ """
370
+ A list of environment variables with name and their value.
371
+ These can be used to configure the containerized application, and turn features on or off.
372
+
373
+ """
374
+
375
+ root: List[ContainerEnvironmentItem]
376
+ """
377
+ A list of environment variables with name and their value.
378
+ These can be used to configure the containerized application, and turn features on or off.
379
+
380
+ """
381
+
382
+ def __getitem__(self, index: int) -> ContainerEnvironmentItem:
383
+ """
384
+ Make list RootModel directly indexable.
385
+ """
386
+ return self.root[index]
387
+
388
+ def __setitem__(self, index: int, value: ContainerEnvironmentItem) -> None:
389
+ """
390
+ Make list RootModel directly indexable.
391
+ """
392
+ self.root[index] = value
393
+
394
+ def __len__(self) -> int:
395
+ """
396
+ Make list RootModel directly usable with len().
397
+ """
398
+ return len(self.root)
399
+
400
+ def __iter__(self):
401
+ """
402
+ Make list RootModel directly iterable.
403
+ """
404
+ return iter(self.root)
405
+
406
+
407
+ class Capacity(RootModel):
408
+ root: Annotated[
409
+ str,
410
+ Field(
411
+ examples=['100Mi'], pattern='^[0-9]+(\\\\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|B)?$'
412
+ ),
413
+ ]
414
+ """
415
+ The amount of requested storage capacity.
416
+ """
417
+
418
+
419
+ class ContainerStorage(BaseModel):
420
+ """
421
+ The path and capacity of a volume that retains data across application restarts.
422
+ The maximal requestable capacity is 300Mi.
423
+ If you need more capacity consider using [storeObject](storeObject).
424
+
425
+ """
426
+
427
+ mount_path: Annotated[Path, Field(examples=['/data'])]
428
+ capacity: Capacity
429
+ """
430
+ The amount of local storage available for the application.
431
+
432
+ **NOTE:** The capacity can NEVER be reduced!
433
+
434
+ """
435
+
436
+
437
+ class ContainerResources(BaseModel):
438
+ """
439
+ Additional resources that the application requires.
440
+ """
441
+
442
+ intel_gpu: Annotated[Optional[int], Field(ge=0, le=1)] = None
443
+ """
444
+ Number of GPUs the application requires.
445
+ """
446
+ memory_limit: Annotated[Optional[str], Field(examples=['1000Mi'])] = None
447
+ """
448
+ The maximum memory allocated to this application.
449
+ """
450
+
451
+
452
+ class App(BaseModel):
453
+ """
454
+ An App is defined by a webserver, packed inside a container, serving a web-application.
455
+
456
+ """
457
+
458
+ name: Annotated[str, Field(min_length=1, pattern='^[a-z][a-z0-9-]{0,61}[a-z0-9]$')]
459
+ """
460
+ The name of the provided application.
461
+ The name must be unique within the cell and is used as a identifier for addressing the application in all API calls
462
+ , e.g., when updating the application.
463
+
464
+ It also defines where the application is reachable (/$cell/$name).
465
+
466
+ 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).
467
+
468
+ """
469
+ app_icon: Annotated[str, Field(min_length=1)]
470
+ """
471
+ The path of the icon for the App (/$cell/$name/$app_icon).
472
+ """
473
+ container_image: ContainerImage
474
+ port: Optional[int] = 8080
475
+ """
476
+ The port the containerized webserver is listening on.
477
+ """
478
+ environment: Optional[ContainerEnvironment] = None
479
+ storage: Optional[ContainerStorage] = None
480
+ resources: Optional[ContainerResources] = None
481
+ health_path: Optional[str] = None
482
+ """
483
+ Defines the URL path suffix used to check the application's health status. The complete health check URL
484
+ is constructed as `/$cell/$name/$health_path`. When the application is working as expected,
485
+ the endpoint returns an HTTP 200 status code.
486
+
487
+ If not specified, the system will default to using the application icon path suffix
488
+ (the value of `app_icon`) as the health check endpoint, resulting in `/$cell/$name/$app_icon`.
489
+
490
+ If the health check fails (no response or non-200 status code), the system will
491
+ automatically restart the application container to restore service.
492
+
493
+ """
494
+ diagnosis_path: Optional[str] = None
495
+ """
496
+ Defines the URL path suffix used to provide an endpoint for diagnosis data collection.
497
+ The complete diagnosis check URL is constructed as `/$cell/$name/$diagnosis_path`.
498
+
499
+ The endpoint is called when a diagnosis package is requested via the diagnosis API.
500
+ The endpoint needs to return the data within a zip file `application/zip` response.
501
+
502
+ """
503
+
504
+
505
+ class Cell(BaseModel):
506
+ """
507
+ To create a robot cell, only a valid name is required.
508
+ Once created, a robot cell provides access to the Wandelbots NOVA foundation services.
509
+ The configuration can be customized, e.g., robot controllers, also within apps.
510
+
511
+ """
512
+
513
+ name: CellName
514
+ description: Optional[CellDescription] = None
515
+ controllers: Optional[List[RobotController]] = None
516
+ apps: Optional[List[App]] = None
517
+
518
+
519
+ class Error(BaseModel):
520
+ code: Optional[str] = None
521
+ message: str
522
+
523
+
524
+ class OperatingState(Enum):
525
+ """
526
+ The operating state.
527
+ """
528
+
529
+ ACTIVE = 'ACTIVE'
530
+ INACTIVE = 'INACTIVE'
531
+
532
+
533
+ class ServiceGroup(Enum):
534
+ SYSTEM_SERVICE = 'SystemService'
535
+ CELL_SERVICE = 'CellService'
536
+ ROBOT_CONTROLLER = 'RobotController'
537
+ APP = 'App'
538
+
539
+
540
+ class ServiceStatusSeverity(Enum):
541
+ INFO = 'INFO'
542
+ WARNING = 'WARNING'
543
+ ERROR = 'ERROR'
544
+
545
+
546
+ class ServiceStatusPhase(Enum):
547
+ TERMINATING = 'Terminating'
548
+ INITIALIZED = 'Initialized'
549
+ RUNNING = 'Running'
550
+ NO_READY = 'NoReady'
551
+ COMPLETED = 'Completed'
552
+ CONTAINER_CREATING = 'ContainerCreating'
553
+ POD_INITIALIZING = 'PodInitializing'
554
+ UNKNOWN = 'Unknown'
555
+ CRASH_LOOP_BACK_OFF = 'CrashLoopBackOff'
556
+ ERROR = 'Error'
557
+ IMAGE_PULL_BACK_OFF = 'ImagePullBackOff'
558
+ OOM_KILLED = 'OOMKilled'
559
+ PENDING = 'Pending'
560
+ EVICTED = 'Evicted'
561
+
562
+
563
+ class Status(BaseModel):
564
+ severity: ServiceStatusSeverity
565
+ code: ServiceStatusPhase
566
+ reason: Optional[str] = None
567
+
568
+
569
+ class ServiceStatus(BaseModel):
570
+ service: str
571
+ group: ServiceGroup
572
+ status: Status
573
+
574
+
575
+ class ServiceStatusList(RootModel):
576
+ root: List[ServiceStatus]
577
+
578
+ def __getitem__(self, index: int) -> ServiceStatus:
579
+ """
580
+ Make list RootModel directly indexable.
581
+ """
582
+ return self.root[index]
583
+
584
+ def __setitem__(self, index: int, value: ServiceStatus) -> None:
585
+ """
586
+ Make list RootModel directly indexable.
587
+ """
588
+ self.root[index] = value
589
+
590
+ def __len__(self) -> int:
591
+ """
592
+ Make list RootModel directly usable with len().
593
+ """
594
+ return len(self.root)
595
+
596
+ def __iter__(self):
597
+ """
598
+ Make list RootModel directly iterable.
599
+ """
600
+ return iter(self.root)
601
+
602
+
603
+ class ServiceStatusResponse(BaseModel):
604
+ """
605
+ Response containing both the overall operating state of the cell and detailed status information for each service within the cell.
606
+
607
+ The operating state indicates whether the cell is active or inactive, while the service statuses provide specific health and operational
608
+ information for individual service running in the cell.
609
+
610
+ """
611
+
612
+ operating_state: OperatingState
613
+ service_status: ServiceStatusList
614
+
615
+
616
+ class BusIOProfinetIpConfig(BaseModel):
617
+ """
618
+ Network configuration or IPv4 record of the virtual ethernet interface (pnio1) created by the PROFINET driver.
619
+ The IPv4 record is used in combination with the Name of Station (NoS) to identify your device in the PROFINET network.
620
+
621
+ The `ip_config` will be used as IPv4 record if no REMA XML file is already present on your machine and no `rema_xml_content` is provided.
622
+
623
+ """
624
+
625
+ ip: Annotated[str, Field(examples=['192.168.1.100'])]
626
+ """
627
+ IP address for the device's virtual ethernet interface (pnio1).
628
+ """
629
+ netmask: Annotated[str, Field(examples=['255.255.255.0'])]
630
+ """
631
+ Network mask for the device's virtual ethernet interface (pnio1).
632
+ """
633
+ gateway: Annotated[str, Field(examples=['192.168.178.1'])]
634
+ """
635
+ Gateway for connections to other devices outside of the virtual ethernet interface's subnet.
636
+ """
637
+
638
+
639
+ class BusIOProfinetNetwork(BaseModel):
640
+ device_name: Annotated[Optional[str], Field(examples=['pnDevice'])] = None
641
+ """
642
+ Name of Station (NoS) of the PROFINET device. The NoS is used in combination with IPv4 record to identify your device in the PROFINET network.
643
+ The `device_name` will be used as NoS if no REMA XML file is already present on your machine and no `rema_xml_content` is provided.
644
+
645
+ """
646
+ ip_config: Optional[BusIOProfinetIpConfig] = None
647
+ rema_xml_content: Optional[str] = None
648
+ """
649
+ Content of the PROFINET REMA XML file.
650
+ Is used when PROFINET service is added for the first time to create the REMA XML file that holds data to be kept for the next session.
651
+ Stores information like IP address, Name of Station (NoS) and hardware configuration.
652
+ If you use a PROFINET controller to assign an IP address to the PROFINET device, this information will be written to the REMA XML file.
653
+
654
+ Refer to the PDF version of the "PN Driver I/O Base programming interface" documentation for more information and an example REMA file.
655
+
656
+ """
657
+
658
+
659
+ class BusIOProfinetDefaultRoute(BaseModel):
660
+ """
661
+ Current default route configuration of your NOVA instance.
662
+ The default route is a setting that tells data where to go if there isn’t a specific path already known for its destination.
663
+ Usually this will be the path to your router, enabling accessing the internet.
664
+ On Linux, use `ip route show` to view your default routes and match the output
665
+ `default via <gateway> dev <interface> ...` to get your gateway and interface.
666
+
667
+ """
668
+
669
+ gateway: Annotated[str, Field(examples=['192.168.124.1'])]
670
+ """
671
+ Gateway for the default route.
672
+ """
673
+ interface: Annotated[str, Field(examples=['enp3s0'])]
674
+ """
675
+ Interface for the default route.
676
+ """
677
+
678
+
679
+ class BusIOProfinet(BaseModel):
680
+ """
681
+ PROFINET BUS inputs/outputs service configuration.
682
+
683
+ """
684
+
685
+ bus_type: Literal['profinet'] = 'profinet'
686
+ network_config: Optional[BusIOProfinetNetwork] = None
687
+ """
688
+ Used to enable IP communication through the same physical ethernet interface while PROFINET driver is active.
689
+
690
+ """
691
+ plc_ip: Annotated[str, Field(examples=['192.168.1.100'])]
692
+ """
693
+ IP address of the PLC to establish PROFINET communication with.
694
+
695
+ The IP address is used to configure the host machine's firewall. The firewall configuration is applied while the BUS input/output service is active.
696
+ Without proper firewall configuration, PROFINET device discovery, configuration exchanges,
697
+ and real-time cyclic data communication will fail.
698
+
699
+ """
700
+ mac: Annotated[str, Field(examples=['00:11:22:33:44:55'])]
701
+ """
702
+ MAC address of the physical ethernet interface that you want to use for PROFINET communication.
703
+
704
+ """
705
+ default_route: Optional[BusIOProfinetDefaultRoute] = None
706
+
707
+
708
+ class BusIOProfinetVirtual(BaseModel):
709
+ """
710
+ Virtual PROFINET BUS inputs/outputs service configuration.
711
+
712
+ """
713
+
714
+ bus_type: Literal['profinet_virtual'] = 'profinet_virtual'
715
+
716
+
717
+ class BusIOModbusTCPServer(BaseModel):
718
+ network_type: Optional[Literal['tcp']] = None
719
+ port: Annotated[int, Field(examples=[502], ge=1, le=65534)]
720
+ """
721
+ Port number of the MODBUS server to establish communication with.
722
+
723
+ """
724
+
725
+
726
+ class BusIOModbusServer(BaseModel):
727
+ """
728
+ MODBUS server inputs/outputs service configuration.
729
+
730
+ """
731
+
732
+ bus_type: Literal['modbus_server'] = 'modbus_server'
733
+ network: BusIOModbusTCPServer
734
+ connections: Annotated[int, Field(examples=[2], ge=0, le=255)]
735
+ """
736
+ Number of connections this MODBUS server can handle.
737
+
738
+ """
739
+ coils_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
740
+ """
741
+ Size of the Coils memory area.
742
+
743
+ """
744
+ discrete_inputs_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
745
+ """
746
+ Size of the Discrete Inputs memory area.
747
+
748
+ """
749
+ holding_registers_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
750
+ """
751
+ Size of the Holding Registers memory area.
752
+
753
+ """
754
+ input_registers_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
755
+ """
756
+ Size of the Input Registers memory area.
757
+
758
+ """
759
+
760
+
761
+ class BusIOModbusTCPClient(BaseModel):
762
+ network_type: Optional[Literal['tcp']] = None
763
+ ip: Annotated[str, Field(examples=['192.168.1.100'])]
764
+ """
765
+ IP address of the MODBUS server to establish communication with.
766
+
767
+ """
768
+ port: Annotated[int, Field(examples=[502], ge=1, le=65534)]
769
+ """
770
+ Port number of the MODBUS server to establish communication with.
771
+
772
+ """
773
+
774
+
775
+ class BusIOModbusClient(BaseModel):
776
+ """
777
+ MODBUS client inputs/outputs service configuration.
778
+
779
+ """
780
+
781
+ bus_type: Literal['modbus_client'] = 'modbus_client'
782
+ network: BusIOModbusTCPClient
783
+
784
+
785
+ class BusIOModbusVirtual(BaseModel):
786
+ """
787
+ Virtual MODBUS inputs/outputs service configuration.
788
+
789
+ """
790
+
791
+ bus_type: Literal['modbus_virtual'] = 'modbus_virtual'
792
+
793
+
794
+ class BusIOType(RootModel):
795
+ root: Annotated[
796
+ Union[
797
+ BusIOProfinet,
798
+ BusIOProfinetVirtual,
799
+ BusIOModbusServer,
800
+ BusIOModbusClient,
801
+ BusIOModbusVirtual,
802
+ ],
803
+ Field(discriminator='bus_type'),
804
+ ]
805
+
806
+
807
+ class ReleaseChannel(Enum):
808
+ """
809
+ The channel that defines what a new Wandelbots NOVA version is.
810
+
811
+ * `next` the over all latest version
812
+ * `stable` newes patch of the current version
813
+
814
+ """
815
+
816
+ STABLE = 'stable'
817
+ NEXT = 'next'
818
+
819
+
820
+ class UpdateNovaVersionRequest(BaseModel):
821
+ """
822
+ An update is defined by the indicated Wandelbots NOVA release channel.
823
+
824
+ """
825
+
826
+ channel: ReleaseChannel
827
+
828
+
829
+ class ConfigurationResourceId(RootModel):
830
+ root: str
831
+ """
832
+ Identifier of a configuration resource.
833
+ """
834
+
835
+
836
+ class Metadata(RootModel):
837
+ """
838
+ Additional metadata to add to the backup
839
+ """
840
+
841
+ root: Dict[str, str]
842
+
843
+
844
+ class ConfigurationArchive(RootModel):
845
+ root: bytes
846
+ """
847
+ Binary data representing a configuration archive.
848
+ """
849
+
850
+
851
+ class ConfigurationArchiveStatusCreating(BaseModel):
852
+ status: Literal['creating'] = 'creating'
853
+ """
854
+ Backup is in progress.
855
+ """
856
+ progress: Annotated[float, Field(ge=0.0, le=1.0)]
857
+ """
858
+ Current completion ratio (0 – 1).
859
+ """
860
+
861
+
862
+ class ConfigurationArchiveStatusError(BaseModel):
863
+ status: Literal['error'] = 'error'
864
+ message: str
865
+ """
866
+ Human-readable explanation of the failure.
867
+ """
868
+
869
+
870
+ class ConfigurationArchiveStatusSuccess(BaseModel):
871
+ status: Literal['success'] = 'success'
872
+ """
873
+ Backup successfully created.
874
+ """
875
+
876
+
877
+ class ConfigurationArchiveStatus(RootModel):
878
+ root: Annotated[
879
+ Union[
880
+ ConfigurationArchiveStatusCreating,
881
+ ConfigurationArchiveStatusError,
882
+ ConfigurationArchiveStatusSuccess,
883
+ ],
884
+ Field(discriminator='status'),
885
+ ]
886
+ """
887
+ Result of a backup operation.
888
+ """
889
+
890
+
891
+ class LicenseStatusEnum(Enum):
892
+ OK = 'OK'
893
+ EXPIRED = 'EXPIRED'
894
+ SUSPENDED = 'SUSPENDED'
895
+ GRACE_PERIOD_OVER = 'GRACE_PERIOD_OVER'
896
+ NOT_FOUND = 'NOT_FOUND'
897
+
898
+
899
+ class LicenseStatus(BaseModel):
900
+ """
901
+ Status of the license.
902
+ """
903
+
904
+ status: LicenseStatusEnum
905
+ message: str
906
+
907
+
908
+ class License(BaseModel):
909
+ product_name: str
910
+ """
911
+ Name of the licensed product.
912
+ """
913
+ owner_email: EmailStr
914
+ """
915
+ Mail address of the license owner.
916
+ """
917
+ license_key: str
918
+ """
919
+ Identification key of the license.
920
+ """
921
+ license_expiry_date: Optional[date] = None
922
+ """
923
+ Expiration date of the license.
924
+ """
925
+ grace_period_expiry_date: AwareDatetime
926
+ """
927
+ End date of grace period, given if instance is not connected to internet.
928
+ """
929
+ consumed_activations: int
930
+ """
931
+ Amount of times the license was activated.
932
+ """
933
+ allowed_activations: int
934
+ """
935
+ Amount of times the license can be activated.
936
+ """
937
+ feature_limitations: Optional[Dict[str, int]] = None
938
+ """
939
+ Feature limitations of the license.
940
+ """
941
+ feature_flags: Optional[List[str]] = None
942
+ """
943
+ Features enabled by a license.
944
+ """
945
+ status: LicenseStatus
946
+
947
+
948
+ class ActivateLicenseRequest(BaseModel):
949
+ """
950
+ The authentication token to fetch the license from the license server.
951
+ """
952
+
953
+ owner_refresh_token: str
954
+
955
+
956
+ class Sphere(BaseModel):
957
+ """
958
+ Defines a spherical shape centred around the origin.
959
+ """
960
+
961
+ shape_type: Literal['sphere'] = 'sphere'
962
+ radius: float
963
+ """
964
+ The radius of the sphere in [mm].
965
+ """
966
+
967
+
968
+ class BoxType(Enum):
969
+ """
970
+ The box type defines if the box is hollow or full.
971
+ """
972
+
973
+ HOLLOW = 'HOLLOW'
974
+ FULL = 'FULL'
975
+
976
+
977
+ class Box(BaseModel):
978
+ """
979
+ Defines a cuboid shape centred around an origin.
980
+
981
+ If a margin is applied to the box type full, it is added to all size values. The shape will keep its edges.
982
+ The hollow box type consists of thin boxes that make up its walls.
983
+ If a margin is applied to the box type hollow, its size values are reduced by the margin.
984
+
985
+ """
986
+
987
+ shape_type: Literal['box'] = 'box'
988
+ size_x: float
989
+ """
990
+ The dimension in x-direction in [mm].
991
+ """
992
+ size_y: float
993
+ """
994
+ The dimension in y-direction in [mm].
995
+ """
996
+ size_z: float
997
+ """
998
+ The dimension in z-direction in [mm].
999
+ """
1000
+ box_type: BoxType
1001
+ """
1002
+ The box type defines if the box is hollow or full.
1003
+ """
1004
+
1005
+
1006
+ class Rectangle(BaseModel):
1007
+ """
1008
+ Defines an x/y-plane with finite size. Centred around the z-axis.
1009
+ """
1010
+
1011
+ shape_type: Literal['rectangle'] = 'rectangle'
1012
+ size_x: float
1013
+ """
1014
+ The dimension in x-direction in [mm].
1015
+ """
1016
+ size_y: float
1017
+ """
1018
+ The dimension in y-direction in [mm].
1019
+ """
1020
+
1021
+
1022
+ class Plane(BaseModel):
1023
+ """
1024
+ Defines an x/y-plane with infinite size.
1025
+ """
1026
+
1027
+ shape_type: Literal['plane'] = 'plane'
1028
+
1029
+
1030
+ class Cylinder(BaseModel):
1031
+ """
1032
+ Defines a cylindrical shape.
1033
+ Centred around origin, symmetric around z-axis.
1034
+
1035
+ If a margin is applied, it is added to radius and height. The shape will keep its edges.
1036
+
1037
+ """
1038
+
1039
+ shape_type: Literal['cylinder'] = 'cylinder'
1040
+ radius: float
1041
+ """
1042
+ The radius of the cylinder in [mm].
1043
+ """
1044
+ height: float
1045
+ """
1046
+ The height of the cylinder in [mm].
1047
+ """
1048
+
1049
+
1050
+ class Capsule(BaseModel):
1051
+ """
1052
+ Defines a cylindrical shape with 2 semi-spheres on the top and bottom.
1053
+ Centred around origin, symmetric around z-axis.
1054
+
1055
+ """
1056
+
1057
+ shape_type: Literal['capsule'] = 'capsule'
1058
+ radius: float
1059
+ """
1060
+ The radius of the cylinder and semi-spheres in [mm].
1061
+ """
1062
+ cylinder_height: float
1063
+ """
1064
+ The height of the inner cylinder in [mm].
1065
+ """
1066
+
1067
+
1068
+ class RectangularCapsule(BaseModel):
1069
+ """
1070
+ Convex hull around four spheres. Sphere center points in x/y-plane, offset by either combination "+/- sizeX" or "+/- sizeY".
1071
+
1072
+ Alternative description: Rectangle in x/y-plane with a 3D padding.
1073
+
1074
+ """
1075
+
1076
+ shape_type: Literal['rectangular_capsule'] = 'rectangular_capsule'
1077
+ radius: float
1078
+ """
1079
+ The radius of the inner spheres in [mm].
1080
+ """
1081
+ sphere_center_distance_x: float
1082
+ """
1083
+ The distance of the sphere center in x-direction in [mm].
1084
+ """
1085
+ sphere_center_distance_y: float
1086
+ """
1087
+ The distance of the sphere center in y-direction in [mm].
1088
+ """
1089
+
1090
+
1091
+ class Vector3d(RootModel):
1092
+ """
1093
+ A three-dimensional vector [x, y, z] with double precision.
1094
+
1095
+ """
1096
+
1097
+ root: Annotated[List[float], Field(max_length=3, min_length=3, title='Vector3d')]
1098
+ """
1099
+ A three-dimensional vector [x, y, z] with double precision.
1100
+
1101
+ """
1102
+
1103
+ def __getitem__(self, index: int) -> float:
1104
+ """
1105
+ Make list RootModel directly indexable.
1106
+ """
1107
+ return self.root[index]
1108
+
1109
+ def __setitem__(self, index: int, value: float) -> None:
1110
+ """
1111
+ Make list RootModel directly indexable.
1112
+ """
1113
+ self.root[index] = value
1114
+
1115
+ def __len__(self) -> int:
1116
+ """
1117
+ Make list RootModel directly usable with len().
1118
+ """
1119
+ return len(self.root)
1120
+
1121
+ def __iter__(self):
1122
+ """
1123
+ Make list RootModel directly iterable.
1124
+ """
1125
+ return iter(self.root)
1126
+
1127
+
1128
+ class ConvexHull(BaseModel):
1129
+ """
1130
+ Defines a convex hull encapsulating a set of vertices.
1131
+ """
1132
+
1133
+ shape_type: Literal['convex_hull'] = 'convex_hull'
1134
+ vertices: List[Vector3d]
1135
+ """
1136
+ The list of encapsulated points.
1137
+ """
1138
+
1139
+
1140
+ class RotationVector(RootModel):
1141
+ """
1142
+ Defines a rotation in 3D space.
1143
+ A three-dimensional Vector [rx, ry, rz] with double precision.
1144
+ Rotation is applied around the vector.
1145
+ The angle of rotation equals the length of the vector.
1146
+
1147
+ """
1148
+
1149
+ root: Annotated[
1150
+ List[float], Field(max_length=3, min_length=3, title='RotationVector')
1151
+ ]
1152
+ """
1153
+ Defines a rotation in 3D space.
1154
+ A three-dimensional Vector [rx, ry, rz] with double precision.
1155
+ Rotation is applied around the vector.
1156
+ The angle of rotation equals the length of the vector.
1157
+
1158
+ """
1159
+
1160
+ def __getitem__(self, index: int) -> float:
1161
+ """
1162
+ Make list RootModel directly indexable.
1163
+ """
1164
+ return self.root[index]
1165
+
1166
+ def __setitem__(self, index: int, value: float) -> None:
1167
+ """
1168
+ Make list RootModel directly indexable.
1169
+ """
1170
+ self.root[index] = value
1171
+
1172
+ def __len__(self) -> int:
1173
+ """
1174
+ Make list RootModel directly usable with len().
1175
+ """
1176
+ return len(self.root)
1177
+
1178
+ def __iter__(self):
1179
+ """
1180
+ Make list RootModel directly iterable.
1181
+ """
1182
+ return iter(self.root)
1183
+
1184
+
1185
+ class Pose(BaseModel):
1186
+ """
1187
+ Defines a pose in 3D space.
1188
+ A pose is a combination of a position and an orientation.
1189
+ The position is applied before the orientation.
1190
+
1191
+ """
1192
+
1193
+ position: Optional[Vector3d] = None
1194
+ orientation: Optional[RotationVector] = None
1195
+
1196
+
1197
+ class Collider(BaseModel):
1198
+ """
1199
+ Defines a collider with a single shape.
1200
+
1201
+ A collider is an object that is used for collision detection.
1202
+ It defines the `shape` that is attached with the offset of `pose` to a reference frame.
1203
+
1204
+ Use colliders to:
1205
+ - Define the shape of a workpiece. The reference frame is the scene origin.
1206
+ - Define the shape of a link in a motion group. The reference frame is the link coordinate system.
1207
+ - Define the shape of a tool. The reference frame is the flange coordinate system.
1208
+
1209
+ """
1210
+
1211
+ shape: Annotated[
1212
+ Union[
1213
+ Sphere,
1214
+ Box,
1215
+ Rectangle,
1216
+ Plane,
1217
+ Cylinder,
1218
+ Capsule,
1219
+ RectangularCapsule,
1220
+ ConvexHull,
1221
+ ],
1222
+ Field(discriminator='shape_type'),
1223
+ ]
1224
+ pose: Optional[Pose] = None
1225
+ margin: Optional[float] = 0
1226
+ """
1227
+ Increases the shape's size in all dimensions. Applied in [mm]. Can be used to keep a safe distance to the shape.
1228
+ """
1229
+
1230
+
1231
+ class Link(RootModel):
1232
+ root: Dict[str, Collider]
1233
+
1234
+
1235
+ class LinkChain(RootModel):
1236
+ """
1237
+ A link chain is a kinematic chain of links that is connected via joints.
1238
+ A motion group can be used to control the motion of the joints in a link chain.
1239
+
1240
+ A link is a group of colliders that is attached to the link reference frame.
1241
+
1242
+ The reference frame of a link is obtained after applying all sets of Denavit-Hartenberg-parameters from base to (including) the link index.
1243
+
1244
+ This means that the reference frame of the link is on the rotation axis of the next joint in the kinematic chain.
1245
+ Example: For a motion group with 2 joints, the collider reference frame (CRF) for link 1 is on the rotation axis of joint 2. The chain looks like:
1246
+ - Origin >> Mounting >> Base >> (CRF Base) Joint 0 >> Link 0 >> (CRF Link 0) Joint 1 >> Link 1 >> (CRF Link 1) Flange (CRF Tool) >> TCP
1247
+
1248
+ Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
1249
+
1250
+ """
1251
+
1252
+ root: Annotated[
1253
+ List[Link],
1254
+ Field(
1255
+ examples=[
1256
+ [
1257
+ {
1258
+ 'link_0_sphere': {
1259
+ 'shape': {'shape_type': 'sphere', 'radius': 10},
1260
+ 'pose': {'position': [0, 0, -10]},
1261
+ },
1262
+ 'link_0_capsule': {
1263
+ 'shape': {
1264
+ 'shape_type': 'capsule',
1265
+ 'radius': 5,
1266
+ 'cylinder_height': 20,
1267
+ }
1268
+ },
1269
+ },
1270
+ {},
1271
+ {
1272
+ 'link_2_capsule': {
1273
+ 'shape': {
1274
+ 'shape_type': 'capsule',
1275
+ 'radius': 5,
1276
+ 'cylinder_height': 20,
1277
+ }
1278
+ }
1279
+ },
1280
+ ]
1281
+ ],
1282
+ title='Link Chain',
1283
+ ),
1284
+ ]
1285
+ """
1286
+ A link chain is a kinematic chain of links that is connected via joints.
1287
+ A motion group can be used to control the motion of the joints in a link chain.
1288
+
1289
+ A link is a group of colliders that is attached to the link reference frame.
1290
+
1291
+ The reference frame of a link is obtained after applying all sets of Denavit-Hartenberg-parameters from base to (including) the link index.
1292
+
1293
+ This means that the reference frame of the link is on the rotation axis of the next joint in the kinematic chain.
1294
+ Example: For a motion group with 2 joints, the collider reference frame (CRF) for link 1 is on the rotation axis of joint 2. The chain looks like:
1295
+ - Origin >> Mounting >> Base >> (CRF Base) Joint 0 >> Link 0 >> (CRF Link 0) Joint 1 >> Link 1 >> (CRF Link 1) Flange (CRF Tool) >> TCP
1296
+
1297
+ Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
1298
+
1299
+ """
1300
+
1301
+ def __getitem__(self, index: int) -> Link:
1302
+ """
1303
+ Make list RootModel directly indexable.
1304
+ """
1305
+ return self.root[index]
1306
+
1307
+ def __setitem__(self, index: int, value: Link) -> None:
1308
+ """
1309
+ Make list RootModel directly indexable.
1310
+ """
1311
+ self.root[index] = value
1312
+
1313
+ def __len__(self) -> int:
1314
+ """
1315
+ Make list RootModel directly usable with len().
1316
+ """
1317
+ return len(self.root)
1318
+
1319
+ def __iter__(self):
1320
+ """
1321
+ Make list RootModel directly iterable.
1322
+ """
1323
+ return iter(self.root)
1324
+
1325
+
1326
+ class ControllerDescription(BaseModel):
1327
+ """
1328
+ The data type to describe a robot controller.
1329
+ """
1330
+
1331
+ connected_motion_groups: List[str]
1332
+ supports_freedrive: bool
1333
+ """
1334
+ Can this controller be moved through freedrive (true), or not (false).
1335
+ """
1336
+ supports_control: bool
1337
+ """
1338
+ Can this controller be controlled with NOVA (true) or is it only possible to read data (false).
1339
+ """
1340
+ supports_safety_zones: bool
1341
+ """
1342
+ True if NOVA supports reading safety zone-, tool- and link-geometries for this motion group.
1343
+ Safety zones are used to define areas where the robot should slow down or stop.
1344
+ If false, NOVA can't guarantee that the executed motions respect safety zones defined on the controller.
1345
+
1346
+ """
1347
+
1348
+
1349
+ class RobotSystemMode(Enum):
1350
+ """
1351
+ Defines the current system mode of the robot system, including NOVA communicating with the robot controller.
1352
+
1353
+ ### MODE_CONTROLLER_NOT_CONFIGURED
1354
+
1355
+ No controller with the specified identifier is configured. Call [addRobotController](addRobotController) to register a controller.
1356
+
1357
+ ### MODE_INITIALIZING
1358
+
1359
+ Indicates that a connection to the robot controller is established or reestablished in case of a disconnect.
1360
+ On success, the controller is set to MODE_MONITOR.
1361
+ On failure, the initialization process is retried until successful or cancelled by the user.
1362
+
1363
+ ### MODE_MONITOR
1364
+
1365
+ Read-only mode with an active controller connection.
1366
+ - Receives robot state and I/O signals
1367
+ - Move requests are rejected
1368
+ - No commands are sent to the controller
1369
+
1370
+ ### MODE_CONTROL
1371
+
1372
+ Active control mode.
1373
+
1374
+ **Movement is possible in this mode**
1375
+
1376
+ The robot is cyclically commanded to hold its current position.
1377
+ The robot state is received in sync with the controller cycle.
1378
+ Motion and jogging requests are accepted and executed.
1379
+ Input/Output interaction is enabled.
1380
+
1381
+ ### MODE_FREE_DRIVE
1382
+
1383
+ Read-only mode with servo motors enabled for manual movement (Free Drive).
1384
+
1385
+ Move requests are rejected.
1386
+
1387
+ Not supported by all robots: Use [getSupportedModes](getSupportedModes) to check Free Drive availability.
1388
+
1389
+ """
1390
+
1391
+ MODE_CONTROLLER_NOT_CONFIGURED = 'MODE_CONTROLLER_NOT_CONFIGURED'
1392
+ MODE_INITIALIZING = 'MODE_INITIALIZING'
1393
+ MODE_MONITOR = 'MODE_MONITOR'
1394
+ MODE_CONTROL = 'MODE_CONTROL'
1395
+ MODE_FREE_DRIVE = 'MODE_FREE_DRIVE'
1396
+
1397
+
1398
+ class OperationMode(Enum):
1399
+ """
1400
+ Current operation mode of the configured robot controller.
1401
+ Operation modes in which the attached motion groups can be moved are:
1402
+ - OPERATION_MODE_MANUAL (if enabling switch is pressed)
1403
+ - OPERATION_MODE_MANUAL_T1 (if enabling switch is pressed)
1404
+ - OPERATION_MODE_MANUAL_T2 (if enabling switch is pressed)
1405
+ - OPERATION_MODE_AUTO (without needing to press enabling switch)
1406
+ All other modes are considered as non-operational.
1407
+
1408
+ """
1409
+
1410
+ OPERATION_MODE_UNKNOWN = 'OPERATION_MODE_UNKNOWN'
1411
+ OPERATION_MODE_NO_CONTROLLER = 'OPERATION_MODE_NO_CONTROLLER'
1412
+ OPERATION_MODE_DISCONNECTED = 'OPERATION_MODE_DISCONNECTED'
1413
+ OPERATION_MODE_POWER_ON = 'OPERATION_MODE_POWER_ON'
1414
+ OPERATION_MODE_PENDING = 'OPERATION_MODE_PENDING'
1415
+ OPERATION_MODE_MANUAL = 'OPERATION_MODE_MANUAL'
1416
+ OPERATION_MODE_MANUAL_T1 = 'OPERATION_MODE_MANUAL_T1'
1417
+ OPERATION_MODE_MANUAL_T2 = 'OPERATION_MODE_MANUAL_T2'
1418
+ OPERATION_MODE_AUTO = 'OPERATION_MODE_AUTO'
1419
+ OPERATION_MODE_RECOVERY = 'OPERATION_MODE_RECOVERY'
1420
+
1421
+
1422
+ class SafetyStateType(Enum):
1423
+ """
1424
+ Current safety state of the configured robot controller.
1425
+ Operation modes in which the attached motion groups can be moved are:
1426
+ - SAFETY_STATE_NORMAL
1427
+ - SAFETY_STATE_REDUCED
1428
+ All other modes are considered as non-operational.
1429
+
1430
+ """
1431
+
1432
+ SAFETY_STATE_UNKNOWN = 'SAFETY_STATE_UNKNOWN'
1433
+ SAFETY_STATE_FAULT = 'SAFETY_STATE_FAULT'
1434
+ SAFETY_STATE_NORMAL = 'SAFETY_STATE_NORMAL'
1435
+ SAFETY_STATE_MASTERING = 'SAFETY_STATE_MASTERING'
1436
+ SAFETY_STATE_CONFIRM_SAFETY = 'SAFETY_STATE_CONFIRM_SAFETY'
1437
+ SAFETY_STATE_OPERATOR_SAFETY = 'SAFETY_STATE_OPERATOR_SAFETY'
1438
+ SAFETY_STATE_PROTECTIVE_STOP = 'SAFETY_STATE_PROTECTIVE_STOP'
1439
+ SAFETY_STATE_REDUCED = 'SAFETY_STATE_REDUCED'
1440
+ SAFETY_STATE_STOP = 'SAFETY_STATE_STOP'
1441
+ SAFETY_STATE_STOP_0 = 'SAFETY_STATE_STOP_0'
1442
+ SAFETY_STATE_STOP_1 = 'SAFETY_STATE_STOP_1'
1443
+ SAFETY_STATE_STOP_2 = 'SAFETY_STATE_STOP_2'
1444
+ SAFETY_STATE_RECOVERY = 'SAFETY_STATE_RECOVERY'
1445
+ SAFETY_STATE_DEVICE_EMERGENCY_STOP = 'SAFETY_STATE_DEVICE_EMERGENCY_STOP'
1446
+ SAFETY_STATE_ROBOT_EMERGENCY_STOP = 'SAFETY_STATE_ROBOT_EMERGENCY_STOP'
1447
+ SAFETY_STATE_VIOLATION = 'SAFETY_STATE_VIOLATION'
1448
+
1449
+
1450
+ class Joints(RootModel):
1451
+ """
1452
+ This structure describes a set of joint values, e.g., positions, currents, torques, of a motion group.
1453
+
1454
+ Float precision is the default.
1455
+
1456
+ """
1457
+
1458
+ root: List[float]
1459
+ """
1460
+ This structure describes a set of joint values, e.g., positions, currents, torques, of a motion group.
1461
+
1462
+ Float precision is the default.
1463
+
1464
+ """
1465
+
1466
+ def __getitem__(self, index: int) -> float:
1467
+ """
1468
+ Make list RootModel directly indexable.
1469
+ """
1470
+ return self.root[index]
1471
+
1472
+ def __setitem__(self, index: int, value: float) -> None:
1473
+ """
1474
+ Make list RootModel directly indexable.
1475
+ """
1476
+ self.root[index] = value
1477
+
1478
+ def __len__(self) -> int:
1479
+ """
1480
+ Make list RootModel directly usable with len().
1481
+ """
1482
+ return len(self.root)
1483
+
1484
+ def __iter__(self):
1485
+ """
1486
+ Make list RootModel directly iterable.
1487
+ """
1488
+ return iter(self.root)
1489
+
1490
+
1491
+ class MotionGroupStateJointLimitReached(BaseModel):
1492
+ """
1493
+ Indicates which joint of the motion group is in a limit.
1494
+ If a joint is in its limit, only this joint can be moved. Movements that affect any other joints are not executed.
1495
+
1496
+ """
1497
+
1498
+ limit_reached: List[bool]
1499
+ """
1500
+ If true, operational (soft) jointLimit is reached for specific joint.
1501
+ """
1502
+
1503
+
1504
+ class JoggingRunning(BaseModel):
1505
+ """
1506
+ Jogging is active.
1507
+
1508
+ """
1509
+
1510
+ kind: Literal['RUNNING'] = 'RUNNING'
1511
+
1512
+
1513
+ class JoggingPausedByUser(BaseModel):
1514
+ """
1515
+ User has paused jogging.
1516
+
1517
+ """
1518
+
1519
+ kind: Literal['PAUSED_BY_USER'] = 'PAUSED_BY_USER'
1520
+
1521
+
1522
+ class JoggingPausedOnIO(BaseModel):
1523
+ """
1524
+ Jogging was paused because of an I/O event.
1525
+
1526
+ """
1527
+
1528
+ kind: Literal['PAUSED_ON_IO'] = 'PAUSED_ON_IO'
1529
+
1530
+
1531
+ class JointIndice(RootModel):
1532
+ root: Annotated[int, Field(ge=0, le=2147483647)]
1533
+
1534
+
1535
+ class JoggingPausedNearJointLimit(BaseModel):
1536
+ """
1537
+ Jogging was paused because a joint is near its limit.
1538
+
1539
+ """
1540
+
1541
+ kind: Literal['PAUSED_NEAR_JOINT_LIMIT'] = 'PAUSED_NEAR_JOINT_LIMIT'
1542
+ joint_indices: List[JointIndice]
1543
+
1544
+
1545
+ class JoggingPausedNearCollision(BaseModel):
1546
+ """
1547
+ Jogging was paused because the motion group neared a collision.
1548
+
1549
+ """
1550
+
1551
+ kind: Literal['PAUSED_NEAR_COLLISION'] = 'PAUSED_NEAR_COLLISION'
1552
+ description: str
1553
+
1554
+
1555
+ class JoggingDetails(BaseModel):
1556
+ """
1557
+ State of jogging execution.
1558
+ This state is sent during jogging movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate.
1559
+ The jogging state can be one of the following:
1560
+ - RUNNING: Jogging is active.
1561
+ - PAUSED_BY_USER: User has paused jogging.
1562
+ - PAUSED_NEAR_JOINT_LIMIT: Jogging was paused because a joint is is near its limit.
1563
+ - PAUSED_NEAR_COLLISION: Jogging was paused because the motion group neared a collision.
1564
+ - PAUSED_ON_IO: Jogging was paused because of an I/O event.
1565
+
1566
+ """
1567
+
1568
+ state: Annotated[
1569
+ Union[
1570
+ JoggingRunning,
1571
+ JoggingPausedByUser,
1572
+ JoggingPausedOnIO,
1573
+ JoggingPausedNearJointLimit,
1574
+ JoggingPausedNearCollision,
1575
+ ],
1576
+ Field(discriminator='kind'),
1577
+ ]
1578
+ kind: Literal['JOGGING'] = 'JOGGING'
1579
+
1580
+
1581
+ class Location(RootModel):
1582
+ root: float
1583
+ """
1584
+ Location on trajectory where the execution will start.
1585
+ The default value is the start (forward movement) or end (backward movement) of the trajectory.
1586
+ If you want to start your movement from an arbitrary location, e.g., in combination with [streamMoveToTrajectoryViaJointPTP](streamMoveToTrajectoryViaJointPTP),
1587
+ set the location by respecting the following format:
1588
+ - The location is a scalar value that defines a position along a path, typically ranging from 0 to `n`,
1589
+ where `n` denotes the number of motion commands
1590
+ - Each integer value of the location corresponds to a specific motion command,
1591
+ while non-integer values interpolate positions within the segments.
1592
+ - The location is calculated from the joint path
1593
+
1594
+ """
1595
+
1596
+
1597
+ class TrajectoryRunning(BaseModel):
1598
+ """
1599
+ Trajectory is being executed.
1600
+
1601
+ """
1602
+
1603
+ kind: Literal['RUNNING'] = 'RUNNING'
1604
+ time_to_end: Annotated[int, Field(ge=0, le=4294967295)]
1605
+ """
1606
+ Remaining time in milliseconds (ms) to reach the end of the motion.
1607
+ """
1608
+
1609
+
1610
+ class TrajectoryPausedByUser(BaseModel):
1611
+ """
1612
+ User has paused execution.
1613
+
1614
+ """
1615
+
1616
+ kind: Literal['PAUSED_BY_USER'] = 'PAUSED_BY_USER'
1617
+
1618
+
1619
+ class TrajectoryEnded(BaseModel):
1620
+ """
1621
+ First or last sample (depending on direction) of trajectory has been sent.
1622
+
1623
+ """
1624
+
1625
+ kind: Literal['END_OF_TRAJECTORY'] = 'END_OF_TRAJECTORY'
1626
+
1627
+
1628
+ class TrajectoryWaitForIO(BaseModel):
1629
+ """
1630
+ Waiting for an I/O event to start execution.
1631
+
1632
+ """
1633
+
1634
+ kind: Literal['WAIT_FOR_IO'] = 'WAIT_FOR_IO'
1635
+
1636
+
1637
+ class TrajectoryPausedOnIO(BaseModel):
1638
+ """
1639
+ Execution was paused because of an I/O event.
1640
+
1641
+ """
1642
+
1643
+ kind: Literal['PAUSED_ON_IO'] = 'PAUSED_ON_IO'
1644
+
1645
+
1646
+ class TrajectoryDetails(BaseModel):
1647
+ """
1648
+ State of trajectory execution.
1649
+ This state is sent during trajectory movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate.
1650
+ The trajectory state can be one of the following:
1651
+ - RUNNING: Trajectory is being executed.
1652
+ - PAUSED_BY_USER: User has paused execution.
1653
+ - END_OF_TRAJECTORY: First or last sample (depending on direction) of trajectory has been sent.
1654
+ - WAIT_FOR_IO: Waiting for an I/O event to start execution.
1655
+ - PAUSED_ON_IO: Execution was paused because of an I/O event.
1656
+
1657
+ """
1658
+
1659
+ trajectory: str
1660
+ """
1661
+ Unique identifier of the trajectory being executed.
1662
+
1663
+ """
1664
+ location: Location
1665
+ state: Annotated[
1666
+ Union[
1667
+ TrajectoryRunning,
1668
+ TrajectoryPausedByUser,
1669
+ TrajectoryEnded,
1670
+ TrajectoryWaitForIO,
1671
+ TrajectoryPausedOnIO,
1672
+ ],
1673
+ Field(discriminator='kind'),
1674
+ ]
1675
+ kind: Literal['TRAJECTORY'] = 'TRAJECTORY'
1676
+ """
1677
+ Discriminator for OpenApi generators, which is always "TRAJECTORY" for this schema.
1678
+
1679
+ """
1680
+
1681
+
1682
+ class Execute(BaseModel):
1683
+ """
1684
+ Details about the state of the motion execution.
1685
+ The details are either for a jogging or a trajectory.
1686
+ If NOVA is not controlling this motion group at the moment, this field is omitted.
1687
+
1688
+ """
1689
+
1690
+ joint_position: List[float]
1691
+ """
1692
+ Commanded joint position of each joint in [rad]. This command was sent in the time step the corresponding state was received.
1693
+
1694
+ """
1695
+ details: Annotated[
1696
+ Optional[Union[JoggingDetails, TrajectoryDetails]], Field(discriminator='kind')
1697
+ ] = None
1698
+
1699
+
1700
+ class MotionGroupState(BaseModel):
1701
+ """
1702
+ Presents the current state of the motion group.
1703
+ """
1704
+
1705
+ timestamp: AwareDatetime
1706
+ """
1707
+ Timestamp for when data was received from the robot controller.
1708
+ """
1709
+ sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
1710
+ """
1711
+ Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
1712
+ The sequence number is reset when the connection to the physical controller is closed and re-established.
1713
+
1714
+ """
1715
+ motion_group: str
1716
+ """
1717
+ Identifier of the motion group.
1718
+ """
1719
+ controller: str
1720
+ """
1721
+ Convenience: Identifier of the robot controller the motion group is attached to.
1722
+ """
1723
+ joint_position: Joints
1724
+ """
1725
+ Current joint position of each joint in [rad]
1726
+
1727
+ """
1728
+ joint_limit_reached: MotionGroupStateJointLimitReached
1729
+ """
1730
+ Indicates whether the joint is in a limit for all joints of the motion group.
1731
+
1732
+ """
1733
+ joint_torque: Optional[Joints] = None
1734
+ """
1735
+ Current joint torque of each joint in [Nm].
1736
+ Is only available if the robot controller supports it, e.g., available for UR controllers.
1737
+
1738
+ """
1739
+ joint_current: Optional[Joints] = None
1740
+ """
1741
+ Current at TCP in [A].
1742
+ Is only available if the robot controller supports it, e.g., available for UR controllers.
1743
+
1744
+ """
1745
+ flange_pose: Optional[Pose] = None
1746
+ """
1747
+ Pose of the flange.
1748
+ Positions are in [mm].
1749
+ Oriantations are in [rad].
1750
+ The pose is relative to the response_coordinate_system specified in the request.
1751
+ For robot arms a flange pose is always returned, for positioners the flange might not be available, depending on the model.
1752
+
1753
+ """
1754
+ tcp: Optional[str] = None
1755
+ """
1756
+ Unique identifier addressing the active TCP.
1757
+ Might not be returned for positioners as some do not support TCPs, depending on the model.
1758
+
1759
+ """
1760
+ tcp_pose: Optional[Pose] = None
1761
+ """
1762
+ Pose of the TCP selected on the robot control panel.
1763
+ Positions are in [mm].
1764
+ Oriantations are in [rad].
1765
+ The pose is relative to the response_coordinate_system specified in the request.
1766
+ Might not be returned for positioners as some do not support TCPs, depending on the model.
1767
+
1768
+ """
1769
+ coordinate_system: Optional[str] = None
1770
+ """
1771
+ Unique identifier addressing the reference coordinate system of the cartesian data.
1772
+ Might not be returned for positioners as some do not support TCPs, depending on the model.
1773
+ Default: world coordinate system of corresponding controller.
1774
+
1775
+ """
1776
+ payload: Optional[str] = None
1777
+ """
1778
+ Unique identifier addressing the active payload.
1779
+ Only fetchable via GET endpoint, not available in WebSocket.
1780
+
1781
+ """
1782
+ standstill: bool
1783
+ """
1784
+ Indicates whether the motion group is in standstill.
1785
+ Convenience: Signals that NOVA treats measured joint velocities as 0.
1786
+
1787
+ """
1788
+ execute: Optional[Execute] = None
1789
+ """
1790
+ Data that was commanded to the motion group. Includes additional data on NOVA's execution components for executing trajectories and jogging.
1791
+ This is a convenience field to indicate the last command sent to the motion group.
1792
+ It is not available in all cases, e.g., if the motion group is not moved by NOVA.
1793
+
1794
+ """
1795
+
1796
+
1797
+ class RobotControllerState(BaseModel):
1798
+ """
1799
+ Returns the whole current state of robot controller.
1800
+ """
1801
+
1802
+ mode: RobotSystemMode
1803
+ """
1804
+ Mode of communication and control between NOVA and the robot controller.
1805
+ """
1806
+ last_error: Optional[List[str]] = None
1807
+ """
1808
+ Last error stack encountered during initialization process or after a controller disconnect.
1809
+ At this stage, it's unclear whether the error is fatal.
1810
+
1811
+ Evaluate `last_error` to decide whether to remove the controller using `deleteController`.
1812
+ Examples:
1813
+ - Delete required: Host resolution fails repeatedly due to an incorrect IP.
1814
+ - Delete not required: Temporary network delay caused a disconnect; the system will auto-reconnect.
1815
+
1816
+ """
1817
+ timestamp: AwareDatetime
1818
+ """
1819
+ Timestamp indicating when the represented information was received from the robot controller.
1820
+ """
1821
+ sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
1822
+ """
1823
+ Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
1824
+ The sequence number is reset when the connection to the physical controller is closed and re-established.
1825
+
1826
+ """
1827
+ controller: str
1828
+ """
1829
+ Identifier of the configured robot controller.
1830
+ """
1831
+ operation_mode: OperationMode
1832
+ safety_state: SafetyStateType
1833
+ velocity_override: Annotated[Optional[int], Field(ge=1, le=100)] = None
1834
+ """
1835
+ If made available by the robot controller, returns the current velocity override in
1836
+ [percentage] for movements adjusted on robot control panel.
1837
+ Valid value range: 1 - 100.
1838
+
1839
+ """
1840
+ motion_groups: Annotated[List[MotionGroupState], Field(title='MotionGroupState[]')]
1841
+ """
1842
+ State of indicated motion groups.
1843
+ In case of state request via controller all configured motion groups are returned.
1844
+ In case of executing a motion only the affected motion groups are returned.
1845
+
1846
+ """
1847
+
1848
+
1849
+ class IODirection(Enum):
1850
+ """
1851
+ Identifies the input/output type.
1852
+ """
1853
+
1854
+ IO_TYPE_INPUT = 'IO_TYPE_INPUT'
1855
+ IO_TYPE_OUTPUT = 'IO_TYPE_OUTPUT'
1856
+
1857
+
1858
+ class IOValueType(Enum):
1859
+ """
1860
+ Data type of the input/output.
1861
+ """
1862
+
1863
+ IO_VALUE_BOOLEAN = 'IO_VALUE_BOOLEAN'
1864
+ IO_VALUE_ANALOG_FLOAT = 'IO_VALUE_ANALOG_FLOAT'
1865
+ IO_VALUE_ANALOG_INTEGER = 'IO_VALUE_ANALOG_INTEGER'
1866
+
1867
+
1868
+ class UnitType(Enum):
1869
+ """
1870
+ The unit of input/output value.
1871
+ """
1872
+
1873
+ UNIT_NONE = 'UNIT_NONE'
1874
+ UNIT_KILOGRAM = 'UNIT_KILOGRAM'
1875
+ UNIT_AMPERE = 'UNIT_AMPERE'
1876
+ UNIT_KELVIN = 'UNIT_KELVIN'
1877
+ UNIT_HERTZ = 'UNIT_HERTZ'
1878
+ UNIT_NEWTON = 'UNIT_NEWTON'
1879
+ UNIT_VOLT = 'UNIT_VOLT'
1880
+ UNIT_CELSIUS = 'UNIT_CELSIUS'
1881
+ UNIT_NEWTON_METER = 'UNIT_NEWTON_METER'
1882
+ UNIT_METER = 'UNIT_METER'
1883
+
1884
+
1885
+ class BooleanValue(BaseModel):
1886
+ """
1887
+ Value of a digital input/output.
1888
+
1889
+ """
1890
+
1891
+ value: bool
1892
+ value_type: Literal['boolean'] = 'boolean'
1893
+
1894
+
1895
+ class IntegerValue(BaseModel):
1896
+ """
1897
+ Value of an input/output with integer representation.
1898
+
1899
+ > The integral value is transmitted as a string to avoid precision loss during conversion to JSON.
1900
+ > Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers,
1901
+ > JS bigint libraries can help you to parse the string into an integral value.
1902
+
1903
+ """
1904
+
1905
+ value: str
1906
+ value_type: Literal['integer'] = 'integer'
1907
+
1908
+
1909
+ class FloatValue(BaseModel):
1910
+ value: float
1911
+ """
1912
+ Value of an analog input/output in floating number representation.
1913
+
1914
+ """
1915
+ value_type: Literal['float'] = 'float'
1916
+
1917
+
1918
+ class IOBoundary(RootModel):
1919
+ root: Annotated[
1920
+ Union[BooleanValue, IntegerValue, FloatValue],
1921
+ Field(discriminator='value_type', title='IOBoundary'),
1922
+ ]
1923
+
1924
+
1925
+ class IODescription(BaseModel):
1926
+ io: str
1927
+ """
1928
+ Unique identifier of the input/output.
1929
+
1930
+ """
1931
+ name: str
1932
+ """
1933
+ Name of the input/output. Customize it on the physical controller or in the virtual robot specification.
1934
+
1935
+ """
1936
+ group: Optional[str] = None
1937
+ """
1938
+ Name of the input/output group. Customize it on the physical controller or in the virtual robot specification.
1939
+
1940
+ """
1941
+ direction: IODirection
1942
+ value_type: IOValueType
1943
+ unit: Optional[UnitType] = None
1944
+ min: Optional[IOBoundary] = None
1945
+ max: Optional[IOBoundary] = None
1946
+
1947
+
1948
+ class ListIODescriptionsResponse(RootModel):
1949
+ root: List[IODescription]
1950
+
1951
+ def __getitem__(self, index: int) -> IODescription:
1952
+ """
1953
+ Make list RootModel directly indexable.
1954
+ """
1955
+ return self.root[index]
1956
+
1957
+ def __setitem__(self, index: int, value: IODescription) -> None:
1958
+ """
1959
+ Make list RootModel directly indexable.
1960
+ """
1961
+ self.root[index] = value
1962
+
1963
+ def __len__(self) -> int:
1964
+ """
1965
+ Make list RootModel directly usable with len().
1966
+ """
1967
+ return len(self.root)
1968
+
1969
+ def __iter__(self):
1970
+ """
1971
+ Make list RootModel directly iterable.
1972
+ """
1973
+ return iter(self.root)
1974
+
1975
+
1976
+ class IOBooleanValue(BaseModel):
1977
+ """
1978
+ Input/Output boolean value representation.
1979
+ """
1980
+
1981
+ io: str
1982
+ """
1983
+ Unique identifier of the input/output.
1984
+ """
1985
+ value: bool
1986
+ """
1987
+ Value of a digital input/output.
1988
+
1989
+ """
1990
+ value_type: Literal['boolean'] = 'boolean'
1991
+
1992
+
1993
+ class IOIntegerValue(BaseModel):
1994
+ io: str
1995
+ """
1996
+ Unique identifier of the input/output.
1997
+ """
1998
+ value: str
1999
+ """
2000
+ Value of an input/output with integer representation.
2001
+
2002
+ > The integral value is transmitted as a string to avoid precision loss during conversion to JSON.
2003
+ > Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers,
2004
+ > JS bigint libraries can help you to parse the string into an integral value.
2005
+
2006
+ """
2007
+ value_type: Literal['integer'] = 'integer'
2008
+
2009
+
2010
+ class IOFloatValue(BaseModel):
2011
+ io: str
2012
+ """
2013
+ Unique identifier of the input/output.
2014
+ """
2015
+ value: float
2016
+ """
2017
+ Value of an analog input/output in floating number representation.
2018
+
2019
+ """
2020
+ value_type: Literal['float'] = 'float'
2021
+
2022
+
2023
+ class IOValue(RootModel):
2024
+ root: Annotated[
2025
+ Union[IOBooleanValue, IOIntegerValue, IOFloatValue],
2026
+ Field(discriminator='value_type'),
2027
+ ]
2028
+
2029
+
2030
+ class StreamIOValuesResponse(BaseModel):
2031
+ """
2032
+ Array of input/output values.
2033
+ """
2034
+
2035
+ io_values: List[IOValue]
2036
+ timestamp: AwareDatetime
2037
+ """
2038
+ Timestamp indicating when the represented information was received from the robot controller.
2039
+ """
2040
+ sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
2041
+ """
2042
+ Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
2043
+ The sequence number is reset when the connection to the physical controller is closed and re-established.
2044
+
2045
+ """
2046
+
2047
+
2048
+ class ListIOValuesResponse(RootModel):
2049
+ """
2050
+ Array of input/output values.
2051
+ """
2052
+
2053
+ root: Annotated[
2054
+ List[IOValue],
2055
+ Field(
2056
+ examples=[
2057
+ {
2058
+ 'io_values': [
2059
+ {'io': 'io1', 'value': True, 'value_type': 'boolean'},
2060
+ {'io': 'io2', 'value': '42', 'value_type': 'integer'},
2061
+ {'io': 'io3', 'value': 3.14, 'value_type': 'float'},
2062
+ ]
2063
+ }
2064
+ ]
2065
+ ),
2066
+ ]
2067
+ """
2068
+ Array of input/output values.
2069
+ """
2070
+
2071
+ def __getitem__(self, index: int) -> IOValue:
2072
+ """
2073
+ Make list RootModel directly indexable.
2074
+ """
2075
+ return self.root[index]
2076
+
2077
+ def __setitem__(self, index: int, value: IOValue) -> None:
2078
+ """
2079
+ Make list RootModel directly indexable.
2080
+ """
2081
+ self.root[index] = value
2082
+
2083
+ def __len__(self) -> int:
2084
+ """
2085
+ Make list RootModel directly usable with len().
2086
+ """
2087
+ return len(self.root)
2088
+
2089
+ def __iter__(self):
2090
+ """
2091
+ Make list RootModel directly iterable.
2092
+ """
2093
+ return iter(self.root)
2094
+
2095
+
2096
+ class Comparator(Enum):
2097
+ """
2098
+ Comparator for the comparison of two values.
2099
+ The comparator is used to compare two values and return a boolean result.
2100
+ The default comparator is unknown.
2101
+
2102
+ """
2103
+
2104
+ COMPARATOR_EQUALS = 'COMPARATOR_EQUALS'
2105
+ COMPARATOR_NOT_EQUALS = 'COMPARATOR_NOT_EQUALS'
2106
+ COMPARATOR_GREATER = 'COMPARATOR_GREATER'
2107
+ COMPARATOR_GREATER_EQUAL = 'COMPARATOR_GREATER_EQUAL'
2108
+ COMPARATOR_LESS = 'COMPARATOR_LESS'
2109
+ COMPARATOR_LESS_EQUAL = 'COMPARATOR_LESS_EQUAL'
2110
+
2111
+
2112
+ class WaitForIOEventRequest(BaseModel):
2113
+ """
2114
+ The value to compare with the current value of the input/output.
2115
+ """
2116
+
2117
+ io: IOValue
2118
+ comparator: Comparator
2119
+ """
2120
+ Comparator for the comparison of two values.
2121
+ Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
2122
+
2123
+ """
2124
+
2125
+
2126
+ class SettableRobotSystemMode(Enum):
2127
+ ROBOT_SYSTEM_MODE_MONITOR = 'ROBOT_SYSTEM_MODE_MONITOR'
2128
+ ROBOT_SYSTEM_MODE_CONTROL = 'ROBOT_SYSTEM_MODE_CONTROL'
2129
+
2130
+
2131
+ class VirtualRobotConfiguration(BaseModel):
2132
+ name: str
2133
+ """
2134
+ Name of the configuration file generated by the unique identifier of the controller and a time stamp.
2135
+
2136
+ """
2137
+ content: str
2138
+ """
2139
+ Content of the configuration file. Copy & paste to the [addRobotController](addRobotController) configuration.json parameter.
2140
+
2141
+ """
2142
+
2143
+
2144
+ class OrientationType(Enum):
2145
+ """
2146
+ The type of rotation description that is used to specify the orientation.
2147
+
2148
+ **Rotation Vector notation**
2149
+
2150
+ * The rotation is represented using an axis-angle representation:
2151
+ > axis = Vector[0:2]
2152
+ > angle = |axis| in [rad]
2153
+ > axis.normalized * angle
2154
+
2155
+ **Quaternion notation**
2156
+
2157
+ * The rotation is represented using a unit quaternion: [x, y, z, w].
2158
+ * The vector part [x, y, z] is the imaginary part of the quaternion, and the scalar part [w] is the real part.
2159
+
2160
+ **Euler notation**
2161
+
2162
+ * *extrinsic* fixed external reference system
2163
+ * *intrinsic* reference system fixed to rotation body
2164
+ > angles = Vector[0:2] in [rad].
2165
+ * ZYX, ZXZ,...
2166
+ - mapping of the given angles values to the (either intrinsic
2167
+ or extrinsic) axes in the stated order.
2168
+ > Example ZYX: Z = Vector[0], Y = Vector[1], X = Vector[2].
2169
+
2170
+ """
2171
+
2172
+ ROTATION_VECTOR = 'ROTATION_VECTOR'
2173
+ QUATERNION = 'QUATERNION'
2174
+ EULER_ANGLES_INTRINSIC_ZXZ = 'EULER_ANGLES_INTRINSIC_ZXZ'
2175
+ EULER_ANGLES_INTRINSIC_XYX = 'EULER_ANGLES_INTRINSIC_XYX'
2176
+ EULER_ANGLES_INTRINSIC_YZY = 'EULER_ANGLES_INTRINSIC_YZY'
2177
+ EULER_ANGLES_INTRINSIC_ZYZ = 'EULER_ANGLES_INTRINSIC_ZYZ'
2178
+ EULER_ANGLES_INTRINSIC_XZX = 'EULER_ANGLES_INTRINSIC_XZX'
2179
+ EULER_ANGLES_INTRINSIC_YXY = 'EULER_ANGLES_INTRINSIC_YXY'
2180
+ EULER_ANGLES_INTRINSIC_XYZ = 'EULER_ANGLES_INTRINSIC_XYZ'
2181
+ EULER_ANGLES_INTRINSIC_YZX = 'EULER_ANGLES_INTRINSIC_YZX'
2182
+ EULER_ANGLES_INTRINSIC_ZXY = 'EULER_ANGLES_INTRINSIC_ZXY'
2183
+ EULER_ANGLES_INTRINSIC_XZY = 'EULER_ANGLES_INTRINSIC_XZY'
2184
+ EULER_ANGLES_INTRINSIC_ZYX = 'EULER_ANGLES_INTRINSIC_ZYX'
2185
+ EULER_ANGLES_INTRINSIC_YXZ = 'EULER_ANGLES_INTRINSIC_YXZ'
2186
+ EULER_ANGLES_EXTRINSIC_ZXZ = 'EULER_ANGLES_EXTRINSIC_ZXZ'
2187
+ EULER_ANGLES_EXTRINSIC_XYX = 'EULER_ANGLES_EXTRINSIC_XYX'
2188
+ EULER_ANGLES_EXTRINSIC_YZY = 'EULER_ANGLES_EXTRINSIC_YZY'
2189
+ EULER_ANGLES_EXTRINSIC_ZYZ = 'EULER_ANGLES_EXTRINSIC_ZYZ'
2190
+ EULER_ANGLES_EXTRINSIC_XZX = 'EULER_ANGLES_EXTRINSIC_XZX'
2191
+ EULER_ANGLES_EXTRINSIC_YXY = 'EULER_ANGLES_EXTRINSIC_YXY'
2192
+ EULER_ANGLES_EXTRINSIC_ZYX = 'EULER_ANGLES_EXTRINSIC_ZYX'
2193
+ EULER_ANGLES_EXTRINSIC_XZY = 'EULER_ANGLES_EXTRINSIC_XZY'
2194
+ EULER_ANGLES_EXTRINSIC_YXZ = 'EULER_ANGLES_EXTRINSIC_YXZ'
2195
+ EULER_ANGLES_EXTRINSIC_YZX = 'EULER_ANGLES_EXTRINSIC_YZX'
2196
+ EULER_ANGLES_EXTRINSIC_XYZ = 'EULER_ANGLES_EXTRINSIC_XYZ'
2197
+ EULER_ANGLES_EXTRINSIC_ZXY = 'EULER_ANGLES_EXTRINSIC_ZXY'
2198
+
2199
+
2200
+ class Orientation(RootModel):
2201
+ """
2202
+ Describes an orientation in 3D space.
2203
+ A tree-to-four-dimensional vector [x, y, z, w] with double precision.
2204
+
2205
+ """
2206
+
2207
+ root: Annotated[List[float], Field(max_length=4, min_length=3, title='Orientation')]
2208
+ """
2209
+ Describes an orientation in 3D space.
2210
+ A tree-to-four-dimensional vector [x, y, z, w] with double precision.
2211
+
2212
+ """
2213
+
2214
+ def __getitem__(self, index: int) -> float:
2215
+ """
2216
+ Make list RootModel directly indexable.
2217
+ """
2218
+ return self.root[index]
2219
+
2220
+ def __setitem__(self, index: int, value: float) -> None:
2221
+ """
2222
+ Make list RootModel directly indexable.
2223
+ """
2224
+ self.root[index] = value
2225
+
2226
+ def __len__(self) -> int:
2227
+ """
2228
+ Make list RootModel directly usable with len().
2229
+ """
2230
+ return len(self.root)
2231
+
2232
+ def __iter__(self):
2233
+ """
2234
+ Make list RootModel directly iterable.
2235
+ """
2236
+ return iter(self.root)
2237
+
2238
+
2239
+ class CoordinateSystemData(BaseModel):
2240
+ name: Optional[str] = None
2241
+ """
2242
+ Human readable name of this coordinate system.
2243
+ """
2244
+ reference_coordinate_system: Optional[str] = None
2245
+ """
2246
+ The identifier of the reference coordinate system. Empty if world is used.
2247
+ """
2248
+ position: Optional[Vector3d] = None
2249
+ orientation: Optional[Orientation] = None
2250
+ orientation_type: Optional[OrientationType] = 'ROTATION_VECTOR'
2251
+
2252
+
2253
+ class CoordinateSystem(CoordinateSystemData):
2254
+ coordinate_system: str
2255
+ """
2256
+ Unique identifier of the coordinate system.
2257
+ """
2258
+
2259
+
2260
+ class ListCoordinateSystemsResponse(RootModel):
2261
+ root: List[CoordinateSystem]
2262
+
2263
+ def __getitem__(self, index: int) -> CoordinateSystem:
2264
+ """
2265
+ Make list RootModel directly indexable.
2266
+ """
2267
+ return self.root[index]
2268
+
2269
+ def __setitem__(self, index: int, value: CoordinateSystem) -> None:
2270
+ """
2271
+ Make list RootModel directly indexable.
2272
+ """
2273
+ self.root[index] = value
2274
+
2275
+ def __len__(self) -> int:
2276
+ """
2277
+ Make list RootModel directly usable with len().
2278
+ """
2279
+ return len(self.root)
2280
+
2281
+ def __iter__(self):
2282
+ """
2283
+ Make list RootModel directly iterable.
2284
+ """
2285
+ return iter(self.root)
2286
+
2287
+
2288
+ class MotionGroupModel(RootModel):
2289
+ root: Annotated[str, Field(title='MotionGroupModel')]
2290
+ """
2291
+ String identifiying the model of a motion group.
2292
+ """
2293
+
2294
+
2295
+ class TcpOffset(BaseModel):
2296
+ name: str
2297
+ """
2298
+ A readable and changeable name for frontend visualization.
2299
+ """
2300
+ pose: Pose
2301
+
2302
+
2303
+ class ColliderDictionary(RootModel):
2304
+ """
2305
+ A collection of identifiable colliders.
2306
+ """
2307
+
2308
+ root: Dict[str, Collider]
2309
+
2310
+
2311
+ class LimitRange(BaseModel):
2312
+ """
2313
+ The upper_limit must be greater then the lower_limit.
2314
+ """
2315
+
2316
+ lower_limit: Optional[float] = None
2317
+ upper_limit: Optional[float] = None
2318
+
2319
+
2320
+ class JointLimits(BaseModel):
2321
+ position: Optional[LimitRange] = None
2322
+ velocity: Optional[float] = None
2323
+ acceleration: Optional[float] = None
2324
+ torque: Optional[float] = None
2325
+
2326
+
2327
+ class CartesianLimits(BaseModel):
2328
+ velocity: Optional[float] = None
2329
+ acceleration: Optional[float] = None
2330
+ orientation_velocity: Optional[float] = None
2331
+ orientation_acceleration: Optional[float] = None
2332
+
2333
+
2334
+ class LimitSet(BaseModel):
2335
+ joints: Optional[List[JointLimits]] = None
2336
+ tcp: Optional[CartesianLimits] = None
2337
+ elbow: Optional[CartesianLimits] = None
2338
+ flange: Optional[CartesianLimits] = None
2339
+ coupled_shoulder_elbow_joint: Optional[JointLimits] = None
2340
+
2341
+
2342
+ class OperationLimits(BaseModel):
2343
+ auto_limits: Optional[LimitSet] = None
2344
+ manual_limits: Optional[LimitSet] = None
2345
+ manual_t1_limits: Optional[LimitSet] = None
2346
+ manual_t2_limits: Optional[LimitSet] = None
2347
+
2348
+
2349
+ class Payload(BaseModel):
2350
+ name: str
2351
+ payload: float
2352
+ """
2353
+ Mass of payload in [kg].
2354
+ """
2355
+ center_of_mass: Optional[Vector3d] = None
2356
+ moment_of_inertia: Optional[Vector3d] = None
2357
+
2358
+
2359
+ class DHParameter(BaseModel):
2360
+ """
2361
+ A single set of DH parameters.
2362
+ """
2363
+
2364
+ alpha: Optional[float] = None
2365
+ """
2366
+ Angle about x-axis in [rad].
2367
+ """
2368
+ theta: Optional[float] = None
2369
+ """
2370
+ Angle about z-axis in [rad].
2371
+ """
2372
+ a: Optional[float] = None
2373
+ """
2374
+ Offset along x-axis in [mm].
2375
+ """
2376
+ d: Optional[float] = None
2377
+ """
2378
+ Offset along z-axis in [mm].
2379
+ """
2380
+ reverse_rotation_direction: Optional[bool] = None
2381
+ """
2382
+ True, if rotation direction of joint is reversed.
2383
+ """
2384
+
2385
+
2386
+ class MotionGroupDescription(BaseModel):
2387
+ """
2388
+ The configuration of a motion-group used for motion planning.
2389
+ """
2390
+
2391
+ motion_group_model: MotionGroupModel
2392
+ mounting: Optional[Pose] = None
2393
+ """
2394
+ The offset from the world frame to the motion group base.
2395
+ """
2396
+ tcps: Annotated[
2397
+ Optional[Dict[str, TcpOffset]], Field(title='TcpOffsetDictionary')
2398
+ ] = None
2399
+ """
2400
+ Maps a TCP name to its offset relative to the flange coordinate system. Key must be a TCP identifier.
2401
+ Values are TcpOffsets.
2402
+
2403
+ """
2404
+ safety_zones: Optional[ColliderDictionary] = None
2405
+ """
2406
+ SafetyZones are areas which cannot be entered or where certain limits apply.
2407
+ """
2408
+ safety_link_colliders: Optional[List[ColliderDictionary]] = None
2409
+ """
2410
+ The shape of the MotionGroups links to validate against safety zones.
2411
+ Indexed along the kinematic chain, starting with a static base shape before first joint.
2412
+
2413
+ """
2414
+ safety_tool_colliders: Annotated[
2415
+ Optional[Dict[str, ColliderDictionary]], Field(title='SafetyToolColliders')
2416
+ ] = None
2417
+ """
2418
+ Maps a TCP name to its tool collider. Key must be a TCP identifier.
2419
+ Values are ColliderDictionaries that make up the shape of one tool to validate against safety zones.
2420
+
2421
+ """
2422
+ operation_limits: OperationLimits
2423
+ payloads: Annotated[
2424
+ Optional[Dict[str, Payload]], Field(title='PayloadDictionary')
2425
+ ] = None
2426
+ """
2427
+ Maps a payload name to its configuration. Key must be a payload identifier.
2428
+ Values are payload objects.
2429
+
2430
+ """
2431
+ cycle_time: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
2432
+ """
2433
+ [ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.
2434
+ """
2435
+ dh_parameters: Optional[List[DHParameter]] = None
2436
+ """
2437
+ The DH parameters describing the motion group geometry, starting from base.
2438
+ """
2439
+
2440
+
2441
+ class Tool(RootModel):
2442
+ """
2443
+ Defines the shape of a tool.
2444
+
2445
+ A tool is a dictionary of colliders.
2446
+
2447
+ All colliders that make up a tool are attached to the flange frame of the motion group.
2448
+
2449
+ """
2450
+
2451
+ root: Dict[str, Collider]
2452
+
2453
+
2454
+ class CollisionSetup(BaseModel):
2455
+ colliders: Optional[ColliderDictionary] = None
2456
+ """
2457
+ Colliders are checked against links and tool.
2458
+
2459
+ """
2460
+ link_chain: Optional[LinkChain] = None
2461
+ """
2462
+ The shape of the motion groups links to validate against colliders.
2463
+ Indexed along the kinematic chain, starting with a static base shape before first joint.
2464
+ The base of the motion group is not checked for collision against the environment.
2465
+
2466
+ """
2467
+ tool: Optional[Tool] = None
2468
+ """
2469
+ Shape of the tool to validate against colliders.
2470
+
2471
+ """
2472
+ self_collision_detection: Optional[bool] = True
2473
+ """
2474
+ If true, self-collision detection is enabled for the motion group.
2475
+
2476
+ Self-collision detection checks if links in the kinematic chain of the motion group collide with each other.
2477
+ Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
2478
+ The tool is treated like a link at the end of the kinematic chain. It is checked against all links except the last one.
2479
+
2480
+ Default is true.
2481
+
2482
+ """
2483
+
2484
+
2485
+ class CollisionSetups(RootModel):
2486
+ """
2487
+ Collision layers to be respected by the motion planner when planning for a single motion group.
2488
+ Each setup represents one layer, e.g., the safety zones and shapes or a fine grained tool and workpiece model.
2489
+ Layers are checked individually along the trajectory and independently of other layers.
2490
+
2491
+ To respect the safety zones of the controller and check for collision:
2492
+ 1. Fetch the safety zones, link and tool shapes from the controller.
2493
+ 2. Add the fetched zones, links and tools to a layer.
2494
+ 3. Create other layers from your own 3D data as needed.
2495
+ 4. Plan trajectory.
2496
+ 5. The response highlights the layer in which a collision was detected by key.
2497
+
2498
+ """
2499
+
2500
+ root: Dict[str, CollisionSetup]
2501
+
2502
+
2503
+ class MotionGroupSetup(BaseModel):
2504
+ motion_group_model: MotionGroupModel
2505
+ cycle_time: Annotated[int, Field(ge=0, le=2147483647)]
2506
+ """
2507
+ [ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.
2508
+ """
2509
+ mounting: Optional[Pose] = None
2510
+ """
2511
+ The offset from the world frame to the motion group base.
2512
+ """
2513
+ tcp_offset: Optional[Pose] = None
2514
+ global_limits: Optional[LimitSet] = None
2515
+ payload: Optional[Payload] = None
2516
+ collision_setups: Optional[CollisionSetups] = None
2517
+
2518
+
2519
+ class DoubleArray(RootModel):
2520
+ root: List[float]
2521
+
2522
+ def __getitem__(self, index: int) -> float:
2523
+ """
2524
+ Make list RootModel directly indexable.
2525
+ """
2526
+ return self.root[index]
2527
+
2528
+ def __setitem__(self, index: int, value: float) -> None:
2529
+ """
2530
+ Make list RootModel directly indexable.
2531
+ """
2532
+ self.root[index] = value
2533
+
2534
+ def __len__(self) -> int:
2535
+ """
2536
+ Make list RootModel directly usable with len().
2537
+ """
2538
+ return len(self.root)
2539
+
2540
+ def __iter__(self):
2541
+ """
2542
+ Make list RootModel directly iterable.
2543
+ """
2544
+ return iter(self.root)
2545
+
2546
+
2547
+ class BlendingAuto(BaseModel):
2548
+ min_velocity_in_percent: Annotated[Optional[int], Field(ge=0, le=100)] = None
2549
+ """
2550
+ Auto-blending is used to keep a constant velocity when blending between two motion commands.
2551
+ It changes the TCP path around the target point of the motion command.
2552
+ The value represents the percentage of the original velocity.
2553
+
2554
+ """
2555
+ blending_name: Literal['BlendingAuto'] = 'BlendingAuto'
2556
+
2557
+
2558
+ class BlendingPosition(BaseModel):
2559
+ position_zone_radius: Optional[float] = None
2560
+ """
2561
+ Specifies the maximum radius in [mm] around the motion command's target point
2562
+ where the TCP path can be altered to blend the motion command into the following one.
2563
+ If auto-blending blends too much of the resulting trajectory, use position-blending to restrict the blending zone radius.
2564
+
2565
+ """
2566
+ blending_name: Literal['BlendingPosition'] = 'BlendingPosition'
2567
+
2568
+
2569
+ class LimitsOverride(BaseModel):
2570
+ """
2571
+ If a limit is not set, the default value will be used.
2572
+
2573
+ """
2574
+
2575
+ joint_velocity_limits: Optional[List[float]] = None
2576
+ """
2577
+ Maximum joint velocity in [rad/s] for each joint.
2578
+ Either leave this field empty or set a value for each joint.
2579
+
2580
+ """
2581
+ joint_acceleration_limits: Optional[List[float]] = None
2582
+ """
2583
+ Maximum joint acceleration in [rad/s^2] for each joint.
2584
+ Either leave this field empty or set a value for each joint.
2585
+
2586
+ """
2587
+ tcp_velocity_limit: Optional[float] = None
2588
+ """
2589
+ Maximum allowed TCP velocity in [mm/s].
2590
+
2591
+ """
2592
+ tcp_acceleration_limit: Optional[float] = None
2593
+ """
2594
+ Maximum allowed TCP acceleration in [mm/s^2].
2595
+
2596
+ """
2597
+ tcp_orientation_velocity_limit: Optional[float] = None
2598
+ """
2599
+ Maximum allowed TCP rotation velocity in [rad/s].
2600
+
2601
+ """
2602
+ tcp_orientation_acceleration_limit: Optional[float] = None
2603
+ """
2604
+ Maximum allowed TCP rotation acceleration in [rad/s^2].
2605
+
2606
+ """
2607
+
2608
+
2609
+ class PathCartesianPTP(BaseModel):
2610
+ """
2611
+ A cartesian point-to-point is representing a joint point-to-point motion from start point to the indicated target pose.
2612
+ The target pose is a joint point-to-point given in cartesian space. The target joint configuration will be calculated
2613
+ to be in the same kinematic configuration as the start point is. If that is not possible, planning will fail.
2614
+
2615
+ """
2616
+
2617
+ target_pose: Pose
2618
+ path_definition_name: Literal['PathCartesianPTP'] = 'PathCartesianPTP'
2619
+
2620
+
2621
+ class CubicSplineParameter(BaseModel):
2622
+ pose: Pose
2623
+ path_parameter: float
2624
+
2625
+
2626
+ class PathCubicSpline(BaseModel):
2627
+ """
2628
+ A [cubic spline](https://de.wikipedia.org/wiki/Spline-Interpolation) represents a cartesian cubic spline
2629
+ in translative and orientational space from start point to indicated target pose via control points.
2630
+
2631
+ """
2632
+
2633
+ parameters: List[CubicSplineParameter]
2634
+ path_definition_name: Literal['PathCubicSpline'] = 'PathCubicSpline'
2635
+
2636
+
2637
+ class PathLine(BaseModel):
2638
+ """
2639
+ A line represents a straight line from start position to indicated target position.
2640
+ The orientation is calculated via a quaternion [slerp](https://en.wikipedia.org/wiki/Slerp) from start orientation to indicated target orientation.
2641
+
2642
+ """
2643
+
2644
+ target_pose: Pose
2645
+ path_definition_name: Literal['PathLine'] = 'PathLine'
2646
+
2647
+
2648
+ class PathCircle(BaseModel):
2649
+ """
2650
+ A circular constructs a circle in translative space from 1) the start position which is provided via position, and 2) the indicated target position.
2651
+ The orientation is calculated via a [bezier spline](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) from start orientation to the indicated target orientation.
2652
+ The via point defines the control point for the bezier spline.
2653
+ Therefore, the control point will not be hit directly.
2654
+
2655
+ """
2656
+
2657
+ via_pose: Pose
2658
+ target_pose: Pose
2659
+ path_definition_name: Literal['PathCircle'] = 'PathCircle'
2660
+
2661
+
2662
+ class PathJointPTP(BaseModel):
2663
+ """
2664
+ A joint point-to-point represents a line in joint space. All joints will be moved synchronously.
2665
+
2666
+ """
2667
+
2668
+ target_joint_position: DoubleArray
2669
+ path_definition_name: Literal['PathJointPTP'] = 'PathJointPTP'
2670
+
2671
+
2672
+ class MotionCommand(BaseModel):
2673
+ blending: Annotated[
2674
+ Optional[Union[BlendingAuto, BlendingPosition]],
2675
+ Field(discriminator='blending_name'),
2676
+ ] = None
2677
+ """
2678
+ Blending alters the TCP path at the target point of a motion command
2679
+ to ensure that the velocity does not drop to zero between two motion commands.
2680
+
2681
+ """
2682
+ limits_override: Optional[LimitsOverride] = None
2683
+ """
2684
+ Limits override is used to override the global limits of the motion group for this segment of the motion.
2685
+
2686
+ """
2687
+ path: Annotated[
2688
+ Union[PathCartesianPTP, PathCubicSpline, PathLine, PathCircle, PathJointPTP],
2689
+ Field(discriminator='path_definition_name'),
2690
+ ]
2691
+
2692
+
2693
+ class PlanTrajectoryRequest(BaseModel):
2694
+ motion_group_setup: MotionGroupSetup
2695
+ """
2696
+ The data to assemble the robot setup can be retrieved from [getMotionGroupDescription](getMotionGroupDescription) endpoint.
2697
+ """
2698
+ start_joint_position: DoubleArray
2699
+ """
2700
+ To define a motion the start joints have to be indicated.
2701
+ Cartesian movements will be in the same kinematic configuration as the start joint position until the first joint point-to-point motion.
2702
+ Motions can only be executed if the start joint position is the current joint position of the motion group.
2703
+ To retrieve the current joint position use the endpoint [getCurrentMotionGroupState](getCurrentMotionGroupState).
2704
+ To move the robot to the start joint position use the endpoint [streamMoveToTrajectoryViaJointP2P](streamMoveToTrajectoryViaJointP2P).
2705
+
2706
+ """
2707
+ motion_commands: List[MotionCommand]
2708
+ """
2709
+ List of motion commands. A command consists of a path definition (line, circle, joint_ptp, cartesian_ptp, cubic_spline), blending, and limits override.
2710
+
2711
+ """
2712
+
2713
+
2714
+ class JointTrajectory(BaseModel):
2715
+ joint_positions: List[Joints]
2716
+ """
2717
+ List of joint positions [rad] for each sample.
2718
+ The number of samples must match the number of timestamps provided in the times field.
2719
+
2720
+ """
2721
+ times: List[float]
2722
+ """
2723
+ Timestamp for each sample [s].
2724
+ """
2725
+ locations: List[Location]
2726
+
2727
+
2728
+ class FeedbackOutOfWorkspace(BaseModel):
2729
+ """
2730
+ Requested TCP pose is outside of motion group's workspace.
2731
+ """
2732
+
2733
+ invalid_tcp_pose: Optional[Pose] = None
2734
+ error_feedback_name: Literal['FeedbackOutOfWorkspace'] = 'FeedbackOutOfWorkspace'
2735
+
2736
+
2737
+ class SingularityTypeEnum(Enum):
2738
+ WRIST = 'WRIST'
2739
+ ELBOW = 'ELBOW'
2740
+ SHOULDER = 'SHOULDER'
2741
+
2742
+
2743
+ class FeedbackSingularity(BaseModel):
2744
+ """
2745
+ A singularity is a point in the robot's workspace where the robot loses one or more degrees of freedom with regards to moving its TCP.
2746
+ This means the robot cannot move or rotate the TCP in a certain direction from this specific point.
2747
+
2748
+ Use PTP motions if possible. They will almost never fail due to singularities (only if the target point is at a singularity).
2749
+
2750
+ Alternatively change the robot TCP's path to avoid moving through this point or try to move the TCP through this point in a different direction.
2751
+
2752
+ """
2753
+
2754
+ singularity_type: Optional[SingularityTypeEnum] = None
2755
+ singular_joint_position: Optional[DoubleArray] = None
2756
+ error_feedback_name: Literal['FeedbackSingularity'] = 'FeedbackSingularity'
2757
+
2758
+
2759
+ class FeedbackJointLimitExceeded(BaseModel):
2760
+ """
2761
+ This error is returned when a joint position limit is exceeded.
2762
+ The joint index denotes which joint is out of its limits, starting with 1 and followed by the full joint position.
2763
+
2764
+ """
2765
+
2766
+ joint_index: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
2767
+ joint_position: Optional[DoubleArray] = None
2768
+ error_feedback_name: Literal['FeedbackJointLimitExceeded'] = (
2769
+ 'FeedbackJointLimitExceeded'
2770
+ )
2771
+
2772
+
2773
+ class CollisionContact(BaseModel):
2774
+ local: Optional[Vector3d] = None
2775
+ root: Optional[Vector3d] = None
2776
+
2777
+
2778
+ class Collision(BaseModel):
2779
+ id_of_a: Optional[str] = None
2780
+ id_of_b: Optional[str] = None
2781
+ id_of_layer: Optional[str] = None
2782
+ normal_root_on_b: Optional[Vector3d] = None
2783
+ position_on_a: Optional[CollisionContact] = None
2784
+ position_on_b: Optional[CollisionContact] = None
2785
+
2786
+
2787
+ class FeedbackCollision(BaseModel):
2788
+ collisions: Optional[List[Collision]] = None
2789
+ joint_position: Optional[DoubleArray] = None
2790
+ tcp_pose: Optional[Pose] = None
2791
+ error_feedback_name: Literal['FeedbackCollision'] = 'FeedbackCollision'
2792
+
2793
+
2794
+ class PlanTrajectoryFailedResponse(BaseModel):
2795
+ error_feedback: Annotated[
2796
+ Union[
2797
+ FeedbackOutOfWorkspace,
2798
+ FeedbackSingularity,
2799
+ FeedbackJointLimitExceeded,
2800
+ FeedbackCollision,
2801
+ ],
2802
+ Field(discriminator='error_feedback_name'),
2803
+ ]
2804
+ error_location_on_trajectory: Location
2805
+ joint_trajectory: Optional[JointTrajectory] = None
2806
+ """
2807
+ The joint trajectory from the start joint position to the error.
2808
+
2809
+ """
2810
+
2811
+
2812
+ class PlanTrajectoryResponse(BaseModel):
2813
+ response: Union[JointTrajectory, PlanTrajectoryFailedResponse]
2814
+
2815
+
2816
+ class ValidationError(BaseModel):
2817
+ loc: Annotated[List[Union[str, int]], Field(title='Location')]
2818
+ msg: Annotated[str, Field(title='Message')]
2819
+ type: Annotated[str, Field(title='Error Type')]
2820
+ input: Dict[str, Any]
2821
+
2822
+
2823
+ class ErrorInvalidJointCount(BaseModel):
2824
+ """
2825
+ The provided joint data does not match the expected number of joints
2826
+ for this motion group.
2827
+
2828
+ """
2829
+
2830
+ expected_joint_count: int
2831
+ """
2832
+ The expected number of joints for this motion group.
2833
+
2834
+ """
2835
+ provided_joint_count: int
2836
+ """
2837
+ The number of provided joints.
2838
+
2839
+ """
2840
+ error_feedback_name: Literal['ErrorInvalidJointCount'] = 'ErrorInvalidJointCount'
2841
+
2842
+
2843
+ class ErrorJointLimitExceeded(BaseModel):
2844
+ """
2845
+ A reference joint position (start or target) exceeds the configured joint limits.
2846
+
2847
+ """
2848
+
2849
+ joint_index: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
2850
+ """
2851
+ Index of the joint exceeding its limits (0-based).
2852
+
2853
+ """
2854
+ joint_position: Optional[DoubleArray] = None
2855
+ """
2856
+ The joint position violating the limits.
2857
+
2858
+ """
2859
+ error_feedback_name: Literal['ErrorJointLimitExceeded'] = 'ErrorJointLimitExceeded'
2860
+
2861
+
2862
+ class ErrorJointPositionCollision(BaseModel):
2863
+ """
2864
+ A reference joint position, e.g., start or target joint position, results in collisions that prevent processing.
2865
+
2866
+ """
2867
+
2868
+ collisions: Optional[List[Collision]] = None
2869
+ joint_position: Optional[DoubleArray] = None
2870
+ """
2871
+ The joint position that collides.
2872
+
2873
+ """
2874
+ error_feedback_name: Literal['ErrorJointPositionCollision'] = (
2875
+ 'ErrorJointPositionCollision'
2876
+ )
2877
+
2878
+
2879
+ class PlanValidationError(ValidationError):
2880
+ data: Annotated[
2881
+ Optional[
2882
+ Union[
2883
+ ErrorInvalidJointCount,
2884
+ ErrorJointLimitExceeded,
2885
+ ErrorJointPositionCollision,
2886
+ ]
2887
+ ],
2888
+ Field(discriminator='error_feedback_name'),
2889
+ ] = None
2890
+ """
2891
+ Optional data further specifying the validation error.
2892
+
2893
+ """
2894
+
2895
+
2896
+ class Plan422Response(BaseModel):
2897
+ detail: Annotated[Optional[List[PlanValidationError]], Field(title='Detail')] = None
2898
+
2899
+
2900
+ class RRTConnectAlgorithm(BaseModel):
2901
+ algorithm_name: Literal['RRTConnectAlgorithm'] = 'RRTConnectAlgorithm'
2902
+ """
2903
+ Algorithm discriminator.
2904
+
2905
+ RRT Connect algorithm configuration for collision-free path planning.
2906
+ Rapidly-exploring Random Trees (RRT) builds trees of valid configurations by randomly sampling
2907
+ the joint space and connecting feasible points with JointPTP motions.
2908
+ RRT Connect grows two trees simultaneously from start and target positions until they meet.
2909
+ This is a custom implementation optimized for manipulator kinematics and collision checking in industrial contexts.
2910
+
2911
+ """
2912
+ max_iterations: Annotated[Optional[int], Field(ge=1)] = 10000
2913
+ """
2914
+ Maximum number of iterations for the RRT Connect algorithm.
2915
+ Higher values increase likelihood of success, but also computation time.
2916
+
2917
+ """
2918
+ max_step_size: Optional[float] = 1
2919
+ """
2920
+ Maximum step size for tree extension in joint space.
2921
+ """
2922
+ adaptive_step_size: Optional[bool] = True
2923
+ """
2924
+ Adjust the maximum step size during the search based on the recent success rate of tree expansion.
2925
+ """
2926
+ apply_smoothing: Optional[bool] = True
2927
+ """
2928
+ Apply smoothing after the search has succeeded. This will remove as many intermediate points as possible while keeping the path valid.
2929
+ """
2930
+ apply_blending: Optional[bool] = True
2931
+ """
2932
+ Apply blending after the search has succeeded and smoothing has been applied. This will apply the largest viable blending at each intermediate point.
2933
+ """
2934
+
2935
+
2936
+ class MidpointInsertionAlgorithm(BaseModel):
2937
+ algorithm_name: Literal['MidpointInsertionAlgorithm'] = 'MidpointInsertionAlgorithm'
2938
+ """
2939
+ Algorithm discriminator.
2940
+
2941
+ Midpoint insertion algorithm configuration for collision-free path planning.
2942
+ This algorithm adds a single midpoint between the start and target joint position to find collision-free paths.
2943
+
2944
+ """
2945
+ max_iterations: Annotated[Optional[int], Field(ge=1)] = 1000
2946
+ """
2947
+ Maximum number of iterations for the midpoint insertion algorithm.
2948
+ Higher values increase likelyhood of success, but also computation time (linear).
2949
+
2950
+ """
2951
+
2952
+
2953
+ class CollisionFreeAlgorithm(RootModel):
2954
+ root: Annotated[
2955
+ Union[RRTConnectAlgorithm, MidpointInsertionAlgorithm],
2956
+ Field(discriminator='algorithm_name', title='CollisionFreeAlgorithm'),
2957
+ ]
2958
+ """
2959
+ Configuration for collision-free path planning algorithms.
2960
+ Different algorithms may have different parameters and behavior.
2961
+
2962
+ """
2963
+
2964
+
2965
+ class PlanCollisionFreeRequest(BaseModel):
2966
+ motion_group_setup: MotionGroupSetup
2967
+ """
2968
+ The data to assemble the robot setup can be retrieved from [getMotionGroupDescription](getMotionGroupDescription) endpoint.
2969
+ """
2970
+ start_joint_position: DoubleArray
2971
+ """
2972
+ Starting joint position for the collision-free motion.
2973
+ Must contain exactly the same number of values as joints in the motion group.
2974
+ To retrieve the current joint position use the endpoint [getCurrentMotionGroupState](getCurrentMotionGroupState).
2975
+
2976
+ Recommendations:
2977
+ - For **cells with many obstacles**, use the RRTConnect algorithm. Recommended for most cases. Use it as a starting point.
2978
+ - For **simple cells with few obstacles** and when a faster solution is needed, try the MidpointInsertion algorithm.
2979
+
2980
+ """
2981
+ target: DoubleArray
2982
+ """
2983
+ The target joint position of the motion.
2984
+ Must contain exactly the same number of values as joints in the motion group.
2985
+ To compute target joint position from a TCP pose use the endpoint [inverseKinematics](inverseKinematics).
2986
+
2987
+ """
2988
+ algorithm: CollisionFreeAlgorithm
2989
+
2990
+
2991
+ class ErrorMaxIterationsExceeded(BaseModel):
2992
+ """
2993
+ The collision-free planning algorithm reached its maximum iteration limit
2994
+ without finding a valid path. Increase max_iterations or
2995
+ modify the start/target positions.
2996
+
2997
+ """
2998
+
2999
+ max_iterations: Optional[int] = None
3000
+ """
3001
+ The maximum number of iterations that was reached.
3002
+
3003
+ """
3004
+ error_feedback_name: Literal['ErrorMaxIterationsExceeded'] = (
3005
+ 'ErrorMaxIterationsExceeded'
3006
+ )
3007
+
3008
+
3009
+ class PlanCollisionFreeFailedResponse(BaseModel):
3010
+ """
3011
+ Response when collision-free trajectory planning fails.
3012
+ Contains specific feedback about why the planning failed.
3013
+
3014
+ """
3015
+
3016
+ error_feedback: ErrorMaxIterationsExceeded
3017
+
3018
+
3019
+ class PlanCollisionFreeResponse(BaseModel):
3020
+ """
3021
+ Response from collision-free trajectory planning.
3022
+ Contains either a successful joint trajectory or failure information.
3023
+
3024
+ """
3025
+
3026
+ response: Union[JointTrajectory, PlanCollisionFreeFailedResponse]
3027
+
3028
+
3029
+ class JointPositionLimits(RootModel):
3030
+ """
3031
+ Joint position limits in [rad], indexed starting from base.
3032
+
3033
+ """
3034
+
3035
+ root: Annotated[List[LimitRange], Field(title='JointPositionLimits')]
3036
+ """
3037
+ Joint position limits in [rad], indexed starting from base.
3038
+
3039
+ """
3040
+
3041
+ def __getitem__(self, index: int) -> LimitRange:
3042
+ """
3043
+ Make list RootModel directly indexable.
3044
+ """
3045
+ return self.root[index]
3046
+
3047
+ def __setitem__(self, index: int, value: LimitRange) -> None:
3048
+ """
3049
+ Make list RootModel directly indexable.
3050
+ """
3051
+ self.root[index] = value
3052
+
3053
+ def __len__(self) -> int:
3054
+ """
3055
+ Make list RootModel directly usable with len().
3056
+ """
3057
+ return len(self.root)
3058
+
3059
+ def __iter__(self):
3060
+ """
3061
+ Make list RootModel directly iterable.
3062
+ """
3063
+ return iter(self.root)
3064
+
3065
+
3066
+ class InverseKinematicsRequest(BaseModel):
3067
+ motion_group_model: MotionGroupModel
3068
+ tcp_poses: List[Pose]
3069
+ """
3070
+ List of TCP poses for which the inverse solutions are computed.
3071
+
3072
+ """
3073
+ tcp_offset: Optional[Pose] = None
3074
+ mounting: Optional[Pose] = None
3075
+ """
3076
+ Offset from the world frame to the motion group base.
3077
+ """
3078
+ joint_position_limits: Optional[JointPositionLimits] = None
3079
+ collision_setups: Optional[CollisionSetups] = None
3080
+
3081
+
3082
+ class InverseKinematicsResponse(BaseModel):
3083
+ joints: List[List[DoubleArray]]
3084
+
3085
+
3086
+ class InverseKinematicsValidationError(ValidationError):
3087
+ data: Annotated[
3088
+ Optional[Union[ErrorInvalidJointCount, ErrorJointLimitExceeded]],
3089
+ Field(discriminator='error_feedback_name'),
3090
+ ] = None
3091
+ """
3092
+ Optional data further specifying the validation error.
3093
+
3094
+ """
3095
+
3096
+
3097
+ class InverseKinematics422Response(BaseModel):
3098
+ detail: Annotated[
3099
+ Optional[List[InverseKinematicsValidationError]], Field(title='Detail')
3100
+ ] = None
3101
+
3102
+
3103
+ class ForwardKinematicsRequest(BaseModel):
3104
+ motion_group_model: MotionGroupModel
3105
+ joint_positions: List[DoubleArray]
3106
+ """
3107
+ List of joint positions [rad] for which TCP poses are computed.
3108
+
3109
+ """
3110
+ tcp_offset: Optional[Pose] = None
3111
+ mounting: Optional[Pose] = None
3112
+ """
3113
+ Offset from the world frame to the motion group base.
3114
+ """
3115
+
3116
+
3117
+ class ForwardKinematicsResponse(BaseModel):
3118
+ tcp_poses: List[Pose]
3119
+ """
3120
+ List of computed TCP poses corresponding to the input joint positions.
3121
+
3122
+ """
3123
+
3124
+
3125
+ class ForwardKinematicsValidationError(ValidationError):
3126
+ data: Optional[ErrorInvalidJointCount] = None
3127
+
3128
+
3129
+ class ForwardKinematics422Response(BaseModel):
3130
+ detail: Annotated[
3131
+ Optional[List[ForwardKinematicsValidationError]], Field(title='Detail')
3132
+ ] = None
3133
+
3134
+
3135
+ class ListTrajectoriesResponse(BaseModel):
3136
+ trajectories: Optional[List[str]] = None
3137
+ """
3138
+ Identifiers of trajectories which are currently cached.
3139
+ Use [addTrajectory](addTrajectory) to add a new trajectory. Adding trajectories is necessary to execute them.
3140
+ Trajectories are removed if the corresponding motion group or controller disconnects.
3141
+
3142
+ """
3143
+
3144
+
3145
+ class AddTrajectoryRequest(BaseModel):
3146
+ motion_group: str
3147
+ """
3148
+ Unique identifier of the motion group the trajectory is planned for.
3149
+ """
3150
+ trajectory: JointTrajectory
3151
+ """
3152
+ The trajectory consisting of a list of joint positions and
3153
+ an equal number of corresponding timestamps.
3154
+
3155
+ """
3156
+ tcp: Optional[str] = None
3157
+ """
3158
+ Unique identifier of the tool the trajectory is planned for.
3159
+ """
3160
+
3161
+
3162
+ class TcpRequiredError(BaseModel):
3163
+ """
3164
+ Requested motion group requires TCP to be defined.
3165
+ """
3166
+
3167
+ tcp_missing: Optional[Dict[str, Any]] = None
3168
+
3169
+
3170
+ class InconsistentTrajectorySize(BaseModel):
3171
+ joint_position_size: Optional[int] = None
3172
+ times_size: Optional[int] = None
3173
+ locations_size: Optional[int] = None
3174
+
3175
+
3176
+ class InconsistentTrajectorySizeError(BaseModel):
3177
+ """
3178
+ Indicates that the trajectory contains an inconsistent number of joint positions, times, or locations.
3179
+
3180
+ """
3181
+
3182
+ inconsistent_trajectory_size: Optional[InconsistentTrajectorySize] = None
3183
+
3184
+
3185
+ class JointLimitExceededError(BaseModel):
3186
+ joint_limit_exceeded: Optional[FeedbackJointLimitExceeded] = None
3187
+
3188
+
3189
+ class CollisionError(BaseModel):
3190
+ collision: Optional[FeedbackCollision] = None
3191
+
3192
+
3193
+ class TorqueExceeded(BaseModel):
3194
+ torque_value: Optional[float] = None
3195
+ """
3196
+ The torque value that was exceeded.
3197
+
3198
+ """
3199
+ torque_limit: Optional[float] = None
3200
+ """
3201
+ The value of the torque limit that was exceeded.
3202
+
3203
+ """
3204
+
3205
+
3206
+ class TorqueExceededError(BaseModel):
3207
+ torque_exceeded: Optional[TorqueExceeded] = None
3208
+
3209
+
3210
+ class InvalidDof(BaseModel):
3211
+ valid_dof: Optional[int] = None
3212
+ """
3213
+ The valid degrees of freedom for the motion group.
3214
+
3215
+ """
3216
+ joint_position: Optional[List[float]] = None
3217
+ """
3218
+ The joint position that is out of its limits.
3219
+ """
3220
+
3221
+
3222
+ class InvalidDofError(BaseModel):
3223
+ invalid_dof: Optional[InvalidDof] = None
3224
+
3225
+
3226
+ class NanValue(BaseModel):
3227
+ """
3228
+ Requested joint position contains NaN values.
3229
+ """
3230
+
3231
+ joint_position: Optional[List[float]] = None
3232
+ """
3233
+ The joint position that is out of its limits.
3234
+ """
3235
+
3236
+
3237
+ class NanValueError(BaseModel):
3238
+ nan_value: Optional[NanValue] = None
3239
+ """
3240
+ Requested joint position contains NaN values.
3241
+ """
3242
+
3243
+
3244
+ class AddTrajectoryError(BaseModel):
3245
+ message: Optional[str] = None
3246
+ location: Optional[Location] = None
3247
+ data: Optional[
3248
+ Union[
3249
+ TcpRequiredError,
3250
+ InconsistentTrajectorySizeError,
3251
+ JointLimitExceededError,
3252
+ CollisionError,
3253
+ TorqueExceededError,
3254
+ InvalidDofError,
3255
+ NanValueError,
3256
+ ]
3257
+ ] = None
3258
+
3259
+
3260
+ class AddTrajectoryResponse(BaseModel):
3261
+ """
3262
+ The response signals if the trajectory is valid or faulty resulting in an executable, partially executable or not executable state.
3263
+ - valid trajectory: response contains only the unique identifier for the trajectory
3264
+ - trajectory has error on path: response contains the unique identifier for the trajectory and information about the failure. It is executable up to the point of failure.
3265
+ - trajectory has error at start or invalid data: response contains only information about the failure.
3266
+
3267
+ To execute the trajectory use the unique identifier for calling [executeTrajectory](executeTrajectory).
3268
+ If you want to validate your trajectory before execution, execute it with a virtual motion group and check the state in the response stream of [executeTrajectory](executeTrajectory).
3269
+
3270
+ """
3271
+
3272
+ trajectory: Optional[str] = None
3273
+ """
3274
+ The unique identifier of the trajectory. Use this identifier to execute the trajectory with the [executeTrajectory](executeTrajectory) endpoint.
3275
+
3276
+ """
3277
+ error: Optional[AddTrajectoryError] = None
3278
+ """
3279
+ Always check this field first. If this field is present, the trajectory has an error and is only partially or not executable.
3280
+
3281
+ """
3282
+
3283
+
3284
+ class GetTrajectoryResponse(BaseModel):
3285
+ motion_group: str
3286
+ """
3287
+ Unique identifier of the motion group the trajectory is planned for.
3288
+ """
3289
+ trajectory: JointTrajectory
3290
+ """
3291
+ The trajectory consisting of a list of joint positions and
3292
+ an equal number of corresponding timestamps.
3293
+
3294
+ """
3295
+ tcp: str
3296
+ """
3297
+ Unique identifier of the tool the trajectory is planned for.
3298
+ """
3299
+
3300
+
3301
+ class TrajectoryId(BaseModel):
3302
+ message_type: Literal['TrajectoryId'] = 'TrajectoryId'
3303
+ """
3304
+ Type specifier for server, set automatically.
3305
+
3306
+ """
3307
+ id: str
3308
+ """
3309
+ The identifier of the trajectory which was returned by the [addTrajectory](addTrajectory) endpoint.
3310
+
3311
+ """
3312
+
3313
+
3314
+ class TrajectoryData(BaseModel):
3315
+ message_type: Literal['TrajectoryData'] = 'TrajectoryData'
3316
+ """
3317
+ Type specifier for server, set automatically.
3318
+
3319
+ """
3320
+ motion_group: Optional[str] = None
3321
+ """
3322
+ Identifier of the motion-group.
3323
+ """
3324
+ data: JointTrajectory
3325
+ """
3326
+ The trajectory consisting of a list of joint positions and
3327
+ an equal number of corresponding timestamps.
3328
+
3329
+ """
3330
+ tcp: Optional[str] = None
3331
+ """
3332
+ Unique identifier of the tool the trajectory is planned for.
3333
+ """
3334
+
3335
+
3336
+ class InitializeMovementRequest(BaseModel):
3337
+ """
3338
+ Sets up connection by locking a trajectory for execution. The robot controller mode is set to control mode.
3339
+ ATTENTION: This request has to be sent before any StartMovementRequest is sent.
3340
+ If initializing the movement was successful, no further movements can be initialized. To execute another trajectory, another connection has to be established.
3341
+
3342
+ """
3343
+
3344
+ message_type: Literal['InitializeMovementRequest'] = 'InitializeMovementRequest'
3345
+ """
3346
+ Type specifier for server, set automatically.
3347
+
3348
+ """
3349
+ trajectory: Annotated[
3350
+ Union[TrajectoryId, TrajectoryData], Field(discriminator='message_type')
3351
+ ]
3352
+ """
3353
+ The trajectory which should be executed and locked to the connection.
3354
+
3355
+ """
3356
+ initial_location: Optional[Location] = None
3357
+ response_coordinate_system: Optional[str] = None
3358
+ """
3359
+ Unique identifier addressing a coordinate system to which the responses are transformed.
3360
+ If not set, world coordinate system is used.
3361
+
3362
+ """
3363
+
3364
+
3365
+ class Direction(Enum):
3366
+ """
3367
+ The direction in which the trajectory is executed. Default: Forward.
3368
+
3369
+ """
3370
+
3371
+ DIRECTION_FORWARD = 'DIRECTION_FORWARD'
3372
+ DIRECTION_BACKWARD = 'DIRECTION_BACKWARD'
3373
+
3374
+
3375
+ class IOOrigin(Enum):
3376
+ """
3377
+ States the source of the input/output signal.
3378
+
3379
+ """
3380
+
3381
+ CONTROLLER = 'CONTROLLER'
3382
+ BUS_IO = 'BUS_IO'
3383
+
3384
+
3385
+ class SetIO(BaseModel):
3386
+ """
3387
+ Defines an input/output that should be set upon reaching a specified location on the trajectory.
3388
+ """
3389
+
3390
+ io: IOValue
3391
+ location: float
3392
+ """
3393
+ The location on the trajectory where the input/output should be set.
3394
+ """
3395
+ io_origin: IOOrigin
3396
+
3397
+
3398
+ class StartOnIO(BaseModel):
3399
+ """
3400
+ Defines an input/output that the motion should wait for to start the execution.
3401
+ """
3402
+
3403
+ io: IOValue
3404
+ comparator: Comparator
3405
+ """
3406
+ Comparator for the comparison of two values.
3407
+ Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
3408
+
3409
+ """
3410
+ io_origin: IOOrigin
3411
+
3412
+
3413
+ class PauseOnIO(BaseModel):
3414
+ """
3415
+ Defines an input/output that the motion will be paused for. The motion will stop gracefully on path.
3416
+ """
3417
+
3418
+ io: IOValue
3419
+ comparator: Comparator
3420
+ """
3421
+ Comparator for the comparison of two values.
3422
+ Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
3423
+
3424
+ """
3425
+ io_origin: IOOrigin
3426
+
3427
+
3428
+ class StartMovementRequest(BaseModel):
3429
+ """
3430
+ Moves the motion group along a trajectory, added via [planTrajectory](planTrajectory) or [planMotion](planMotion).
3431
+ Trajectories can be executed forwards or backwards("in reverse").
3432
+
3433
+ Pause the execution with PauseMovementRequest.
3434
+ Resume execution with StartMovementRequest.
3435
+
3436
+ Precondition: To start execution, the motion group must be located at the trajectory's start location specified in InitializeMovementRequest.
3437
+
3438
+ """
3439
+
3440
+ message_type: Literal['StartMovementRequest'] = 'StartMovementRequest'
3441
+ """
3442
+ Type specifier for server, set automatically.
3443
+
3444
+ """
3445
+ direction: Optional[Direction] = 'DIRECTION_FORWARD'
3446
+ target_location: Optional[Location] = None
3447
+ """
3448
+ The target location to which the motion group moves along the trajectory to.
3449
+ If `direction` and `target_location` are both specified, target location takes precedence.
3450
+ If neither is specified, the default is `DIRECTION_FORWARD`.
3451
+
3452
+ """
3453
+ set_outputs: Optional[List[SetIO]] = None
3454
+ """
3455
+ Attaches a list of output commands to the trajectory. The outputs are set to the specified values right after the specified location was reached.
3456
+ If the specified location is located before the start location (forward direction: value is smaller, backward direction: value is bigger), the output is not set.
3457
+
3458
+ """
3459
+ start_on_io: Optional[StartOnIO] = None
3460
+ """
3461
+ Defines an input/output that is listened to before the movement. Execution starts if the defined comparator evaluates to `true`.
3462
+
3463
+ """
3464
+ pause_on_io: Optional[PauseOnIO] = None
3465
+ """
3466
+ Defines an input/output that is listened to during the movement. Execution pauses if the defined comparator evaluates to `true`.
3467
+
3468
+ """
3469
+
3470
+
3471
+ class PauseMovementRequest(BaseModel):
3472
+ """
3473
+ Request to pause the movement execution. Movement pauses as soon as a [Standstill](Standstill.yaml) is sent back to the client.
3474
+ Resume movement with StartMovementRequest.
3475
+
3476
+ """
3477
+
3478
+ message_type: Literal['PauseMovementRequest'] = 'PauseMovementRequest'
3479
+ """
3480
+ Type specifier for server, set automatically.
3481
+
3482
+ """
3483
+
3484
+
3485
+ class PlaybackSpeedRequest(BaseModel):
3486
+ """
3487
+ Sets velocity for executed movements of the motion, in percent. Send after initializing the connection with InitializeMovementRequest.
3488
+
3489
+ """
3490
+
3491
+ message_type: Literal['PlaybackSpeedRequest'] = 'PlaybackSpeedRequest'
3492
+ """
3493
+ Type specifier for server, set automatically.
3494
+
3495
+ """
3496
+ playback_speed_in_percent: Annotated[int, Field(ge=0, le=100)]
3497
+ """
3498
+ Sets velocity for executed movements of the trajectory, in percent. 100% means that the motion group moves as
3499
+ fast as possible without violating any planning and motion group limits. Setting this value does not affect the overall shape of the velocity profile.
3500
+ The velocity profile of the trajectory is scaled down by the same factor. Therefore, this should only be used for teaching and trajectory
3501
+ evaluation purposes. To maintain a specific velocity, set the respective limits when planning the trajectory.
3502
+
3503
+ """
3504
+
3505
+
3506
+ class ExecuteTrajectoryRequest(RootModel):
3507
+ root: Annotated[
3508
+ Union[
3509
+ InitializeMovementRequest,
3510
+ StartMovementRequest,
3511
+ PauseMovementRequest,
3512
+ PlaybackSpeedRequest,
3513
+ ],
3514
+ Field(discriminator='message_type', title='ExecuteTrajectoryRequest'),
3515
+ ]
3516
+
3517
+
3518
+ class InitializeMovementResponse(BaseModel):
3519
+ """
3520
+ Response for InitializeMovementRequest message.
3521
+
3522
+ """
3523
+
3524
+ message: Optional[str] = None
3525
+ """
3526
+ Error message in case of invalid InitializeMovementRequest.
3527
+ """
3528
+ add_trajectory_error: Optional[AddTrajectoryError] = None
3529
+ """
3530
+ Error can occur if joint trajectory was added by [InitializeMovementRequest](InitializeMovementRequest) and the trajectory is invalid.
3531
+
3532
+ """
3533
+ kind: Literal['INITIALIZE_RECEIVED'] = 'INITIALIZE_RECEIVED'
3534
+
3535
+
3536
+ class StartMovementResponse(BaseModel):
3537
+ """
3538
+ Acknowledgment for StartMovementRequest message.
3539
+ ATTENTION: No confirmation that the movement was started. Confirmation that the StartMovementRequest was received and is processed.
3540
+ Fields `execute` and `standstill` of response of [streamMotionGroupState](streamMotionGroupState) signal start of movement execution.
3541
+
3542
+ """
3543
+
3544
+ message: Optional[str] = None
3545
+ """
3546
+ Error message in case of invalid StartMovementResquest.
3547
+ """
3548
+ kind: Literal['START_RECEIVED'] = 'START_RECEIVED'
3549
+
3550
+
3551
+ class PauseMovementResponse(BaseModel):
3552
+ """
3553
+ Acknowledgment for PauseMovementRequest message.
3554
+ ATTENTION: No confirmation that the movement was paused. Confirmation that the PauseMovementRequest was received and is processed.
3555
+ End of movement execution is signalled by [StillstandResponse](StillstandResponse).
3556
+
3557
+ """
3558
+
3559
+ message: Optional[str] = None
3560
+ """
3561
+ Error message in case of invalid PauseMovementResquest.
3562
+ """
3563
+ kind: Literal['PAUSE_RECEIVED'] = 'PAUSE_RECEIVED'
3564
+
3565
+
3566
+ class PlaybackSpeedResponse(BaseModel):
3567
+ """
3568
+ Acknowledgment for PlaybackSpeedRequest message.
3569
+
3570
+ """
3571
+
3572
+ message: Optional[str] = None
3573
+ """
3574
+ Error message in case of invalid PlaybackSpeedRequest.
3575
+ """
3576
+ kind: Literal['PLAYBACK_SPEED_RECEIVED'] = 'PLAYBACK_SPEED_RECEIVED'
3577
+
3578
+
3579
+ class MovementErrorResponse(BaseModel):
3580
+ """
3581
+ Error message in case an error occurs during movement execution.
3582
+
3583
+ """
3584
+
3585
+ message: str
3586
+ """
3587
+ Detailed error message describing the issue encountered during movement execution.
3588
+ """
3589
+ kind: Literal['MOTION_ERROR'] = 'MOTION_ERROR'
3590
+
3591
+
3592
+ class ExecuteTrajectoryResponse(RootModel):
3593
+ root: Annotated[
3594
+ Union[
3595
+ InitializeMovementResponse,
3596
+ StartMovementResponse,
3597
+ PauseMovementResponse,
3598
+ PlaybackSpeedResponse,
3599
+ MovementErrorResponse,
3600
+ ],
3601
+ Field(discriminator='kind', title='ExecuteTrajectoryResponse'),
3602
+ ]
3603
+
3604
+
3605
+ class InitializeJoggingRequest(BaseModel):
3606
+ """
3607
+ Send this message to start jogging a motion group.
3608
+ """
3609
+
3610
+ message_type: Literal['InitializeJoggingRequest'] = 'InitializeJoggingRequest'
3611
+ """
3612
+ Type specifier for server, set automatically.
3613
+
3614
+ """
3615
+ motion_group: str
3616
+ """
3617
+ Identifier of the motion group.
3618
+ """
3619
+ tcp: Optional[str] = None
3620
+ """
3621
+ Identifier of the tool. Required for robots (all limits, including TCP limits, are respected at all times regardless of the motion). Not required for external axes.
3622
+
3623
+ """
3624
+ response_coordinate_system: Optional[str] = None
3625
+ """
3626
+ Unique identifier addressing a coordinate system to which the responses are transformed.
3627
+ If not set, world coordinate system is used.
3628
+
3629
+ """
3630
+
3631
+
3632
+ class JointVelocityRequest(BaseModel):
3633
+ """
3634
+ Sets target joint velocities for jogging a motion group.
3635
+ """
3636
+
3637
+ message_type: Literal['JointVelocityRequest'] = 'JointVelocityRequest'
3638
+ """
3639
+ Type specifier for server, set automatically.
3640
+ """
3641
+ velocity: Joints
3642
+ """
3643
+ in [rad/s]
3644
+ """
3645
+
3646
+
3647
+ class TcpVelocityRequest(BaseModel):
3648
+ """
3649
+ Sets target TCP velocities for jogging a motion group.
3650
+ The motion group needs to have an inverse kinematic solver to be jogged by TCP velocities.
3651
+ Check `supports_inverse_kinematics` field in response of [listController](listController) for the motion group.
3652
+
3653
+ """
3654
+
3655
+ message_type: Literal['TcpVelocityRequest'] = 'TcpVelocityRequest'
3656
+ """
3657
+ Type specifier for server, set automatically.
3658
+
3659
+ """
3660
+ translation: Vector3d
3661
+ rotation: Vector3d
3662
+ use_tool_coordinate_system: Optional[bool] = False
3663
+ """
3664
+ If true, TCP velocities are interpreted in the tool coordinate system, specified by the TCP.
3665
+ If false, TCP velocities are interpreted in the world coordinate system.
3666
+
3667
+ """
3668
+
3669
+
3670
+ class PauseJoggingRequest(BaseModel):
3671
+ """
3672
+ Request to pause jogging. If successful, `execute` jogging state in [MotionGroupState](MotionGroupState.yaml) is set to `PAUSED_BY_USER`.
3673
+
3674
+ """
3675
+
3676
+ message_type: Literal['PauseJoggingRequest'] = 'PauseJoggingRequest'
3677
+ """
3678
+ Type specifier for server, set automatically.
3679
+
3680
+ """
3681
+
3682
+
3683
+ class ExecuteJoggingRequest(RootModel):
3684
+ root: Annotated[
3685
+ Union[
3686
+ InitializeJoggingRequest,
3687
+ JointVelocityRequest,
3688
+ TcpVelocityRequest,
3689
+ PauseJoggingRequest,
3690
+ ],
3691
+ Field(discriminator='message_type', title='ExecuteJoggingRequest'),
3692
+ ]
3693
+
3694
+
3695
+ class InitializeJoggingResponse(BaseModel):
3696
+ """
3697
+ Acknowledgment to an InitializeJoggingRequest.
3698
+
3699
+ """
3700
+
3701
+ message: Optional[str] = None
3702
+ """
3703
+ Error message in case of invalid InitializeJoggingRequest.
3704
+ """
3705
+ kind: Literal['INITIALIZE_RECEIVED'] = 'INITIALIZE_RECEIVED'
3706
+
3707
+
3708
+ class PauseJoggingResponse(BaseModel):
3709
+ """
3710
+ Acknowledgment to a PauseJoggingRequest.
3711
+
3712
+ """
3713
+
3714
+ message: Optional[str] = None
3715
+ """
3716
+ Error message in case of invalid PauseJoggingRequest.
3717
+ """
3718
+ kind: Literal['PAUSE_RECEIVED'] = 'PAUSE_RECEIVED'
3719
+
3720
+
3721
+ class TcpVelocityResponse(BaseModel):
3722
+ """
3723
+ Acknowledgment to a TcpVelocityRequest.
3724
+
3725
+ """
3726
+
3727
+ message: Optional[str] = None
3728
+ """
3729
+ Error message in case of invalid TcpVelocityRequest.
3730
+ """
3731
+ kind: Literal['TCP_VELOCITY_RECEIVED'] = 'TCP_VELOCITY_RECEIVED'
3732
+
3733
+
3734
+ class JointVelocityResponse(BaseModel):
3735
+ """
3736
+ Acknowledgment to a JointVelocityRequest.
3737
+
3738
+ """
3739
+
3740
+ message: Optional[str] = None
3741
+ """
3742
+ Error message in case of invalid JointVelocityRequest.
3743
+ """
3744
+ kind: Literal['JOINT_VELOCITY_RECEIVED'] = 'JOINT_VELOCITY_RECEIVED'
3745
+
3746
+
3747
+ class ExecuteJoggingResponse(RootModel):
3748
+ root: Annotated[
3749
+ Union[
3750
+ InitializeJoggingResponse,
3751
+ PauseJoggingResponse,
3752
+ TcpVelocityResponse,
3753
+ JointVelocityResponse,
3754
+ MovementErrorResponse,
3755
+ ],
3756
+ Field(discriminator='kind', title='ExecuteJoggingResponse'),
3757
+ ]
3758
+
3759
+
3760
+ class Program(BaseModel):
3761
+ """
3762
+ A program is a collection of instructions that are executed in the robot cell.
3763
+ """
3764
+
3765
+ program: Annotated[
3766
+ str,
3767
+ Field(
3768
+ examples=['my_program'],
3769
+ max_length=255,
3770
+ min_length=1,
3771
+ pattern='^[a-zA-Z0-9_-]+$',
3772
+ title='Unique program identifier',
3773
+ ),
3774
+ ]
3775
+ name: Annotated[Optional[str], Field(title='Program name')] = None
3776
+ description: Annotated[Optional[str], Field(title='Program description')] = None
3777
+ app: Annotated[str, Field(title='The app containing the program.')]
3778
+ input_schema: Annotated[
3779
+ Optional[Dict[str, Any]], Field(title='Program input json schema')
3780
+ ] = None
3781
+ preconditions: Annotated[
3782
+ Optional[Dict[str, Any]],
3783
+ Field(title='Preconditions before the program can be started'),
3784
+ ] = None
3785
+
3786
+
3787
+ class ProgramStartRequest(BaseModel):
3788
+ """
3789
+ The state of a program run.
3790
+ """
3791
+
3792
+ arguments: Dict[str, Any]
3793
+ """
3794
+ The arguments to pass to the program.
3795
+ """
3796
+
3797
+
3798
+ class ProgramRunState(Enum):
3799
+ """
3800
+ The state of a program run.
3801
+ """
3802
+
3803
+ PREPARING = 'PREPARING'
3804
+ RUNNING = 'RUNNING'
3805
+ COMPLETED = 'COMPLETED'
3806
+ FAILED = 'FAILED'
3807
+ STOPPED = 'STOPPED'
3808
+
3809
+
3810
+ class ProgramRun(BaseModel):
3811
+ """
3812
+ Holds the state of a program run.
3813
+ """
3814
+
3815
+ run: Annotated[str, Field(title='Run Id')]
3816
+ """
3817
+ Unique identifier of the program run
3818
+ """
3819
+ program: Annotated[str, Field(title='Program Id')]
3820
+ """
3821
+ Unique identifier of the program
3822
+ """
3823
+ app: Annotated[Optional[str], Field(title='App Id')] = None
3824
+ """
3825
+ Identifier of the app that produced the program run
3826
+ """
3827
+ state: Annotated[ProgramRunState, Field(title='State')]
3828
+ """
3829
+ State of the program run
3830
+ """
3831
+ logs: Annotated[Optional[str], Field(title='Logs')] = None
3832
+ """
3833
+ Logs of the program run
3834
+ """
3835
+ stdout: Annotated[Optional[str], Field(title='Stdout')] = None
3836
+ """
3837
+ Stdout of the program run
3838
+ """
3839
+ stderr: Annotated[Optional[str], Field(title='Stderr')] = None
3840
+ """
3841
+ Stderr of the program run
3842
+ """
3843
+ error: Annotated[Optional[str], Field(title='Error')] = None
3844
+ """
3845
+ Error message of the program run, if any
3846
+ """
3847
+ traceback: Annotated[Optional[str], Field(title='Traceback')] = None
3848
+ """
3849
+ Traceback of the program run, if any
3850
+ """
3851
+ start_time: Annotated[Optional[AwareDatetime], Field(title='Start Time')] = None
3852
+ """
3853
+ Start time of the program run in RFC3339 format
3854
+ """
3855
+ end_time: Annotated[Optional[AwareDatetime], Field(title='End Time')] = None
3856
+ """
3857
+ End time of the program run in RFC3339 format
3858
+ """
3859
+ input_data: Annotated[Optional[Dict[str, Any]], Field(title='Input Data')] = None
3860
+ """
3861
+ Input data of the program run
3862
+ """
3863
+
3864
+
3865
+ class ValidationError2(BaseModel):
3866
+ """
3867
+ A validation error of a program.
3868
+ """
3869
+
3870
+ loc: Annotated[List[int], Field(title='Location')]
3871
+ msg: Annotated[str, Field(title='Message')]
3872
+ type: Annotated[str, Field(title='Error Type')]
3873
+
3874
+
3875
+ class HTTPValidationError(BaseModel):
3876
+ detail: Annotated[Optional[List[ValidationError2]], Field(title='Detail')] = None
3877
+
3878
+
3879
+ class MotionGroupInfo(BaseModel):
3880
+ motion_group: str
3881
+ """
3882
+ The unique identifier of the motion group. Use it to refer to the motion group in other calls.
3883
+
3884
+ """
3885
+ name: str
3886
+ """
3887
+ The name of the motion group for display purposes.
3888
+
3889
+ """
3890
+ dof: Annotated[int, Field(ge=0, le=2147483647)]
3891
+ """
3892
+ The number of joints aka degrees of freedom in the motion group.
3893
+
3894
+ """
3895
+
3896
+
3897
+ class MotionGroupInfos(RootModel):
3898
+ root: List[MotionGroupInfo]
3899
+
3900
+ def __getitem__(self, index: int) -> MotionGroupInfo:
3901
+ """
3902
+ Make list RootModel directly indexable.
3903
+ """
3904
+ return self.root[index]
3905
+
3906
+ def __setitem__(self, index: int, value: MotionGroupInfo) -> None:
3907
+ """
3908
+ Make list RootModel directly indexable.
3909
+ """
3910
+ self.root[index] = value
3911
+
3912
+ def __len__(self) -> int:
3913
+ """
3914
+ Make list RootModel directly usable with len().
3915
+ """
3916
+ return len(self.root)
3917
+
3918
+ def __iter__(self):
3919
+ """
3920
+ Make list RootModel directly iterable.
3921
+ """
3922
+ return iter(self.root)
3923
+
3924
+
3925
+ class MotionGroupJoints(BaseModel):
3926
+ """
3927
+ Ensure to provide one value for each joint. See [getMotionGroups](getMotionGroups) for the number of joints.
3928
+ Everything but positions is optional.
3929
+ """
3930
+
3931
+ positions: List[float]
3932
+ """
3933
+ The joint positions of the motion group.
3934
+
3935
+ """
3936
+ velocities: Optional[List[float]] = None
3937
+ """
3938
+ The joint velocities of the motion group.
3939
+
3940
+ """
3941
+ accelerations: Optional[List[float]] = None
3942
+ """
3943
+ The joint accelerations of the motion group.
3944
+
3945
+ """
3946
+ torques: Optional[List[float]] = None
3947
+ """
3948
+ The joint torques of the motion group.
3949
+
3950
+ """
3951
+
3952
+
3953
+ class RobotTcpData(BaseModel):
3954
+ name: Optional[str] = None
3955
+ """
3956
+ A readable and changeable name for frontend visualization.
3957
+ """
3958
+ position: Vector3d
3959
+ orientation: Optional[Orientation] = None
3960
+ orientation_type: Optional[OrientationType] = 'ROTATION_VECTOR'
3961
+
3962
+
3963
+ class RobotTcp(RobotTcpData):
3964
+ id: str
3965
+ """
3966
+ Identifier of this tcp.
3967
+ """
3968
+
3969
+
3970
+ class RobotTcps(RootModel):
3971
+ root: Annotated[
3972
+ List[RobotTcp],
3973
+ Field(
3974
+ examples=[
3975
+ [
3976
+ {
3977
+ 'id': 'BASE/schmalz_gripper',
3978
+ 'name': 'BASE/schmalz_gripper',
3979
+ 'position': [0, 0, 110],
3980
+ 'orientation': [0, 0, 0, 1],
3981
+ 'orientation_type': 'QUATERNION',
3982
+ },
3983
+ {
3984
+ 'id': 'WB_EGM/egm_tool',
3985
+ 'name': 'WB_EGM/egm_tool',
3986
+ 'position': [400, 250, 0],
3987
+ 'orientation': [1.57079632679, 0, 3.14159265359],
3988
+ 'orientation_type': 'ROTATION_VECTOR',
3989
+ },
3990
+ ]
3991
+ ]
3992
+ ),
3993
+ ]
3994
+
3995
+ def __getitem__(self, index: int) -> RobotTcp:
3996
+ """
3997
+ Make list RootModel directly indexable.
3998
+ """
3999
+ return self.root[index]
4000
+
4001
+ def __setitem__(self, index: int, value: RobotTcp) -> None:
4002
+ """
4003
+ Make list RootModel directly indexable.
4004
+ """
4005
+ self.root[index] = value
4006
+
4007
+ def __len__(self) -> int:
4008
+ """
4009
+ Make list RootModel directly usable with len().
4010
+ """
4011
+ return len(self.root)
4012
+
4013
+ def __iter__(self):
4014
+ """
4015
+ Make list RootModel directly iterable.
4016
+ """
4017
+ return iter(self.root)
4018
+
4019
+
4020
+ class Flag(BaseModel):
4021
+ active: bool
4022
+
4023
+
4024
+ class OpMode(BaseModel):
4025
+ """
4026
+ Controllers have two operating modes: AUTOMATIC and MANUAL.
4027
+ MANUAL mode is mainly used for teaching a robot application.
4028
+ To ensure safe operation the velocity of the robot is limited to 250 mm/s.
4029
+ Running the finished application is done in AUTOMATIC operating mode without the limited velocity of the MANUAL mode.
4030
+
4031
+ """
4032
+
4033
+ mode: OperationMode
4034
+
4035
+
4036
+ class CycleTime(BaseModel):
4037
+ cycle_time_ms: Annotated[int, Field(ge=0, le=4294967295)]
4038
+ """
4039
+ Cycle time of controller communication in [ms].
4040
+ """
4041
+
4042
+
4043
+ class Behavior(Enum):
4044
+ """
4045
+ ## BEHAVIOR_AUTOMATIC
4046
+ This is the default behavior.
4047
+ The motion groups of the controller take commanded joint configuration as actual joint state.
4048
+ Configures the compliance of the virtual robot with the normal ControllerState cycle time. If set, the virtual robot will act like a physical one, e.g., with a cycle time of 8ms to respond to a new joint state command.
4049
+ ## BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME
4050
+ Configures the compliance of the virtual robot with the normal ControllerState cycle time. If set, the robot will respond as fast as possible, limited only by software execution speed. Because of that the execution of a movement requires less time than with BEHAVIOR_AUTOMATIC.
4051
+ ## BEHAVIOR_EXTERNAL_SOURCE
4052
+ The external client is the only source of actual joint state changes.
4053
+ This mode is used to enable third party software indicating the current joint state via [externalJointsStream](externalJointsStream).
4054
+
4055
+ """
4056
+
4057
+ BEHAVIOR_AUTOMATIC = 'BEHAVIOR_AUTOMATIC'
4058
+ BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME = (
4059
+ 'BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME'
4060
+ )
4061
+ BEHAVIOR_EXTERNAL_SOURCE = 'BEHAVIOR_EXTERNAL_SOURCE'
4062
+
4063
+
4064
+ class ExternalJointStreamDatapoint(BaseModel):
4065
+ """
4066
+ A datapoint inside external joint stream.
4067
+ """
4068
+
4069
+ motion_group: str
4070
+ """
4071
+ The unique identifier of the motion group.
4072
+
4073
+ """
4074
+ value: MotionGroupJoints
4075
+
4076
+
4077
+ class ExternalJointStreamDatapoints(RootModel):
4078
+ root: List[ExternalJointStreamDatapoint]
4079
+
4080
+ def __getitem__(self, index: int) -> ExternalJointStreamDatapoint:
4081
+ """
4082
+ Make list RootModel directly indexable.
4083
+ """
4084
+ return self.root[index]
4085
+
4086
+ def __setitem__(self, index: int, value: ExternalJointStreamDatapoint) -> None:
4087
+ """
4088
+ Make list RootModel directly indexable.
4089
+ """
4090
+ self.root[index] = value
4091
+
4092
+ def __len__(self) -> int:
4093
+ """
4094
+ Make list RootModel directly usable with len().
4095
+ """
4096
+ return len(self.root)
4097
+
4098
+ def __iter__(self):
4099
+ """
4100
+ Make list RootModel directly iterable.
4101
+ """
4102
+ return iter(self.root)
4103
+
4104
+
4105
+ class ExternalJointStreamRequest(BaseModel):
4106
+ states: ExternalJointStreamDatapoints
4107
+
4108
+
4109
+ class Key(RootModel):
4110
+ root: Annotated[str, Field(title='Key')]
4111
+ """
4112
+ Unique identifier describing to adress an object.
4113
+
4114
+ Special characters, such as `;`, `/`, `?`, `:`, `@`, `=` and `&`, have to be URL encoded.
4115
+
4116
+ """
4117
+
4118
+
4119
+ class MetadataObject(RootModel):
4120
+ """
4121
+ A metadata object.
4122
+ """
4123
+
4124
+ root: Dict[str, str]
4125
+
4126
+
4127
+ class BinaryObject(RootModel):
4128
+ root: Annotated[bytes, Field(title='BinaryObject')]
4129
+ """
4130
+ Any value encoded as a binary string.
4131
+ """
4132
+
4133
+
4134
+ class BusIODescription(BaseModel):
4135
+ io: str
4136
+ """
4137
+ Unique identifier of the input/output.
4138
+
4139
+ """
4140
+ name: str
4141
+ """
4142
+ Name of the input/output. Customize it using the respective BUS service, e.g., [addProfinetIO](addProfinetIO) for PROFINET service.
4143
+
4144
+ """
4145
+ direction: IODirection
4146
+ value_type: IOValueType
4147
+ unit: Optional[UnitType] = None
4148
+ min: Optional[IOBoundary] = None
4149
+ max: Optional[IOBoundary] = None
4150
+
4151
+
4152
+ class ListBusIODescriptionsResponse(RootModel):
4153
+ root: List[BusIODescription]
4154
+
4155
+ def __getitem__(self, index: int) -> BusIODescription:
4156
+ """
4157
+ Make list RootModel directly indexable.
4158
+ """
4159
+ return self.root[index]
4160
+
4161
+ def __setitem__(self, index: int, value: BusIODescription) -> None:
4162
+ """
4163
+ Make list RootModel directly indexable.
4164
+ """
4165
+ self.root[index] = value
4166
+
4167
+ def __len__(self) -> int:
4168
+ """
4169
+ Make list RootModel directly usable with len().
4170
+ """
4171
+ return len(self.root)
4172
+
4173
+ def __iter__(self):
4174
+ """
4175
+ Make list RootModel directly iterable.
4176
+ """
4177
+ return iter(self.root)
4178
+
4179
+
4180
+ class BusIOsStateEnum(Enum):
4181
+ """
4182
+ Current state of the BUS input/output service.
4183
+
4184
+ """
4185
+
4186
+ BUS_IOS_STATE_UNKNOWN = 'BUS_IOS_STATE_UNKNOWN'
4187
+ BUS_IOS_STATE_INITIALIZING = 'BUS_IOS_STATE_INITIALIZING'
4188
+ BUS_IOS_STATE_CONNECTED = 'BUS_IOS_STATE_CONNECTED'
4189
+ BUS_IOS_STATE_DISCONNECTED = 'BUS_IOS_STATE_DISCONNECTED'
4190
+
4191
+
4192
+ class BusIOsState(BaseModel):
4193
+ state: BusIOsStateEnum
4194
+ message: Optional[str] = None
4195
+ """
4196
+ A message providing additional information on the input/output service, e.g., BUS service status, encountered errors.
4197
+ May be empty if no additional information is available.
4198
+
4199
+ """
4200
+
4201
+
4202
+ class ProfinetSubSlotDescription(BaseModel):
4203
+ number: Annotated[int, Field(ge=0, le=2147483647)]
4204
+ """
4205
+ The number/index of the PROFINET subslot.
4206
+
4207
+ """
4208
+ input_length: Annotated[int, Field(ge=0, le=2147483647)]
4209
+ """
4210
+ The amount of bytes allocated for the subslot in the input process image buffer.
4211
+
4212
+ """
4213
+ output_length: Annotated[int, Field(ge=0, le=2147483647)]
4214
+ """
4215
+ The amount of bytes allocated for the subslot in the output process image buffer.
4216
+
4217
+ """
4218
+
4219
+
4220
+ class ProfinetSlotDescription(BaseModel):
4221
+ """
4222
+ An array of PROFINET slots.
4223
+
4224
+ PROFINET models each device’s input/output hardware as a hierarchy of slots (modules) and subslots (submodules).
4225
+ A slot can represent a physical or virtual input/output card and each subslot one of its individual channels or functions.
4226
+ Every slot and subslot has unique identifiers that the controller uses to map cyclic input/output data and parameter records to its process image.
4227
+ This slot/subslot separation enables e.g., addressing each input/output stream when establishing input/output application relations (I/O-AR).
4228
+
4229
+ """
4230
+
4231
+ number: Annotated[int, Field(ge=0, le=2147483647)]
4232
+ """
4233
+ The number/index of the PROFINET slot. 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.
4234
+
4235
+ """
4236
+ api: Annotated[int, Field(ge=0, le=2147483647)]
4237
+ """
4238
+ The application process identifier (API) number of the PROFINET input.
4239
+ The API identifies the application relation (AR) that is using the slot.
4240
+
4241
+ """
4242
+ subslots: List[ProfinetSubSlotDescription]
4243
+ """
4244
+ An array of PROFINET subslots.
4245
+
4246
+ """
4247
+
4248
+
4249
+ class ProfinetDescription(BaseModel):
4250
+ vendor_id: str
4251
+ """
4252
+ The vendor identifier of the PROFINET device, identifying the manufacturer.
4253
+
4254
+ """
4255
+ device_id: str
4256
+ """
4257
+ The device identifier of the PROFINET device, identifying the specific device within the vendor's range.
4258
+
4259
+ """
4260
+ slots: Optional[List[ProfinetSlotDescription]] = None
4261
+ device_name: Annotated[Optional[str], Field(examples=['pnDevice'])] = None
4262
+ """
4263
+ Name of Station (NoS) of the PROFINET device. The NoS is used in combination with IPv4 record to identify your device in the PROFINET network.
4264
+ The `device_name` will be used as NoS if no REMA XML file is already present on your NOVA instance and no `rema_xml_content` is provided.
4265
+
4266
+ """
4267
+ ip_config: Optional[BusIOProfinetIpConfig] = None
4268
+
4269
+
4270
+ class ProfinetIOTypeEnum(Enum):
4271
+ """
4272
+ Value type of the PROFINET input/output variable. Is used to interpret the corresponding bits correctly.
4273
+
4274
+ """
4275
+
4276
+ PROFINET_IO_TYPE_UNKNOWN = 'PROFINET_IO_TYPE_UNKNOWN'
4277
+ PROFINET_IO_TYPE_BOOL = 'PROFINET_IO_TYPE_BOOL'
4278
+ PROFINET_IO_TYPE_USINT = 'PROFINET_IO_TYPE_USINT'
4279
+ PROFINET_IO_TYPE_SINT = 'PROFINET_IO_TYPE_SINT'
4280
+ PROFINET_IO_TYPE_UINT = 'PROFINET_IO_TYPE_UINT'
4281
+ PROFINET_IO_TYPE_INT = 'PROFINET_IO_TYPE_INT'
4282
+ PROFINET_IO_TYPE_UDINT = 'PROFINET_IO_TYPE_UDINT'
4283
+ PROFINET_IO_TYPE_DINT = 'PROFINET_IO_TYPE_DINT'
4284
+ PROFINET_IO_TYPE_REAL = 'PROFINET_IO_TYPE_REAL'
4285
+ PROFINET_IO_TYPE_LREAL = 'PROFINET_IO_TYPE_LREAL'
4286
+
4287
+
4288
+ class ProfinetIODirection(Enum):
4289
+ """
4290
+ 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.
4291
+ """
4292
+
4293
+ PROFINET_IO_DIRECTION_INPUT = 'PROFINET_IO_DIRECTION_INPUT'
4294
+ PROFINET_IO_DIRECTION_OUTPUT = 'PROFINET_IO_DIRECTION_OUTPUT'
4295
+ PROFINET_IO_DIRECTION_INOUT = 'PROFINET_IO_DIRECTION_INOUT'
4296
+
4297
+
4298
+ class ProfinetIOData(BaseModel):
4299
+ description: str
4300
+ """
4301
+ Descriptive name or note for the input/output variable.
4302
+
4303
+ """
4304
+ type: ProfinetIOTypeEnum
4305
+ direction: ProfinetIODirection
4306
+ """
4307
+ 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.
4308
+
4309
+ """
4310
+ byte_address: Annotated[int, Field(ge=0, le=65535)]
4311
+ """
4312
+ The byte address of the input/output variable in the PROFINET device, e.g., NOVA's PROFINET service.
4313
+ The byte address is used to locate the specific input/output variable within the device's memory or data structure.
4314
+
4315
+ """
4316
+ bit_address: Annotated[Optional[int], Field(ge=0, le=7)] = None
4317
+ """
4318
+ The bit address of the input/output variable within the byte or word address.
4319
+ The bit address is used to specify the exact bit within the byte or word that corresponds to the input/output variable.
4320
+
4321
+ """
4322
+
4323
+
4324
+ class ProfinetIO(ProfinetIOData):
4325
+ io: str
4326
+ """
4327
+ The unique identifier for the input/output value.
4328
+ This identifier is used to reference the specific input/output variable in the PROFINET device, e.g., NOVA's PROFINET service.
4329
+
4330
+ """
4331
+
4332
+
4333
+ class ProfinetIOs(RootModel):
4334
+ """
4335
+ Array of PROFINET input/output variable configurations.
4336
+ """
4337
+
4338
+ root: List[ProfinetIO]
4339
+ """
4340
+ Array of PROFINET input/output variable configurations.
4341
+ """
4342
+
4343
+ def __getitem__(self, index: int) -> ProfinetIO:
4344
+ """
4345
+ Make list RootModel directly indexable.
4346
+ """
4347
+ return self.root[index]
4348
+
4349
+ def __setitem__(self, index: int, value: ProfinetIO) -> None:
4350
+ """
4351
+ Make list RootModel directly indexable.
4352
+ """
4353
+ self.root[index] = value
4354
+
4355
+ def __len__(self) -> int:
4356
+ """
4357
+ Make list RootModel directly usable with len().
4358
+ """
4359
+ return len(self.root)
4360
+
4361
+ def __iter__(self):
4362
+ """
4363
+ Make list RootModel directly iterable.
4364
+ """
4365
+ return iter(self.root)
4366
+
4367
+
4368
+ class ProfinetInputOutputConfig(BaseModel):
4369
+ config: Annotated[
4370
+ str,
4371
+ Field(
4372
+ examples=[
4373
+ '<Tagtable name=\'Standard variable table\'>\\n\n <Tag type="Bool" hmiVisible="True" hmiWriteable="True" hmiAccessible="True" retain="False" remark="" addr="%I100.0">bLightRed</Tag>\\n\n <Tag type="Int" hmiVisible="True" hmiWriteable="True" hmiAccessible="True" retain="False" remark="" addr="%QW800">nCounter</Tag>\\n\n</Tagtable>\n'
4374
+ ]
4375
+ ),
4376
+ ]
4377
+ """
4378
+ Content of the input/output variable configuration XML file.
4379
+ The XML File has to be embedded as a string by escaping quotes, line breaks and so forth.
4380
+
4381
+ """
4382
+ input_offset: Annotated[int, Field(examples=[100], ge=0, le=2147483647)]
4383
+ """
4384
+ 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.
4385
+ """
4386
+ output_offset: Annotated[int, Field(examples=[800], ge=0, le=2147483647)]
4387
+ """
4388
+ 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.
4389
+ """
4390
+
4391
+
4392
+ class ModbusIOTypeEnum(Enum):
4393
+ """
4394
+ Value type of the MODBUS input/output variable. Used to interpret the corresponding bits correctly.
4395
+
4396
+ """
4397
+
4398
+ MODBUS_IO_TYPE_UNKNOWN = 'MODBUS_IO_TYPE_UNKNOWN'
4399
+ MODBUS_IO_TYPE_BOOL = 'MODBUS_IO_TYPE_BOOL'
4400
+ MODBUS_IO_TYPE_UINT16 = 'MODBUS_IO_TYPE_UINT16'
4401
+ MODBUS_IO_TYPE_FLOAT32 = 'MODBUS_IO_TYPE_FLOAT32'
4402
+
4403
+
4404
+ class ModbusIOByteOrder(Enum):
4405
+ """
4406
+ Byte order of the MODBUS input/output variable. Used to interpret the corresponding bits correctly.
4407
+
4408
+ """
4409
+
4410
+ MODBUS_IO_BYTE_ORDER_UNKNOWN = 'MODBUS_IO_BYTE_ORDER_UNKNOWN'
4411
+ MODBUS_IO_BYTE_ORDER_ABCD = 'MODBUS_IO_BYTE_ORDER_ABCD'
4412
+ MODBUS_IO_BYTE_ORDER_BADC = 'MODBUS_IO_BYTE_ORDER_BADC'
4413
+ MODBUS_IO_BYTE_ORDER_CDAB = 'MODBUS_IO_BYTE_ORDER_CDAB'
4414
+ MODBUS_IO_BYTE_ORDER_DCBA = 'MODBUS_IO_BYTE_ORDER_DCBA'
4415
+
4416
+
4417
+ class ModbusIOArea(Enum):
4418
+ """
4419
+ Area of the MODBUS input/output variable. Is used to interpret the corresponding bits correctly.
4420
+
4421
+ """
4422
+
4423
+ MODBUS_IO_AREA_UNKNOWN = 'MODBUS_IO_AREA_UNKNOWN'
4424
+ MODBUS_IO_AREA_COILS = 'MODBUS_IO_AREA_COILS'
4425
+ MODBUS_IO_AREA_DISCRETE_INPUTS = 'MODBUS_IO_AREA_DISCRETE_INPUTS'
4426
+ MODBUS_IO_AREA_HOLDING_REGISTERS = 'MODBUS_IO_AREA_HOLDING_REGISTERS'
4427
+ MODBUS_IO_AREA_INPUT_REGISTERS = 'MODBUS_IO_AREA_INPUT_REGISTERS'
4428
+
4429
+
4430
+ class ModbusIOData(BaseModel):
4431
+ description: str
4432
+ """
4433
+ Descriptive name or note for the input/output variable.
4434
+
4435
+ """
4436
+ address: Annotated[int, Field(ge=0, le=65535)]
4437
+ """
4438
+ The byte address of the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service.
4439
+ Used to locate the input/output variable within the device's memory or data structure.
4440
+
4441
+ """
4442
+ type: ModbusIOTypeEnum
4443
+ byte_order: ModbusIOByteOrder
4444
+ """
4445
+ The byte sequence of the input/output variable, indicating the order of bytes in memory for the MODBUS device, e.g., NOVA's MODBUS service.
4446
+
4447
+ """
4448
+ area: ModbusIOArea
4449
+ """
4450
+ The area of the input/output variable, indicating the memory region it belongs to for the MODBUS device, e.g., NOVA's MODBUS service.
4451
+
4452
+ """
4453
+
4454
+
4455
+ class ModbusIO(ModbusIOData):
4456
+ io: str
4457
+ """
4458
+ The unique identifier for the input/output value.
4459
+ Used to reference the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service.
4460
+
4461
+ """
4462
+
4463
+
4464
+ class ModbusIOs(RootModel):
4465
+ """
4466
+ Array of MODBUS input/output variable configurations.
4467
+ """
4468
+
4469
+ root: List[ModbusIO]
4470
+ """
4471
+ Array of MODBUS input/output variable configurations.
4472
+ """
4473
+
4474
+ def __getitem__(self, index: int) -> ModbusIO:
4475
+ """
4476
+ Make list RootModel directly indexable.
4477
+ """
4478
+ return self.root[index]
4479
+
4480
+ def __setitem__(self, index: int, value: ModbusIO) -> None:
4481
+ """
4482
+ Make list RootModel directly indexable.
4483
+ """
4484
+ self.root[index] = value
4485
+
4486
+ def __len__(self) -> int:
4487
+ """
4488
+ Make list RootModel directly usable with len().
4489
+ """
4490
+ return len(self.root)
4491
+
4492
+ def __iter__(self):
4493
+ """
4494
+ Make list RootModel directly iterable.
4495
+ """
4496
+ return iter(self.root)
4497
+
4498
+
4499
+ class ConfigurationResourceArray(RootModel):
4500
+ """
4501
+ Array of configuration resources.
4502
+ """
4503
+
4504
+ root: List[ConfigurationResource]
4505
+ """
4506
+ Array of configuration resources.
4507
+ """
4508
+
4509
+ def __getitem__(self, index: int) -> ConfigurationResource:
4510
+ """
4511
+ Make list RootModel directly indexable.
4512
+ """
4513
+ return self.root[index]
4514
+
4515
+ def __setitem__(self, index: int, value: ConfigurationResource) -> None:
4516
+ """
4517
+ Make list RootModel directly indexable.
4518
+ """
4519
+ self.root[index] = value
4520
+
4521
+ def __len__(self) -> int:
4522
+ """
4523
+ Make list RootModel directly usable with len().
4524
+ """
4525
+ return len(self.root)
4526
+
4527
+ def __iter__(self):
4528
+ """
4529
+ Make list RootModel directly iterable.
4530
+ """
4531
+ return iter(self.root)
4532
+
4533
+
4534
+ class ConfigurationResource(BaseModel):
4535
+ """
4536
+ Configuration resource object.
4537
+ """
4538
+
4539
+ id: ConfigurationResourceId
4540
+ name: str
4541
+ """
4542
+ Human-readable name of the configuration resource.
4543
+ """
4544
+ children: Optional[ConfigurationResourceArray] = None
4545
+
4546
+
4547
+ ConfigurationResourceArray.model_rebuild()