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")