Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add openSenseMap air pollutants platform #19357

Merged
merged 3 commits into from Dec 18, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Expand Up @@ -427,6 +427,7 @@ omit =
homeassistant/components/spider.py
homeassistant/components/*/spider.py

homeassistant/components/air_pollutants/opensensemap.py
homeassistant/components/alarm_control_panel/alarmdotcom.py
homeassistant/components/alarm_control_panel/canary.py
homeassistant/components/alarm_control_panel/concord232.py
Expand Down
107 changes: 107 additions & 0 deletions homeassistant/components/air_pollutants/opensensemap.py
@@ -0,0 +1,107 @@
"""
Support for openSenseMap Air Pollutants data.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/air_pollutants_opensnesemap/
fabaff marked this conversation as resolved.
Show resolved Hide resolved
"""
from datetime import timedelta
import logging

import voluptuous as vol

from homeassistant.components.air_pollutants import (
PLATFORM_SCHEMA, AirPollutantsEntity)
from homeassistant.const import CONF_NAME
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
from homeassistant.util import Throttle

REQUIREMENTS = ['opensensemap-api==0.1.3']

_LOGGER = logging.getLogger(__name__)

ATTRIBUTION = 'Data provided by openSenseMap'

CONF_STATION_ID = 'station_id'

MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=10)

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_STATION_ID): cv.string,
vol.Optional(CONF_NAME): cv.string,
})


async def async_setup_platform(
hass, config, async_add_entities, discovery_info=None):
"""Set up the openSenseMap air pollutants platform."""
from opensensemap_api import OpenSenseMap

name = config.get(CONF_NAME)
station_id = config[CONF_STATION_ID]

session = async_get_clientsession(hass)
osm_api = OpenSenseMapData(OpenSenseMap(station_id, hass.loop, session))

await osm_api.async_update()

try:
if name is None:
name = osm_api.api.data['name']
except KeyError:
_LOGGER.error("Station is not available")
return
fabaff marked this conversation as resolved.
Show resolved Hide resolved

async_add_entities([OpenSenseMapPollutants(name, osm_api)], True)


class OpenSenseMapPollutants(AirPollutantsEntity):
"""Implementation of an openSenseMap air pollutants entity."""

def __init__(self, name, osm):
"""Initialize the air pollutants entity."""
self._name = name
self._osm = osm
self.data = None
fabaff marked this conversation as resolved.
Show resolved Hide resolved

@property
def name(self):
"""Return the name of the air pollutants entity."""
return self._name

@property
def particulate_matter_2_5(self):
"""Return the particulate matter 2.5 level."""
return self._osm.api.pm2_5

@property
def particulate_matter_10(self):
"""Return the particulate matter 10 level."""
return self._osm.api.pm10

@property
def attribution(self):
"""Return the attribution."""
return ATTRIBUTION

async def async_update(self):
"""Get the latest data from the Pi-hole API."""
await self._osm.async_update()


class OpenSenseMapData:
"""Get the latest data and update the states."""

def __init__(self, api):
"""Initialize the data object."""
self.api = api

@Throttle(MIN_TIME_BETWEEN_UPDATES)
async def async_update(self):
"""Get the latest data from the Pi-hole."""
fabaff marked this conversation as resolved.
Show resolved Hide resolved
from opensensemap_api.exceptions import OpenSenseMapError

try:
await self.api.get_data()
except OpenSenseMapError:
_LOGGER.error("Unable to fetch data")
fabaff marked this conversation as resolved.
Show resolved Hide resolved
3 changes: 3 additions & 0 deletions requirements_all.txt
Expand Up @@ -725,6 +725,9 @@ openevsewifi==0.4
# homeassistant.components.media_player.openhome
openhomedevice==0.4.2

# homeassistant.components.air_pollutants.opensensemap
opensensemap-api==0.1.3

# homeassistant.components.switch.orvibo
orvibo==1.1.1

Expand Down