def __init__(self, screensection, screenname): debugprint(config.dbgscreenbuild, "New WeatherScreenDesc ", screenname) screen.ScreenDesc.__init__(self, screensection, screenname, (('which', ('', )), )) utilities.LocalizeParams(self, screensection, WunderKey='', location='') self.scrlabel = screen.FlatenScreenLabel(self.label) # entries are (fontsize, centered, formatstring, values) self.conditions = [ (2, True, "{d}", self.scrlabel), (1, True, "{d[0]}", ('Location', )), (1, False, u"Now: {d[0]} {d[1]}\u00B0F", ('Sky', 'Temp')), (0, False, u" Feels like: {d[0]}\u00B0", ('Feels', )), (1, False, "Wind {d[0]}", ('WindStr', )), (1, False, "Sunrise: {d[0]:02d}:{d[1]:02d}", ('SunriseH', 'SunriseM')), (1, False, "Sunset: {d[0]:02d}:{d[1]:02d}", ('SunsetH', 'SunsetM')), (0, False, "Moon rise: {d[0]} set: {d[1]}", ('Moonrise', 'Moonset')), (0, False, " {d[0]}% illuminated", ('MoonPct', )), (0, False, "will be replaced", "") ] self.forecast = [ (1, False, u"{d[0]} {d[1]}\u00B0/{d[2]}\u00B0 {d[3]}", ('Day', 'High', 'Low', 'Sky')), (1, False, "Wind: {d[0]} at {d[1]}", ('WindDir', 'WindSpd')) ] self.Info = weatherinfo.WeatherInfo(self.WunderKey, self.location) utilities.register_example("WeatherScreenDesc", self)
def __init__(self, name, keys, overrides=fixedoverrides): screen.BaseKeyScreenDesc.__init__(self, overrides, name) debug.debugPrint('Screen', "Build Maintenance Screen") self.NavKeysShowing = False self.DefaultNavKeysShowing = False screen.AddUndefaultedParams(self, None, TitleFontSize=40, SubFontSize=25) for k, kt in keys.items(): NK = toucharea.ManualKeyDesc(self, k, [kt[0]], 'gold', 'black', 'red', KOn='black', KOff='red') if kt[1] is not None: if len( kt ) == 3: # need to add key reference to the proc for this key NK.Proc = functools.partial(kt[1], NK) else: NK.Proc = kt[1] self.Keys[k] = NK topoff = self.TitleFontSize + self.SubFontSize self.LayoutKeys(topoff, self.useablevertspacesansnav - topoff) self.DimTO = 60 self.PersistTO = 1 # setting to 0 would turn off timer and stick us here utilities.register_example("MaintScreenDesc", self)
def __init__(self, screensection, screenname): debugPrint('BuildScreen', "Build House Status Screen") screen.ScreenDesc.__init__(self, screensection, screenname, ()) # no extra cmd keys utilities.LocalizeParams(self, screensection, NormalOn=[], NormalOff=[]) checklist = [nm for nm in config.ISY.NodesByName if ((nm in self.NormalOn) or (nm in self.NormalOff))] # addr -> name utilities.register_example("HouseStatusScreenDesc", self)
def __init__(self, screensection, screenname, ExtraCmdButs=(), withnav=True): self.name = screenname self.keysbyord = [] utilities.LocalizeParams(self, screensection, 'CharColor', 'DimTO', 'BackgroundColor', 'CmdKeyCol', 'CmdCharCol', label=[screenname]) self.WithNav = withnav self.PrevScreen = self.NextScreen = None cbutwidth = (config.screenwidth - 2*config.horizborder)/(2 + len(ExtraCmdButs)) cvertcenter = config.screenheight - config.botborder/2 cbutheight = config.botborder - config.cmdvertspace*2 # todo condition on withnav? if False then None? if change then also fix FinishScreen not to fail on none self.PrevScreenKey = toucharea.ManualKeyDesc('**prev**', ['**prev**'], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=(config.horizborder + .5*cbutwidth, cvertcenter), size=(cbutwidth, cbutheight)) self.NextScreenKey = toucharea.ManualKeyDesc('**next**', ['**next**'], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=( config.horizborder + (1 + len(ExtraCmdButs) + .5)*cbutwidth, cvertcenter), size=(cbutwidth, cbutheight)) self.ExtraCmdKeys = [] for i in range(len(ExtraCmdButs)): hcenter = config.horizborder + (i + 1.5)*cbutwidth self.ExtraCmdKeys.append(toucharea.ManualKeyDesc(ExtraCmdButs[i][0], ExtraCmdButs[i][1], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=(hcenter, cvertcenter), size=(cbutwidth, cbutheight))) self.ExtraCmdKeys[-1].FinishKey((0,0),(0,0)) utilities.register_example('ScreenDesc', self)
def __init__(self, screensection, screenname): debugPrint('BuildScreen', "Build Clock Screen") screen.ScreenDesc.__init__(self, screensection, screenname) utilities.LocalizeParams(self, screensection, CharSize=[20], Font='droidsansmono', OutFormat=[]) for i in range(len(self.CharSize), len(self.OutFormat)): self.CharSize.append(self.CharSize[-1]) utilities.register_example("ClockScreen", self)
def __init__(self, thisscreen, keysection, kn, keytype): keyname, self.Hub = _resolvekeyname(kn, thisscreen.DefaultHubObj) #self.ControlObj = None # object on which to make operation calls self.DisplayObj = None # object whose state is reflected in key debug.debugPrint('Screen', " New ", keytype, " Key Desc ", keyname) ManualKeyDesc.__init__(self, thisscreen, keysection, keyname) screen.AddUndefaultedParams(self, keysection, SceneProxy='', NodeName='') if keyname == '*Action*': keyname = self.NodeName # special case for alert screen action keys that always have same name todo - can nodename ever be explicitly set otherwise? self.ControlObj, self.DisplayObj = self.Hub.GetNode(keyname, self.SceneProxy) if self.ControlObjUndefined(): debug.debugPrint('Screen', "Screen", keyname, "unbound") logsupport.Logs.Log('Key Binding missing: ' + self.name, severity=ConsoleWarning) if self.Verify: self.VerifyScreen = supportscreens.VerifyScreen(self, self.GoMsg, self.NoGoMsg, self.Verified, None, thisscreen, self.KeyColorOff, thisscreen.BackgroundColor, thisscreen.CharColor, self.State, thisscreen.HubInterestList) self.Proc = self.VerifyScreen.Invoke # todo make this a goto key; make verify screen always do a pop and get rid of the switch screens below else: self.Proc = self.KeyPressAction self.ProcDblTap = self.KeyPressActionDbl if keytype == 'ONOFF': self.KeyAction = 'OnOff' elif keytype == 'ON': self.KeyAction = 'On' else: self.KeyAction = 'Off' utilities.register_example("OnOffKey", self)
def __init__(self, thisscreen, keysection, keyname): debug.debugPrint('Screen', " New SetVar Key Desc ", keyname) ManualKeyDesc.__init__(self, thisscreen, keysection, keyname) screen.AddUndefaultedParams(self, keysection, VarType='undef', Var='', Value=0) try: self.Proc = self.SetVarKeyPressed if self.VarType != 'undef': # deprecate if self.VarType == 'State': self.VarName = (hubs.hubs.defaulthub.name, 'State', self.Var) # use default hub for each of these 2 elif self.VarType == 'Int': self.VarName = (hubs.hubs.defaulthub.name, 'Int', self.Var) elif self.VarType == 'Local': self.VarName = ('LocalVars', self.Var) else: logsupport.Logs.Log('VarType not specified for key ', self.Var, ' on screen ', thisscreen.name, severity=ConsoleWarning) self.Proc = ErrorKey logsupport.Logs.Log('VarKey definition using depreacted VarKey ', self.VarType, ' change to ', valuestore.ExternalizeVarName(self.VarName), severity=ConsoleWarning) else: self.VarName = self.Var.split(':') except Exception as e: logsupport.Logs.Log('Var key error on screen: ' + thisscreen.name + ' Var: ' + self.Var, severity=ConsoleWarning) logsupport.Logs.Log('Excpt: ', str(e)) self.Proc = ErrorKey utilities.register_example("SetVarKey", self)
def __init__(self, *args, **kwargs): self.State = True self.UnknownState = False self.KeyOnImage = None # type: pygame.Surface self.KeyOffImage = None # type: pygame.Surface self.KeyOnImageBase = None # type: pygame.Surface self.KeyOffImageBase = None # type: pygame.Surface self.KeyUnknownOverlay = None # type: pygame.Surface self.userstore = None self.BlinkTimer = None self.autocolordull = True self.usekeygaps = True # alternate creation signatures self.ButtonFontSizes = (31, 28, 25, 22, 20, 18, 16) if len(args) == 3: # signature: ManualKeyDesc(screen, keysection, keyname) # initialize by reading config file self.dosectioninit(*args) else: # signature: ManualKeyDesc(screen, keyname, label, bcolor, charcoloron, charcoloroff, center=, size=, KOn=, KOff=, proc=) # initializing from program code case self.docodeinit(*args, **kwargs) # Future may need to change signature if handling "holds"? self.autocolordull = self.KeyColorOff == '' if self.KeyColorOff == '': self.KeyColorOff = self.KeyColor if self.KeyColorOn == '': self.KeyColorOn = self.KeyColor if self.Size[0] != 0: # this key can be imaged now since it has a size self.FinishKey((0, 0), (0, 0)) utilities.register_example("ManualKeyDesc", self)
def __init__(self, keysection, keyname): debugPrint('BuildScreen', " New Key Desc ", keyname) toucharea.ManualKeyDesc.__init__(self, keysection, keyname) utilities.LocalizeParams(self, keysection, SceneProxy='', KeyRunThenName='', type='ONOFF') self.MonitorObj = None # ISY Object monitored to reflect state in the key (generally a device within a Scene) # for ONOFF keys (and others later) map the real and monitored nodes in the ISY # map the key to a scene or device - prefer to map to a scene so check that first # Obj is the representation of the ISY Object itself, addr is the address of the ISY device/scene if self.type in ('ONOFF'): if keyname in config.ISY.ScenesByName: self.RealObj = config.ISY.ScenesByName[keyname] if self.SceneProxy <> '': # explicit proxy assigned if self.SceneProxy in config.ISY.NodesByAddr: # address given self.MonitorObj = config.ISY.NodesByAddr[self.SceneProxy] debugPrint('BuildScreen', "Scene ", keyname, " explicit address proxying with ", self.MonitorObj.name, '(', self.SceneProxy, ')') elif self.SceneProxy in config.ISY.NodesByName: self.MonitorObj = config.ISY.NodesByName[self.SceneProxy] debugPrint('BuildScreen', "Scene ", keyname, " explicit name proxying with ", self.MonitorObj.name, '(', self.MonitorObj.address, ')') else: config.Logs.Log('Bad explicit scene proxy:' + self.name, severity=ConsoleWarning) else: for i in self.RealObj.members: device = i[1] if device.enabled and device.hasstatus: self.MonitorObj = device # todo try to status the device here to see if it will respond break else: config.Logs.Log('Skipping disabled/nonstatus device: ' + device.name, severity=ConsoleWarning) if self.MonitorObj is None: config.Logs.Log("No proxy for scene: " + keyname, severity=ConsoleError) debugPrint('BuildScreen', "Scene ", keyname, " default proxying with ", self.MonitorObj.name) elif keyname in config.ISY.NodesByName: self.RealObj = config.ISY.NodesByName[keyname] self.MonitorObj = self.RealObj else: debugPrint('BuildScreen', "Screen", keyname, "unbound") config.Logs.Log('Key Binding missing: ' + self.name, severity=ConsoleWarning) elif self.type in ("ONBLINKRUNTHEN"): self.State = False try: self.RealObj = config.ISY.ProgramsByName[self.KeyRunThenName] except: self.RealObj = None debugPrint('BuildScreen', "Unbound program key: ", self.name) config.Logs.Log("Missing Prog binding: " + self.name, severity=ConsoleWarning) else: debugPrint('BuildScreen', "Unknown key type: ", self.name) config.Logs.Log("Bad keytype: " + self.name, severity=ConsoleWarning) utilities.register_example("KeyDesc", self) debugPrint('BuildScreen', repr(self))
def __init__(self, thisscreen, keysection, keyname): debug.debugPrint('Screen', " New SetVarValue Key Desc ", keyname) self.Value = None ManualKeyDesc.__init__(self, thisscreen, keysection, keyname) screen.AddUndefaultedParams(self, keysection, Var='') self.Proc = self.SetVarValue utilities.register_example("SetVarValueKey", self)
def __init__(self): screen.BaseKeyScreenDesc.__init__(self, None, 'LOG', withnav=False) self.keysbyord = [ toucharea.TouchPoint( (config.screenwidth / 2, config.screenheight / 2), (config.screenwidth, config.screenheight)) ] utilities.register_example("LogDisplayScreen", self)
def __init__(self, thisscreen, keysection, keyname): debug.debugPrint('Screen', " New Blank Key Desc ", keyname) ManualKeyDesc.__init__(self, thisscreen, keysection, keyname) self.Proc = ErrorKey self.State = False self.label = self.label.append('(NoOp)') utilities.register_example("BlankKey", self)
def __init__(self): screen.BaseKeyScreenDesc.__init__(self, None, "LOG", withnav=False) self.keysbyord = [ toucharea.TouchPoint( (config.screenwidth / 2, config.screenheight / 2), (config.screenwidth, config.screenheight) ) ] utilities.register_example("LogDisplayScreen", self)
def __init__(self, screensection, screenname, parentscreen=None): ScreenDesc.__init__(self, screensection, screenname, parentscreen=parentscreen) AddUndefaultedParams(self, screensection, KeysPerColumn=0, KeysPerRow=0) self.buttonsperrow = -1 self.buttonspercol = -1 utilities.register_example('BaseKeyScreenDesc', self)
def __init__(self, screensection, screenname): debugprint(config.dbgscreenbuild, "Build Clock Screen") screen.ScreenDesc.__init__(self, screensection, screenname) utilities.LocalizeParams(self, screensection, CharSize=[20], Font='droidsansmono', OutFormat=[]) for i in range(len(self.CharSize), len(self.OutFormat)): self.CharSize.append(self.CharSize[-1]) utilities.register_example("ClockScreen", self)
def __init__(self, name, Center, Size, proc=None, procdbl=None): self.name = name self.Size = Size self.GappedSize = Size self.Center = Center self.Screen = None self.ControlObj = None self.Proc = proc # function that gets called on touch - expects to take a single parameter which is thee type of press self.ProcDblTap = procdbl self.Verify = False utilities.register_example("TouchPoint", self)
def __init__(self, screensection, screenname, ExtraCmdButs=(), withnav=True): ScreenDesc.__init__(self, screensection, screenname, ExtraCmdButs, withnav) utilities.LocalizeParams(self, None) self.buttonsperrow = -1 self.buttonspercol = -1 utilities.register_example('BaseKeyScreenDesc', self)
def __init__(self, keys): debugPrint("BuildScreen", "Build Maintenance Screen") screen.BaseKeyScreenDesc.__init__(self, fixedoverrides, "Maint", withnav=False) utilities.LocalizeParams(self, None, TitleFontSize=40, SubFontSize=25) self.keysbyord = [] for k, kt in keys.iteritems(): self.keysbyord.append( toucharea.ManualKeyDesc(k, [kt[0]], "gold", "black", "white", KOn="black", KOff="white", proc=kt[1]) ) topoff = self.TitleFontSize + self.SubFontSize self.LayoutKeys(topoff, config.screenheight - 2 * config.topborder - topoff) utilities.register_example("MaintScreenDesc", self)
def __init__(self, screensection, screenname): debug.debugPrint('Screen', "New WeatherScreenDesc ", screenname) screen.ScreenDesc.__init__(self, screensection, screenname) self.fmt = WFormatter() butsize = self.ButSize(1, 1, 0) self.Keys = OrderedDict({ 'condorfcst': toucharea.TouchPoint('condorfcst', (self.HorizBorder + .5 * butsize[0], self.TopBorder + .5 * butsize[1]), butsize, proc=self.CondOrFcst) }) self.currentconditions = True # show conditions or forecast screen.AddUndefaultedParams(self, screensection, location='', LocationSize=40) self.SetScreenTitle(screen.FlatenScreenLabel(self.label), 50, self.CharColor) self.condformat = u"{d[0]} {d[1]}\u00B0F", u" Feels like: {d[2]}\u00B0", "Wind {d[3]}@{d[4]}" self.condfields = list( ((self.location, 'Cond', x) for x in ('Sky', 'Temp', 'Feels', 'WindDir', 'WindMPH'))) # self.dayformat = "Sunrise: {d[0]:02d}:{d[1]:02d}","Sunset: {d[2]:02d}:{d[3]:02d}","Moon rise: {d[4]} set: {d[5]}","{d[6]}% illuminated" # self.dayfields = list(((self.location, 'Cond', x) for x in ('SunriseH','SunriseM','SunsetH','SunsetM','Moonrise','Moonset','MoonPct'))) self.dayformat = "Sunrise: {d[0]}", "Sunset: {d[1]}", "Moon rise: {d[2]} set: {d[3]}" self.dayfields = list( ((self.location, 'Cond', x) for x in ('Sunrise', 'Sunset', 'Moonrise', 'Moonset'))) self.footformat = "Readings as of {d[0]}", self.footfields = ((self.location, 'Cond', 'Age'), ) self.fcstformat = u"{d[0]} {d[1]}\u00B0/{d[2]}\u00B0 {d[3]}", "Wind: {d[4]}" self.fcstfields = list( ((self.location, 'Fcst', x) for x in ('Day', 'High', 'Low', 'Sky', 'WindSpd'))) try: self.store = valuestore.ValueStores[self.location] except KeyError: logsupport.Logs.Log( "Weather screen {} using non-existent location {}".format( screenname, self.location), severity=logsupport.ConsoleWarning) raise ValueError utilities.register_example("WeatherScreenDesc", self)
def __init__(self, screensection, screenname): debugPrint('BuildScreen', "New KeyScreenDesc ", screenname) screen.BaseKeyScreenDesc.__init__(self, screensection, screenname) self.subscriptionlist = {} # Build the Key objects for keyname in screensection: if isinstance(screensection[keyname], Section): NewKey = keydesc.KeyDesc(screensection[keyname], keyname) self.keysbyord.append(NewKey) self.LayoutKeys() utilities.register_example("KeyScreenDesc", self)
def __init__(self, screensection, screenname): debugprint(config.dbgscreenbuild, "New KeyScreenDesc ", screenname) screen.BaseKeyScreenDesc.__init__(self, screensection, screenname) self.subscriptionlist = {} # Build the Key objects for keyname in screensection: if isinstance(screensection[keyname], Section): NewKey = keydesc.KeyDesc(screensection[keyname], keyname) self.keysbyord.append(NewKey) self.LayoutKeys() utilities.register_example("KeyScreenDesc", self)
def __init__(self, flag, name, addr, parenttyp, parent, members): """ :rtype: Scene """ TreeItem.__init__(self, name, addr, parent) self.flag = flag self.parenttype = parenttyp # self.devGroup = devGroup self.members = members self.proxy = "" self.obj = None utilities.register_example("Scene", self)
def __init__(self, hub, flag, name, addr, parenttyp, parent, members): """ :rtype: Scene """ TreeItem.__init__(self, hub, name, addr, parent) self.flag = flag self.parenttype = parenttyp # self.devGroup = devGroup self.members = members self.proxy = "" self.obj = None utilities.register_example("Scene", self)
def __init__(self, *args, **kwargs): # alternate creation signatures self.ButtonFontSizes = (31, 28, 25, 22, 20, 18, 16) self.DynamicLabel = False if len(args) == 2: # signature: ManualKeyDesc(keysection, keyname) # initialize by reading config file self.dosectioninit(*args) else: # signature: ManualKeyDesc(keyname, label, bcolor, charcoloron, charcoloroff, center=, size=, KOn=, KOff=, proc=) # initializing from program code case self.docodeinit(*args, **kwargs) utilities.register_example("ManualKeyDesc", self)
def __init__(self, screensection, screenname): debugprint(config.dbgscreenbuild, "Build House Status Screen") screen.ScreenDesc.__init__(self, screensection, screenname, ()) # no extra cmd keys utilities.LocalizeParams(self, screensection, NormalOn=[], NormalOff=[]) checklist = [ nm for nm in config.ISY.NodesByName if ((nm in self.NormalOn) or (nm in self.NormalOff)) ] # addr -> name utilities.register_example("HouseStatusScreenDesc", self)
def __init__(self, screensection, screenname, ExtraCmdButs=(), withnav=True): self.name = screenname self.keysbyord = [] utilities.LocalizeParams(self, screensection, 'CharColor', 'DimTO', 'BackgroundColor', 'CmdKeyCol', 'CmdCharCol', label=[screenname]) self.WithNav = withnav self.PrevScreen = self.NextScreen = None cbutwidth = (config.screenwidth - 2 * config.horizborder) / (2 + len(ExtraCmdButs)) cvertcenter = config.screenheight - config.botborder / 2 cbutheight = config.botborder - config.cmdvertspace * 2 # todo condition on withnav? if False then None? if change then also fix FinishScreen not to fail on none self.PrevScreenKey = toucharea.ManualKeyDesc( '**prev**', ['**prev**'], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=(config.horizborder + .5 * cbutwidth, cvertcenter), size=(cbutwidth, cbutheight)) self.NextScreenKey = toucharea.ManualKeyDesc( '**next**', ['**next**'], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=(config.horizborder + (1 + len(ExtraCmdButs) + .5) * cbutwidth, cvertcenter), size=(cbutwidth, cbutheight)) self.ExtraCmdKeys = [] for i in range(len(ExtraCmdButs)): hcenter = config.horizborder + (i + 1.5) * cbutwidth self.ExtraCmdKeys.append( toucharea.ManualKeyDesc(ExtraCmdButs[i][0], ExtraCmdButs[i][1], self.CmdKeyCol, self.CmdCharCol, self.CmdCharCol, center=(hcenter, cvertcenter), size=(cbutwidth, cbutheight))) self.ExtraCmdKeys[-1].FinishKey((0, 0), (0, 0)) utilities.register_example('ScreenDesc', self)
def __init__(self, flag, name, addr, parenttyp, parentaddr, enabled, props): Folder.__init__(self, flag, name, addr, parenttyp, parentaddr) self.pnode = None # for things like KPLs self.enabled = enabled == "true" self.hasstatus = False # props is either an OrderedDict(@id:ST,@value:val, . . .) or a list of such if isinstance(props, collections.OrderedDict): props = [props] # make it a list so below always works for item in props: if item['@id'] == 'ST': if item['@value'] <> ' ': self.hasstatus = True # no use for nodetype now # device class -energy management # wattage, dcPeriod utilities.register_example("Node", self)
def __init__(self, screensection, screenname): debugPrint('BuildScreen', "New ThermostatScreenDesc ", screenname) screen.BaseKeyScreenDesc.__init__(self, screensection, screenname) utilities.LocalizeParams(self, screensection, 'KeyColor', 'KeyOffOutlineColor', 'KeyOnOutlineColor') self.info = {} self.fsize = (30, 50, 80, 160) if screenname in config.ISY.NodesByName: self.RealObj = config.ISY.NodesByName[screenname] else: self.RealObj = None config.Logs.Log("No Thermostat: " + screenname, severity=logsupport.ConsoleWarning) self.TitleRen = config.fonts.Font(self.fsize[1]).render(screen.FlatenScreenLabel(self.label), 0, wc(self.CharColor)) self.TitlePos = ((config.screenwidth - self.TitleRen.get_width())/2, config.topborder) self.TempPos = config.topborder + self.TitleRen.get_height() self.StatePos = self.TempPos + config.fonts.Font(self.fsize[3]).get_linesize() - scaleH(20) self.SPPos = self.StatePos + scaleH(25) self.AdjButSurf = pygame.Surface((config.screenwidth, scaleH(40))) self.AdjButTops = self.SPPos + config.fonts.Font(self.fsize[2]).get_linesize() - scaleH(5) centerspacing = config.screenwidth/5 self.AdjButSurf.fill(wc(self.BackgroundColor)) arrowsize = scaleH(40) # pixel for i in range(4): gfxdraw.filled_trigon(self.AdjButSurf, *trifromtop(centerspacing, arrowsize/2, i + 1, arrowsize, wc(("red", "blue", "red", "blue")[i]), i%2 <> 0)) self.keysbyord.append(toucharea.TouchPoint((centerspacing*(i + 1), self.AdjButTops + arrowsize/2), (arrowsize*1.2, arrowsize*1.2))) self.ModeButPos = self.AdjButTops + scaleH(85) # pixel bsize = (scaleW(100), scaleH(50)) # pixel self.keysbyord.append(toucharea.ManualKeyDesc("Mode", ["Mode"], self.KeyColor, self.CharColor, self.CharColor, center=(config.screenwidth/4, self.ModeButPos), size=bsize, KOn=config.KeyOffOutlineColor)) # todo clean up self.keysbyord.append(toucharea.ManualKeyDesc("Fan", ["Fan"], self.KeyColor, self.CharColor, self.CharColor, center=(3*config.screenwidth/4, self.ModeButPos), size=bsize, KOn=config.KeyOffOutlineColor)) self.keysbyord[4].FinishKey((0,0),(0,0)) self.keysbyord[5].FinishKey((0,0),(0,0)) self.ModesPos = self.ModeButPos + bsize[1]/2 + scaleH(5) utilities.register_example("ThermostatScreenDesc", self)
def __init__(self, screensection, screenname): debugprint(config.dbgscreenbuild, "New ThermostatScreenDesc ", screenname) screen.BaseKeyScreenDesc.__init__(self, screensection, screenname) utilities.LocalizeParams(self, screensection, 'KeyColor', 'KeyOffOutlineColor', 'KeyOnOutlineColor') self.info = {} self.fsize = (30, 50, 80, 160) if screenname in config.ISY.NodesByName: self.RealObj = config.ISY.NodesByName[screenname] else: self.RealObj = None config.Logs.Log("No Thermostat: " + screenname, severity=logsupport.ConsoleWarning) self.TitleRen = config.fonts.Font(self.fsize[1]).render(screen.FlatenScreenLabel(self.label), 0, wc(self.CharColor)) self.TitlePos = ((config.screenwidth - self.TitleRen.get_width())/2, config.topborder) self.TempPos = config.topborder + self.TitleRen.get_height() self.StatePos = self.TempPos + config.fonts.Font(self.fsize[3]).get_linesize() - scaleH(20) self.SPPos = self.StatePos + scaleH(25) self.AdjButSurf = pygame.Surface((config.screenwidth, scaleH(40))) self.AdjButTops = self.SPPos + config.fonts.Font(self.fsize[2]).get_linesize() - scaleH(5) centerspacing = config.screenwidth/5 self.AdjButSurf.fill(wc(self.BackgroundColor)) arrowsize = scaleH(40) # pixel for i in range(4): gfxdraw.filled_trigon(self.AdjButSurf, *trifromtop(centerspacing, arrowsize/2, i + 1, arrowsize, wc(("red", "blue", "red", "blue")[i]), i%2 <> 0)) self.keysbyord.append(toucharea.TouchPoint((centerspacing*(i + 1), self.AdjButTops + arrowsize/2), (arrowsize*1.2, arrowsize*1.2))) self.ModeButPos = self.AdjButTops + scaleH(85) # pixel bsize = (scaleW(100), scaleH(50)) # pixel self.keysbyord.append(toucharea.ManualKeyDesc("Mode", ["Mode"], self.KeyColor, self.CharColor, self.CharColor, center=(config.screenwidth/4, self.ModeButPos), size=bsize, KOn=config.KeyOffOutlineColor)) # todo clean up self.keysbyord.append(toucharea.ManualKeyDesc("Fan", ["Fan"], self.KeyColor, self.CharColor, self.CharColor, center=(3*config.screenwidth/4, self.ModeButPos), size=bsize, KOn=config.KeyOffOutlineColor)) self.keysbyord[4].FinishKey((0,0),(0,0)) self.keysbyord[5].FinishKey((0,0),(0,0)) self.ModesPos = self.ModeButPos + bsize[1]/2 + scaleH(5) utilities.register_example("ThermostatScreenDesc", self)
def __init__(self, screensection, screenname): screen.ScreenDesc.__init__(self, screensection, screenname) debug.debugPrint('Screen', "Build Clock Screen") screen.AddUndefaultedParams(self, screensection, CharSize=[20], Font=fonts.monofont, OutFormat=[], ExtraFields=[], ExtraSize=[0], ExtraFormat=[]) for i in range(len(self.CharSize), len(self.OutFormat)): self.CharSize.append(self.CharSize[-1]) self.KeyList = None # no touch areas active on this screen utilities.register_example("ClockScreen", self) self.DecodedExtraFields = [] for f in self.ExtraFields: if ':' in f: self.DecodedExtraFields.append(f.split(':')) else: logsupport.Logs.Log("Incomplete field specified on clockscreen", severity=ConsoleWarning) self.poster = RepeatingPost(1.0, paused=True, name=self.name, proc=self.repaintClock) self.poster.start()
def __init__(self, keys): debugprint(config.dbgscreenbuild, "Build Maintenance Screen") screen.BaseKeyScreenDesc.__init__(self, fixedoverrides, 'Maint', withnav=False) utilities.LocalizeParams(self, None, TitleFontSize=40, SubFontSize=25) self.keysbyord = [] for k, kt in keys.iteritems(): self.keysbyord.append( toucharea.ManualKeyDesc(k, [kt[0]], 'gold', 'black', 'black', KOn='black', KOff='black', proc=kt[1])) topoff = self.TitleFontSize + self.SubFontSize self.LayoutKeys(topoff, config.screenheight - 2 * config.topborder - topoff) utilities.register_example("MaintScreenDesc", self)
def __init__(self, screensection, screenname): debugPrint('BuildScreen', "New WeatherScreenDesc ", screenname) screen.ScreenDesc.__init__(self, screensection, screenname, (('which',('',)),)) utilities.LocalizeParams(self, screensection, WunderKey='', location='') self.scrlabel = screen.FlatenScreenLabel(self.label) # entries are (fontsize, centered, formatstring, values) self.conditions = [(2, True, "{d}", self.scrlabel), (1, True, "{d[0]}", ('Location',)), (1, False, u"Now: {d[0]} {d[1]}\u00B0F", ('Sky', 'Temp')), (0, False, u" Feels like: {d[0]}\u00B0", ('Feels',)), (1, False, "Wind {d[0]}", ('WindStr',)), (1, False, "Sunrise: {d[0]:02d}:{d[1]:02d}", ('SunriseH', 'SunriseM')), (1, False, "Sunset: {d[0]:02d}:{d[1]:02d}", ('SunsetH', 'SunsetM')), (0, False, "Moon rise: {d[0]} set: {d[1]}", ('Moonrise', 'Moonset')), (0, False, " {d[0]}% illuminated", ('MoonPct',)), (0, False, "will be replaced", "")] self.forecast = [(1, False, u"{d[0]} {d[1]}\u00B0/{d[2]}\u00B0 {d[3]}", ('Day', 'High', 'Low', 'Sky')), (1, False, "Wind: {d[0]} at {d[1]}", ('WindDir', 'WindSpd'))] self.Info = weatherinfo.WeatherInfo(self.WunderKey, self.location) utilities.register_example("WeatherScreenDesc", self)
def __init__(self, screensection, screenname): screen.BaseKeyScreenDesc.__init__(self, screensection, screenname) debug.debugPrint('Screen', "New KeyScreenDesc ", screenname) # Build the Key objects for keyname in screensection: if isinstance(screensection[keyname], Section): self.Keys[keyname] = keyspecs.CreateKey( self, screensection[keyname], keyname) self.LayoutKeys() debug.debugPrint('Screen', "Active Subscription List for ", self.name, " will be:") for h, l in self.HubInterestList.items(): for i, j in l.items(): debug.debugPrint( 'Screen', " Subscribe on hub " + h + " node: " + i + ' ' + j.name + ":" + j.ControlObj.name + ' via ' + j.DisplayObj.name) utilities.register_example("KeyScreenDesc", self)
def __init__(self, *args, **kwargs): # alternate creation signatures self.ButtonFontSizes = (31, 28, 25, 22, 20, 18, 16) # self.DynamicLabel = False if len(args) == 2: # signature: ManualKeyDesc(keysection, keyname) # initialize by reading config file self.dosectioninit(*args) else: # signature: ManualKeyDesc(keyname, label, bcolor, charcoloron, charcoloroff, center=, size=, KOn=, KOff=, proc=) # initializing from program code case self.docodeinit(*args, **kwargs) if self.KeyColorOff == '': self.KeyColorOff = self.KeyColor if self.KeyColorOn == '': self.KeyColorOn = self.KeyColor if self.KeyLabelOn == ['', ]: self.KeyLabelOn = self.label if self.KeyLabelOff == ['', ]: self.KeyLabelOff = self.label utilities.register_example("ManualKeyDesc", self)
def __init__(self, key, gomsg, nogomsg, procyes, procno, callingscreen, bcolor, keycoloroff, charcolor, state, interestlist): screen.BaseKeyScreenDesc.__init__(self, {}, key.name + '-Verify', parentscreen=key) debug.debugPrint('Screen', "Build Verify Screen") self.NavKeysShowing = False self.DefaultNavKeysShowing = False self.HubInterestList = interestlist self.DimTO = 20 self.PersistTO = 10 self.label = screen.FlatenScreenLabel(key.label) self.ClearScreenTitle() # don't use parent screen title self.CallingScreen = callingscreen screen.AddUndefaultedParams(self, None, TitleFontSize=40, SubFontSize=25) self.SetScreenTitle(self.label, 40, charcolor) self.Keys['yes'] = ManualKeyDesc(self, 'yes', gomsg, bcolor, keycoloroff, charcolor, State=state) self.Keys['yes'].Proc = procyes # functools.partial(proc, True) self.Keys['no'] = ManualKeyDesc(self, 'no', nogomsg, bcolor, keycoloroff, charcolor, State=state) self.Keys[ 'no'].Proc = procno if procno is not None else self.DefaultNo # functools.partial(proc, False) self.LayoutKeys(self.startvertspace, self.useablevertspace) utilities.register_example("VerifyScreen", self)
def __init__(self): screen.BaseKeyScreenDesc.__init__(self, None, 'LOG') self.NavKeysShowing = False self.DefaultNavKeysShowing = False self.state = 'init' # init: new entry to logs; scroll: doing error scroll manual: user control self.startat = 0 # where in log page starts self.startpage = 0 self.item = 0 self.pageno = -1 self.PageStartItem = [0] self.Keys = { 'nextpage': toucharea.TouchPoint('nextpage', (hw.screenwidth / 2, 3 * hw.screenheight / 4), (hw.screenwidth, hw.screenheight), proc=self.NextPage), 'prevpage': toucharea.TouchPoint('prevpage', (hw.screenwidth / 2, hw.screenheight / 4), (hw.screenwidth, hw.screenheight / 2), proc=self.PrevPage) } self.name = 'Log' utilities.register_example("LogDisplayScreen", self)
def __init__(self, ISYsession): """ Get and parse the ISY configuration to set up an internal analog of its structure :param ISYsession: :return: """ self.NodeRoot = Folder(0, '*root*', u'0', 0, u'0') self.ProgRoot = None self.NodesByAddr = {} self.FoldersByAddr = {'0': self.NodeRoot} self.ScenesByAddr = {} self.NodesByName = {} self.ScenesByName = {} self.FoldersByName = {} self.ProgramFoldersByAddr = {} self.ProgramsByAddr = {} self.ProgramsByName = {} self.ProgramFoldersByName = {} self.varsState = {} self.varsInt = {} """ Build the Folder/Node/Scene tree """ trycount = 20 while True: try: r = ISYsession.get(config.ISYprefix + 'nodes', verify=False, timeout=3) config.Logs.Log('Successful node read: ' + str(r.status_code)) break # except requests.exceptions.ConnectTimeout: except: # after total power outage ISY is slower to come back than RPi so # we wait testing periodically. Eventually we try rebooting just in case our own network # is what is hosed trycount -= 1 if trycount > 0: config.Logs.Log('ISY not responding') config.Logs.Log('-ISY (nodes): ' + config.ISYprefix) time.sleep(15) else: config.Logs.Log('No ISY response restart (nodes)') maintscreen.errorexit('reboot') sys.exit(10) # should never get here if r.status_code <> 200: print 'ISY text response:' print '-----' print r.text print '-----' print 'Cannot access ISY - check username and password. Status code: ' + str(r.status_code) config.Logs.Log('Cannot access ISY - check username/password') config.Logs.Log('Status code: ' + str(r.status_code)) time.sleep(10) maintscreen.errorexit('shut') config.Ending = True sys.exit(4) configdict = xmltodict.parse(r.text)['nodes'] for folder in configdict['folder']: addr = folder['address'] parentaddr = str(0) ptyp = 3 if 'parent' in folder: ptyp = int(folder['parent']['@type']) parentaddr = folder['parent']['#text'] self.FoldersByAddr[addr] = Folder(folder['@flag'], folder['name'], str(addr), ptyp, parentaddr) self.LinkChildrenParents(self.FoldersByAddr, self.FoldersByName, self.FoldersByAddr, self.NodesByAddr) fixlist = [] for node in configdict['node']: parentaddr = str(0) ptyp = 3 if 'parent' in node: ptyp = int(node['parent']['@type']) parentaddr = node['parent']['#text'] try: n = Node(node['@flag'], node['name'], node['address'], ptyp, parentaddr, node['enabled'], node['property']) fixlist.append((n, node['pnode'])) self.NodesByAddr[n.address] = n except: pass # for now at least try to avoid nodes without properties which apparently Zwave devices may have self.LinkChildrenParents(self.NodesByAddr, self.NodesByName, self.FoldersByAddr, self.NodesByAddr) for fixitem in fixlist: fixitem[0].pnode = self.NodesByAddr[fixitem[1]] for scene in configdict['group']: memberlist = [] if scene['members'] is not None: m1 = scene['members']['link'] if isinstance(m1, list): for m in m1: memberlist.append((int(m['@type']), self.NodesByAddr[m['#text']])) else: memberlist.append((int(m1['@type']), self.NodesByAddr[m1['#text']])) if 'parent' in scene: ptyp = int(scene['parent']['@type']) p = scene['parent']['#text'] else: ptyp = 0 p = '0' self.ScenesByAddr[scene['address']] = Scene(scene['@flag'], scene['name'], str(scene['address']), ptyp, p, memberlist) else: if scene['name'] <> '~Auto DR': print 'Scene with no members', scene['name'] self.LinkChildrenParents(self.ScenesByAddr, self.ScenesByName, self.FoldersByAddr, self.NodesByAddr) if config.Flags['ISY']: self.PrintTree(self.NodeRoot, " ") """ Build the Program tree """ trycount = 20 while True: try: r = ISYsession.get(config.ISYprefix + 'programs?subfolders=true', verify=False, timeout=3) config.Logs.Log('Successful programs read: ' + str(r.status_code)) break # except requests.exceptions.ConnectTimeout: except: # after total power outage ISY is slower to come back than RPi so # we wait testing periodically. Eventually we try rebooting just in case our own network # is what is hosed trycount -= 1 if trycount > 0: config.Logs.Log('ISY not responding') config.Logs.Log('-ISY(programs): ' + config.ISYprefix) time.sleep(15) else: config.Logs.Log('No ISY response restart (programs)') maintscreen.errorexit('reboot') sys.exit(12) # should never get here # todo check r.status for 200? looks like simetimes r,text is garbage early on? configdict = xmltodict.parse(r.text)['programs']['program'] for item in configdict: if item['@id'] == '0001': # Program Root self.ProgRoot = ProgramFolder(item['name'], '0001', '0001') self.ProgramFoldersByAddr['0001'] = self.ProgRoot else: if item['@folder'] == 'true': self.ProgramFoldersByAddr[item['@id']] = ProgramFolder(item['name'], item['@id'], item['@parentId']) else: self.ProgramsByAddr[item['@id']] = Program(item['name'], item['@id'], item['@parentId']) self.LinkChildrenParents(self.ProgramFoldersByAddr, self.ProgramFoldersByName, self.ProgramFoldersByAddr, self.ProgramsByAddr) self.LinkChildrenParents(self.ProgramsByAddr, self.ProgramsByName, self.ProgramFoldersByAddr, self.ProgramsByAddr) """ Get the variables """ while True: try: r1 = ISYsession.get(config.ISYprefix + 'vars/definitions/2', verify=False, timeout=3) r2 = ISYsession.get(config.ISYprefix + 'vars/definitions/1', verify=False, timeout=3) config.Logs.Log('Successful variable read: ' + str(r1.status_code) + '/' + str(r2.status_code)) break # except requests.exceptions.ConnectTimeout: except: # after total power outage ISY is slower to come back than RPi so # we wait testing periodically. Eventually we try rebooting just in case our own network # is what is hosed trycount -= 1 if trycount > 0: config.Logs.Log('ISY not responding') config.Logs.Log('-ISY(vars): ' + config.ISYprefix) time.sleep(15) else: config.Logs.Log('No ISY response restart (vars)') maintscreen.errorexit('reboot') sys.exit(12) # should never get here # todo check r.status for 200? looks like simetimes r,text is garbage early on? configdict = xmltodict.parse(r1.text)['CList']['e'] for v in configdict: self.varsState[v['@name']] = v['@id'] configdict = xmltodict.parse(r2.text)['CList']['e'] for v in configdict: self.varsInt[v['@name']] = v['@id'] utilities.register_example("ISY", self) if config.Flags['ISY']: self.PrintTree(self.ProgRoot, " ")
def __init__(self, name, isyaddr, user, pwd): if isyaddr == '' or user == '': logsupport.Logs.Log( "ISY id info missing: addr: {} user: {}".format( isyaddr, user), severity=ConsoleError) raise ValueError if isyaddr.startswith('http'): self.ISYprefix = isyaddr + '/rest/' else: self.ISYprefix = 'http://' + isyaddr + '/rest/' self.ISYrequestsession = requests.session() self.ISYrequestsession.auth = (user, pwd) self.name = name self.addr = isyaddr self.user = user self.password = pwd self._NodeRoot = Folder(self, 0, '', u'0', 0, u'0') # *root* self._ProgRoot = None self.NodesByAddr = {} self._FoldersByAddr = {'0': self._NodeRoot} self._ScenesByAddr = {} self._NodesByName = {} self._NodesByFullName = {} self._ScenesByName = {} self._FoldersByName = {} self._ProgramFoldersByAddr = {} self._ProgramsByAddr = {} self._ProgramsByName = {} self._ProgramFoldersByName = {} self._HubOnline = False self.Vars = None self.ErrNodes = {} self.Busy = 0 self.V3Nodes = [ ] # temporary way to track and suppress errors from nodes we don't currently handle (todo V3) """ Build the Folder/Node/Scene tree """ logsupport.Logs.Log( "{}: Create Structure for ISY hub at {} for user {}".format( name, isyaddr, user)) trycount = 20 while True: # noinspection PyBroadException try: historybuffer.HBNet.Entry('ISY nodes get') r = self.ISYrequestsession.get(self.ISYprefix + 'nodes', verify=False, timeout=5) historybuffer.HBNet.Entry('ISY nodes get done') logsupport.Logs.Log('{}: Successful node read: {}'.format( name, r.status_code)) break except: # after total power outage ISY is slower to come back than RPi so # we wait testing periodically. Eventually we try rebooting just in case our own network # is what is hosed trycount -= 1 if trycount > 0: logsupport.Logs.Log( '{}: Hub not responding (nodes) at: {}'.format( self.name, self.ISYprefix)) time.sleep(15) else: logsupport.Logs.Log('No ISY response restart (nodes)') exitutils.errorexit(exitutils.ERRORPIREBOOT) logsupport.Logs.Log('Reached unreachable code! ISY1') if r.status_code != 200: logsupport.Logs.Log('Hub (' + self.name + ') text response:', severity=ConsoleError) logsupport.Logs.Log('-----', severity=ConsoleError) logsupport.Logs.Log(r.text, severity=ConsoleError) logsupport.Logs.Log('-----', severity=ConsoleError) logsupport.Logs.Log('Cannot access ISY - check username/password') logsupport.Logs.Log('Status code: ' + str(r.status_code)) time.sleep(10) exitutils.errorexit(exitutils.ERRORDIE) logsupport.Logs.Log('Reached unreachable code! ISY2') configdict = xmltodict.parse(r.text)['nodes'] if debug.dbgStore.GetVal('ISYLoad'): with open('/home/pi/Console/xml.dmp', 'r') as f: x1 = f.readline().rstrip('\n') x2 = f.readline().rstrip('\n') x3 = f.readline().rstrip('\n') x4 = f.readline().rstrip('\n') configdict = xmltodict.parse(x1)['nodes'] else: x2 = '' x3 = '' x4 = '' if debug.dbgStore.GetVal('ISYDump'): debug.ISYDump("xml.dmp", r.text, pretty=False, new=True) debug.ISYDump("struct.dmp", configdict, new=True) debug.ISYDump("isystream.dmp", "", pretty=False, new=True) for folder in configdict['folder']: addr = folder['address'] parentaddr = str(0) ptyp = 3 if 'parent' in folder: ptyp = int(folder['parent']['@type']) parentaddr = folder['parent']['#text'] self._FoldersByAddr[addr] = Folder(self, folder['@flag'], folder['name'], str(addr), ptyp, parentaddr) self._LinkChildrenParents(self._FoldersByAddr, self._FoldersByName, self._FoldersByAddr, self.NodesByAddr) fixlist = [] for node in configdict['node']: parentaddr = str(0) ptyp = 3 flg = 'unknown' nm = 'unknown' addr = 'unknown' enabld = 'unknown' prop = 'unknown' pnd = 'unknown' if 'parent' in node: ptyp = int(node['parent']['@type']) parentaddr = node['parent']['#text'] # noinspection PyBroadException try: flg = node['@flag'] nm = node['name'] addr = node['address'] enabld = node['enabled'] pnd = node['pnode'] prop = node['property'] n = Node(self, flg, nm, addr, ptyp, parentaddr, enabld, prop) fixlist.append((n, pnd)) self.NodesByAddr[n.address] = n except Exception as E: if prop == 'unknown': # probably a v3 polyglot node or zwave logsupport.Logs.Log( "Probable v5 node seen: {} Address: {} Parent: {} ". format(nm, addr, pnd), severity=ConsoleDetail) logsupport.Logs.Log("ISY item: {}".format(repr(node)), severity=ConsoleDetail) self.V3Nodes.append(addr) else: logsupport.Logs.Log("Problem with processing node: ", nm, ' Address: ', str(addr), ' Pnode: ', str(pnd), ' ', str(flg), '/', str(enabld), '/', repr(prop), severity=ConsoleWarning) logsupport.Logs.Log("Exc: {} ISY item: {}".format( repr(E), repr(node)), severity=ConsoleWarning) # for now at least try to avoid nodes without properties which apparently Zwave devices may have self._LinkChildrenParents(self.NodesByAddr, self._NodesByName, self._FoldersByAddr, self.NodesByAddr) for fixitem in fixlist: # noinspection PyBroadException try: fixitem[0].pnode = self.NodesByAddr[fixitem[1]] except: logsupport.Logs.Log("Problem with processing node: ", fixitem[1], severity=ConsoleWarning) for scene in configdict['group']: memberlist = [] if scene['members'] is not None: m1 = scene['members']['link'] naddr = '' # noinspection PyBroadException try: if isinstance(m1, list): for m in m1: naddr = m['#text'] memberlist.append( (int(m['@type']), self.NodesByAddr[naddr])) else: naddr = m1['#text'] memberlist.append( (int(m1['@type']), self.NodesByAddr[naddr])) except: logsupport.Logs.Log("Error adding member to scene: ", str(scene['name']), ' Node address: ', naddr, severity=ConsoleWarning) debug.debugPrint('ISYDump', 'Scene: ', m1) if 'parent' in scene: ptyp = int(scene['parent']['@type']) p = scene['parent']['#text'] else: ptyp = 0 p = '0' self._ScenesByAddr[scene['address']] = Scene( self, scene['@flag'], scene['name'], str(scene['address']), ptyp, p, memberlist) else: if scene['name'] not in ('~Auto DR', 'Auto DR'): logsupport.Logs.Log('Scene with no members ', scene['name'], severity=ConsoleWarning) self._LinkChildrenParents(self._ScenesByAddr, self._ScenesByName, self._FoldersByAddr, self.NodesByAddr) self._SetFullNames(self._NodeRoot, "") if debug.dbgStore.GetVal('ISYdbg'): self.PrintTree(self._NodeRoot, " ", 'Nodes') """ Build the Program tree """ trycount = 20 while True: # noinspection PyBroadException try: historybuffer.HBNet.Entry('ISY programs get') r = self.ISYrequestsession.get(self.ISYprefix + 'programs?subfolders=true', verify=False, timeout=5) historybuffer.HBNet.Entry('ISY programs get done') if r.status_code != 200: logsupport.Logs.Log('Hub (' + self.name + ') bad program read' + r.text, severity=ConsoleWarning) raise requests.exceptions.ConnectionError # fake a connection error if we didn't get a good read logsupport.Logs.Log('{}: Successful programs read: {}'.format( self.name, r.status_code)) break # except requests.exceptions.ConnectTimeout: except: # after total power outage ISY is slower to come back than RPi sowait testing periodically. # Eventually we try rebooting just in case our own network is what is hosed trycount -= 1 if trycount > 0: logsupport.Logs.Log( '{}: Hub not responding (programs) at: {}'.format( self.name, self.ISYprefix)) time.sleep(15) else: logsupport.Logs.Log('No ISY response restart (programs)') exitutils.errorexit(exitutils.ERRORPIREBOOT) configdict = xmltodict.parse(r.text)['programs']['program'] if debug.dbgStore.GetVal('ISYLoad'): configdict = xmltodict.parse(x2)['programs']['program'] if debug.dbgStore.GetVal('ISYDump'): debug.ISYDump("xml.dmp", r.text, pretty=False) debug.ISYDump("struct.dmp", configdict) for item in configdict: if item['@id'] == '0001': # Program Root self._ProgRoot = ProgramFolder(self, item['name'], '0001', '0001') self._ProgramFoldersByAddr['0001'] = self._ProgRoot else: if item['@folder'] == 'true': self._ProgramFoldersByAddr[item['@id']] = ProgramFolder( self, item['name'], item['@id'], item['@parentId']) else: self._ProgramsByAddr[item['@id']] = Program( self, item['name'], item['@id'], item['@parentId']) self._LinkChildrenParents(self._ProgramFoldersByAddr, self._ProgramFoldersByName, self._ProgramFoldersByAddr, self._ProgramsByAddr) self._LinkChildrenParents(self._ProgramsByAddr, self._ProgramsByName, self._ProgramFoldersByAddr, self._ProgramsByAddr) """ Get the variables """ while True: # noinspection PyBroadException try: historybuffer.HBNet.Entry('ISY vars get') r1 = self.ISYrequestsession.get(self.ISYprefix + 'vars/definitions/2', verify=False, timeout=5) r2 = self.ISYrequestsession.get(self.ISYprefix + 'vars/definitions/1', verify=False, timeout=5) historybuffer.HBNet.Entry('ISY vars get done') # for some reason var reads seem to typically take longer to complete so to at 5 sec if r1.status_code != 200 or r2.status_code != 200: logsupport.Logs.Log("Bad ISY var read" + r1.text + r2.text, severity=ConsoleWarning) raise requests.exceptions.ConnectionError # fake connection error on bad read logsupport.Logs.Log( '{}: Successful variable read: {}/{}'.format( self.name, r1.status_code, r2.status_code)) break except: # after total power outage ISY is slower to come back than RPi so we wait testing periodically # Eventually we try rebooting just in case our own network is what is hosed trycount -= 1 if trycount > 0: logsupport.Logs.Log( '{}: Hub not responding (variables) at: {}'.format( self.name, self.ISYprefix)) time.sleep(15) else: logsupport.Logs.Log('No ISY response restart (vars)') exitutils.errorexit(exitutils.ERRORPIREBOOT) logsupport.Logs.Log('Reached unreachable code! ISY4') self.Vars = valuestore.NewValueStore(isyvarssupport.ISYVars(self)) # noinspection PyBroadException try: configdictS = xmltodict.parse(r1.text)['CList']['e'] if debug.dbgStore.GetVal('ISYLoad'): configdictS = xmltodict.parse(x3)['CList']['e'] if debug.dbgStore.GetVal('ISYDump'): debug.ISYDump("xml.dmp", r1.text, pretty=False) debug.ISYDump("struct.dmp", configdictS) for v in configdictS: self.Vars.SetVal(('State', v['@name']), None) self.Vars.SetAttr(('State', v['@name']), (2, int(v['@id']))) self.Vars.AddAlert(('State', v['@name']), self._ISYVarChanged) except: logsupport.Logs.Log('No state variables defined') # noinspection PyBroadException try: configdictI = xmltodict.parse(r2.text)['CList']['e'] if debug.dbgStore.GetVal('ISYLoad'): configdictI = xmltodict.parse(x4)['CList']['e'] if debug.dbgStore.GetVal('ISYDump'): debug.ISYDump("xml.dmp", r2.text, pretty=False) debug.ISYDump("struct.dmp", configdictI) for v in configdictI: self.Vars.SetVal(('Int', v['@name']), None) self.Vars.SetAttr(('Int', v['@name']), (1, int(v['@id']))) self.Vars.AddAlert(('Int', v['@name']), self._ISYVarChanged) except: logsupport.Logs.Log('No integer variables defined') ''' Add command varibles if needed ''' cmdvar = valuestore.InternalizeVarName(self.name + ':Int:Command.' + hw.hostname.replace('-', '.')) self.alertspeclist = {} for k in valuestore.ValueStores[self.name].items(): if k == tuple(cmdvar[1:]): self.alertspeclist['RemoteCommands-' + self.name] = { 'Type': 'VarChange', 'Var': valuestore.ExternalizeVarName(cmdvar), 'Test': 'NE', 'Value': '0', 'Invoke': 'NetCmd.Command' } break self.Vars.LockStore() utilities.register_example("ISY", self) if debug.dbgStore.GetVal('ISYdbg'): self.PrintTree(self._ProgRoot, " ", 'Programs') self.HBWS = historybuffer.HistoryBuffer(150, self.name + '-WS') self.HBDirect = historybuffer.HistoryBuffer(40, self.name + '-Direct') self.isyEM = isyeventmonitor.ISYEventMonitor(self) threadmanager.SetUpHelperThread( self.name, self.isyEM.QHandler, prerestart=self.isyEM.PreRestartQHThread, poststart=self.isyEM.PostStartQHThread, postrestart=self.isyEM.PostStartQHThread) logsupport.Logs.Log( "{}: Finished creating structure for hub".format(name))
def __init__(self, c, s): self.Center = c self.Size = s utilities.register_example("TouchPoint", self)
def __init__(self, screensection, screenname): global alertscreens screen.ScreenDesc.__init__(self, screensection, screenname) debug.debugPrint('Screen', "Build Alerts Screen") self.NavKeysShowing = False self.DefaultNavKeysShowing = False screen.IncorporateParams(self, screenname, {'KeyColor', 'KeyCharColorOn', 'KeyCharColorOff'}, screensection) screen.AddUndefaultedParams(self, screensection, CharSize=[20], Font=fonts.monofont, MessageBack='', Message=[], DeferTime="2 minutes", BlinkTime=0) if self.MessageBack == '': self.MessageBack = self.BackgroundColor self.DimTO = 0 # alert screens don't dim or yield voluntarily self.PersistTO = 0 self.BlinkTimer = None self.TimerName = 0 self.DeferTimer = None self.Msg = True messageareapart = .7 messageareaheight = ( hw.screenheight - 2 * self.TopBorder) * messageareapart # no Nav keys todo switch to new screen sizing alertbutheight = (hw.screenheight - messageareaheight - 2 * self.TopBorder) / 2 self.upperleft = (self.HorizBorder, self.TopBorder) self.Defer = utilities.get_timedelta(self.DeferTime) self.Keys = {'defer': toucharea.ManualKeyDesc(self, 'defer', ['Defer'], self.KeyColor, self.KeyCharColorOn, self.KeyCharColorOff, center=(hw.screenwidth / 2, self.TopBorder + messageareaheight + 0.5 * alertbutheight), size=( hw.screenwidth - 2 * self.HorizBorder, alertbutheight), proc=self.DeferAction)} if 'Action' in screensection: action = screensection['Action'] self.Keys['action'] = keyspecs.CreateKey(self, action, '*Action*') # this is only case so far that is a user descibed key that gets explicit positioning so just do it here self.Keys['action'].Center = ( hw.screenwidth / 2, self.TopBorder + messageareaheight + 1.5 * alertbutheight) self.Keys['action'].Size = (hw.screenwidth - 2 * self.HorizBorder, alertbutheight) self.Keys['action'].State = True # for appearance only self.Keys['action'].FinishKey((0, 0), (0, 0)) else: pass # no key created - just a blank spot on the alert screen # for i in range(len(self.CharSize), len(self.Message)): self.CharSize.append(self.CharSize[-1]) h = 0 l = [] for i, ln in enumerate(self.Message): l.append( fonts.fonts.Font(self.CharSize[i], self.Font).render(ln, 0, wc(self.KeyCharColorOn))) h = h + l[i].get_height() s = (messageareaheight - h) / (len(l)) self.messageimage = pygame.Surface((hw.screenwidth - 2 * self.HorizBorder, messageareaheight)) self.messageblank = pygame.Surface((hw.screenwidth - 2 * self.HorizBorder, messageareaheight)) self.messageimage.fill(wc(self.MessageBack)) self.messageblank.fill(wc(self.BackgroundColor)) vert_off = s / 2 for i in range(len(l)): horiz_off = (hw.screenwidth - l[i].get_width()) / 2 - self.HorizBorder self.messageimage.blit(l[i], (horiz_off, vert_off)) vert_off = vert_off + s + l[i].get_height() self.Alert = None # gets filled in by code that parses/defines an alert that invokes the screen alertscreens[screenname] = self self.DimTO = 0 self.PersistTO = 0 utilities.register_example("AlertsScreen", self)
def __init__(self, hub, name, addr, parentaddr): super(TreeItem, self).__init__(hub, name) self.address = addr self.parent = parentaddr # replaced by actual obj reference at end of tree build self.children = [] utilities.register_example("TreeItem", self)
def __init__(self, hub, flag, name, addr, parenttyp, parentaddr): TreeItem.__init__(self, hub, name, addr, parentaddr) self.flag = flag self.parenttype = parenttyp utilities.register_example("Folder", self)
def __init__(self, flag, name, addr, parenttyp, parentaddr): TreeItem.__init__(self, name, addr, parentaddr) self.flag = flag self.parenttype = parenttyp utilities.register_example("Folder", self)
def __init__(self, nm, itemid, pid): TreeItem.__init__(self, nm, itemid, pid) self.status = False # not using lastRunTime, lastFinishTime utilities.register_example("ProgramFolder", self)
def __init__(self, nm, itemid, pid): ProgramFolder.__init__(self, nm, itemid, pid) # not using enabled, runAtStartup,running utilities.register_example("Program", self)
def __init__(self, name, addr, parentaddr): self.name = name self.address = addr self.parent = parentaddr # replaced by actual obj reference at end of tree build self.children = [] utilities.register_example("TreeItem", self)