示例#1
0
async def test_price_extract(day_str, num_prices, num_calls, num_prices_8h,
                             available_8h):
    """Test data parsing of official API files."""
    day = datetime.fromisoformat(day_str)
    mock_session = MockAsyncSession()

    pvpc_data = PVPCData(
        local_timezone=_TZ_TEST,
        tariff="discrimination",
        websession=mock_session,
    )

    pvpc_data.source_available = True
    assert not pvpc_data.process_state_and_attributes(day)

    await pvpc_data.async_update_prices(day)
    has_prices = pvpc_data.process_state_and_attributes(day)
    assert len(pvpc_data._current_prices) == num_prices
    assert mock_session.call_count == num_calls
    assert has_prices

    has_prices = pvpc_data.process_state_and_attributes(day +
                                                        timedelta(hours=10))
    assert len(pvpc_data._current_prices) == num_prices_8h
    assert has_prices == available_8h
示例#2
0
async def test_bad_downloads(
    available,
    day_str,
    num_log_msgs,
    status,
    exception,
    caplog,
):
    """Test data parsing of official API files."""
    day = datetime.fromisoformat(day_str)
    mock_session = MockAsyncSession(status=status, exc=exception)
    with caplog.at_level(logging.DEBUG):
        pvpc_data = PVPCData(
            local_timezone=REFERENCE_TZ,
            tariff="normal",
            websession=mock_session,
        )
        pvpc_data.source_available = available
        assert not pvpc_data.process_state_and_attributes(day)
        prices = await pvpc_data.async_update_prices(day)
        assert not prices
        assert not pvpc_data.process_state_and_attributes(day)
        assert len(caplog.messages) == num_log_msgs
    assert mock_session.call_count == 1
    assert len(prices) == 0
class ElecPricesDataUpdateCoordinator(DataUpdateCoordinator[Mapping[datetime,
                                                                    float]]):
    """Class to manage fetching Electricity prices data from API."""
    def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
        """Initialize."""
        self.api = PVPCData(
            session=async_get_clientsession(hass),
            tariff=entry.data[ATTR_TARIFF],
            local_timezone=hass.config.time_zone,
            power=entry.data[ATTR_POWER],
            power_valley=entry.data[ATTR_POWER_P3],
        )
        super().__init__(hass,
                         _LOGGER,
                         name=DOMAIN,
                         update_interval=timedelta(minutes=30))
        self._entry = entry

    @property
    def entry_id(self) -> str:
        """Return entry ID."""
        return self._entry.entry_id

    async def _async_update_data(self) -> Mapping[datetime, float]:
        """Update electricity prices from the ESIOS API."""
        prices = await self.api.async_update_prices(dt_util.utcnow())
        self.api.process_state_and_attributes(dt_util.utcnow())
        if not prices:
            raise UpdateFailed

        return prices