A VmExecutor controlling a DAC

#!/usr/bin/env python

import PyTango

class VM:
    #
    # init_device
    #
    def __init__( self):
        self.ResultSim = None
        self.PositionSim = None
        self.proxies = []
        self.proxies.append( PyTango.DeviceProxy( "p23/dac/d1.01"))
        return
    #
    # dev_state
    #
    def dev_state( self):
        argout = PyTango.DevState.ON
        #
        # if one device is in FAULT the VM is in FAULT too
        #
        for proxy in self.proxies:
            if proxy.state() == PyTango.DevState.FAULT:
                argout = PyTango.DevState.FAULT
                break
            if argout == PyTango.DevState.ON:
                #
                # if one device is MOVING the VM is MOVING too
                #
                for proxy in self.proxies:
                    if proxy.state() == PyTango.DevState.MOVING:
                        argout = PyTango.DevState.MOVING
                        break
                    
		return argout
    #
    # Position
    #
    def read_Position( self):
        return self.proxies[0].read_attribute( "Voltage").value

    def write_Position( self, argin):
        if( argin < self.proxies[0].VoltageMin or
            argin > self.proxies[0].VoltageMax):
            PyTango.Except.throw_exception(
                "VmExecutor.DAC",
                "requested position outside limits %g %g " % (self.proxies[0].VoltageMin,
                                                              self.proxies[0].VoltageMax),
                "VmExecutor")		
        self.proxies[0].write_attribute( "Voltage", argin)	
        return 1
    #
    # UnitLimitMax
    #
    def read_UnitLimitMax( self):
        return self.proxies[0].VoltageMax

    def write_UnitLimitMax( self, argin):
        self.proxies[0].write_attribute( "VoltageMax", argin)	
    #
    # UnitLimitMin
    #
    def read_UnitLimitMin( self):
        return self.proxies[0].VoltageMin

    def write_UnitLimitMin( self, argin):
        self.proxies[0].write_attribute( "VoltageMin", argin)	
    #
    # CwLimit, CcwLimit
    #
    def read_CwLimit( self):
        return 0
    def read_CcwLimit( self):
        return 0
    #	
    # PositionSim	
    #	
    def read_PositionSim( self):
        if self.PositionSim is None:
            PyTango.Except.throw_exception( "VmExecutor.Dac", "PositionSim is undefined", "VmExecutor")
            return self.PositionSim

    def write_PositionSim( self, argin):
        self.PositionSim = argin
        self.ResultSim = []
        self.ResultSim.append( "x: %g " % argin)

    def read_ResultSim( self):
        if self.ResultSim is None:
            PyTango.Except.throw_exception( "VmExecutor.Dac", "ResultSim is undefined", "VmExecutor")
            return self.ResultSim

    def StopMove( self):
        return 1