コード例 #1
0
def get_aggregate_data(site,
                       measurement,
                       bucket_size='1h',
                       clause=None,
                       toSum=True,
                       operator='mean',
                       start='now'):
    """
    Calculate aggregate values from Influx for provided measuruements
    """
    i = Influx()
    result = [0]

    clause_opts = {
        'negative': (lambda x: x[operator] < 0),
        'positive': (lambda x: x[operator] > 0),
        'zero': (lambda x: x[operator] == 0)
    }

    if clause and not clause in clause_opts.keys():
        logger.error("unkown clause provided %s allowed %s" %
                     (clause, clause_opts.keys()))
        return result

    #get measurement values from influx
    if not toSum:
        operator = 'min'

    aggr_results = i.get_measurement_bucket(measurement,
                                            bucket_size,
                                            'site_name',
                                            site.site_name,
                                            operator=operator,
                                            start=start)

    logger.debug("influx results %s " % (aggr_results))

    #we have mean values by the hour now aggregate them
    if aggr_results:
        agr_value = []
        if clause:
            #if we have a cluase filter to apply
            aggr_results = filter(clause_opts[clause], aggr_results)

        if toSum:
            to_sum_vals = map(lambda x: x[operator], aggr_results)
            agr_value.append(sum(to_sum_vals))
            result = agr_value
        else:
            result = aggr_results

        logger.debug("Aggregating %s %s agr:%s" %
                     (measurement, aggr_results, agr_value))
    else:
        message = "No Values returned for aggregate. Check Influx Connection."
        logger.warning(message)

    return result
コード例 #2
0
def get_aggregate_data(site, measurement, bucket_size='1h', clause=None, toSum=True, operator='mean', start='now'):
    """
    Calculate aggregate values from Influx for provided measuruements
    """
    i = Influx()
    result = [0]

    clause_opts = {
            'negative': (lambda x : x[operator] < 0),
            'positive' : (lambda x: x[operator] > 0 ),
            'zero' : (lambda x: x[operator] == 0)}

    if clause and not clause in clause_opts.keys():
        logger.error("unkown clause provided %s allowed %s"%(clause,clause_opts.keys()))
        return result

    #get measurement values from influx
    if not toSum:
        operator = 'min'

    aggr_results = i.get_measurement_bucket(measurement, bucket_size, 'site_name', site.site_name, operator=operator, start=start)

    logger.debug("influx results %s "%(aggr_results))

    #we have mean values by the hour now aggregate them
    if aggr_results:
        agr_value = []
        if clause:
            #if we have a cluase filter to apply
            aggr_results = filter(clause_opts[clause],aggr_results)

        if toSum:
            to_sum_vals = map (lambda x: x[operator], aggr_results)
            agr_value.append(sum(to_sum_vals))
            result = agr_value
        else:
            result = aggr_results

        logger.debug("Aggregating %s %s agr:%s"%(measurement,aggr_results,agr_value))
    else:
        message = "No Values returned for aggregate. Check Influx Connection."
        logger.warning(message)

    return result
コード例 #3
0
class InfluxTestCase(TestCase):
    def setUp(self):

        self.VRM = VRM_Account.objects.create(vrm_user_id='*****@*****.**',
                                              vrm_password="******")
        # Setup Influx
        self._influx_db_name = 'test_db'
        self.i = Influx(database=self._influx_db_name)

        try:
            self.i.create_database(self._influx_db_name)
            #Generate random data  points for 24h
        except:
            self.i.delete_database(self._influx_db_name)
            sleep(1)
            self.i.create_database(self._influx_db_name)
            pass

        self.location = Geoposition(52.5, 24.3)
        dt = timezone.make_aware(timezone.datetime(2015, 12, 11, 22, 0))

        self.site = Sesh_Site.objects.create(site_name=u"Test_aggregate",
                                             comission_date=dt,
                                             location_city=u"kigali",
                                             location_country=u"rwanda",
                                             vrm_account=self.VRM,
                                             installed_kw=123.0,
                                             position=self.location,
                                             system_voltage=12,
                                             number_of_panels=12,
                                             vrm_site_id=213,
                                             battery_bank_capacity=12321,
                                             has_genset=True,
                                             has_grid=True)

        self.no_points = create_test_data(self.site,
                                          start=self.site.comission_date,
                                          end=dt + timedelta(hours=48),
                                          interval=30)
        #create test user
        self.test_user = Sesh_User.objects.create_user(username="******",
                                                       email="*****@*****.**",
                                                       password="******")
        #assign a user to the sites
        assign_perm("view_Sesh_Site", self.test_user, self.site)

    def tearDown(self):
        self.i.delete_database(self._influx_db_name)
        pass

    @override_settings(INFLUX_DB='test_db')
    def test_influx_aggr_query(self):
        """
        Test all the DP were created in MYSQL and INFLUX
        """

        mean = self.i.get_measurement_bucket('pv_production',
                                             '1h',
                                             'site_name',
                                             self.site.site_name,
                                             operator='mean',
                                             start=self.site.comission_date)

        self.assertEqual(25, len(mean))
        self.assertEqual(50, mean[0]['mean'])
コード例 #4
0
class InfluxTestCase(TestCase):

    def setUp(self):

        self.VRM = VRM_Account.objects.create(vrm_user_id='*****@*****.**',vrm_password="******")
        # Setup Influx
        self._influx_db_name = 'test_db'
        self.i = Influx(database=self._influx_db_name)

        try:
            self.i.create_database(self._influx_db_name)
            #Generate random data  points for 24h
        except:
           self.i.delete_database(self._influx_db_name)
           sleep(1)
           self.i.create_database(self._influx_db_name)
           pass

        self.location = Geoposition(52.5,24.3)
        dt = timezone.make_aware(timezone.datetime(2015, 12, 11, 22, 0))

        self.site = Sesh_Site.objects.create(site_name=u"Test_aggregate",
                                             comission_date = dt,
                                             location_city = u"kigali",
                                             location_country=u"rwanda",
                                             vrm_account = self.VRM,
                                             installed_kw=123.0,
                                             position=self.location,
                                             system_voltage=12,
                                             number_of_panels=12,
                                             vrm_site_id=213,
                                             battery_bank_capacity=12321,
                                             has_genset=True,
                                             has_grid=True)

        self.no_points = create_test_data(self.site,
                                        start = self.site.comission_date,
                                        end = dt + timedelta( hours = 48),
                                        interval = 30,
                                        random = False)
        #create test user
        self.test_user = Sesh_User.objects.create_user(username="******",email="*****@*****.**",password="******")
        #assign a user to the sites
        assign_perm("view_Sesh_Site",self.test_user,self.site)

    def tearDown(self):
        self.i.delete_database(self._influx_db_name)
        pass

    @override_settings(INFLUX_DB='test_db')
    def test_influx_aggr_query(self):
        """
        Test all the DP were created in MYSQL and INFLUX
        """

        mean = self.i.get_measurement_bucket('pv_production',
                                            '1h',
                                            'site_name',
                                            self.site.site_name,
                                            operator='mean',
                                            start=self.site.comission_date)

        self.assertEqual(25,len(mean))
        self.assertEqual(50,mean[0]['mean'])