viam-sdk 0.3.0__py3-none-linux_armv6l.whl → 0.66.0__py3-none-linux_armv6l.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.

Potentially problematic release.


This version of viam-sdk might be problematic. Click here for more details.

Files changed (452) hide show
  1. viam/__init__.py +29 -2
  2. viam/app/_logs.py +34 -0
  3. viam/app/app_client.py +2696 -0
  4. viam/app/billing_client.py +185 -0
  5. viam/app/data_client.py +2231 -0
  6. viam/app/ml_training_client.py +249 -0
  7. viam/app/provisioning_client.py +93 -0
  8. viam/app/viam_client.py +275 -0
  9. viam/components/arm/__init__.py +3 -26
  10. viam/components/arm/arm.py +123 -8
  11. viam/components/arm/client.py +37 -24
  12. viam/components/arm/service.py +35 -32
  13. viam/components/audio_in/__init__.py +24 -0
  14. viam/components/audio_in/audio_in.py +74 -0
  15. viam/components/audio_in/client.py +76 -0
  16. viam/components/audio_in/service.py +83 -0
  17. viam/components/audio_out/__init__.py +21 -0
  18. viam/components/audio_out/audio_out.py +72 -0
  19. viam/components/audio_out/client.py +67 -0
  20. viam/components/audio_out/service.py +63 -0
  21. viam/components/base/__init__.py +6 -11
  22. viam/components/base/base.py +134 -8
  23. viam/components/base/client.py +51 -23
  24. viam/components/base/service.py +33 -30
  25. viam/components/board/__init__.py +3 -12
  26. viam/components/board/board.py +247 -91
  27. viam/components/board/client.py +149 -83
  28. viam/components/board/service.py +63 -33
  29. viam/components/button/__init__.py +10 -0
  30. viam/components/button/button.py +41 -0
  31. viam/components/button/client.py +52 -0
  32. viam/components/button/service.py +46 -0
  33. viam/components/camera/__init__.py +3 -3
  34. viam/components/camera/camera.py +62 -27
  35. viam/components/camera/client.py +59 -27
  36. viam/components/camera/service.py +42 -65
  37. viam/components/component_base.py +28 -5
  38. viam/components/encoder/__init__.py +1 -1
  39. viam/components/encoder/client.py +25 -14
  40. viam/components/encoder/encoder.py +48 -10
  41. viam/components/encoder/service.py +14 -18
  42. viam/components/gantry/__init__.py +1 -13
  43. viam/components/gantry/client.py +80 -25
  44. viam/components/gantry/gantry.py +123 -9
  45. viam/components/gantry/service.py +51 -29
  46. viam/components/generic/__init__.py +1 -1
  47. viam/components/generic/client.py +21 -8
  48. viam/components/generic/generic.py +10 -2
  49. viam/components/generic/service.py +12 -7
  50. viam/components/gripper/__init__.py +3 -13
  51. viam/components/gripper/client.py +69 -21
  52. viam/components/gripper/gripper.py +123 -3
  53. viam/components/gripper/service.py +44 -22
  54. viam/components/input/__init__.py +1 -14
  55. viam/components/input/client.py +55 -23
  56. viam/components/input/input.py +106 -3
  57. viam/components/input/service.py +16 -21
  58. viam/components/motor/__init__.py +1 -21
  59. viam/components/motor/client.py +56 -33
  60. viam/components/motor/motor.py +127 -4
  61. viam/components/motor/service.py +33 -44
  62. viam/components/movement_sensor/__init__.py +1 -1
  63. viam/components/movement_sensor/client.py +102 -45
  64. viam/components/movement_sensor/movement_sensor.py +130 -61
  65. viam/components/movement_sensor/service.py +38 -41
  66. viam/components/pose_tracker/__init__.py +1 -1
  67. viam/components/pose_tracker/client.py +18 -7
  68. viam/components/pose_tracker/pose_tracker.py +4 -2
  69. viam/components/pose_tracker/service.py +12 -10
  70. viam/components/power_sensor/__init__.py +17 -0
  71. viam/components/power_sensor/client.py +86 -0
  72. viam/components/power_sensor/power_sensor.py +104 -0
  73. viam/components/power_sensor/service.py +72 -0
  74. viam/components/sensor/__init__.py +2 -1
  75. viam/components/sensor/client.py +26 -10
  76. viam/components/sensor/sensor.py +22 -4
  77. viam/components/sensor/service.py +20 -11
  78. viam/components/servo/__init__.py +1 -13
  79. viam/components/servo/client.py +47 -21
  80. viam/components/servo/service.py +15 -22
  81. viam/components/servo/servo.py +61 -2
  82. viam/components/switch/__init__.py +10 -0
  83. viam/components/switch/client.py +83 -0
  84. viam/components/switch/service.py +72 -0
  85. viam/components/switch/switch.py +98 -0
  86. viam/errors.py +10 -0
  87. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  88. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  89. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  90. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  91. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  92. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  93. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  94. viam/gen/app/data/v1/data_grpc.py +197 -8
  95. viam/gen/app/data/v1/data_pb2.py +238 -99
  96. viam/gen/app/data/v1/data_pb2.pyi +1222 -259
  97. viam/gen/app/datapipelines/__init__.py +0 -0
  98. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  99. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  100. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +57 -0
  101. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +387 -0
  102. viam/gen/app/dataset/__init__.py +0 -0
  103. viam/gen/app/dataset/v1/__init__.py +0 -0
  104. viam/gen/app/dataset/v1/dataset_grpc.py +68 -0
  105. viam/gen/app/dataset/v1/dataset_pb2.py +44 -0
  106. viam/gen/app/dataset/v1/dataset_pb2.pyi +214 -0
  107. viam/gen/app/datasync/v1/data_sync_grpc.py +21 -4
  108. viam/gen/app/datasync/v1/data_sync_pb2.py +62 -128
  109. viam/gen/app/datasync/v1/data_sync_pb2.pyi +156 -199
  110. viam/gen/app/mlinference/__init__.py +0 -0
  111. viam/gen/app/mlinference/v1/__init__.py +0 -0
  112. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  113. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  114. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  115. viam/gen/app/mltraining/v1/ml_training_grpc.py +51 -3
  116. viam/gen/app/mltraining/v1/ml_training_pb2.py +135 -58
  117. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +328 -39
  118. viam/gen/app/packages/v1/packages_grpc.py +15 -1
  119. viam/gen/app/packages/v1/packages_pb2.py +44 -64
  120. viam/gen/app/packages/v1/packages_pb2.pyi +75 -85
  121. viam/gen/app/v1/app_grpc.py +644 -3
  122. viam/gen/app/v1/app_pb2.py +695 -295
  123. viam/gen/app/v1/app_pb2.pyi +4488 -635
  124. viam/gen/app/v1/billing_grpc.py +53 -11
  125. viam/gen/app/v1/billing_pb2.py +94 -39
  126. viam/gen/app/v1/billing_pb2.pyi +391 -191
  127. viam/gen/app/v1/end_user_grpc.py +59 -0
  128. viam/gen/app/v1/end_user_pb2.py +55 -0
  129. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  130. viam/gen/app/v1/robot_grpc.py +16 -1
  131. viam/gen/app/v1/robot_pb2.py +122 -94
  132. viam/gen/app/v1/robot_pb2.pyi +463 -123
  133. viam/gen/common/v1/common_pb2.py +87 -58
  134. viam/gen/common/v1/common_pb2.pyi +456 -149
  135. viam/gen/component/arm/v1/arm_grpc.py +58 -2
  136. viam/gen/component/arm/v1/arm_pb2.py +68 -51
  137. viam/gen/component/arm/v1/arm_pb2.pyi +108 -42
  138. viam/gen/component/audioin/__init__.py +0 -0
  139. viam/gen/component/audioin/v1/__init__.py +0 -0
  140. viam/gen/component/audioin/v1/audioin_grpc.py +54 -0
  141. viam/gen/component/audioin/v1/audioin_pb2.py +34 -0
  142. viam/gen/component/audioin/v1/audioin_pb2.pyi +94 -0
  143. viam/gen/component/audioinput/v1/audioinput_grpc.py +25 -2
  144. viam/gen/component/audioinput/v1/audioinput_pb2.py +36 -31
  145. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +22 -22
  146. viam/gen/component/audioout/__init__.py +0 -0
  147. viam/gen/component/audioout/v1/__init__.py +0 -0
  148. viam/gen/component/audioout/v1/audioout_grpc.py +54 -0
  149. viam/gen/component/audioout/v1/audioout_pb2.py +32 -0
  150. viam/gen/component/audioout/v1/audioout_pb2.pyi +47 -0
  151. viam/gen/component/base/v1/base_grpc.py +42 -2
  152. viam/gen/component/base/v1/base_pb2.py +58 -47
  153. viam/gen/component/base/v1/base_pb2.pyi +65 -30
  154. viam/gen/component/board/v1/board_grpc.py +59 -7
  155. viam/gen/component/board/v1/board_pb2.py +94 -73
  156. viam/gen/component/board/v1/board_pb2.pyi +165 -68
  157. viam/gen/component/button/__init__.py +0 -0
  158. viam/gen/component/button/v1/__init__.py +0 -0
  159. viam/gen/component/button/v1/button_grpc.py +38 -0
  160. viam/gen/component/button/v1/button_pb2.py +28 -0
  161. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  162. viam/gen/component/camera/v1/camera_grpc.py +38 -2
  163. viam/gen/component/camera/v1/camera_pb2.py +60 -43
  164. viam/gen/component/camera/v1/camera_pb2.pyi +191 -37
  165. viam/gen/component/encoder/v1/encoder_grpc.py +25 -2
  166. viam/gen/component/encoder/v1/encoder_pb2.py +36 -31
  167. viam/gen/component/encoder/v1/encoder_pb2.pyi +15 -15
  168. viam/gen/component/gantry/v1/gantry_grpc.py +47 -2
  169. viam/gen/component/gantry/v1/gantry_pb2.py +56 -43
  170. viam/gen/component/gantry/v1/gantry_pb2.pyi +67 -31
  171. viam/gen/component/generic/v1/generic_grpc.py +16 -2
  172. viam/gen/component/generic/v1/generic_pb2.py +16 -11
  173. viam/gen/component/gripper/v1/gripper_grpc.py +44 -2
  174. viam/gen/component/gripper/v1/gripper_pb2.py +48 -35
  175. viam/gen/component/gripper/v1/gripper_pb2.pyi +62 -24
  176. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +28 -2
  177. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +46 -41
  178. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +32 -36
  179. viam/gen/component/motor/v1/motor_grpc.py +51 -2
  180. viam/gen/component/motor/v1/motor_pb2.py +78 -67
  181. viam/gen/component/motor/v1/motor_pb2.pyi +75 -46
  182. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +48 -2
  183. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +70 -63
  184. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +84 -57
  185. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +19 -2
  186. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +26 -21
  187. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +9 -13
  188. viam/gen/component/powersensor/__init__.py +0 -0
  189. viam/gen/component/powersensor/v1/__init__.py +0 -0
  190. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  191. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  192. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  193. viam/gen/component/sensor/v1/sensor_grpc.py +21 -5
  194. viam/gen/component/sensor/v1/sensor_pb2.py +18 -22
  195. viam/gen/component/sensor/v1/sensor_pb2.pyi +1 -69
  196. viam/gen/component/servo/v1/servo_grpc.py +28 -2
  197. viam/gen/component/servo/v1/servo_pb2.py +42 -37
  198. viam/gen/component/servo/v1/servo_pb2.pyi +22 -26
  199. viam/gen/component/switch/__init__.py +0 -0
  200. viam/gen/component/switch/v1/__init__.py +0 -0
  201. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  202. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  203. viam/gen/component/switch/v1/switch_pb2.pyi +116 -0
  204. viam/gen/component/testecho/v1/testecho_grpc.py +15 -0
  205. viam/gen/component/testecho/v1/testecho_pb2.py +29 -26
  206. viam/gen/component/testecho/v1/testecho_pb2.pyi +16 -20
  207. viam/gen/module/v1/module_grpc.py +18 -0
  208. viam/gen/module/v1/module_pb2.py +36 -33
  209. viam/gen/module/v1/module_pb2.pyi +39 -34
  210. viam/gen/opentelemetry/__init__.py +0 -0
  211. viam/gen/opentelemetry/proto/__init__.py +0 -0
  212. viam/gen/opentelemetry/proto/common/__init__.py +0 -0
  213. viam/gen/opentelemetry/proto/common/v1/__init__.py +0 -0
  214. viam/gen/opentelemetry/proto/common/v1/common_grpc.py +0 -0
  215. viam/gen/opentelemetry/proto/common/v1/common_pb2.py +27 -0
  216. viam/gen/opentelemetry/proto/common/v1/common_pb2.pyi +208 -0
  217. viam/gen/opentelemetry/proto/resource/__init__.py +0 -0
  218. viam/gen/opentelemetry/proto/resource/v1/__init__.py +0 -0
  219. viam/gen/opentelemetry/proto/resource/v1/resource_grpc.py +0 -0
  220. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.py +18 -0
  221. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.pyi +59 -0
  222. viam/gen/opentelemetry/proto/trace/__init__.py +0 -0
  223. viam/gen/opentelemetry/proto/trace/v1/__init__.py +0 -0
  224. viam/gen/opentelemetry/proto/trace/v1/trace_grpc.py +0 -0
  225. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.py +37 -0
  226. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.pyi +402 -0
  227. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +12 -0
  228. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +25 -22
  229. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +13 -17
  230. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +12 -0
  231. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +23 -20
  232. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +13 -17
  233. viam/gen/proto/rpc/v1/auth_grpc.py +11 -0
  234. viam/gen/proto/rpc/v1/auth_pb2.py +27 -24
  235. viam/gen/proto/rpc/v1/auth_pb2.pyi +12 -16
  236. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +35 -32
  237. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +37 -41
  238. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +15 -0
  239. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +62 -57
  240. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +78 -69
  241. viam/gen/provisioning/__init__.py +0 -0
  242. viam/gen/provisioning/v1/__init__.py +0 -0
  243. viam/gen/provisioning/v1/provisioning_grpc.py +59 -0
  244. viam/gen/provisioning/v1/provisioning_pb2.py +45 -0
  245. viam/gen/provisioning/v1/provisioning_pb2.pyi +229 -0
  246. viam/gen/robot/v1/robot_grpc.py +144 -15
  247. viam/gen/robot/v1/robot_pb2.py +193 -119
  248. viam/gen/robot/v1/robot_pb2.pyi +565 -137
  249. viam/gen/service/datamanager/v1/data_manager_grpc.py +20 -2
  250. viam/gen/service/datamanager/v1/data_manager_pb2.py +27 -17
  251. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +52 -10
  252. viam/gen/service/discovery/__init__.py +0 -0
  253. viam/gen/service/discovery/v1/__init__.py +0 -0
  254. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  255. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  256. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  257. viam/gen/service/generic/__init__.py +0 -0
  258. viam/gen/service/generic/v1/__init__.py +0 -0
  259. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  260. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  261. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  262. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +9 -0
  263. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +76 -29
  264. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +307 -28
  265. viam/gen/service/motion/v1/motion_grpc.py +42 -4
  266. viam/gen/service/motion/v1/motion_pb2.py +119 -51
  267. viam/gen/service/motion/v1/motion_pb2.pyi +595 -120
  268. viam/gen/service/navigation/v1/navigation_grpc.py +49 -1
  269. viam/gen/service/navigation/v1/navigation_pb2.py +76 -51
  270. viam/gen/service/navigation/v1/navigation_pb2.pyi +188 -33
  271. viam/gen/service/sensors/v1/sensors_grpc.py +12 -0
  272. viam/gen/service/sensors/v1/sensors_pb2.py +60 -29
  273. viam/gen/service/sensors/v1/sensors_pb2.pyi +18 -21
  274. viam/gen/service/shell/v1/shell_grpc.py +27 -1
  275. viam/gen/service/shell/v1/shell_pb2.py +37 -15
  276. viam/gen/service/shell/v1/shell_pb2.pyi +260 -7
  277. viam/gen/service/slam/v1/slam_grpc.py +24 -2
  278. viam/gen/service/slam/v1/slam_pb2.py +44 -30
  279. viam/gen/service/slam/v1/slam_pb2.pyi +128 -27
  280. viam/gen/service/video/__init__.py +0 -0
  281. viam/gen/service/video/v1/__init__.py +0 -0
  282. viam/gen/service/video/v1/video_grpc.py +39 -0
  283. viam/gen/service/video/v1/video_pb2.py +29 -0
  284. viam/gen/service/video/v1/video_pb2.pyi +72 -0
  285. viam/gen/service/vision/v1/vision_grpc.py +39 -1
  286. viam/gen/service/vision/v1/vision_pb2.py +61 -45
  287. viam/gen/service/vision/v1/vision_pb2.pyi +180 -41
  288. viam/gen/service/worldstatestore/__init__.py +0 -0
  289. viam/gen/service/worldstatestore/v1/__init__.py +0 -0
  290. viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
  291. viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
  292. viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
  293. viam/gen/stream/__init__.py +0 -0
  294. viam/gen/stream/v1/__init__.py +0 -0
  295. viam/gen/stream/v1/stream_grpc.py +59 -0
  296. viam/gen/stream/v1/stream_pb2.py +39 -0
  297. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  298. viam/gen/tagger/v1/tagger_pb2.py +9 -8
  299. viam/logging.py +160 -17
  300. viam/media/__init__.py +0 -9
  301. viam/media/audio.py +22 -10
  302. viam/media/utils/__init__.py +0 -0
  303. viam/media/utils/pil/__init__.py +55 -0
  304. viam/media/{viam_rgba_plugin.py → utils/pil/viam_rgba_plugin.py} +10 -16
  305. viam/media/viam_rgba.py +10 -0
  306. viam/media/video.py +197 -73
  307. viam/module/module.py +191 -44
  308. viam/module/resource_data_consumer.py +41 -0
  309. viam/module/service.py +9 -1
  310. viam/module/types.py +4 -5
  311. viam/operations.py +4 -3
  312. viam/proto/app/__init__.py +361 -5
  313. viam/proto/app/agent/__init__.py +28 -0
  314. viam/proto/app/billing.py +51 -27
  315. viam/proto/app/cloudslam/__init__.py +48 -0
  316. viam/proto/app/data/__init__.py +103 -17
  317. viam/proto/app/datapipelines/__init__.py +56 -0
  318. viam/proto/app/dataset/__init__.py +40 -0
  319. viam/proto/app/datasync/__init__.py +11 -5
  320. viam/proto/app/end_user.py +34 -0
  321. viam/proto/app/mlinference/__init__.py +15 -0
  322. viam/proto/app/mltraining/__init__.py +25 -1
  323. viam/proto/app/packages/__init__.py +3 -3
  324. viam/proto/app/robot.py +19 -1
  325. viam/proto/common/__init__.py +35 -8
  326. viam/proto/component/arm/__init__.py +9 -1
  327. viam/proto/component/audioin/__init__.py +16 -0
  328. viam/proto/component/audioinput/__init__.py +3 -1
  329. viam/proto/component/audioout/__init__.py +15 -0
  330. viam/proto/component/base/__init__.py +7 -1
  331. viam/proto/component/board/__init__.py +13 -5
  332. viam/proto/component/button/__init__.py +15 -0
  333. viam/proto/component/camera/__init__.py +9 -1
  334. viam/proto/component/encoder/__init__.py +3 -1
  335. viam/proto/component/gantry/__init__.py +7 -1
  336. viam/proto/component/generic/__init__.py +3 -1
  337. viam/proto/component/gripper/__init__.py +7 -1
  338. viam/proto/component/inputcontroller/__init__.py +7 -1
  339. viam/proto/component/motor/__init__.py +7 -1
  340. viam/proto/component/movementsensor/__init__.py +7 -1
  341. viam/proto/component/posetracker/__init__.py +7 -1
  342. viam/proto/component/powersensor/__init__.py +30 -0
  343. viam/proto/component/sensor/__init__.py +3 -4
  344. viam/proto/component/servo/__init__.py +3 -1
  345. viam/proto/component/switch/__init__.py +26 -0
  346. viam/proto/component/testecho/__init__.py +3 -1
  347. viam/proto/module/__init__.py +3 -1
  348. viam/proto/opentelemetry/__init__.py +0 -0
  349. viam/proto/opentelemetry/proto/__init__.py +0 -0
  350. viam/proto/opentelemetry/proto/common/__init__.py +15 -0
  351. viam/proto/opentelemetry/proto/resource/__init__.py +10 -0
  352. viam/proto/opentelemetry/proto/trace/__init__.py +15 -0
  353. viam/proto/provisioning/__init__.py +42 -0
  354. viam/proto/robot/__init__.py +57 -9
  355. viam/proto/rpc/auth.py +11 -1
  356. viam/proto/rpc/examples/echo/__init__.py +3 -1
  357. viam/proto/rpc/examples/echoresource/__init__.py +7 -1
  358. viam/proto/rpc/webrtc/grpc.py +3 -1
  359. viam/proto/rpc/webrtc/signaling.py +5 -1
  360. viam/proto/service/datamanager/__init__.py +15 -2
  361. viam/proto/service/discovery/__init__.py +15 -0
  362. viam/proto/service/generic/__init__.py +12 -0
  363. viam/proto/service/mlmodel/__init__.py +27 -1
  364. viam/proto/service/motion/__init__.py +35 -5
  365. viam/proto/service/navigation/__init__.py +19 -1
  366. viam/proto/service/sensors/__init__.py +3 -1
  367. viam/proto/service/shell/__init__.py +25 -2
  368. viam/proto/service/slam/__init__.py +13 -1
  369. viam/proto/service/video/__init__.py +15 -0
  370. viam/proto/service/vision/__init__.py +11 -1
  371. viam/proto/service/worldstatestore/__init__.py +32 -0
  372. viam/proto/stream/__init__.py +36 -0
  373. viam/py.typed +0 -0
  374. viam/resource/base.py +45 -8
  375. viam/resource/easy_resource.py +149 -0
  376. viam/resource/manager.py +35 -14
  377. viam/resource/registry.py +40 -52
  378. viam/resource/rpc_client_base.py +33 -1
  379. viam/resource/rpc_service_base.py +15 -8
  380. viam/resource/types.py +39 -26
  381. viam/robot/client.py +458 -91
  382. viam/robot/service.py +13 -107
  383. viam/rpc/dial.py +133 -15
  384. viam/rpc/libviam_rust_utils.so +0 -0
  385. viam/rpc/server.py +59 -15
  386. viam/rpc/types.py +2 -4
  387. viam/services/discovery/__init__.py +12 -0
  388. viam/services/discovery/client.py +55 -0
  389. viam/services/discovery/discovery.py +52 -0
  390. viam/services/discovery/service.py +43 -0
  391. viam/services/generic/__init__.py +18 -0
  392. viam/services/generic/client.py +58 -0
  393. viam/services/generic/generic.py +58 -0
  394. viam/services/generic/service.py +29 -0
  395. viam/services/mlmodel/__init__.py +15 -1
  396. viam/services/mlmodel/client.py +20 -15
  397. viam/services/mlmodel/mlmodel.py +44 -7
  398. viam/services/mlmodel/service.py +9 -13
  399. viam/services/mlmodel/utils.py +101 -0
  400. viam/services/motion/__init__.py +15 -3
  401. viam/services/motion/client.py +109 -150
  402. viam/services/motion/motion.py +380 -0
  403. viam/services/motion/service.py +132 -0
  404. viam/services/navigation/__init__.py +11 -0
  405. viam/services/navigation/client.py +99 -0
  406. viam/services/navigation/navigation.py +250 -0
  407. viam/services/navigation/service.py +137 -0
  408. viam/services/service_base.py +43 -4
  409. viam/services/service_client_base.py +4 -4
  410. viam/services/slam/__init__.py +4 -1
  411. viam/services/slam/client.py +21 -11
  412. viam/services/slam/service.py +16 -19
  413. viam/services/slam/slam.py +66 -5
  414. viam/services/vision/__init__.py +8 -0
  415. viam/services/vision/client.py +115 -111
  416. viam/services/vision/service.py +143 -0
  417. viam/services/vision/vision.py +317 -0
  418. viam/services/worldstatestore/__init__.py +18 -0
  419. viam/services/worldstatestore/client.py +94 -0
  420. viam/services/worldstatestore/service.py +55 -0
  421. viam/services/worldstatestore/worldstatestore.py +90 -0
  422. viam/sessions_client.py +254 -0
  423. viam/streams.py +44 -0
  424. viam/utils.py +143 -15
  425. viam/version_metadata.py +4 -0
  426. viam_sdk-0.66.0.dist-info/METADATA +157 -0
  427. viam_sdk-0.66.0.dist-info/RECORD +531 -0
  428. {viam_sdk-0.3.0.dist-info → viam_sdk-0.66.0.dist-info}/WHEEL +1 -1
  429. viam/components/audio_input/__init__.py +0 -18
  430. viam/components/audio_input/audio_input.py +0 -79
  431. viam/components/audio_input/client.py +0 -60
  432. viam/components/audio_input/service.py +0 -118
  433. viam/components/types.py +0 -5
  434. viam/gen/app/model/v1/model_grpc.py +0 -39
  435. viam/gen/app/model/v1/model_pb2.py +0 -71
  436. viam/gen/app/model/v1/model_pb2.pyi +0 -285
  437. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_grpc.py +0 -21
  438. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.py +0 -18
  439. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.pyi +0 -49
  440. viam/media/media.py +0 -53
  441. viam/proto/app/model/__init__.py +0 -40
  442. viam/proto/rpc/examples/fileupload/__init__.py +0 -13
  443. viam/services/sensors/__init__.py +0 -5
  444. viam/services/sensors/client.py +0 -63
  445. viam_sdk-0.3.0.dist-info/LICENSE +0 -202
  446. viam_sdk-0.3.0.dist-info/METADATA +0 -122
  447. viam_sdk-0.3.0.dist-info/RECORD +0 -372
  448. /viam/{gen/app/model → app}/__init__.py +0 -0
  449. /viam/gen/app/{model/v1 → agent}/__init__.py +0 -0
  450. /viam/gen/{proto/rpc/examples/fileupload → app/agent/v1}/__init__.py +0 -0
  451. /viam/gen/{proto/rpc/examples/fileupload/v1 → app/cloudslam}/__init__.py +0 -0
  452. /LICENSE → /viam_sdk-0.66.0.dist-info/licenses/LICENSE +0 -0
@@ -10,7 +10,7 @@ from grpclib.client import Channel
10
10
  import viam
11
11
  from viam.errors import NotSupportedError
12
12
  from viam.logging import getLogger
13
- from viam.proto.common import DoCommandRequest, DoCommandResponse
13
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
14
14
  from viam.proto.component.inputcontroller import (
15
15
  GetControlsRequest,
16
16
  GetControlsResponse,
@@ -21,8 +21,8 @@ from viam.proto.component.inputcontroller import (
21
21
  StreamEventsResponse,
22
22
  TriggerEventRequest,
23
23
  )
24
- from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
25
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
24
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase, ResourceRPCClientBase
25
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
26
26
 
27
27
  from .input import Control, ControlFunction, Controller, Event, EventType
28
28
 
@@ -43,25 +43,39 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
43
43
  self._callback_extra: Struct = dict_to_struct({})
44
44
  super().__init__(name)
45
45
 
46
- async def get_controls(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> List[Control]:
47
- if extra is None:
48
- extra = {}
46
+ async def get_controls(
47
+ self,
48
+ *,
49
+ extra: Optional[Dict[str, Any]] = None,
50
+ timeout: Optional[float] = None,
51
+ **kwargs,
52
+ ) -> List[Control]:
53
+ md = kwargs.get("metadata", self.Metadata()).proto
49
54
  request = GetControlsRequest(controller=self.name, extra=dict_to_struct(extra))
50
- response: GetControlsResponse = await self.client.GetControls(request, timeout=timeout)
55
+ response: GetControlsResponse = await self.client.GetControls(request, timeout=timeout, metadata=md)
51
56
  return [Control(control) for control in response.controls]
52
57
 
53
- async def get_events(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> Dict[Control, Event]:
54
- if extra is None:
55
- extra = {}
58
+ async def get_events(
59
+ self,
60
+ *,
61
+ extra: Optional[Dict[str, Any]] = None,
62
+ timeout: Optional[float] = None,
63
+ **kwargs,
64
+ ) -> Dict[Control, Event]:
65
+ md = kwargs.get("metadata", self.Metadata()).proto
56
66
  request = GetEventsRequest(controller=self.name, extra=dict_to_struct(extra))
57
- response: GetEventsResponse = await self.client.GetEvents(request, timeout=timeout)
67
+ response: GetEventsResponse = await self.client.GetEvents(request, timeout=timeout, metadata=md)
58
68
  return {Control(event.control): Event.from_proto(event) for (event) in response.events}
59
69
 
60
70
  def register_control_callback(
61
- self, control: Control, triggers: List[EventType], function: Optional[ControlFunction], extra: Optional[Dict[str, Any]] = None
71
+ self,
72
+ control: Control,
73
+ triggers: List[EventType],
74
+ function: Optional[ControlFunction],
75
+ extra: Optional[Dict[str, Any]] = None,
76
+ **kwargs,
62
77
  ):
63
- if extra is None:
64
- extra = {}
78
+ md = kwargs.get("metadata", self.Metadata())
65
79
  self._callback_extra = dict_to_struct(extra)
66
80
  with self._lock:
67
81
  callbacks = self.callbacks.get(control, {})
@@ -82,7 +96,7 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
82
96
  except Exception:
83
97
  LOGGER.exception("Exception raised by task = %r", task)
84
98
 
85
- task = asyncio.create_task(self._stream_events(), name=f"{viam._TASK_PREFIX}-input_stream_events")
99
+ task = asyncio.create_task(self._stream_events(md), name=f"{viam._TASK_PREFIX}-input_stream_events")
86
100
  task.add_done_callback(handle_task_result)
87
101
 
88
102
  def reset_channel(self, channel: Channel):
@@ -92,18 +106,24 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
92
106
  for event_type, func in callback.items():
93
107
  self.register_control_callback(control, [event_type], func)
94
108
 
95
- async def trigger_event(self, event: Event, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None):
96
- if extra is None:
97
- extra = {}
109
+ async def trigger_event(
110
+ self,
111
+ event: Event,
112
+ *,
113
+ extra: Optional[Dict[str, Any]] = None,
114
+ timeout: Optional[float] = None,
115
+ **kwargs,
116
+ ):
117
+ md = kwargs.get("metadata", self.Metadata()).proto
98
118
  request = TriggerEventRequest(controller=self.name, event=event.proto, extra=dict_to_struct(extra))
99
119
  try:
100
- await self.client.TriggerEvent(request, timeout=timeout)
120
+ await self.client.TriggerEvent(request, timeout=timeout, metadata=md)
101
121
  except GRPCError as e:
102
122
  if e.status == Status.UNIMPLEMENTED and ("does not support triggering events" in e.message if e.message else False):
103
123
  raise NotSupportedError(f"Input controller named {self.name} does not support triggering events")
104
124
  raise e
105
125
 
106
- async def _stream_events(self):
126
+ async def _stream_events(self, metadata: ResourceRPCClientBase.Metadata):
107
127
  with self._stream_lock:
108
128
  if self._is_streaming:
109
129
  return
@@ -112,6 +132,7 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
112
132
  if not self.callbacks:
113
133
  return
114
134
 
135
+ md = metadata.proto
115
136
  request = StreamEventsRequest(controller=self.name, events=[], extra=self._callback_extra)
116
137
  with self._lock:
117
138
  for control, callbacks in self.callbacks.items():
@@ -123,7 +144,7 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
123
144
  request.events.append(event)
124
145
 
125
146
  try:
126
- async with self.client.StreamEvents.open() as stream:
147
+ async with self.client.StreamEvents.open(metadata=md) as stream:
127
148
  await stream.send_message(request, end=True)
128
149
  self._send_connection_status(True)
129
150
  reply: StreamEventsResponse
@@ -156,7 +177,18 @@ class ControllerClient(Controller, ReconfigurableResourceRPCClientBase):
156
177
  if all_callback is not None:
157
178
  all_callback(event)
158
179
 
159
- async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None) -> Mapping[str, ValueTypes]:
180
+ async def do_command(
181
+ self,
182
+ command: Mapping[str, ValueTypes],
183
+ *,
184
+ timeout: Optional[float] = None,
185
+ **kwargs,
186
+ ) -> Mapping[str, ValueTypes]:
187
+ md = kwargs.get("metadata", self.Metadata()).proto
160
188
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
161
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
189
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
162
190
  return struct_to_dict(response.result)
191
+
192
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
193
+ md = kwargs.get("metadata", self.Metadata())
194
+ return await get_geometries(self.client, self.name, extra, timeout, md)
@@ -10,7 +10,7 @@ from typing_extensions import Self
10
10
  from viam.components.component_base import ComponentBase
11
11
  from viam.errors import NotSupportedError
12
12
  from viam.proto.component.inputcontroller import Event as PBEvent
13
- from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, Subtype
13
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
14
14
 
15
15
 
16
16
  class EventType(str, Enum):
@@ -135,17 +135,39 @@ class Controller(ComponentBase):
135
135
  Controller is a logical "container" more than an actual device
136
136
  Could be a single gamepad, or a collection of digitalInterrupts
137
137
  and analogReaders, a keyboard, etc.
138
+
139
+ ::
140
+
141
+ from viam.components.input import Control, Controller, EventType
142
+
143
+ For more information, see `Input Controller component <https://docs.viam.com/dev/reference/apis/components/input-controller/>`_.
138
144
  """
139
145
 
140
- SUBTYPE: Final = Subtype(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "input_controller")
146
+ API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
147
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "input_controller"
148
+ )
141
149
 
142
150
  @abc.abstractmethod
143
151
  async def get_controls(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Control]:
144
152
  """
145
153
  Returns a list of Controls provided by the Controller
146
154
 
155
+ ::
156
+
157
+ # Get the controller from the machine.
158
+ my_controller = Controller.from_robot(
159
+ robot=machine, "my_controller")
160
+
161
+ # Get the list of Controls provided by the controller.
162
+ controls = await my_controller.get_controls()
163
+
164
+ # Print the list of Controls provided by the controller.
165
+ print(f"Controls: {controls}")
166
+
147
167
  Returns:
148
168
  List[Control]: List of controls provided by the Controller
169
+
170
+ For more information, see `Input Controller component <https://docs.viam.com/dev/reference/apis/components/input-controller/#getcontrols>`_.
149
171
  """
150
172
  ...
151
173
 
@@ -157,8 +179,22 @@ class Controller(ComponentBase):
157
179
  Returns the most recent Event for each input
158
180
  (which should be the current state)
159
181
 
182
+ ::
183
+
184
+ # Get the controller from the machine.
185
+ my_controller = Controller.from_robot(
186
+ robot=machine, "my_controller")
187
+
188
+ # Get the most recent Event for each Control.
189
+ recent_events = await my_controller.get_events()
190
+
191
+ # Print out the most recent Event for each Control.
192
+ print(f"Recent Events: {recent_events}")
193
+
160
194
  Returns:
161
195
  Dict[Control, Event]: The most recent event for each input
196
+
197
+ For more information, see `Input Controller component <https://docs.viam.com/dev/reference/apis/components/input-controller/#getevents>`_.
162
198
  """
163
199
  ...
164
200
 
@@ -176,19 +212,86 @@ class Controller(ComponentBase):
176
212
  Register a function that will fire on given EventTypes for a given
177
213
  Control
178
214
 
215
+ ::
216
+
217
+ from viam.components.input import Control, EventType
218
+
219
+ # Define a function to handle pressing the Start Menu Button "BUTTON_START" on
220
+ # your controller, printing out the start time.
221
+ def print_start_time(event):
222
+ print(f"Start Menu Button was pressed at this time: {event.time}")
223
+
224
+
225
+ # Define a function that handles the controller.
226
+ async def handle_controller(controller):
227
+ # Get the list of Controls on the controller.
228
+ controls = await controller.get_controls()
229
+
230
+ # If the "BUTTON_START" Control is found, register the function
231
+ # print_start_time to fire when "BUTTON_START" has the event "ButtonPress"
232
+ # occur.
233
+ if Control.BUTTON_START in controls:
234
+ controller.register_control_callback(
235
+ Control.BUTTON_START, [EventType.BUTTON_PRESS], print_start_time)
236
+ else:
237
+ print("Oops! Couldn't find the start button control! Is your "
238
+ "controller connected?")
239
+ exit()
240
+
241
+ while True:
242
+ await asyncio.sleep(1.0)
243
+
244
+
245
+ async def main():
246
+ # ... < INSERT CONNECTION CODE FROM MACHINE'S CONNECT TAB >
247
+
248
+ # Get your controller from the machine.
249
+ my_controller = Controller.from_robot(
250
+ robot=machine, "my_controller")
251
+
252
+ # Run the handleController function.
253
+ await handle_controller(my_controller)
254
+
255
+ # ... < INSERT ANY OTHER CODE FOR MAIN FUNCTION >
256
+
179
257
  Args:
180
258
  control (Control): The control to register the function for
181
259
  triggers (List[EventType]): The events that will
182
260
  trigger the function
183
261
  function (ControlFunction): The function to run on
184
262
  specific triggers
263
+
264
+ For more information, see `Input Controller component <https://docs.viam.com/dev/reference/apis/components/input-controller/#registercontrolcallback>`_.
185
265
  """
186
266
  ...
187
267
 
188
- async def trigger_event(self, event: Event, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs):
268
+ async def trigger_event(
269
+ self,
270
+ event: Event,
271
+ *,
272
+ extra: Optional[Dict[str, Any]] = None,
273
+ timeout: Optional[float] = None,
274
+ **kwargs,
275
+ ) -> None: # Explicitly return None for typechecking, as this is technically a NoReturn default implementation
189
276
  """Directly send an Event (such as a button press) from external code
190
277
 
278
+ ::
279
+
280
+ # Get your controller from the machine.
281
+ my_controller = Controller.from_robot(
282
+ robot=machine, "my_controller")
283
+
284
+ # Define a "Button is Pressed" event for the control BUTTON_START.
285
+ button_is_pressed_event = Event(
286
+ time(), EventType.BUTTON_PRESS, Control.BUTTON_START, 1.0)
287
+
288
+ # Trigger the event on your controller. Set this trigger to timeout if it has
289
+ # not completed in 7 seconds.
290
+ await my_controller.trigger_event(event=button_is_pressed_event, timeout=7.0)
291
+
191
292
  Args:
192
293
  event (Event): The event to trigger
294
+
295
+ For more information, see `Input Controller component <https://docs.viam.com/dev/reference/apis/components/input-controller/#triggerevent>`_.
193
296
  """
194
297
  raise NotSupportedError(f"Input controller named {self.name} does not support triggering events")
@@ -6,8 +6,8 @@ from grpclib.server import Stream
6
6
  from h2.exceptions import StreamClosedError
7
7
 
8
8
  import viam
9
- from viam.errors import NotSupportedError, ResourceNotFoundError
10
- from viam.proto.common import DoCommandRequest, DoCommandResponse
9
+ from viam.errors import NotSupportedError
10
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
11
11
  from viam.proto.component.inputcontroller import (
12
12
  GetControlsRequest,
13
13
  GetControlsResponse,
@@ -38,10 +38,7 @@ class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBa
38
38
  request = await stream.recv_message()
39
39
  assert request is not None
40
40
  name = request.controller
41
- try:
42
- controller = self.get_resource(name)
43
- except ResourceNotFoundError as e:
44
- raise e.grpc_error
41
+ controller = self.get_resource(name)
45
42
  timeout = stream.deadline.time_remaining() if stream.deadline else None
46
43
  controls = await controller.get_controls(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
47
44
  response = GetControlsResponse(controls=[c.value for c in controls])
@@ -51,10 +48,7 @@ class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBa
51
48
  request = await stream.recv_message()
52
49
  assert request is not None
53
50
  name = request.controller
54
- try:
55
- controller = self.get_resource(name)
56
- except ResourceNotFoundError as e:
57
- raise e.grpc_error
51
+ controller = self.get_resource(name)
58
52
  timeout = stream.deadline.time_remaining() if stream.deadline else None
59
53
  events = await controller.get_events(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
60
54
  pb_events = [e.proto for e in events.values()]
@@ -65,10 +59,7 @@ class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBa
65
59
  request = await stream.recv_message()
66
60
  assert request is not None
67
61
  name = request.controller
68
- try:
69
- controller = self.get_resource(name)
70
- except ResourceNotFoundError as e:
71
- raise e.grpc_error
62
+ controller = self.get_resource(name)
72
63
 
73
64
  loop = asyncio.get_running_loop()
74
65
  # Using Pipes to send event data back to this function so it can be streamed to clients
@@ -154,13 +145,11 @@ class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBa
154
145
  assert request is not None
155
146
  name = request.controller
156
147
  timeout = stream.deadline.time_remaining() if stream.deadline else None
148
+ controller = self.get_resource(name)
157
149
  try:
158
- controller = self.get_resource(name)
159
150
  pb_event = request.event
160
151
  event = Event.from_proto(pb_event)
161
152
  await controller.trigger_event(event, extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
162
- except ResourceNotFoundError as e:
163
- raise e.grpc_error
164
153
  except NotSupportedError as e:
165
154
  raise e.grpc_error
166
155
 
@@ -170,11 +159,17 @@ class InputControllerRPCService(InputControllerServiceBase, ResourceRPCServiceBa
170
159
  async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
171
160
  request = await stream.recv_message()
172
161
  assert request is not None
173
- try:
174
- controller = self.get_resource(request.name)
175
- except ResourceNotFoundError as e:
176
- raise e.grpc_error
162
+ controller = self.get_resource(request.name)
177
163
  timeout = stream.deadline.time_remaining() if stream.deadline else None
178
164
  result = await controller.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
179
165
  response = DoCommandResponse(result=dict_to_struct(result))
180
166
  await stream.send_message(response)
167
+
168
+ async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
169
+ request = await stream.recv_message()
170
+ assert request is not None
171
+ arm = self.get_resource(request.name)
172
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
173
+ geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
174
+ response = GetGeometriesResponse(geometries=geometries)
175
+ await stream.send_message(response)
@@ -1,9 +1,4 @@
1
- import asyncio
2
-
3
- from viam.proto.component.motor import Status as MotorStatus
4
- from viam.proto.robot import Status
5
1
  from viam.resource.registry import Registry, ResourceRegistration
6
- from viam.utils import message_to_struct
7
2
 
8
3
  from .client import MotorClient
9
4
  from .motor import Motor
@@ -13,19 +8,4 @@ __all__ = [
13
8
  "Motor",
14
9
  ]
15
10
 
16
-
17
- async def create_status(component: Motor) -> Status:
18
- ((is_powered, _), position, is_moving) = await asyncio.gather(
19
- component.is_powered(),
20
- component.get_position(),
21
- component.is_moving(),
22
- )
23
- s = MotorStatus(
24
- is_powered=is_powered,
25
- position=position,
26
- is_moving=is_moving,
27
- )
28
- return Status(name=Motor.get_resource_name(component.name), status=message_to_struct(s))
29
-
30
-
31
- Registry.register_subtype(ResourceRegistration(Motor, MotorRPCService, lambda name, channel: MotorClient(name, channel), create_status))
11
+ Registry.register_api(ResourceRegistration(Motor, MotorRPCService, lambda name, channel: MotorClient(name, channel)))
@@ -1,8 +1,8 @@
1
- from typing import Any, Dict, Mapping, Optional, Tuple
1
+ from typing import Any, Dict, List, Mapping, Optional, Tuple
2
2
 
3
3
  from grpclib.client import Channel
4
4
 
5
- from viam.proto.common import DoCommandRequest, DoCommandResponse
5
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
6
6
  from viam.proto.component.motor import (
7
7
  GetPositionRequest,
8
8
  GetPositionResponse,
@@ -17,10 +17,11 @@ from viam.proto.component.motor import (
17
17
  MotorServiceStub,
18
18
  ResetZeroPositionRequest,
19
19
  SetPowerRequest,
20
+ SetRPMRequest,
20
21
  StopRequest,
21
22
  )
22
23
  from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
23
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
24
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
24
25
 
25
26
  from .motor import Motor
26
27
 
@@ -41,11 +42,11 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
41
42
  *,
42
43
  extra: Optional[Dict[str, Any]] = None,
43
44
  timeout: Optional[float] = None,
45
+ **kwargs,
44
46
  ):
45
- if extra is None:
46
- extra = {}
47
+ md = kwargs.get("metadata", self.Metadata()).proto
47
48
  request = SetPowerRequest(name=self.name, power_pct=power, extra=dict_to_struct(extra))
48
- await self.client.SetPower(request, timeout=timeout)
49
+ await self.client.SetPower(request, timeout=timeout, metadata=md)
49
50
 
50
51
  async def go_for(
51
52
  self,
@@ -54,11 +55,11 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
54
55
  *,
55
56
  extra: Optional[Dict[str, Any]] = None,
56
57
  timeout: Optional[float] = None,
58
+ **kwargs,
57
59
  ):
58
- if extra is None:
59
- extra = {}
60
+ md = kwargs.get("metadata", self.Metadata()).proto
60
61
  request = GoForRequest(name=self.name, rpm=rpm, revolutions=revolutions, extra=dict_to_struct(extra))
61
- await self.client.GoFor(request, timeout=timeout)
62
+ await self.client.GoFor(request, timeout=timeout, metadata=md)
62
63
 
63
64
  async def go_to(
64
65
  self,
@@ -67,11 +68,23 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
67
68
  *,
68
69
  extra: Optional[Dict[str, Any]] = None,
69
70
  timeout: Optional[float] = None,
71
+ **kwargs,
70
72
  ):
71
- if extra is None:
72
- extra = {}
73
+ md = kwargs.get("metadata", self.Metadata()).proto
73
74
  request = GoToRequest(name=self.name, rpm=rpm, position_revolutions=position_revolutions, extra=dict_to_struct(extra))
74
- await self.client.GoTo(request, timeout=timeout)
75
+ await self.client.GoTo(request, timeout=timeout, metadata=md)
76
+
77
+ async def set_rpm(
78
+ self,
79
+ rpm: float,
80
+ *,
81
+ extra: Optional[Dict[str, Any]] = None,
82
+ timeout: Optional[float] = None,
83
+ **kwargs,
84
+ ):
85
+ md = kwargs.get("metadata", self.Metadata()).proto
86
+ request = SetRPMRequest(name=self.name, rpm=rpm, extra=dict_to_struct(extra))
87
+ await self.client.SetRPM(request, timeout=timeout, metadata=md)
75
88
 
76
89
  async def reset_zero_position(
77
90
  self,
@@ -79,22 +92,22 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
79
92
  *,
80
93
  extra: Optional[Dict[str, Any]] = None,
81
94
  timeout: Optional[float] = None,
95
+ **kwargs,
82
96
  ):
83
- if extra is None:
84
- extra = {}
97
+ md = kwargs.get("metadata", self.Metadata()).proto
85
98
  request = ResetZeroPositionRequest(name=self.name, offset=offset, extra=dict_to_struct(extra))
86
- await self.client.ResetZeroPosition(request, timeout=timeout)
99
+ await self.client.ResetZeroPosition(request, timeout=timeout, metadata=md)
87
100
 
88
101
  async def get_position(
89
102
  self,
90
103
  *,
91
104
  extra: Optional[Dict[str, Any]] = None,
92
105
  timeout: Optional[float] = None,
106
+ **kwargs,
93
107
  ) -> float:
94
- if extra is None:
95
- extra = {}
108
+ md = kwargs.get("metadata", self.Metadata()).proto
96
109
  request = GetPositionRequest(name=self.name, extra=dict_to_struct(extra))
97
- response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout)
110
+ response: GetPositionResponse = await self.client.GetPosition(request, timeout=timeout, metadata=md)
98
111
  return response.position
99
112
 
100
113
  async def get_properties(
@@ -102,11 +115,11 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
102
115
  *,
103
116
  extra: Optional[Dict[str, Any]] = None,
104
117
  timeout: Optional[float] = None,
118
+ **kwargs,
105
119
  ) -> Motor.Properties:
106
- if extra is None:
107
- extra = {}
120
+ md = kwargs.get("metadata", self.Metadata()).proto
108
121
  request = GetPropertiesRequest(name=self.name, extra=dict_to_struct(extra))
109
- response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout)
122
+ response: GetPropertiesResponse = await self.client.GetProperties(request, timeout=timeout, metadata=md)
110
123
  return Motor.Properties(position_reporting=response.position_reporting)
111
124
 
112
125
  async def stop(
@@ -114,32 +127,42 @@ class MotorClient(Motor, ReconfigurableResourceRPCClientBase):
114
127
  *,
115
128
  extra: Optional[Dict[str, Any]] = None,
116
129
  timeout: Optional[float] = None,
130
+ **kwargs,
117
131
  ):
118
- if extra is None:
119
- extra = {}
132
+ md = kwargs.get("metadata", self.Metadata()).proto
120
133
  request = StopRequest(name=self.name, extra=dict_to_struct(extra))
121
- await self.client.Stop(request, timeout=timeout)
134
+ await self.client.Stop(request, timeout=timeout, metadata=md)
122
135
 
123
136
  async def is_powered(
124
137
  self,
125
138
  *,
126
139
  extra: Optional[Dict[str, Any]] = None,
127
140
  timeout: Optional[float] = None,
141
+ **kwargs,
128
142
  ) -> Tuple[bool, float]:
129
- if extra is None:
130
- extra = {}
143
+ md = kwargs.get("metadata", self.Metadata()).proto
131
144
  request = IsPoweredRequest(name=self.name, extra=dict_to_struct(extra))
132
- response: IsPoweredResponse = await self.client.IsPowered(request, timeout=timeout)
145
+ response: IsPoweredResponse = await self.client.IsPowered(request, timeout=timeout, metadata=md)
133
146
  return response.is_on, response.power_pct
134
147
 
135
- async def is_moving(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> bool:
136
- if extra is None:
137
- extra = {}
148
+ async def is_moving(self, *, timeout: Optional[float] = None, **kwargs) -> bool:
149
+ md = kwargs.get("metadata", self.Metadata()).proto
138
150
  request = IsMovingRequest(name=self.name)
139
- response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout)
151
+ response: IsMovingResponse = await self.client.IsMoving(request, timeout=timeout, metadata=md)
140
152
  return response.is_moving
141
153
 
142
- async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None) -> Mapping[str, ValueTypes]:
154
+ async def do_command(
155
+ self,
156
+ command: Mapping[str, ValueTypes],
157
+ *,
158
+ timeout: Optional[float] = None,
159
+ **kwargs,
160
+ ) -> Mapping[str, ValueTypes]:
161
+ md = kwargs.get("metadata", self.Metadata()).proto
143
162
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
144
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
163
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
145
164
  return struct_to_dict(response.result)
165
+
166
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
167
+ md = kwargs.get("metadata", self.Metadata())
168
+ return await get_geometries(self.client, self.name, extra, timeout, md)