mirror of
https://github.com/home-assistant/core.git
synced 2025-06-25 01:21:51 +02:00
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:
@ -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
|
||||
|
3
homeassistant/components/openerz/__init__.py
Normal file
3
homeassistant/components/openerz/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
"""The Open ERZ API integration."""
|
||||
|
||||
DOMAIN = "sensor"
|
12
homeassistant/components/openerz/manifest.json
Normal file
12
homeassistant/components/openerz/manifest.json
Normal 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"
|
||||
]
|
||||
}
|
58
homeassistant/components/openerz/sensor.py
Normal file
58
homeassistant/components/openerz/sensor.py
Normal 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)
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
1
tests/components/openerz/__init__.py
Normal file
1
tests/components/openerz/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
"""Tests for OpenERZ component."""
|
34
tests/components/openerz/test_sensor.py
Normal file
34
tests/components/openerz/test_sensor.py
Normal 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()
|
Reference in New Issue
Block a user