def try_calculate_dist_sum_time_percent(self, context): if "distsumtimeprocent" in self._functions: res = Actuator(device=self._asset.device, name=self.getAssetName('distsumtimeprocent'), connection=self._asset.connection) dist = context['distsumtime'] total = sum(dist) res.value = [(i * 100) / total for i in dist] context['distsumtimeprocent'] = res.value
def try_calculate_max(self, value, context): if 'max' in self._functions: maxAct = Actuator(device=self._asset.device, name=self.getAssetName('max'), connection=self._asset.connection) prevVal = maxAct.value if prevVal == None or value > prevVal: maxAct.value = value context['prev_max'] = prevVal context['max'] = value else: context['prev_max'] = prevVal context['max'] = prevVal
def try_calculate_avg(self, value, context): if 'avg' in self._functions: avg = Actuator(device=self._asset.device, name=self.getAssetName('avg'), connection=self._asset.connection) avgVal = avg.value if avgVal == None: avg.value = value context['avg'] = value else: cntVal = context['count'] val = avgVal - (avgVal / cntVal) + (float(value) / cntVal) avg.value = val context['prev_avg'] = avgVal context['avg'] = val
def try_calculate_count(self, context): """ calculate the count. """ if 'count' in self._functions: cnt = Actuator(device=self._asset.device, name=self.getAssetName('count'), connection=self._asset.connection) prevVal = cnt.value if not prevVal: cnt.value = 1 context['count'] = 1 else: cnt.value = prevVal + 1 context['count'] = prevVal + 1
def try_calculate_dist(self, value, context): if "dist" in self._functions: distDef = self._functions['dist'] dist = Actuator(device=self._asset.device, name=self.getAssetName('dist'), connection=self._asset.connection) if isinstance(value, bool): index = 0 if value == False else 1 result = dist.value if not result: result = [0, 0] else: result, min = self.prepareDistList(dist.value, context, distDef) index = (value - min) / distDef['bucketsize'] if index < len(result) and index >= 0: result[index] += 1 dist.value = result # send the value back to the server. context['dist'] = result
def try_calculate_dist_sum_time(self, asset, context): if "distsumtime" in self._functions: distDef = self._functions['distsumtime'] dist = Actuator(device=self._asset.device, name=self.getAssetName('distsumtime'), connection=self._asset.connection) value = asset.value prevValAct = Actuator(device=self._asset.device, name=self.getAssetName('distsumtimeprev'), connection=self._asset.connection) prevVal = prevValAct.value newTime = asset.value_at if prevVal: prevDate = dateutil.parser.parse(prevVal['timestamp']) prevVal = prevVal['value'] if isinstance(prevVal, bool): index = 0 if prevVal == False else 1 result = dist.value if not result: result = [0, 0] else: result, min = self.prepareDistList(dist.value, context, distDef) index = (prevVal - min) / distDef['bucketsize'] if index < len(result) and index >= 0: timeDif = dateutil.parser.parse(newTime) - prevDate result[index] += timeDif.total_seconds() context['distsumtime'] = result dist.value = result # send the value back to the server. prevValAct.value = {'value': value, 'timestamp': newTime}
def try_calculate_delta(self, value, context): if "delta" in self._functions: deltaPrev = Actuator(device=self._asset.device, name=self.getAssetName('deltaPrevTotal'), connection=self._asset.connection) deltaCur = Actuator(device=self._asset.device, name=self.getAssetName('deltaCurrentPeriod'), connection=self._asset.connection) prevDelta = deltaPrev.value if prevDelta: deltaCur.value = value - deltaPrev.value deltaPrev.value = value context['delta'] = deltaCur.value
def try_calculate_std(self, value, context): if "std" in self._functions: devSum = Actuator( device=self._asset.device, name=self.getAssetName('devSum'), connection=self._asset.connection ) # we use a helper actuator for this to store a midstage value if devSum.value == None: devSum.value = 0 else: devSum.value += (value - context['avg']) std = Actuator(device=self._asset.device, name=self.getAssetName('std'), connection=self._asset.connection) context['prev_avg'] = std.value std.value = math.sqrt( (devSum.value * devSum.value) / context['count']) context['std'] = std.value
def resetValues(self): """ resets all the values of the assets that this statistician feeds. This is called when a time period has passed. :return: """ if 'count' in self._functions: cnt = Actuator(device=self._asset.device, name=self.getAssetName('count'), connection=self._asset.connection) cntHist = Actuator(device=self._asset.device, name=self.getAssetName('countHistory'), connection=self._asset.connection) cntHist.value = cnt.value cnt.value = 0 if 'min' in self._functions: minAct = Actuator(device=self._asset.device, name=self.getAssetName('min'), connection=self._asset.connection) minActHist = Actuator(device=self._asset.device, name=self.getAssetName('minHistory'), connection=self._asset.connection) minAct.value = self._asset.value if 'max' in self._functions: maxAct = Actuator(device=self._asset.device, name=self.getAssetName('max'), connection=self._asset.connection) maxActHist = Actuator(device=self._asset.device, name=self.getAssetName('maxHistory'), connection=self._asset.connection) maxActHist.value = maxAct.value maxAct.value = self._asset.value if 'avg' in self._functions: avg = Actuator(device=self._asset.device, name=self.getAssetName('avg'), connection=self._asset.connection) avgHist = Actuator(device=self._asset.device, name=self.getAssetName('avgHistory'), connection=self._asset.connection) avgHist.value = avg.value avg.value = 0 if "std" in self._functions: devSum = Actuator(device=self._asset.device, name=self.getAssetName('devSum'), connection=self._asset.connection) devSum.value = 0 std = Actuator(device=self._asset.device, name=self.getAssetName('std'), connection=self._asset.connection) stdHist = Actuator(device=self._asset.device, name=self.getAssetName('stdHistory'), connection=self._asset.connection) stdHist.value = std.value std.value = 0 if "dist" in self._functions: dist = Actuator(device=self._asset.device, name=self.getAssetName('dist'), connection=self._asset.connection) distHist = Actuator(device=self._asset.device, name=self.getAssetName('distHistory'), connection=self._asset.connection) distHist.value = dist.value dist.value = [] if "distprocent" in self._functions: dist = Actuator(device=self._asset.device, name=self.getAssetName('distprocent'), connection=self._asset.connection) distHist = Actuator(device=self._asset.device, name=self.getAssetName('distprocentHistory'), connection=self._asset.connection) distHist.value = dist.value dist.value = [] if "distsumtime" in self._functions: distSumPrev = Actuator( device=self._asset.device, name=self.getAssetName('distsumtimeprev'), connection=self._asset.connection ) # we use a helper actuator for this to store a midstage value distSumPrev.value = {"value": None, "timestamp": None} distSum = Actuator(device=self._asset.device, name=self.getAssetName('distsumtime'), connection=self._asset.connection) distSumHist = Actuator( device=self._asset.device, name=self.getAssetName('distsumtimeHistory'), connection=self._asset.connection) distSumHist.value = distSum.value distSum.value = [] if "distsumtimeprocent" in self._functions: dist = Actuator(device=self._asset.device, name=self.getAssetName('distsumtimeprocent'), connection=self._asset.connection) dist.value = [] if 'delta' in self._functions: deltaHist = Actuator(device=self._asset.device, name=self.getAssetName('deltaHistory'), connection=self._asset.connection) deltaHistPrevTotal = Actuator( device=self._asset.device, name=self.getAssetName('deltaHistoryPrevTotal'), connection=self._asset.connection) deltaHist.value = self._asset.value - deltaHistPrevTotal.value deltaHistPrevTotal.value = self._asset.value