Compare commits

...

9 Commits

Author SHA1 Message Date
83b2d14160 Update go.mod dependencies and improve vehicle retrieval error handling
Some checks failed
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 39s
Build and Push Docker Image / build-and-push (push) Failing after 10m50s
2025-07-22 16:58:09 -04:00
5db9042125 More debuging
All checks were successful
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 30s
Build and Push Docker Image / build-and-push (push) Successful in 9m54s
2025-06-09 12:48:01 -04:00
217846c17c Updated go.mod
Some checks failed
Build and Push Docker Image / build-and-push (push) Has been cancelled
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Has been cancelled
2025-06-06 17:42:43 -04:00
c4e9007d87 Fixed some issues
Some checks failed
Build and Push Docker Image / build-and-push (push) Has been cancelled
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Has been cancelled
2025-06-06 17:42:26 -04:00
118ee684ee Fixed vehicle health items reporting
All checks were successful
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 30s
Build and Push Docker Image / build-and-push (push) Successful in 9m59s
2025-06-06 12:48:35 -04:00
c7b62cc25f Bumped version to v1.1.1
All checks were successful
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 37s
Build and Push Docker Image / build-and-push (push) Successful in 9m59s
2025-06-06 12:27:31 -04:00
1011c09b29 Some fixes to the locks status reporting; Added troubles
Some checks failed
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 36s
Build and Push Docker Image / build-and-push (push) Has been cancelled
2025-06-06 12:26:39 -04:00
d04dc8c38a Added trobles sensor
All checks were successful
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 27s
Build and Push Docker Image / build-and-push (push) Successful in 9m52s
2025-06-05 18:26:16 -04:00
99090c688c Added doors lock state and change some icons 2025-06-05 18:19:12 -04:00
3 changed files with 53 additions and 26 deletions

View File

@ -20,7 +20,7 @@ import (
) )
const ( const (
AppVersion = "1.1.0" // the current application version. AppVersion = "1.1.1" // the current application version.
AppName = "mysubarumq" // the short app name AppName = "mysubarumq" // the short app name
) )

14
go.mod
View File

@ -5,7 +5,7 @@ go 1.24
replace github.com/armon/go-metrics => github.com/hashicorp/go-metrics v0.5.3 replace github.com/armon/go-metrics => github.com/hashicorp/go-metrics v0.5.3
require ( require (
git.savin.nyc/alex/mysubaru v0.0.0-20250605210309-91ab2ddf0018 git.savin.nyc/alex/mysubaru v0.0.0-20250722205404-92d4266f8b5a
github.com/eclipse/paho.mqtt.golang v1.5.0 github.com/eclipse/paho.mqtt.golang v1.5.0
github.com/hashicorp/consul/api v1.32.1 github.com/hashicorp/consul/api v1.32.1
github.com/spf13/viper v1.20.1 github.com/spf13/viper v1.20.1
@ -17,7 +17,7 @@ require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/fatih/color v1.18.0 // indirect github.com/fatih/color v1.18.0 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect github.com/gorilla/websocket v1.5.3 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
@ -38,14 +38,14 @@ require (
github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.14.0 // indirect github.com/spf13/afero v1.14.0 // indirect
github.com/spf13/cast v1.9.2 // indirect github.com/spf13/cast v1.9.2 // indirect
github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/pflag v1.0.7 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/net v0.41.0 // indirect golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.15.0 // indirect golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.26.0 // indirect golang.org/x/text v0.27.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
resty.dev/v3 v3.0.0-beta.3 // indirect resty.dev/v3 v3.0.0-beta.3 // indirect
) )

View File

@ -71,7 +71,10 @@ func (s *MySubaruClient) Init(log *slog.Logger) error {
func (s *MySubaruClient) OneTime() error { func (s *MySubaruClient) OneTime() error {
if s.config.Hassio.AutoDiscovery { if s.config.Hassio.AutoDiscovery {
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
vehicles := s.mysubaru.GetVehicles() vehicles, err := s.mysubaru.GetVehicles()
if err != nil {
s.log.Error("couldn't get vehicles from MySubaru", "error", err.Error())
}
for _, vehicle := range vehicles { for _, vehicle := range vehicles {
err := s.bus.Publish("mqtt:publish", s.mySubaruConfigToMQTTHassioConfig(vehicle)) err := s.bus.Publish("mqtt:publish", s.mySubaruConfigToMQTTHassioConfig(vehicle))
@ -148,7 +151,7 @@ func (s *MySubaruClient) Serve() {
for { for {
select { select {
case <-tickerS.C: case <-tickerS.C:
vehicles := s.mysubaru.GetVehicles() vehicles, _ := s.mysubaru.GetVehicles()
for _, vehicle := range vehicles { for _, vehicle := range vehicles {
err := s.bus.Publish("mqtt:publish", s.mySubaruStatusToMQTTMessage(vehicle)) err := s.bus.Publish("mqtt:publish", s.mySubaruStatusToMQTTMessage(vehicle))
if err != nil { if err != nil {
@ -156,7 +159,7 @@ func (s *MySubaruClient) Serve() {
} }
} }
case <-tickerM.C: case <-tickerM.C:
vehicles := s.mysubaru.GetVehicles() vehicles, _ := s.mysubaru.GetVehicles()
for _, vehicle := range vehicles { for _, vehicle := range vehicles {
vehicle.GetLocation(true) vehicle.GetLocation(true)
err := s.bus.Publish("mqtt:publish", s.mySubaruStatusToMQTTMessage(vehicle)) err := s.bus.Publish("mqtt:publish", s.mySubaruStatusToMQTTMessage(vehicle))
@ -195,14 +198,14 @@ func (s *MySubaruClient) eventLoop(ctx context.Context, chMQTTLockStatus, chMQTT
for _, message := range event.Data.([]*bus.Message) { for _, message := range event.Data.([]*bus.Message) {
s.log.Debug("received a message with mysubary lock status", "topic", message.Topic, "payload", message.Payload) s.log.Debug("received a message with mysubary lock status", "topic", message.Topic, "payload", message.Payload)
if message.Payload == "LOCK" { if message.Payload == "LOCK" {
v := s.mysubaru.GetVehicleByVIN("4S4BTGPD0P3199198") v, _ := s.mysubaru.GetVehicleByVin("4S4BTGPD0P3199198")
v.Lock() v.Lock()
var msgs []*bus.Message var msgs []*bus.Message
msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/lock", 0, true, "LOCK", msgs) msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/lock", 0, true, "LOCK", msgs)
s.bus.Publish("mqtt:publish", msgs) s.bus.Publish("mqtt:publish", msgs)
} }
if message.Payload == "UNLOCK" { if message.Payload == "UNLOCK" {
v := s.mysubaru.GetVehicleByVIN("4S4BTGPD0P3199198") v, _ := s.mysubaru.GetVehicleByVin("4S4BTGPD0P3199198")
v.Unlock() v.Unlock()
var msgs []*bus.Message var msgs []*bus.Message
msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/lock", 0, true, "UNLOCK", msgs) msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/lock", 0, true, "UNLOCK", msgs)
@ -213,14 +216,14 @@ func (s *MySubaruClient) eventLoop(ctx context.Context, chMQTTLockStatus, chMQTT
for _, message := range event.Data.([]*bus.Message) { for _, message := range event.Data.([]*bus.Message) {
s.log.Debug("received a message with mysubary ignition status", "topic", message.Topic, "payload", message.Payload) s.log.Debug("received a message with mysubary ignition status", "topic", message.Topic, "payload", message.Payload)
if message.Payload == "ON" { if message.Payload == "ON" {
v := s.mysubaru.GetVehicleByVIN("4S4BTGPD0P3199198") v, _ := s.mysubaru.GetVehicleByVin("4S4BTGPD0P3199198")
v.EngineStart() v.EngineStart(10, 0, false)
var msgs []*bus.Message var msgs []*bus.Message
msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/ignition", 0, true, "ON", msgs) msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/ignition", 0, true, "ON", msgs)
s.bus.Publish("mqtt:publish", msgs) s.bus.Publish("mqtt:publish", msgs)
} }
if message.Payload == "OFF" { if message.Payload == "OFF" {
v := s.mysubaru.GetVehicleByVIN("4S4BTGPD0P3199198") v, _ := s.mysubaru.GetVehicleByVin("4S4BTGPD0P3199198")
v.EngineStop() v.EngineStop()
var msgs []*bus.Message var msgs []*bus.Message
msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/ignition", 0, true, "OFF", msgs) msgs = s.messages("mysubarumq/4S4BTGPD0P3199198/ignition", 0, true, "OFF", msgs)
@ -293,33 +296,35 @@ func (s *MySubaruClient) mySubaruConfigToMQTTHassioConfig(v *mysubaru.Vehicle) [
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/odometer_mi/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/odometer_mi/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/odometer_mi/config`] = `{` + device + origin + topic + `"name":"Odometer (mi)","uniq_id":"` + v.Vin + `_odometer_mi","obj_id":"` + obj_id_prefix + `_odometer_mi","ic":"mdi:counter","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.odometer_mi}}","unit_of_meas":"mi"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/odometer_mi/config`] = `{` + device + origin + topic + `"name":"Odometer (mi)","uniq_id":"` + v.Vin + `_odometer_mi","obj_id":"` + obj_id_prefix + `_odometer_mi","ic":"mdi:counter","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.odometer_mi}}","unit_of_meas":"mi"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_km/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_km/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_km/config`] = `{` + device + origin + topic + `"name":"Distance to Empty (km)","uniq_id":"` + v.Vin + `_dist_to_empty_km","obj_id":"` + obj_id_prefix + `_dist_to_empty_km","ic":"mdi:map-marker-distance","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_km}}","unit_of_meas":"km"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_km/config`] = `{` + device + origin + topic + `"name":"Distance to Empty (km)","uniq_id":"` + v.Vin + `_dist_to_empty_km","obj_id":"` + obj_id_prefix + `_dist_to_empty_km","ic":"mdi:gas-station","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_km}}","unit_of_meas":"km"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_mi/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_mi/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_mi/config`] = `{` + device + origin + topic + `"name":"Distance to Empty (mi)","uniq_id":"` + v.Vin + `_dist_to_empty_mi","obj_id":"` + obj_id_prefix + `_dist_to_empty_mi","ic":"mdi:map-marker-distance","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_mi}}","unit_of_meas":"mi"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_mi/config`] = `{` + device + origin + topic + `"name":"Distance to Empty (mi)","uniq_id":"` + v.Vin + `_dist_to_empty_mi","obj_id":"` + obj_id_prefix + `_dist_to_empty_mi","ic":"mdi:gas-station","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_mi}}","unit_of_meas":"mi"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_pc/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/dist_to_empty_pc/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_pc/config`] = `{` + device + origin + topic + `"name":"Gas Tank (%)","uniq_id":"` + v.Vin + `_dist_to_empty_pc","obj_id":"` + obj_id_prefix + `_dist_to_empty_pc","ic":"mdi:gauge","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_pc}}","unit_of_meas":"%"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/dist_to_empty_pc/config`] = `{` + device + origin + topic + `"name":"Gas Tank (%)","uniq_id":"` + v.Vin + `_dist_to_empty_pc","obj_id":"` + obj_id_prefix + `_dist_to_empty_pc","ic":"mdi:gauge","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.dist_to_empty_pc}}","unit_of_meas":"%"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/consumption_us/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/consumption_us/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/consumption_us/config`] = `{` + device + origin + topic + `"name":"Consumption (MPG)","uniq_id":"` + v.Vin + `_consumption_us","obj_id":"` + obj_id_prefix + `_consumption_us","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.consumption_us}}","unit_of_meas":"MPG"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/consumption_us/config`] = `{` + device + origin + topic + `"name":"Consumption (MPG)","uniq_id":"` + v.Vin + `_consumption_us","obj_id":"` + obj_id_prefix + `_consumption_us","ic":"mdi:map-marker-distance","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.consumption_us}}","unit_of_meas":"MPG"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/consumption_eu/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/consumption_eu/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/consumption_eu/config`] = `{` + device + origin + topic + `"name":"Consumption (L/100km)","uniq_id":"` + v.Vin + `_consumption_eu","obj_id":"` + obj_id_prefix + `_consumption_eu","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.consumption_eu}}","unit_of_meas":"L100km"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/consumption_eu/config`] = `{` + device + origin + topic + `"name":"Consumption (L/100km)","uniq_id":"` + v.Vin + `_consumption_eu","obj_id":"` + obj_id_prefix + `_consumption_eu","ic":"mdi:map-marker-distance","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.consumption_eu}}","unit_of_meas":"L100km"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/engine_state/consumption_eu/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/engine_state/consumption_eu/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/engine_state/config`] = `{` + device + origin + topic + `"name":"Engine State","uniq_id":"` + v.Vin + `_engine_state","obj_id":"` + obj_id_prefix + `_engine_state","ic":"mdi:engine","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.engine_state}}"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/engine_state/config`] = `{` + device + origin + topic + `"name":"Engine State","uniq_id":"` + v.Vin + `_engine_state","obj_id":"` + obj_id_prefix + `_engine_state","ic":"mdi:engine","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.engine_state}}"}`
hassioConfig[s.config.Hassio.Topics.Discovery+`/device_tracker/`+v.Vin+`/config`] = `{` + device + origin + `"name":"` + v.CarNickname + `","uniq_id":"` + v.Vin + `_device_tracker","obj_id":"` + obj_id_prefix + `","ic":"mdi:car-connected","json_attr_t":"mysubarumq/` + v.Vin + `/attr"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/device_tracker/`+v.Vin+`/config`] = `{` + device + origin + `"name":"` + v.CarNickname + `","uniq_id":"` + v.Vin + `_device_tracker","obj_id":"` + obj_id_prefix + `","ic":"mdi:car-connected","json_attr_t":"mysubarumq/` + v.Vin + `/attr"}`
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/troubles/config
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/troubles/config`] = `{` + device + origin + topic + `"name":"Troubles","uniq_id":"` + v.Vin + `_troubles","obj_id":"` + obj_id_prefix + `_troubles","ic":"mdi:car-wrench","stat_t":"mysubarumq/` + v.Vin + `/state","val_tpl":"{{value_json.troubles}}","json_attr_t":"mysubarumq/` + v.Vin + `/troubles/attr","unit_of_meas":""}`
for n, d := range v.Doors { for n, d := range v.Doors {
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/door_frontleft_status/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/door_frontleft_status/config
position := d.Position + ` ` + d.SubPosition position := d.Position + ` ` + d.SubPosition
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`_status/config`] = `{` + device + origin + topic + `"name":"Door ` + position + ` Status","uniq_id":"` + v.Vin + n + `_status","obj_id":"` + obj_id_prefix + n + `_status","ic":"mdi:car-door","stat_t":"mysubarumq/` + v.Vin + `/doors/state","val_tpl":"{{value_json.` + n + `}}"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`_status/config`] = `{` + device + origin + topic + `"name":"Door ` + position + ` Status","uniq_id":"` + v.Vin + `_` + n + `_status","obj_id":"` + obj_id_prefix + n + `_status","ic":"mdi:car-door","stat_t":"mysubarumq/` + v.Vin + `/doors/state","val_tpl":"{{value_json.` + n + `}}","json_attr_t":"mysubarumq/` + v.Vin + `/doors/` + n + `/attr"}`
} }
for n, w := range v.Windows { for n, w := range v.Windows {
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/window_frontleft/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/window_frontleft/config
position := w.Position + ` ` + w.SubPosition position := w.Position + ` ` + w.SubPosition
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`/config`] = `{` + device + origin + topic + `"name":"Window ` + position + `","uniq_id":"` + v.Vin + n + `_status","obj_id":"` + obj_id_prefix + n + `_status","ic":"mdi:car-door","stat_t":"mysubarumq/` + v.Vin + `/windows/state","val_tpl":"{{value_json.` + n + `}}"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`/config`] = `{` + device + origin + topic + `"name":"Window ` + position + `","uniq_id":"` + v.Vin + `_` + n + `_status","obj_id":"` + obj_id_prefix + n + `_status","ic":"mdi:car-door","stat_t":"mysubarumq/` + v.Vin + `/windows/state","val_tpl":"{{value_json.` + n + `}}"}`
} }
for n, t := range v.Tires { for n, t := range v.Tires {
// homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/tire_frontleft_psi/config // homeassistant/sensor/mysubaru/VIN-NUMBER-HERE/tire_frontleft_psi/config
position := t.Position + ` ` + t.SubPosition position := t.Position + ` ` + t.SubPosition
hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`_psi/config`] = `{` + device + origin + topic + `"name":"Tire ` + position + ` (Psi)","uniq_id":"` + v.Vin + n + `_psi","obj_id":"` + obj_id_prefix + n + `_psi","ic":"mdi:car-tire-alert","stat_t":"mysubarumq/` + v.Vin + `/tires/state","val_tpl":"{{value_json.` + n + `}}"}` hassioConfig[s.config.Hassio.Topics.Discovery+`/sensor/`+v.Vin+`/`+n+`_psi/config`] = `{` + device + origin + topic + `"name":"Tire ` + position + ` (Psi)","uniq_id":"` + v.Vin + `_` + n + `_psi","obj_id":"` + obj_id_prefix + n + `_psi","ic":"mdi:tire","stat_t":"mysubarumq/` + v.Vin + `/tires/state","val_tpl":"{{value_json.` + n + `}}","unit_of_meas":"psi"}`
} }
topicState := `mysubarumq/` + v.Vin + `/ignition` topicState := `mysubarumq/` + v.Vin + `/ignition`
@ -369,25 +374,32 @@ func (s *MySubaruClient) mySubaruStatusToMQTTMessage(v *mysubaru.Vehicle) []*bus
var state = map[string]string{} var state = map[string]string{}
tank := "" tank := ""
if v.DistanceToEmpty.Percentage > 0 && 101 >= v.DistanceToEmpty.Percentage { if v.DistanceToEmpty.Percentage > 0 && 101 > v.DistanceToEmpty.Percentage {
tank = `"dist_to_empty_pc":` + strconv.Itoa(v.DistanceToEmpty.Percentage) + `,` tank = `"dist_to_empty_pc":` + strconv.Itoa(v.DistanceToEmpty.Percentage) + `,`
} }
state[`mysubarumq/`+v.Vin+`/state`] = `{` + tank + `"odometer_km":` + strconv.Itoa(v.Odometer.Kilometers) + `,"odometer_mi":` + strconv.Itoa(v.Odometer.Miles) + `,"dist_to_empty_km":` + strconv.Itoa(v.DistanceToEmpty.Kilometers) + `,"dist_to_empty_mi":` + strconv.Itoa(v.DistanceToEmpty.Miles) + `,"consumption_us":` + fmt.Sprintf("%.2f", v.FuelConsumptionAvg.MPG) + `,"consumption_eu":` + fmt.Sprintf("%.2f", v.FuelConsumptionAvg.LP100Km) + `,"engine_state":"` + v.EngineState + `"}` state[`mysubarumq/`+v.Vin+`/state`] = `{` + tank + `"odometer_km":` + strconv.Itoa(v.Odometer.Kilometers) + `,"odometer_mi":` + strconv.Itoa(v.Odometer.Miles) + `,"dist_to_empty_km":` + strconv.Itoa(v.DistanceToEmpty.Kilometers) + `,"dist_to_empty_mi":` + strconv.Itoa(v.DistanceToEmpty.Miles) + `,"consumption_us":` + fmt.Sprintf("%.2f", v.FuelConsumptionAvg.MPG) + `,"consumption_eu":` + fmt.Sprintf("%.2f", v.FuelConsumptionAvg.LP100Km) + `,"engine_state":"` + v.EngineState + `","troubles":"` + strconv.Itoa(len(v.Troubles)) + `"}`
state[`mysubarumq/`+v.Vin+`/attr`] = `{"source_type":"gps","latitude":` + fmt.Sprintf("%.6f", v.GeoLocation.Latitude) + `,"longitude":` + fmt.Sprintf("%.6f", v.GeoLocation.Longitude) + `,"course":` + strconv.Itoa(v.GeoLocation.Heading) + `,"speed":` + fmt.Sprintf("%.2f", v.GeoLocation.Speed) + `,"friendly_name":"` + v.CarNickname + `"}` state[`mysubarumq/`+v.Vin+`/attr`] = `{"source_type":"gps","latitude":` + fmt.Sprintf("%.6f", v.GeoLocation.Latitude) + `,"longitude":` + fmt.Sprintf("%.6f", v.GeoLocation.Longitude) + `,"course":` + strconv.Itoa(v.GeoLocation.Heading) + `,"speed":` + fmt.Sprintf("%d", v.GeoLocation.Speed) + `,"friendly_name":"` + v.CarNickname + `"}`
// Doors
doors := `{` doors := `{`
// locks := `{`
dq := len(v.Doors) dq := len(v.Doors)
dc := 1 dc := 1
for n, d := range v.Doors { for n, d := range v.Doors {
doors = doors + `"` + n + `":"` + d.Status + `"` doors = doors + `"` + n + `":"` + d.Status + `"`
// locks = locks + `"` + n + `":"` + d.Lock + `"`
if dc != dq { if dc != dq {
doors = doors + `,` doors = doors + `,`
// locks = locks + `,`
} }
dc++ dc++
} }
doors = doors + `}` doors = doors + `}`
// locks = locks + `}`
state[`mysubarumq/`+v.Vin+`/doors/state`] = doors state[`mysubarumq/`+v.Vin+`/doors/state`] = doors
// state[`mysubarumq/`+v.Vin+`/doors/attr`] = locks
// Windows
windows := `{` windows := `{`
wq := len(v.Windows) wq := len(v.Windows)
wc := 1 wc := 1
@ -401,6 +413,7 @@ func (s *MySubaruClient) mySubaruStatusToMQTTMessage(v *mysubaru.Vehicle) []*bus
windows = windows + `}` windows = windows + `}`
state[`mysubarumq/`+v.Vin+`/windows/state`] = windows state[`mysubarumq/`+v.Vin+`/windows/state`] = windows
// Tires
tires := `{` tires := `{`
tq := len(v.Tires) tq := len(v.Tires)
tc := 1 tc := 1
@ -414,6 +427,20 @@ func (s *MySubaruClient) mySubaruStatusToMQTTMessage(v *mysubaru.Vehicle) []*bus
tires = tires + `}` tires = tires + `}`
state[`mysubarumq/`+v.Vin+`/tires/state`] = tires state[`mysubarumq/`+v.Vin+`/tires/state`] = tires
// Vehicle Health Items
troubles := `{`
trq := len(v.Troubles)
trc := 1
for n, t := range v.Troubles {
troubles = troubles + `"` + n + `":"` + t.Description + `"`
if trc != trq {
troubles = troubles + `,`
}
trc++
}
troubles = troubles + `}`
state[`mysubarumq/`+v.Vin+`/troubles/attr`] = troubles
var msgs []*bus.Message var msgs []*bus.Message
for topic, payload := range state { for topic, payload := range state {
msgs = s.messages(topic, 0, false, payload, msgs) msgs = s.messages(topic, 0, false, payload, msgs)