Control System set up#

The control system interface is in a separated package from pyaml

pyaml itself:
pip install accelerator-middle-layer

tango interface to pyaml:
pip install tango-pyaml

ophyd-asynch interface to pyaml:
pip install pyaml-oa-cs

If the above packages are installed the examples below will work

from pyaml.accelerator import Accelerator

Assuming these lines are present in …/…/tests/config/EBSTune_TANGO.yaml

type: pyaml.accelerator
name: sr
energy: 6e9
controls:
  - type: tango.pyaml.controlsystem
      tango_host: ebs-simu-3:10000
      name: live
...
powerconverter:
      type: tango.pyaml.attribute
...
tune_h:
    type: tango.pyaml.attribute_read_only
...
# work with TANGO
SR_Tango: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")
---------------------------------------------------------------------------
PyAMLConfigException                      Traceback (most recent call last)
Cell In[2], line 2
      1 # work with TANGO
----> 2 SR_Tango: Accelerator = Accelerator.load("../../tests/config/EBSTune.yaml")

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/accelerator.py:304, in Accelerator.load(filename, use_fast_loader, ignore_external)
    299 except UnsupportedConfigurationRootError as ex:
    300     raise PyAMLConfigException(
    301         "Accelerator.load() expects a 'pyaml.accelerator' root configuration. "
    302         "Use the factory APIs to build sub-elements directly."
    303     ) from ex
--> 304 return manager.build(ignore_external=ignore_external)

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/manager.py:496, in ConfigurationManager.build(self, ignore_external)
    494     set_root_folder(self._build_root)
    495 snapshot = ConfigurationManager.strip_runtime_internal_metadata(self._snapshot(include_internal_metadata=True))
--> 496 return Accelerator.from_dict(snapshot, ignore_external=ignore_external)

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/accelerator.py:275, in Accelerator.from_dict(config_dict, ignore_external)
    273 # Ensure factory is clean before building a new accelerator
    274 Factory.clear()
--> 275 return Factory.depth_first_build(config_dict, ignore_external)

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:194, in PyAMLFactory.depth_first_build(self, d, ignore_external)
    191 # Do not recurse dict defined in ConfigModel
    192 # pydantic use TypedDict not usable with isinstance
    193 if str(fieldType) != "<class 'dict'>":
--> 194     obj = self.depth_first_build(value, ignore_external)
    195     # Replace the inner dict by the object itself
    196     d[key] = obj

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:177, in PyAMLFactory.depth_first_build(self, d, ignore_external)
    175 for _index, e in enumerate(d):
    176     if isinstance(e, dict) or isinstance(e, list):
--> 177         obj = self.depth_first_build(e, ignore_external)
    178         l.append(obj)
    179     else:

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:184, in PyAMLFactory.depth_first_build(self, d, ignore_external)
    181     return l
    183 elif isinstance(d, dict):
--> 184     _, config_cls, *_ = self.get_infos(d, ignore_external)
    186     for key, value in d.items():
    187         if not key == "__fieldlocations__":

File ~/checkouts/readthedocs.org/user_builds/pyaml/envs/stable/lib/python3.13/site-packages/pyaml/configuration/factory.py:84, in PyAMLFactory.get_infos(self, d, ignore_external)
     81 except ModuleNotFoundError as ex:
     82     if not ignore_external:
     83         # Discard module not found stack trace
---> 84         raise PyAMLConfigException(
     85             "Module referenced in type cannot be found:" + f"'{module_str}' {location_str}"
     86         ) from None
     87     else:
     88         return None

PyAMLConfigException: Module referenced in type cannot be found:'tango.pyaml.controlsystem' /home/docs/checkouts/readthedocs.org/user_builds/pyaml/checkouts/stable/tests/config/EBSTune.yaml at line 12, column 5.

Assuming these lines are present in …/…/tests/config/EBSTuneOATango.yaml

type: pyaml.accelerator
name: sr
energy: 6e9
controls:
  - type: pyaml-cs-oa.pyaml.controlsystem
      name: live
...
 powerconverter:
      type: pyaml_cs_oa.tangoRW
...
 tune_h:
    type: pyaml_cs_oa.tangoR

this works with Ophyd-Asynch - tango:

SR_OphydAsynch_Tango: Accelerator = Accelerator.load(”…/…/tests/config/EBSTuneOATango.yaml”)

Assuming these lines are present in …/…/tests/config/EBSTuneOAEpics.yaml

type: pyaml.accelerator
name: sr
energy: 6e9
controls:
  - type: pyaml-cs-oa.pyaml.controlsystem
      name: live
...
 powerconverter:
      type: pyaml_cs_oa.epicsRW
...
 tune_h:
    type: pyaml_cs_oa.epicsR

This work with Ophyd-Asynch - epics :

SR_OphydAsynch_Epics: Accelerator = Accelerator.load(”…/…/examples/BESSY2_example/BESSY2Tune.yaml”)