Source code for ska_mid_dish_manager.utils.tango_helpers
"""This module provides utility functions for interacting with Tango devices."""
import logging
from typing import List, Optional
import tango
[docs]class TangoDbAccessor:
"""A class to access Tango device properties."""
[docs] def __init__(self, logger: logging.Logger, tango_device_name: str):
self._logger = logger
self._tango_device_name = tango_device_name
try:
self._database = tango.Database()
except tango.DevFailed as err:
err_description = "".join([str(arg.desc) for arg in err.args])
self._logger.error("Failed to connect to TangoDB: %s", err_description)
# TODO handle case where tango db is a file
# Question: does the tango.Database() api handle
# file-based databases or only a SQL database?
self._database = None
[docs] def get_device_property_value(self, property_name: str) -> Optional[List[str]]:
"""Read device property value from TangoDB.
:param property_name: Tango device property name
:type property_name: str
:return: value for the given property
:rtype: Optional[str]
"""
self._logger.debug("Getting device property value for %s.", property_name)
try:
device_properties = self._database.get_device_property(
self._tango_device_name, property_name
)
property_values = device_properties.get(property_name)
return property_values
except tango.DevFailed as e:
self._logger.error("Failed to read property %s: %s", property_name, e)
except AttributeError:
self._logger.error("Database connection is not available")
return None
[docs] def set_device_property_value(self, property_name: str, value: str) -> None:
"""Set a device property value in TangoDB.
:param property_name: Tango device property name
:type property_name: str
:param value: Value to set for the property
:type value: str
"""
self._logger.debug("Setting device property %s to value %s.", property_name, value)
try:
self._database.put_device_property(self._tango_device_name, {property_name: value})
except tango.DevFailed as e:
self._logger.error("Failed to set property %s: %s", property_name, e)
except AttributeError:
self._logger.error("Database connection is not available")