From cb9e90657ade1118fbc5a9d98f7c41eb98277cfe Mon Sep 17 00:00:00 2001 From: Hudson Brendon Date: Mon, 21 Jun 2021 22:14:01 +0000 Subject: [PATCH] Added base project --- .devcontainer/Dockerfile | 17 +++ .devcontainer/README.md | 53 +++++++++ .devcontainer/configuration.yaml | 5 + .devcontainer/custom_component_helper | 26 +++++ .devcontainer/devcontainer.json | 23 ++++ .devcontainer/images/reopen.png | Bin 0 -> 8177 bytes .vscode/settings.json | 5 + .vscode/tasks.json | 61 +++++++++++ custom_components/drivvo/__init__.py | 1 + custom_components/drivvo/manifest.json | 9 ++ custom_components/drivvo/sensor.py | 143 +++++++++++++++++++++++++ hacs.json | 8 ++ 12 files changed, 351 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/README.md create mode 100644 .devcontainer/configuration.yaml create mode 100644 .devcontainer/custom_component_helper create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/images/reopen.png create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 custom_components/drivvo/__init__.py create mode 100644 custom_components/drivvo/manifest.json create mode 100755 custom_components/drivvo/sensor.py create mode 100644 hacs.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b21ca53 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.8 + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + git \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN python -m pip install --upgrade colorlog black pylint +RUN python -m pip install --upgrade git+git://github.com/home-assistant/home-assistant.git@dev +RUN cd && mkdir -p /config/custom_components + + +WORKDIR /workspace + +# Set the default shell to bash instead of sh +ENV SHELL /bin/bash \ No newline at end of file diff --git a/.devcontainer/README.md b/.devcontainer/README.md new file mode 100644 index 0000000..f52282a --- /dev/null +++ b/.devcontainer/README.md @@ -0,0 +1,53 @@ +# Devcontainer + +_The easiest way to contribute to and/or test this repository._ + +## Requirements + +- [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +- [docker](https://docs.docker.com/install/) +- [VS Code](https://code.visualstudio.com/) +- [Remote - Containers (VSC Extention)](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +[More info about requirements and devcontainer in general](https://code.visualstudio.com/docs/remote/containers#_getting-started) + +## How to use Devcontainer for development/test + +1. Make sure your computer meets the requirements. +1. Fork this repository. +1. Clone the repository to your computer. +1. Open the repository using VS Code. + +When you open this repository with VSCode and your computer meets the requirements you are asked to "Reopen in Container", do that. + +![reopen](images/reopen.png) + +If you don't see this notification, open the command pallet (ctrl+shift+p) and select `Remote-Containers: Reopen Folder in Container`. + +_It will now build the devcontainer._ + +The container have some "tasks" to help you testing your changes. + +## Custom Tasks in this repository + +_Start "tasks" by opening the the command pallet (ctrl+shift+p) and select `Tasks: Run Task`_ + +Running tasks like `Start Home Assistant on port 8124` can be restarted by opening the the command pallet (ctrl+shift+p) and select `Tasks: Restart Running Task`, then select the task you want to restart. + +### Start Home Assistant on port 8124 + +This will copy the configuration and the integration files to the expected location in the container. + +And start up Home Assistant on [port 8124.](http://localhost:8124) + +### Upgrade Home Assistant to latest dev + +This will upgrade Home Assistant to the latest dev version. + +### Set Home Assistant Version + +This allows you to specify a version of Home Assistant to install inside the devcontainer. + +### Home Assistant Config Check + +This runs a config check to make sure your config is valid. diff --git a/.devcontainer/configuration.yaml b/.devcontainer/configuration.yaml new file mode 100644 index 0000000..6fdd43e --- /dev/null +++ b/.devcontainer/configuration.yaml @@ -0,0 +1,5 @@ +default_config: +logger: + default: error + logs: + custom_components.drivvo: debug diff --git a/.devcontainer/custom_component_helper b/.devcontainer/custom_component_helper new file mode 100644 index 0000000..40165d9 --- /dev/null +++ b/.devcontainer/custom_component_helper @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +function StartHomeAssistant { + echo "Copy configuration.yaml" + cp -f .devcontainer/configuration.yaml /config || echo ".devcontainer/configuration.yaml are missing!" exit 1 + + echo "Copy the custom component" + rm -R /config/custom_components/ || echo "" + cp -r custom_components /config/custom_components/ || echo "Could not copy the custom_component" exit 1 + + echo "Start Home Assistant" + hass -c /config +} + +function UpdgradeHomeAssistantDev { + python -m pip install --upgrade git+git://github.com/home-assistant/home-assistant.git@dev +} + +function SetHomeAssistantVersion { + read -p 'Version: ' version + python -m pip install --upgrade homeassistant==$version +} + +function HomeAssistantConfigCheck { + hass -c /config --script check_config +} \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..ee2577a --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +// See https://aka.ms/vscode-remote/devcontainer.json for format details. +{ + "context": "..", + "dockerFile": "Dockerfile", + "appPort": "8124:8123", + "runArgs": [ + "-e", + "GIT_EDTIOR='code --wait'" + ], + "extensions": [ + "ms-python.python" + ], + "settings": { + "python.pythonPath": "/usr/local/bin/python", + "python.linting.pylintEnabled": true, + "python.linting.enabled": true, + "python.formatting.provider": "black", + "editor.formatOnPaste": false, + "editor.formatOnSave": true, + "editor.formatOnType": true, + "files.trimTrailingWhitespace": true + } +} \ No newline at end of file diff --git a/.devcontainer/images/reopen.png b/.devcontainer/images/reopen.png new file mode 100644 index 0000000000000000000000000000000000000000..cbcec3c7b87925be0a0e3c6c7db5c32d03380b1b GIT binary patch literal 8177 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 literal 0 HcmV?d00001 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a04b218 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.yaml": "home-assistant" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..31504d9 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,61 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Start Home Assistant on port 8124", + "type": "shell", + "command": "source .devcontainer/custom_component_helper && StartHomeAssistant", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + }, + { + "label": "Upgrade Home Assistant to latest dev", + "type": "shell", + "command": "source .devcontainer/custom_component_helper && UpdgradeHomeAssistantDev", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + }, + { + "label": "Set Home Assistant Version", + "type": "shell", + "command": "source .devcontainer/custom_component_helper && SetHomeAssistantVersion", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + }, + { + "label": "Home Assistant Config Check", + "type": "shell", + "command": "source .devcontainer/custom_component_helper && HomeAssistantConfigCheck", + "group": { + "kind": "test", + "isDefault": true, + }, + "presentation": { + "reveal": "always", + "panel": "new" + }, + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/custom_components/drivvo/__init__.py b/custom_components/drivvo/__init__.py new file mode 100644 index 0000000..f97cacb --- /dev/null +++ b/custom_components/drivvo/__init__.py @@ -0,0 +1 @@ +"""The Drivvo.com Component.""" diff --git a/custom_components/drivvo/manifest.json b/custom_components/drivvo/manifest.json new file mode 100644 index 0000000..0affe53 --- /dev/null +++ b/custom_components/drivvo/manifest.json @@ -0,0 +1,9 @@ +{ + "domain": "drivvo", + "name": "Drivvo", + "version": "0.0.1", + "documentation": "https://github.com/hudsonbrendon/sensor.drivvo", + "dependencies": [], + "codeowners": ["@hudsonbrendon"], + "requirements": [] +} diff --git a/custom_components/drivvo/sensor.py b/custom_components/drivvo/sensor.py new file mode 100755 index 0000000..d4c5183 --- /dev/null +++ b/custom_components/drivvo/sensor.py @@ -0,0 +1,143 @@ +""" +For more details on this component, refer to the documentation at +https://github.com/hudsonbrendon/sensor.drivvo +""" +import logging +from datetime import timedelta + +import async_timeout +import homeassistant.helpers.config_validation as cv +import voluptuous as vol +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.helpers.aiohttp_client import async_create_clientsession +from homeassistant.helpers.entity import Entity + +CONF_EMAIL = "email" +CONF_PASSWORD = "password" +CONF_MODEL = "model" +CONF_ID_VEHICLE = "id_vehicle" + +SCAN_INTERVAL = timedelta(minutes=60) + +LOGIN_BASE_URL = "https://api.drivvo.com/autenticacao/login" +BASE_URL = "https://api.drivvo.com/veiculo/{}/{}/web" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_EMAIL): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + vol.Required(CONF_MODEL): cv.string, + vol.Required(CONF_ID_VEHICLE): cv.string, + } +) + +_LOGGER = logging.getLogger(__name__) + + +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): + """Configuração do sensor.""" + email = config["email"] + password = config["password"] + model = config["model"] + id_vehicle = config["id_vehicle"] + session = async_create_clientsession(hass) + name = "Abastecimento" + async_add_entities( + [DrivvoSupplySensor(email, password, model, id_vehicle, name, session)], True + ) + + +class DrivvoSupplySensor(Entity): + """Sensor de abastecimento""" + + def __init__(self, email, password, model, id_vehicle, name, session): + self._state = model + self._model = model + self._email = email + self._password = password + self._id_vehicle = id_vehicle + self.session = session + self._name = name + self._supplies = [] + + async def async_update(self): + """Atualização do sensor.""" + _LOGGER.debug("%s - Running update", self._name) + try: + url = BASE_URL.format(self._id_vehicle, "abastecimento") + async with async_timeout.timeout(10, loop=self.hass.loop): + response = await self.session.post( + LOGIN_BASE_URL, + data=dict(email=self._email, senha=self._password), + ) + data = await response.json() + x_token = data.get("token") + response = await self.session.get(url, headers={"x-token": x_token}) + self._supplies = await response.json() + except Exception as error: + _LOGGER.debug("%s - Could not update - %s", self._name, error) + + @property + def name(self): + """Nome.""" + return self._name + + @property + def state(self): + """Estado.""" + return self._state + + @property + def supply(self): + """Abastecimento.""" + return self._supplies[0] + + @property + def total_payment(self): + """Soma total de valores pagos em todos os abastecimentos.""" + total = 0 + for supply in self._supplies: + total += supply.get("valor_total") + return total + + @property + def km_travel(self): + """Km percorridos desde o ultimo abastecimento.""" + km = 0 + odometers = [supply.get("odometro") for supply in self._supplies] + if len(odometers) > 1: + km = odometers[0] - odometers[1] + return km + + @property + def cheapest_gasoline_until_today(self): + return min([supply.get("preco") for supply in self._supplies]) + + @property + def total_amount_of_supplies(self): + return sum([1 for supply in self._supplies]) + + @property + def icon(self): + """Icone.""" + return "mdi:gas-station" + + @property + def device_state_attributes(self): + """Atributos.""" + return { + "veiculo": self._model, + "odometro": self.supply.get("odometro"), + "posto_combustivel": self.supply.get("posto_combustivel").get("nome"), + "combustivel": self.supply.get("combustivel"), + "motivo": self.supply.get("tipo_motivo"), + "data": self.supply.get("data"), + "volume": self.supply.get("tanques")[0].get("volume"), + "valor": self.supply.get("valor_total"), + "preco": self.supply.get("preco"), + "soma_total_de_abastecimentos": self.total_amount_of_supplies, + "soma_total_de_valores_pagos_em_todos_os_abastecimentos": self.total_payment, + "tanque_cheio": "Sim" if self.supply.get("tanque_cheio") else "Não", + "km_percorridos_desde_o_ultimo_abastecimento": self.km_travel, + "gasolina_mais_barata_ate_entao": self.cheapest_gasoline_until_today, + } diff --git a/hacs.json b/hacs.json new file mode 100644 index 0000000..cbbb85e --- /dev/null +++ b/hacs.json @@ -0,0 +1,8 @@ +{ + "name": "Drivvo", + "country": "BR", + "render_readme": true, + "domains": [ + "sensor" + ] +} \ No newline at end of file