No topic Integração Fogos.pt já havia algumas propostas sobre como aplicar os serviços do fogos.pt ao Home Assistant. Segue, neste, uma aplicação mais especifica:
O intuito é o de receber notificações quando ocorra um incidente em certas zonas do país. Ao contrário das notificações que se recebe diretamente da app fogos.pt, este método permite que hajam triggers a ocorrências em múltiplas localizações - por exemplo na zona onde os filhos ou os pais, ou os avôs, vivem -; além de que dá-nos a possibilidade de criar automatizações variadas no momento em que ocorre um registo no HA: ligar rega, avisar familiares, receber streams de cameras, etc.
Houve, recentemente, algumas alterações no acesso ao API do fogos.pt que devemos ter em conta. Mais propriamente o acesso que agora requer o pedido de um token. Podem verificar em https://fogos.pt/pt/api
## O que vai mudar?
**Brevemente** , o acesso à API passará a estar restrito a utilizadores autorizados.
Todos os pedidos à API deverão cumprir:
* Autenticação obrigatória via header:
FOGOS-PT-AUTH: {token}
* Utilização de **token individual**
* User-Agent **identificável e personalizado**
* Indicação do **IP de origem** , sempre que possível
Pedidos que não cumpram estes requisitos poderão ser limitados ou bloqueados.
Deverão, por isso, aceder ao formulário em https://source.fogos.pt/api/request-access
Cada pedido será analisado com base em:
* Finalidade de utilização
* Volume de pedidos
* Impacto na infraestrutura
* Alinhamento com os objetivos do projeto
No meu caso expliquei que era experimental, para utilização de automatizações, em Home Assistant, indo apenas recorrer a um scan_interval: 300ms. Acrescentei o User-Agent como algo do género: "“HomeAssistant-LocalHA/1.0 (contact: XXXXX@gmail.com)” e recebi o token em menos de um dia.
Estando isso feito, teremos de criar um rest sensor. Indo a configuration.yaml, se não tiverem criado o file rest.yaml e adicionado à configuração: rest: !include rests.yaml.
rest:
- resource: "https://api.fogos.pt/v2/incidents/active"
headers:
X-API-Key: !secret fogos_pt_token
User-Agent: "HomeAssistant-LocalHA/1.0 (contact: xxx@gmail.com)"
scan_interval: 300
sensor:
- name: "Active Fires"
value_template: >
{{ value_json.data
| selectattr('district','equalto','YYY')
| rejectattr('status','equalto','Conclusão')
| list | length }}
json_attributes_path: "$"
json_attributes:
- data
Onde está “YYY” deverão pôr o distrito do qual que desejam receber notificações. Ou adicionar outro rest sensor se quiserem receber de distritos variados.
De seguida teremos de criar um template em configuration.yaml, que nos permitirá filtrar os concelhos, freguesias, etc., dos quais estamos interessados:
template:
- trigger:
- trigger: state
entity_id: sensor.active_fires
sensor:
- name: "XXX Fires List"
state: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| list | length }}
attributes:
incident_ids: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| map(attribute='id') | list }}
fires: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| list }}S
- name: "XXX2 Fires List"
state: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| list | length }}
attributes:
incident_ids: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| map(attribute='id') | list }}
fires: >
{{ state_attr('sensor.active_fires','data')
| selectattr('district','equalto','YYY')
| selectattr('concelho','equalto','ZZZ')
| rejectattr('status','equalto','Conclusão')
| list }}
Mais uma vês alterem “YYY” para o distrito que têm interesse, e o mesmo para “ZZZ” e respetivo o concelho.
Nota: Tenham atenção ao “entity_id: sensor.active_fires”; se tiverem criado mais do que um rest sensor será algo como: “sensor.active_fires2”, “sensor.active_fires3”
Podem dar uma vista de olhos em “https://api.fogos.pt/v2/incidents/active”; isso permitirá terem uma noção de como a API do fogos.pt faz a distribuição de variantes e valores:
Exemplo:
{
"success": true,
"data": [
{
"_id": {
"$id": "20261061716"
},
"id": "20261061716",
"coords": true,
"dateTime": {
"sec": 1785247260
},
"date": "28-07-2026",
"hour": "15:01",
"location": "Vila Real, Valpaços, Ervões",
"aerial": 0,
"meios_aquaticos": 0,
"man": 35,
"terrain": 14,
"district": "Vila Real",
"concelho": "Valpaços",
"freguesia": "Ervões",
"dico": "1712",
"lat": 41.636695,
"lng": -7.33691,
"naturezaCode": "3103",
"natureza": "Mato",
"especieName": null,
"familiaName": null,
"statusCode": 9,
"statusColor": "6ABF59",
"status": "Vigilância",
"important": false,
"localidade": "Cabeço ---",
....
No nosso caso apenas nos interessa “district”, “concelho”, “freguesia” (se for o caso), e “id” para a notificação.
Nota2: nomes de concelhos e freguesias que tenham vários nomes ou proposições, a sigla inicial é sempre maiúscula. Ex: 'Vila Real De Santo António"
Estando tudo isso feito, temos de criar uma automatização, especifica para cada um dos concelhos que temos interesse - seria possível uma só, mas parece-me demasiado convoluto.
alias: Fire Notification
triggers:
- trigger: state
entity_id: sensor.xxx_fires_list
conditions:
- condition: template
value_template: >
{% set old_ids = trigger.from_state.attributes.get('incident_ids', []) if
trigger.from_state else [] %} {% set new_ids =
trigger.to_state.attributes.get('incident_ids', []) %} {{ (new_ids |
reject('in', old_ids) | list | length) > 0 }}
actions:
- variables:
old_ids: >-
{{ trigger.from_state.attributes.get('incident_ids', []) if
trigger.from_state else [] }}
new_fire_ids: >-
{{ trigger.to_state.attributes.get('incident_ids', []) | reject('in',
old_ids) | list }}
fires: '{{ trigger.to_state.attributes.get(''fires'', []) }}'
- repeat:
for_each: '{{ new_fire_ids }}'
sequence:
- variables:
fire: '{{ fires | selectattr(''id'',''equalto'', repeat.item) | first }}'
- action: notify.mobile_app_nnnnnnn
data:
title: New fire reported in XXX
message: '{{ fire.location }}'
data:
url: https://fogos.pt/en/fogo/{{ fire.id }}
clickAction: https://fogos.pt/en/fogo/{{ fire.id }}
Alterem sensor.xxx_fires_list, para o(s) vosso(s), e em “- action: notify.mobile_app_nnnnnnn” ponham o vosso tlm/tablet/etc., específico.
Exemplo:

E se carregarem na notificação, ela abre a app & info sobre a incidência:
