benchlab-pytools 3.0.2__tar.gz → 3.0.3__tar.gz

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 (206) hide show
  1. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/CHANGELOG.md +25 -0
  2. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/PKG-INFO +1 -1
  3. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/__init__.py +1 -1
  4. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/datasource.py +58 -4
  5. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/mqtt_publisher.py +30 -1
  6. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/config.py +4 -1
  7. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/.flake8 +0 -0
  8. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/.gitignore +0 -0
  9. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/CONTRIBUTING.md +0 -0
  10. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/LICENSE +0 -0
  11. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/README.md +0 -0
  12. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/__main__.py +0 -0
  13. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/bootstrap.py +0 -0
  14. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/README.md +0 -0
  15. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/__init__.py +0 -0
  16. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/config_client.py +0 -0
  17. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/config_manager.py +0 -0
  18. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/config_tool.py +0 -0
  19. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/diff.py +0 -0
  20. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/examples/complete_config.json +0 -0
  21. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/examples/rgb_lighting.json +0 -0
  22. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/examples/simple_fan.json +0 -0
  23. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/schema.py +0 -0
  24. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/test_config_client.py +0 -0
  25. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/test_config_manager.py +0 -0
  26. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/config/test_diff.py +0 -0
  27. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/README.md +0 -0
  28. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/__init__.py +0 -0
  29. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/config.py +0 -0
  30. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/datasource_manager.py +0 -0
  31. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/device_registry.py +0 -0
  32. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/discovery.py +0 -0
  33. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/infrastructure.py +0 -0
  34. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/process_manager.py +0 -0
  35. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/retry.py +0 -0
  36. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/shared_serial.py +0 -0
  37. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/core/statistics.py +0 -0
  38. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/README.md +0 -0
  39. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/__init__.py +0 -0
  40. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/csv_logger_enhanced.py +0 -0
  41. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/message_batcher.py +0 -0
  42. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/requirements.txt +0 -0
  43. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/csv_log/smart_retry.py +0 -0
  44. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/README.md +0 -0
  45. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/__init__.py +0 -0
  46. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/app.py +0 -0
  47. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/requirements.txt +0 -0
  48. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/runner.py +0 -0
  49. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/test_graph.py +0 -0
  50. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/graph/ui.py +0 -0
  51. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/hwinfo/README.md +0 -0
  52. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/hwinfo/__init__.py +0 -0
  53. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/hwinfo/hwinfo_export.py +0 -0
  54. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/hwinfo/requirements.txt +0 -0
  55. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/hwinfo/test_hwinfo_export.py +0 -0
  56. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/launcher.py +0 -0
  57. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/link/.env.EXAMPLE +0 -0
  58. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/link/README.md +0 -0
  59. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/link/__init__.py +0 -0
  60. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/link/link_main.py +0 -0
  61. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/link/test_link_main.py +0 -0
  62. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/main.py +0 -0
  63. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/menu.py +0 -0
  64. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/menu_classic.py +0 -0
  65. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/README.md +0 -0
  66. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/__init__.py +0 -0
  67. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/mqtt.config_template +0 -0
  68. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/requirements.txt +0 -0
  69. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/mqtt/test_mqtt_publisher.py +0 -0
  70. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/prefs.py +0 -0
  71. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/requirements.txt +0 -0
  72. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/.env.example +0 -0
  73. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/__init__.py +0 -0
  74. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/favicon.ico +0 -0
  75. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/readme.md +0 -0
  76. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/requirements.txt +0 -0
  77. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/telemetry_api.py +0 -0
  78. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/restapi/test_server.py +0 -0
  79. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/sources.py +0 -0
  80. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tools.py +0 -0
  81. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/README.md +0 -0
  82. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/__init__.py +0 -0
  83. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/requirements.txt +0 -0
  84. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/test_tui_core.py +0 -0
  85. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/test_tui_main.py +0 -0
  86. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/tui_core.py +0 -0
  87. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/tui/tui_main.py +0 -0
  88. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/README.md +0 -0
  89. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/NOTICE.md +0 -0
  90. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/README.md +0 -0
  91. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/Running_from_source_on_linux.md +0 -0
  92. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/__init__.py +0 -0
  93. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/assets/vu1_hello_world.png +0 -0
  94. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/community_applications.md +0 -0
  95. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/config.yaml +0 -0
  96. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/database.py +0 -0
  97. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/dial_driver.py +0 -0
  98. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/dials/Comms_Hub_Gauge.py +0 -0
  99. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/dials/Comms_Hub_Server.py +0 -0
  100. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/dials/__init__.py +0 -0
  101. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/dials/base_logger.py +0 -0
  102. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/installer/inc/icon.ico +0 -0
  103. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/installer/install.nsi +0 -0
  104. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/make_version.py +0 -0
  105. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/pylintrc +0 -0
  106. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/requirements.txt +0 -0
  107. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/serial_driver.py +0 -0
  108. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/server.py +0 -0
  109. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/server_config.py +0 -0
  110. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/server_dial_handler.py +0 -0
  111. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/vu_notifications.py +0 -0
  112. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/android-chrome-192x192.png +0 -0
  113. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/android-chrome-512x512.png +0 -0
  114. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/apple-touch-icon.png +0 -0
  115. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/demo.css +0 -0
  116. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/demo.min.css +0 -0
  117. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/demo.rtl.css +0 -0
  118. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/demo.rtl.min.css +0 -0
  119. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.css +0 -0
  120. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.min.css +0 -0
  121. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.css +0 -0
  122. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.min.css +0 -0
  123. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.css +0 -0
  124. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.min.css +0 -0
  125. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.css +0 -0
  126. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.min.css +0 -0
  127. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-social.css +0 -0
  128. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-social.min.css +0 -0
  129. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.css +0 -0
  130. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.min.css +0 -0
  131. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.css +0 -0
  132. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.min.css +0 -0
  133. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.css +0 -0
  134. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.min.css +0 -0
  135. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler.css +0 -0
  136. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler.min.css +0 -0
  137. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.css +0 -0
  138. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.min.css +0 -0
  139. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/css/theme.min.css +0 -0
  140. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/img/header.png +0 -0
  141. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/img/logo.png +0 -0
  142. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/dark-theme.js +0 -0
  143. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/dark-theme.min.js +0 -0
  144. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/demo.js +0 -0
  145. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/demo.min.js +0 -0
  146. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/jquery.min.js +0 -0
  147. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/tabler.esm.js +0 -0
  148. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/tabler.esm.min.js +0 -0
  149. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/tabler.js +0 -0
  150. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/tabler.min.js +0 -0
  151. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_api.js +0 -0
  152. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_api_key_settings.js +0 -0
  153. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_api_keys.js +0 -0
  154. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_dial.js +0 -0
  155. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_home.js +0 -0
  156. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_root.js +0 -0
  157. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/favicon-16x16.png +0 -0
  158. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/favicon-32x32.png +0 -0
  159. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/favicon.ico +0 -0
  160. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/favicon.png +0 -0
  161. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/index.html +0 -0
  162. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/api_keys.html +0 -0
  163. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/dial.html +0 -0
  164. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/footer.html +0 -0
  165. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/header.html +0 -0
  166. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/key_settings.html +0 -0
  167. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/VU-Server/www/views/start.html +0 -0
  168. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/__init__.py +0 -0
  169. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/assets/Barlow-Bold.ttf +0 -0
  170. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/assets/bl_dial_144x200.png +0 -0
  171. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/assets/bl_logo_144x200.png +0 -0
  172. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/devices.py +0 -0
  173. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/requirements.txt +0 -0
  174. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/sensors.py +0 -0
  175. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/test_devices.py +0 -0
  176. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/test_vu_server_config.py +0 -0
  177. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/test_vu_server_manager.py +0 -0
  178. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/test_vu_tui.py +0 -0
  179. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_dial.config_template +0 -0
  180. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_logo_gen.py +0 -0
  181. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_server.config_template +0 -0
  182. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_server_config.py +0 -0
  183. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_server_manager.py +0 -0
  184. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_tui.py +0 -0
  185. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/vu/vu_updater.py +0 -0
  186. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/README.md +0 -0
  187. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/__init__.py +0 -0
  188. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/assets/Inter-Bold.ttf +0 -0
  189. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/assets/Inter.ttf +0 -0
  190. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/assets/benchlab.png +0 -0
  191. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_fleet.py +0 -0
  192. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_graph.py +0 -0
  193. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_overview.py +0 -0
  194. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_telemetry.py +0 -0
  195. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_ui.py +0 -0
  196. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/benchlab_utils.py +0 -0
  197. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/requirements.txt +0 -0
  198. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/test_wigidash.py +0 -0
  199. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/wigidash_device.py +0 -0
  200. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/wigidash_manager.py +0 -0
  201. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/wigidash_session.py +0 -0
  202. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/wigidash_usb.py +0 -0
  203. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab/wigidash/wigidash_widget.py +0 -0
  204. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/benchlab.py +0 -0
  205. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/pyproject.toml +0 -0
  206. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.3}/pytest.ini +0 -0
@@ -4,6 +4,30 @@ All notable changes to BENCHLAB PyTools are documented here. Format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows
5
5
  [SemVer](https://semver.org/).
6
6
 
7
+ ## [3.0.3] - 2026-08-18
8
+
9
+ ### Fixed
10
+ - TUI: the 12VHPWR tab's Voltage section was cut off with no way to
11
+ scroll, since `MIN_TERMINAL_ROWS` (35) was well under the ~48 rows
12
+ the stacked Power/Current/Voltage layout plus status bar actually
13
+ needs. Raised to 48.
14
+ - `mqtt`, `service_http`, and `named_pipe` data sources never surfaced
15
+ `vendor_id`/`product_id`/`firmware_version`, so the Fleet TUI's
16
+ Model column (BL1 vs BL2 detection) was always wrong for these
17
+ sources:
18
+ - `mqtt`: the publisher's retained info payload only sent
19
+ `uid`/`com_port`/`firmware`; it now also reads
20
+ `ProductId`/`VendorId`/`FwVersion` via `read_device()` and
21
+ computes `variant`.
22
+ - `named_pipe`: the C# service's camelCase `productId` is now
23
+ mapped to the PascalCase keys the TUI expects
24
+ (`vendorId`/`firmwareVersion` also mapped), with `variant`
25
+ computed — field names verified against the
26
+ `BENCHLAB.BENCHLAB_Service` source.
27
+ - `service_http`: added a device-info normalization step (the C#
28
+ HTTP API only ever sends `productId`, confirmed against source —
29
+ vendor/firmware are unavailable there and default to unknown).
30
+
7
31
  ## [3.0.2] - 2026-08-18
8
32
 
9
33
  ### Fixed
@@ -67,6 +91,7 @@ export, MQTT publisher, VU dials, WigiDash, and config import/export tools,
67
91
  sharing a common data-source layer (direct serial, FastAPI, MQTT, named
68
92
  pipe, service HTTP).
69
93
 
94
+ [3.0.3]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.2...v3.0.3
70
95
  [3.0.2]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.1...v3.0.2
71
96
  [3.0.1]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.0...v3.0.1
72
97
  [3.0.0]: https://github.com/BenchLab-io/benchlab-pytools/compare/v0.8.2...v3.0.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: benchlab-pytools
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Summary: Python control suite for BENCHLAB telemetry devices
5
5
  Project-URL: Homepage, https://benchlab.io/
6
6
  Project-URL: Repository, https://github.com/BenchLab-io/benchlab-pytools
@@ -2,4 +2,4 @@
2
2
  BENCHLAB Telemetry Package
3
3
  """
4
4
 
5
- __version__ = "3.0.2"
5
+ __version__ = "3.0.3"
@@ -595,7 +595,15 @@ class MQTTDataSource(DataSource):
595
595
 
596
596
  with self._lock:
597
597
  return [
598
- {'uid': uid, 'port': info.get('com_port', 'unknown')}
598
+ {
599
+ 'uid': uid,
600
+ 'port': info.get('com_port', 'unknown'),
601
+ 'firmware': info.get('firmware', '?'),
602
+ 'variant': info.get('variant'),
603
+ 'VendorId': info.get('VendorId', 0),
604
+ 'ProductId': info.get('ProductId', 0),
605
+ 'FwVersion': info.get('FwVersion', 0),
606
+ }
599
607
  for uid, info in self._device_info.items()
600
608
  ]
601
609
 
@@ -729,6 +737,34 @@ def _normalise_cs_telemetry(sensors_raw: list) -> Dict[str, Any]:
729
737
  return result
730
738
 
731
739
 
740
+ def _normalise_cs_device_info(d: Dict[str, Any]) -> Dict[str, Any]:
741
+ """Normalise a C# service device dict into the shape the TUI expects.
742
+
743
+ The C# service's /devices, /device/{uid}/info, and discovery-pipe
744
+ responses use camelCase keys (productId, vendorId, firmwareVersion —
745
+ confirmed against BenchlabSensorWorker.cs/HttpApiServer.cs in the
746
+ BENCHLAB_Service repo). Note the HTTP API's /devices and
747
+ /device/{uid}/info endpoints only send productId — no vendorId or
748
+ firmwareVersion — so those default to 0 there; only the named-pipe
749
+ discovery/GetServiceInfo responses include all three.
750
+ DirectDataSource/FastAPIDataSource populate PascalCase keys
751
+ (ProductId, VendorId, FwVersion) plus a computed 'variant' — this
752
+ adds those same keys without discarding what the C# service sent.
753
+ """
754
+ result = dict(d)
755
+ product_id = d.get("ProductId", d.get("productId", 0))
756
+ vendor_id = d.get("VendorId", d.get("vendorId", 0))
757
+ fw_version = d.get("FwVersion", d.get("firmwareVersion", 0))
758
+ result["ProductId"] = product_id
759
+ result["VendorId"] = vendor_id
760
+ result["FwVersion"] = fw_version
761
+ result.setdefault("firmware", d.get("firmware", fw_version))
762
+ # 0x11 = BENCHLAB_BL2_PRODUCT_ID (see DirectDataSource/tui_core.py).
763
+ result.setdefault(
764
+ "variant", "BL2" if product_id == 0x11 else "ORIGINAL")
765
+ return result
766
+
767
+
732
768
  class NamedPipeDataSource(DataSource):
733
769
  """Data source that connects to the C# BenchLab Windows service via
734
770
  named pipes.
@@ -792,14 +828,31 @@ class NamedPipeDataSource(DataSource):
792
828
  self._pipe_names.clear()
793
829
  for d in devices:
794
830
  uid = d.get("guid") or d.get("deviceName", "unknown")
831
+ # Field names confirmed against BenchlabSensorWorker.cs's
832
+ # ListDevices response in the BENCHLAB_Service repo.
833
+ product_id = d.get("productId", 0)
834
+ vendor_id = d.get("vendorId", 0)
835
+ fw_version = d.get("firmwareVersion", 0)
836
+ # 0x11 = BENCHLAB_BL2_PRODUCT_ID (see
837
+ # DirectDataSource/tui_core.py); hardcoded rather than
838
+ # importing benchlab_pycore, which named_pipe consumers
839
+ # of the C# service don't necessarily have installed.
840
+ variant = "BL2" if product_id == 0x11 else "ORIGINAL"
795
841
  self._devices[uid] = {
796
842
  "uid": uid,
797
843
  "port": d.get("port", "unknown"),
798
844
  "name": d.get("deviceName", "unknown"),
799
- "productId": d.get("productId", 0),
845
+ "productId": product_id,
800
846
  "status": d.get("status", "unknown"),
801
847
  "sensorCount": d.get("sensorCount", 0),
802
848
  "pipeName": d.get("pipeName", ""),
849
+ # PascalCase aliases matching DirectDataSource's shape,
850
+ # so consumers (e.g. the TUI) can detect BL1/BL2.
851
+ "firmware": fw_version,
852
+ "variant": variant,
853
+ "VendorId": vendor_id,
854
+ "ProductId": product_id,
855
+ "FwVersion": fw_version,
803
856
  }
804
857
  self._pipe_names[uid] = d.get("pipeName", "")
805
858
 
@@ -1041,7 +1094,7 @@ class ServiceHttpDataSource(DataSource):
1041
1094
  for d in devices:
1042
1095
  uid = d.get("uid", "")
1043
1096
  if uid:
1044
- self._devices[uid] = d
1097
+ self._devices[uid] = _normalise_cs_device_info(d)
1045
1098
 
1046
1099
  self._connected = True
1047
1100
  self._stop_event.clear()
@@ -1146,7 +1199,8 @@ class ServiceHttpDataSource(DataSource):
1146
1199
  for d in devices:
1147
1200
  uid = d.get("uid", "")
1148
1201
  if uid:
1149
- self._devices[uid] = d
1202
+ self._devices[uid] = (
1203
+ _normalise_cs_device_info(d))
1150
1204
 
1151
1205
  # Poll telemetry for each device
1152
1206
  with self._lock:
@@ -17,6 +17,11 @@ from benchlab_pycore.core import (
17
17
  read_device,
18
18
  BENCHLAB_ORIGINAL_PRODUCT_ID,
19
19
  )
20
+ try:
21
+ from benchlab_pycore.core import BENCHLAB_BL2_PRODUCT_ID
22
+ except ImportError:
23
+ from benchlab_pycore.core import (
24
+ BENCHLAB_CFE_PRODUCT_ID as BENCHLAB_BL2_PRODUCT_ID)
20
25
  from benchlab_pycore.core.serial_io import get_fleet_info
21
26
 
22
27
  # Import DeviceRegistry so the MQTT publisher publishes device lifecycle events
@@ -340,12 +345,36 @@ def device_thread(device, cfg, publish_interval=1):
340
345
  time.sleep(1)
341
346
  continue
342
347
 
348
+ # Read device info (ProductId/VendorId/FwVersion) so the
349
+ # info payload lets consumers (e.g. the TUI) detect the
350
+ # BL1/BL2 variant, matching DirectDataSource's shape.
351
+ vendor_id = 0
352
+ product_id = BENCHLAB_ORIGINAL_PRODUCT_ID
353
+ fw_version = device.get("firmware")
354
+ try:
355
+ dev_info = read_device(ser)
356
+ if dev_info:
357
+ vendor_id = dev_info.get('VendorId', 0)
358
+ product_id = dev_info.get(
359
+ 'ProductId', BENCHLAB_ORIGINAL_PRODUCT_ID)
360
+ fw_version = dev_info.get('FwVersion', fw_version)
361
+ except Exception:
362
+ pass
363
+ variant = (
364
+ "BL2" if product_id == BENCHLAB_BL2_PRODUCT_ID
365
+ else "ORIGINAL")
366
+
343
367
  # Send initial info payload (retain=True so late subscribers
344
368
  # like the TUI can discover this device)
345
369
  info_payload = {
346
370
  "uid": uid,
347
371
  "com_port": port,
348
- "firmware": device.get("firmware")}
372
+ "firmware": device.get("firmware"),
373
+ "VendorId": vendor_id,
374
+ "ProductId": product_id,
375
+ "FwVersion": fw_version,
376
+ "variant": variant,
377
+ }
349
378
  topic_info = f"{cfg['topic_prefix']}/{uid}/info"
350
379
  mqtt_publish(
351
380
  client,
@@ -14,7 +14,10 @@ from typing import Tuple
14
14
  # ═══════════════════════════════════════════════════════════════════════════════
15
15
 
16
16
  # Minimum terminal size requirements
17
- MIN_TERMINAL_ROWS = 35
17
+ # The 12VHPWR tab's stacked Power/Current/Voltage sections (12 channels
18
+ # each) need rows through ~45 for the last Voltage bar, plus 2 rows for
19
+ # the status bar at the bottom (drawn at height-2/height-1).
20
+ MIN_TERMINAL_ROWS = 48
18
21
  MIN_TERMINAL_COLS = 100
19
22
 
20
23
  # Tab configuration