コード例 #1
0
ファイル: ruleService.py プロジェクト: TheStackBox/xuansdk
        def process_method_list(methodList):
            #===================================================================
            # Basic type validation
            #===================================================================
            if not isinstance(methodList, list):
                Logger.log_error(
                    "RuleService.set_rule: 'condition' and 'execution' must be type of list."
                )
                Logger.log_debug("type:", type(methodList), "value:",
                                 methodList)
                raise AutomationException(
                    11704,
                    "List is required for both 'condition' and 'execution'")

            #===================================================================
            # Check allowed size, raise error if exceeded.
            #===================================================================
            methodListLen = len(methodList)
            if methodListLen > AppConstants.MAX_METHOD_SIZE:
                Logger.log_error(
                    "RuleService.set_rule: 'condition' and 'execution' cannot have more than",
                    AppConstants.MAX_METHOD_SIZE, "items respectively.")
                raise AutomationException(11705, "Only a maximum of " + \
                                          str(AppConstants.MAX_METHOD_SIZE) + \
                                          " items is allowed for each 'condition' and 'execution' - given size " + \
                                          str(methodListLen),
                                          lambda text: str(AppConstants.MAX_METHOD_SIZE).join(text.split(":max_item_size:")))

            #===================================================================
            # Check if all kbxMethodIds are valid and all kbxMethodParams are list
            #===================================================================
            idValidator = NumberValidator(isRequired=True, decimalPoint=False)
            if not all([
                    idValidator.is_valid(eachMethod["kbxMethodId"])
                    and isinstance(eachMethod["kbxMethodParams"], list)
                    for eachMethod in methodList
            ]):
                raise AutomationException(
                    11704,
                    "'condition' and 'execution' have incorrect data structure."
                )

            #===================================================================
            # Check if all kbxParamName and kbxParamCurrentValue exists
            #===================================================================
            paramNameValidator = StringValidator(isRequired=True)
            for eachMethod in methodList:
                methodArgs = eachMethod["kbxMethodParams"]
                for methodArg in methodArgs:
                    if not paramNameValidator.is_valid(
                            methodArg[AppConstants.ARG_NAME]):
                        raise AutomationException(
                            11704,
                            "'condition' and 'execution' have invalid params structure"
                        )

                    if not AppConstants.ARG_CURRENT_VALUE in methodArg:
                        methodArg[AppConstants.ARG_CURRENT_VALUE] = None

            return methodList
コード例 #2
0
ファイル: storage.py プロジェクト: TheStackBox/xuansdk
    def list_all_rules():
        offset = 0
        limit = 50

        totalCount = 1
        allRules = deque()
        while(offset < totalCount):
            try:
                result = StorageManagerService.get_data(group=Storage.STORAGE_RULE, limit=limit, offset=offset)

                result = ValueParser.get_dict(result)

                rules = ValueParser.get_list(result["data"])
                totalCount = int(result["totalRecord"])
                offset += limit

                if rules:
                    for rule in rules:
                        rule = ValueParser.get_dict(rule.get("appDataValue"))
                        allRules.append(rule)

            except Exception as e:
                Logger.log_debug("Storage.list_all_rules err: " + str(e))
                break
        return allRules
コード例 #3
0
ファイル: timerModule.py プロジェクト: TheStackBox/xuansdk
    def __add_scheduler(ruleId, kbxMethodIdentifier, second, minute, hour, dayOfMonth, month, dayOfWeek):
        '''
        second="0", minute="*", hour="*", dayOfMonth="*", month="*", dayOfWeek="*"
        '''
        try:
            uniqueName = "_".join([kbxMethodIdentifier, second, minute, hour, dayOfMonth, month, dayOfWeek])
            schedulerName = hash(uniqueName)
            
            if schedulerName not in TimerModule.SCHEDULER_ID_TRACKER:
                SchedulerService.add_cron_job(str(schedulerName),
                                              kbxTargetAppId=AppInfo.get_app_id(),
                                              kbxTargetMethod="scheduler_callback",
                                              kbxTargetModule="timer_module",
                                              second=second,
                                              minute=minute,
                                              hour=hour,
                                              dayOfMonth=dayOfMonth,
                                              month=month,
                                              dayOfWeek=dayOfWeek,
                                              kbxTargetParams={"kbxMethodIdentifier":kbxMethodIdentifier},
                                              store=False)
    
                TimerModule.SCHEDULER_ID_TRACKER[schedulerName] = [ruleId]
                TimerModule.RULE_ID_SCHEDULER_TRACKER[ruleId] = [schedulerName]
                
                Logger.log_debug("Added Timer:", schedulerName, uniqueName)
            else:
                TimerModule.SCHEDULER_ID_TRACKER[schedulerName].append(ruleId)
                TimerModule.RULE_ID_SCHEDULER_TRACKER[ruleId].append(schedulerName)

        except Exception as e:
            Logger.log_warning("Failed to add timer:", e)
コード例 #4
0
ファイル: timerModule.py プロジェクト: TheStackBox/xuansdk
 def delete_scheduler(ruleId):
     with TimerModule.SCHEDULER_LOCK:
         try:
             schedulerNames = TimerModule.RULE_ID_SCHEDULER_TRACKER.pop(ruleId, set({}))
             for schedulerName in schedulerNames:
                 TimerModule.SCHEDULER_ID_TRACKER[schedulerName].remove(ruleId)
                 
                 if not TimerModule.SCHEDULER_ID_TRACKER[schedulerName]:
                     SchedulerService.remove_job(str(schedulerName))
                     del(TimerModule.SCHEDULER_ID_TRACKER[schedulerName])
                     
                     Logger.log_debug("Removed Timer:", schedulerName)
 
         except Exception as e:
             Logger.log_warning("Failed to remove timer:", e)
コード例 #5
0
            def __signal_scheduler_add_cron_job(ruleId, hour, minute):
                try:
                    SchedulerService.add_cron_job(jobName=str(ruleId),
                                                  kbxTargetAppId=AppInfo.get_app_id(),
                                                  kbxTargetMethod="on_trigger_callback",
                                                  kbxTargetModule="controller_module",
                                                  kbxTargetParams={"ruleId":ruleId},
                                                  store=False,
                                                  hour=str(hour),
                                                  minute=str(minute))

                    self.__registeredRuleIds.add(ruleId)

                except SystemException as e:
                    Logger.log_debug(e)
コード例 #6
0
    def delete_scheduler(ruleId):
        with TimerModule.SCHEDULER_LOCK:
            try:
                schedulerNames = TimerModule.RULE_ID_SCHEDULER_TRACKER.pop(
                    ruleId, set({}))
                for schedulerName in schedulerNames:
                    TimerModule.SCHEDULER_ID_TRACKER[schedulerName].remove(
                        ruleId)

                    if not TimerModule.SCHEDULER_ID_TRACKER[schedulerName]:
                        SchedulerService.remove_job(str(schedulerName))
                        del (TimerModule.SCHEDULER_ID_TRACKER[schedulerName])

                        Logger.log_debug("Removed Timer:", schedulerName)

            except Exception as e:
                Logger.log_warning("Failed to remove timer:", e)
コード例 #7
0
ファイル: database.py プロジェクト: TheStackBox/xuansdk
 def insert(self, stmt, bindings):
     '''
     The only different from "execute" is that this function returns lastrowid.
     '''
     with self.__rlock:
         cursor = self.__con.cursor()
         try:
             cursor.execute(stmt, bindings)
             lastrowid = cursor.lastrowid
             return lastrowid
         except Exception as e:
             Logger.log_error("Database.insert ex:", e)
             Logger.log_debug("Statement:", stmt, "bindings:", bindings)
             traceback.print_exc()
             raise e
         finally:
             cursor.close()
コード例 #8
0
            def __signal_scheduler_add_interval_job(ruleId, seconds, minutes, hours):

                kwargs = {k:v for k, v in {"seconds":seconds, "minutes":minutes, "hours":hours}.items() if v > 0}

                try:
                    SchedulerService.add_interval_job(jobName=str(ruleId),
                                                      kbxTargetAppId=AppInfo.get_app_id(),
                                                      kbxTargetMethod="on_trigger_callback",
                                                      kbxTargetModule="controller_module",
                                                      kbxTargetParams={"ruleId":ruleId},
                                                      store=False,
                                                      **kwargs)

                    self.__registeredRuleIds.add(ruleId)

                except SystemException as e:
                    Logger.log_debug(e)
コード例 #9
0
ファイル: database.py プロジェクト: TheStackBox/xuansdk
 def insert(self, stmt, bindings):
     '''
     The only different from "execute" is that this function returns lastrowid.
     '''
     with self.__rlock:
         cursor = self.__con.cursor()
         try:
             cursor.execute(stmt, bindings)
             lastrowid = cursor.lastrowid
             return lastrowid
         except Exception as e:
             Logger.log_error("Database.insert ex:", e)
             Logger.log_debug("Statement:", stmt, "bindings:", bindings)
             traceback.print_exc()
             raise e
         finally:
             cursor.close()
コード例 #10
0
ファイル: ruleService.py プロジェクト: TheStackBox/xuansdk
        def process_method_list(methodList):
            #===================================================================
            # Basic type validation
            #===================================================================
            if not isinstance(methodList, list):
                Logger.log_error("RuleService.set_rule: 'condition' and 'execution' must be type of list.")
                Logger.log_debug("type:", type(methodList), "value:", methodList)
                raise AutomationException(11704, "List is required for both 'condition' and 'execution'")

            #===================================================================
            # Check allowed size, raise error if exceeded.
            #===================================================================
            methodListLen = len(methodList)
            if methodListLen > AppConstants.MAX_METHOD_SIZE:
                Logger.log_error("RuleService.set_rule: 'condition' and 'execution' cannot have more than", AppConstants.MAX_METHOD_SIZE, "items respectively.")
                raise AutomationException(11705, "Only a maximum of " + \
                                          str(AppConstants.MAX_METHOD_SIZE) + \
                                          " items is allowed for each 'condition' and 'execution' - given size " + \
                                          str(methodListLen),
                                          lambda text: str(AppConstants.MAX_METHOD_SIZE).join(text.split(":max_item_size:")))

            #===================================================================
            # Check if all kbxMethodIds are valid and all kbxMethodParams are list
            #===================================================================
            idValidator = NumberValidator(isRequired=True, decimalPoint=False)
            if not all([idValidator.is_valid(eachMethod["kbxMethodId"])
                        and isinstance(eachMethod["kbxMethodParams"], list)
                        for eachMethod in methodList]):
                raise AutomationException(11704, "'condition' and 'execution' have incorrect data structure.")

            #===================================================================
            # Check if all kbxParamName and kbxParamCurrentValue exists
            #===================================================================
            paramNameValidator = StringValidator(isRequired=True)
            for eachMethod in methodList:
                methodArgs = eachMethod["kbxMethodParams"]
                for methodArg in methodArgs:
                    if not paramNameValidator.is_valid(methodArg[AppConstants.ARG_NAME]):
                        raise AutomationException(11704, "'condition' and 'execution' have invalid params structure")

                    if not AppConstants.ARG_CURRENT_VALUE in methodArg:
                        methodArg[AppConstants.ARG_CURRENT_VALUE] = None
            
            return methodList
コード例 #11
0
ファイル: sceneService.py プロジェクト: TheStackBox/xuansdk
 def execution_func(sceneThreadEvent, kbxMethodId, seri, **kwargs):
     try:
         if kbxMethodId == -291:
             # Delay Timer
             delayInSec = kwargs["delayInSec"]
             sceneThreadEvent.wait(delayInSec)
             seri["seriError"] = None
         else:
             # Execute method
             result = SharedMethod.call(**kwargs)
             seri["seriError"] = str(result)
             
         seri["seriStatus"] = "ok"
     
     except Exception as e:
         seri["seriStatus"] = "error"
         seri["seriError"] = str(e)
         Logger.log_debug("Execution failed, method:", kwargs["kbxMethodName"])
     
     finally:
         sceneThreadEvent.set()
コード例 #12
0
    def __add_scheduler(ruleId, kbxMethodIdentifier, second, minute, hour,
                        dayOfMonth, month, dayOfWeek):
        '''
        second="0", minute="*", hour="*", dayOfMonth="*", month="*", dayOfWeek="*"
        '''
        try:
            uniqueName = "_".join([
                kbxMethodIdentifier, second, minute, hour, dayOfMonth, month,
                dayOfWeek
            ])
            schedulerName = hash(uniqueName)

            if schedulerName not in TimerModule.SCHEDULER_ID_TRACKER:
                SchedulerService.add_cron_job(
                    str(schedulerName),
                    kbxTargetAppId=AppInfo.get_app_id(),
                    kbxTargetMethod="scheduler_callback",
                    kbxTargetModule="timer_module",
                    second=second,
                    minute=minute,
                    hour=hour,
                    dayOfMonth=dayOfMonth,
                    month=month,
                    dayOfWeek=dayOfWeek,
                    kbxTargetParams={
                        "kbxMethodIdentifier": kbxMethodIdentifier
                    },
                    store=False)

                TimerModule.SCHEDULER_ID_TRACKER[schedulerName] = [ruleId]
                TimerModule.RULE_ID_SCHEDULER_TRACKER[ruleId] = [schedulerName]

                Logger.log_debug("Added Timer:", schedulerName, uniqueName)
            else:
                TimerModule.SCHEDULER_ID_TRACKER[schedulerName].append(ruleId)
                TimerModule.RULE_ID_SCHEDULER_TRACKER[ruleId].append(
                    schedulerName)

        except Exception as e:
            Logger.log_warning("Failed to add timer:", e)
コード例 #13
0
        def execution_func(sceneThreadEvent, kbxMethodId, seri, **kwargs):
            try:
                if kbxMethodId == -291:
                    # Delay Timer
                    delayInSec = kwargs["delayInSec"]
                    sceneThreadEvent.wait(delayInSec)
                    seri["seriError"] = None
                else:
                    # Execute method
                    result = SharedMethod.call(**kwargs)
                    seri["seriError"] = str(result)

                seri["seriStatus"] = "ok"

            except Exception as e:
                seri["seriStatus"] = "error"
                seri["seriError"] = str(e)
                Logger.log_debug("Execution failed, method:",
                                 kwargs["kbxMethodName"])

            finally:
                sceneThreadEvent.set()
コード例 #14
0
ファイル: storage.py プロジェクト: TheStackBox/xuansdk
    def list_all_method_groups():
        offset = 0
        limit = 50

        totalCount = 1
        allMethodGroupIdPairs = {}
        while(offset < totalCount):
            try:
                result = StorageManagerService.get_data(group=Storage.STORAGE_METHOD_GROUP, limit=limit, offset=offset)
                result = ValueParser.get_dict(result)

                groups = ValueParser.get_list(result["data"])
                totalCount = int(result["totalRecord"])
                offset += limit

                if groups:
                    for group in groups:
                        allMethodGroupIdPairs[ValueParser.get_number(group["appDataKey"])] = ValueParser.get_number(group["appDataValue"])

            except Exception as e:
                Logger.log_debug("Storage.list_all_groups err: " + str(e))
                break

        return allMethodGroupIdPairs
コード例 #15
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug("PowerStripControllerModule.__receive_system_event: ", eventObj)
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])
コード例 #16
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug(
         "Automation DeviceManagerModule.__receive_system_event:", eventObj)
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])
コード例 #17
0
 def __notify_ser_added(self, notiContent, notiLink, notiLinkLabel):
     Logger.log_debug("Scene Execution Result logged at:", notiLink)
     NotificationManagerService.dispatch_notification(text=notiContent, 
                                                      link=notiLink,
                                                      linkLabel=notiLinkLabel)
コード例 #18
0
 def __signal_scheduler_remove_task(ruleId):
     try:
         SchedulerService.remove_job(str(ruleId))
         self.__registeredRuleIds.remove(ruleId)
     except SystemException as e:
         Logger.log_debug(e)
コード例 #19
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug("ThermostatControllerModule.__receive_system_event: " + str(eventObj))
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])
コード例 #20
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug("TrackerControllerModule.__receive_system_event: ", eventObj)
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])
コード例 #21
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug("Automation DeviceManagerModule.__receive_system_event:", eventObj)
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])
コード例 #22
0
 def __receive_system_event(self, eventObj):
     Logger.log_debug("SwitchControllerModule.__receive_system_event: " + str(eventObj))
     self.send_web_server_event(eventObj["eventTag"], eventObj["eventData"])