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
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
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'])
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'])