예제 #1
0
def test_has_battery(monkeypatch):
    """Test has_battery()."""

    _mock = TeslaMock(monkeypatch)
    _controller = Controller(None)

    _data = _mock.data_request_vehicle()
    _sensor = OnlineSensor(_data, _controller)

    assert not _sensor.has_battery()
예제 #2
0
def test_get_value_on_init(monkeypatch):
    """Test get_value() after initialization."""

    _mock = TeslaMock(monkeypatch)
    _controller = Controller(None)

    _data = _mock.data_request_vehicle()
    _sensor = OnlineSensor(_data, _controller)

    assert not _sensor is None
    assert _sensor.get_value() is None
예제 #3
0
async def test_get_value_after_update(monkeypatch):
    """Test get_value() after an update."""

    _mock = TeslaMock(monkeypatch)
    _controller = Controller(None)
    monkeypatch.setitem(_controller.car_online, "5YJSA11111111111", True)
    monkeypatch.setitem(_controller.car_state, "5YJSA11111111111",
                        TeslaMock.data_request_vehicle())

    _data = _mock.data_request_vehicle()
    _sensor = OnlineSensor(_data, _controller)

    await _sensor.async_update()

    assert not _sensor is None
    assert not _sensor.get_value() is None
    assert _sensor.get_value()
예제 #4
0
async def test_get_value_off(monkeypatch):
    """Test get_value() for offline mode."""

    _mock = TeslaMock(monkeypatch)
    _controller = Controller(None)
    monkeypatch.setitem(_controller.car_online, "5YJSA11111111111", False)
    monkeypatch.setitem(_controller.car_state, "5YJSA11111111111",
                        TeslaMock.data_request_vehicle())

    _data = _mock.data_request_vehicle()
    _sensor = OnlineSensor(_data, _controller)
    _data["state"] = "asleep"

    await _sensor.async_update()

    assert not _sensor is None
    assert not _sensor.get_value() is None
    assert not _sensor.get_value()
예제 #5
0
 def _add_components(self, car):
     self.__components.append(Climate(car, self))
     self.__components.append(Battery(car, self))
     self.__components.append(Range(car, self))
     self.__components.append(TempSensor(car, self))
     self.__components.append(Lock(car, self))
     self.__components.append(ChargerLock(car, self))
     self.__components.append(ChargerConnectionSensor(car, self))
     self.__components.append(ChargingSensor(car, self))
     self.__components.append(ChargerSwitch(car, self))
     self.__components.append(RangeSwitch(car, self))
     self.__components.append(ParkingSensor(car, self))
     self.__components.append(GPS(car, self))
     self.__components.append(Odometer(car, self))
     self.__components.append(OnlineSensor(car, self))
     self.__components.append(SentryModeSwitch(car, self))
     self.__components.append(TrunkLock(car, self))
     self.__components.append(FrunkLock(car, self))
예제 #6
0
    async def connect(self,
                      test_login=False,
                      wake_if_asleep=False) -> Tuple[Text, Text]:
        """Connect controller to Tesla.

        Args
            test_login (bool, optional): Whether to test credentials only. Defaults to False.
            wake_if_asleep (bool, optional): Whether to wake up any sleeping cars to update state. Defaults to False.

        Returns
            Tuple[Text, Text]: Returns the refresh_token and access_token

        """

        cars = await self.get_vehicles()
        self._last_attempted_update_time = time.time()
        self.__controller_lock = asyncio.Lock()

        for car in cars:
            vin = car["vin"]
            self.__id_vin_map[car["id"]] = vin
            self.__vin_id_map[vin] = car["id"]
            self.__vin_vehicle_id_map[vin] = car["vehicle_id"]
            self.__vehicle_id_vin_map[car["vehicle_id"]] = vin
            self.__lock[vin] = asyncio.Lock()
            self.__wakeup_conds[vin] = asyncio.Lock()
            self._last_update_time[vin] = 0
            self._last_wake_up_time[vin] = 0
            self.__update[vin] = True
            self.__update_state[vin] = "normal"
            self.car_state[vin] = car
            self.car_online[vin] = car["state"] == "online"
            self.__last_parked_timestamp[
                vin] = self._last_attempted_update_time
            self.__climate[vin] = {}
            self.__charging[vin] = {}
            self.__state[vin] = {}
            self.__config[vin] = {}
            self.__driving[vin] = {}
            self.__gui[vin] = {}

            self.__components.append(Climate(car, self))
            self.__components.append(Battery(car, self))
            self.__components.append(Range(car, self))
            self.__components.append(TempSensor(car, self))
            self.__components.append(Lock(car, self))
            self.__components.append(ChargerLock(car, self))
            self.__components.append(ChargerConnectionSensor(car, self))
            self.__components.append(ChargingSensor(car, self))
            self.__components.append(ChargerSwitch(car, self))
            self.__components.append(RangeSwitch(car, self))
            self.__components.append(ParkingSensor(car, self))
            self.__components.append(GPS(car, self))
            self.__components.append(Odometer(car, self))
            self.__components.append(OnlineSensor(car, self))
            self.__components.append(SentryModeSwitch(car, self))

        if not test_login:
            tasks = [
                self.update(car["id"], wake_if_asleep=wake_if_asleep)
                for car in cars
            ]
            _LOGGER.debug("tasks %s %s", tasks, wake_if_asleep)
            try:
                await asyncio.gather(*tasks)
            except (TeslaException, RetryLimitError):
                pass
        return (self.__connection.refresh_token,
                self.__connection.access_token)