mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add rainforest diagnostics (#64647)
This commit is contained in:
parent
e982df5199
commit
3899600771
23
homeassistant/components/rainforest_eagle/diagnostics.py
Normal file
23
homeassistant/components/rainforest_eagle/diagnostics.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
"""Diagnostics support for Eagle."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from homeassistant.components.diagnostics import async_redact_data
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from .const import CONF_CLOUD_ID, CONF_INSTALL_CODE, DOMAIN
|
||||||
|
from .data import EagleDataCoordinator
|
||||||
|
|
||||||
|
TO_REDACT = {CONF_CLOUD_ID, CONF_INSTALL_CODE}
|
||||||
|
|
||||||
|
|
||||||
|
async def async_get_config_entry_diagnostics(
|
||||||
|
hass: HomeAssistant, config_entry: ConfigEntry
|
||||||
|
) -> dict:
|
||||||
|
"""Return diagnostics for a config entry."""
|
||||||
|
coordinator: EagleDataCoordinator = hass.data[DOMAIN][config_entry.entry_id]
|
||||||
|
|
||||||
|
return {
|
||||||
|
"config_entry": async_redact_data(config_entry.as_dict(), TO_REDACT),
|
||||||
|
"data": coordinator.data,
|
||||||
|
}
|
@ -1 +1,36 @@
|
|||||||
"""Tests for the Rainforest Eagle integration."""
|
"""Tests for the Rainforest Eagle integration."""
|
||||||
|
|
||||||
|
|
||||||
|
MOCK_CLOUD_ID = "12345"
|
||||||
|
MOCK_200_RESPONSE_WITH_PRICE = {
|
||||||
|
"zigbee:InstantaneousDemand": {
|
||||||
|
"Name": "zigbee:InstantaneousDemand",
|
||||||
|
"Value": "1.152000",
|
||||||
|
},
|
||||||
|
"zigbee:CurrentSummationDelivered": {
|
||||||
|
"Name": "zigbee:CurrentSummationDelivered",
|
||||||
|
"Value": "45251.285000",
|
||||||
|
},
|
||||||
|
"zigbee:CurrentSummationReceived": {
|
||||||
|
"Name": "zigbee:CurrentSummationReceived",
|
||||||
|
"Value": "232.232000",
|
||||||
|
},
|
||||||
|
"zigbee:Price": {"Name": "zigbee:Price", "Value": "0.053990"},
|
||||||
|
"zigbee:PriceCurrency": {"Name": "zigbee:PriceCurrency", "Value": "USD"},
|
||||||
|
}
|
||||||
|
MOCK_200_RESPONSE_WITHOUT_PRICE = {
|
||||||
|
"zigbee:InstantaneousDemand": {
|
||||||
|
"Name": "zigbee:InstantaneousDemand",
|
||||||
|
"Value": "1.152000",
|
||||||
|
},
|
||||||
|
"zigbee:CurrentSummationDelivered": {
|
||||||
|
"Name": "zigbee:CurrentSummationDelivered",
|
||||||
|
"Value": "45251.285000",
|
||||||
|
},
|
||||||
|
"zigbee:CurrentSummationReceived": {
|
||||||
|
"Name": "zigbee:CurrentSummationReceived",
|
||||||
|
"Value": "232.232000",
|
||||||
|
},
|
||||||
|
"zigbee:Price": {"Name": "zigbee:Price", "Value": "invalid"},
|
||||||
|
"zigbee:PriceCurrency": {"Name": "zigbee:PriceCurrency", "Value": "USD"},
|
||||||
|
}
|
||||||
|
85
tests/components/rainforest_eagle/conftest.py
Normal file
85
tests/components/rainforest_eagle/conftest.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
"""Conftest for rainforest_eagle."""
|
||||||
|
from unittest.mock import AsyncMock, Mock, patch
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components.rainforest_eagle.const import (
|
||||||
|
CONF_CLOUD_ID,
|
||||||
|
CONF_HARDWARE_ADDRESS,
|
||||||
|
CONF_INSTALL_CODE,
|
||||||
|
DOMAIN,
|
||||||
|
TYPE_EAGLE_100,
|
||||||
|
TYPE_EAGLE_200,
|
||||||
|
)
|
||||||
|
from homeassistant.const import CONF_HOST, CONF_TYPE
|
||||||
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
|
from . import MOCK_200_RESPONSE_WITHOUT_PRICE, MOCK_CLOUD_ID
|
||||||
|
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def config_entry_200(hass):
|
||||||
|
"""Return a config entry."""
|
||||||
|
entry = MockConfigEntry(
|
||||||
|
domain="rainforest_eagle",
|
||||||
|
data={
|
||||||
|
CONF_CLOUD_ID: MOCK_CLOUD_ID,
|
||||||
|
CONF_HOST: "192.168.1.55",
|
||||||
|
CONF_INSTALL_CODE: "abcdefgh",
|
||||||
|
CONF_HARDWARE_ADDRESS: "mock-hw-address",
|
||||||
|
CONF_TYPE: TYPE_EAGLE_200,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
return entry
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def setup_rainforest_200(hass, config_entry_200):
|
||||||
|
"""Set up rainforest."""
|
||||||
|
with patch(
|
||||||
|
"aioeagle.ElectricMeter.create_instance",
|
||||||
|
return_value=Mock(
|
||||||
|
get_device_query=AsyncMock(return_value=MOCK_200_RESPONSE_WITHOUT_PRICE)
|
||||||
|
),
|
||||||
|
) as mock_update:
|
||||||
|
mock_update.return_value.is_connected = True
|
||||||
|
assert await async_setup_component(hass, DOMAIN, {})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
yield mock_update.return_value
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def setup_rainforest_100(hass):
|
||||||
|
"""Set up rainforest."""
|
||||||
|
MockConfigEntry(
|
||||||
|
domain="rainforest_eagle",
|
||||||
|
data={
|
||||||
|
CONF_CLOUD_ID: MOCK_CLOUD_ID,
|
||||||
|
CONF_HOST: "192.168.1.55",
|
||||||
|
CONF_INSTALL_CODE: "abcdefgh",
|
||||||
|
CONF_HARDWARE_ADDRESS: None,
|
||||||
|
CONF_TYPE: TYPE_EAGLE_100,
|
||||||
|
},
|
||||||
|
).add_to_hass(hass)
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.rainforest_eagle.data.Eagle100Reader",
|
||||||
|
return_value=Mock(
|
||||||
|
get_instantaneous_demand=Mock(
|
||||||
|
return_value={"InstantaneousDemand": {"Demand": "1.152000"}}
|
||||||
|
),
|
||||||
|
get_current_summation=Mock(
|
||||||
|
return_value={
|
||||||
|
"CurrentSummation": {
|
||||||
|
"SummationDelivered": "45251.285000",
|
||||||
|
"SummationReceived": "232.232000",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) as mock_update:
|
||||||
|
assert await async_setup_component(hass, DOMAIN, {})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
yield mock_update
|
29
tests/components/rainforest_eagle/test_diagnostics.py
Normal file
29
tests/components/rainforest_eagle/test_diagnostics.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
"""Test the Rainforest Eagle diagnostics."""
|
||||||
|
from homeassistant.components.diagnostics import REDACTED
|
||||||
|
from homeassistant.components.rainforest_eagle.const import (
|
||||||
|
CONF_CLOUD_ID,
|
||||||
|
CONF_INSTALL_CODE,
|
||||||
|
)
|
||||||
|
|
||||||
|
from . import MOCK_200_RESPONSE_WITHOUT_PRICE
|
||||||
|
|
||||||
|
from tests.components.diagnostics import get_diagnostics_for_config_entry
|
||||||
|
|
||||||
|
|
||||||
|
async def test_entry_diagnostics(
|
||||||
|
hass, hass_client, setup_rainforest_200, config_entry_200
|
||||||
|
):
|
||||||
|
"""Test config entry diagnostics."""
|
||||||
|
result = await get_diagnostics_for_config_entry(hass, hass_client, config_entry_200)
|
||||||
|
|
||||||
|
config_entry_dict = config_entry_200.as_dict()
|
||||||
|
config_entry_dict["data"][CONF_INSTALL_CODE] = REDACTED
|
||||||
|
config_entry_dict["data"][CONF_CLOUD_ID] = REDACTED
|
||||||
|
|
||||||
|
assert result == {
|
||||||
|
"config_entry": config_entry_dict,
|
||||||
|
"data": {
|
||||||
|
var["Name"]: var["Value"]
|
||||||
|
for var in MOCK_200_RESPONSE_WITHOUT_PRICE.values()
|
||||||
|
},
|
||||||
|
}
|
@ -1,113 +1,7 @@
|
|||||||
"""Tests for rainforest eagle sensors."""
|
"""Tests for rainforest eagle sensors."""
|
||||||
from unittest.mock import AsyncMock, Mock, patch
|
from homeassistant.components.rainforest_eagle.const import DOMAIN
|
||||||
|
|
||||||
import pytest
|
from . import MOCK_200_RESPONSE_WITH_PRICE
|
||||||
|
|
||||||
from homeassistant.components.rainforest_eagle.const import (
|
|
||||||
CONF_CLOUD_ID,
|
|
||||||
CONF_HARDWARE_ADDRESS,
|
|
||||||
CONF_INSTALL_CODE,
|
|
||||||
DOMAIN,
|
|
||||||
TYPE_EAGLE_100,
|
|
||||||
TYPE_EAGLE_200,
|
|
||||||
)
|
|
||||||
from homeassistant.const import CONF_HOST, CONF_TYPE
|
|
||||||
from homeassistant.setup import async_setup_component
|
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
|
||||||
|
|
||||||
MOCK_CLOUD_ID = "12345"
|
|
||||||
MOCK_200_RESPONSE_WITH_PRICE = {
|
|
||||||
"zigbee:InstantaneousDemand": {
|
|
||||||
"Name": "zigbee:InstantaneousDemand",
|
|
||||||
"Value": "1.152000",
|
|
||||||
},
|
|
||||||
"zigbee:CurrentSummationDelivered": {
|
|
||||||
"Name": "zigbee:CurrentSummationDelivered",
|
|
||||||
"Value": "45251.285000",
|
|
||||||
},
|
|
||||||
"zigbee:CurrentSummationReceived": {
|
|
||||||
"Name": "zigbee:CurrentSummationReceived",
|
|
||||||
"Value": "232.232000",
|
|
||||||
},
|
|
||||||
"zigbee:Price": {"Name": "zigbee:Price", "Value": "0.053990"},
|
|
||||||
"zigbee:PriceCurrency": {"Name": "zigbee:PriceCurrency", "Value": "USD"},
|
|
||||||
}
|
|
||||||
MOCK_200_RESPONSE_WITHOUT_PRICE = {
|
|
||||||
"zigbee:InstantaneousDemand": {
|
|
||||||
"Name": "zigbee:InstantaneousDemand",
|
|
||||||
"Value": "1.152000",
|
|
||||||
},
|
|
||||||
"zigbee:CurrentSummationDelivered": {
|
|
||||||
"Name": "zigbee:CurrentSummationDelivered",
|
|
||||||
"Value": "45251.285000",
|
|
||||||
},
|
|
||||||
"zigbee:CurrentSummationReceived": {
|
|
||||||
"Name": "zigbee:CurrentSummationReceived",
|
|
||||||
"Value": "232.232000",
|
|
||||||
},
|
|
||||||
"zigbee:Price": {"Name": "zigbee:Price", "Value": "invalid"},
|
|
||||||
"zigbee:PriceCurrency": {"Name": "zigbee:PriceCurrency", "Value": "USD"},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
async def setup_rainforest_200(hass):
|
|
||||||
"""Set up rainforest."""
|
|
||||||
MockConfigEntry(
|
|
||||||
domain="rainforest_eagle",
|
|
||||||
data={
|
|
||||||
CONF_CLOUD_ID: MOCK_CLOUD_ID,
|
|
||||||
CONF_HOST: "192.168.1.55",
|
|
||||||
CONF_INSTALL_CODE: "abcdefgh",
|
|
||||||
CONF_HARDWARE_ADDRESS: "mock-hw-address",
|
|
||||||
CONF_TYPE: TYPE_EAGLE_200,
|
|
||||||
},
|
|
||||||
).add_to_hass(hass)
|
|
||||||
with patch(
|
|
||||||
"aioeagle.ElectricMeter.create_instance",
|
|
||||||
return_value=Mock(
|
|
||||||
get_device_query=AsyncMock(return_value=MOCK_200_RESPONSE_WITHOUT_PRICE)
|
|
||||||
),
|
|
||||||
) as mock_update:
|
|
||||||
mock_update.return_value.is_connected = True
|
|
||||||
assert await async_setup_component(hass, DOMAIN, {})
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
yield mock_update.return_value
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
async def setup_rainforest_100(hass):
|
|
||||||
"""Set up rainforest."""
|
|
||||||
MockConfigEntry(
|
|
||||||
domain="rainforest_eagle",
|
|
||||||
data={
|
|
||||||
CONF_CLOUD_ID: MOCK_CLOUD_ID,
|
|
||||||
CONF_HOST: "192.168.1.55",
|
|
||||||
CONF_INSTALL_CODE: "abcdefgh",
|
|
||||||
CONF_HARDWARE_ADDRESS: None,
|
|
||||||
CONF_TYPE: TYPE_EAGLE_100,
|
|
||||||
},
|
|
||||||
).add_to_hass(hass)
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.rainforest_eagle.data.Eagle100Reader",
|
|
||||||
return_value=Mock(
|
|
||||||
get_instantaneous_demand=Mock(
|
|
||||||
return_value={"InstantaneousDemand": {"Demand": "1.152000"}}
|
|
||||||
),
|
|
||||||
get_current_summation=Mock(
|
|
||||||
return_value={
|
|
||||||
"CurrentSummation": {
|
|
||||||
"SummationDelivered": "45251.285000",
|
|
||||||
"SummationReceived": "232.232000",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
),
|
|
||||||
) as mock_update:
|
|
||||||
assert await async_setup_component(hass, DOMAIN, {})
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
yield mock_update
|
|
||||||
|
|
||||||
|
|
||||||
async def test_sensors_200(hass, setup_rainforest_200):
|
async def test_sensors_200(hass, setup_rainforest_200):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user