cgse 0.11.5__tar.gz → 0.12.0__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.
- cgse-0.12.0/.github/workflows/ruff-format-check.yaml +19 -0
- {cgse-0.11.5 → cgse-0.12.0}/PKG-INFO +2 -2
- cgse-0.12.0/advanced-process-monitoring.py +111 -0
- {cgse-0.11.5 → cgse-0.12.0}/bump.py +7 -8
- cgse-0.12.0/docs/dev_guide/monitoring.md +261 -0
- cgse-0.12.0/docs/images/grafana-queries.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-core/registry.md +2 -3
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/noxfile.py +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/__init__.py +1 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/cgse.py +5 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/async_control_claude.py +5 -3
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/command.py +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/control.py +45 -34
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/dummy.py +7 -9
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/plugin.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/process.py +83 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/protocol.py +6 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/proxy.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/ratelimit.py +23 -11
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/scpi.py +16 -25
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/services.py +49 -32
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/services.yaml +5 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/setup.py +7 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/signal.py +11 -14
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/socketdevice.py +8 -18
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/system.py +31 -29
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/task.py +1 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/zmq_ser.py +3 -3
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/handle_sigterm.py +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_client_server_interaction.py +0 -6
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_command.py +3 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_decorators.py +2 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_device.py +2 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_process.py +0 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_protocol.py +5 -8
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_ratelimit.py +9 -22
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_signal.py +3 -4
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_system.py +39 -30
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_task.py +0 -3
- cgse-0.12.0/libs/cgse-common/tests/test_zmq_ser.py +71 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +15 -17
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +6 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +8 -9
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/point.py +101 -101
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +20 -22
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +30 -61
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +16 -33
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +21 -24
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +111 -93
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_avoidance.py +5 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_coordinates_plot.py +2 -4
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +3 -10
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_point.py +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_reference_frames.py +5 -29
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_refmodel.py +7 -21
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/pyproject.toml +2 -2
- cgse-0.12.0/libs/cgse-core/src/cgse_core/_start.py +75 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/_status.py +23 -20
- cgse-0.12.0/libs/cgse-core/src/cgse_core/_stop.py +75 -0
- cgse-0.12.0/libs/cgse-core/src/cgse_core/cgse_explore.py +19 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/services.py +15 -6
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/async_control.py +73 -89
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/__init__.py +38 -89
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/confman_cs.py +32 -19
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/__init__.py +6 -9
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/__main__.py +0 -3
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/log_cs.py +39 -40
- cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/event.py +11 -0
- cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/server.py +135 -0
- cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/services.py +176 -0
- cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/test.py +296 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/__init__.py +39 -50
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_cs.py +22 -34
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_protocol.py +4 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_ui.py +122 -124
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/__init__.py +7 -6
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/backend.py +2 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/client.py +138 -197
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/server.py +96 -153
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/service.py +25 -67
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/__init__.py +43 -61
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/persistence.py +33 -40
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/storage_cs.py +10 -18
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/conftest.py +0 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/helpers.py +16 -16
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/script_test_async_registry_client.py +28 -36
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/script_test_registry_client_server.py +20 -24
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/script_test_service_registry_server.py +14 -30
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/script_test_sync_registry_client.py +27 -39
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/services.py +32 -67
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/stress_test_registry_server.py +6 -9
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_async_control.py +2 -4
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_cm_cs.py +9 -15
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_confman_setups.py +5 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_logger.py +1 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_registry_backend.py +13 -39
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_registry_service.py +71 -249
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_server_running.py +3 -7
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_server_running_with_fixture.py +2 -5
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_settings_core.py +3 -6
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/test_zmq_microservice.py +0 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/__init__.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/buttons.py +28 -34
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/led.py +7 -6
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/limitswitch.py +5 -4
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/states.py +19 -15
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/switch.py +1 -4
- cgse-0.12.0/live-process-monitoring.py +67 -0
- {cgse-0.11.5 → cgse-0.12.0}/noxfile.py +2 -1
- cgse-0.12.0/processes.json +7680 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +103 -30
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +1 -3
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/src/egse/tools/status.py +8 -7
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +4 -8
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +12 -39
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +36 -83
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +35 -18
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +2 -4
- cgse-0.12.0/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +19 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +1 -17
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +2 -6
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/test_adev.py +6 -25
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/test_dev.py +6 -24
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +61 -87
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +35 -34
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +17 -18
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +11 -16
- cgse-0.12.0/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +20 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +26 -14
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +10 -15
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +2 -1
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +21 -11
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +3 -10
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +128 -73
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +73 -45
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +15 -51
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +40 -17
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +3 -8
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +4 -14
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +6 -18
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +9 -28
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +17 -42
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +19 -23
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +4 -11
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +2 -4
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +6 -26
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +3 -5
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +51 -41
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +19 -23
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +14 -11
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +4 -14
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +7 -18
- cgse-0.12.0/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +19 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +25 -40
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -4
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -1
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +12 -18
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-fits/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +350 -204
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-hdf5/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +6 -6
- cgse-0.12.0/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-spw/pyproject.toml +2 -2
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-spw/src/egse/spw.py +60 -67
- {cgse-0.11.5 → cgse-0.12.0}/pyproject.toml +2 -2
- cgse-0.12.0/requirements.txt +1728 -0
- {cgse-0.11.5 → cgse-0.12.0}/scratch.py +2 -4
- {cgse-0.11.5 → cgse-0.12.0}/service_registry.db +0 -0
- {cgse-0.11.5/libs/cgse-common → cgse-0.12.0}/service_registry.db-shm +0 -0
- cgse-0.12.0/service_registry.db-wal +0 -0
- cgse-0.12.0/simple-process-monitoring.py +72 -0
- cgse-0.11.5/libs/cgse-common/service_registry.db-wal +0 -0
- cgse-0.11.5/libs/cgse-common/tests/test_zmq_ser.py +0 -70
- cgse-0.11.5/libs/cgse-core/src/cgse_core/_start.py +0 -65
- cgse-0.11.5/libs/cgse-core/src/cgse_core/_stop.py +0 -65
- cgse-0.11.5/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -10
- cgse-0.11.5/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -10
- cgse-0.11.5/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -10
- cgse-0.11.5/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -10
- {cgse-0.11.5 → cgse-0.12.0}/.gitignore +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/TODO.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/check_import.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/conftest.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/bits.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/calibration.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/command.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/config.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/control.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/counter.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/decorators.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/device.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/dicts.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/dummy.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/env.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/exceptions.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/heartbeat.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/hk.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/listener.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/metrics.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/mixin.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/monitoring.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/observer.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/obsid.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/persistence.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/plugin.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/process.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/reload.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/settings.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/setup.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/api/system.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/custom_theme/main.html +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/docs.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/installation.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/nox.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/uv.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/getting_started.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/help.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/initialize.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/libs/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/package_list.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/projects/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/roadmap.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/stylesheets/custom.css +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/stylesheets/extra.css +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/tutorial.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/docs/user_guide/index.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/identifier.sqlite +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/justfile +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/justfile +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/listener.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/mixin.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/monitoring.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_bits.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_control.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_listener.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_mixin.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.11.5/projects/generic/cgse-tools/src/cgse_tools → cgse-0.12.0/libs/cgse-core/src/egse/notifyhub}/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/default_env.py +1 -1
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/mkdocs.yml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.11.5/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol → cgse-0.12.0/projects/generic/cgse-tools/src/cgse_tools}/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.11.5/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol → cgse-0.12.0/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol}/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.11.5/projects/generic/symetrie-hexapod/src/symetrie_hexapod → cgse-0.12.0/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol}/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- /cgse-0.11.5/projects/plato/plato-hdf5/README.md → /cgse-0.12.0/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.11.5/projects/plato/plato-spw → cgse-0.12.0/projects/plato/plato-hdf5}/README.md +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/ruff.toml +0 -0
- {cgse-0.11.5 → cgse-0.12.0}/test_service_registry.db +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Ruff Formatting Check
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, reopened]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
ruff-format:
|
|
9
|
+
name: Run ruff format for the whole project
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout code
|
|
14
|
+
uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Ruff Format Check
|
|
17
|
+
uses: astral-sh/ruff-action@v3
|
|
18
|
+
with:
|
|
19
|
+
args: format --check --diff .
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cgse
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
|
|
5
5
|
Author: IvS KU Leuven
|
|
6
6
|
Maintainer-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
|
|
7
7
|
License: MIT
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
9
|
Requires-Dist: cgse-common
|
|
10
10
|
Requires-Dist: cgse-core
|
|
11
11
|
Requires-Dist: cgse-tools
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import psutil
|
|
2
|
+
import time
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import List, Dict
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class ProcessInfo:
|
|
10
|
+
pid: int
|
|
11
|
+
name: str
|
|
12
|
+
username: str
|
|
13
|
+
cpu_percent: float
|
|
14
|
+
memory_percent: float
|
|
15
|
+
memory_mb: float
|
|
16
|
+
status: str
|
|
17
|
+
create_time: float
|
|
18
|
+
command: str
|
|
19
|
+
|
|
20
|
+
def to_dict(self):
|
|
21
|
+
return {
|
|
22
|
+
"pid": self.pid,
|
|
23
|
+
"name": self.name,
|
|
24
|
+
"username": self.username,
|
|
25
|
+
"cpu_percent": self.cpu_percent,
|
|
26
|
+
"memory_percent": self.memory_percent,
|
|
27
|
+
"memory_mb": self.memory_mb,
|
|
28
|
+
"status": self.status,
|
|
29
|
+
"create_time": self.create_time,
|
|
30
|
+
"command": self.command,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ProcessMonitor:
|
|
35
|
+
def __init__(self):
|
|
36
|
+
self.previous_cpu = {}
|
|
37
|
+
|
|
38
|
+
def get_processes(self, filter_func=None) -> List[ProcessInfo]:
|
|
39
|
+
"""Get current processes with optional filtering"""
|
|
40
|
+
processes = []
|
|
41
|
+
|
|
42
|
+
for proc in psutil.process_iter():
|
|
43
|
+
try:
|
|
44
|
+
with proc.oneshot(): # Efficient way to get multiple attributes
|
|
45
|
+
info = ProcessInfo(
|
|
46
|
+
pid=proc.pid,
|
|
47
|
+
name=proc.name(),
|
|
48
|
+
username=proc.username(),
|
|
49
|
+
cpu_percent=proc.cpu_percent(),
|
|
50
|
+
memory_percent=proc.memory_percent(),
|
|
51
|
+
memory_mb=proc.memory_info().rss / 1024 / 1024,
|
|
52
|
+
status=proc.status(),
|
|
53
|
+
create_time=proc.create_time(),
|
|
54
|
+
command=" ".join(proc.cmdline()) if proc.cmdline() else proc.name(),
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if filter_func is None or filter_func(info):
|
|
58
|
+
processes.append(info)
|
|
59
|
+
|
|
60
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
return processes
|
|
64
|
+
|
|
65
|
+
def find_by_name(self, name: str) -> List[ProcessInfo]:
|
|
66
|
+
"""Find processes by name"""
|
|
67
|
+
return self.get_processes(lambda p: name.lower() in p.name.lower())
|
|
68
|
+
|
|
69
|
+
def find_high_cpu(self, threshold: float = 5.0) -> List[ProcessInfo]:
|
|
70
|
+
"""Find processes using high CPU"""
|
|
71
|
+
return self.get_processes(lambda p: p.cpu_percent > threshold)
|
|
72
|
+
|
|
73
|
+
def find_high_memory(self, threshold_mb: float = 100.0) -> List[ProcessInfo]:
|
|
74
|
+
"""Find processes using high memory"""
|
|
75
|
+
return self.get_processes(lambda p: p.memory_mb > threshold_mb)
|
|
76
|
+
|
|
77
|
+
def kill_process(self, pid: int, force: bool = False):
|
|
78
|
+
"""Safely kill a process"""
|
|
79
|
+
try:
|
|
80
|
+
proc = psutil.Process(pid)
|
|
81
|
+
if force:
|
|
82
|
+
proc.kill()
|
|
83
|
+
else:
|
|
84
|
+
proc.terminate()
|
|
85
|
+
return True
|
|
86
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
87
|
+
return False
|
|
88
|
+
|
|
89
|
+
def export_to_json(self, filename: str):
|
|
90
|
+
"""Export current process list to JSON"""
|
|
91
|
+
processes = [p.to_dict() for p in self.get_processes()]
|
|
92
|
+
with open(filename, "w") as f:
|
|
93
|
+
json.dump(processes, f, indent=2)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# Usage examples
|
|
97
|
+
monitor = ProcessMonitor()
|
|
98
|
+
|
|
99
|
+
# Find all Python processes
|
|
100
|
+
python_procs = monitor.find_by_name("python")
|
|
101
|
+
print(f"Found {len(python_procs)} Python processes")
|
|
102
|
+
for proc in python_procs:
|
|
103
|
+
print(f"{proc.name} ({proc.pid} – {proc.cpu_percent}%)")
|
|
104
|
+
|
|
105
|
+
# Find high CPU usage
|
|
106
|
+
high_cpu = monitor.find_high_cpu(10.0)
|
|
107
|
+
for proc in high_cpu:
|
|
108
|
+
print(f"High CPU: {proc.name} (PID: {proc.pid}) - {proc.cpu_percent}%")
|
|
109
|
+
|
|
110
|
+
# Export current state
|
|
111
|
+
monitor.export_to_json("processes.json")
|
|
@@ -16,7 +16,7 @@ Note:
|
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
# /// script
|
|
19
|
-
# requires-python = ">=3.
|
|
19
|
+
# requires-python = ">=3.10"
|
|
20
20
|
# dependencies = [
|
|
21
21
|
# "tomlkit",
|
|
22
22
|
# "rich",
|
|
@@ -33,17 +33,17 @@ import tomlkit.exceptions
|
|
|
33
33
|
import typer
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
def bump_version(version, part=
|
|
37
|
-
major, minor, patch = map(int, version.split(
|
|
36
|
+
def bump_version(version, part="patch"):
|
|
37
|
+
major, minor, patch = map(int, version.split("."))
|
|
38
38
|
|
|
39
|
-
if part ==
|
|
39
|
+
if part == "major":
|
|
40
40
|
major += 1
|
|
41
41
|
minor = 0
|
|
42
42
|
patch = 0
|
|
43
|
-
elif part ==
|
|
43
|
+
elif part == "minor":
|
|
44
44
|
minor += 1
|
|
45
45
|
patch = 0
|
|
46
|
-
elif part ==
|
|
46
|
+
elif part == "patch":
|
|
47
47
|
patch += 1
|
|
48
48
|
else:
|
|
49
49
|
raise ValueError("Part must be 'major', 'minor', or 'patch'")
|
|
@@ -77,7 +77,7 @@ def update_project_version(project_dir, new_version):
|
|
|
77
77
|
tomlkit.dump(data, file)
|
|
78
78
|
|
|
79
79
|
except tomlkit.exceptions.NonExistentKey:
|
|
80
|
-
rich.print(
|
|
80
|
+
rich.print(rf"[red]\[project.version] is not defined in pyproject.toml in {project_dir}[/]")
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
def update_all_projects_in_monorepo(root_dir: pathlib.Path, part: str, dry_run: bool = False, verbose: bool = True):
|
|
@@ -117,7 +117,6 @@ app = typer.Typer()
|
|
|
117
117
|
|
|
118
118
|
@app.command()
|
|
119
119
|
def main(part: str, dry_run: bool = False, verbose: bool = True):
|
|
120
|
-
|
|
121
120
|
monorepo_root = pathlib.Path(__file__).parent.resolve()
|
|
122
121
|
|
|
123
122
|
cwd = os.getcwd()
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Monitoring with InfluxDB and Grafana
|
|
2
|
+
|
|
3
|
+
The CGSE provides mechanisms to monitor metrics from different processes and devices. These are
|
|
4
|
+
collected by InfluxDB and are visualised by means of Grafana dashboards.
|
|
5
|
+
|
|
6
|
+
In this section, we explain how to install both InfluxDB and Grafana on the Server, how to set up and populate a database
|
|
7
|
+
in InfluxDB, and how to visualise the metrics in Grafana dashboards.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
### InfluxDB3 Core
|
|
15
|
+
|
|
16
|
+
To install InfluxDB3 Core, execute this in a Terminal on the Server:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
curl -s https://repos.influxdata.com/influxdata-archive_compat.key > influxdata-archive_compat.key
|
|
20
|
+
|
|
21
|
+
echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
|
|
22
|
+
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
|
|
23
|
+
|
|
24
|
+
sudo apt-get update
|
|
25
|
+
|
|
26
|
+
sudo apt-get install influxdb3-core
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
For database management, you will need a token to interact with InfluxDB. This can be generated as follows (in a
|
|
30
|
+
Terminal on the Server):
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
influxdb3 create token --admin
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This will print out a token, starting with `apiv3_`. Export this value as environment variable `INFLUXDB3_AUTH_TOKEN`.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Grafana
|
|
40
|
+
|
|
41
|
+
To install Grafana, execute this in a Terminal on the Server:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
sudo apt-get install -y apt-transport-https software-properties-common wget
|
|
45
|
+
|
|
46
|
+
sudo mkdir -p /etc/apt/keyrings/
|
|
47
|
+
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
|
|
48
|
+
|
|
49
|
+
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
|
|
50
|
+
sudo apt-get update
|
|
51
|
+
|
|
52
|
+
sudo apt-get install grafana
|
|
53
|
+
|
|
54
|
+
sudo /bin/systemctl daemon-reload
|
|
55
|
+
sudo /bin/systemctl enable grafana-server
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Database Structure
|
|
61
|
+
|
|
62
|
+
### Database Name
|
|
63
|
+
|
|
64
|
+
In the current implementation, the name of the database in which all CGSE metrics are stored, is taken
|
|
65
|
+
from the `PROJECT` environment variable. At a later stage, we could change this by means of a dedicated
|
|
66
|
+
environment variable or by specifying it in the local settings file.
|
|
67
|
+
|
|
68
|
+
To inspect the names of the available databases, execute this in a Terminal on the Server:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
influxdb3 show databases
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The command to create a database manually (from a Terminal on the Server) is:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
influxdb3 create database <database name>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Table Names
|
|
81
|
+
|
|
82
|
+
For each of the processes, we have a dedicated table in the database, the name of which is the same as
|
|
83
|
+
the storage mnemonic of the process.
|
|
84
|
+
|
|
85
|
+
To get an overview of the available tables, execute this in a Terminal on the Server:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
influxdb3 query --database <database name> "SHOW TABLES"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Content of the Tables
|
|
92
|
+
|
|
93
|
+
For each table, the column names are the names of the corresponding housekeeping/metrics parameters. The name of the column with the timestamp is `TIME`.
|
|
94
|
+
|
|
95
|
+
To get an overview of the columns for a given table in a given database, execute this in a Terminal on the Server:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
influxdb3 query --database <database name> "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table name>'"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
To get an overview of the data stored in a given table (sorted by ascending order of timestamp), execute this in a
|
|
102
|
+
Terminal on the Server:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
influxdb3 query --database <database name> "SELECT * FROM <table name> ORDER BY TIME"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Propagating Metrics to InfluxDB via Python
|
|
111
|
+
|
|
112
|
+
To populate the metrics in InfluxDB, we use the Python package `influxdb3-python`. This has been added to the `pyproject.toml`
|
|
113
|
+
file of the `cgse-common` module.
|
|
114
|
+
|
|
115
|
+
When implementing a new device, nothing has to be done specifically to propagate the metrics to InfluxDB. This is
|
|
116
|
+
automatically being taken care of in the `serve` method of the `ControlServer` class. In the section where the
|
|
117
|
+
housekeeping information is written to a dedicated CSV file, the `propagate_metrics` method of the `ControlServer`
|
|
118
|
+
class is called and this takes care of everything.
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
[//]: # (### Establishing a Connection)
|
|
123
|
+
|
|
124
|
+
[//]: # ()
|
|
125
|
+
[//]: # (In the initialisation a the `CommandProtocol`, an `influxdb_client_3.InfluxDBClient3` is created (and stored in )
|
|
126
|
+
|
|
127
|
+
[//]: # (`self.client`), which establishes a connection to InfluxDB. This is also where the write precision for the )
|
|
128
|
+
|
|
129
|
+
[//]: # (timestamp is specified. Note that - to establish this connection - both the `PROJECT` and `INFLUXDB3_AUTH_TOKEN` )
|
|
130
|
+
|
|
131
|
+
[//]: # (environment variables have to be set. If this is not the case, `self.client` will be `None`. )
|
|
132
|
+
|
|
133
|
+
[//]: # ()
|
|
134
|
+
[//]: # (Note that when the InfluxDB process is (re-)started, the individual processes pick up on this automatically (so you )
|
|
135
|
+
|
|
136
|
+
[//]: # (don't have to do anything extra for the metrics to start appearing in the database again).)
|
|
137
|
+
|
|
138
|
+
[//]: # ()
|
|
139
|
+
[//]: # (### Device Protocols)
|
|
140
|
+
|
|
141
|
+
[//]: # ()
|
|
142
|
+
[//]: # (In the implementing protocols, in the `get_housekeeping` method, we have to propagate the metrics to InfluxDB. Usually )
|
|
143
|
+
|
|
144
|
+
[//]: # (we have an `hk` dictionary (or something alike) with the housekeeping information that will be stored in a dedicated CSV file. This dictionary )
|
|
145
|
+
|
|
146
|
+
[//]: # (also contains the timestamp for all parameters. This is the return value of the `get_housekeeping` method.)
|
|
147
|
+
|
|
148
|
+
[//]: # ()
|
|
149
|
+
[//]: # (To propagate these housekeeping parameters as metrics to InfluxDB, you have to construct a dictionary (see further for the required content), )
|
|
150
|
+
|
|
151
|
+
[//]: # (say `metrics_dictionary`, which we will write to InfluxDB, as follows (in the `get_housekeeping` method):)
|
|
152
|
+
|
|
153
|
+
[//]: # ()
|
|
154
|
+
[//]: # (``` python )
|
|
155
|
+
|
|
156
|
+
[//]: # (try:)
|
|
157
|
+
|
|
158
|
+
[//]: # ( if self.client:)
|
|
159
|
+
|
|
160
|
+
[//]: # ( metrics_dictionary = {...})
|
|
161
|
+
|
|
162
|
+
[//]: # ( point = Point.from_dict(metrics_dictionary, write_precision=self.metrics_time_precision))
|
|
163
|
+
|
|
164
|
+
[//]: # ( self.client.write(point))
|
|
165
|
+
|
|
166
|
+
[//]: # ( except NewConnectionError:)
|
|
167
|
+
|
|
168
|
+
[//]: # ( pass)
|
|
169
|
+
|
|
170
|
+
[//]: # (```)
|
|
171
|
+
|
|
172
|
+
[//]: # ()
|
|
173
|
+
[//]: # (This requires the following imports:)
|
|
174
|
+
|
|
175
|
+
[//]: # ()
|
|
176
|
+
[//]: # (``` python)
|
|
177
|
+
|
|
178
|
+
[//]: # (from influxdb_client_3 import Point)
|
|
179
|
+
|
|
180
|
+
[//]: # (from urllib3.exceptions import NewConnectionError)
|
|
181
|
+
|
|
182
|
+
[//]: # (```)
|
|
183
|
+
|
|
184
|
+
[//]: # ()
|
|
185
|
+
[//]: # (#### Metrics Dictionary )
|
|
186
|
+
|
|
187
|
+
[//]: # ()
|
|
188
|
+
[//]: # (The `metrics_dictionary` has the following structure:)
|
|
189
|
+
|
|
190
|
+
[//]: # ()
|
|
191
|
+
[//]: # (- `measurement`: Storage mnemonic of the process, which will be used as table name in the database;)
|
|
192
|
+
|
|
193
|
+
[//]: # (- `tags`: Dictionary with tags for the table in the database. At this point, its function is not entirely clear yet. We are using the following tags:)
|
|
194
|
+
|
|
195
|
+
[//]: # ( - `site_id`: Site identifier, as taken from the settings/setup (e.g. "KUL", "CSL",...);)
|
|
196
|
+
|
|
197
|
+
[//]: # ( - `origin`: Storage mnemonic of the process;)
|
|
198
|
+
|
|
199
|
+
[//]: # (- `fields`: Dictionary with metrics. This is the same as the `hk` dictionary but without the timestamp;)
|
|
200
|
+
|
|
201
|
+
[//]: # (- `time`: Timestamp as taken from the `hk` dictionary.)
|
|
202
|
+
|
|
203
|
+
[//]: # ()
|
|
204
|
+
[//]: # (### Closing the Connection)
|
|
205
|
+
|
|
206
|
+
[//]: # ()
|
|
207
|
+
[//]: # (In the `quit` method of the device protocol, do not forget to close the connection to InfluxDB, by adding this line:)
|
|
208
|
+
|
|
209
|
+
[//]: # ()
|
|
210
|
+
[//]: # (``` python)
|
|
211
|
+
|
|
212
|
+
[//]: # (if self.client:)
|
|
213
|
+
|
|
214
|
+
[//]: # ( self.client.close())
|
|
215
|
+
|
|
216
|
+
[//]: # (```)
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Visualisation of the Metrics
|
|
221
|
+
|
|
222
|
+
The Metrics are visualised in Grafana dashboards, but before we can start building those, we have to instruct Grafana to
|
|
223
|
+
interpret InfluxDB as its data source.
|
|
224
|
+
|
|
225
|
+
### Adding InfluxDB as Data Source
|
|
226
|
+
|
|
227
|
+
After the InfluxDB and Grafana processes have been started, you can access Grafana in your browser via http://localhost:3000.
|
|
228
|
+
|
|
229
|
+
On the left-hand side, select (under "Connections") "Add new connection" and search for "Influx DB". After clicking on
|
|
230
|
+
the search result, a Settings tab will open, in which you have to enter the following information:
|
|
231
|
+
|
|
232
|
+
- `Name`: Arbitrary name for the data source (it's a good idea to make this reflect the database you are settings up, e.g. `influxdb3-ariel`);
|
|
233
|
+
- `Query language`: Select "SQL";
|
|
234
|
+
- `HTTP` > `URL`: `http://127.0.0.1:8181`;
|
|
235
|
+
- `Auth`: Only enable "Basic auth";
|
|
236
|
+
- `InfluxDB Details` > `Database`: Name of the database for which you want to create Grafana dashboards;
|
|
237
|
+
- `InfluxDB Details` > `Token`: InfluxDB token you have created earlier (see above; starting with `apiv3_`);
|
|
238
|
+
- `InfluxDB Details`: Enable "Insecure Connection".
|
|
239
|
+
|
|
240
|
+
After having configured all of this, press "Save & test".
|
|
241
|
+
|
|
242
|
+
### Creating Grafana Dashboards
|
|
243
|
+
|
|
244
|
+
Creating a Grafana dashboard can be done by clicking "Dashboards" on the left-hand side. In the "Queries" tab of such a
|
|
245
|
+
dashboard panel, you have to specify the following information:
|
|
246
|
+
|
|
247
|
+
- `Data source`: Name of the data source you have just created (selectable via a drop-down menu);
|
|
248
|
+
- `Table`: Name of the table for which you want to visualise metrics. Remember that this is the same as the storage
|
|
249
|
+
mnemonic of the process generating the metrics (selectable via a drop-down menu);
|
|
250
|
+
- `Data operations`: Besides the name of the metric (selectable via a drop-down menu), you also have to add `time` under
|
|
251
|
+
`Data Operations`, to make sure Grafana recognises and is able to show the timestamp in its panels.
|
|
252
|
+
Have a look at the screenshot below for an example.
|
|
253
|
+

|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Open Questions
|
|
257
|
+
|
|
258
|
+
- How can we specify the data retention period?
|
|
259
|
+
- Is it ok to use the `PROJECT` environment variable as name of the database or should this be configurable (e.g. via
|
|
260
|
+
the local settings, an extra environment variable)?
|
|
261
|
+
- Is ms the desired write precision of the timestamp? Should this be configurable (via the local settings)?
|
|
Binary file
|
|
@@ -44,12 +44,11 @@ A microservice can register as follows:
|
|
|
44
44
|
from egse.registry.client import AsyncRegistryClient
|
|
45
45
|
|
|
46
46
|
registry_client = AsyncRegistryClient()
|
|
47
|
-
registry_client.connect()
|
|
48
47
|
|
|
49
48
|
service_id = await registry_client.register(
|
|
50
49
|
name=service_name,
|
|
51
|
-
host=
|
|
52
|
-
port=
|
|
50
|
+
host=get_host_ip(),
|
|
51
|
+
port=get_port(),
|
|
53
52
|
service_type=service_type,
|
|
54
53
|
metadata={},
|
|
55
54
|
ttl=30,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import nox
|
|
2
2
|
|
|
3
|
-
python_versions = [
|
|
3
|
+
python_versions = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
@nox.session(python=python_versions)
|
|
@@ -20,7 +20,7 @@ def uv_tests(session: nox.Session):
|
|
|
20
20
|
session.run_install("uv", "venv", *py_version)
|
|
21
21
|
|
|
22
22
|
session.run_install(
|
|
23
|
-
*uv_sync_cmd,
|
|
23
|
+
*uv_sync_cmd, # "--all-packages",
|
|
24
24
|
env={"UV_PROJECT_ENVIRONMENT": session.virtualenv.location},
|
|
25
25
|
)
|
|
26
26
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cgse-common"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.12.0"
|
|
4
4
|
description = "Software framework to support hardware testing"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "IvS KU Leuven"}
|
|
@@ -10,7 +10,7 @@ maintainers = [
|
|
|
10
10
|
{name = "Sara Regibo", email = "sara.regibo@kuleuven.be"}
|
|
11
11
|
]
|
|
12
12
|
readme = {"file" = "README.md", "content-type" = "text/markdown"}
|
|
13
|
-
requires-python = ">=3.
|
|
13
|
+
requires-python = ">=3.10"
|
|
14
14
|
license = "MIT"
|
|
15
15
|
keywords = [
|
|
16
16
|
"CGSE",
|
|
Binary file
|
|
@@ -19,6 +19,7 @@ the group name 'cgse.command.plugins'.
|
|
|
19
19
|
Commands can be added as single commands or as a group containing further sub-commands. To add a group,
|
|
20
20
|
the entry point shall contain 'group' in its extras.
|
|
21
21
|
"""
|
|
22
|
+
|
|
22
23
|
import textwrap
|
|
23
24
|
|
|
24
25
|
import rich
|
|
@@ -57,6 +58,7 @@ def broken_command(name: str, module: str, exc: Exception):
|
|
|
57
58
|
|
|
58
59
|
# Load the known plugins for the `cgse` command. Plugins are added as commands to the `cgse`.
|
|
59
60
|
|
|
61
|
+
|
|
60
62
|
class SortedCommandGroup(TyperGroup):
|
|
61
63
|
"""This class sorts the commands based on the following criteria:
|
|
62
64
|
|
|
@@ -64,6 +66,7 @@ class SortedCommandGroup(TyperGroup):
|
|
|
64
66
|
- the rest of the commands are sorted alphabetically
|
|
65
67
|
|
|
66
68
|
"""
|
|
69
|
+
|
|
67
70
|
def list_commands(self, ctx):
|
|
68
71
|
# Get list of all commands
|
|
69
72
|
commands = super().list_commands(ctx)
|
|
@@ -141,17 +144,14 @@ def build_app():
|
|
|
141
144
|
if group == "cgse.service":
|
|
142
145
|
app.add_typer(ep.load(), name=ep.name)
|
|
143
146
|
else:
|
|
144
|
-
command_group = snake_to_title(group.split(
|
|
147
|
+
command_group = snake_to_title(group.split(".")[-1])
|
|
145
148
|
app.add_typer(ep.load(), name=ep.name, rich_help_panel=command_group)
|
|
146
149
|
except Exception as exc:
|
|
147
150
|
app.command()(broken_command(ep.name, ep.module, exc))
|
|
148
151
|
|
|
149
152
|
|
|
150
153
|
@app.callback(no_args_is_help=True, invoke_without_command=True)
|
|
151
|
-
def main(
|
|
152
|
-
ctx: typer.Context,
|
|
153
|
-
verbose: bool = False
|
|
154
|
-
):
|
|
154
|
+
def main(ctx: typer.Context, verbose: bool = False):
|
|
155
155
|
"""
|
|
156
156
|
The `cgse` command is used to:
|
|
157
157
|
|
|
@@ -28,9 +28,11 @@ try:
|
|
|
28
28
|
# This function is only available when the cgse-core package is installed
|
|
29
29
|
from egse.logger import close_all_zmq_handlers
|
|
30
30
|
except ImportError:
|
|
31
|
+
|
|
31
32
|
def close_all_zmq_handlers(): # noqa
|
|
32
33
|
pass
|
|
33
34
|
|
|
35
|
+
|
|
34
36
|
from egse.process import ProcessStatus
|
|
35
37
|
from egse.settings import Settings
|
|
36
38
|
from egse.system import get_average_execution_time
|
|
@@ -390,7 +392,7 @@ class ControlServer(abc.ABC):
|
|
|
390
392
|
if condition and not condition():
|
|
391
393
|
self.logger.debug(
|
|
392
394
|
f"Task {task_name} rescheduled in {self.scheduled_task_delay}s, condition not met...."
|
|
393
|
-
|
|
395
|
+
)
|
|
394
396
|
self.logger.info(f"Task {task_name} rescheduled in {self.scheduled_task_delay}s")
|
|
395
397
|
current_time = datetime.datetime.now(tz=datetime.timezone.utc)
|
|
396
398
|
scheduled_time = current_time + datetime.timedelta(seconds=self.scheduled_task_delay)
|
|
@@ -621,7 +623,7 @@ class ControlServer(abc.ABC):
|
|
|
621
623
|
if not self.device_protocol.is_alive():
|
|
622
624
|
self.logger.error(
|
|
623
625
|
"Some Thread or sub-process that was started by Protocol has died, terminating..."
|
|
624
|
-
|
|
626
|
+
)
|
|
625
627
|
self.quit()
|
|
626
628
|
break
|
|
627
629
|
except asyncio.CancelledError:
|
|
@@ -698,7 +700,7 @@ class ControlServer(abc.ABC):
|
|
|
698
700
|
asyncio.create_task(self.process_scheduled_tasks()),
|
|
699
701
|
asyncio.create_task(self.update_metrics()),
|
|
700
702
|
asyncio.create_task(self.check_device_protocol_alive()),
|
|
701
|
-
asyncio.create_task(self.process_sequential_queue()) # Add sequential queue processor
|
|
703
|
+
asyncio.create_task(self.process_sequential_queue()), # Add sequential queue processor
|
|
702
704
|
]
|
|
703
705
|
|
|
704
706
|
# Add housekeeping task if storage manager is active
|
|
@@ -90,6 +90,7 @@ Do we need additional hooks into this commanding?
|
|
|
90
90
|
* provide an execute method for the CommandExecution that executes the command
|
|
91
91
|
with the saved parameters
|
|
92
92
|
"""
|
|
93
|
+
|
|
93
94
|
from __future__ import annotations
|
|
94
95
|
|
|
95
96
|
import functools
|
|
@@ -618,8 +619,7 @@ def get_function(parent_class: type, method_name: str) -> Callable:
|
|
|
618
619
|
|
|
619
620
|
|
|
620
621
|
def load_commands(
|
|
621
|
-
|
|
622
|
-
device_class: type
|
|
622
|
+
protocol_class: type[CommandProtocol], command_settings: dict, command_class: type[Command], device_class: type
|
|
623
623
|
) -> dict[str, Command]:
|
|
624
624
|
"""
|
|
625
625
|
Loads the command definitions from the given ``command_settings`` and builds an internal
|