Add Brottsplatskartan sensor (#19018)

* Added brottsplatskartan sensor

* Update brottsplatskartan sensor

* Remove redundant configuration checks.
* Set attributes during initialization.
* Setup brottsplatskartan module in setup_platform().
* Just do a simple return, no need for returning false.

* Remove file that was used during testing

* Better variable name and remove excessive newline.

* More updates to brottsplatskartan

* Import uuid at the top of the module.
* Use sensor as domain.
* Don't fire custom events.
* Remove period from logging message.

* Adding validation for area parameter

* Validate empty area configuration

* Fixing indentation.

* Fixing the config schema
This commit is contained in:
Christian Biamont 2018-12-16 12:21:07 +01:00 committed by Martin Hjelmare
parent 629dd24ff3
commit c26c8affc7
3 changed files with 114 additions and 0 deletions

View File

@ -698,6 +698,7 @@ omit =
homeassistant/components/sensor/bme680.py
homeassistant/components/sensor/bom.py
homeassistant/components/sensor/broadlink.py
homeassistant/components/sensor/brottsplatskartan.py
homeassistant/components/sensor/buienradar.py
homeassistant/components/sensor/cert_expiry.py
homeassistant/components/sensor/citybikes.py

View File

@ -0,0 +1,110 @@
"""Sensor for Brottsplatskartan."""
from collections import defaultdict
from datetime import timedelta
import logging
import uuid
import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import (
ATTR_ATTRIBUTION, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME)
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity
REQUIREMENTS = ['brottsplatskartan==0.0.1']
_LOGGER = logging.getLogger(__name__)
CONF_AREA = 'area'
DEFAULT_NAME = 'Brottsplatskartan'
SCAN_INTERVAL = timedelta(minutes=30)
AREAS = [
"Blekinge län", "Dalarnas län", "Gotlands län", "Gävleborgs län",
"Hallands län", "Jämtlands län", "Jönköpings län", "Kalmar län",
"Kronobergs län", "Norrbottens län", "Skåne län", "Stockholms län",
"Södermanlands län", "Uppsala län", "Värmlands län", "Västerbottens län",
"Västernorrlands län", "Västmanlands län", "Västra Götalands län",
"Örebro län", "Östergötlands län"
]
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Inclusive(CONF_LATITUDE, 'coordinates'): cv.latitude,
vol.Inclusive(CONF_LONGITUDE, 'coordinates'): cv.longitude,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_AREA, default=[]):
vol.All(cv.ensure_list, [vol.In(AREAS)])
}
)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Brottsplatskartan platform."""
import brottsplatskartan
latitude = config.get(CONF_LATITUDE, hass.config.latitude)
longitude = config.get(CONF_LONGITUDE, hass.config.longitude)
name = config.get(CONF_NAME)
area = config.get(CONF_AREA)
# Every Home Assistant instance should have their own unique
# app parameter: https://brottsplatskartan.se/sida/api
app = 'ha-' + str(uuid.getnode())
bpk = brottsplatskartan.BrottsplatsKartan(
app=app, area=area,
latitude=latitude, longitude=longitude
)
add_entities(
[BrottsplatskartanSensor(bpk, name)], True
)
class BrottsplatskartanSensor(Entity):
"""Representation of a Brottsplatskartan Sensor."""
def __init__(self, bpk, name):
"""Initialize the Brottsplatskartan sensor."""
import brottsplatskartan
self._attributes = {ATTR_ATTRIBUTION: brottsplatskartan.ATTRIBUTION}
self._brottsplatskartan = bpk
self._name = name
self._previous_incidents = set()
self._state = None
@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
@property
def device_state_attributes(self):
"""Return the state attributes."""
return self._attributes
def update(self):
"""Update device state."""
incident_counts = defaultdict(int)
incidents = self._brottsplatskartan.get_incidents()
if incidents is False:
_LOGGER.debug("Problems fetching incidents")
return
if len(incidents) < len(self._previous_incidents):
self._previous_incidents = set()
for incident in incidents:
incident_type = incident.get('title_type')
incident_counts[incident_type] += 1
self._previous_incidents.add(incident.get('id'))
self._attributes.update(incident_counts)
self._state = len(incidents)

View File

@ -224,6 +224,9 @@ braviarc-homeassistant==0.3.7.dev0
# homeassistant.components.switch.broadlink
broadlink==0.9.0
# homeassistant.components.sensor.brottsplatskartan
brottsplatskartan==0.0.1
# homeassistant.components.cover.brunt
brunt==0.1.3