Add OpenERZ API integration (#30441)

* Adding OpenERZ integration

* Added unit tests

* Linter fixes, better friendly_name handling

* Increase coverage

* Review fixes

* fixup! Review fixes

* Refactor to use external openerz-api library

* fixup! Refactor to use external openerz-api library

* fixup! Refactor to use external openerz-api library

* fixup! Refactor to use external openerz-api library

* fixup! Refactor to use external openerz-api library
This commit is contained in:
Michal Ziemski
2020-04-05 05:04:41 +02:00
committed by GitHub
parent 927c2314c4
commit 8d3a415d07
8 changed files with 115 additions and 0 deletions

View File

@ -269,6 +269,7 @@ homeassistant/components/ohmconnect/* @robbiet480
homeassistant/components/ombi/* @larssont
homeassistant/components/onboarding/* @home-assistant/core
homeassistant/components/onewire/* @garbled1
homeassistant/components/openerz/* @misialq
homeassistant/components/opentherm_gw/* @mvn23
homeassistant/components/openuv/* @bachya
homeassistant/components/openweathermap/* @fabaff

View File

@ -0,0 +1,3 @@
"""The Open ERZ API integration."""
DOMAIN = "sensor"

View File

@ -0,0 +1,12 @@
{
"domain": "openerz",
"name": "Open ERZ",
"documentation": "https://www.home-assistant.io/integrations/openerz",
"dependencies": [],
"codeowners": [
"@misialq"
],
"requirements": [
"openerz-api==0.1.0"
]
}

View File

@ -0,0 +1,58 @@
"""Support for OpenERZ API for Zurich city waste disposal system."""
from datetime import timedelta
import logging
from openerz_api.main import OpenERZConnector
import voluptuous as vol
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.config_validation import PLATFORM_SCHEMA
from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__)
SCAN_INTERVAL = timedelta(hours=12)
CONF_ZIP = "zip"
CONF_WASTE_TYPE = "waste_type"
CONF_NAME = "name"
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_ZIP): cv.positive_int,
vol.Required(CONF_WASTE_TYPE, default="waste"): cv.string,
vol.Optional(CONF_NAME): cv.string,
}
)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the sensor platform."""
api_connector = OpenERZConnector(config[CONF_ZIP], config[CONF_WASTE_TYPE])
add_entities([OpenERZSensor(api_connector, config.get(CONF_NAME))], True)
class OpenERZSensor(Entity):
"""Representation of a Sensor."""
def __init__(self, api_connector, name):
"""Initialize the sensor."""
self._state = None
self._name = name
self.api_connector = api_connector
@property
def name(self):
"""Return the name of the sensor."""
return self._name
@property
def state(self):
"""Return the state of the sensor."""
return self._state
def update(self):
"""Fetch new state data for the sensor.
This is the only method that should fetch new data for Home Assistant.
"""
self._state = self.api_connector.find_next_pickup(day_offset=31)

View File

@ -965,6 +965,9 @@ onvif-zeep-async==0.2.0
# homeassistant.components.opencv
# opencv-python-headless==4.2.0.32
# homeassistant.components.openerz
openerz-api==0.1.0
# homeassistant.components.openevse
openevsewifi==0.4

View File

@ -373,6 +373,9 @@ numpy==1.18.1
# homeassistant.components.google
oauth2client==4.0.0
# homeassistant.components.openerz
openerz-api==0.1.0
# homeassistant.components.mqtt
# homeassistant.components.shiftr
paho-mqtt==1.5.0

View File

@ -0,0 +1 @@
"""Tests for OpenERZ component."""

View File

@ -0,0 +1,34 @@
"""Tests for OpenERZ component."""
from unittest.mock import MagicMock, patch
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.setup import async_setup_component
MOCK_CONFIG = {
"sensor": {
"platform": "openerz",
"name": "test_name",
"zip": 1234,
"waste_type": "glass",
}
}
async def test_sensor_state(hass):
"""Test whether default waste type set properly."""
with patch(
"homeassistant.components.openerz.sensor.OpenERZConnector"
) as patched_connector:
pickup_instance = MagicMock()
pickup_instance.find_next_pickup.return_value = "2020-12-12"
patched_connector.return_value = pickup_instance
await async_setup_component(hass, SENSOR_DOMAIN, MOCK_CONFIG)
await hass.async_block_till_done()
entity_id = "sensor.test_name"
test_openerz_state = hass.states.get(entity_id)
assert test_openerz_state.state == "2020-12-12"
assert test_openerz_state.name == "test_name"
pickup_instance.find_next_pickup.assert_called_once()