From 1206a18e22aa64a02b19a86cee967e3f749b3548 Mon Sep 17 00:00:00 2001 From: Giulio De Pasquale Date: Mon, 9 Dec 2024 14:17:06 +0000 Subject: [PATCH] feat(home-assistant): add MQTT support and Teslamate connection --- hosts/architect/homeassistant.nix | 1054 +++++++++++++++++++++++++++++ hosts/architect/teslamate.nix | 12 +- 2 files changed, 1064 insertions(+), 2 deletions(-) diff --git a/hosts/architect/homeassistant.nix b/hosts/architect/homeassistant.nix index 187b084..446ef4c 100644 --- a/hosts/architect/homeassistant.nix +++ b/hosts/architect/homeassistant.nix @@ -2,6 +2,9 @@ let domain = "home.giugl.io"; + teslamateURL = "https://tesla.giugl.io"; + teslaModel = "Model 3 Long Range"; + teslaName = "Lady Giovanna"; in { services.home-assistant = { @@ -18,6 +21,1040 @@ in unit_system = "metric"; }; default_config = { }; + binary_sensor = [{ + 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') %}\n ON\n{% else %}\n OFF\n{% endif %}"; + }; + }; + }]; + + sensor = [{ + platform = "template"; + sensors = { + tesla_est_battery_range_mi = { + friendly_name = "Estimated Range (mi)"; + unit_of_measurement = "mi"; + icon_template = "mdi:gauge"; + availability_template = "{{ has_value('sensor.tesla_est_battery_range_km') }}"; + value_template = "{% if has_value('sensor.tesla_est_battery_range_km') %}\n {{ (states('sensor.tesla_est_battery_range_km') | float / 1.609344) | round(2) }}\n{% endif %}\n"; + }; + tesla_rated_battery_range_mi = { + friendly_name = "Rated Range (mi)"; + unit_of_measurement = "mi"; + icon_template = "mdi:gauge"; + availability_template = "{{ has_value('sensor.tesla_rated_battery_range_km') }}"; + value_template = "{% if has_value('sensor.tesla_rated_battery_range_km') %}\n {{ (states('sensor.tesla_rated_battery_range_km') | float / 1.609344) | round(2) }}\n{% endif %}\n"; + }; + tesla_ideal_battery_range_mi = { + friendly_name = "Ideal Range (mi)"; + unit_of_measurement = "mi"; + icon_template = "mdi:gauge"; + availability_template = "{{ has_value('sensor.tesla_ideal_battery_range_km') }}"; + value_template = "{% if has_value('sensor.tesla_ideal_battery_range_km') %}\n {{ (states('sensor.tesla_ideal_battery_range_km') | float / 1.609344) | round(2) }}\n{% endif %}\n"; + }; + tesla_odometer_mi = { + friendly_name = "Odometer (mi)"; + unit_of_measurement = "mi"; + icon_template = "mdi:counter"; + availability_template = "{{ has_value('sensor.tesla_odometer') }}"; + value_template = "{% if has_value('sensor.tesla_odometer') %}\n {{ (states('sensor.tesla_odometer') | float / 1.609344) | round(2) }}\n{% endif %}\n"; + }; + tesla_speed_mph = { + friendly_name = "Speed (MPH)"; + unit_of_measurement = "mph"; + icon_template = "mdi:speedometer"; + availability_template = "{{ has_value('sensor.tesla_speed') }}"; + value_template = "{% if has_value('sensor.tesla_speed') %}\n {{ (states('sensor.tesla_speed') | float / 1.609344) | round(2) }}\n{% endif %}\n"; + }; + tesla_elevation_ft = { + friendly_name = "Elevation (ft)"; + unit_of_measurement = "ft"; + icon_template = "mdi:image-filter-hdr"; + availability_template = "{{ has_value('sensor.tesla_elevation') }}"; + value_template = "{% if has_value('sensor.tesla_elevation') %}\n {{ (states('sensor.tesla_elevation') | float * 3.2808) | round(2) }}\n{% endif %}\n"; + }; + tesla_tpms_pressure_fl_psi = { + friendly_name = "Front Left Tire Pressure (psi)"; + unit_of_measurement = "psi"; + icon_template = "mdi:car-tire-alert"; + availability_template = "{{ has_value('sensor.tesla_tpms_fl') }}"; + value_template = "{% if has_value('sensor.tesla_tpms_fl') %}\n {{ (states('sensor.tesla_tpms_fl') | float * 14.50377) | round(2) }}\n{% endif %}\n"; + }; + tesla_tpms_pressure_fr_psi = { + friendly_name = "Front Right Tire Pressure (psi)"; + unit_of_measurement = "psi"; + icon_template = "mdi:car-tire-alert"; + availability_template = "{{ has_value('sensor.tesla_tpms_fr') }}"; + value_template = "{% if has_value('sensor.tesla_tpms_fr') %}\n {{ (states('sensor.tesla_tpms_fr') | float * 14.50377) | round(2) }}\n{% endif %}\n"; + }; + tesla_tpms_pressure_rl_psi = { + friendly_name = "Rear Left Tire Pressure (psi)"; + unit_of_measurement = "psi"; + icon_template = "mdi:car-tire-alert"; + availability_template = "{{ has_value('sensor.tesla_tpms_rl') }}"; + value_template = "{% if has_value('sensor.tesla_tpms_rl') %}\n {{ (states('sensor.tesla_tpms_rl') | float * 14.50377) | round(2) }}\n{% endif %}\n"; + }; + tesla_tpms_pressure_rr_psi = { + friendly_name = "Rear Right Tire Pressure (psi)"; + unit_of_measurement = "psi"; + icon_template = "mdi:car-tire-alert"; + availability_template = "{{ has_value('sensor.tesla_tpms_rr') }}"; + value_template = "{% if has_value('sensor.tesla_tpms_rr') %}\n {{ (states('sensor.tesla_tpms_rr') | float * 14.50377) | round(2) }}\n{% endif %}\n"; + }; + tesla_active_route_distance_to_arrival_km = { + friendly_name = "Active route distance to arrival (km)"; + unit_of_measurement = "km"; + icon_template = "mdi:map-marker-distance"; + availability_template = "{{ has_value('sensor.tesla_active_route_distance_to_arrival_mi') }}"; + value_template = "{% if has_value('sensor.tesla_active_route_distance_to_arrival_mi') %}\n {{ (states('sensor.tesla_active_route_distance_to_arrival_mi') | float * 1.609344) | round(2) }}\n{% endif %}"; + }; + }; + }]; + + mqtt = [ + { + sensor = { + name = "Display Name"; + object_id = "tesla_display_name"; + unique_id = "teslamate_1_display_name"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + name = teslaName; + }; + state_topic = "teslamate/cars/1/display_name"; + icon = "mdi:car"; + }; + } + { + device_tracker = { + name = "Location"; + object_id = "tesla_location"; + unique_id = "teslamate_1_location"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + json_attributes_topic = "teslamate/cars/1/location"; + icon = "mdi:crosshairs-gps"; + }; + } + { + device_tracker = { + name = "Active route location"; + object_id = "tesla_active_route_location"; + unique_id = "teslamate_1_active_route_location"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + json_attributes_topic = "teslamate/cars/1/active_route"; + json_attributes_template = "{% if not value_json.error and value_json.location %}\n {{ value_json.location | tojson }}\n{% else %}\n {}\n{% endif %}\n"; + icon = "mdi:crosshairs-gps"; + }; + } + { + sensor = { + name = "State"; + object_id = "tesla_state"; + unique_id = "teslamate_1_state"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/state"; + icon = "mdi:car-connected"; + }; + } + { + sensor = { + name = "Since"; + object_id = "tesla_since"; + unique_id = "teslamate_1_since"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/since"; + device_class = "timestamp"; + icon = "mdi:clock-outline"; + }; + } + { + sensor = { + name = "Version"; + object_id = "tesla_version"; + unique_id = "teslamate_1_version"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/version"; + icon = "mdi:alphabetical"; + }; + } + { + sensor = { + name = "Update Version"; + object_id = "tesla_update_version"; + unique_id = "teslamate_1_update_version"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/update_version"; + icon = "mdi:alphabetical"; + }; + } + { + sensor = { + name = "Model"; + object_id = "tesla_model"; + unique_id = "teslamate_1_model"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/model"; + }; + } + { + sensor = { + name = "Trim Badging"; + object_id = "tesla_trim_badging"; + unique_id = "teslamate_1_trim_badging"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/trim_badging"; + icon = "mdi:shield-star-outline"; + }; + } + { + sensor = { + name = "Exterior Color"; + object_id = "tesla_exterior_color"; + unique_id = "teslamate_1_exterior_color"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/exterior_color"; + icon = "mdi:palette"; + }; + } + { + sensor = { + name = "Wheel Type"; + object_id = "tesla_wheel_type"; + unique_id = "teslamate_1_wheel_type"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/wheel_type"; + }; + } + { + sensor = { + name = "Spoiler Type"; + object_id = "tesla_spoiler_type"; + unique_id = "teslamate_1_spoiler_type"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/spoiler_type"; + icon = "mdi:car-sports"; + }; + } + { + sensor = { + name = "Geofence"; + object_id = "tesla_geofence"; + unique_id = "teslamate_1_geofence"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/geofence"; + icon = "mdi:earth"; + }; + } + { + sensor = { + name = "Shift State"; + object_id = "tesla_shift_state"; + unique_id = "teslamate_1_shift_state"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/shift_state"; + icon = "mdi:car-shift-pattern"; + }; + } + { + sensor = { + name = "Power"; + object_id = "tesla_power"; + unique_id = "teslamate_1_power"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/power"; + device_class = "power"; + unit_of_measurement = "kW"; + icon = "mdi:flash"; + }; + } + { + sensor = { + name = "Speed"; + object_id = "tesla_speed"; + unique_id = "teslamate_1_speed"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/speed"; + unit_of_measurement = "km/h"; + icon = "mdi:speedometer"; + }; + } + { + sensor = { + name = "Heading"; + object_id = "tesla_heading"; + unique_id = "teslamate_1_heading"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/heading"; + unit_of_measurement = "°"; + icon = "mdi:compass"; + }; + } + { + sensor = { + name = "Elevation"; + object_id = "tesla_elevation"; + unique_id = "teslamate_1_elevation"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/elevation"; + unit_of_measurement = "m"; + icon = "mdi:image-filter-hdr"; + }; + } + { + sensor = { + name = "Inside Temp"; + object_id = "tesla_inside_temp"; + unique_id = "teslamate_1_inside_temp"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/inside_temp"; + device_class = "temperature"; + unit_of_measurement = "°C"; + icon = "mdi:thermometer-lines"; + }; + } + { + sensor = { + name = "Outside Temp"; + object_id = "tesla_outside_temp"; + unique_id = "teslamate_1_outside_temp"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/outside_temp"; + device_class = "temperature"; + unit_of_measurement = "°C"; + icon = "mdi:thermometer-lines"; + }; + } + { + sensor = { + name = "Odometer"; + object_id = "tesla_odometer"; + unique_id = "teslamate_1_odometer"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/odometer"; + unit_of_measurement = "km"; + icon = "mdi:counter"; + }; + } + { + sensor = { + name = "Est Battery Range"; + object_id = "tesla_est_battery_range_km"; + unique_id = "teslamate_1_est_battery_range_km"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/est_battery_range_km"; + unit_of_measurement = "km"; + icon = "mdi:gauge"; + }; + } + { + sensor = { + name = "Rated Battery Range"; + object_id = "tesla_rated_battery_range_km"; + unique_id = "teslamate_1_rated_battery_range_km"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/rated_battery_range_km"; + unit_of_measurement = "km"; + icon = "mdi:gauge"; + }; + } + { + sensor = { + name = "Ideal Battery Range"; + object_id = "tesla_ideal_battery_range_km"; + unique_id = "teslamate_1_ideal_battery_range_km"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/ideal_battery_range_km"; + unit_of_measurement = "km"; + icon = "mdi:gauge"; + }; + } + { + sensor = { + name = "Battery Level"; + object_id = "tesla_battery_level"; + unique_id = "teslamate_1_battery_level"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/battery_level"; + device_class = "battery"; + unit_of_measurement = "%"; + icon = "mdi:battery-80"; + }; + } + { + sensor = { + name = "Usable Battery Level"; + object_id = "tesla_usable_battery_level"; + unique_id = "teslamate_1_usable_battery_level"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/usable_battery_level"; + unit_of_measurement = "%"; + icon = "mdi:battery-80"; + }; + } + { + sensor = { + name = "Charge Energy Added"; + object_id = "tesla_charge_energy_added"; + unique_id = "teslamate_1_charge_energy_added"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charge_energy_added"; + device_class = "energy"; + unit_of_measurement = "kWh"; + icon = "mdi:battery-charging"; + }; + } + { + sensor = { + name = "Charge Limit Soc"; + object_id = "tesla_charge_limit_soc"; + unique_id = "teslamate_1_charge_limit_soc"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charge_limit_soc"; + unit_of_measurement = "%"; + icon = "mdi:battery-charging-100"; + }; + } + { + sensor = { + name = "Charger Actual Current"; + object_id = "tesla_charger_actual_current"; + unique_id = "teslamate_1_charger_actual_current"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charger_actual_current"; + device_class = "current"; + unit_of_measurement = "A"; + icon = "mdi:lightning-bolt"; + }; + } + { + sensor = { + name = "Charger Phases"; + object_id = "tesla_charger_phases"; + unique_id = "teslamate_1_charger_phases"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charger_phases"; + icon = "mdi:sine-wave"; + }; + } + { + sensor = { + name = "Charger Power"; + object_id = "tesla_charger_power"; + unique_id = "teslamate_1_charger_power"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charger_power"; + device_class = "power"; + unit_of_measurement = "kW"; + icon = "mdi:lightning-bolt"; + }; + } + { + sensor = { + name = "Charger Voltage"; + object_id = "tesla_charger_voltage"; + unique_id = "teslamate_1_charger_voltage"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/charger_voltage"; + device_class = "voltage"; + unit_of_measurement = "V"; + icon = "mdi:lightning-bolt"; + }; + } + { + sensor = { + name = "Scheduled Charging Start Time"; + object_id = "tesla_scheduled_charging_start_time"; + unique_id = "teslamate_1_scheduled_charging_start_time"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/scheduled_charging_start_time"; + device_class = "timestamp"; + icon = "mdi:clock-outline"; + }; + } + { + sensor = { + name = "Time To Full Charge"; + object_id = "tesla_time_to_full_charge"; + unique_id = "teslamate_1_time_to_full_charge"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/time_to_full_charge"; + unit_of_measurement = "h"; + icon = "mdi:clock-outline"; + }; + } + { + sensor = { + name = "TPMS Pressure Front Left"; + object_id = "tesla_tpms_pressure_fl"; + unique_id = "teslamate_1_tpms_pressure_fl"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/tpms_pressure_fl"; + unit_of_measurement = "bar"; + icon = "mdi:car-tire-alert"; + }; + } + { + sensor = { + name = "TPMS Pressure Front Right"; + object_id = "tesla_tpms_pressure_fr"; + unique_id = "teslamate_1_tpms_pressure_fr"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/tpms_pressure_fr"; + unit_of_measurement = "bar"; + icon = "mdi:car-tire-alert"; + }; + } + { + sensor = { + name = "TPMS Pressure Rear Left"; + object_id = "tesla_tpms_pressure_rl"; + unique_id = "teslamate_1_tpms_pressure_rl"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/tpms_pressure_rl"; + unit_of_measurement = "bar"; + icon = "mdi:car-tire-alert"; + }; + } + { + sensor = { + name = "TPMS Pressure Rear Right"; + object_id = "tesla_tpms_pressure_rr"; + unique_id = "teslamate_1_tpms_pressure_rr"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/tpms_pressure_rr"; + unit_of_measurement = "bar"; + icon = "mdi:car-tire-alert"; + }; + } + { + sensor = { + name = "Active route destination"; + object_id = "tesla_active_route_destination"; + unique_id = "teslamate_1_active_route_destination"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/active_route"; + value_template = "{% if not value_json.error and value_json.destination %}\n {{ value_json.destination }}\n{% endif %}\n"; + icon = "mdi:map-marker"; + }; + } + { + sensor = { + name = "Active route energy at arrival"; + object_id = "tesla_active_route_energy_at_arrival"; + unique_id = "teslamate_1_active_route_energy_at_arrival"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/active_route"; + value_template = "{% if not value_json.error and value_json.energy_at_arrival %}\n {{ value_json.energy_at_arrival }}\n{% endif %}\n"; + unit_of_measurement = "%"; + icon = "mdi:battery-80"; + }; + } + { + sensor = { + name = "Active route distance to arrival (mi)"; + object_id = "tesla_active_route_distance_to_arrival_mi"; + unique_id = "teslamate_1_active_route_distance_to_arrival_mi"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/active_route"; + value_template = "{% if not value_json.error and value_json.miles_to_arrival %}\n {{ value_json.miles_to_arrival }}\n{% endif %}\n"; + unit_of_measurement = "mi"; + icon = "mdi:map-marker-distance"; + }; + } + { + sensor = { + name = "Active route minutes to arrival"; + object_id = "tesla_active_route_minutes_to_arrival"; + unique_id = "teslamate_1_active_route_minutes_to_arrival"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/active_route"; + value_template = "{% if not value_json.error and value_json.minutes_to_arrival %}\n {{ value_json.minutes_to_arrival }}\n{% endif %}\n"; + unit_of_measurement = "min"; + icon = "mdi:clock-outline"; + }; + } + { + sensor = { + name = "Active route traffic minutes delay"; + object_id = "tesla_active_route_traffic_minutes_delay"; + unique_id = "teslamate_1_active_route_traffic_minutes_delay"; + availability = [{ + topic = "teslamate/cars/1/active_route"; + value_template = "{{ 'offline' if value_json.error else 'online' }}"; + }]; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/active_route"; + value_template = "{% if not value_json.error and value_json.traffic_minutes_delay %}\n {{ value_json.traffic_minutes_delay }}\n{% endif %}\n"; + unit_of_measurement = "min"; + icon = "mdi:clock-alert-outline"; + }; + } + { + binary_sensor = { + name = "Healthy"; + object_id = "tesla_healthy"; + unique_id = "teslamate_1_healthy"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/healthy"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:heart-pulse"; + }; + } + { + binary_sensor = { + name = "Update Available"; + object_id = "tesla_update_available"; + unique_id = "teslamate_1_update_available"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/update_available"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:alarm"; + }; + } + { + binary_sensor = { + name = "Locked"; + object_id = "tesla_locked"; + unique_id = "teslamate_1_locked"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "lock"; + state_topic = "teslamate/cars/1/locked"; + payload_on = "false"; + payload_off = "true"; + }; + } + { + binary_sensor = { + name = "Sentry Mode"; + object_id = "tesla_sentry_mode"; + unique_id = "teslamate_1_sentry_mode"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/sentry_mode"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:cctv"; + }; + } + { + binary_sensor = { + name = "Windows Open"; + object_id = "tesla_windows_open"; + unique_id = "teslamate_1_windows_open"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "window"; + state_topic = "teslamate/cars/1/windows_open"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:car-door"; + }; + } + { + binary_sensor = { + name = "Doors Open"; + object_id = "tesla_doors_open"; + unique_id = "teslamate_1_doors_open"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "door"; + state_topic = "teslamate/cars/1/doors_open"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:car-door"; + }; + } + { + binary_sensor = { + name = "Trunk Open"; + object_id = "tesla_trunk_open"; + unique_id = "teslamate_1_trunk_open"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "opening"; + state_topic = "teslamate/cars/1/trunk_open"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:car-side"; + }; + } + { + binary_sensor = { + name = "Frunk Open"; + object_id = "tesla_frunk_open"; + unique_id = "teslamate_1_frunk_open"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "opening"; + state_topic = "teslamate/cars/1/frunk_open"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:car-side"; + }; + } + { + binary_sensor = { + name = "Is User Present"; + object_id = "tesla_is_user_present"; + unique_id = "teslamate_1_is_user_present"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "presence"; + state_topic = "teslamate/cars/1/is_user_present"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:human-greeting"; + }; + } + { + binary_sensor = { + name = "Is Climate On"; + object_id = "tesla_is_climate_on"; + unique_id = "teslamate_1_is_climate_on"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/is_climate_on"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:fan"; + }; + } + { + binary_sensor = { + name = "Is Preconditioning"; + object_id = "tesla_is_preconditioning"; + unique_id = "teslamate_1_is_preconditioning"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + state_topic = "teslamate/cars/1/is_preconditioning"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:fan"; + }; + } + { + binary_sensor = { + name = "Plugged In"; + object_id = "tesla_plugged_in"; + unique_id = "teslamate_1_plugged_in"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "plug"; + state_topic = "teslamate/cars/1/plugged_in"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:ev-station"; + }; + } + { + binary_sensor = { + name = "Charge Port Door OPEN"; + object_id = "tesla_charge_port_door_open"; + unique_id = "teslamate_1_charge_port_door_open"; + device = { + identifiers = [ "teslamate_car_1" ]; + configuration_url = teslamateURL; + manufacturer = "Tesla"; + model = teslaModel; + }; + device_class = "opening"; + state_topic = "teslamate/cars/1/charge_port_door_open"; + payload_on = "true"; + payload_off = "false"; + icon = "mdi:ev-plug-tesla"; + }; + } + ]; }; extraComponents = [ "otbr" @@ -36,6 +1073,11 @@ in "isal" "radarr" "sonarr" + "mqtt" + "mqtt_eventstream" + "mqtt_json" + "mqtt_room" + "mqtt_statestream" ]; extraPackages = python3Packages: with python3Packages; [ pkgs.openai-whisper @@ -45,6 +1087,18 @@ in ]; }; + services.mosquitto = { + enable = true; + listeners = [ + { + # address = "127.0.0.1"; + acl = [ "pattern readwrite #" ]; + omitPasswordAuth = true; + settings.allow_anonymous = true; + } + ]; + }; + architect.vhost.${domain} = with config.architect.networks; { dnsInterfaces = [ "tailscale" "lan" ]; diff --git a/hosts/architect/teslamate.nix b/hosts/architect/teslamate.nix index b054ea7..684b746 100644 --- a/hosts/architect/teslamate.nix +++ b/hosts/architect/teslamate.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, ... }: let domain = "tesla.giugl.io"; @@ -51,6 +51,14 @@ in secretsFile = config.age.secrets.teslamate.path; virtualHost = domain; postgres.enable_server = true; - grafana = { enable = true; port = grafanaPort; listenAddress = "127.0.0.1"; urlPath = "/grafana"; }; + grafana = { + enable = true; + port = grafanaPort; + listenAddress = "127.0.0.1"; + urlPath = "/grafana"; + }; + mqtt = { + enable = true; + }; }; }