def onStop(self):
        mqttManager = self._managers.pop(
            'MqttManager', None)  # Mqtt goes down last with bug reporter
        bugReportManager = self._managers.pop(
            'BugReportManager', None)  # bug reporter goes down as last

        skillManager = self._managers.pop(
            'SkillManager',
            None)  # Skill manager goes down first, to tell the skills
        if skillManager:
            try:
                skillManager.onStop()
            except Exception as e:
                Logger().logError(f'Error stopping SkillManager: {e}')

        for managerName, manager in self._managers.items():
            try:
                if manager.isActive:
                    manager.onStop()
            except Exception as e:
                Logger().logError(
                    f'Error while shutting down manager **{managerName}**: {e}'
                )

        if mqttManager:
            try:
                mqttManager.onStop()
            except Exception as e:
                Logger().logError(f'Error stopping MqttManager: {e}')

        if bugReportManager:
            try:
                bugReportManager.onStop()
            except Exception as e:
                Logger().logError(f'Error stopping BugReportManager: {e}')
Example #2
0
class State:

    name: str
    currentState: StateType = StateType.BORN
    logger: Logger = Logger(prepend='[State]')
    callbacks: list = field(default_factory=list)

    def subscribe(self, callback: Callable):
        self.callbacks.append(callback)

    def unsubscribe(self, callback: Callable):
        self.callbacks.remove(callback)

    def setState(self, newState: StateType):
        oldState = self.currentState
        self.currentState = newState
        for callback in self.callbacks:
            try:
                callback(oldState, newState)
            except:
                self.logger.logWarning(
                    f'Failed callback for state {self.name}')

    def __repr__(self) -> str:
        return f'State "{self.name}" Current state "{self.currentState.value}"'
 def __init__(self, host: str, port: int, hotwordName: str):
     super().__init__()
     self._logger = Logger(prepend='[HotwordDownloadThread]')
     self._host = host
     self._port = int(port)
     self._hotwordName = hotwordName
     self.setDaemon(True)
Example #4
0
    def __init__(self, restartHandler: callable):
        Singleton.__init__(self, self.NAME)
        self._logger = Logger(prepend='[Project Alice]')
        self._logger.logInfo('Starting Alice main unit')
        self._booted = False
        self._isUpdating = False
        self._shuttingDown = False
        self._restart = False
        self._restartHandler = restartHandler

        if not self.checkDependencies():
            self._restart = True
            self._restartHandler()
        else:
            with Stopwatch() as stopWatch:
                self._superManager = SuperManager(self)

                self._superManager.initManagers()
                self._superManager.onStart()

                if self._superManager.configManager.getAliceConfigByName(
                        'useHLC'):
                    self._superManager.commons.runRootSystemCommand(
                        ['systemctl', 'start', 'hermesledcontrol'])

                self._superManager.onBooted()

            self._logger.logInfo(f'Started in {stopWatch} seconds')
            self._booted = True
Example #5
0
	def __init__(self, name):
		super().__init__()

		if self.INSTANCE:
			Logger().logFatal(f'Trying to instanciate {name} but instance already exists')
			raise KeyboardInterrupt
		else:
			self.INSTANCE = self
Example #6
0
 def onStop(self):
     managerName = constants.UNKNOWN_MANAGER
     try:
         for managerName, manager in self._managers.items():
             manager.onStop()
     except Exception as e:
         Logger().logError(
             f'Error while shutting down manager "{managerName}": {e}')
Example #7
0
    def onStop(self):
        managerName = constants.UNKNOWN_MANAGER
        try:
            mqttManager = self._managers.pop('MqttManager')

            for managerName, manager in self._managers.items():
                manager.onStop()

            managerName = mqttManager.name
            mqttManager.onStop()
        except KeyError as e:
            Logger().logWarning(
                f'Manager **{managerName}** was not running: {e}')
        except Exception as e:
            Logger().logError(
                f'Error while shutting down manager **{managerName}**: {e}')
            traceback.print_exc()
    def __init__(self, host: str, port: int, zipPath: str):
        super().__init__()
        self._logger = Logger()

        self.setDaemon(True)

        self._host = host
        self._port = port
        self._zipPath = Path(zipPath)
 def __init__(self,
              message: str = None,
              status: int = None,
              context: list = None):
     self._logger = Logger()
     self._message = message
     self._status = status
     self._context = context
     super().__init__(message)
    def __init__(self, host: str, port: int, zipPath: str):
        super().__init__()
        self._logger = Logger(prepend='[HotwordUploadThread]')

        self.setDaemon(True)

        self._host = host
        self._port = port
        self._zipPath = Path(zipPath)
Example #11
0
 def exceptionDecorator(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except exceptions as e:
         Logger(depth=6).logWarning(msg=e, printStack=printStack)
         return _exceptHandler(*args,
                               text=text,
                               exceptHandler=exceptHandler,
                               returnText=returnText,
                               **kwargs)
Example #12
0
    def restartManager(self, manager: str):
        if not manager in self._managers:
            Logger().logWarning(
                f'Was asking to restart manager **{manager}** but it doesn\'t exist'
            )
            return

        self._managers[manager].onStop()
        self._managers[manager].onStart()
        self._managers[manager].onBooted()
Example #13
0
    def onBooted(self):
        self.mqttManager.playSound(soundFilename='boot')

        manager = None
        try:
            for manager in self._managers.values():
                if manager:
                    manager.onBooted()
        except Exception as e:
            Logger().logError(
                f'Error while sending onBooted to manager **{manager.name}**: {e}'
            )
Example #14
0
    def onStop(self):
        managerName = constants.UNKNOWN_MANAGER
        try:
            mqttManager = self._managers.pop('MqttManager')

            for managerName, manager in self._managers.items():
                manager.onStop()

            managerName = mqttManager.name
            mqttManager.onStop()
        except Exception as e:
            Logger().logError(
                f'Error while shutting down manager **{managerName}**: {e}')
Example #15
0
    def onBooted(self):
        manager = None
        try:
            for manager in self._managers.values():
                if manager:
                    manager.onBooted()
        except Exception as e:
            Logger().logError(
                f'Error while sending onBooted to manager **{manager.name}**: {e}'
            )

        deviceList = self.deviceManager.getDevicesWithAbilities(
            [DeviceAbility.IS_SATELITTE, DeviceAbility.IS_CORE])
        self.mqttManager.playSound(soundFilename='boot', deviceUid=deviceList)
Example #16
0
		def settingDecorator(*args, **kwargs):
			if not settingName:
				Logger().logWarning(msg='Cannot use IfSetting decorator without settingName')
				return None

			configManager = SuperManager.getInstance().configManager
			value = configManager.getSkillConfigByName(skillName, settingName) if skillName else configManager.getAliceConfigByName(settingName)

			if value is None:
				return None

			if (not inverted and value == settingValue) or \
				(inverted and value != settingValue):
				return func(*args, **kwargs)
Example #17
0
    def __init__(self, restartHandler: callable):
        Singleton.__init__(self, self.NAME)
        self._logger = Logger()
        self._logger.logInfo('Starting up Project Alice')
        self._booted = False
        with Stopwatch() as stopWatch:
            self._restart = False
            self._restartHandler = restartHandler
            self._superManager = SuperManager(self)

            self._superManager.initManagers()
            self._superManager.onStart()

            if self._superManager.configManager.getAliceConfigByName('useHLC'):
                self._superManager.commons.runRootSystemCommand(
                    ['systemctl', 'start', 'hermesledcontrol'])

            self._superManager.onBooted()
        self._logger.logInfo(f'- Started Project Alice in {stopWatch} seconds')
        self._booted = True
Example #18
0
    def onStart(self):
        try:
            commons = self._managers.pop('CommonsManager')
            commons.onStart()

            configManager = self._managers.pop('ConfigManager')
            configManager.onStart()

            languageManager = self._managers.pop('LanguageManager')
            languageManager.onStart()

            locationManager = self._managers.pop('LocationManager')
            locationManager.onStart()

            deviceManager = self._managers.pop('DeviceManager')
            deviceManager.onStart()

            audioServer = self._managers.pop('AudioManager')
            audioServer.onStart()

            internetManager = self._managers.pop('InternetManager')
            internetManager.onStart()

            databaseManager = self._managers.pop('DatabaseManager')
            databaseManager.onStart()

            userManager = self._managers.pop('UserManager')
            userManager.onStart()

            mqttManager = self._managers.pop('MqttManager')
            mqttManager.onStart()

            talkManager = self._managers.pop('TalkManager')
            skillManager = self._managers.pop('SkillManager')
            assistantManager = self._managers.pop('AssistantManager')
            dialogTemplateManager = self._managers.pop('DialogTemplateManager')
            nluManager = self._managers.pop('NluManager')
            nodeRedManager = self._managers.pop('NodeRedManager')

            for manager in self._managers.values():
                if manager:
                    manager.onStart()

            talkManager.onStart()
            nluManager.onStart()
            skillManager.onStart()
            dialogTemplateManager.onStart()
            assistantManager.onStart()
            nodeRedManager.onStart()

            self._managers[configManager.name] = configManager
            self._managers[audioServer.name] = audioServer
            self._managers[languageManager.name] = languageManager
            self._managers[locationManager.name] = locationManager
            self._managers[deviceManager.name] = deviceManager
            self._managers[talkManager.name] = talkManager
            self._managers[databaseManager.name] = databaseManager
            self._managers[userManager.name] = userManager
            self._managers[mqttManager.name] = mqttManager
            self._managers[skillManager.name] = skillManager
            self._managers[dialogTemplateManager.name] = dialogTemplateManager
            self._managers[assistantManager.name] = assistantManager
            self._managers[nluManager.name] = nluManager
            self._managers[internetManager.name] = internetManager
            self._managers[nodeRedManager.name] = nodeRedManager
        except Exception as e:
            import traceback

            traceback.print_exc()
            Logger().logFatal(f'Error while starting managers: {e}')
Example #19
0
 def __init__(self, logDepth: int = 3, *args, **kwargs):
     self._depth = logDepth
     self._logger = Logger(logDepth)
 def __init__(self, *args, **kwargs):
     self._logger = Logger(*args, **kwargs)
Example #21
0
 def init(self, lightId: int, bridgeInstance: Bridge):
     self.id = lightId
     self.bridge = bridgeInstance
     self.name = self.name.lower()
     self.logger = Logger(prepend='[Phue Light]')
Example #22
0
class Light(object):
	state: dict
	swupdate: dict
	type: str
	name: str
	modelid: str
	manufacturername: str
	productname: str
	capabilities: dict
	config: dict
	uniqueid: str
	swversion: str
	swconfigid: str = ''
	productid: str = ''
	id: int = 0
	bridge: Optional[Bridge] = None
	myScenes: list = field(default_factory=list)
	logger: Logger = Logger(prepend='[Phue Light]')


	def init(self, lightId: int, bridgeInstance: Bridge):
		self.id = lightId
		self.bridge = bridgeInstance
		self.name = self.name.lower()


	def __str__(self) -> str:
		return f'Light id {self.id} named "{self.name}" of type {self.type}.'


	def on(self): #NOSONAR
		self.request(url=f'/{self.id}/state', method='PUT', data={'on': True})


	def off(self):
		self.request(url=f'/{self.id}/state', method='PUT', data={'on': False})


	@property
	def isOn(self) -> bool:
		return self.state['on']


	@property
	def isOff(self) -> bool:
		return not self.state['on']


	def alert(self, state: str = 'lselect'):
		self.request(url=f'/{self.id}/state', method='PUT', data={'alert': state})


	def effect(self, effect: str = 'colorloop'):
		self.request(url=f'/{self.id}/state', method='PUT', data={'effect': effect})


	def configure(self, data: dict, sendToBridge: bool = True):
		for key, value in data.items():
			if not key in self.state:
				continue

			self.state[key] = value

		if sendToBridge:
			self.request(url=f'/{self.id}/state', method='PUT', data=data)


	@property
	def brightness(self) -> int:
		return self.state['bri']


	# noinspection DuplicatedCode
	@brightness.setter
	def brightness(self, value: int):
		if value == 0:
			self.off()
			self.state['bri'] = 0
			return

		value = sorted((1, value, 254))[1]

		self.state['bri'] = value
		self.request(url=f'/{self.id}/state', method='PUT', data={'bri': value})


	@property
	def saturation(self) -> int:
		return self.state['sat']


	@saturation.setter
	def saturation(self, value: int):
		value = sorted((1, value, 254))[1]

		self.state['sat'] = value
		self.request(url=f'/{self.id}/state', method='PUT', data={'sat': value})


	@property
	def hue(self) -> int:
		return self.state['hue']


	@hue.setter
	def hue(self, value: int):
		value = sorted((0, value, 65535))[1]

		self.state['hue'] = value
		self.request(url=f'/{self.id}/state', method='PUT', data={'hue': value})


	@property
	def xy(self) -> list: #NOSONAR
		return self.state['xy']


	@xy.setter
	def xy(self, value: list): #NOSONAR
		x = sorted((0, value[0], 1))[1] #NOSONAR
		y = sorted((0, value[1], 1))[1] #NOSONAR

		self.state['xy'] = [x, y]
		self.request(url=f'/{self.id}/state', method='PUT', data={'xy': value})


	@property
	def mired(self) -> int:
		return self.state['ct']


	@mired.setter
	def mired(self, value: int):
		self.state['ct'] = value
		self.request(url=f'/{self.id}/state', method='PUT', data={'ct': value})


	@property
	def colormode(self) -> str:
		return self.state.get('colormode', None)


	@colormode.setter
	def colormode(self, mode: str):
		if 'colormode' not in self.state:
			self.logger.logWarning(f'Light {self.name} with id {self.id} does not support colormode changing')
			return

		if mode not in ('hs', 'xy', 'ct'):
			mode = 'ct'
			self.logger.logWarning('Invalid color mode specified. Allowed value are "hs", "ct", "xy"')

		self.state['colormode'] = mode
		self.request(url=f'/{self.id}/state', method='PUT', data={'colormode': mode})


	@property
	def reachable(self) -> bool:
		return self.state['reachable']


	def delete(self):
		self.request(url=f'/{self.id}', method='DELETE')


	def request(self, url: str, data: dict = None, method: str = 'GET'):
		if not self.reachable or not self.bridge:
			raise LightNotReachable

		self.bridge.sendAuthRequest(url=f'/lights{"/" if not url.startswith("/") else ""}{url}', method=method, data=data)