def test_ctor_timeout(self):
     if skip_timeout_tests:
         self.skipTest('skipped test due to SKIP_TIMEOUT_TESTS')
     else:
         fi=FroniusInverter(timeout_ip)
         with self.assertRaises(Exception):
             fi.check_server_compatibility()
 def test_getRealtimeData(self):
     fi = FroniusInverter(inverter_ip)
     json = fi.get_inverter_realtime_data()
     frt = FroniusRealTimeJson(json)
     rtd = frt.data()
     self.assertEqual(type(rtd), pandas.core.frame.DataFrame)
     self.assertEqual(len(rtd), 1)
 def test_FroniusInverter_RT_rename_timestamp(self):
     fi = FroniusInverter(inverter_ip)
     json = fi.get_inverter_realtime_data()
     frt = FroniusRealTimeJson(json)
     label = "foo"
     rtd = frt.data(label)
     self.assertEqual(type(rtd), pandas.core.frame.DataFrame)
     self.assertEqual(len(rtd), 1)
     self.assertTrue(label in list(rtd))
 def test_FroniusInverter_Historical_test_only_inverter_data(self):
     get_channels = ["Current_AC_Phase_1"]
     fi = FroniusInverter(inverter_ip)
     from_date = date_with_data
     to_date = date_with_data + datetime.timedelta(hours=12)
     data_1_day = fi.get_historical_data(from_date, to_date, get_channels)
     # should have datamager and inverter data
     self.assertTrue(data_1_day is not None)
     if data_1_day is not None:
         self.assertEqual(len(data_1_day.keys()), 1)
         self.check_devices(data_1_day, [ "inverter/"])
         self.check_channels(data_1_day, get_channels)
         self.check_date(data_1_day, from_date, to_date, "ts")
 def test_FroniusInverter_Historical_test_only_datamanager_data(self):
     get_channels = ["Digital_PowerManagementRelay_Out_1"]
     fi = FroniusInverter(inverter_ip)
     from_date = date_with_data
     to_date = date_with_data + datetime.timedelta(hours=48)
     data_1_day = fi.get_historical_data(from_date, to_date, get_channels)
     # should have datamager and inverter data
     self.assertTrue(data_1_day is not None)
     if data_1_day is not None:
         self.assertEqual(len(data_1_day.keys()), 1)
         self.check_devices(data_1_day, ["datamanager:/"])
         self.check_channels(data_1_day, get_channels)
         self.check_date(data_1_day, from_date, to_date, "ts")
    def test_confirm_assumption_8_hours_over_2_days(self):
        if skip_inverter_quirk_tests:
            self.skipTest('skipped test due to SKIP_INVERTER_QUIRK_TESTS')
        else:
            fi = FroniusInverter(inverter_ip)
            day = datetime.datetime(year=2017, month=11, day=4, hour=20, minute=0, second=0)
            data_1_day_J = fi.get_historical_data_json(day, day + datetime.timedelta(hours=8), ["Current_AC_Phase_1"])

            request_start = data_1_day_J['Head']['RequestArguments']['StartDate']
            expected_request_start = '2017-11-04T00:00:00+01:00'
            request_end = data_1_day_J['Head']['RequestArguments']['EndDate']
            expected_request_end = '2017-11-05T23:59:59+01:00'
            self.assertEqual(request_start, expected_request_start)
            self.assertEqual(request_end, expected_request_end)
    def test_confirm_assumption_Server_cannot_accept_any_TZ(self):
        """
            the server will return invalid date format (too much segments) '2017-10-31+20%3A00%3A00-08%3A00' error
            when sending datetimes in UTC+8
        """
        if skip_inverter_quirk_tests:
            self.skipTest('skipped test due to SKIP_INVERTER_QUIRK_TESTS')
        else:
            fi = FroniusInverter(inverter_ip)

            t1_utc_8 = datetime.datetime(year=2017, month=11, day=1, hour=4) - datetime.timedelta(hours=8)
            t1_utc_8 = pytz.timezone('Etc/GMT+8').localize(t1_utc_8, is_dst=None)

            data_1_day_J = fi.get_historical_data_json(t1_utc_8, t1_utc_8 + datetime.timedelta(hours=24), ["Current_AC_Phase_1"])

            faj = FroniusArchiveJson(data_1_day_J)
            self.assertEqual(faj.error_code(), 255)
    def test_FroniusInverter_RT_test_append(self):
        fi = FroniusInverter(inverter_ip)
        json = fi.get_inverter_realtime_data()
        frt = FroniusRealTimeJson(json)
        rtd = frt.data()
        # get 2nd observation.  occasionally the inverter will return the same value.
        # iterate until a new observation is returned.  iterate at most 10 times

        rtd2 = rtd
        retry = 10
        while (rtd.iloc[0,:]['ts'] == rtd2.iloc[0,:]['ts']) and (0 < retry):
            json = fi.get_inverter_realtime_data()
            frt = FroniusRealTimeJson(json)
            rtd2 = frt.data('ts', append=rtd)
            retry -= 1

        self.assertEqual(type(rtd2), pandas.core.frame.DataFrame)
        self.assertEqual(len(rtd2), 2)
        self.assertEqual(len(list(set(rtd2['ts']))), 2)
    def test_FroniusInverter_Historical_test_UTC_8_datetimes(self):
        """
            the fronius server does not respond well to UTC+8 for some reason
        """

        t1_utc_8 = datetime.datetime(year=2017, month=11, day=1, hour=4) - datetime.timedelta(hours=8)
        t1_utc_8 = pytz.timezone('Etc/GMT+8').localize(t1_utc_8, is_dst=None)

        f = t1_utc_8
        t = t1_utc_8 + datetime.timedelta(hours=16)
        fi = FroniusInverter(inverter_ip)
        get_channels = ["Digital_PowerManagementRelay_Out_1", "Current_AC_Phase_1"]

        data_liberal = fi.get_historical_data(f, t, get_channels, strict=False)
        self.assertTrue(data_liberal is not None)

        if data_liberal is not None:
            self.assertEqual(len(data_liberal.keys()), 2)
            self.check_devices(data_liberal, ["datamanager:/", "inverter/"])
            self.check_channels(data_liberal, get_channels)
            self.check_date(data_liberal, f, t, "ts", strict=False)
    def test_confirm_assumption_Server_uses_UTC(self):
        """
        assume the server returns a full day of data on a given UTC date, and interprets the data as UTC

        try sending it UTC +1 data that covers 1 day in UTC and 2 days in UTC+1:
            06:00 - 23:59  UTC
            14:00 - 08:59  UTC +1
            confirm that only data of day 1 is returned
        """

        if skip_inverter_quirk_tests:
            self.skipTest('skipped test due to SKIP_INVERTER_QUIRK_TESTS')
        else:
            fi = FroniusInverter(inverter_ip)
            day = datetime.datetime(year=2017, month=11, day=4, hour=20, minute=0, second=0)
            data_1_day_J = fi.get_historical_data_json(day, day + datetime.timedelta(hours=8), ["Current_AC_Phase_1"])

            request_start = data_1_day_J['Head']['RequestArguments']['StartDate']
            expected_request_start = '2017-11-04T00:00:00+01:00'
            request_end = data_1_day_J['Head']['RequestArguments']['EndDate']
            expected_request_end = '2017-11-05T23:59:59+01:00'
            self.assertEqual(request_start, expected_request_start)
            self.assertEqual(request_end, expected_request_end)
 def test_realtime_data(self):
     fi = FroniusInverter(inverter_ip)
     rtd = fi.get_inverter_realtime_data()
     self.assertEqual(type(rtd), dict)
 def test_version_compatibility(self):
     fi = FroniusInverter(inverter_ip)
     compatible, response = fi.check_server_compatibility()
     self.assertTrue(compatible)
     self.assertEqual(type(response), dict)
 def test_class_get_channels(self):
     self.assertEqual(len(FroniusInverter.get_all_channels()), 24)
 def test_ctor(self):
     fi=FroniusInverter(inverter_ip)
    def test_FroniusInverter_Historical_test_strict_vs_liberal_datetimes(self):
        """
            test - liberal vs strict
            fetch 16 hours of data in liberal mode
            fetch  D   04:00 UTC   - D 20:00 UTC   - should yield data at most 24 hours of data

            fetch the same measurements using strict mode

            pick 1 measurement. fetch that single measurement using strict mode
        """

        channels = ["Current_AC_Phase_1"]

        t1_utc = datetime.datetime(year=2017, month=11, day=1, hour=4)
        t1_utc = pytz.timezone('UCT').localize(t1_utc, is_dst=None)

        fi = FroniusInverter(inverter_ip)
        key = 'inverter/1'
        ts = 'ts'

        f = t1_utc
        t = t1_utc + datetime.timedelta(hours=16)
        data_liberal = fi.get_historical_data(f, t, channels, strict=False)

        if data_liberal is not None:
            self.check_date(data_liberal, f, t, "ts", strict=False)

        timestamps_liberal = data_liberal[key][ts]
        earliest_liberal_utc = min(timestamps_liberal)
        latest_liberal_utc = max(timestamps_liberal)
        count_liberal_utc = len(timestamps_liberal)

        data_strict = fi.get_historical_data(earliest_liberal_utc,
                                             latest_liberal_utc + datetime.timedelta(seconds=1), channels,
                                             strict=True)
        if data_liberal is not None:
            self.check_date(data_strict, earliest_liberal_utc,
                            latest_liberal_utc + datetime.timedelta(seconds=1), "ts")

        timestamps_strict = data_strict[key][ts]
        earliest_strict_utc = min(timestamps_strict)
        latest_strict_utc = max(timestamps_strict)
        count_strict_utc = len(timestamps_strict)

        self.assertEqual(latest_liberal_utc - earliest_liberal_utc, latest_strict_utc - earliest_strict_utc)
        self.assertEqual(count_liberal_utc, count_strict_utc)

        data_strict = fi.get_historical_data(earliest_liberal_utc, earliest_liberal_utc + datetime.timedelta(seconds=1),
                                             channels, strict=True)

        if data_liberal is not None:
            self.check_date(data_strict, earliest_liberal_utc,
                            earliest_liberal_utc + datetime.timedelta(seconds=1), "ts")

        timestamps_strict = data_strict[key][ts]
        earliest_strict_utc = min(timestamps_strict)
        latest_strict_utc = max(timestamps_strict)
        count_strict_utc = len(timestamps_strict)

        self.assertEqual(datetime.timedelta(seconds=0), latest_strict_utc - earliest_strict_utc)
        self.assertEqual(1, count_strict_utc)
Example #16
0
 def test_find_earliest(self):
     fi=FroniusInverter(inverter_ip)
     found = fi.find_earliest_data()
     self.assertEqual(found - inverter_installation_time, datetime.timedelta(seconds=0))