Ajuda das notificações
Tudo o que é preciso para pôr o Notifier a correr ao lado do seu TeslaMate, e o que verificar quando um evento não chega.
Antes de começar
Três coisas, e a maioria das instalações do TeslaMate já tem as duas primeiras.
- TeslaMate com um broker MQTT. O Mosquitto faz parte do ficheiro Compose predefinido do TeslaMate.
- Docker na mesma máquina que o TeslaMate, ou em qualquer host que alcance o broker.
- Acesso de saída à internet. Sem porta de entrada, e o seu TeslaMate não tem de ser público.
Instalar o Notifier
O seu TeslaMate não consegue chegar ao telemóvel sozinho, e uma notificação iOS só pode chegar através da Apple. O Notifier é o pequeno contentor que observa o MQTT e entrega os eventos. Corre ao lado do TeslaMate e nunca abre uma porta.
-
Obtenha o token na app
Abra a HedgieMate, vá a Definições e depois a Notificações push e ative-as. A app mostra um token de ligação começado por hm_ e o ID do servidor TeslaMate a que está ligado. Copie ambos.
O token liga a app ao contentor. Trate-o como uma palavra-passe.
-
Adicione o contentor ao ficheiro Compose
Abra o docker-compose.yml a partir do qual corre o TeslaMate e acrescente o serviço abaixo. Ficando no mesmo ficheiro partilha a rede com o broker, por isso MQTT_HOST é apenas o nome do serviço do broker.
docker-compose.yml# add under services: in the docker-compose.yml you run TeslaMate from hedgiemate-notifier: image: hedgiemate/notifier:latest restart: unless-stopped depends_on: - mosquitto environment: HEDGIEMATE_USER_TOKEN: "hm_your_token_here" SERVER_ID: "your-server-uuid" MQTT_HOST: "mosquitto" MQTT_PORT: "1883" CAR_IDS: "1" LOG_LEVEL: "info" volumes: - hedgiemate-notifier-data:/data # and under the top-level volumes: key, adding it if the file has none hedgiemate-notifier-data:O volume é opcional. Mantém os nomes dos carros entre reinícios; sem ele, o relay preenche-os na mesma. Use um volume com nome em vez de um bind mount: o contentor corre com um utilizador sem privilégios e não consegue escrever numa pasta do host criada pelo Docker como root.
-
Arranque-o
Levante o novo serviço. O resto da sua stack não precisa de reiniciar.
Terminaldocker compose up -d hedgiemate-notifier
Depois leia o registo. Um arranque saudável mostra a ligação ao broker e os IDs dos carros que está a observar.
Terminaldocker compose logs -f hedgiemate-notifier
-
Confirme na app
A app marca o servidor como ligado em poucos segundos. A partir daí pode ligar ou desligar cada evento, carro a carro.
Nada chega até o carro mudar mesmo de estado. Ligar o cabo de carregamento é a forma mais rápida de ver o primeiro evento.
Sem Compose
Se o TeslaMate não for gerido por Compose, o docker run faz o mesmo. Aponte MQTT_HOST para um host que o contentor consiga alcançar.
docker run -d \ --name hedgiemate-notifier \ --restart unless-stopped \ -e HEDGIEMATE_USER_TOKEN="hm_your_token_here" \ -e SERVER_ID="your-server-uuid" \ -e MQTT_HOST="your-mqtt-host" \ -e CAR_IDS="1" \ hedgiemate/notifier:latest
Mais do que um TeslaMate
Corra um Notifier ao lado de cada servidor. O mesmo token de ligação funciona em todos. O que os distingue na app é o ID do servidor.
Configuração
Tudo se define por variáveis de ambiente. Três são obrigatórias, as restantes têm predefinições que funcionam.
| Variável | Predefinição | Descrição |
|---|---|---|
HEDGIEMATE_USER_TOKEN obrigatória | nenhuma | Token de ligação dado pela app. Começa por hm_. |
MQTT_HOST obrigatória | nenhuma | Nome do host do seu broker MQTT. Dentro do Compose é o nome do serviço, normalmente mosquitto. |
SERVER_ID obrigatória | nenhuma | UUID do servidor dado pela app. O contentor arranca sem ele, mas as definições por servidor e por carro feitas na app passam a ser ignoradas. |
MQTT_PORT | 1883 | Porta do broker. |
MQTT_USERNAME | nenhuma | Utilizador do broker, se o seu exigir autenticação. |
MQTT_PASSWORD | nenhuma | Palavra-passe do broker. |
MQTT_CLIENT_ID | hedgiemate-notifier | Client ID usado no broker. Mude-o se já houver outra coisa a ligar-se com este. |
MQTT_TLS | false | Defina true para um broker com TLS. A porta predefinida passa então para 8883. |
MQTT_NAMESPACE | nenhuma | Tem de coincidir com o MQTT_NAMESPACE do seu TeslaMate, se tiver definido um. Os tópicos passam a teslamate<namespace>/cars/#. |
CAR_IDS | 1 | IDs dos carros a observar, separados por vírgulas, por exemplo 1,2. Cada carro tem a sua própria máquina de estados. |
LOG_LEVEL | info | debug, info, warn ou error. |
RELAY_URL | https://push.hedgiemate.com | Endereço do relay. Não há razão para o alterar. |
Todos os eventos
Cada linha é um interruptor independente por carro na app. As atualizações das Live Activities não são notificações e não constam desta lista.
| Notificação | Enviada quando |
|---|---|
| Condução | |
| Viagem iniciada | state → driving |
| Viagem encerrada | state leaves driving |
| Carregamento | |
| Carregamento iniciado | charging_state → Charging |
| Carregamento concluído | charging_state → Complete |
| Carregamento interrompido | charging_state leaves Charging without Complete |
| Carregador conectado | plugged_in → true |
| Carregador desconectado | plugged_in → false |
| Bateria | |
| Bateria fraca | battery_level ≤ BATTERY_LOW_THRESHOLD |
| Nível de bateria atingido | battery_level ≥ BATTERY_HIGH_THRESHOLD |
| Localização | |
| Entrada na geocerca | geofence set |
| Saída da geocerca | geofence cleared or changed |
| Segurança | |
| Gravação Sentry | center_display_state = 7 |
| Veículo | |
| Atualização de software | update_available → true |
| Entrando em repouso | state → asleep pending |
| Em repouso | state → asleep |
| Veículo acordou | state leaves asleep |
Não chega nada
Percorra a lista de cima para baixo. A maioria dos casos é um dos três primeiros.
A app continua a dizer que o servidor não está ligado
Confirme com docker compose ps que o contentor está mesmo a correr e leia o registo. A causa habitual é um MQTT_HOST errado: dentro do Compose é o nome do serviço do broker, mosquitto, não localhost.
O contentor corre, mas nunca dispara um evento
CAR_IDS tem de corresponder ao ID de carro usado pelo TeslaMate. O TeslaMate numera os carros a partir de 1 e, com vários, listam-se: CAR_IDS=1,2.
O MQTT liga-se e o registo fica em silêncio
Se definiu MQTT_NAMESPACE no TeslaMate, defina o mesmo valor no Notifier. Sem isso os nomes dos tópicos não coincidem e o contentor não tem nada para ler.
Alguns eventos chegam, outros nunca
Cada evento é um interruptor por carro na app. Abra o servidor nas Definições e verifique a lista de eventos desse carro.
As notificações de bateria nunca disparam
BATTERY_LOW_THRESHOLD e BATTERY_HIGH_THRESHOLD estão por omissão em 20 e 90. São enviadas uma vez por sessão de carregamento, por isso um carro que não cruzou o limite desde que começou a carregar não envia nenhuma.
As notificações param ao fim de alguns dias
Garanta que o serviço tem restart: unless-stopped para voltar com o host. Depois verifique o iOS: um modo de Foco ou as definições de notificações da app podem estar a absorvê-las.
As Live Activities não aparecem
As Live Activities têm de estar permitidas para a HedgieMate nas Definições do iOS e tem de existir uma sessão ativa. A Dynamic Island precisa de um iPhone 14 Pro ou mais recente.
O broker pede autenticação ou TLS
Defina MQTT_USERNAME e MQTT_PASSWORD. Para TLS defina MQTT_TLS como true, o que muda a porta predefinida para 8883.
Precisa de ver o que está a acontecer
Ponha LOG_LEVEL em debug, reproduza o caso e volte a pôr como estava. O modo debug regista cada mensagem MQTT e cada decisão tomada a partir dela.
Perguntas
Porque preciso do Notifier?
O seu TeslaMate está no seu próprio servidor e não consegue chegar ao telemóvel, e uma notificação iOS só a Apple a consegue entregar. O Notifier fecha essa lacuna: observa os seus tópicos MQTT, deteta a mudança de estado e envia o evento para ser entregue.
O meu TeslaMate tem de estar acessível a partir da internet?
Não. O Notifier só faz ligações de saída, por isso não é preciso expor nada nem encaminhar portas para as notificações funcionarem.
O que sai realmente do meu servidor?
O tipo de evento, o nível da bateria, o estado de carregamento e o nome da geofence, se usar geofences. As coordenadas e as rotas ficam no seu TeslaMate, e o endereço do seu servidor nunca é enviado. Os dados dos eventos são apagados ao fim de algumas horas.
Pode correr numa máquina diferente do TeslaMate?
Sim, desde que alcance o seu broker MQTT. Aponte MQTT_HOST para esse host e confirme que a porta do broker está acessível a partir dali.
Funciona com vários carros?
Sim. Liste os IDs em CAR_IDS e cada carro fica com o seu próprio acompanhamento de estado e os seus próprios interruptores na app.
O que acontece se o relay estiver inacessível?
O contentor tenta de novo algumas vezes com um intervalo crescente e depois descarta esse evento. Continua a correr e trata normalmente da mudança de estado seguinte.
Guarda alguma coisa?
Apenas uma cache dos nomes dos carros, e só se montar o volume opcional. Todo o resto fica em memória enquanto o contentor estiver a correr.
Como o atualizo?
Volte a puxar a imagem e recrie o serviço. As notas de versão estão na página de releases no GitHub.
Como desligo as notificações?
Desligue-as na app ou pare o contentor. Qualquer uma das opções funciona por si, e mais nada na sua stack de TeslaMate depende dele.
Código-fonte
O Notifier é Go com licença MIT. Leia o código ou abra uma issue se algo estiver errado.
LukStankovic/hedgiemate-notifier
Precisa de Ajuda?
Tem problemas com a configuração? Estamos aqui para ajudá-lo a começar.