You are currently browsing the archives for the Em curso category


63 países que pesquisam sobre Portugal

Representação dos países com mais pesquisas no Top 20 dos países de onde Portugal é o destino de pesquisa
63 países cujas pesquisas têm Portugal como destino, em percentagem no top 20, por país

O custo de vida em Portugal, e por comparação com outros países, tem sido tema no Poupar Melhor, onde já temos referido o site da Numeo. Esta semana lançaram mais um artigo do seu site, desta feita para apresentarem os dados sobre as 90 origens de pesquisas sobre países e o top 20 dos países alvos de pesquisa de cada um destes países de origem.

Na prática, o que os dados dizem sobre as pesquisas feitas com origem nestes 90 países é Portugal está bem e recomenda-se no que toca à prioridade dos países para as pessoas que utilizam este site. Portugal aparece entre os 20 países mais procurados em 63 origens de pesquisa, sendo que Brasil, Israel e Islândia são os 3 países de origem que mais pesquisas efetuam sobre Portugal.

Já as pesquisas com origem em Portugal feitas sobre outros países põe Espanha em primeiro lugar, logo seguida dos Estados Unidos da América e da Alemanha.

O Numbeo foi lançado em abril de 2009 e disponibiliza os dados através do seu site Numbeo.com. Trata-se de uma empresa privada de responsabilidade limitada com sede na Sérvia cuja pesquisa e os dados disponíveis, segundo os próprios, não são influenciados por nenhuma organização governamental.

Raspberry Pi a simular um disco USB externo para uma moldura eletrónica de fotos

E se de repente decidirem usar o vosso Raspberry Pi (RPi) para simular um disco externo USB para utilizar na vossa moldura de fotos eletrónica? Isso é excesso de engenharia!

Aqui vamos jogar com 2 coisas diferentes e tentar juntar tudo numa só:

  • Moldura que mostra fotos que estejam num disco externo USB.
  • Um disco a que se pode ligar remotamente para colocar fotos.

A minha tese era que seria possível reutilizar uma moldura eletrónica já antiga, como a minha Rollei DF-80 memories, mas que não serve e recebe ficheiros ao mesmo tempo. Esta moldura eletrónica lê as fotos que coloco num disco externo USB, mas para isso tenho de ligar o disco fisicamente a um computador para onde previamente já tive de passar as fotos, copiar as fotos para o disco, retirar o disco do computador, colocar o disco na moldura… estão a perceber a coisa, não estão?

Hoje em dia já há até tem um produto à venda que faz isto com a ajuda de uma app, tudo muito cómodo e por cerca de 200€, mas eu já tinha a moldura e dois RPi ali à espera de um projeto. O que se pretende é passar a receber as fotos de qualquer equipamento sem tirar o disco da moldura, e depois ver as fotos na moldura eletrónica, tudo comodamente e sem sair do seu lugar.

Para atingir o objetivo, decidi usar o Raspberry Pi Zero W e:

  1. Instalar o Raspberry Pi OS Lite
  2. Instalar o Samba
  3. Configurar o Raspberry Pi como gadget de armazenamento em massa (g_mass_storage)

No final, também ainda insultei o RPi e tudo à sua volta umas quantas vezes, e tive de desejar com muita, mesmo muita força, que o sistema da moldura reconhecesse o disco que lhe disponibilizei.

Se estiverem interessados em repetir esta receita, basta seguir as instruções que escrevi nas parte 1, 2 e 3 deste artigo. No final, há uma parte Bonus que explica como colocar as fotos na moldura a partir da app do Home-assistant.

Parte 1 – Instalar o Raspbian OS Lite

Escolhi a distribuição Debian do Raspberry Pi por facilidade de utilização. Podem ir até ao site da distribuição Raspberry PI OS (Raspian OS) e seguir as instruções. Vão precisar de uma forma de escrever para o disco SSD que vão usar. Facilita utilizarem a aplicação que o Raspbian OS já oferece para o vosso sistema operativo.

  1. Selecionem a versão de sistema operativo.
  2. Selecionem o disco onde querem escrever o novo sistema operativo. Aconselho utilizar logo a opção de configurar a ligação WiFi e outras disponíveis nesta aplicação.
  3. Selecionem escrever (Write).

A aplicação faz a verificação do disco e quando terminar, é só colocarem o disco no Raspberry Pi e esperar uns momentos.

O vosso utilizador e password podem ser logo configurados se utilizarem a aplicação do Raspberry Pi OS, o que vos vai poupar algum trabalho na parte seguinte desta tarefa.

O novo sistema operativo deve ficar disponível via SSH (Secure Shell) na vossa rede WiFi através do nome que derem ao Raspberry Pi na configuração. Vai ser por aqui que vamos continuar.

Parte 2 – Instalar o Samba

Podem aceder ao vosso Raspberry Pi remotamente a partir da linha de comandos ligando-se ao nome que deram na configuração ou através do IP com que ficar na vossa rede.

ssh pi@raspberrypi.local

Uma vez remotamente a controlar o vosso Raspberry Pi, podem começar a executar o conjunto de comandos necessários ao nosso objetivo.

Primeiro, devem atualizar e limpar a instalação.

sudo apt update && sudo apt upgrade --show-upgraded
sudo apt clean
sudo apt autoremove -y

Podem verificar se há algum pacote que esteja instalado, para o remover por vossa conta e risco, listando todos os pacotes com sudo dpkg -l.

Como não dava para instalar uma solução NAS, como explico na ultima secção deste artigo, e já tenho o Home-Assistant, decidi-me por instalar o servidor de ficheiros Samba, que é compatível depois com vários sabores de computador e pode já hoje em dia ser montado remotamente no Home-assistant, facilitando a gestão de ficheiros pela app e por browser.

sudo apt install samba

Dependendo do vosso RPi, a instalação vai demorar mais ou menos tempo. Podem ignorar a mensagem de instalação a dizer que ele não se configurou como um Domain Controler. Não me parece que queiram controlar remotamente os vossos computadores lá de casa a partir da vossa moldura de fotografias.

Podem testar a instalação do servidor Samba localmente.

sudo systemctl status nmbd

Se tiver corrido tudo bem, vão ver uma mensagem verde a dizer que está ativo e a ser executado. O vosso Raspberry Pi vai aparecer-vos na rede doméstica como uma máquina Windows, para já sem pastas partilhadas.

Agora, criam uma pasta para simular um disco. Vão fazê-lo no diretório do utilizador para facilidade de teste e configurar logo os acessos. Não se preocupem muito para já com isto. Mais à frente vamos mudar.

mkdir /home/pi/datafolder
chmod 777 /home/pi/datafolder

Para configurar o acesso a um disco, vão ter de editar o ficheiro de configuração do serviço Sama. Se tivessemos um NAS seria aceder a um interface gráfico de utilizador, mas enfim… Venha lá mais instruções para a linha de comandos.

sudo nano /etc/samba/smb.conf

A configuração não tem de ser necessariamente esta, até porque aquele 0777 que vão escrever quer dizer que todos podem tudo (ler, escrever e executar). Depois de testarem que tudo funciona, convém reverem a configuração do vosso smb.conf.

[Photos]
comment = RPi Share for photo frame
path = /home/pi/datafolder
create mask = 0777
directory mask = 0777
writable = true
security = share
browseable = true
public = yes

Criada a configuração, tem de reiniciar o serviço para que leia a configuração (Sem comentários).

sudo service smbd restart

Tudo instalado e configurado, podem passar à Parte 3.

Parte 3 – Configurar o Raspberry Pi como gadget de armazenamento em massa (g_mass_storage)

O que querem é que ao mesmo tempo o Raspberry Pi receba os ficheiros e os disponibilize à moldura eletrónica, como se de um disco externo USB se tratasse.

A questão é que agora, o disco não vai vos aparecer na moldura porque o RPi está a funcionar como um computador e não como um gadget de armazenamento para os vossos dados.

Para configurar o Raspberry Pi como um gadget de armazenamento (mass storage) terão de editar o ficheiro de configuração do próprio RPi.

sudo nano /boot/config.txt

No final do ficheiro vão ter de acrescentar dtoverlay=dwc2. Para gravar e sair do nano, carreguem em na tecla ctrl + O e depois ctrl + X.

Vão ter de acrescentar também ao ficheiro de configuração dos módulos do sistema operativo o mesmo dwc2. Este dwc2 é o nome do driver de kernel linux que vai fazer o serviço, mas que, por omissão não vem configurado.

sudo nano /etc/modules

No final do ficheiro, acrescentem dwc2 e gravem com ctrl + O e ctrl + X.

Para tudo funcionar, ainda faltam maus umas voltas. Vamos ter de:

  1. Criar um contentor (container) para simular o disco que será disponibilizado como gadget.
  2. Montar o disco no filesystem.
  3. Atualizar o container de cada vez que lá sejam colocados ficheiros.

Para criar o container, executem o comando abaixo, tendo em conta que o valor que colocam em count é o espaço que estão a reservar para simular o disco. Neste caso, os 2048 equivalem a 2GB.

sudo dd bs=1M if=/dev/zero of=/piusb.bin count=2048

Depois de criado este contentor, têm de formatar e montar o disco automaticamente para que possa ser utilizado.

sudo mkdosfs /piusb.bin -F 32 -I
sudo mkdir /mnt/piusb
sudo nano /etc/fstab

No ficheiro /etc/fstab, vão ter de acrescentar uma linha que monte o disco automaticamente.

/piusb.bin /mnt/piusb vfat users,umask=000 0 2

Para montar todos os discos configurados em /etc/fstab, correm o comando sudo mount -a. O vosso sistema encarrega-se disto no futuro.

Para disponibilizar o disco piusb na rede através do Samba, já adivinharam. Vão ter de configurar o Samba, como já fizemos anteriormente, mas agora a apontar para o disco piusb.

sudo chmod 777 /mnt/piusb/
sudo nano /etc/samba/smb.conf

No ficheiro /etc/sambe/smb.conf, podem acrescentar o vosso novo disco a partilhar, alterando o caminho para a pasta para /mnt/piusb.

[Photos]
comment = RPi Share for photo frame
path = /mnt/piusb
create mask = 0777
directory mask = 0777
writable = true
security = share
browseable = true
public = yes
guest ok = yes
read only = no

Para ligar o RPi em modo gadget de armazenamento em massa, ainda vão ter lhe ligar o módulo que anteriormente configurámos e dizer-lhe onde está o ficheiro que simula o disco.

sudo modprobe g_mass_storage file=/piusb.bin stall=0 ro=1

Depois de testarem, escrevendo algo, lendo e sincronizando os dados com o comando sudo sync, podem desmontar o disco do interface USB via modprobe. O disco vai continuar disponível via Samba.

sudo modprobe -r g_mass_storage

Algo que o sistema não se encarrega é a sincronia disto tudo. De cada vez que copiam imagens para este /mnt/piusb, seja por que via for, teriam de fazer um conjunto de operações, e lá voltávamos ao que nos trouxe até aqui: demasiadas operações só para ver umas fotos novas na nossa moldura eletrónica. Aqui a revista MagPi deu uma ajudinha.

Terão ainda de criar algo que engane o equipamento que vai receber o disco externo para que fique no modo como se lhe tivessemos tirado e voltado a meter o disco USB externo, e assim recarregar a lista de ficheiros com as mudanças.

Vamos necessitar do Python, do Pip3 e de um script que vai fazer de cão de guarda (watchdog) e executar instruções de cada vez que detete uma alteração.

sudo apt install python python3-pip
sudo pip3 install watchdog

cd /usr/local/share
sudo wget http://rpf.io/usbzw -O usb_share.py
sudo chmod +x usb_share.py

Vão ter de adaptar o ficheiro usb_share.py para que esteja de guarda ao /mnt/piusb. Para isso, alterem o ficheiro com sudo nano /usr/local/share/usb_share.py e onde estiver WATCH_PATH = "/mnt/usb_share", tem de passar a estar WATCH_PATH = "/mnt/piusb".

Para isto tudo funcionar, temos ainda de colocar o script como um serviço, assim ele funciona logo ao arranque do RPi e continua a funcionar.

cd /etc/systemd/system
sudo nano usbshare.service

No ficheiro usbshare.service vamos colocar as configurações para o ficheiro python que instalámos funcionar como um serviço.

[Unit]
Description=Watchdog for piusb

[Service]
Type=simple
ExecStart=/usr/local/share/usb_share.py
Restart=always

[Install]
WantedBy=multi-user.target

Depois de gravarem, com ctrl + O e sairem com ctrl + X, tem de ativar e iniciar o vosso novo serviço.

sudo systemctl daemon-reload
sudo systemctl enable usbshare.service
sudo systemctl start usbshare.service

O serviço vai procurar por alterações no /mnt/piusb e esperar 30 segundos antes de cumprir a sua função, por isso, sejam pacientes.

Antes de desligar o RPi para o mudarem de sitio, não se esqueçam de fazer sudo halt para não danificar os discos.

Na parte seguinte deste artigo explico como usar o Home-assistant com isto tudo. Se não tiverem o Home-Assistant, também podem enviar a imagem a partir de qualquer computador para a vossa partilha de ficheiros Samba já instalada.

Bonus – Copiar ficheiros para o RPi USB Gadget a partir do Home-Assistant

A parte de receber ficheiros podia ser feita só com cópia de ficheiros, mas não tinha a mesma graça e era preciso andar às voltas com a linha de comandos. Se tiverem o Home-assistant, podem ir ao vosso menu de gestão de armazenamento em rede (Netowrk Storage), adicionar a vossa nova drive remota como Media, com o protocolo Samba ligado para o vosso novo servidor, e dar-lhe o nome Photos, ou outro à vossa escolha.

Só falta resolver a questão de “Então mas e agora como é que ponho lá as fotos com o Home-assistant?”.

Para além do interface gráfico de utilizador que é disponibilizado via browser, o Home-assistant oferece as Companinon App, o que facilita enviar as fotos do vosso smartphone.

Em qualquer interface gráfico de utilizador, podem seguir os mesmos passos: Media > My Media > Photos. Está feito.

Atenção ao tamanho das imagens que enviam para a vossa moldura. Isto como é uma coisita já antiga e com poucos recursos, é capaz de se engasgar com esses novos formatos de grande dimensão que são hoje em dia gravados no vosso smartphone por cada foto. No caso do iPhone, depois de selecionar as fotos que quero enviar, podem carregar e selecionar o tamanho mais pequeno (Small).

Raspberry Pi Zero W v1.1 de 2017 e Raspberry Pi 2B de 2015

Nas referências deste artigo vão encontrar uma série de voltas que dei a tentar colocar uma solução de gestão do sistema via browser. Estas soluções estão na categoria dos Network Attached Storage (NAS).

A maioria dos NAS open source mais comuns só podem ser instalados em arquiteturas de 64-bit, o que significa que o vosso Raspberry Pi antigo pode não servir. No meu caso, o que usei foi um Raspberry Pi Zero W v1.1 de 2017 e um Raspberry Pi 2 B de 2015, por isso tive de procurar uma solução 32-bit.

Por teimosia, acabei por instalar o Webmin no Raspberry Pi Zero W e no Raspberry Pi 2 B para ter um interface simplificado de configuração, até porque não sou muito fluente em smb.conf, mas isso fica para outro dia.

curl -o setup-repos.sh https://raw.githubusercontent.com/webmin/webmin/master/setup-repos.sh
sudo bash setup-repos.sh
sudo apt install --install-recommends webmin

O vosso acesso via browser ao Webmin vai ficar disponível em https://raspberrypi.local:10000. Vão ter de aceitar o certificado digital autoassinado que vem de origem e o port 10000 podem alterar depois. O username e password são o mesmo que usaram para se ligarem via SSH.

Para controlar os discos, instalei os Smartmontools que serve depois no Webmin para ter Self-Monitoring, Analysis, and Reporting Technology (SMART) dos discos compatíveis.

sudo apt install smartmontools

Todos os pacotes que instalei e testei eram identificáveis pelo posfixo da arquitetura armhf. Para confirmarem a arquitetura do vosso Raspberry Pi podem correr o comando dpkg --print-architecture.

Se não se lembrarem do nome que deram ao vosso RPi, façam cat /etc/hostname e podem ler o resultado.

Todos os Raspberry Pi foram tratados de maneira humana e sem sofrimento para efeitos deste artigo.

Referências:

Home-assistant é dos projetos com maior atividade no GitHub

Home Assistant
Home Assistant

O fim do ano de 2022 está quase aí e começa a ser altura de se fazer o balanço do ano. O GitHub publicou o seu “The state of the Open Source” com uma análise rápida dos dados recolhidos no que é hoje um dos principais sítios para suportar e acompanhar os projetos colaborativos de desenvolvimento na Internet.

Nesta descrição, o Home-assistant, projeto de que aqui nos tornámos fãs, foi identificado como o projeto com o segundo maior número de contribuições e o primeiro projeto em termos de crescimento do número de utilizadores que contribuem. Convém fazer notar que estes contributos são as participações efetuadas pelos utilizadores na forma de desenvolvimento de código fonte, através de pedidos de alteração, confirmação de código a alterar, comentários, abertura de incidentes de melhoria e correção e outras tarefas necessárias para garantir que estas coisas todas continuam a funcionar.

Este esforço partilhado tem sido apoiado pelas empresas participantes que mantêm o seu código fonte no GitHub, afetando assim o esforço pago pelos investidores em projetos que são depois beneficiados pela participação desta comunidade. A maioria dos projetos com maior atividade em destaque em 2022 são na sua maioria projetos destes, onde o Home-assistant é a exceção, ainda que os seus principais de colaboradores e fundadores estejam na Nabu Casa.

Mudar o Home-assistant de máquina

Home Assistant
Home Assistant

Um dia é dia e o vosso Home-assistant tem de ser mudado de máquina. Tem de mudar, quer seja porque querem melhorar o hardware, ou porque querem mesmo refazer o sistema operativo que, sabe-se lá porquê, instalaram numa versão de sistema operativo que não era de 64 bit. E agora, tinham o vosso sistema todo configurado e a funcionar, por isso não estão com muita vontade de perder isso. Este é mais ou menos o meu caso.

A minha lista de afazeres inicial, numa perspectiva mais geral, foi a seguinte:

  1. Verificar que estão num disco externo todos os scripts, configurações e outros ficheiros do sistema original acrescentados para além da instalação do Home-assistant.
  2. Fazer um backup do Home-assistant.
  3. Copiar o novo Home-assistant para o micro sd.
  4. Arrancar o novo Home-assistant.
  5. Recuperar o backup.

O meu sistema é composto por um Raspberry Pi 4, com um micro sd de 64 GB e um disco externo de 500 GB. Por hábito, já mantenho a parafernália que vou fazendo à minha medida no disco externo, por isso, em princípio, tudo isto seria um passeio. Só que não…

  • Tinha um script no home do root que verifica se o disco externo está montado, e, se não estiver, monta.
  • Tinha um ficheiro .git-credentials no home do root com o token de autenticação da minha conta GitHub.
  • Tinha chaves de autenticação no .ssh para aceder a outros sistemas a partir do RPi, como por exemplo o MotionEyeOS de uma das cameras.
  • Não me recordava que modelo de Raspberry Pi 4 comprei.
  • Tinha qualquer coisa no crontab de um dos utilizadores chave.
  • Tinha qualquer coisa no fstab.
  • O Home-assistant insiste em fazer backup com o conteúdo do disco externo porque o mount point é no /usr/share/hassio/share/.
  • Toda a casa está dependente do Home-assistant neste momento por causa do AdGuard, e por isso há que reconfigurar a rede para distribuir um DNS diferente já que o IP do Home-assistant vai estar indisponível por uns momentos.

Uma vez que decidam iniciar o processo, se forem como eu, vão pensar: “Ah e tal, se calhar é má ideia fazer isto sem um backup integral do SSD e se correr mal e tal…”.

Medir o sinal WiFi e mostrá-lo no Home-assistant

Sinal Wifi no Home-assistant

Os equipamentos baseados em ESP8266 e ESP32 (ESP) podem também servir-vos para medir a intensidade do sinal Wifi lá de casa. Isto pode ser útil para determinar se precisam de um repetidor de sinal Wifi, mudar o router wifi de sitio ou melhorar a antena do router Wifi.

A velocidade da Internet nos equipamentos sem fios depende da qualidade do sinal Wifi, por isso, é útil ter a capacidade de medir esse sinal como forma de depois sabermos o que temos de melhorar.

Com o ESPhome.io e alguns ESP isto fica tudo muito mais fácil de integrar no Home-assistant. Acrescentar um sensor de sinal Wifi ao Home-assistant através do ESPhome significa apenas acrescentar mais 3 linhas à configuração de cada ESP na secção sensor:.

- platform: wifi_signal
name: "WiFi Signal Sensor"
update_interval: 3600s

No exemplo do ESPhome.io vão encontrar como intervalo de tempo entre cada medida (update_interval) 60s. Para mim, medir a cada 60 minutos, e por isso configuro os sensores com 3600s.

Como todos os outros sensores do ESPhome.io, o Home-assistant vai identificar automaticamente o novo sensor e podemos por isso acrescentá-lo depois aos painéis.

A unidade de medida de apresentação dos resultados é o decibel (dB), que significa “um décimo de um Bel”. Para interpretar de forma útil os valores apresentados, uso como referência que um bom sinal terá de ficar entre os -70dB e -60dB, sendo melhor à medida que se aproxima de 0. Mas a tabela abaixo, traduzida do site MetaGeek, pode ajudar a perceber melhor como é que isto nos pode ser útil.

Força do sinalTL;DR DescriçãoEssencial para:
-30 dBmEspetacularMáxima força do sinal. O equipamento tem de estar muito perto do router Wifi, o que é pouco usual no mundo real.N/A
-67 dBmMuito bomSinal mínimo para aplicações que necessitam de uma ligação estável e atempada dos pacotes de comunicação.VoIP/VoWiFi, streaming video
-70 dBmBomSinal mínimo para considerar uma ligação capaz de entregar pacotes de comunicação.Email, web
-80 dBmNada bomSinam minimo para considerar que há uma ligação. Não é garantida a entrega dos pacotes de comunicação.N/A
-90 dBmInútilA aproximar-se dos limites do impossível. É quase impossível ter qualquer tipo de funcionalidade com esta força de sinal.N/A

Se forem olhar novamente para a imagem que está no inicio deste artigo vão ver que existe um ESP a obter uma medição de -21dB. Este ESP está a menos de um palmo do meu router, e por isso tem esta medição espetacular.

Interruptores smart com ESPhome e Home-assistant

Com o tempo, tenho transformado o meu apartamento numa smart home. Fiz isso usando o Home-assistant (HASS), alguns ESP8266 e ESP32 com vários tipos de sensores, e uns interruptores da marca SonOff, produzidos pela ITEAD.

Até há uns dias, usava código meu nos ESP8266 e ESP32. Nos interruptores, algo bem mais complicado, converti-os do firmware original para um firmware free open source chamado Tasmota. Este firmware Tasmota é largamente utilizado pela comunidade portuguesa do HASS. Nesta conversão, a parte mais difícil é mesmo abrir os interruptores e soldar uns pins a um programador série para fazer upload do código. Só custa a primeira vez…

Aqui há uns dias, converti todos os meus ESP para ESPhome, pelas várias vantagens que já referi. Hoje, decidi testar o ESPhome num dos meus interruptores de testes da SonOff.

As instruções para fazer esta mudança dos SonOff de Tasmota para ESPhome estão no próprio site do ESPhome. Mas ficam aqui os passos que fiz para um SonOff T2.

A primeira coisa que é necessário fazer é gerar um firmware com Over The Air (OTA) e fazer upload para o SonOff. Fiz tal e qual como nas instruções do ESPhome.

Cada interruptor smart-home SonOff pode ter uma configuração diferente. Cá em casa tenho vários SonOff T1 com 1 e 2 interruptores. Seguindo as instruções do ESPhome, fiz um teste com o SonOff T1 2ch.

No site está uma tabela com os pins e a configuração que temos de preparar em cada pin.


Pin
Função
GPIO0 Button 1 (inverted)
GPIO12 Relay 1 and Blue LED
GPIO9 Button 2 (inverted)
GPIO5 Relay 2 and Blue LED
GPIO10 Button 3 (inverted)
GPIO4 Relay 3 and Blue LED
GPIO13 Blue LED (inverted)
GPIO1 UART TX pin (for external sensors)
GPIO3 UART RX pin (for external sensors)

Por cada botão, vamos ter de adicionar uma secção destas:

binary_sensor:
- platform: gpio
pin:
number: GPIO0
mode: INPUT_PULLUP
inverted: True
name: "Sonoff 2CH Button 1"
on_press:
- switch.toggle: relay_1

E um destes:

switch:
- platform: gpio
name: "Sonoff 2CH Relay 1"
pin: GPIO12
id: relay_1

Vão ter de arrumar todos os switch e todos os binary_sensor na mesma secção, e não se podem repetir secções.

Reparem que o binary_sensor, que aqui representa um dos botões no painel do SonOff, tem uma condição on_press que altera um switch chamado relay_1. Este nome deve ser colocado como identificador do switch que querem mudar de posição. Neste caso, o id do switch 1 será relay_1.

É esta condição que faz com que a luz se ligue ou desligue de cada vez que pressionam o botão no painel do interruptor.

O resultado final fica assim:

substitutions:
  hostname: 'sonoff_04'
esphome:
  name: $hostname
  platform: ESP8266
  board: esp01_1m
wifi:
  ssid: MINHA_REDE_WIFI
  password: PASSWORD_DA_MINHA_REDE_WIFI
  fast_connect: True
  domain: .home
api:
  reboot_timeout: 0s
  password: "PASSWORD_PARA_API"
ota:
  safe_mode: True
  password: PASSWORD_PARA_OTA
logger:
# SonOff T2 2CH configuration
binary_sensor:
  - platform: gpio
    pin:
     number: GPIO0
     mode: INPUT_PULLUP
     inverted: True
    name: "$hostname Button 1"
    on_press:
     - switch.toggle: relay_1
  - platform: gpio
    pin:
     number: GPIO9
     mode: INPUT_PULLUP
     inverted: True
    name: "$hostname Button 2"
    on_press:
      - switch.toggle: relay_2
switch:
  - platform: gpio
    name: "$hostname Relay 1"
    pin: GPIO12
    id: relay_1
  - platform: gpio
    name: "$hostname Relay 2"
    pin: GPIO5
    id_5
output:
  - platform: esp8266_pwm
    id: sonoff_led
    pin:
      number: GPIO13
      inverted: True
light:
  - platform: monochromatic
    name: "Sonoff LED"
    output: sonoff_led

Reparem como aproveitei o que que explico sobre como configurar o ESPhome para facilitar os nomes de cada sensor e atuador.

Assim, se depois de ter o interruptor a teste uns dias estiver tudo a funcionar sem problemas, basta mudar o nome do hostname na secção substitutions para ter tudo pronto para outro interruptor com a mesma configuração. Só muda o nome.