Skip to content

Commit

Permalink
Merge pull request #57 from alandtse/websocket
Browse files Browse the repository at this point in the history
feat: add websocket support
  • Loading branch information
alandtse committed Feb 28, 2020
2 parents c446451 + 0e116c3 commit 9a13d89
Show file tree
Hide file tree
Showing 15 changed files with 974 additions and 472 deletions.
2 changes: 2 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ black = "*"

[packages]
aiohttp = "*"
backoff = "*"
wrapt = "*"

[pipenv]
allow_prereleases = true
477 changes: 262 additions & 215 deletions Pipfile.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
VERSION = None

# What packages are required for this module to be executed?
REQUIRED = ["aiohttp"]
REQUIRED = ["aiohttp", "backoff", "wrapt"]

# What packages are optional?
EXTRAS = {
Expand Down
7 changes: 6 additions & 1 deletion teslajsonpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
https://github.com/zabuldon/teslajsonpy
"""
from teslajsonpy.battery_sensor import Battery, Range
from teslajsonpy.binary_sensor import ChargerConnectionSensor, ParkingSensor
from teslajsonpy.binary_sensor import (
ChargerConnectionSensor,
OnlineSensor,
ParkingSensor,
)
from teslajsonpy.charger import ChargerSwitch, ChargingSensor, RangeSwitch
from teslajsonpy.climate import Climate, TempSensor
from teslajsonpy.controller import Controller
Expand All @@ -21,6 +25,7 @@
"Range",
"ChargerConnectionSensor",
"ChargingSensor",
"OnlineSensor",
"ParkingSensor",
"ChargerSwitch",
"RangeSwitch",
Expand Down
16 changes: 8 additions & 8 deletions teslajsonpy/battery_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(self, data: Dict, controller) -> None:
"""
super().__init__(data, controller)
self.__battery_level: int = 0
self.__battery_level: int = None
self.__charging_state: bool = None
self.__charge_port_door_open: bool = None
self.type: Text = "battery sensor"
Expand All @@ -34,9 +34,9 @@ def __init__(self, data: Dict, controller) -> None:
self.uniq_name: Text = self._uniq_name()
self.bin_type: hex = 0x5

async def async_update(self) -> None:
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the battery state."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_charging_params(self._id)
if data:
self.__battery_level = data["battery_level"]
Expand Down Expand Up @@ -85,9 +85,9 @@ def __init__(self, data: Dict, controller) -> None:
"""
super().__init__(data, controller)
self.__battery_range = 0
self.__est_battery_range = 0
self.__ideal_battery_range = 0
self.__battery_range = None
self.__est_battery_range = None
self.__ideal_battery_range = None
self.type = "range sensor"
self.__rated = True
self.measurement = "LENGTH_MILES"
Expand All @@ -97,9 +97,9 @@ def __init__(self, data: Dict, controller) -> None:
self.uniq_name = self._uniq_name()
self.bin_type = 0xA

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the battery range state."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_charging_params(self._id)
if data:
self.__battery_range = data["battery_range"]
Expand Down
27 changes: 14 additions & 13 deletions teslajsonpy/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def __init__(self, data: Dict, controller):
"""
super().__init__(data, controller)
self.__state = False
self.__state = None

self.type = "parking brake sensor"
self.hass_type = "binary_sensor"
Expand All @@ -43,11 +43,10 @@ def __init__(self, data: Dict, controller):

self.uniq_name = self._uniq_name()
self.bin_type = 0x1
self.attrs: Dict[Text, Text] = {}

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the parking brake sensor."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_drive_params(self._id)
if data:
self.attrs["shift_state"] = (
Expand Down Expand Up @@ -91,7 +90,7 @@ def __init__(self, data, controller):
"""
super().__init__(data, controller)
self.__state = False
self.__state = None

self.type = "charger sensor"
self.hass_type = "binary_sensor"
Expand All @@ -100,14 +99,17 @@ def __init__(self, data, controller):

self.uniq_name = self._uniq_name()
self.bin_type = 0x2
self.attrs: Dict[Text, Text] = {}

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the charger connection sensor."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_charging_params(self._id)
if data:
self.attrs["charging_state"] = data["charging_state"]
self.attrs["conn_charge_cable"] = data["conn_charge_cable"]
self.attrs["fast_charger_present"] = data["fast_charger_present"]
self.attrs["fast_charger_brand"] = data["fast_charger_brand"]
self.attrs["fast_charger_type"] = data["fast_charger_type"]
if data["charging_state"] in ["Disconnected"]:
self.__state = False
else:
Expand Down Expand Up @@ -141,19 +143,18 @@ def __init__(self, data: Dict, controller) -> None:
self.hass_type = "binary_sensor"
self.name: Text = self._name()
self.uniq_name: Text = self._uniq_name()
self.attrs: Dict[Text, Text] = {}

async def async_update(self) -> None:
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the battery state."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
self.__online_state = self._controller.car_online[self._vin]
self.attrs["state"] = self._controller.raw_online_state[self._vin]
self.attrs["state"] = self._controller.car_state[self._vin].get("state")

@staticmethod
def has_battery() -> bool:
"""Return whether the device has a battery."""
return False

def get_value(self) -> bool:
"""Return the battery level."""
"""Return the car is online."""
return self.__online_state
46 changes: 27 additions & 19 deletions teslajsonpy/charger.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ def __init__(self, data, controller):
"""
super().__init__(data, controller)
self.__manual_update_time = 0
self.__charger_state = False
self.__charger_state = None
self.type = "charger switch"
self.hass_type = "switch"
self.name = self._name()
self.uniq_name = self._uniq_name()
self.bin_type = 0x8

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the charging state of the Tesla Vehicle."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
last_update = self._controller.get_last_update_time(self._id)
if last_update >= self.__manual_update_time:
data = self._controller.get_charging_params(self._id)
Expand Down Expand Up @@ -87,16 +87,16 @@ def __init__(self, data, controller):
"""Initialize the charger range switch."""
super().__init__(data, controller)
self.__manual_update_time = 0
self.__maxrange_state = False
self.__maxrange_state = None
self.type = "maxrange switch"
self.hass_type = "switch"
self.name = self._name()
self.uniq_name = self._uniq_name()
self.bin_type = 0x9

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the status of the range setting."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
last_update = self._controller.get_last_update_time(self._id)
if last_update >= self.__manual_update_time:
data = self._controller.get_charging_params(self._id)
Expand Down Expand Up @@ -154,27 +154,30 @@ def __init__(self, data: Dict, controller) -> None:
self.name: Text = self._name()
self.uniq_name: Text = self._uniq_name()
self.bin_type: hex = 0xC
self.__added_range = 0
self.__charging_rate = 0
self.__time_to_full = 0
self.__charge_current_request = 0
self.__charger_actual_current = 0
self.__charger_voltage = 0

async def async_update(self) -> None:
self.__added_range = None
self.__charge_energy_added = None
self.__charging_rate = None
self.__time_to_full = None
self.__charge_current_request = None
self.__charger_actual_current = None
self.__charger_voltage = None

async def async_update(self, wake_if_asleep=False) -> None:
"""Update the battery state."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_gui_params(self._id)
if data:
self.measurement = data["gui_distance_units"]
self.__rated = data["gui_range_display"] == "Rated"
data = self._controller.get_charging_params(self._id)
if data:
self.attrs["charger_phases"] = data["charger_phases"]
self.__added_range = (
data["charge_miles_added_rated"]
if self.__rated
else data["charge_miles_added_ideal"]
)
self.__charge_energy_added = data["charge_energy_added"]
self.__charging_rate = data["charge_rate"]
self.__time_to_full = data["time_to_full_charge"]
self.__charge_current_request = data["charge_current_request"]
Expand All @@ -201,24 +204,29 @@ def time_left(self) -> float:

@property
def added_range(self) -> float:
"""Return the charging rate."""
"""Return the added range."""
return self.__added_range

@property
def charge_current_request(self) -> float:
"""Return the charging rate."""
"""Return the requested current."""
return self.__charge_current_request

@property
def charger_actual_current(self) -> float:
"""Return the charging rate."""
"""Return the actual current."""
return self.__charger_actual_current

@property
def charger_voltage(self) -> float:
"""Return the charging rate."""
"""Return the voltage."""
return self.__charger_voltage

@property
def charge_energy_added(self) -> float:
"""Return the energy added."""
return self.__charge_energy_added

@property
def device_class(self) -> Text:
"""Return the HA device class."""
Expand Down
26 changes: 13 additions & 13 deletions teslajsonpy/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,13 @@ def __init__(self, data, controller):
"""
super().__init__(data, controller)
self.__is_auto_conditioning_on = False
self.__inside_temp = 0
self.__outside_temp = 0
self.__driver_temp_setting = 0
self.__passenger_temp_setting = 0
self.__is_climate_on = False
self.__fan_status = 0
self.__is_auto_conditioning_on = None
self.__inside_temp = None
self.__outside_temp = None
self.__driver_temp_setting = None
self.__passenger_temp_setting = None
self.__is_climate_on = None
self.__fan_status = None
self.__manual_update_time = 0

self.type = "HVAC (climate) system"
Expand Down Expand Up @@ -70,9 +70,9 @@ def get_fan_status(self):
"""Return fan status."""
return self.__fan_status

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the HVAC state."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_climate_params(self._id)
if data:
last_update = self._controller.get_last_update_time(self._id)
Expand Down Expand Up @@ -161,8 +161,8 @@ def __init__(self, data, controller):
"""
super().__init__(data, controller)
self.__inside_temp = 0
self.__outside_temp = 0
self.__inside_temp = None
self.__outside_temp = None

self.type = "temperature sensor"
self.measurement = "C"
Expand All @@ -180,9 +180,9 @@ def get_outside_temp(self):
"""Get outside temperature."""
return self.__outside_temp

async def async_update(self):
async def async_update(self, wake_if_asleep=False) -> None:
"""Update the temperature."""
await super().async_update()
await super().async_update(wake_if_asleep=wake_if_asleep)
data = self._controller.get_climate_params(self._id)
if data:
self.__inside_temp = (
Expand Down
Loading

0 comments on commit 9a13d89

Please sign in to comment.