diff --git a/.coveragerc b/.coveragerc index 548e471240430b7ccbb8f790148cb896f22b64b3..e8f349013fc3bf78979cbd6244006ff871de1098 100644 --- a/.coveragerc +++ b/.coveragerc @@ -432,7 +432,6 @@ omit = homeassistant/components/mochad/* homeassistant/components/modbus/* homeassistant/components/modem_callerid/sensor.py - homeassistant/components/mopar/* homeassistant/components/mpchc/media_player.py homeassistant/components/mpd/media_player.py homeassistant/components/mqtt_room/sensor.py diff --git a/homeassistant/components/mopar/__init__.py b/homeassistant/components/mopar/__init__.py deleted file mode 100644 index 4801a7c43d696f7d28a68df077d1915793639cc2..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/__init__.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Support for Mopar vehicles.""" -from datetime import timedelta -import logging - -import motorparts -import voluptuous as vol - -from homeassistant.components.lock import DOMAIN as LOCK -from homeassistant.components.sensor import DOMAIN as SENSOR -from homeassistant.components.switch import DOMAIN as SWITCH -from homeassistant.const import ( - CONF_PASSWORD, - CONF_PIN, - CONF_SCAN_INTERVAL, - CONF_USERNAME, -) -from homeassistant.helpers import config_validation as cv -from homeassistant.helpers.discovery import load_platform -from homeassistant.helpers.dispatcher import dispatcher_send -from homeassistant.helpers.event import track_time_interval - -DOMAIN = "mopar" -DATA_UPDATED = f"{DOMAIN}_data_updated" - -_LOGGER = logging.getLogger(__name__) - -COOKIE_FILE = "mopar_cookies.pickle" -SUCCESS_RESPONSE = "completed" - -SUPPORTED_PLATFORMS = [LOCK, SENSOR, SWITCH] - -DEFAULT_INTERVAL = timedelta(days=7) - -CONFIG_SCHEMA = vol.Schema( - { - DOMAIN: vol.Schema( - { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_PIN): cv.positive_int, - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), - } - ) - }, - extra=vol.ALLOW_EXTRA, -) - -SERVICE_HORN = "sound_horn" -ATTR_VEHICLE_INDEX = "vehicle_index" -SERVICE_HORN_SCHEMA = vol.Schema({vol.Required(ATTR_VEHICLE_INDEX): cv.positive_int}) - - -def setup(hass, config): - """Set up the Mopar component.""" - conf = config[DOMAIN] - cookie = hass.config.path(COOKIE_FILE) - try: - session = motorparts.get_session( - conf[CONF_USERNAME], conf[CONF_PASSWORD], conf[CONF_PIN], cookie_path=cookie - ) - except motorparts.MoparError: - _LOGGER.error("Failed to login") - return False - - data = hass.data[DOMAIN] = MoparData(hass, session) - data.update(now=None) - - track_time_interval(hass, data.update, conf[CONF_SCAN_INTERVAL]) - - def handle_horn(call): - """Enable the horn on the Mopar vehicle.""" - data.actuate("horn", call.data[ATTR_VEHICLE_INDEX]) - - hass.services.register( - DOMAIN, SERVICE_HORN, handle_horn, schema=SERVICE_HORN_SCHEMA - ) - - for platform in SUPPORTED_PLATFORMS: - load_platform(hass, platform, DOMAIN, {}, config) - - return True - - -class MoparData: - """ - Container for Mopar vehicle data. - - Prevents session expiry re-login race condition. - """ - - def __init__(self, hass, session): - """Initialize data.""" - self._hass = hass - self._session = session - self.vehicles = [] - self.vhrs = {} - self.tow_guides = {} - - def update(self, now, **kwargs): - """Update data.""" - _LOGGER.debug("Updating vehicle data") - try: - self.vehicles = motorparts.get_summary(self._session)["vehicles"] - except motorparts.MoparError: - _LOGGER.exception("Failed to get summary") - return - - for index, _ in enumerate(self.vehicles): - try: - self.vhrs[index] = motorparts.get_report(self._session, index) - self.tow_guides[index] = motorparts.get_tow_guide(self._session, index) - except motorparts.MoparError: - _LOGGER.warning("Failed to update for vehicle index %s", index) - return - - dispatcher_send(self._hass, DATA_UPDATED) - - @property - def attribution(self): - """Get the attribution string from Mopar.""" - return motorparts.ATTRIBUTION - - def get_vehicle_name(self, index): - """Get the name corresponding with this vehicle.""" - vehicle = self.vehicles[index] - if not vehicle: - return None - return f"{vehicle['year']} {vehicle['make']} {vehicle['model']}" - - def actuate(self, command, index): - """Run a command on the specified Mopar vehicle.""" - try: - response = getattr(motorparts, command)(self._session, index) - except motorparts.MoparError as error: - _LOGGER.error(error) - return False - - return response == SUCCESS_RESPONSE diff --git a/homeassistant/components/mopar/lock.py b/homeassistant/components/mopar/lock.py deleted file mode 100644 index 3933e567723b316c34a0b13c1886ae96aca2a665..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/lock.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Support for the Mopar vehicle lock.""" -import logging - -from homeassistant.components.lock import LockDevice -from homeassistant.components.mopar import DOMAIN as MOPAR_DOMAIN -from homeassistant.const import STATE_LOCKED, STATE_UNLOCKED - -_LOGGER = logging.getLogger(__name__) - - -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Mopar lock platform.""" - data = hass.data[MOPAR_DOMAIN] - add_entities( - [MoparLock(data, index) for index, _ in enumerate(data.vehicles)], True - ) - - -class MoparLock(LockDevice): - """Representation of a Mopar vehicle lock.""" - - def __init__(self, data, index): - """Initialize the Mopar lock.""" - self._index = index - self._name = f"{data.get_vehicle_name(self._index)} Lock" - self._actuate = data.actuate - self._state = None - - @property - def name(self): - """Return the name of the lock.""" - return self._name - - @property - def is_locked(self): - """Return true if vehicle is locked.""" - return self._state == STATE_LOCKED - - @property - def should_poll(self): - """Return the polling requirement for this lock.""" - return False - - def lock(self, **kwargs): - """Lock the vehicle.""" - if self._actuate("lock", self._index): - self._state = STATE_LOCKED - - def unlock(self, **kwargs): - """Unlock the vehicle.""" - if self._actuate("unlock", self._index): - self._state = STATE_UNLOCKED diff --git a/homeassistant/components/mopar/manifest.json b/homeassistant/components/mopar/manifest.json deleted file mode 100644 index e8fae4fb0699a2e3b46e532e1c46c1a8a6a10497..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/manifest.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "domain": "mopar", - "name": "Mopar", - "documentation": "https://www.home-assistant.io/integrations/mopar", - "requirements": ["motorparts==1.1.0"], - "dependencies": [], - "codeowners": [] -} diff --git a/homeassistant/components/mopar/sensor.py b/homeassistant/components/mopar/sensor.py deleted file mode 100644 index 2243fcdaa22812725ba858052d79cf94d2bf89d5..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/sensor.py +++ /dev/null @@ -1,90 +0,0 @@ -"""Support for the Mopar vehicle sensor platform.""" -from homeassistant.components.mopar import ( - ATTR_VEHICLE_INDEX, - DATA_UPDATED, - DOMAIN as MOPAR_DOMAIN, -) -from homeassistant.const import ATTR_ATTRIBUTION, LENGTH_KILOMETERS -from homeassistant.core import callback -from homeassistant.helpers.dispatcher import async_dispatcher_connect -from homeassistant.helpers.entity import Entity - -ICON = "mdi:car" - - -async def async_setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Mopar platform.""" - data = hass.data[MOPAR_DOMAIN] - add_entities( - [MoparSensor(data, index) for index, _ in enumerate(data.vehicles)], True - ) - - -class MoparSensor(Entity): - """Mopar vehicle sensor.""" - - def __init__(self, data, index): - """Initialize the sensor.""" - self._index = index - self._vehicle = {} - self._vhr = {} - self._tow_guide = {} - self._odometer = None - self._data = data - self._name = self._data.get_vehicle_name(self._index) - - @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._odometer - - @property - def device_state_attributes(self): - """Return the state attributes.""" - attributes = { - ATTR_VEHICLE_INDEX: self._index, - ATTR_ATTRIBUTION: self._data.attribution, - } - attributes.update(self._vehicle) - attributes.update(self._vhr) - attributes.update(self._tow_guide) - return attributes - - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return self.hass.config.units.length_unit - - @property - def icon(self): - """Return the icon.""" - return ICON - - @property - def should_poll(self): - """Return the polling requirement for this sensor.""" - return False - - async def async_added_to_hass(self): - """Handle entity which will be added.""" - async_dispatcher_connect( - self.hass, DATA_UPDATED, self._schedule_immediate_update - ) - - def update(self): - """Update device state.""" - self._vehicle = self._data.vehicles[self._index] - self._vhr = self._data.vhrs.get(self._index, {}) - self._tow_guide = self._data.tow_guides.get(self._index, {}) - if "odometer" in self._vhr: - odo = float(self._vhr["odometer"]) - self._odometer = int(self.hass.config.units.length(odo, LENGTH_KILOMETERS)) - - @callback - def _schedule_immediate_update(self): - self.async_schedule_update_ha_state(True) diff --git a/homeassistant/components/mopar/services.yaml b/homeassistant/components/mopar/services.yaml deleted file mode 100644 index 7915aefcb0fb6b1ff5fba4ca6027ba7347ae37be..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/services.yaml +++ /dev/null @@ -1,6 +0,0 @@ -sound_horn: - description: Trigger the vehicle's horn - fields: - vehicle_index: - description: The index of the vehicle to trigger. This is exposed in the sensor's device attributes. - example: 1 \ No newline at end of file diff --git a/homeassistant/components/mopar/switch.py b/homeassistant/components/mopar/switch.py deleted file mode 100644 index c7a8c762fbc5fb695dc6b2ddaa3d7d86d01f5a15..0000000000000000000000000000000000000000 --- a/homeassistant/components/mopar/switch.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Support for the Mopar vehicle switch.""" -import logging - -from homeassistant.components.mopar import DOMAIN as MOPAR_DOMAIN -from homeassistant.components.switch import SwitchDevice -from homeassistant.const import STATE_OFF, STATE_ON - -_LOGGER = logging.getLogger(__name__) - - -def setup_platform(hass, config, add_entities, discovery_info=None): - """Set up the Mopar Switch platform.""" - data = hass.data[MOPAR_DOMAIN] - add_entities( - [MoparSwitch(data, index) for index, _ in enumerate(data.vehicles)], True - ) - - -class MoparSwitch(SwitchDevice): - """Representation of a Mopar switch.""" - - def __init__(self, data, index): - """Initialize the Switch.""" - self._index = index - self._name = f"{data.get_vehicle_name(self._index)} Switch" - self._actuate = data.actuate - self._state = None - - @property - def name(self): - """Return the name of the switch.""" - return self._name - - @property - def is_on(self): - """Return True if the entity is on.""" - return self._state == STATE_ON - - @property - def should_poll(self): - """Return the polling requirement for this switch.""" - return False - - def turn_on(self, **kwargs): - """Turn on the Mopar Vehicle.""" - if self._actuate("engine_on", self._index): - self._state = STATE_ON - - def turn_off(self, **kwargs): - """Turn off the Mopar Vehicle.""" - if self._actuate("engine_off", self._index): - self._state = STATE_OFF diff --git a/requirements_all.txt b/requirements_all.txt index ad72deb27a9a53ad636912f4cf76b0d7fc17d6ed..af8e8741c6485b157b91c377c55f3370fe2e1c94 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -882,9 +882,6 @@ minio==4.0.9 # homeassistant.components.mitemp_bt mitemp_bt==0.0.3 -# homeassistant.components.mopar -motorparts==1.1.0 - # homeassistant.components.tts mutagen==1.43.0