diff --git a/.coveragerc b/.coveragerc index 3d369eed0739312355be1f80fe24a0679d23508b..bce7205dcd798c5c4c70a1b59f7107bdfe57a123 100644 --- a/.coveragerc +++ b/.coveragerc @@ -440,6 +440,7 @@ omit = homeassistant/components/device_tracker/netgear.py homeassistant/components/device_tracker/nmap_tracker.py homeassistant/components/device_tracker/ping.py + homeassistant/components/device_tracker/ritassist.py homeassistant/components/device_tracker/sky_hub.py homeassistant/components/device_tracker/snmp.py homeassistant/components/device_tracker/swisscom.py diff --git a/homeassistant/components/device_tracker/ritassist.py b/homeassistant/components/device_tracker/ritassist.py new file mode 100644 index 0000000000000000000000000000000000000000..9fc50de506232936bc082fc018bee34983b8fe62 --- /dev/null +++ b/homeassistant/components/device_tracker/ritassist.py @@ -0,0 +1,87 @@ +""" +Support for RitAssist Platform. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/device_tracker.ritassist/ +""" +import logging + +import requests +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.device_tracker import PLATFORM_SCHEMA +from homeassistant.const import CONF_USERNAME, CONF_PASSWORD +from homeassistant.helpers.event import track_utc_time_change + +REQUIREMENTS = ['ritassist==0.5'] + +_LOGGER = logging.getLogger(__name__) + +CONF_CLIENT_ID = 'client_id' +CONF_CLIENT_SECRET = 'client_secret' +CONF_INCLUDE = 'include' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Required(CONF_CLIENT_ID): cv.string, + vol.Required(CONF_CLIENT_SECRET): cv.string, + vol.Optional(CONF_INCLUDE, default=[]): + vol.All(cv.ensure_list, [cv.string]) +}) + + +def setup_scanner(hass, config: dict, see, discovery_info=None): + """Set up the DeviceScanner and check if login is valid.""" + scanner = RitAssistDeviceScanner(config, see) + if not scanner.login(hass): + _LOGGER.error('RitAssist authentication failed') + return False + return True + + +class RitAssistDeviceScanner: + """Define a scanner for the RitAssist platform.""" + + def __init__(self, config, see): + """Initialize RitAssistDeviceScanner.""" + from ritassist import API + + self._include = config.get(CONF_INCLUDE) + self._see = see + + self._api = API(config.get(CONF_CLIENT_ID), + config.get(CONF_CLIENT_SECRET), + config.get(CONF_USERNAME), + config.get(CONF_PASSWORD)) + + def setup(self, hass): + """Setup a timer and start gathering devices.""" + self._refresh() + track_utc_time_change(hass, + lambda now: self._refresh(), + second=range(0, 60, 30)) + + def login(self, hass): + """Perform a login on the RitAssist API.""" + if self._api.login(): + self.setup(hass) + return True + return False + + def _refresh(self) -> None: + """Refresh device information from the platform.""" + try: + devices = self._api.get_devices() + + for device in devices: + if (not self._include or + device.license_plate in self._include): + self._see(dev_id=device.plate_as_id, + gps=(device.latitude, device.longitude), + attributes=device.state_attributes, + icon='mdi:car') + + except requests.exceptions.ConnectionError: + _LOGGER.error('ConnectionError: Could not connect to RitAssist') diff --git a/requirements_all.txt b/requirements_all.txt index 6388842e84d94c1a82a3c461b027f38d1e8125ec..b0f2172834e8f7d5bc2a09ddd4a6d38480e1d4b2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1206,6 +1206,9 @@ rflink==0.0.37 # homeassistant.components.ring ring_doorbell==0.2.1 +# homeassistant.components.device_tracker.ritassist +ritassist==0.5 + # homeassistant.components.notify.rocketchat rocketchat-API==0.6.1