diff --git a/CODEOWNERS b/CODEOWNERS index 5cbf0d411a0..0ece14799a3 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -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 diff --git a/homeassistant/components/openerz/__init__.py b/homeassistant/components/openerz/__init__.py new file mode 100644 index 00000000000..57ed4d1d8a7 --- /dev/null +++ b/homeassistant/components/openerz/__init__.py @@ -0,0 +1,3 @@ +"""The Open ERZ API integration.""" + +DOMAIN = "sensor" diff --git a/homeassistant/components/openerz/manifest.json b/homeassistant/components/openerz/manifest.json new file mode 100644 index 00000000000..19bb17ea390 --- /dev/null +++ b/homeassistant/components/openerz/manifest.json @@ -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" + ] +} \ No newline at end of file diff --git a/homeassistant/components/openerz/sensor.py b/homeassistant/components/openerz/sensor.py new file mode 100644 index 00000000000..6e72058b60b --- /dev/null +++ b/homeassistant/components/openerz/sensor.py @@ -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) diff --git a/requirements_all.txt b/requirements_all.txt index 8bdf4378205..48322760753 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 121dd891acb..5db1635e39a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -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 diff --git a/tests/components/openerz/__init__.py b/tests/components/openerz/__init__.py new file mode 100644 index 00000000000..9de62e5f727 --- /dev/null +++ b/tests/components/openerz/__init__.py @@ -0,0 +1 @@ +"""Tests for OpenERZ component.""" diff --git a/tests/components/openerz/test_sensor.py b/tests/components/openerz/test_sensor.py new file mode 100644 index 00000000000..24a0f0610af --- /dev/null +++ b/tests/components/openerz/test_sensor.py @@ -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()