Blueapi doesn't support ophyd-async DeviceVector

Abierto
#1,555 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
68/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
python
Área
api, backend

Línea de trabajo

Empieza en la interfaz de dispositivos de BlueapiClient y reproduce el problema con la configuración mock de i09 proporcionada y el ejemplo de DeviceVector de dodal. Comprueba cómo se representan devs.test y los dispositivos hijos indexados; después, verifica que se pueda acceder a un dispositivo hijo de DeviceVector mediante su índice numérico a través de BlueapiClient. Se considera terminado cuando el ejemplo de aceptación ya no devuelve un carácter del nombre del dispositivo y el acceso indexado devuelve el dispositivo hijo.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug

Steps to replicate the issue:

Pin dodal inside blueapi to this branch:

"dls-dodal@git+https://github.com/DiamondLightSource/dodal.git@device_vector_example". It adds a test DeviceVector device to i09.

Then run blueapi with i09 beamline in mock mode. Configuration used was:

api:
  url: http://0.0.0.0:8000
env:
  metadata:
    instrument: adsim
  sources:
    - kind: deviceManager
      module: dodal.beamlines.i09
      mock: True
    - kind: planFunctions
      module: dodal.plans
    - kind: planFunctions
      module: dodal.plan_stubs.wrapped
stomp:
  enabled: true
  url: tcp://localhost:61613/
numtracker:
  url: http://localhost:8406/graphql

Start blueapi server:
uv run blueapi -c /path/to/file.yaml serve

Then in another terminal

>>> from blueapi.client import BlueapiClient
>>> bc = BlueapiClient.from_config_file("/path/to/file.yaml")
>>> bc.instrument_session = "12345"
>>> plans = bc.plans
>>> devs = bc.devices 
>>> devs.test
Device(test)
>>> devs.test[1]
'e'
>>> devs.test[2]
's'

The above treats the client object as a str so an index just gets the index of the name. DeviceVector is used when many child devices are required, e.g 30 channels for a device and are accessed by the associated index. It is a pain to statically type this and is much easier to have it be configured instead. For example in normal python you can do the following:

>>> from ophyd_async.core import soft_signal_rw
>>> from ophyd_async.core import DeviceVector
>>> dv = DeviceVector({1: soft_signal_rw(int), 2: soft_signal_rw(int)})
>>> dv[1]
<ophyd_async.core._signal.SignalRW object at 0x7efe71059590>
>>> dv[2]
<ophyd_async.core._signal.SignalRW object at 0x7efe71059e10>

There are also plans for a DeviceMap to be added to ophyd-async too https://github.com/bluesky/ophyd-async/issues/1252.

DeviceVector and DeviceMap should probably be supported in BlueapiClient.

Acceptance Criteria

  • Can access DeviceVector children from BlueapiClient
Lenguaje dominante
Python
Estrellas
13
Forks
14
Merge medio
1 d 18 h
PR fusionados (30 d)
17

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de DiamondLightSource/blueapi

Todos los issues de DiamondLightSource/blueapi

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.