예제 #1
0
    def _registerOnBridge(self):
        try:
            self._bridge.register()
            self._bridgeConnectTries = 0

            self.ThreadManager.doLater(
                interval=3,
                func=self.say,
                args=[self.randomTalk('pressBridgeButtonConfirmation')])
        except LinkButtonNotPressed:
            if self._bridgeConnectTries < 3:
                self.say(text=self.randomTalk('pressBridgeButton'))
                self._bridgeConnectTries += 1
                self.logWarning(
                    'Bridge not registered, please press the bridge button, retry in 20 seconds'
                )
                time.sleep(20)
                self._registerOnBridge()
            else:
                self.ThreadManager.doLater(
                    interval=3,
                    func=self.say,
                    args=[self.randomTalk('pressBridgeButtonTimeout')])
                raise SkillStartingFailed(skillName=self.name,
                                          error=f"Couldn't reach bridge")
        except PhueRegistrationError as e:
            raise SkillStartingFailed(skillName=self.name,
                                      error=f'Error connecting to bridge: {e}')
예제 #2
0
	def __init__(self, supportedIntents: Iterable = None, databaseSchema: dict = None):
		super().__init__(logDepth=4)
		try:
			path = Path(inspect.getfile(self.__class__)).with_suffix('.install')
			self._install = json.loads(path.read_text())
		except FileNotFoundError:
			raise SkillStartingFailed(error=f'[{type(self).__name__}] Cannot find install file')
		except Exception as e:
			raise SkillStartingFailed(error=f'[{type(self).__name__}] Failed loading skill: {e}')

		self._name = self._install['name']
		self._author = self._install['author']
		self._version = self._install['version']
		self._updateAvailable = False
		self._active = True
		self._delayed = False
		self._required = False
		self._databaseSchema = databaseSchema
		self._widgets = dict()
		self._intentsDefinitions = dict()
		self._scenarioNodeName = ''
		self._scenarioNodeVersion = Version(mainVersion=0, updateVersion=0, hotfix=0)

		self._supportedIntents: Dict[str, Intent] = self.buildIntentList(supportedIntents)
		self.loadIntentsDefinition()

		self._utteranceSlotCleaner = re.compile('{(.+?):=>.+?}')
		self.loadWidgets()
		self.loadScenarioNodes()
예제 #3
0
    def __init__(self,
                 supportedIntents: Iterable = None,
                 databaseSchema: dict = None,
                 **kwargs):
        super().__init__(**kwargs)
        try:
            self._skillPath = Path(inspect.getfile(self.__class__)).parent
            self._installFile = Path(inspect.getfile(
                self.__class__)).with_suffix('.install')
            self._installer = json.loads(self._installFile.read_text())
        except FileNotFoundError:
            raise SkillStartingFailed(
                skillName=constants.UNKNOWN,
                error=f'[{type(self).__name__}] Cannot find install file')
        except Exception as e:
            raise SkillStartingFailed(
                skillName=constants.UNKNOWN,
                error=f'[{type(self).__name__}] Failed loading skill: {e}')

        instructionsFile = self.getResource(
            f'instructions/{self.LanguageManager.activeLanguage}.md')
        if not instructionsFile.exists():
            instructionsFile = self.getResource(f'instructions/en.md')

        self._instructions = instructionsFile.read_text(
        ) if instructionsFile.exists() else ''

        self._name = self._installer['name']
        self._author = self._installer.get('author', constants.UNKNOWN)
        self._version = self._installer.get('version', '0.0.1')
        self._icon = self._installer.get('icon', 'fas fa-biohazard')
        self._aliceMinVersion = Version.fromString(
            self._installer.get('aliceMinVersion', '1.0.0-b4'))
        self._maintainers = self._installer.get('maintainers', list())
        self._description = self._installer.get('desc', '')
        self._category = self._installer.get('category', constants.UNKNOWN)
        self._conditions = self._installer.get('conditions', dict())
        self._updateAvailable = False
        self._modified = False
        self._active = False
        self._delayed = False
        self._required = False
        self._failedStarting = False
        self._databaseSchema = databaseSchema
        self._widgets = list()
        self._widgetTemplates = dict()
        self._deviceTypes = list()
        self._intentsDefinitions = dict()
        self._scenarioPackageName = ''
        self._scenarioPackageVersion = Version(mainVersion=0,
                                               updateVersion=0,
                                               hotfix=0)

        self._supportedIntents: Dict[str, Intent] = self.buildIntentList(
            supportedIntents)
        self.loadIntentsDefinition()

        self._utteranceSlotCleaner = re.compile('{(.+?):=>.+?}')
        self._myDevicesTemplates = dict()
        self._myDevices: Dict[str, Device] = dict()
예제 #4
0
    def onStart(self):
        super().onStart()

        self._bridge = Bridge(ip=self.getConfig('phueBridgeIp'),
                              confFile=self._hueConfigFile)

        if not self.delayed:
            try:
                if self._bridge.connect(autodiscover=not self.getAliceConfig(
                        'stayCompletlyOffline')):
                    self.logInfo('Connected to Philips Hue bridge')

            except UnauthorizedUser:
                try:
                    self._bridge.register()
                except LinkButtonNotPressed:
                    self.logInfo('User is not authorized')
                    self.delayed = True
                    raise SkillStartDelayed(self.name)
            except NoPhueIP:
                raise SkillStartingFailed(
                    skillName=self.name,
                    error=
                    'Bridge IP not set and stay completly offline set to True, cannot auto discover Philips Hue bridge'
                )
        else:
            if not self.ThreadManager.isThreadAlive('PHUERegister'):
                self.ThreadManager.newThread(name='PHUERegister',
                                             target=self._registerOnBridge)
예제 #5
0
    def onStart(self):
        super().onStart()
        redQueenIdentityFile = self._getRedQueenIdentityFileName()
        redQueenIdentityFileTemplate = redQueenIdentityFile + '.dist'

        if not os.path.isfile(redQueenIdentityFile):
            if os.path.isfile(redQueenIdentityFileTemplate):
                shutil.copyfile(redQueenIdentityFileTemplate,
                                redQueenIdentityFile)
                self.logInfo('New Red Queen is born')

                with open(self._getRedQueenIdentityFileName(), 'r') as f:
                    self._redQueen = json.load(f)

                self._redQueen['infos']['born'] = time.strftime("%d.%m.%Y")
                self._saveRedQueenIdentity()
            else:
                self.logInfo('Cannot find Red Queen identity template')
                raise SkillStartingFailed(skillName=self.name)
        else:
            self.logInfo('Found existing Red Queen identity')
            with open(self._getRedQueenIdentityFileName(), 'r') as f:
                self._redQueen = json.load(f)

        return self.supportedIntents
예제 #6
0
 def _connectAccount(self):
     try:
         self._bring = self.bring()
     except BringApi.AuthentificationFailed:
         raise SkillStartingFailed(
             skillName=self._name,
             error='Please check your account login and password')
예제 #7
0
    def onStart(self) -> dict:
        super().onStart()
        if not self.getConfig('password'):
            raise SkillStartingFailed(skillName=self.name,
                                      error='No credentials provided')

        if not self._auth():
            raise SkillStartingFailed(skillName=self.name,
                                      error='Authentication failed')

        try:
            self._weatherData = lnetatmo.WeatherStationData(self._netatmoAuth)
        except lnetatmo.NoDevice:
            raise SkillStartingFailed(skillName=self.name,
                                      error='No Netatmo device found')

        return self.supportedIntents
예제 #8
0
    def __init__(self,
                 supportedIntents: Iterable = None,
                 databaseSchema: dict = None,
                 **kwargs):
        super().__init__(**kwargs)
        try:
            self._skillPath = Path(inspect.getfile(self.__class__)).parent
            self._installFile = Path(inspect.getfile(
                self.__class__)).with_suffix('.install')
            self._installer = json.loads(self._installFile.read_text())
        except FileNotFoundError:
            raise SkillStartingFailed(
                skillName=constants.UNKNOWN,
                error=f'[{type(self).__name__}] Cannot find install file')
        except Exception as e:
            raise SkillStartingFailed(
                skillName=constants.UNKNOWN,
                error=f'[{type(self).__name__}] Failed loading skill: {e}')

        self._name = self._installer['name']
        self._author = self._installer['author']
        self._version = self._installer['version']
        self._icon = self._installer['icon']
        self._description = self._installer['desc']
        self._category = self._installer[
            'category'] if 'category' in self._installer else 'undefined'
        self._conditions = self._installer['conditions']
        self._updateAvailable = False
        self._active = False
        self._delayed = False
        self._required = False
        self._databaseSchema = databaseSchema
        self._widgets = dict()
        self._deviceTypes = dict()
        self._intentsDefinitions = dict()
        self._scenarioNodeName = ''
        self._scenarioNodeVersion = Version(mainVersion=0,
                                            updateVersion=0,
                                            hotfix=0)

        self._supportedIntents: Dict[str, Intent] = self.buildIntentList(
            supportedIntents)
        self.loadIntentsDefinition()

        self._utteranceSlotCleaner = re.compile('{(.+?):=>.+?}')
예제 #9
0
    def onStart(self):
        super().onStart()

        if not self.getConfig('token'):
            raise SkillStartingFailed(
                skillName=self._name,
                error='Please provide your bot token in the skill settings')

        self._bot = telepot.Bot(self.getConfig('token'))

        try:
            self._me = self._bot.getMe()

        except:
            raise SkillStartingFailed(skillName=self._name,
                                      error='Your token seems incorrect')

        self.loadUsers()
        self.logInfo(f'Loaded {len(self._users)} user', plural='users')
예제 #10
0
    def onStart(self):
        super().onStart()

        self._sonosPlayers = {
            device.player_name.lower(): device
            for device in soco.discover()
        }

        if not self._sonosPlayers:
            raise SkillStartingFailed(skillName=self.name,
                                      error='No Sonos device found')
        else:
            self.heartbeat()
예제 #11
0
    def onStart(self):
        super().onStart()

        gpioPin = self.getConfig('gpioPin')
        if gpioPin:
            self._gpioPin = int(gpioPin)
        else:
            raise SkillStartingFailed(
                skillName=self.name,
                error='Failed fetching gpio pin definition')

        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(self._gpioPin, GPIO.OUT)
        GPIO.output(self._gpioPin, GPIO.LOW)
예제 #12
0
	def onStart(self):
		super().onStart()
		redQueenIdentityFile = self._getRedQueenIdentityFile()
		redQueenIdentityFileTemplate = redQueenIdentityFile.with_suffix(redQueenIdentityFile.suffix + '.dist')

		if redQueenIdentityFile.exists():
			self._me = json.loads(redQueenIdentityFile.read_text())
			if not self._me:
				self.logWarning('Red Queen identity file seems corrupted, rebuilding it')
				redQueenIdentityFile.unlink()

		if not redQueenIdentityFile.exists():
			if redQueenIdentityFileTemplate.exists():
				shutil.copyfile(str(redQueenIdentityFileTemplate), str(redQueenIdentityFile))
				self.logInfo('New Red Queen is born')
				self._me = json.loads(redQueenIdentityFile.read_text())
				self._me['infos']['born'] = time.strftime("%d.%m.%Y")
				self._saveRedQueenIdentity()
			else:
				raise SkillStartingFailed(skillName=self.name, error='Cannot find Red Queen identity template')
		else:
			self.logInfo('Found existing Red Queen identity')
			self._me = json.loads(redQueenIdentityFile.read_text())
예제 #13
0
 def onStart(self):
     super().onStart()
     self._youtube = YouTubeDataAPI(self.getConfig('youtubeApiKey'))
     if not self._youtube.verify_key():
         raise SkillStartingFailed('Youtube api key not valid')
예제 #14
0
 def __init__(self):
     super().__init__()
     try:
         self._youtube: Optional[YouTubeDataAPI] = None
     except ValueError:
         raise SkillStartingFailed('Youtube api key not valid')
예제 #15
0
	def onStart(self):
		super().onStart()
		if not self.getConfig('apiKey'):
			raise SkillStartingFailed('Missing API key')