Rather stuck with this one, I'd like to automatically (re)set the propery "relaystate" when one of the others (Tm, Tset, Th) is set, regardless of wether their value has changed.

Ingo

My code so far:

from collections import namedtuple
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter(
    '[%(levelname)-8s] %(asctime)s (%(name)-8s) - %(message)s',
    '%Y-%m-%d %H:%M:%S',
)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)


class Thermostat():
    def __init__(self, Tm=20, Tset=20, Th=0.3):
        logger.debug("__INIT__")
        self.Tm = Tm
        self.Tset = Tset
        self.Th = Th
        self.relaystate = None

    @property
    def Tm(self):
        logger.debug("GETTER Tm")
        return self._Tm
    @Tm.setter
    def Tm(self, value):
        logger.debug("SETTER Tm")
        self._Tm = value

    @property
    def Tset(self):
        logger.debug("GETTER Tset")
        return self._Tset
    @Tset.setter
    def Tset(self, value):
        logger.debug("SETTER Tset")
        self._Tset = value

    @property
    def Th(self):
        logger.debug("GETTER Th")
        return self._Th
    @Th.setter
    def Th(self, value):
        logger.debug("SETTER Th")
        self._Th = value

    @property
    def relaystate(self):
        logger.debug("GETTER relaystate")
        return self._relaystate
    @relaystate.setter
    def relaystate(self, value):
        logger.debug("SETTER relaystate")
        #on init while setting Tm, Tset and Th are not known
        #so relaystate can not be calculated
        try:
            lower = self.Tset-self.Th
            upper = self.Tset+self.Th
        except AttributeError as e:
            logger.debug("SETTER relaystate : %s", e)
            self._relaystate = None
        rlstate = namedtuple('relaystate', ['heat', 'cool'])
        if self.Tm < lower:
            value = rlstate(1,0)
        elif self.Tm > upper:
            value = rlstate(0,1)
        elif self.Tm > lower and self.Tm < upper:
            value = rlstate(0,0)
        self._relaystate = value


if __name__ == "__main__":

    TS1 = Thermostat()
    TS1.Tset = 44
    print("heat : ",TS1.relaystate.heat,"cool : ",TS1.relaystate.cool)

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to