From c26c8affc73ec68fdf3feecccc15be57befc24c0 Mon Sep 17 00:00:00 2001 From: Christian Biamont Date: Sun, 16 Dec 2018 12:21:07 +0100 Subject: [PATCH] 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 --- .coveragerc | 1 + .../components/sensor/brottsplatskartan.py | 110 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 114 insertions(+) create mode 100644 homeassistant/components/sensor/brottsplatskartan.py diff --git a/.coveragerc b/.coveragerc index 1987dd0b63f..55b1ec18792 100644 --- a/.coveragerc +++ b/.coveragerc @@ -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 diff --git a/homeassistant/components/sensor/brottsplatskartan.py b/homeassistant/components/sensor/brottsplatskartan.py new file mode 100644 index 00000000000..7d755f773be --- /dev/null +++ b/homeassistant/components/sensor/brottsplatskartan.py @@ -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) diff --git a/requirements_all.txt b/requirements_all.txt index d0c05a0372f..44cbb1d591d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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