pilctempctrl, with dynamic attribute

#!/usr/bin/env python3
#
# Exports
#  Commands:
#
#  Attributes:
#    Position
#      r: Temperature
#      w: TemperatureSetpoint
#    UnitLimitMax
#    UnitLimitMin
#
# Property:
#   DynamicAttributes: 
#     Steptime,double,rw
#     PTMaxTemperature,double,rw
#     PTTemp,double,r
#     Imon,double,r
#     Vmon,double,r
#     Control,int,rw   0: off, 1: on, 2: paused
#     Deadband,double,rw
#     TemperatureSetpoint,double,rw
#
import PyTango

class VM:
    #
    # init_device
    #
    def __init__( self):
        self.proxy = PyTango.DeviceProxy( 'p02/pilctempctrl/lakl.01')
        self.unitLimitMin = 0
        self.unitLimitMax = 1000
        self.deadband = 0.5
        self.proxy.write_attribute( "Control", 0)
        return
    #
    # dev_state
    #
    def dev_state( self):
        #
        # ctrl == 0: off, == 2: paused
        #
        ctrl = self.proxy.read_attribute( 'Control').value
        if ctrl == 0 or ctrl == 2:
            argout = PyTango.DevState.ON

        else: 
            setp = self.proxy.read_attribute( 'TemperatureSetpoint').value
            act = self.proxy.read_attribute( 'Temperature').value
            if abs( setp - act) < self.deadband:
                argout = PyTango.DevState.ON
            else: 
                argout = PyTango.DevState.MOVING
        return argout
    #
    # Position
    #
    def read_Position( self):
        return self.proxy.read_attribute( 'Temperature').value

    def write_Position( self, argin):
        if( argin < self.read_UnitLimitMin() or argin > self.read_UnitLimitMax()):
            PyTango.Except.throw_exception(
                "PiLCTempCtrl %s" % self.proxy.name(),
                "requested position %g outside limits %g %g " % ( argin, 
                                                                  self.read_UnitLimitMin(), 
                                                                  self.read_UnitLimitMax()), 
                "VmExecutor")
		
        self.proxy.write_attribute( "Control", 1)
        return self.proxy.write_attribute( "TemperatureSetpoint", argin)
    #
    # UnitLimitMax
    #
    def read_UnitLimitMax( self):
        return self.unitLimitMax

    def write_UnitLimitMax( self, argin):
        self.unitLimitMax = argin
        return 

    #
    # UnitLimitMin
    #
    def read_UnitLimitMin( self):
        return self.unitLimitMin

    def write_UnitLimitMin( self, argin):
        self.unitLimitMin = argin
        return 

    def read_DynamicAttr( self, name):
        if name.lower() == "steptime":
            argout = self.proxy.Steptime
        elif name.lower() == "control":
            argout = self.proxy.Control
        elif name.lower() == "deadband":
            argout = self.deadband
        elif name.lower() == "pttemp":
            argout = self.proxy.PTTemp
        elif name.lower() == "ptmaxtemperature":
            argout = self.proxy.PTMaxTemperature
        elif name.lower() == "temperaturesetpoint":
            argout = self.proxy.TemperatureSetpoint
        elif name.lower() == "imon":
            argout = self.proxy.Imon
        elif name.lower() == "vmon":
            argout = self.proxy.Vmon
        else: 
            PyTango.Except.throw_exception(
                "PiLCTempCtrl %s" % self.proxy.name(),
                "failed to identify attribute %s" % name,
                "VmExecutor")
        return argout

    def write_DynamicAttr( self, name, value):
        if name.lower() == "steptime":
            self.proxy.Steptime = value
        elif name.lower() == "control":
            self.proxy.Control = value
        elif name.lower() == "deadband":
            self.deadband = value
        elif name.lower() == "temperaturesetpoint":
            self.proxy.TemperatureSetpoint = value
        else: 
            PyTango.Except.throw_exception(
                "PiLCTempCtrl %s" % self.proxy.name(),
                "failed to identify attribute %s" % name,
                "VmExecutor")
        return 
    #
    # CwLimit, CcwLimit
    #
    def read_CwLimit( self):
        return 0
    def read_CcwLimit( self):
        return 0