Exemple #1
0
    def test__get_monsol_meter_readings__two_hours(self):

        self.maxDiff = None

        date_from = todtaware('2021-11-01 13:00:00')
        date_to = todtaware('2021-11-01 15:00:00')
        granularity = '60'
        device = None

        status, token = self.api.reuse_token()

        self.assertEqual(status, 200)

        status, readings = self.api.get_monsol_meter_readings(
            date_from, date_to, granularity, device)

        # TODO remove this when monsol fix the one second rate limit
        if status == 401:
            time.sleep(1)
            status, readings = self.api.get_monsol_meter_readings(
                date_from, date_to, granularity, device)

        expected = self.sample_historic_reading()

        self.assertEqual(status, 200)
        self.assertTrue('data' in readings)
        self.assertGreater(len(readings['data']), 0)
        self.assertListEqual(list(readings['data'][0].keys()),
                             list(expected['data'][0].keys()))
        self.assertDictEqual(readings['data'][0], expected['data'][0])
Exemple #2
0
    def test__getMeterReadingsFromLastUpload__OneReading(self):

        plant = self.pony.db.Plant(
            name=self.mainFacility(),
            codename='SomEnergia_{}'.format(self.mainFacility()),
        )

        time = todtaware('2020-01-01 00:00:00')

        meter = self.pony.db.Meter(plant=plant, name='1234')

        export_energy_wh = 210

        meter.insertRegistry(time=time,
                             export_energy_wh=export_energy_wh,
                             import_energy_wh=0,
                             r1_VArh=0,
                             r2_VArh=0,
                             r3_VArh=0,
                             r4_VArh=0)

        orm.flush()

        expected = [
            (todtaware('2020-01-01 00:00:00'), 210),
        ]

        with orm.db_session:
            result = getMeterReadings(self.pony.db, plant.codename)

        self.assertEqual(expected, result)
Exemple #3
0
 def test_uploadProduction_singleData(self):
     facility = self.mainFacility()
     api = self.createApi()
     response = api.uploadProduction(facility, [
         (todtaware("2040-01-01 00:00:00"), 10),
     ])
     self.assertEqual(response, 'OK')
     self.assertEqual(api.lastDateUploaded(facility),
                      todtaware("2040-01-01 00:00:00"))
Exemple #4
0
    def test_irradiation_oneDay(self):
        self.setupPlant()
        self.importData(self.sensor,
                        'b2bdata/irradiance-2021-07-21-Alcolea.csv')
        query = Path('queries/view_irradiation.sql').read_text(encoding='utf8')
        result = [
            r for r in self.pony.db.select(query)
            if todtaware('2021-06-01 00:00:00') <= r.time
            and r.time < todtaware('2021-06-02 00:00:00') and r.sensor == 1
        ]

        self.assertOutputB2B(result)
Exemple #5
0
    def test_irradiation_halfHourWithReadings(self):
        self.setupPlant()
        self.importData(
            self.sensor,
            'b2bdata/irradiance-2021-07-21-Alcolea_test_cases.csv')
        query = Path('queries/view_irradiation.sql').read_text(encoding='utf8')
        result = [
            r.irradiation_w_m2_h for r in self.pony.db.select(query)
            if todtaware('2021-07-14 8:00:00') <= r.time
            and r.time < todtaware('2021-07-14 9:00:00')
        ][0]

        self.assertAlmostEqual(result, 415.2791252777778, places=5)
Exemple #6
0
    def test_irradiation_incompleteLastDay(self):
        self.setupPlant()
        self.importData(
            self.sensor,
            'b2bdata/irradiance-2021-07-21-Alcolea_test_cases.csv')
        query = Path('queries/view_irradiation.sql').read_text(encoding='utf8')
        result = [
            r.irradiation_w_m2_h for r in self.pony.db.select(query)
            if todtaware('2021-07-14 9:00:00') <= r.time
            and r.time < todtaware('2021-07-14 10:00:00') and r.sensor == 1
        ][0]

        self.assertAlmostEqual(result, 551.254630277778, places=5)
Exemple #7
0
    def test_getLastDateDownloaded(self):
        with self.createPlantmonitorDB() as db:
            data = {
                self.mainFacility(): [
                    (todtaware("2020-01-02 00:00:00"), 10),
                    (todtaware("2020-01-02 01:00:00"), 20),
                ],
            }
            forecastDate = todtaware("2020-01-01 00:00:00")
            db.addForecast(data, forecastDate)

            result = db.lastDateDownloaded(self.mainFacility())

            self.assertEqual(result, todtaware("2020-01-02 01:00:00"))
Exemple #8
0
    def test__uploadMeterReadings__checkResponses(self):

        plant = self.pony.db.Plant(
            name=self.mainFacility(),
            codename='SomEnergia_{}'.format(self.mainFacility()),
        )

        time = todtaware('2020-01-01 00:00:00')

        meter = self.pony.db.Meter(plant=plant, name='1234')

        export_energy_wh = 210

        meter.insertRegistry(time=time,
                             export_energy_wh=export_energy_wh,
                             import_energy_wh=0,
                             r1_VArh=0,
                             r2_VArh=0,
                             r3_VArh=0,
                             r4_VArh=0)

        orm.flush()

        with self.createApi() as api:
            responses = uploadMeterReadings(self.pony.db, self.createConfig())

        expectedResponse = 'OK'
        self.assertEqual(responses[plant.codename], expectedResponse)
Exemple #9
0
    def test_addForecast_overwrite(self):
        self.maxDiff = None
        with self.createPlantmonitorDB() as db:
            data = {
                self.mainFacility(): [
                    (todtaware("2020-01-02 00:00:00"), 10),
                    (todtaware("2020-01-02 01:00:00"), 20),
                ],
            }
            forecastDate = todt("2020-01-01 00:00:00")
            db.addForecast(data, forecastDate)

            data2 = {
                self.mainFacility(): [
                    (todtaware("2020-01-02 01:00:00"), 30),
                    (todtaware("2020-01-02 02:00:00"), 40),
                ],
            }
            forecastDate = todt("2020-01-01 00:00:00")
            db.addForecast(data2, forecastDate)

            dataResult = {
                self.mainFacility(): [
                    (todtaware("2020-01-02 00:00:00"), 10),
                    (todtaware("2020-01-02 01:00:00"), 30),
                    (todtaware("2020-01-02 02:00:00"), 40),
                ],
            }
            result = db.getForecast()
            self.assertEqual(dataResult, result)
Exemple #10
0
    def test_addForecast(self):
        with self.createPlantmonitorDB() as db:
            self.maxDiff = None

            data = {
                self.mainFacility(): [
                    (todtaware("2020-01-02 00:00:00"), 10),
                    (todtaware("2020-01-02 01:00:00"), 20),
                ],
                self.secondaryFacility(): [
                    (todtaware("2020-01-02 00:00:00"), 210),
                    (todtaware("2020-01-02 01:00:00"), 340),
                ],
            }
            forecastDate = todtaware("2020-01-01 00:00:00")
            db.addForecast(data, forecastDate)
            result = db.getForecast()
            self.assertEqual(data, result)
Exemple #11
0
    def __test_downloadForecast_setup(self):

        forecastMeta = self.sampleForecastMeta(self.mainFacility(), time)

        status = 'OK'
        forecastDate = time

        forecastMetadata = self.pony.db.ForecastMetadata.create(
            plant=alcolea, forecastdate=forecastDate, errorcode=status)
        forecastMetadata.addForecasts(data[self.mainFacility()])

        orm.flush()

        expected = [
            (todtaware('2020-01-01 00:00:00'), 210),
            (todtaware('2020-01-01 01:00:00'), 320),
            (todtaware('2020-01-01 02:00:00'), 230),
            (todtaware('2020-01-01 03:00:00'), 340),
        ]
    def test_downloadForecast(self):
        data = {
            self.mainFacility(): [
                (todt("2040-01-02 00:00:00"), 10),
                (todt("2040-01-02 01:00:00"), 20),
            ],
        }

        fromDate = todt("{}-01-01 00:00:00".format(dt.datetime.now().year))
        toDate = todt("{}-01-03 00:00:00".format(dt.datetime.now().year))

        with self.createApi() as api:
            for facility, values in data.items():
                resultForecast = api.getForecast(facility, fromDate, toDate)
                self.assertEqual(resultForecast[0][0], todtaware("{}-01-01 00:00:00".format(dt.datetime.now().year)))
Exemple #13
0
    def test__getMeterReadingsFromLastUpload__noMeter(self):

        plant = self.pony.db.Plant(
            name=self.mainFacility(),
            codename='SomEnergia_{}'.format(self.mainFacility()),
        )

        time = todtaware('2020-01-01 00:00:00')

        orm.flush()

        with orm.db_session:
            result = getMeterReadings(self.pony.db, plant.codename)

        self.assertIsNone(result)
Exemple #14
0
    def test_getForecastFormatCheck(self):
        api = self.createApi()
        facility = self.mainFacility()
        api.uploadProduction(facility, [
            (todt("{}-01-01 00:00:00".format(
                datetime.datetime.now().year)), 10),
        ])
        result = api.getForecast(
            facility,
            todt("{}-01-01 00:00:00".format(datetime.datetime.now().year)),
            todt("{}-01-01 00:00:00".format(datetime.datetime.now().year)),
        )

        #expected [("2020-01-01 00:00:00", _)] since we don't know meteologica's algorithm
        logger.debug(result)
        self.assertEqual(len(result), 1)
        self.assertEqual(len(result[0]), 2)
        self.assertEqual(
            result[0][0],
            todtaware("{}-01-01 00:00:00".format(
                datetime.datetime.now().year)))
 def mockMeterReadingsSideEffects(self, meterName, beyond, upto):
     if not beyond:
         return [r for r in self.readingsDB[meterName] if todtaware(r[0]) < upto]
     else:
         return [r for r in self.readingsDB[meterName] if beyond < todtaware(r[0]) and todtaware(r[0]) < upto]
Exemple #16
0
    def test__createForecast__OnePlant(self):
        alcolea = self.pony.db.Plant(
            name=self.mainFacility(),
            codename='SomEnergia_{}'.format(self.mainFacility()),
        )

        time = datetime.datetime(2020,
                                 12,
                                 10,
                                 15,
                                 5,
                                 10,
                                 588861,
                                 tzinfo=datetime.timezone.utc)

        forecastMeta = {
            'variable': 'prod',
            'predictor': 'aggregated',
            'granularity': '60',
            'forecastdate': time,
            'errorcode': '',
        }

        forecastData = {
            self.mainFacility(): [
                (todtaware("2040-01-02 00:00:00"), 10),
                (todtaware("2040-01-02 01:00:00"), 20),
            ],
        }

        forecastMetadata = self.pony.db.ForecastMetadata.create(plant=alcolea,
                                                                **forecastMeta)

        self.assertIsNotNone(forecastMetadata)

        for f in forecastData[self.mainFacility()]:
            forecastMetadata.insertForecast(
                time=f[0],
                percentil10=None,
                percentil50=f[1],
                percentil90=None,
            )
        orm.flush()

        expected = [{
            'forecastMetadata':
            1,
            'percentil10':
            None,
            'percentil50':
            10,
            'percentil90':
            None,
            'time':
            datetime.datetime(2040, 1, 2, 0, 0, tzinfo=datetime.timezone.utc)
        }, {
            'forecastMetadata':
            1,
            'percentil10':
            None,
            'percentil50':
            20,
            'percentil90':
            None,
            'time':
            datetime.datetime(2040, 1, 2, 1, 0, tzinfo=datetime.timezone.utc)
        }]
        forecasts = [f.to_dict() for f in self.pony.db.Forecast.select()]
        self.assertListEqual(forecasts, expected)