For the heating controls set up a class Room, creat instances for each room with all the relevant heating parameters, and then iterate through these instances to control the heating. This worked fine under indigo 2021.1 and earlier in python 2.7.
In python 3.1 it has not been as eay to find a neat way of iterationg through instances of a class, but the code below shows one way, which runs under 3.1 in ST3. This builds a class level list of the names of the rooms as astrings, and then uses this list to gnerate the iteration, converting the string names of the rooms to the actual class instances using the sys call:
identifier = getattr(sys.modules[__name__], strName)
However this won't run in Indigo. Am I missing something - is there some reason why the sys library returns different values because of the way code modules run within indigo?
Does anyone have a better method of iterating through instances of a class that does work under Indigo 2022.1?
Thanks in advance
Geoff
PYTHON CODE:
- Code: Select all
import time
import sys
"""########################################################################
Class name: Room
Function: This class handles all routines associated with room heating controls
########################################################################"""
class Room():
roomInstances = []
def __getitem__(self, key):
return self.__getattribute__(key)
def __setitem__(self, key, value):
self.__setattr__(key, value)
return "OK"
def __init__(self,name,floor,WeekDay,WeekEnd,Office,Empty,Fixed,User1,User2,defaultMode,days,radiators,heaters,roomTempSensor,roomThermostat = "",demandFactor = 1, radOffset = 0):
self.name = name
self.floor = floor
self.WeekDay = WeekDay
self.WeekEnd = WeekEnd
self.Office = Office
self.Empty = Empty
self.Fixed = Fixed
self.defaultMode = defaultMode
self.radiators = radiators
self.heaters = heaters
self.roomTempSensor = roomTempSensor
self.roomThermostat = roomThermostat
self.roomTempSensor = roomTempSensor
self.demandFactor = demandFactor
self.radOffset = radOffset
self.__class__.roomInstances.append(self.name)
# logPrint(0, "Room load - " + self.name)
logPrint(0, "Room instances in list: " + ', '.join(Room.roomInstances))
def logPrint(level, logStr):
# log levels 0-5, 0 suppresses everything, 1 is standard operation, 2-5 are debugging
print("%H% " + str(0) + " " + logStr)
return
def str_to_instance(strName, className):
try:
identifier = getattr(sys.modules[__name__], strName)
except AttributeError:
raise NameError("%s doesn't exist." % strName)
if isinstance(identifier, className):
return identifier
raise TypeError("%s is not an instance of class %t" % strName, className)
# *** Room Definitions
#Lounge
name = "Lounge"
floor = "0"
WeekDay = ['00:00',17,'08:00',19,'10:00',20,'16:00',21,'22:30',21,'23:00',17]
WeekEnd = ['00:00',17,'08:00',19,'10:00',20,'16:00',21,'22:30',21,'23:59',17]
Office = WeekDay
Empty = ['00:00',17,'08:00',19,'10:00',19,'16:00',19,'22:30',19,'23:00',17]
Fixed = ['00:00',20]
User1 = ['00:00',20]
User2 = ['00:00',20]
defaultMode = 'Normal'
days = ['Mon','WeekDay','Tue','WeekDay','Wed','WeekDay','Thu','WeekDay','Fri','WeekEnd','Sat','WeekEnd','Sun','WeekEnd']
radiators = ['RadStat Lounge Main','RadStat Lounge Left Window','RadStat Lounge Right Window']
heaters = []
Lounge = Room(name,floor,WeekDay,WeekEnd,Office,Empty,Fixed,User1,User2,defaultMode,days,radiators,heaters,roomTempSensor="Lounge - T",roomThermostat="RoomStat Lounge",demandFactor=2,radOffset=2.5)
#Dining Room
name="DiningRoom"
floor ="0"
WeekDay = ['00:00',17,'06:30',21,'10:00',20,'16:00',21,'22:30', 21,'23:00',17]
WeekEnd = ['00:00',17,'06:30',21,'10:00',20,'16:00',21,'22:30', 21,'23:59',17]
Office = WeekDay
Empty = ['00:00',17,'06:30',19,'10:00',19,'16:00',19,'22:30', 19,'23:00',17]
Fixed = ['00:00',20]
User1 = ['00:00',20]
User2 = ['00:00',20]
defaultMode = 'Normal'
days = ['Mon','WeekDay','Tue','WeekDay','Wed','WeekDay','Thu','WeekDay','Fri','WeekEnd','Sat','WeekEnd','Sun','WeekEnd']
radiators = ['RadStat Dining Room']
heaters = []
DiningRoom = Room(name,floor,WeekDay,WeekEnd,Office,Empty,Fixed,User1,User2,defaultMode,days,radiators,heaters,roomTempSensor="Dining Room - T",roomThermostat="",demandFactor=0.5,radOffset=1)
#Kitchen
name="Kitchen"
floor ="0"
WeekDay = ['00:00',17,'06:30',21,'10:00',20,'16:00',21,'22:30',21,'23:00',17]
WeekEnd = ['00:00',17,'06:30',21,'10:00',20,'16:00',21,'22:30',21,'23:30',17]
Office = WeekDay
Empty = ['00:00',17,'06:30',19,'10:00',19,'16:00',19,'22:30',19,'23:00',17]
Fixed = ['00:00',20]
User1 = ['00:00',20]
User2 = ['00:00',20]
defaultMode = 'Normal'
days = ['Mon','WeekDay','Tue','WeekDay','Wed','WeekDay','Thu','WeekDay','Fri','WeekEnd','Sat','WeekEnd','Sun','WeekEnd']
radiators = ['RadStat Kitchen','RadStat Utility Room']
heaters = []
Kitchen = Room(name,floor,WeekDay,WeekEnd,Office,Empty,Fixed,User1,User2,defaultMode,days,radiators,heaters,roomTempSensor="Kitchen - T",roomThermostat="",demandFactor=1,radOffset=-1)
"""########################################################################
MAIN ROUTINE
########################################################################"""
for roomName in Room.roomInstances:
roomID = str_to_instance(roomName, Room)
logPrint(0, "Room - " + roomName)
logPrint(0, "RoomName - " + str(roomID.name))