Update tesla_powerwall to 0.3.3 (#41482)

This commit is contained in:
jrester 2020-10-08 15:26:44 +02:00 committed by GitHub
parent 07d208f1bc
commit 734972f876
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 38 additions and 42 deletions

View file

@ -4,7 +4,7 @@ from datetime import timedelta
import logging
import requests
from tesla_powerwall import APIChangedError, Powerwall, PowerwallUnreachableError
from tesla_powerwall import MissingAttributeError, Powerwall, PowerwallUnreachableError
import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
@ -72,9 +72,7 @@ async def _migrate_old_unique_ids(hass, entry_id, powerwall_data):
# The old unique_id ended with the nomianal_system_engery_kWh so we can use that
# to find the old base unique_id and extract the device_suffix.
normalized_energy_index = (
len(parts)
- 1
- parts[::-1].index(str(site_info.nominal_system_energy_kWh))
len(parts) - 1 - parts[::-1].index(str(site_info.nominal_system_energy))
)
device_suffix = parts[normalized_energy_index + 1 :]
@ -90,7 +88,9 @@ async def _migrate_old_unique_ids(hass, entry_id, powerwall_data):
await entity_registry.async_migrate_entries(hass, entry_id, _async_migrator)
async def _async_handle_api_changed_error(hass: HomeAssistant, error: APIChangedError):
async def _async_handle_api_changed_error(
hass: HomeAssistant, error: MissingAttributeError
):
# The error might include some important information about what exactly changed.
_LOGGER.error(str(error))
hass.components.persistent_notification.async_create(
@ -116,7 +116,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
except PowerwallUnreachableError as err:
http_session.close()
raise ConfigEntryNotReady from err
except APIChangedError as err:
except MissingAttributeError as err:
http_session.close()
await _async_handle_api_changed_error(hass, err)
return False
@ -135,7 +135,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
)
except PowerwallUnreachableError as err:
raise UpdateFailed("Unable to fetch data from powerwall") from err
except APIChangedError as err:
except MissingAttributeError as err:
await _async_handle_api_changed_error(hass, err)
hass.data[DOMAIN][entry.entry_id][POWERWALL_API_CHANGED] = True
# Returns the cached data. This data can also be None

View file

@ -19,7 +19,6 @@ from .const import (
POWERWALL_API_SITE_INFO,
POWERWALL_API_SITEMASTER,
POWERWALL_API_STATUS,
POWERWALL_BATTERY_METER,
POWERWALL_COORDINATOR,
)
from .entity import PowerWallEntity
@ -74,7 +73,7 @@ class PowerWallRunningSensor(PowerWallEntity, BinarySensorEntity):
@property
def is_on(self):
"""Get the powerwall running state."""
return self.coordinator.data[POWERWALL_API_SITEMASTER].running
return self.coordinator.data[POWERWALL_API_SITEMASTER].is_running
class PowerWallConnectedSensor(PowerWallEntity, BinarySensorEntity):
@ -98,7 +97,7 @@ class PowerWallConnectedSensor(PowerWallEntity, BinarySensorEntity):
@property
def is_on(self):
"""Get the powerwall connected to tesla state."""
return self.coordinator.data[POWERWALL_API_SITEMASTER].connected_to_tesla
return self.coordinator.data[POWERWALL_API_SITEMASTER].is_connected_to_tesla
class PowerWallGridStatusSensor(PowerWallEntity, BinarySensorEntity):
@ -147,6 +146,4 @@ class PowerWallChargingStatusSensor(PowerWallEntity, BinarySensorEntity):
def is_on(self):
"""Powerwall is charging."""
# is_sending_to returns true for values greater than 100 watts
return self.coordinator.data[POWERWALL_API_METERS][
POWERWALL_BATTERY_METER
].is_sending_to()
return self.coordinator.data[POWERWALL_API_METERS].battery.is_sending_to()

View file

@ -1,7 +1,7 @@
"""Config flow for Tesla Powerwall integration."""
import logging
from tesla_powerwall import APIChangedError, Powerwall, PowerwallUnreachableError
from tesla_powerwall import MissingAttributeError, Powerwall, PowerwallUnreachableError
import voluptuous as vol
from homeassistant import config_entries, core, exceptions
@ -27,7 +27,7 @@ async def validate_input(hass: core.HomeAssistant, data):
site_info = await hass.async_add_executor_job(power_wall.get_site_info)
except PowerwallUnreachableError as err:
raise CannotConnect from err
except APIChangedError as err:
except MissingAttributeError as err:
# Only log the exception without the traceback
_LOGGER.error(str(err))
raise WrongVersion from err

View file

@ -29,8 +29,6 @@ POWERWALL_API_SERIAL_NUMBERS = "serial_numbers"
POWERWALL_HTTP_SESSION = "http_session"
POWERWALL_BATTERY_METER = "battery"
MODEL = "PowerWall 2"
MANUFACTURER = "Tesla"

View file

@ -3,6 +3,6 @@
"name": "Tesla Powerwall",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/powerwall",
"requirements": ["tesla-powerwall==0.2.12"],
"requirements": ["tesla-powerwall==0.3.3"],
"codeowners": ["@bdraco", "@jrester"]
}

View file

@ -1,7 +1,7 @@
"""Support for August sensors."""
import logging
from tesla_powerwall import MeterType, convert_to_kw
from tesla_powerwall import MeterType
from homeassistant.const import DEVICE_CLASS_BATTERY, DEVICE_CLASS_POWER, PERCENTAGE
@ -85,7 +85,7 @@ class PowerWallChargeSensor(PowerWallEntity):
@property
def state(self):
"""Get the current value in percentage."""
return self.coordinator.data[POWERWALL_API_CHARGE]
return round(self.coordinator.data[POWERWALL_API_CHARGE])
class PowerWallEnergySensor(PowerWallEntity):
@ -131,18 +131,18 @@ class PowerWallEnergySensor(PowerWallEntity):
"""Get the current value in kW."""
return (
self.coordinator.data[POWERWALL_API_METERS]
.get(self._meter)
.get_meter(self._meter)
.get_power(precision=3)
)
@property
def device_state_attributes(self):
"""Return the device specific state attributes."""
meter = self.coordinator.data[POWERWALL_API_METERS].get(self._meter)
meter = self.coordinator.data[POWERWALL_API_METERS].get_meter(self._meter)
return {
ATTR_FREQUENCY: round(meter.frequency, 1),
ATTR_ENERGY_EXPORTED: convert_to_kw(meter.energy_exported),
ATTR_ENERGY_IMPORTED: convert_to_kw(meter.energy_imported),
ATTR_INSTANT_AVERAGE_VOLTAGE: round(meter.instant_average_voltage, 1),
ATTR_ENERGY_EXPORTED: meter.get_energy_exported(),
ATTR_ENERGY_IMPORTED: meter.get_energy_imported(),
ATTR_INSTANT_AVERAGE_VOLTAGE: round(meter.avarage_voltage, 1),
ATTR_IS_ACTIVE: meter.is_active(),
}

View file

@ -2152,7 +2152,7 @@ temperusb==1.5.3
# tensorflow==2.3.0
# homeassistant.components.powerwall
tesla-powerwall==0.2.12
tesla-powerwall==0.3.3
# homeassistant.components.tesla
teslajsonpy==0.10.4

View file

@ -1005,7 +1005,7 @@ surepy==0.2.6
tellduslive==0.10.11
# homeassistant.components.powerwall
tesla-powerwall==0.2.12
tesla-powerwall==0.3.3
# homeassistant.components.tesla
teslajsonpy==0.10.4

View file

@ -6,11 +6,11 @@ import os
from tesla_powerwall import (
DeviceType,
GridStatus,
MetersAggregateResponse,
MetersAggregates,
Powerwall,
PowerwallStatusResponse,
SiteInfoResponse,
SitemasterResponse,
PowerwallStatus,
SiteInfo,
SiteMaster,
)
from homeassistant.components.powerwall.const import DOMAIN
@ -29,12 +29,12 @@ async def _mock_powerwall_with_fixtures(hass):
device_type = await _async_load_json_fixture(hass, "device_type.json")
return _mock_powerwall_return_value(
site_info=SiteInfoResponse(site_info),
charge=47,
sitemaster=SitemasterResponse(sitemaster),
meters=MetersAggregateResponse(meters),
site_info=SiteInfo(site_info),
charge=47.34587394586,
sitemaster=SiteMaster(sitemaster),
meters=MetersAggregates(meters),
grid_status=GridStatus.CONNECTED,
status=PowerwallStatusResponse(status),
status=PowerwallStatus(status),
device_type=DeviceType(device_type["device_type"]),
serial_numbers=["TG0123456789AB", "TG9876543210BA"],
)
@ -66,10 +66,9 @@ def _mock_powerwall_return_value(
async def _mock_powerwall_site_name(hass, site_name):
powerwall_mock = MagicMock(Powerwall("1.2.3.4"))
site_info_resp = SiteInfoResponse(
await _async_load_json_fixture(hass, "site_info.json")
)
site_info_resp.site_name = site_name
site_info_resp = SiteInfo(await _async_load_json_fixture(hass, "site_info.json"))
# Sets site_info_resp.site_name to return site_name
site_info_resp.response["site_name"] = site_name
powerwall_mock.get_site_info = Mock(return_value=site_info_resp)
return powerwall_mock

View file

@ -1,6 +1,6 @@
"""Test the Powerwall config flow."""
from tesla_powerwall import APIChangedError, PowerwallUnreachableError
from tesla_powerwall import MissingAttributeError, PowerwallUnreachableError
from homeassistant import config_entries, setup
from homeassistant.components.powerwall.const import DOMAIN
@ -99,7 +99,9 @@ async def test_form_wrong_version(hass):
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
mock_powerwall = _mock_powerwall_side_effect(site_info=APIChangedError(object, {}))
mock_powerwall = _mock_powerwall_side_effect(
site_info=MissingAttributeError({}, "")
)
with patch(
"homeassistant.components.powerwall.config_flow.Powerwall",