Para obter o preço dos combustíveis do site da DGEG vão ter de mexer um bocado com as ferramentas de desenvolvimento de um browser internet de forma a descobrir o identificador único do posto de combustível onde querem ler os preços. O que estão à procura é um pedido ao site da DGEG com “/api/PrecoComb/GetDadosPostoMapa?id=
” no URL.
Clicando no mapa no site da DGEG, com as ferramentas de desenvolvimento do browser abertas, quando clicarem no posto de onde querem ver os preços, por exemplo um posto no Barreiro, o pedido com os dados dos preços é feito pelo browser nesta forma:
--> https://precoscombustiveis.dgeg.gov.pt/api/PrecoComb/GetDadosPostoMapa?id=67080&f=json
Se abrirem este URL numa janela/tab nova, vão ver os dados sem a decoração, e que se pedirem 0 (zero) elemento do grupo Combustiveis, está lá a informação para o sensor:
TipoCombustivel | “GPL Auto” |
Preco | “0,919 €/litro” |
Infelizmente, os dados na DGEG misturam unidades (€/litro) de medida com valores (0,919), obrigando a alguma ginástica de pré-preparação antes de serem apresentados no Home-Assistant. Isso foi feito com o templating do Home-Assistant e algumas substituições com RegEx. Fpo também preciso lidar com o valor para que o Home-Assistant entende-se como um valor decimal:
- float: Converte o resultado do value_json num décimal;
- | regex_replace: substitui o texto ” €/litro” e “,”.
Para inserirem o vosso sensor RESTfull no Home-Assistant ainda é preciso editar a configuração manualmente. Abrem o vosso ficheiro config.yaml
e inserem lá o URL:
sensor:
- platform: rest
resource: https://precoscombustiveis.dgeg.gov.pt/api/PrecoComb/GetDadosPostoMapa?id=67080&f=json
name: "fuel_posto_67080_barreiro_gpl"
scan_interval: 3600
value_template: '{{ float(value_json.resultado.Combustiveis[0].Preco | regex_replace(find=" €/litro", replace="", ignorecase=True) | regex_replace(find=",", replace=".", ignorecase=True),default) }}'
unit_of_measurement: '€'
- platform: rest
resource: https://precoscombustiveis.dgeg.gov.pt/api/PrecoComb/GetDadosPostoMapa?id=67080&f=json
name: "fuel_posto_67080_barreiro_gasoleo_simples"
scan_interval: 3600
value_template: '{{ float(value_json.resultado.Combustiveis[2].Preco | regex_replace(find=" €/litro", replace="", ignorecase=True) | regex_replace(find=",", replace=".", ignorecase=True),default) }}'
unit_of_measurement: '€'
Neste exemplo insiro apenas 2 sensores, mas podem repetir o exercício tantas vezes quantas quiserem. No controlo do vosso servidor Home-Assistant, depois de selecionar “REST entities and notify services”, ele recarrega os valores.
Em 2018, quando o @RodolfoVieira, da Comunidade Portuguesa de Home-Assistant (CPHA) me pediu para o ajudar a obter os preços do combustível para publicar no seu dashboard doméstico, não me passava pela cabeça que viesse a ser utilizado por outras pessoas.
Nessa altura, o site de onde íamos buscar os valores não facilitava muito a vida a quem queria incluir os dados nas suas próprias construções.
A solução na altura foi ler o conteúdo, fingindo ser um browser internet, e identificar no texto do site as partes interessantes para recolher, enviando-as ao Home-Assistant para os apresentar.
Hoje em dia, com estes sites a serem construídos com dados mais abertos, é possível obter a informação de forma mais simples para o Home-Assistant.
O Home-Assistant oferece o sensor RESTful, uma integração para este tipo de informação que, depois de algum trabalho para limpar os dados obtidos, permite obter o mesmo resultado com muito menos esforço de configuração.
Hoje, há utilizadores do CPHA que publicam os resultados obtidos, como o que hoje ilustra este post. Há também utilizadores que, por integraram o Home-Assistant com o Telegram, conseguem de qualquer lado enviar uma mensagem e receber de volta o preço dos combustíveis.