Skip to content

Commit f6a859d

Browse files
committed
2025.2.6 fields
1 parent 5e6da84 commit f6a859d

File tree

2 files changed

+186
-11
lines changed

2 files changed

+186
-11
lines changed

teslemetry_stream/const.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,24 @@ class Signal(StrEnum):
227227
SETTING_CHARGE_UNIT = "SettingChargeUnit"
228228
CLIMATE_SEAT_COOLING_FRONT_LEFT = "ClimateSeatCoolingFrontLeft"
229229
CLIMATE_SEAT_COOLING_FRONT_RIGHT = "ClimateSeatCoolingFrontRight"
230+
LIGHTS_HAZARDS_ACTIVE = "LightsHazardsActive"
231+
LIGHTS_TURN_SIGNAL = "LightsTurnSignal"
232+
LIGHTS_HIGH_BEAMS = "LightsHighBeams"
233+
MEDIA_PLAYBACK_STATUS = "MediaPlaybackStatus"
234+
MEDIA_PLAYBACK_SOURCE = "MediaPlaybackSource"
235+
MEDIA_AUDIO_VOLUME = "MediaAudioVolume"
236+
MEDIA_NOW_PLAYING_DURATION = "MediaNowPlayingDuration"
237+
MEDIA_NOW_PLAYING_ELAPSED = "MediaNowPlayingElapsed"
238+
MEDIA_NOW_PLAYING_ARTIST = "MediaNowPlayingArtist"
239+
MEDIA_NOW_PLAYING_TITLE = "MediaNowPlayingTitle"
240+
MEDIA_NOW_PLAYING_ALBUM = "MediaNowPlayingAlbum"
241+
MEDIA_NOW_PLAYING_STATION = "MediaNowPlayingStation"
242+
MEDIA_AUDIO_VOLUME_INCREMENT = "MediaAudioVolumeIncrement"
243+
MEDIA_AUDIO_VOLUME_MAX = "MediaAudioVolumeMax"
244+
SUNROOF_INSTALLED = "SunroofInstalled"
245+
SEAT_VENT_ENABLED = "SeatVentEnabled"
246+
REAR_DEFROST_ENABLED = "RearDefrostEnabled"
247+
CHARGE_RATE_MILE_PER_HOUR = "ChargeRateMilePerHour"
230248

231249

232250
class Alert(StrEnum):
@@ -624,3 +642,25 @@ def get(self, value, default: str | None = None) -> str | None:
624642
'Distance',
625643
'Percent'
626644
])
645+
646+
SunroofInstalledState = TeslemetryEnum('SunroofInstalledState', [
647+
'Unknown',
648+
'NotInstalled',
649+
'Gen1Installed',
650+
'Gen2Installed'
651+
])
652+
653+
TurnSignalState = TeslemetryEnum('TurnSignalState', [
654+
'Unknown',
655+
'Off',
656+
'Left',
657+
'Right',
658+
'Both'
659+
])
660+
661+
MediaStatus = TeslemetryEnum('MediaStatus', [
662+
'Unknown',
663+
'Stopped',
664+
'Playing',
665+
'Paused'
666+
])

teslemetry_stream/vehicle.py

Lines changed: 146 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,19 @@
66

77
from .const import (
88
BMSState,
9-
#BuckleStatus,
109
CabinOverheatProtectionModeState,
1110
CableType,
1211
CarType,
1312
ChargePort,
1413
ChargePortLatch,
1514
ChargeState,
1615
ChargeUnitPreference,
17-
#ChargeUnitPreference,
1816
ClimateKeeperModeState,
1917
ClimateOverheatProtectionTempLimit,
2018
DefrostModeState,
2119
DetailedChargeState,
2220
DisplayState,
2321
DistanceUnit,
24-
#DistanceUnit,
2522
DriveInverterState,
2623
FastCharger,
2724
FollowDistance,
@@ -35,21 +32,15 @@
3532
PowershareStopReasonStatus,
3633
PowershareTypeStatus,
3734
PressureUnit,
38-
#PressureUnit,
3935
ScheduledChargingMode,
40-
#SeatFoldPosition,
4136
SentryModeState,
4237
ShiftState,
4338
Signal,
39+
SunroofInstalledState,
4440
TemperatureUnit,
45-
#SpeedAssistLevel,
46-
#TemperatureUnit,
4741
TeslaLocation,
48-
#TonneauPositionState,
49-
#TonneauTentModeState,
50-
#TractorAirStatus,
51-
#TrailerAirStatus,
5242
WindowState,
43+
MediaStatus
5344
)
5445

5546
if TYPE_CHECKING:
@@ -1874,6 +1865,150 @@ def listen_WiperHeatEnabled(self, callback: Callable[[bool | None], None]) -> Ca
18741865
{"vin":self.vin, "data": {Signal.WIPER_HEAT_ENABLED: None}}
18751866
)
18761867

1868+
def listen_LightsHazardsActive(self, callback: Callable[[bool | None], None]) -> Callable[[],None]:
1869+
"""Listen for Lights Hazards Active."""
1870+
self._enable_field(Signal.LIGHTS_HAZARDS_ACTIVE)
1871+
return self.stream.async_add_listener(
1872+
make_bool(Signal.LIGHTS_HAZARDS_ACTIVE, callback),
1873+
{"vin":self.vin, "data": {Signal.LIGHTS_HAZARDS_ACTIVE: None}}
1874+
)
1875+
1876+
def listen_LightsTurnSignal(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1877+
"""Listen for Lights Turn Signal."""
1878+
self._enable_field(Signal.LIGHTS_TURN_SIGNAL)
1879+
return self.stream.async_add_listener(
1880+
lambda x: callback(TurnSignalState.get(x['data'][Signal.LIGHTS_TURN_SIGNAL])),
1881+
{"vin":self.vin, "data": {Signal.LIGHTS_TURN_SIGNAL: None}}
1882+
)
1883+
1884+
def listen_LightsHighBeams(self, callback: Callable[[bool | None], None]) -> Callable[[],None]:
1885+
"""Listen for Lights High Beams."""
1886+
self._enable_field(Signal.LIGHTS_HIGH_BEAMS)
1887+
return self.stream.async_add_listener(
1888+
make_bool(Signal.LIGHTS_HIGH_BEAMS, callback),
1889+
{"vin":self.vin, "data": {Signal.LIGHTS_HIGH_BEAMS: None}}
1890+
)
1891+
1892+
def listen_MediaPlaybackStatus(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1893+
"""Listen for Media Playback Status."""
1894+
self._enable_field(Signal.MEDIA_PLAYBACK_STATUS)
1895+
return self.stream.async_add_listener(
1896+
lambda x: callback(MediaStatus.get(x['data'][Signal.MEDIA_PLAYBACK_STATUS])),
1897+
{"vin":self.vin, "data": {Signal.MEDIA_PLAYBACK_STATUS: None}}
1898+
)
1899+
1900+
def listen_MediaPlaybackSource(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1901+
"""Listen for Media Playback Source."""
1902+
self._enable_field(Signal.MEDIA_PLAYBACK_SOURCE)
1903+
return self.stream.async_add_listener(
1904+
lambda x: callback(x['data'][Signal.MEDIA_PLAYBACK_SOURCE]),
1905+
{"vin":self.vin, "data": {Signal.MEDIA_PLAYBACK_SOURCE: None}}
1906+
)
1907+
1908+
def listen_MediaAudioVolume(self, callback: Callable[[float | None], None]) -> Callable[[],None]:
1909+
"""Listen for Media Audio Volume."""
1910+
self._enable_field(Signal.MEDIA_AUDIO_VOLUME)
1911+
return self.stream.async_add_listener(
1912+
make_float(Signal.MEDIA_AUDIO_VOLUME, callback),
1913+
{"vin":self.vin, "data": {Signal.MEDIA_AUDIO_VOLUME: None}}
1914+
)
1915+
1916+
def listen_MediaNowPlayingDuration(self, callback: Callable[[int | None], None]) -> Callable[[],None]:
1917+
"""Listen for Media Now Playing Duration."""
1918+
self._enable_field(Signal.MEDIA_NOW_PLAYING_DURATION)
1919+
return self.stream.async_add_listener(
1920+
make_int(Signal.MEDIA_NOW_PLAYING_DURATION, callback),
1921+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_DURATION: None}}
1922+
)
1923+
1924+
def listen_MediaNowPlayingElapsed(self, callback: Callable[[int | None], None]) -> Callable[[],None]:
1925+
"""Listen for Media Now Playing Elapsed."""
1926+
self._enable_field(Signal.MEDIA_NOW_PLAYING_ELAPSED)
1927+
return self.stream.async_add_listener(
1928+
make_int(Signal.MEDIA_NOW_PLAYING_ELAPSED, callback),
1929+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_ELAPSED: None}}
1930+
)
1931+
1932+
def listen_MediaNowPlayingArtist(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1933+
"""Listen for Media Now Playing Artist."""
1934+
self._enable_field(Signal.MEDIA_NOW_PLAYING_ARTIST)
1935+
return self.stream.async_add_listener(
1936+
lambda x: callback(x['data'][Signal.MEDIA_NOW_PLAYING_ARTIST]),
1937+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_ARTIST: None}}
1938+
)
1939+
1940+
def listen_MediaNowPlayingTitle(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1941+
"""Listen for Media Now Playing Title."""
1942+
self._enable_field(Signal.MEDIA_NOW_PLAYING_TITLE)
1943+
return self.stream.async_add_listener(
1944+
lambda x: callback(x['data'][Signal.MEDIA_NOW_PLAYING_TITLE]),
1945+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_TITLE: None}}
1946+
)
1947+
1948+
def listen_MediaNowPlayingAlbum(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1949+
"""Listen for Media Now Playing Album."""
1950+
self._enable_field(Signal.MEDIA_NOW_PLAYING_ALBUM)
1951+
return self.stream.async_add_listener(
1952+
lambda x: callback(x['data'][Signal.MEDIA_NOW_PLAYING_ALBUM]),
1953+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_ALBUM: None}}
1954+
)
1955+
1956+
def listen_MediaNowPlayingStation(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1957+
"""Listen for Media Now Playing Station."""
1958+
self._enable_field(Signal.MEDIA_NOW_PLAYING_STATION)
1959+
return self.stream.async_add_listener(
1960+
lambda x: callback(x['data'][Signal.MEDIA_NOW_PLAYING_STATION]),
1961+
{"vin":self.vin, "data": {Signal.MEDIA_NOW_PLAYING_STATION: None}}
1962+
)
1963+
1964+
def listen_MediaAudioVolumeIncrement(self, callback: Callable[[float | None], None]) -> Callable[[],None]:
1965+
"""Listen for Media Audio Volume Increment."""
1966+
self._enable_field(Signal.MEDIA_AUDIO_VOLUME_INCREMENT)
1967+
return self.stream.async_add_listener(
1968+
make_float(Signal.MEDIA_AUDIO_VOLUME_INCREMENT, callback),
1969+
{"vin":self.vin, "data": {Signal.MEDIA_AUDIO_VOLUME_INCREMENT: None}}
1970+
)
1971+
1972+
def listen_MediaAudioVolumeMax(self, callback: Callable[[float | None], None]) -> Callable[[],None]:
1973+
"""Listen for Media Audio Volume Maximum."""
1974+
self._enable_field(Signal.MEDIA_AUDIO_VOLUME_MAX)
1975+
return self.stream.async_add_listener(
1976+
make_float(Signal.MEDIA_AUDIO_VOLUME_MAX, callback),
1977+
{"vin":self.vin, "data": {Signal.MEDIA_AUDIO_VOLUME_MAX: None}}
1978+
)
1979+
1980+
def listen_SunroofInstalled(self, callback: Callable[[str | None], None]) -> Callable[[],None]:
1981+
"""Listen for Sunroof Installed."""
1982+
self._enable_field(Signal.SUNROOF_INSTALLED)
1983+
return self.stream.async_add_listener(
1984+
lambda x: callback(SunroofInstalledState.get(x['data'][Signal.SUNROOF_INSTALLED])),
1985+
{"vin":self.vin, "data": {Signal.SUNROOF_INSTALLED: None}}
1986+
)
1987+
1988+
def listen_SeatVentEnabled(self, callback: Callable[[bool | None], None]) -> Callable[[],None]:
1989+
"""Listen for Seat Vent Enabled."""
1990+
self._enable_field(Signal.SEAT_VENT_ENABLED)
1991+
return self.stream.async_add_listener(
1992+
make_bool(Signal.SEAT_VENT_ENABLED, callback),
1993+
{"vin":self.vin, "data": {Signal.SEAT_VENT_ENABLED: None}}
1994+
)
1995+
1996+
def listen_RearDefrostEnabled(self, callback: Callable[[bool | None], None]) -> Callable[[],None]:
1997+
"""Listen for Rear Defrost Enabled."""
1998+
self._enable_field(Signal.REAR_DEFROST_ENABLED)
1999+
return self.stream.async_add_listener(
2000+
make_bool(Signal.REAR_DEFROST_ENABLED, callback),
2001+
{"vin":self.vin, "data": {Signal.REAR_DEFROST_ENABLED: None}}
2002+
)
2003+
2004+
def listen_ChargeRateMilePerHour(self, callback: Callable[[float | None], None]) -> Callable[[],None]:
2005+
"""Listen for Charge Rate Mile Per Hour."""
2006+
self._enable_field(Signal.CHARGE_RATE_MILE_PER_HOUR)
2007+
return self.stream.async_add_listener(
2008+
make_float(Signal.CHARGE_RATE_MILE_PER_HOUR, callback),
2009+
{"vin":self.vin, "data": {Signal.CHARGE_RATE_MILE_PER_HOUR: None}}
2010+
)
2011+
18772012

18782013
def make_int(signal: Signal, callback: Callable[[int | None], None]) -> Callable[[dict], None]:
18792014
"""Listener factory"""

0 commit comments

Comments
 (0)