Basic Tango Recipes

Some recipes on using fandango and Tango

Create Tango devices from shell

The fandango api provides helper commands to create devices and assign properties:

import fandango as fn
fn.tango.add_new_device('Server/Instance','Class','your/device/name')
fn.tango.put_device_property('your/device/name','Property','Value')

You can also call them from shell (use fandango.sh in <12.6 releases):

> fandango add_new_device Server/Instance Class your/device/name
> fandango put_device_property your/device/name Property Value

To start it on any host managed by Starter:

> tango_servers "yourhostname" start "YourServer/YourInstance"

Visualize its state:

> tango_servers status "YourServer/YourInstance"

> fandango check_device your/device/name

Or just browse how a system behaves using wildcards:

> tango_servers status “PyPLC/*

> tando_servers hostname status “/

Get devices or attributes matching a regular expression

Using fandango.tango.get_matching_devices or get_matching_attributes:

from fandango import tango
tango.get_matching_devices('sr[0-9]+/vc/(ipct|vgct)*')
['SR01/VC/IPCT-01A08-01',
 'SR01/VC/IPCT-01A08-02',
 'SR01/VC/IPCT-02A01-01',
 'SR01/VC/VGCT-01A08-01',
 'SR01/VC/VGCT-02A01-01',
 'SR02/VC/IPCT-02A02-01',

 tango.get_matching_attributes('bo01*corv*/current')
 ['bo01/pc/corv-01/Current',
  'bo01/pc/corv-03/Current',
  'bo01/pc/corv-05/Current',
  'bo01/pc/corv-06/Current',
  'bo01/pc/corv-07/Current',
  'bo01/pc/corv-09/Current',
  'bo01/pc/corv-11/Current']

 import fandango as fn
 fn.kmap(tango.read_attribute,tango.get_matching_attributes('bo01*corv*/current'))
 [('bo01/pc/corv-01/Current', 0.090130000000000002),
  ('bo01/pc/corv-03/Current', 0.084650000000000003),
  ('bo01/pc/corv-05/Current', 0.099900000000000003),
  ('bo01/pc/corv-06/Current', -0.054309999999999997),
  ('bo01/pc/corv-07/Current', 0.0099299999999999996),
  ('bo01/pc/corv-09/Current', 0.052699999999999997),
  ('bo01/pc/corv-11/Current', 0.081900000000000001)]

Search for device attribute/properties matching a regular expression:

fandango.tango.get_matching_device_properties('s01/*/*ct*','serial*')
{'S01/VC/IPCT-01': {'SerialLine': 'S01/VC/SERIAL-01'},
 'S01/VC/IPCT-02': {'SerialLine': 'S01/VC/SERIAL-02'},
 'S01/VC/VGCT-01': {'SerialLine': 'S01/VC/SERIAL-10'}}

Obtain all information from a device

In [59]:fandango.tango.get_device_info('sr/vc/gll')
Out[59]:fandango.Struct({
      'name': sr/vc/gll,
      'level': 4,
      'started': 11th February 2013 at 13:07:37,
      'PID': 11024,
      'ior': ...,
      'server': PyStateComposer/SR_VC,
      'host': nanana01,
      'stopped': 11th February 2013 at 12:49:49,
      'exported': 1,        })

start/stop all device servers in a machine (like Astor -> Stop All)

import fandango
fandango.Astor(hosts=['my.host']).stop_all_servers()

astor = fandango.Astor(hosts=['my.host'])
astor.start_all_servers()

if you just want to see if things are effectively running or not:

astor.states()

Example: Fast property update

This example will collect all running instances of PyAlarm and will replace its properties

import fandango as fn
servers = fandango.Astor('PyAlarm/*')
# Get running servers
running = [s for for s,v in servers.states().items() if v is not None]
# Get the list of devices
devs = fn.chain(*[servers[s].get_device_list() for s in running])

for d in devs:
  if not d.startswith('dserver'):
    prop = servers.proxies[d].get_property(['AlarmReceivers'])['AlarmReceivers']
    # Modify property values
    prop = [s.replace('%SRUBIO','%DFERNANDEZ') for s in prop]
    servers.proxies[d].put_property({'AlarmReceivers':prop})

# Reload the devices properties
for d in devs:
  servers.proxies[d].Init()

Use TangoEval to evaluate strings containing Tango Attributes

TangoEval class provides PyAlarm-like evaluation of strings containing attribute names (replacing them by its values). It is part of fandango.device module. The result of each evaluation is stored in te.result.

from fandango import TangoEval
te = TangoEval('(s01/vc/gauge-01/pressure + s01/vc/gauge-01/pressure) / 2.')

[Out]: TangoEval: result = 7.2e-10