Skip to main content

HomeAssistant Integration

Whilst HomeAssistant provides an official component for Tesla vehicles, the component has not been updated recently, and does not have the sophistication of TeslaMate's polling mechanism, resulting in the component's default values keeping the vehicle awake and draining the battery.

The ultimate goal of this guide is to consume as much of the TeslaMate polling data as possible to replace the majority of the official Tesla component's polling functionality.

If your intention is to only use read-only sensor values, those provided by TeslaMate via MQTT are sufficient, and you do not need to utilise the official Tesla component. If however you would like to be able to write values to the Tesla API (Lock/Unlock Doors or automate Climate), there is a solution which involves configuring an extremely high polling interval for the Tesla component and using automation to populate the values from the TeslaMate MQTT parameters.

Screenshots

HASS Screenshot

Current Status

  • Sensors: All sensors exposed by the Tesla component are available
  • Locks: Not implemented
  • Climate: Not implemented

Configuration#

automation.yaml#

The following provides an automation to update the location of the device_tracker.tesla_location tracker when new lat/lon values are published to MQTT. You can use this to:

  • Plot the location of your Tesla on a map (see the ui-lovelace.yaml file for an example of this)
  • Calculate the proximity of your Tesla to another location such as home (see configuration.yaml, below)
automation.yaml
- alias: Update Tesla location as MQTT location updates  initial_state: on  trigger:    - platform: mqtt      topic: teslamate/cars/1/latitude    - platform: mqtt      topic: teslamate/cars/1/longitude  action:    - service: device_tracker.see      data_template:        dev_id: tesla_location        gps:          [            "{{ states.sensor.tesla_latitude.state }}",            "{{ states.sensor.tesla_longitude.state }}",          ]

configuration.yaml#

Proximity sensors allow us to calculate the proximity of the Tesla device_tracker to defined zones. This can be useful for:

  • Automatic Garage Door opening when you arrive home
  • Notifications when the vehicle is arriving
configuration.yaml
automation: !include automation.yaml
proximity:  home_tesla:    zone: home    devices:      - device_tracker.tesla_location    tolerance: 10    unit_of_measurement: km
tesla:  username: !secret tesla_username  password: !secret tesla_password  scan_interval: 3600
sensor: !include sensor.yaml
binary_sensor: !include binary_sensor.yaml

known_devices.yaml (define a tracker for Tesla)#

This is required for the automation above (in the automation.yaml section). It defines the device_tracker object that we use to represent the location of your Tesla vehicle.

known_devices.yaml
tesla_location:  hide_if_away: false  icon: mdi:car  mac:  name: Tesla  picture:  track: true

sensor.yaml (sensor: section of configuration.yaml)#

sensor.yaml
 - platform: template   sensors:    tesla_est_battery_range_mi:      friendly_name: Estimated Range (mi)      unit_of_measurement: mi      icon_template: mdi:gauge      value_template: >       {{ (states('sensor.tesla_est_battery_range_km') | float / 1.609) | round(2) }}
    tesla_rated_battery_range_mi:      friendly_name: Rated Range (mi)      unit_of_measurement: mi      icon_template: mdi:gauge      value_template: >       {{ (states('sensor.tesla_rated_battery_range_km') | float / 1.609) | round(2) }}
    tesla_ideal_battery_range_mi:      friendly_name: Ideal Range (mi)      unit_of_measurement: mi      icon_template: mdi:gauge      value_template: >       {{ (states('sensor.tesla_ideal_battery_range_km') | float / 1.609) | round(2) }}
    tesla_odometer_mi:      friendly_name: Odometer (mi)      unit_of_measurement: mi      icon_template: mdi:counter      value_template: >       {{ (states('sensor.tesla_odometer') | float / 1.609) | round(2) }}
    tesla_speed_mph:      friendly_name: Speed (MPH)      unit_of_measurement: mph      icon_template: mdi:speedometer      value_template: >       {{ (states('sensor.tesla_speed') | float / 1.609) | round(2) }}
    tesla_elevation_ft:      friendly_name: Elevation (ft)      unit_of_measurement: ft      icon_template: mdi:image-filter-hdr      value_template: >       {{ (states('sensor.tesla_elevation') | float * 3.2808 ) | round(2) }}
 - platform: mqtt   name: tesla_display_name   state_topic: "teslamate/cars/1/display_name"   icon: mdi:car
 - platform: mqtt   name: tesla_state   state_topic: "teslamate/cars/1/state"   icon: mdi:car-connected
 - platform: mqtt   name: tesla_since   state_topic: "teslamate/cars/1/since"   device_class: timestamp   icon: mdi:clock-outline
 - platform: mqtt   name: tesla_version   state_topic: "teslamate/cars/1/version"   icon: mdi:alphabetical
 - platform: mqtt   name: tesla_update_version   state_topic: "teslamate/cars/1/update_version"   icon: mdi:alphabetical
 - platform: mqtt   name: tesla_model   state_topic: "teslamate/cars/1/model"
 - platform: mqtt   name: tesla_trim_badging   state_topic: "teslamate/cars/1/trim_badging"   icon: mdi:shield-star-outline
 - platform: mqtt   name: tesla_exterior_color   state_topic: "teslamate/cars/1/exterior_color"   icon: mdi:palette
 - platform: mqtt   name: tesla_wheel_type   state_topic: "teslamate/cars/1/wheel_type"
 - platform: mqtt   name: tesla_spoiler_type   state_topic: "teslamate/cars/1/spoiler_type"   icon: mdi:car-sports
 - platform: mqtt   name: tesla_geofence   state_topic: "teslamate/cars/1/geofence"   icon: mdi:earth
 - platform: mqtt   name: tesla_latitude   state_topic: "teslamate/cars/1/latitude"   unit_of_measurement: °   icon: mdi:crosshairs-gps
 - platform: mqtt   name: tesla_longitude   state_topic: "teslamate/cars/1/longitude"   unit_of_measurement: °   icon: mdi:crosshairs-gps
 - platform: mqtt   name: tesla_shift_state   state_topic: "teslamate/cars/1/shift_state"   icon: mdi:car-shift-pattern
 - platform: mqtt   name: tesla_power   state_topic: "teslamate/cars/1/power"   device_class: power   unit_of_measurement: W   icon: mdi:flash
 - platform: mqtt   name: tesla_speed   state_topic: "teslamate/cars/1/speed"   unit_of_measurement: "km/h"   icon: mdi:speedometer
 - platform: mqtt   name: tesla_heading   state_topic: "teslamate/cars/1/heading"   unit_of_measurement: °   icon: mdi:compass
 - platform: mqtt   name: tesla_elevation   state_topic: "teslamate/cars/1/elevation"   unit_of_measurement: m   icon: mdi:image-filter-hdr
 - platform: mqtt   name: tesla_inside_temp   state_topic: "teslamate/cars/1/inside_temp"   device_class: temperature   unit_of_measurement: °C   icon: mdi:thermometer-lines
 - platform: mqtt   name: tesla_outside_temp   state_topic: "teslamate/cars/1/outside_temp"   device_class: temperature   unit_of_measurement: °C   icon: mdi:thermometer-lines
 - platform: mqtt   name: tesla_odometer   state_topic: "teslamate/cars/1/odometer"   unit_of_measurement: km   icon: mdi:counter
 - platform: mqtt   name: tesla_est_battery_range_km   state_topic: "teslamate/cars/1/est_battery_range_km"   unit_of_measurement: km   icon: mdi:gauge
 - platform: mqtt   name: tesla_rated_battery_range_km   state_topic: "teslamate/cars/1/rated_battery_range_km"   unit_of_measurement: km   icon: mdi:gauge
 - platform: mqtt   name: tesla_ideal_battery_range_km   state_topic: "teslamate/cars/1/ideal_battery_range_km"   unit_of_measurement: km   icon: mdi:gauge
 - platform: mqtt   name: tesla_battery_level   state_topic: "teslamate/cars/1/battery_level"   device_class: battery   unit_of_measurement: "%"   icon: mdi:battery-80    - platform: mqtt   name: tesla_usable_battery_level   state_topic: "teslamate/cars/1/usable_battery_level"   unit_of_measurement: "%"   icon: mdi:battery-80
 - platform: mqtt   name: tesla_charge_energy_added   state_topic: "teslamate/cars/1/charge_energy_added"   device_class: energy   unit_of_measurement: kWh   icon: mdi:battery-charging
 - platform: mqtt   name: tesla_charge_limit_soc   state_topic: "teslamate/cars/1/charge_limit_soc"   unit_of_measurement: "%"   icon: mdi:battery-charging-100
 - platform: mqtt   name: tesla_charger_actual_current   state_topic: "teslamate/cars/1/charger_actual_current"   device_class: current   unit_of_measurement: A   icon: mdi:lightning-bolt
 - platform: mqtt   name: tesla_charger_phases   state_topic: "teslamate/cars/1/charger_phases"   icon: mdi:sine-wave
 - platform: mqtt   name: tesla_charger_power   state_topic: "teslamate/cars/1/charger_power"   device_class: power   unit_of_measurement: kW   icon: mdi:lightning-bolt
 - platform: mqtt   name: tesla_charger_voltage   state_topic: "teslamate/cars/1/charger_voltage"   device_class: voltage   unit_of_measurement: V   icon: mdi:lightning-bolt
 - platform: mqtt   name: tesla_scheduled_charging_start_time   state_topic: "teslamate/cars/1/scheduled_charging_start_time"   icon: mdi:clock-outline
 - platform: mqtt   name: tesla_time_to_full_charge   state_topic: "teslamate/cars/1/time_to_full_charge"   unit_of_measurement: h   icon: mdi:clock-outline

binary_sensor.yaml (binary_sensor: section of configuration.yaml)#

binary_sensor.yaml
 - platform: template   sensors:    tesla_park_brake:      friendly_name: Parking Brake      icon_template: mdi:car-brake-parking      value_template: >-       {% if is_state('sensor.tesla_shift_state', 'P') %}         ON       {% else %}         OFF       {% endif %}
 - platform: mqtt   name: tesla_healthy   state_topic: "teslamate/cars/1/healthy"   payload_on: "true"   payload_off: "false"   icon: mdi:heart-pulse
 - platform: mqtt   name: tesla_update_available   state_topic: "teslamate/cars/1/update_available"   payload_on: "true"   payload_off: "false"   icon: mdi:alarm  - platform: mqtt   name: tesla_locked   device_class: lock   state_topic: "teslamate/cars/1/locked"   payload_on: "false"   payload_off: "true"
 - platform: mqtt   name: tesla_sentry_mode   state_topic: "teslamate/cars/1/sentry_mode"   payload_on: "true"   payload_off: "false"   icon: mdi:cctv
 - platform: mqtt   name: tesla_windows_open   device_class: window   state_topic: "teslamate/cars/1/windows_open"   payload_on: "true"   payload_off: "false"   icon: mdi:car-door
 - platform: mqtt   name: tesla_doors_open   device_class: door   state_topic: "teslamate/cars/1/doors_open"   payload_on: "true"   payload_off: "false"   icon: mdi:car-door
 - platform: mqtt   name: tesla_trunk_open   device_class: opening   state_topic: "teslamate/cars/1/trunk_open"   payload_on: "true"   payload_off: "false"   icon: mdi:car-side
 - platform: mqtt   name: tesla_frunk_open   device_class: opening   state_topic: "teslamate/cars/1/frunk_open"   payload_on: "true"   payload_off: "false"   icon: mdi:car-side
 - platform: mqtt   name: tesla_is_user_present   device_class: presence   state_topic: "teslamate/cars/1/is_user_present"   payload_on: "true"   payload_off: "false"   icon: mdi:human-greeting
 - platform: mqtt   name: tesla_is_climate_on   state_topic: "teslamate/cars/1/is_climate_on"   payload_on: "true"   payload_off: "false"   icon: mdi:fan
 - platform: mqtt   name: tesla_is_preconditioning   state_topic: "teslamate/cars/1/is_preconditioning"   payload_on: "true"   payload_off: "false"   icon: mdi:fan
 - platform: mqtt   name: tesla_plugged_in   device_class: plug   state_topic: "teslamate/cars/1/plugged_in"   payload_on: "true"   payload_off: "false"   icon: mdi:ev-station
 - platform: mqtt   name: tesla_charge_port_door_open   device_class: opening   state_topic: "teslamate/cars/1/charge_port_door_open"   payload_on: "true"   payload_off: "false"   icon: mdi:ev-plug-tesla

ui-lovelace.yaml#

The below is the Lovelace UI configuration used to make the example screenshot above. You will obviously want to configure this to your liking, however the example contains all of the sensors and values presented via MQTT and could be used as the basis of UI configuration.

ui-lovelace.yaml
views:  - path: car    title: Car    badges: []    icon: mdi:car-connected    cards:      - type: vertical-stack        cards:          - type: glance            entities:              - entity: sensor.tesla_battery_level                name: Battery Level              - entity: sensor.tesla_state                name: Car State              - entity: binary_sensor.tesla_plugged_in                name: Plugged In          - type: glance            entities:              - entity: binary_sensor.tesla_park_brake                name: Park Brake              - entity: binary_sensor.tesla_sentry_mode                name: Sentry Mode              - entity: sensor.tesla_speed                name: Speed          - type: glance            entities:              - entity: binary_sensor.tesla_healthy                name: Car Health              - entity: binary_sensor.tesla_windows_open                name: Window Status          - type: horizontal-stack            cards:              - type: button                entity: binary_sensor.tesla_locked                name: Charger Door                show_state: true                state:                  - value: locked                    icon: mdi:lock                    color: green                    tap_action:                      action: call-service                      service: lock.unlock                      service_data:                        entity_id: lock.tesla_model_3_charger_door_lock                  - value: unlocked                    icon: mdi:lock-open                    color: red                    tap_action:                      action: call-service                      service: lock.lock                      service_data:                        entity_id: lock.tesla_model_3_charger_door_lock              - type: button                entity: lock.tesla_door_lock                name: Car Door                show_state: true                state:                  - value: locked                    icon: mdi:lock                    color: green                    tap_action:                      action: call-service                      service: lock.unlock                      service_data:                        entity_id: lock.tesla_model_3_door_lock                  - value: unlocked                    icon: mdi:lock-open                    color: red                    tap_action:                      action: call-service                      service: lock.lock                      service_data:                        entity_id: lock.tesla_model_3_door_lock      - type: vertical-stack        cards:          - type: map            dark_mode: true            default_zoom: 12            entities:              - device_tracker.tesla_location          - type: thermostat            entity: climate.tesla_model_3_hvac_climate_system      - type: entities        entities:          - entity: sensor.tesla_display_name            name: Name          - entity: sensor.tesla_state            name: Status          - entity: sensor.tesla_since            name: Last Status Change          - entity: binary_sensor.tesla_healthy            name: Logger Healthy          - entity: sensor.tesla_version            name: Software Version          - entity: binary_sensor.tesla_update_available            name: Available Update Status          - entity: sensor.tesla_update_version            name: Available Update Version          - entity: sensor.tesla_model            name: Tesla Model          - entity: sensor.tesla_trim_badging            name: Trim Badge          - entity: sensor.tesla_exterior_color            name: Exterior Color          - entity: sensor.tesla_wheel_type            name: Wheel Type          - entity: sensor.tesla_spoiler_type            name: Spoiler Type          - entity: sensor.tesla_geofence            name: Geo-fence Name          - entity: proximity.home_tesla            name: Distance to Home          - entity: sensor.tesla_latitude            name: Latitude          - entity: sensor.tesla_longitude            name: Longitude          - entity: sensor.tesla_shift_state            name: Shifter State          - entity: sensor.tesla_speed            name: Speed          - entity: sensor.tesla_speed_mph            name: Speed (MPH)          - entity: sensor.tesla_heading            name: Heading          - entity: sensor.tesla_elevation            name: Elevation (m)          - entity: sensor.tesla_elevation_ft            name: Elevation (ft)          - entity: binary_sensor.tesla_locked            name: Locked          - entity: binary_sensor.tesla_sentry_mode            name: Sentry Mode Enabled          - entity: binary_sensor.tesla_windows_open            name: Windows Open          - entity: binary_sensor.tesla_doors_open            name: Doors Open          - entity: binary_sensor.tesla_trunk_open            name: Trunk Open          - entity: binary_sensor.tesla_frunk_open            name: Frunk Open          - entity: binary_sensor.tesla_is_user_present            name: User Present          - entity: binary_sensor.tesla_is_climate_on            name: Climate On          - entity: sensor.tesla_inside_temp            name: Inside Temperature          - entity: sensor.tesla_outside_temp            name: Outside Temperature          - entity: binary_sensor.tesla_is_preconditioning            name: Preconditioning          - entity: sensor.tesla_odometer            name: Odometer          - entity: sensor.tesla_odometer_mi            name: Odometer (miles)          - entity: sensor.tesla_est_battery_range_km            name: Battery Range (km)          - entity: sensor.tesla_est_battery_range_mi            name: Estimated Battery Range (mi)          - entity: sensor.tesla_rated_battery_range_km            name: Rated Battery Range (km)          - entity: sensor.tesla_rated_battery_range_mi            name: Rated Battery Range (mi)          - entity: sensor.tesla_ideal_battery_range_km            name: Ideal Battery Range (km)          - entity: sensor.tesla_ideal_battery_range_mi            name: Ideal Battery Range (mi)          - entity: sensor.tesla_battery_level            name: Battery Level          - entity: sensor.tesla_usable_battery_level            name: Usable Battery Level          - entity: binary_sensor.tesla_plugged_in            name: Plugged In          - entity: sensor.tesla_charge_energy_added            name: Charge Energy Added          - entity: sensor.tesla_charge_limit_soc            name: Charge Limit          - entity: binary_sensor.tesla_charge_port_door_open            name: Charge Port Door Open          - entity: sensor.tesla_charger_actual_current            name: Charger Current          - entity: sensor.tesla_charger_phases            name: Charger Phases          - entity: sensor.tesla_charger_power            name: Charger Power          - entity: sensor.tesla_charger_voltage            name: Charger Voltage          - entity: sensor.tesla_scheduled_charging_start_time            name: Scheduled Charging Start Time          - entity: sensor.tesla_time_to_full_charge            name: Time To Full Charge

Useful Automations#

The below automations leverage TeslaMate MQTT topics to provide some useful automations

Garage Door Automation based on Tesla location#

This automation triggers when the Tesla transitions from not_home to home. This means that the vehicle would have had to have been outside of the home zone previously, and returned home. You may want to add conditions here to improve accuracy, such as time of day.

automation.yaml
- alias: Open garage if car returns home  initial_state: on  trigger:    - platform: state      entity_id: device_tracker.tesla_location      from: "not_home"      to: "home"  action:    - service: switch.turn_on      entity_id: switch.garage_door_switch

Notification for Doors and Windows left open#

The following set of automations and scripts will detect when a Tesla door, frunk, trunk or window is left open. The script will notify you after the defined time period (by default, 5 minutes). If you would like to customize how the notification is performed, you can edit the notify_tesla_open script which is called by all of the four notifications.

By default, the script will repeatedly notify every 5 minutes. Remove the recursive script.turn_on sequence in the notify_tesla_open script if you'd only like to be informed once.

We add the random 30 second interval after each notification to avoid clobbering the notification script when we have multiple things open at once. For example, opening the door will open the door and the window. If we don't delay the calls, we will only get a message about the window (as it is the last call to the script) and if we then close the window, we won't get notifications about other things left open. This results in more notifications but less chance on missing out on knowing something was left open.

automation.yaml#

automation.yaml
- alias: Set timer if teslamate reports something is open to alert us  initial_state: on  trigger:    - platform: mqtt      topic: teslamate/cars/1/windows_open      payload: "true"    - platform: mqtt      topic: teslamate/cars/1/doors_open      payload: "true"    - platform: mqtt      topic: teslamate/cars/1/trunk_open      payload: "true"    - platform: mqtt      topic: teslamate/cars/1/frunk_open      payload: "true"  action:    - service: script.turn_on      data_template:        entity_id: script.notify_tesla_{{trigger.topic.split('/')[3]}}
- alias: Cancel notification if said door/window is closed  initial_state: on  trigger:    - platform: mqtt      topic: teslamate/cars/1/windows_open      payload: "false"    - platform: mqtt      topic: teslamate/cars/1/doors_open      payload: "false"    - platform: mqtt      topic: teslamate/cars/1/trunk_open      payload: "false"    - platform: mqtt      topic: teslamate/cars/1/frunk_open      payload: "false"  action:    - service: script.turn_off      data_template:        entity_id: script.notify_tesla_{{trigger.topic.split('/')[3]}}

script.yaml#

script.yaml
notify_tesla_open:  alias: "Notify when something on the tesla is left open"  sequence:    - service: notify.notify_group      data_template:        title: "Tesla Notification"        message: "You have left the {{ whatsopen }} open on the Tesla!"    - service: script.turn_on      data_template:        entity_id: script.notify_tesla_{{ whatsopen }}_open
notify_tesla_doors_open:  sequence:    - delay:        minutes: 5    - delay:        seconds: "{{ range(0, 30)|random|int }}"    - service: script.turn_on      entity_id: script.notify_tesla_open      data:        variables:          whatsopen: "doors"
notify_tesla_frunk_open:  sequence:    - delay:        minutes: 5    - delay:        seconds: "{{ range(0, 30)|random|int }}"    - service: script.turn_on      entity_id: script.notify_tesla_open      data:        variables:          whatsopen: "frunk"
notify_tesla_trunk_open:  sequence:    - delay:        minutes: 5    - delay:        seconds: "{{ range(0, 30)|random|int }}"    - service: script.turn_on      entity_id: script.notify_tesla_open      data:        variables:          whatsopen: "trunk"
notify_tesla_windows_open:  sequence:    - delay:        minutes: 5    - delay:        seconds: "{{ range(0, 30)|random|int }}"    - service: script.turn_on      entity_id: script.notify_tesla_open      data:        variables:          whatsopen: "windows"