Пример #1
0
status = powerwall.get_status()
print(f"Got Status: {status}")

'''
status.version
#=> '1.49.0'
status.up_time_seconds
#=> datetime.timedelta(days=13, seconds=63287, microseconds=146455)
status.start_time
#=> datetime.datetime(2020, 9, 23, 23, 31, 16, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
status.device_type
'''

energy = powerwall.get_energy()
print(f"Got Energy: {energy}")
capacity = powerwall.get_capacity()
print(f"Got Capacity: {capacity}")

batteries = powerwall.get_batteries()
print (f"Batteries: {batteries}")
'''
#=> [<Battery ...>, <Battery ...>]
batteries[0].part_number
#=> "XXX-G"
batteries[0].serial_number
#=> "TGXXX"
batteries[0].energy_remaining
#=> 7378 (W)
batteries[0].capacity
#=> 14031 (W)
batteries[0].energy_charged
Пример #2
0
class TestPowerWall(unittest.TestCase):
    def setUp(self):
        self.powerwall = Powerwall(ENDPOINT)

    def test_get_api(self):
        self.assertIsInstance(self.powerwall.get_api(), API)

    def test_pins_version_on_creation(self):
        pw = Powerwall(ENDPOINT, pin_version="1.49.0")
        self.assertEqual(pw.get_pinned_version(),
                         version.LooseVersion("1.49.0"))

        pw = Powerwall(ENDPOINT, pin_version=version.LooseVersion("1.49.0"))
        self.assertEqual(pw.get_pinned_version(),
                         version.LooseVersion("1.49.0"))

    @responses.activate
    def test_get_charge(self):
        add(
            Response(GET,
                     url=f"{ENDPOINT}system_status/soe",
                     json={"percentage": 53.123423}))
        self.assertEqual(self.powerwall.get_charge(), 53.123423)

    @responses.activate
    def test_get_sitemaster(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}sitemaster",
                     json=SITEMASTER_RESPONSE))

        sitemaster = self.powerwall.get_sitemaster()
        self.assertIsInstance(sitemaster, SiteMaster)

        self.assertEqual(sitemaster.status, "StatusUp")
        self.assertEqual(sitemaster.is_running, True)
        self.assertEqual(sitemaster.is_connected_to_tesla, True)
        self.assertEqual(sitemaster.is_power_supply_mode, False)

    @responses.activate
    def test_get_meters(self):
        add(
            Response(
                responses.GET,
                url=f"{ENDPOINT}meters/aggregates",
                json=METERS_AGGREGATES_RESPONSE,
            ))
        meters = self.powerwall.get_meters()
        self.assertIsInstance(meters, MetersAggregates)
        self.assertListEqual(
            meters.meters,
            [
                MeterType.SITE, MeterType.BATTERY, MeterType.LOAD,
                MeterType.SOLAR
            ],
        )
        self.assertIsInstance(meters.get_meter(MeterType.LOAD), Meter)

    @responses.activate
    def test_meter(self):
        add(
            Response(
                responses.GET,
                url=f"{ENDPOINT}meters/aggregates",
                json=METERS_AGGREGATES_RESPONSE,
            ))

    @responses.activate
    def test_is_sending(self):
        add(
            Response(
                responses.GET,
                url=f"{ENDPOINT}meters/aggregates",
                json=METERS_AGGREGATES_RESPONSE,
            ))
        meters = self.powerwall.get_meters()
        self.assertEqual(
            meters.get_meter(MeterType.SOLAR).is_sending_to(), False)
        self.assertEqual(meters.get_meter(MeterType.SOLAR).is_active(), True)
        self.assertEqual(
            meters.get_meter(MeterType.SOLAR).is_drawing_from(), True)
        self.assertEqual(
            meters.get_meter(MeterType.SITE).is_sending_to(), True)
        self.assertEqual(
            meters.get_meter(MeterType.LOAD).is_sending_to(), True)
        self.assertEqual(
            meters.get_meter(MeterType.LOAD).is_drawing_from(), False)
        self.assertEqual(meters.get_meter(MeterType.LOAD).is_active(), True)

    @responses.activate
    def test_get_grid_status(self):
        add(
            Response(
                responses.GET,
                url=f"{ENDPOINT}system_status/grid_status",
                json=GRID_STATUS_RESPONSE,
            ))
        grid_status = self.powerwall.get_grid_status()
        self.assertEqual(grid_status, GridStatus.CONNECTED)

    @responses.activate
    def test_is_grid_services_active(self):
        add(
            Response(
                responses.GET,
                url=f"{ENDPOINT}system_status/grid_status",
                json=GRID_STATUS_RESPONSE,
            ))
        self.assertEqual(self.powerwall.is_grid_services_active(), False)

    @responses.activate
    def test_get_site_info(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}site_info",
                     json=SITE_INFO_RESPONSE))
        site_info = self.powerwall.get_site_info()
        self.assertEqual(site_info.nominal_system_energy, 27)
        self.assertEqual(site_info.site_name, "test")
        self.assertEqual(site_info.timezone, "Europe/Berlin")

    @responses.activate
    def test_get_status(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}status",
                     json=STATUS_RESPONSE))
        status = self.powerwall.get_status()
        self.assertEqual(
            status.up_time_seconds,
            datetime.timedelta(seconds=61891, microseconds=214751),
        )
        self.assertEqual(
            status.start_time,
            datetime.datetime(
                2020,
                10,
                28,
                20,
                14,
                11,
                tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)),
            ),
        )
        self.assertEqual(status.device_type, DeviceType.GW1)
        self.assertEqual(status.version, "1.50.1")

    @responses.activate
    def test_get_device_type(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}status",
                     json=STATUS_RESPONSE))
        device_type = self.powerwall.get_device_type()
        self.assertIsInstance(device_type, DeviceType)
        self.assertEqual(device_type, DeviceType.GW1)

    @responses.activate
    def test_get_serial_numbers(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}powerwalls",
                     json=POWERWALLS_RESPONSE))
        serial_numbers = self.powerwall.get_serial_numbers()
        self.assertEqual(serial_numbers, ["SerialNumber1", "SerialNumber2"])

    @responses.activate
    def test_get_backup_reserved_percentage(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}operation",
                     json=OPERATION_RESPONSE))
        self.assertEqual(self.powerwall.get_backup_reserve_percentage(),
                         5.000019999999999)

    @responses.activate
    def test_get_operation_mode(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}operation",
                     json=OPERATION_RESPONSE))
        self.assertEqual(self.powerwall.get_operation_mode(),
                         OperationMode.SELF_CONSUMPTION)

    @responses.activate
    def test_get_version(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}status",
                     json=STATUS_RESPONSE))
        self.assertEqual(self.powerwall.get_version(), "1.50.1")

    @responses.activate
    def test_detect_and_pin_version(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}status",
                     json=STATUS_RESPONSE))
        vers = version.LooseVersion("1.50.1")
        pw = Powerwall(ENDPOINT)
        self.assertEqual(pw.detect_and_pin_version(), vers)
        self.assertEqual(pw._pin_version, vers)

    @responses.activate
    def test_system_status(self):
        add(
            Response(responses.GET,
                     url=f"{ENDPOINT}system_status",
                     json=SYSTEM_STATUS_RESPONSE))
        self.assertEqual(self.powerwall.get_capacity(), 28078)
        self.assertEqual(self.powerwall.get_energy(), 14807)

        batteries = self.powerwall.get_batteries()
        self.assertEqual(len(batteries), 2)
        self.assertEqual(batteries[0].part_number, "XXX-G")
        self.assertEqual(batteries[0].serial_number, "TGXXX")
        self.assertEqual(batteries[0].energy_remaining, 7378)
        self.assertEqual(batteries[0].capacity, 14031)
        self.assertEqual(batteries[0].energy_charged, 5525740)
        self.assertEqual(batteries[0].energy_discharged, 4659550)
        self.assertEqual(batteries[0].wobble_detected, False)

    def test_helpers(self):
        resp = {"a": 1}
        with self.assertRaises(MissingAttributeError):
            assert_attribute(resp, "test")

        with self.assertRaises(MissingAttributeError):
            assert_attribute(resp, "test", "test")

        self.assertEqual(convert_to_kw(2500, -1), 2.5)
Пример #3
0
class TestPowerwall(unittest.TestCase):
    def setUp(self) -> None:
        self.powerwall = Powerwall(POWERWALL_IP)
        self.powerwall.login(POWERWALL_PASSWORD)

    def tearDown(self) -> None:
        self.powerwall.close()

    def test_get_charge(self) -> None:
        charge = self.powerwall.get_charge()
        self.assertIsInstance(charge, float)

    def test_get_meters(self) -> None:
        meters = self.powerwall.get_meters()
        self.assertIsInstance(meters, MetersAggregates)

        self.assertIsInstance(meters.get_meter(MeterType.BATTERY), Meter)

        for meter_type in meters.meters:
            meter = meters.get_meter(meter_type)
            meter.energy_exported
            meter.energy_imported
            meter.instant_power
            meter.last_communication_time
            meter.frequency
            meter.average_voltage
            meter.get_energy_exported()
            meter.get_energy_imported()
            self.assertIsInstance(meter.get_power(), float)
            self.assertIsInstance(meter.is_active(), bool)
            self.assertIsInstance(meter.is_drawing_from(), bool)
            self.assertIsInstance(meter.is_sending_to(), bool)

    def test_sitemaster(self) -> None:
        sitemaster = self.powerwall.get_sitemaster()

        self.assertIsInstance(sitemaster, SiteMaster)

        sitemaster.status
        sitemaster.is_running
        sitemaster.is_connected_to_tesla
        sitemaster.is_power_supply_mode

    def test_site_info(self) -> None:
        site_info = self.powerwall.get_site_info()

        self.assertIsInstance(site_info, SiteInfo)

        site_info.nominal_system_energy
        site_info.site_name
        site_info.timezone

    def test_capacity(self) -> None:
        self.assertIsInstance(self.powerwall.get_capacity(), int)

    def test_energy(self) -> None:
        self.assertIsInstance(self.powerwall.get_energy(), int)

    def test_batteries(self) -> None:
        batteries = self.powerwall.get_batteries()
        self.assertGreater(len(batteries), 0)
        for battery in batteries:
            battery.wobble_detected
            battery.energy_discharged
            battery.energy_charged
            battery.energy_remaining
            battery.capacity
            battery.part_number
            battery.serial_number

    def test_grid_status(self) -> None:
        grid_status = self.powerwall.get_grid_status()
        self.assertIsInstance(grid_status, GridStatus)

    def test_status(self) -> None:
        status = self.powerwall.get_status()
        self.assertIsInstance(status, PowerwallStatus)
        status.up_time_seconds
        status.start_time
        status.version