diff --git a/lib/teslamate/mqtt/pubsub/vehicle_subscriber.ex b/lib/teslamate/mqtt/pubsub/vehicle_subscriber.ex index a8e3081a587..c770e714c93 100644 --- a/lib/teslamate/mqtt/pubsub/vehicle_subscriber.ex +++ b/lib/teslamate/mqtt/pubsub/vehicle_subscriber.ex @@ -74,6 +74,36 @@ defmodule TeslaMate.Mqtt.PubSub.VehicleSubscriber do nil end) + if state.last_summary == nil or + state.last_summary.latitude != summary.latitude or + state.last_summary.longitude != summary.longitude do + lat_lng = + case {summary.latitude, summary.longitude} do + {nil, _} -> nil + {_, nil} -> nil + {%Decimal{} = lat, %Decimal{} = lon} -> {Decimal.to_float(lat), Decimal.to_float(lon)} + {lat, lon} -> {lat, lon} + end + + case lat_lng do + nil -> + nil + + {lat, lon} -> + location = + %{ + latitude: lat, + longitude: lon + } + |> Jason.encode!() + + case publish({"location", location}, state) do + :ok -> nil + {:error, reason} -> Logger.warning("Failed to publish location: #{inspect(reason)}") + end + end + end + {:noreply, %State{state | last_summary: summary}} end diff --git a/test/teslamate/mqtt/pubsub/vehicle_subscriber_test.exs b/test/teslamate/mqtt/pubsub/vehicle_subscriber_test.exs index 9c6c720baa7..93199a7a019 100644 --- a/test/teslamate/mqtt/pubsub/vehicle_subscriber_test.exs +++ b/test/teslamate/mqtt/pubsub/vehicle_subscriber_test.exs @@ -95,6 +95,14 @@ defmodule TeslaMate.Mqtt.PubSub.VehicleSubscriberTest do assert_receive {MqttPublisherMock, {:publish, ^topic, "", [retain: true, qos: 1]}} end + assert_receive {MqttPublisherMock, + {:publish, "teslamate/cars/0/location", data, [retain: true, qos: 1]}} + + assert Jason.decode!(data) == %{ + "latitude" => 37.889602, + "longitude" => 41.129182 + } + refute_receive _ end @@ -158,7 +166,7 @@ defmodule TeslaMate.Mqtt.PubSub.VehicleSubscriberTest do geofence = %GeoFence{id: 0, name: "Home", latitude: 0.0, longitude: 0.0, radius: 20} other_geofence = %GeoFence{id: 0, name: "Work", latitude: 0.0, longitude: 0.0, radius: 20} - # Send geofence + # Send geofence send(pid, %Summary{geofence: geofence, version: "1"}) assert_receive {MqttPublisherMock, {:publish, "teslamate/cars/0/geofence", "Home", _}} assert_receive {MqttPublisherMock, {:publish, "teslamate/cars/0/version", "1", _}} diff --git a/test/teslamate/vehicles/vehicle_sync_test.exs b/test/teslamate/vehicles/vehicle_sync_test.exs index dd27138681e..4550f6656e6 100644 --- a/test/teslamate/vehicles/vehicle_sync_test.exs +++ b/test/teslamate/vehicles/vehicle_sync_test.exs @@ -149,6 +149,14 @@ defmodule TeslaMate.Vehicles.VehicleSyncTest do assert_receive {MqttPublisherMock, {:publish, ^topic, ^data, [retain: true, qos: 1]}} end + topic = "teslamate/cars/#{car.id}/location" + assert_receive {MqttPublisherMock, {:publish, ^topic, data, [retain: true, qos: 1]}} + + assert Jason.decode!(data) == %{ + "latitude" => 37.889544, + "longitude" => 41.128817 + } + refute_receive _ end end