benchlab-pytools 3.0.2__tar.gz → 3.0.4__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.4}/CHANGELOG.md +37 -0
  2. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/PKG-INFO +1 -1
  3. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/__init__.py +1 -1
  4. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/datasource.py +68 -4
  5. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/mqtt_publisher.py +30 -1
  6. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/config.py +4 -1
  7. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/.flake8 +0 -0
  8. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/.gitignore +0 -0
  9. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/CONTRIBUTING.md +0 -0
  10. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/LICENSE +0 -0
  11. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/README.md +0 -0
  12. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/__main__.py +0 -0
  13. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/bootstrap.py +0 -0
  14. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/README.md +0 -0
  15. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/__init__.py +0 -0
  16. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/config_client.py +0 -0
  17. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/config_manager.py +0 -0
  18. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/config_tool.py +0 -0
  19. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/diff.py +0 -0
  20. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/examples/complete_config.json +0 -0
  21. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/examples/rgb_lighting.json +0 -0
  22. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/examples/simple_fan.json +0 -0
  23. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/schema.py +0 -0
  24. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/test_config_client.py +0 -0
  25. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/test_config_manager.py +0 -0
  26. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/config/test_diff.py +0 -0
  27. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/README.md +0 -0
  28. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/__init__.py +0 -0
  29. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/config.py +0 -0
  30. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/datasource_manager.py +0 -0
  31. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/device_registry.py +0 -0
  32. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/discovery.py +0 -0
  33. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/infrastructure.py +0 -0
  34. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/process_manager.py +0 -0
  35. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/retry.py +0 -0
  36. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/shared_serial.py +0 -0
  37. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/core/statistics.py +0 -0
  38. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/README.md +0 -0
  39. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/__init__.py +0 -0
  40. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/csv_logger_enhanced.py +0 -0
  41. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/message_batcher.py +0 -0
  42. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/requirements.txt +0 -0
  43. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/csv_log/smart_retry.py +0 -0
  44. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/README.md +0 -0
  45. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/__init__.py +0 -0
  46. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/app.py +0 -0
  47. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/requirements.txt +0 -0
  48. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/runner.py +0 -0
  49. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/test_graph.py +0 -0
  50. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/graph/ui.py +0 -0
  51. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/hwinfo/README.md +0 -0
  52. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/hwinfo/__init__.py +0 -0
  53. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/hwinfo/hwinfo_export.py +0 -0
  54. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/hwinfo/requirements.txt +0 -0
  55. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/hwinfo/test_hwinfo_export.py +0 -0
  56. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/launcher.py +0 -0
  57. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/link/.env.EXAMPLE +0 -0
  58. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/link/README.md +0 -0
  59. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/link/__init__.py +0 -0
  60. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/link/link_main.py +0 -0
  61. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/link/test_link_main.py +0 -0
  62. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/main.py +0 -0
  63. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/menu.py +0 -0
  64. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/menu_classic.py +0 -0
  65. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/README.md +0 -0
  66. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/__init__.py +0 -0
  67. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/mqtt.config_template +0 -0
  68. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/requirements.txt +0 -0
  69. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/mqtt/test_mqtt_publisher.py +0 -0
  70. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/prefs.py +0 -0
  71. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/requirements.txt +0 -0
  72. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/.env.example +0 -0
  73. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/__init__.py +0 -0
  74. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/favicon.ico +0 -0
  75. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/readme.md +0 -0
  76. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/requirements.txt +0 -0
  77. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/telemetry_api.py +0 -0
  78. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/restapi/test_server.py +0 -0
  79. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/sources.py +0 -0
  80. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tools.py +0 -0
  81. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/README.md +0 -0
  82. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/__init__.py +0 -0
  83. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/requirements.txt +0 -0
  84. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/test_tui_core.py +0 -0
  85. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/test_tui_main.py +0 -0
  86. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/tui_core.py +0 -0
  87. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/tui/tui_main.py +0 -0
  88. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/README.md +0 -0
  89. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/NOTICE.md +0 -0
  90. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/README.md +0 -0
  91. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/Running_from_source_on_linux.md +0 -0
  92. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/__init__.py +0 -0
  93. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/assets/vu1_hello_world.png +0 -0
  94. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/community_applications.md +0 -0
  95. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/config.yaml +0 -0
  96. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/database.py +0 -0
  97. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/dial_driver.py +0 -0
  98. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/dials/Comms_Hub_Gauge.py +0 -0
  99. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/dials/Comms_Hub_Server.py +0 -0
  100. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/dials/__init__.py +0 -0
  101. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/dials/base_logger.py +0 -0
  102. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/installer/inc/icon.ico +0 -0
  103. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/installer/install.nsi +0 -0
  104. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/make_version.py +0 -0
  105. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/pylintrc +0 -0
  106. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/requirements.txt +0 -0
  107. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/serial_driver.py +0 -0
  108. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/server.py +0 -0
  109. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/server_config.py +0 -0
  110. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/server_dial_handler.py +0 -0
  111. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/vu_notifications.py +0 -0
  112. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/android-chrome-192x192.png +0 -0
  113. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/android-chrome-512x512.png +0 -0
  114. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/apple-touch-icon.png +0 -0
  115. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/demo.css +0 -0
  116. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/demo.min.css +0 -0
  117. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/demo.rtl.css +0 -0
  118. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/demo.rtl.min.css +0 -0
  119. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.css +0 -0
  120. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.min.css +0 -0
  121. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.css +0 -0
  122. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.min.css +0 -0
  123. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.css +0 -0
  124. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.min.css +0 -0
  125. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.css +0 -0
  126. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.min.css +0 -0
  127. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-social.css +0 -0
  128. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-social.min.css +0 -0
  129. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.css +0 -0
  130. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.min.css +0 -0
  131. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.css +0 -0
  132. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.min.css +0 -0
  133. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.css +0 -0
  134. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.min.css +0 -0
  135. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler.css +0 -0
  136. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler.min.css +0 -0
  137. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.css +0 -0
  138. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.min.css +0 -0
  139. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/css/theme.min.css +0 -0
  140. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/img/header.png +0 -0
  141. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/img/logo.png +0 -0
  142. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/dark-theme.js +0 -0
  143. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/dark-theme.min.js +0 -0
  144. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/demo.js +0 -0
  145. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/demo.min.js +0 -0
  146. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/jquery.min.js +0 -0
  147. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/tabler.esm.js +0 -0
  148. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/tabler.esm.min.js +0 -0
  149. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/tabler.js +0 -0
  150. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/tabler.min.js +0 -0
  151. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/vu1_api.js +0 -0
  152. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/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.4}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_api_keys.js +0 -0
  154. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_dial.js +0 -0
  155. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_home.js +0 -0
  156. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/assets/js/vu1_gui_root.js +0 -0
  157. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/favicon-16x16.png +0 -0
  158. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/favicon-32x32.png +0 -0
  159. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/favicon.ico +0 -0
  160. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/favicon.png +0 -0
  161. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/index.html +0 -0
  162. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/api_keys.html +0 -0
  163. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/dial.html +0 -0
  164. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/footer.html +0 -0
  165. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/header.html +0 -0
  166. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/key_settings.html +0 -0
  167. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/VU-Server/www/views/start.html +0 -0
  168. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/__init__.py +0 -0
  169. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/assets/Barlow-Bold.ttf +0 -0
  170. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/assets/bl_dial_144x200.png +0 -0
  171. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/assets/bl_logo_144x200.png +0 -0
  172. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/devices.py +0 -0
  173. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/requirements.txt +0 -0
  174. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/sensors.py +0 -0
  175. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/test_devices.py +0 -0
  176. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/test_vu_server_config.py +0 -0
  177. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/test_vu_server_manager.py +0 -0
  178. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/test_vu_tui.py +0 -0
  179. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_dial.config_template +0 -0
  180. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_logo_gen.py +0 -0
  181. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_server.config_template +0 -0
  182. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_server_config.py +0 -0
  183. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_server_manager.py +0 -0
  184. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_tui.py +0 -0
  185. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/vu/vu_updater.py +0 -0
  186. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/README.md +0 -0
  187. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/__init__.py +0 -0
  188. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/assets/Inter-Bold.ttf +0 -0
  189. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/assets/Inter.ttf +0 -0
  190. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/assets/benchlab.png +0 -0
  191. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_fleet.py +0 -0
  192. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_graph.py +0 -0
  193. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_overview.py +0 -0
  194. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_telemetry.py +0 -0
  195. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_ui.py +0 -0
  196. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/benchlab_utils.py +0 -0
  197. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/requirements.txt +0 -0
  198. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/test_wigidash.py +0 -0
  199. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/wigidash_device.py +0 -0
  200. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/wigidash_manager.py +0 -0
  201. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/wigidash_session.py +0 -0
  202. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/wigidash_usb.py +0 -0
  203. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab/wigidash/wigidash_widget.py +0 -0
  204. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/benchlab.py +0 -0
  205. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/pyproject.toml +0 -0
  206. {benchlab_pytools-3.0.2 → benchlab_pytools-3.0.4}/pytest.ini +0 -0
@@ -4,6 +4,41 @@ 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.4] - 2026-08-18
8
+
9
+ ### Fixed
10
+ - 12VHPWR tab per-pin sense lines (`HPWR{1,2}_W{1..6}`) read 0.0 over
11
+ `service_http`/`named_pipe`, even though other apps using the same
12
+ `service_http` API showed correct values. The C# service's telemetry
13
+ normalization mapped the HPWR1/HPWR2 rail summaries but never mapped
14
+ the 12 individual per-pin sense-line sensors, so their C#
15
+ `ShortName`s (`HPWR{n}_W{m}_{P,I,V}`) passed through unmapped instead
16
+ of becoming the `..._{Power,Current,Voltage}` keys the TUI reads.
17
+
18
+ ## [3.0.3] - 2026-08-18
19
+
20
+ ### Fixed
21
+ - TUI: the 12VHPWR tab's Voltage section was cut off with no way to
22
+ scroll, since `MIN_TERMINAL_ROWS` (35) was well under the ~48 rows
23
+ the stacked Power/Current/Voltage layout plus status bar actually
24
+ needs. Raised to 48.
25
+ - `mqtt`, `service_http`, and `named_pipe` data sources never surfaced
26
+ `vendor_id`/`product_id`/`firmware_version`, so the Fleet TUI's
27
+ Model column (BL1 vs BL2 detection) was always wrong for these
28
+ sources:
29
+ - `mqtt`: the publisher's retained info payload only sent
30
+ `uid`/`com_port`/`firmware`; it now also reads
31
+ `ProductId`/`VendorId`/`FwVersion` via `read_device()` and
32
+ computes `variant`.
33
+ - `named_pipe`: the C# service's camelCase `productId` is now
34
+ mapped to the PascalCase keys the TUI expects
35
+ (`vendorId`/`firmwareVersion` also mapped), with `variant`
36
+ computed — field names verified against the
37
+ `BENCHLAB.BENCHLAB_Service` source.
38
+ - `service_http`: added a device-info normalization step (the C#
39
+ HTTP API only ever sends `productId`, confirmed against source —
40
+ vendor/firmware are unavailable there and default to unknown).
41
+
7
42
  ## [3.0.2] - 2026-08-18
8
43
 
9
44
  ### Fixed
@@ -67,6 +102,8 @@ export, MQTT publisher, VU dials, WigiDash, and config import/export tools,
67
102
  sharing a common data-source layer (direct serial, FastAPI, MQTT, named
68
103
  pipe, service HTTP).
69
104
 
105
+ [3.0.4]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.3...v3.0.4
106
+ [3.0.3]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.2...v3.0.3
70
107
  [3.0.2]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.1...v3.0.2
71
108
  [3.0.1]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.0...v3.0.1
72
109
  [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.4
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.4"
@@ -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
 
@@ -690,6 +698,16 @@ def _normalise_cs_telemetry(sensors_raw: list) -> Dict[str, Any]:
690
698
  "HPWR2_P": "HPWR2_Power", "HPWR2_V": "HPWR2_Voltage",
691
699
  "HPWR2_I": "HPWR2_Current",
692
700
 
701
+ # BL2 12VHPWR per-pin sense lines (HPWR{1,2}_W{1..6}), shown on
702
+ # the TUI's 12VHPWR tab as HPWR{n}_W{m}_{Power,Current,Voltage}
703
+ **{
704
+ f"HPWR{n}_W{m}_{suffix}": f"HPWR{n}_W{m}_{tui_suffix}"
705
+ for n in (1, 2)
706
+ for m in range(1, 7)
707
+ for suffix, tui_suffix in (
708
+ ("P", "Power"), ("I", "Current"), ("V", "Voltage"))
709
+ },
710
+
693
711
  # Board voltages
694
712
  "VDD": "Vdd",
695
713
  "VREF": "Vref",
@@ -729,6 +747,34 @@ def _normalise_cs_telemetry(sensors_raw: list) -> Dict[str, Any]:
729
747
  return result
730
748
 
731
749
 
750
+ def _normalise_cs_device_info(d: Dict[str, Any]) -> Dict[str, Any]:
751
+ """Normalise a C# service device dict into the shape the TUI expects.
752
+
753
+ The C# service's /devices, /device/{uid}/info, and discovery-pipe
754
+ responses use camelCase keys (productId, vendorId, firmwareVersion —
755
+ confirmed against BenchlabSensorWorker.cs/HttpApiServer.cs in the
756
+ BENCHLAB_Service repo). Note the HTTP API's /devices and
757
+ /device/{uid}/info endpoints only send productId — no vendorId or
758
+ firmwareVersion — so those default to 0 there; only the named-pipe
759
+ discovery/GetServiceInfo responses include all three.
760
+ DirectDataSource/FastAPIDataSource populate PascalCase keys
761
+ (ProductId, VendorId, FwVersion) plus a computed 'variant' — this
762
+ adds those same keys without discarding what the C# service sent.
763
+ """
764
+ result = dict(d)
765
+ product_id = d.get("ProductId", d.get("productId", 0))
766
+ vendor_id = d.get("VendorId", d.get("vendorId", 0))
767
+ fw_version = d.get("FwVersion", d.get("firmwareVersion", 0))
768
+ result["ProductId"] = product_id
769
+ result["VendorId"] = vendor_id
770
+ result["FwVersion"] = fw_version
771
+ result.setdefault("firmware", d.get("firmware", fw_version))
772
+ # 0x11 = BENCHLAB_BL2_PRODUCT_ID (see DirectDataSource/tui_core.py).
773
+ result.setdefault(
774
+ "variant", "BL2" if product_id == 0x11 else "ORIGINAL")
775
+ return result
776
+
777
+
732
778
  class NamedPipeDataSource(DataSource):
733
779
  """Data source that connects to the C# BenchLab Windows service via
734
780
  named pipes.
@@ -792,14 +838,31 @@ class NamedPipeDataSource(DataSource):
792
838
  self._pipe_names.clear()
793
839
  for d in devices:
794
840
  uid = d.get("guid") or d.get("deviceName", "unknown")
841
+ # Field names confirmed against BenchlabSensorWorker.cs's
842
+ # ListDevices response in the BENCHLAB_Service repo.
843
+ product_id = d.get("productId", 0)
844
+ vendor_id = d.get("vendorId", 0)
845
+ fw_version = d.get("firmwareVersion", 0)
846
+ # 0x11 = BENCHLAB_BL2_PRODUCT_ID (see
847
+ # DirectDataSource/tui_core.py); hardcoded rather than
848
+ # importing benchlab_pycore, which named_pipe consumers
849
+ # of the C# service don't necessarily have installed.
850
+ variant = "BL2" if product_id == 0x11 else "ORIGINAL"
795
851
  self._devices[uid] = {
796
852
  "uid": uid,
797
853
  "port": d.get("port", "unknown"),
798
854
  "name": d.get("deviceName", "unknown"),
799
- "productId": d.get("productId", 0),
855
+ "productId": product_id,
800
856
  "status": d.get("status", "unknown"),
801
857
  "sensorCount": d.get("sensorCount", 0),
802
858
  "pipeName": d.get("pipeName", ""),
859
+ # PascalCase aliases matching DirectDataSource's shape,
860
+ # so consumers (e.g. the TUI) can detect BL1/BL2.
861
+ "firmware": fw_version,
862
+ "variant": variant,
863
+ "VendorId": vendor_id,
864
+ "ProductId": product_id,
865
+ "FwVersion": fw_version,
803
866
  }
804
867
  self._pipe_names[uid] = d.get("pipeName", "")
805
868
 
@@ -1041,7 +1104,7 @@ class ServiceHttpDataSource(DataSource):
1041
1104
  for d in devices:
1042
1105
  uid = d.get("uid", "")
1043
1106
  if uid:
1044
- self._devices[uid] = d
1107
+ self._devices[uid] = _normalise_cs_device_info(d)
1045
1108
 
1046
1109
  self._connected = True
1047
1110
  self._stop_event.clear()
@@ -1146,7 +1209,8 @@ class ServiceHttpDataSource(DataSource):
1146
1209
  for d in devices:
1147
1210
  uid = d.get("uid", "")
1148
1211
  if uid:
1149
- self._devices[uid] = d
1212
+ self._devices[uid] = (
1213
+ _normalise_cs_device_info(d))
1150
1214
 
1151
1215
  # Poll telemetry for each device
1152
1216
  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