Skip to content

Commit

Permalink
Merge pull request #20 from dougiteixeira/refactor-api-sensor
Browse files Browse the repository at this point in the history
API fetching refactoring to prepare for including reminders in the future
  • Loading branch information
hudsonbrendon authored Apr 27, 2023
2 parents 0f9b9ae + 3c0415e commit 4d73be0
Show file tree
Hide file tree
Showing 5 changed files with 436 additions and 127 deletions.
300 changes: 284 additions & 16 deletions custom_components/drivvo/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import dataclasses
import hashlib
import logging

Expand Down Expand Up @@ -120,38 +121,305 @@ def get():
return None


async def get_data_vehicle(hass, user, password, id_vehicle, info):
async def get_data_vehicle(hass, user, password, id_vehicle):
"""Get The request from the api."""

def get():
return requests.get(url, headers={"x-token": token})

def sort_by_key(list):
return list["data"]

token = await auth(
hass=hass,
user=user,
password=password,
token=True,
)
if token:
if info == "abastecimento":
url = BASE_URL.format(f"veiculo/{id_vehicle}/abastecimento/web")
elif info == "base":
url = BASE_URL.format(f"veiculo/{id_vehicle}")
url = BASE_URL.format(f"veiculo/{id_vehicle}")
response_vehicle = await hass.async_add_executor_job(get)
if response_vehicle.ok:
api_data_vehicle = response_vehicle.json()
else:
return None
_LOGGER.debug(
"API Response Data Vehicle %s - Vehicle: %s", id_vehicle, api_data_vehicle
)

url = BASE_URL.format(f"veiculo/{id_vehicle}/abastecimento/web")
response_refuelling = await hass.async_add_executor_job(get)
if response_refuelling.ok:
api_data_refuellings = sorted(
response_refuelling.json(), key=sort_by_key, reverse=True
)
else:
api_data_refuellings = None
_LOGGER.debug(
"API Response Data Vehicle %s - Refuelling: %s",
id_vehicle,
api_data_refuellings,
)

url = BASE_URL.format(f"veiculo/{id_vehicle}/servico/web")
response_services = await hass.async_add_executor_job(get)
if response_services.ok:
api_data_services = sorted(
response_services.json(), key=sort_by_key, reverse=True
)
else:
api_data_services = None
_LOGGER.debug(
"API Response Data Vehicle %s - Services: %s", id_vehicle, api_data_services
)

url = BASE_URL.format(f"veiculo/{id_vehicle}/despesa/web")
response_expenses = await hass.async_add_executor_job(get)
if response_expenses.ok:
api_data_expenses = sorted(
response_expenses.json(), key=sort_by_key, reverse=True
)
else:
api_data_expenses = None
_LOGGER.debug(
"API Response Data Vehicle %s - Expenses: %s", id_vehicle, api_data_expenses
)

response = await hass.async_add_executor_job(get)
name: str | None = None
placa: str | None = None
if api_data_vehicle["nome"] is not None and api_data_vehicle["nome"] != "":
name = api_data_vehicle["nome"]
if api_data_vehicle["placa"] is not None and api_data_vehicle["placa"] != "":
placa = api_data_vehicle["placa"]

if name is not None:
identification = name
elif placa:
identification = placa
else:
identification = f"{api_data_vehicle['marca']}/{api_data_vehicle['modelo']}"

refuelling_date = None
refuelling_last_average = None
refuelling_general_average = None
refuelling_station = None
refuelling_type = None
refuelling_value = None
refuelling_distance = None
refuelling_reason = None
refuelling_price = None
refuelling_total = 0
refuelling_value_total = None
refuelling_tank_full = None
refuelling_price_lowest = None
refuelling_volume = None
refuelling_volume_total = None

refuellings_odometers = []
if len(api_data_refuellings) > 0:
refuelling_total = len(api_data_refuellings)

refuelling_value_total = 0
refuelling_volume_total = 0
for refuelling in api_data_refuellings:
refuelling_value_total += refuelling["valor_total"]

if refuelling["volume"] != 0:
refuelling_volume_total += refuelling["volume"]
else:
refuelling_volume_total += (
refuelling["valor_total"] / refuelling["preco"]
)

refuelling_distance = 0
refuellings_odometers = [
{
"odometro": refuelling["odometro"],
"data": refuelling["data"],
"volume": refuelling["volume"],
"tanque_cheio": refuelling["tanque_cheio"],
"preco": refuelling["preco"],
"valor_total": refuelling["valor_total"],
}
for refuelling in api_data_refuellings
]
_LOGGER.debug(
"API Response Data Vehicle %s - odometers: %s",
id_vehicle,
refuellings_odometers,
)

def sort_by_key(list):
return list["data"]
if len(refuellings_odometers) > 1:
refuelling_distance = (
refuellings_odometers[0]["odometro"]
- refuellings_odometers[1]["odometro"]
)
if refuelling_volume_total > 0:
refuelling_general_average = (
refuellings_odometers[0]["odometro"]
- refuellings_odometers[len(refuellings_odometers) - 1][
"odometro"
]
) / (refuelling_volume_total)
else:
refuelling_general_average = 0

volume = 0
odometer_init = None
odometer_old = None
for odometer in refuellings_odometers:
if odometer["tanque_cheio"] and odometer_init is None:
odometer_init = odometer["odometro"]

if odometer_init is not None:
if odometer["volume"] != 0:
volume = odometer["volume"]
else:
volume = odometer["valor_total"] / odometer["preco"]

if (odometer["tanque_cheio"]) and (
odometer["odometro"] != odometer_init
):
odometer_old = odometer["odometro"]
break

if volume > 0 and odometer_old is not None:
refuelling_last_average = (
refuellings_odometers[0]["odometro"] - odometer_old
) / (volume)
else:
refuelling_last_average = 0

refuelling_price_lowest = min(
[refuelling["preco"] for refuelling in api_data_refuellings]
)

if response.ok:
data = response.json()
if info == "abastecimento":
data = sorted(data, key=sort_by_key, reverse=True)
refuelling = api_data_refuellings[0]
refuelling_date = refuelling["data"]
refuelling_type = refuelling["combustivel"]
refuelling_value = refuelling["valor_total"]
refuelling_price = refuelling["preco"]
if refuelling["volume"] != 0:
refuelling_volume = refuelling["volume"]
else:
refuelling_volume = refuelling["valor_total"] / refuelling["preco"]
refuelling_reason = refuelling["tipo_motivo"]
refuelling_tank_full = refuelling["tanque_cheio"]

station = refuelling["posto_combustivel"]
if (station is not None) and ("nome" in station):
refuelling_station = station["nome"]

distance_unit: str | None = None
if api_data_vehicle["unidade_distancia"] == 1:
distance_unit = "km"
elif api_data_vehicle["unidade_distancia"] == 2:
distance_unit = "mi"

services_odometers = []
if len(api_data_services) > 0:
services_odometers = [
{
"odometro": service["odometro"],
"data": service["data"],
}
for service in api_data_services
]
_LOGGER.debug(
"API Response Data Vehicle %s - odometers services: %s",
id_vehicle,
services_odometers,
)

_LOGGER.debug("API Response Data Vehicle - %s: %s", info, data)
return data
expenses_odometers = []
if len(api_data_expenses) > 0:
expenses_odometers = [
{
"odometro": expense["odometro"],
"data": expense["data"],
}
for expense in api_data_expenses
]
_LOGGER.debug(
"API Response Data Vehicle %s - odometers expenses: %s",
id_vehicle,
expenses_odometers,
)

_LOGGER.debug("API Response Data Vehicle - %s: %s", info, response)
return None
odometers = refuellings_odometers
odometers.extend(services_odometers)
odometers.extend(expenses_odometers)

odometers = sorted(odometers, key=sort_by_key, reverse=True)

_LOGGER.debug(
"API Response Data Vehicle %s - odometers: %s",
id_vehicle,
odometers,
)

odometer_last = None
odometer_date_last = None
if len(odometers) > 0:
odometer_last = odometers[0]["odometro"]
odometer_date_last = odometers[0]["data"]

data_return = DrivvoDataVehicle(
id=id_vehicle,
name=name,
identification=identification,
placa=placa,
odometer=odometer_last,
distance_unit=distance_unit,
odometer_date=odometer_date_last,
manufacturer=api_data_vehicle["marca"],
model=api_data_vehicle["modelo"],
refuelling_date=refuelling_date,
refuelling_last_average=refuelling_last_average,
refuelling_general_average=refuelling_general_average,
refuelling_station=refuelling_station,
refuelling_type=refuelling_type,
refuelling_value=refuelling_value,
refuelling_distance=refuelling_distance,
refuelling_reason=refuelling_reason,
refuelling_price=refuelling_price,
refuelling_total=refuelling_total,
refuelling_value_total=refuelling_value_total,
refuelling_tank_full=refuelling_tank_full,
refuelling_price_lowest=refuelling_price_lowest,
refuelling_volume=refuelling_volume,
refuelling_volume_total=refuelling_volume_total,
)

_LOGGER.debug("API Response Data Vehicle - Refuelling: %s", data_return)
return data_return


@dataclasses.dataclass
class DrivvoDataVehicle:
"""Data parsed from the API."""

id: int
name: str | None
identification: str | None
placa: str | None
odometer: int | None
odometer_date: str | None
manufacturer: str
model: str
refuelling_date: str | None
refuelling_last_average: float | None
refuelling_general_average: float | None
refuelling_station: str | None
refuelling_type: str | None
refuelling_value: float | None
refuelling_distance: int | None
refuelling_reason: str | None
refuelling_price: float | None
refuelling_volume: float | None
refuelling_total: int | None
refuelling_value_total: float | None
refuelling_tank_full: bool | None
refuelling_price_lowest: float | None
distance_unit: str
refuelling_volume_total: float | None
4 changes: 2 additions & 2 deletions custom_components/drivvo/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
"iot_class": "cloud_polling",
"issue_tracker": "https://github.com/hudsonbrendon/sensor.drivvo/issues",
"requirements": [],
"version": "1.0.4"
}
"version": "1.0.5"
}
Loading

0 comments on commit 4d73be0

Please sign in to comment.