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