''' 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 #=> 5525740 (W) batteries[0].energy_discharged #=> 4659550 (W)
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)
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