예제 #1
0
class NilmMetaSearch:
	def __init__(self, logger, jobId, jobType):
		self._logger = logger
		self._jobId = jobId
		self._jobType = jobType
		self._dataManager = DataServiceManager(logger)

	def doProcess(self, hz, sid, did, lfid, feederDataFilePath, dailyBasedTS = None):
		self._logger.info("# [%s] Do nilm meta search, sid : %d, did : %d, lfid : %d, data : %s, freq : %d hz" %(self._jobId, sid, did, lfid, feederDataFilePath, hz))

		metaDetector = AppDetectR(self._logger)
		try:
			metaDetector.set_data(feederDataFilePath, hz)
			isDetected = metaDetector.detect_apps()
			newAppMeta = json.loads(metaDetector.getAppInfo())

			if isDetected:
				nilmMetaInfo = {'sid': sid, 'did': did, 'lfid': lfid, 'metaSearch':{}}
				nilmMetaInfo['metaSearch'][999] = self._genFidMetaSet(71, None)
				if newAppMeta:
					for nfid in [int(nfid) for nfid in newAppMeta.keys()]:
						vfidMeta = newAppMeta[str(nfid)]
						appType = self._getApplianceType(vfidMeta)
						nilmMetaInfo['metaSearch'][nfid] = self._genFidMetaSet(appType, vfidMeta)
				self._dataManager.setNilmMetaSearchInfo(nilmMetaInfo)
		except Exception, e:
			self._logger.exception(e)
		finally:
예제 #2
0
    def __init__(self, logger, options, args):
        self._logger = logger
        self._userOptions = self._setUserOptions(options, args)
        self._serviceManager = DataServiceManager(self._logger)

        if self._userOptions['debugMode']:
            # self._logger.setLevel(ELogger.DEBUG)
            self._logger.setLevel("DEBUG")
        else:
            # self._logger.setLevel(ELogger.INFO)
            self._logger.setLevel("INFO")
예제 #3
0
class OutputManager:
    def __init__(self, outputQ):
        self._logger = Logger(PROCESS_NAME).getLogger()
        self._logger.info('---------- [ Output Manager ] ----------')
        self._dataManager = DataServiceManager(self._logger)
        self._outputQ = outputQ

    def run(self):
        while True:
            self._logger.info("# Ready to run for nilm usage insert #")
            outputMsg = self._outputQ.get()
            try:
                if outputMsg['jobType'] == 'USAGE' or outputMsg[
                        'jobType'] == 'usage':

                    dailyBasedTS = outputMsg['dbTS']
                    sid = outputMsg['sid']
                    did = outputMsg['did']
                    lfid = outputMsg['lfid']
                    hourlyUsage = outputMsg['hourlyUsage']
                    dailyUsage = outputMsg['dailyUsage']
                    hourlyAppOn = outputMsg['hourlyAppOn']
                    dailyAppOn = outputMsg['dailyAppOn']

                    self._logger.info(">" * 50)
                    self._logger.info(
                        '# Q size : %d, sid : %d, did : %d, lfid : %d' %
                        (self._outputQ.qsize(), sid, did, lfid))
                    self._logger.info("<" * 50)
                    # self._logger.debug(' - hourlyUsage : %s' %str(hourlyUsage))
                    # self._logger.debug(' - dailyUsage  : %s' %str(dailyUsage))
                    # self._logger.debug(' - hourlyAppOn : %s' %str(hourlyAppOn))
                    # self._logger.debug(' - dailyAppOn  : %s' %str(dailyAppOn))

                    self._dataManager.setNilmHourlyFeederUsage(
                        dailyBasedTS, sid, did, lfid, hourlyUsage, hourlyAppOn)
                    self._dataManager.setNilmDailyFeederUsage(
                        dailyBasedTS, sid, did, lfid, dailyUsage, dailyAppOn)
                    time.sleep(0.2)
            except Exception, e:
                self._logger.error("# output message : %s" % str(outputMsg))
                self._logger.exception(e)
                self._outputQ.put_nowait(outputMsg)
                time.sleep(1)
예제 #4
0
class NilmAppUsage:
    def __init__(self, logger, jobId, jobType):
        self._dataManager = DataServiceManager(logger)
        self._logger = logger
        self._jobId = jobId
        self._jobType = jobType

    def doProcess(self,
                  hz,
                  sid,
                  did,
                  lfid,
                  feederDataFilePath,
                  dailyBasedTS=None):
        self._logger.info(
            "# [%s] Do nilm usages, sid : %d, did : %d, lfid : %d, based date : %s, freq : %d hz"
            % (self._jobId, sid, did, lfid, convertTS2Date(dailyBasedTS), hz))
        self._logger.info(" - file path : %s" % feederDataFilePath)
        appUsage = AppDailyLoadR(self._logger)
        resultMap = {}

        try:
            metaInfo = self._dataManager.getNilmMetaInfo(sid, did, lfid)
            appUsage.set_data(feederDataFilePath, hz)
            appUsage.set_app_info(metaInfo)
            appUsage.do_compute()
            appUsageMap = appUsage.get_usage()

            if not appUsageMap:
                self._logger.warn(
                    '- [%s] empty appUsageMap! sid : %d, file path : %s' %
                    (self._jobId, sid, feederDataFilePath))
                return None

            if appUsageMap:
                hourlyUsage, dailyUsage = self._cvtUsageData(appUsageMap)
                hourlyAppOn = self._checkHourlyAppOnOff(hourlyUsage)
                dailyAppOn = self._checkDailyAppOnOff(dailyUsage)

                resultMap = {
                    'dbTS': dailyBasedTS,
                    'jobType': self._jobType,
                    'sid': sid,
                    'did': did,
                    'lfid': lfid,
                    'hourlyUsage': hourlyUsage,
                    'dailyUsage': dailyUsage,
                    'hourlyAppOn': hourlyAppOn,
                    'dailyAppOn': dailyAppOn
                }
        except Exception, e:
            self._logger.exception(e)
            self._logger.error(appUsageMap)
        finally:
예제 #5
0
 def __init__(self, logger, jobId, jobType):
     self._logger = logger
     self._jobId = jobId
     self._jobType = jobType
     self._dataManager = DataServiceManager(logger)
예제 #6
0
class NilmMetaUpdate:
    def __init__(self, logger, jobId, jobType):
        self._logger = logger
        self._jobId = jobId
        self._jobType = jobType
        self._dataManager = DataServiceManager(logger)

    def doProcess(self,
                  hz,
                  sid,
                  did,
                  lfid,
                  feederDataFilePath,
                  dailyBasedTS=None):
        self._logger.info(
            "# [%s] Do nilm meta search, sid : %d, did : %d, lfid : %d, data : %s, freq : %d hz"
            % (self._jobId, sid, did, lfid, feederDataFilePath, hz))

        existedMeta = self._dataManager.getNilmMetaInfo(sid, did, lfid)
        metaDetector = AppDetectR(self._logger)
        if not existedMeta:
            self._logger.warn('# Meta is not be existed. sid : %d' % (sid))
            return self._genResult(dailyBasedTS, sid, did, lfid, hz)
        try:
            metaDetector.setExistedMeta(existedMeta)
            metaDetector.set_data(feederDataFilePath, hz)
            isDetected = metaDetector.detect_apps()
            if isDetected:
                newAppMeta = json.loads(metaDetector.getAppInfo())
                nilmMetaInfo = {
                    'sid': sid,
                    'did': did,
                    'lfid': lfid,
                    'metaSearch': {},
                    'metaUpdate': {}
                }

                # new meta
                insertNewMetaNfds = list(
                    set(newAppMeta.keys()).difference(existedMeta.keys()))
                for nfid in insertNewMetaNfds:
                    vfidMeta = newAppMeta[str(nfid)]
                    appType = self._getApplianceType(vfidMeta)
                    nilmMetaInfo['metaSearch'][int(
                        nfid)] = self._genFidMetaSet(appType, vfidMeta)

                # update meta info
                updateNewMetaNfids = list(
                    set(newAppMeta.keys()).intersection(existedMeta.keys()))
                for nfid in updateNewMetaNfids:
                    vfidMeta = newAppMeta[str(nfid)]
                    isEnabled = 1
                    nilmMetaInfo['metaUpdate'][int(
                        nfid)] = self._genUpdateMetaSet(vfidMeta, isEnabled)

                # not use meta info
                updateDisableNfids = list(
                    set(existedMeta.keys()).difference(newAppMeta.keys()))
                for nfid in updateDisableNfids:
                    vfidMeta = existedMeta[str(nfid)]
                    isEnabled = 0
                    nilmMetaInfo['metaUpdate'][int(
                        nfid)] = self._genUpdateMetaSet(vfidMeta, isEnabled)
                self._dataManager.setNilmMetaUpdateInfo(nilmMetaInfo)
        except Exception, e:
            self._logger.exception(e)
        finally:
예제 #7
0
class NilmMetaUpdate:
    def __init__(self, logger, jobId, jobType):
        self._logger = logger
        self._jobId = jobId
        self._jobType = jobType
        self._dataManager = DataServiceManager(logger)

    def doProcess(self, hz, sid, did, lfid, feederDataFilePath, dailyBasedTS = None):
        self._logger.info("# [%s] Do nilm meta update, sid : %d, did : %d, lfid : %d, data : %s, freq : %d hz" %(self._jobId, sid, did, lfid, feederDataFilePath, hz))

        oldMetaInfo = self._dataManager.getNilmMetaInfo(sid, did, lfid)

        hasMiscValue = False
        metaDetector = AppDetectR(self._logger)

        try:
            metaDetector.set_data(feederDataFilePath, hz)
            isDetected = metaDetector.detect_apps()
            self._logger.info("- [%s] meta detected : %s, freq : %d hz" %(self._jobId, str(isDetected), hz))

            newAppMeta = json.loads(metaDetector.getAppInfo())
            # self._dataManager.setUsageRouteDataService(sid)

            if not newAppMeta:
                self._dataManager.setNilmVirtualFeederInfo(sid, did, lfid, 999)
                return

            if isDetected:
                existingMetaInfo = self._dataManager.getNilmMetaInfo(sid, did, lfid)

                if not existingMetaInfo:
                    for nfid in [int(nfid) for nfid in newAppMeta.keys()]:
                        vfidMeta = newAppMeta[str(nfid)]
                        applianceType = self._getApplianceType(vfidMeta)

                        vfid = self._dataManager.setNilmVirtualFeederInfo(sid, did, lfid, nfid, applianceType)
                        self._dataManager.setNilmMetaInfo(vfid, vfidMeta)
                        if not hasMiscValue:
                            self._dataManager.setNilmVirtualFeederInfo(sid, did, lfid, 999)
                            hasMiscValue = True
            else:
                if newAppMeta:
                    for nfid in [int(nfid) for nfid in newAppMeta.keys()]:
                        vfidMeta = newAppMeta[str(nfid)]
                        applianceType = self._getApplianceType(vfidMeta)
                        vfid = self._dataManager.setNilmVirtualFeederInfo(sid, did, lfid, nfid, applianceType)
                        if vfid:
                            self._dataManager.setNilmMetaInfo(vfid, newAppMeta[str(nfid)])
                if not hasMiscValue:
                    self._dataManager.setNilmVirtualFeederInfo(sid, did, lfid, 999)
                    hasMiscValue = True
        except Exception, e:
            self._logger.exception(e)
        finally:
예제 #8
0
 def __init__(self, outputQ):
     self._logger = Logger(PROCESS_NAME).getLogger()
     self._logger.info('---------- [ Output Manager ] ----------')
     self._dataManager = DataServiceManager(self._logger)
     self._outputQ = outputQ
예제 #9
0
class OptionValidator:
    def __init__(self, logger, options, args):
        self._logger = logger
        self._userOptions = self._setUserOptions(options, args)
        self._serviceManager = DataServiceManager(self._logger)

        if self._userOptions['debugMode']:
            # self._logger.setLevel(ELogger.DEBUG)
            self._logger.setLevel("DEBUG")
        else:
            # self._logger.setLevel(ELogger.INFO)
            self._logger.setLevel("INFO")

    def _setUserOptions(self, options, args):
        user_options = {}
        if options.sids != None:
            user_options['sids'] = options.sids.split(',')
        if options.job != None:
            user_options['job'] = options.job
        if options.period != None:
            user_options['period'] = options.period
        if options.deviceProtocol != None:
            user_options['deviceProtocol'] = options.deviceProtocol.split(',')
        if options.groups != None:
            user_options['groups'] = options.groups.split(',')
        if options.fileSave != None:
            user_options['fileSave'] = options.fileSave
        if options.injection != None:
            user_options['injection'] = options.injection
        if options.remove != None:
            user_options['remove'] = options.remove.split(',')
        if options.numOfProcess != None:
            user_options['numOfProcess'] = options.numOfProcess
        if options.hasFile != None:
            user_options['hasFile'] = options.hasFile
        if options.onlyRawdata != None:
            user_options['onlyRawdata'] = options.onlyRawdata
        if options.debugMode != None:
            user_options['debugMode'] = options.debugMode
        if options.usagePeriod != None:
            user_options['usagePeriod'] = options.usagePeriod
        if options.deviceMeta != None:
            user_options['deviceMeta'] = options.deviceMeta
        return user_options

    def doCheckOptions(self):
        userOptions = {}
        userOptions['debugMode'] = self._checkLogMode()
        userOptions['sids'] = self._checkSiteId()
        userOptions['dids'] = ['*']  #self._checkDeviceId()
        userOptions['job'] = self._checkJob()
        startTS, endTS, userInputPeriod = self._checkPeriod()
        userOptions['startTS'] = startTS
        userOptions['endTS'] = endTS
        userOptions['userInputPeriod'] = userInputPeriod
        userOptions['deviceProtocol'] = self._checkDeviceProtocol(userOptions)
        userOptions['fileSave'] = self._checkFileSave()
        userOptions['numOfProcess'] = self._checkNumOfProcess()
        userOptions['injection'] = self._checkInjection()
        userOptions['remove'] = self._checkRemove()
        userOptions['hasFile'] = self._checkHasFile()
        userOptions['onlyRawdata'] = self._checkCollectingRawDataMode(
            userOptions)
        userOptions['usagePeriod'] = self._checkUsagePeriod()
        userOptions['deviceMeta'] = self._checkDeviceMeta()
        return userOptions

    def _checkSiteId(self):
        tarSids = []
        sids = self._userOptions.get('sids')

        def isNumber(string):
            try:
                int(string)
                return True
            except ValueError:
                return False

        for sid in sids:
            if isNumber(sid):
                pass
            else:
                if sid == '*':
                    groupNames = self._userOptions.get('groups')
                    if not groupNames:
                        groupNames = getNilmGroupNames()
                    sids = self._serviceManager.getNilmTargetSids(groupNames)
                    return sids
                else:
                    self._logger.warn(
                        "# Wrong site ids in the site id. Device id will be integer number or '*'."
                    )
                    sys.exit(1)

        return [int(sid) for sid in sids]

    def _checkDeviceId(self):
        tarDids = []
        dids = self._userOptions.get('dids')

        def isNumber(string):
            try:
                int(string)
                return True
            except ValueError:
                return False

        for did in dids:
            if isNumber(did):
                return [did]
            else:
                if did == '*':
                    return [did]
                else:
                    self._logger.warn(
                        "# Wrong device ids in the site id. Device id will be integer number or '*'."
                    )
                    sys.exit(1)

    def _checkPeriod(self):
        def _checkUsagePeriod(period):
            if period == 'hourly':
                startTS, endTS = getHourlyDatetime()
                return startTS, endTS
            elif period == 'daily':
                startTS, endTS = getDailyDatetime()
                return startTS, endTS
            else:
                return None, None

        def _checkUserPeriod(period):
            if self._userOptions.get('remove'):
                return 0, 0
            if not period or not len(period) == 2:
                return None, None
            else:
                startDT = period[0]
                endDT = period[1]
                startTS, endTS = getPeriodTS(startDT, endDT)
                return startTS, endTS

        def _error():
            self._logger.warn(
                "# Wrong timestamp format. check your time range formats.")
            sys.exit(1)

        period = self._userOptions.get('period')
        if period:
            startTS, endTS = _checkUserPeriod(period)
            userInputPeriod = True
        else:
            period = self._userOptions.get('usagePeriod')
            startTS, endTS = _checkUsagePeriod(period)
            userInputPeriod = False

        if not startTS or not endTS:
            _error()

        if startTS > endTS:
            _error()
        return startTS, endTS, userInputPeriod

    def _checkUsagePeriod(self):
        usagePeriod = self._userOptions.get('usagePeriod')
        if usagePeriod == 'hourly' or usagePeriod == 'daily':
            return usagePeriod
        else:
            self._logger.warn(
                """# Wrong usage period. (You have to use one such as 'hourly' or 'daily'"""
            )
            sys.exit(1)

    def _checkDeviceProtocol(self, tempUserOptions):
        deviceProtocols = []
        ALLOWED_PROTOCOLS = getAllowedProtocol()
        inputProtocols = self._userOptions.get('deviceProtocol')
        # try:
        # 	sid = int(tempUserOptions['sids'][0])
        # 	instType = self._serviceManager.getEdmType(sid)
        # 	envMode = getSystemEnv()
        # 	if instType != None:
        # 		for deviceProtocol in ALLOWED_PROTOCOLS:
        # 			if instType.lower() == deviceProtocol.split('_')[0]:
        # 				if len(deviceProtocol.split('_')) == 3 and envMode == 'staging':
        # 					return [deviceProtocol]
        # 				elif len(deviceProtocol.split('_')) == 2 and envMode == 'production':
        # 					return [deviceProtocol]
        # 	else:
        # 		self._logger.warn("wrong site id : %d" %sid)
        # 		sys.exit(1)
        # except Exception, e:
        # 	self._logger.exception(e)
        if inputProtocols:
            for inputProtocol in inputProtocols:
                if inputProtocol not in ALLOWED_PROTOCOLS:
                    self._logger.warn(
                        "# %s is not in allowed protocols.' %dProtocol")
                    sys.exit(1)
                else:
                    if inputProtocol == '*':
                        deviceProtocols = ['*']
                        return deviceProtocols
                    else:
                        deviceProtocols.append(inputProtocol)
                deviceProtocols = list(set(deviceProtocols))
        else:
            deviceProtocols = ALLOWED_PROTOCOLS
        return deviceProtocols

    def _checkJob(self):
        job = self._userOptions.get('job')
        if job == 'app_search' or job == 'app_usage' or job == 'candidate':
            return job
        elif not job:
            return None
        else:
            self._logger.warn(
                """# Wrong job request. (You have to use one such as 'app_search', 'app_usage' , 'candidate' or None)"""
            )
            sys.exit(1)

    def _checkFileSave(self):
        return self._userOptions.get('fileSave')

    def _checkInjection(self):
        return self._userOptions.get('injection')

    def _checkNumOfProcess(self):
        numOfProcess = self._userOptions.get('numOfProcess')
        maxNumOfProcess = getMaxProcess()
        if numOfProcess > maxNumOfProcess:
            numOfProcess = maxNumOfProcess
        return numOfProcess

    def _checkRemove(self):
        REMOVE_OPTIONS = ['appliance', 'meta', 'router', 'vfeeder', 'all', '*']
        options = self._userOptions.get('remove')

        if not options:
            return None

        options = list(set(options))
        if 'vfeeder' in options or 'all' in options or '*' in options:
            return ['vfeeder']

        sids = self._checkSiteId()
        if '*' in sids or len(sids) == 0 or len(sids) > 1:
            self._logger.warn(
                "# Wrong remove options. You have to use -s/--sids options.")
            sys.exit(1)

        for option in options:
            if not option in REMOVE_OPTIONS:
                self._logger.warn("# Wrong remove options.")
                sys.exit(1)
        return options

    def _checkHasFile(self):
        return self._userOptions.get('hasFile')

    def _checkCollectingRawDataMode(self, userOptions):
        isOnlyRawData = self._userOptions.get('onlyRawdata')
        if isOnlyRawData:
            sids = [int(sid) for sid in self._userOptions.get('sids')]
            userOptions['sids'] = sids
            return isOnlyRawData
        return isOnlyRawData

        # return self._userOptions.get('onlyRawdata')

    def _checkLogMode(self):
        return self._userOptions.get('debugMode')

    def _checkDeviceMeta(self):
        return self._userOptions.get('deviceMeta')