ESP8266: Como enviar e-mail por um servidor SMTP

Para a versão que usa SSL/TLS, veja este post.

Este código é um aperfeiçoamento do código apresentado aqui.

Testado com IDE 1.8.1 e ESP8266 Core v2.3.0

Melhorias:

  • Não é preciso pré-codificar usuário e senha em base64. Eu inclui as rotinas para isso;
  • Removi o uso de flash strings, que aparentemente era a causa da rotina demorar absurdamente em certos pontos;
  • Usei constantes no lugar de strings “hardcoded”;

Versão que prefiro

Eu criei esta versão porque preferia uma rotina de envio mais “limpa” e o log na porta serial feito de forma a representar com mais fidelidade a comunicação com o servidor.

 

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como fazer um atualizador para DDNS Cloudflare

Eu não sou programador. Tudo o que garanto é que nas condições certas o programa funciona.

Correções e aperfeiçoamentos são bem-vindos.

Você precisa de:

Preencha os dados da sua rede sem fio e da sua conta Cloudflare e faça o upload. Se tudo estiver certo o procedimento do programa será o seguinte:

Ao inicializar:

  • Verifica o IP registrado para o host na sua conta Cloudflare;
  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Se forem diferentes atualiza a sua conta Cloudflare;
  • Guarda o IP para não precisar mais consultar a conta;

A cada 10 minutos

  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Compara com o ip armazenado e atualiza sua conta se forem diferentes;

Em caso de erro o programa reduz o intervalo entre checagens para 2 minutos. Retorna a 10 minutos após o primeiro sucesso.

 

A melhorar:

  • As rotinas de parse ainda são uma gambiarra;
  • Não testei se minhas checagens de erro realmente funcionam;
  • Com mais alguns GETs e parses JSON é possível obter o zone_id e o host_id a partir do host_name. Isso simplifica a vida de quem não sabe obter essas informações.

O programa não prossegue se o fingerprint do certificado for diferente do esperado. Infelizmente isso significa que quando o certificado da Clouflare for atualizado o programa deixará de funcionar até que um novo fingerprint seja inserido. Você pode remover esse requerimento mas fica sujeito a roubo de suas credenciais num ataque MITM. Uma sugestão seria armazenar o fingerprint em um arquivo no SPIFFS e fazer o programa ao não conseguir mais validar o certificado mandar uma mensagem para você e passar a procurar por uma atualização de fingerprint no seu domínio, em arquivo criptografado por você.

Infelizmente não parece haver meio do ESP8266 verificar a validade de certificados em tempo real. A checagem de fingerprints foi o melhor que a impressionante equipe por trás do desenvolvimento conseguiu fazer.

Ferramentas online úteis ao debugar esse projeto:

  • Teste da ArduinoJSON – Você pode testar algumas idéias sem ter que fazer upload para um arduino
  • dostring.com – Não sabe qual o tamanho do JSON em bytes? String Length diz.
  • JSON Parser Online – Não consegue visualizar a árvore mentalmente? Permite colapsar estruturas;
Postado em Informação | Tags: | 2 Comments

Como usar I2C no ESP8266 e especificamente no ESP-01

esp8266_esp01_automalabsUsando a IDE Arduino com Board ESP8266 é realmente muito simples. Não é preciso usar uma biblioteca I2C específica como é o caso de rede e seus programas já existentes devem funcionar exceto por um detalhe: você precisa especificar na inicialização da biblioteca Wire os pinos que você está usando para I2C no ESP8266.

Wire.begin(SDApin, SCLpin);

No ESP-01 você provavelmente vai ter que usar GPIO0 e GPIO2, por isso a inicialização fica assim:

Wire.begin(0, 2);

Em todos os casos você deve colocar resistores de pull-up de 4k7 nos GPIO que você escolheu para I2C. Atente para o fato de que alguns módulos i2C já vem com esses resistores.

No desenho SDA e SCL estão invertidos. Depois eu corrijo isso.

ESP-01_PCF8574_I2C

Postado em Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)

Use o browser para debugar seu projeto que usa HTTP

Na maioria das vezes você não precisa instalar um proxy ou nada mais complicado para ver como está se comportando seu projeto. No Chrome, por exemplo, tecle F12 para abrir as ferramentas de desenvolvedor e clique na aba “network” (rede). Daí “visite” o seu projeto.
A cada clique que você der o Chrome vai mostrar que arquivos (CSS, imagens, javascript, etc) foram requisitados, que tamanho tinham, quanto tempo levou, quais não chegaram, a ordem das operações, etc.

http_debug_chrome_automalabs.com.br

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

Como obter dispositivo e função de um código de controle remoto NEC

Eu me deparei com esse problema ao chegar a essa página do RemoteCentral que lista os comandos como sendo compostos de dispositivo, sub-dispostitivo e função.

Depois eu me deparei com esta outra que faz o mesmo.

Por exemplo, o código para Power é descrito como:
Protocol NECx2, device 7, subdevice 7, OBC 2

Mas de onde vem isso? Eu sempre decodifiquei esse código como sendo E0E040BF. Como um número tão complexo esconde apenas os números 7, 7 e 2?

Eu encontrei a resposta ao analisar o funcionamento do programa SamsungBlinkie para Arduino

O código hexadecimal é dividido em três partes (as duas primeiras em conjunto formam o chamado “endereço”):

E0 -> dispositivo 7
E0 -> sub-dispositivo 7
40BF -> função 2

Vendo esses números em binário a coisa começa a fazer sentido.

E0 = 11100000. Note que se você espelhar esse número, vira 00000111, que é 7. Já sabemos então de onde vem o dispositivo e o sub-dispositivo.

A função é codificada de forma ainda mais confusa, mas se você olhar em binário rapidamente entende.

O primeiro byte corresponde a um 2 binário espelhado e o segundo byte é uma inversão bit a bit do primeiro e funciona como um “checksum” para que o dispositivo tenha certeza de que leu corretamente.

Note que a Samsung usa um código NEC estendido. Nos códigos NEC tradicionais ou a segunda parte do endereço também é um checksum da primeira ou não existe segunda parte no endereço.

Postado em Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)

Códigos discretos de controle remoto para TVs Samsung

Códigos ou comandos “discretos” são comandos cujo resultado não depende do atual estado do aparelho. Por exemplo, quando você manda um comando “Power” para uma TV, esse comando pode ser “Power On” ou “Power Off”, dependendo do estado atual da TV. Se a TV já estiver ligada e você mandar um comando Power querendo ligá-la, vai desligar.

Então para ter certeza de que você vai ligar quando quer ligar, precisa do código discreto de PowerON da TV. Códigos discretos são essenciais  para uma automação sem falhas.

Convertendo os códigos no formato Pronto Hex publicados no RemoteCentral usando a informação que dei no post anterior, chegamos a essa lista:

 

Não há garantia de que todos os códigos funcionem no seu modelo Samsung e eu só testei até agora PowerOn e PowerOff.

Postado em Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)

Como converter comandos no formato Pronto Hex para o formato da irLib

No momento eu vou apenas mostrar como se faz para comandos NEC.

No RemoteCentral você vai encontrar muitos códigos de controle remoto infravermelho, mas num formato difícil de armazenar na limitada memória do Arduino: O Pronto Hex. Esse formato tem a vantagem de descrever completamente como é o sinal transmitido, mas é muito inconveniente.  Vou tomar por base os comandos de TV Samsung.

Por exemplo, vamos decodificar o comando discreto para selecionar a porta HDMI4:

Device Code: 7.7 Function: 197HDMI 4 (SIDE)
0000 006D 0000 0022 00AC 00AB 0015 0041 0015 0041 0015 0041 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 0015 0041 0015 0041 0015 0041 0015 0016 0015 0016 0015 0016 0015 0016 0015 0016 0015 0041 0015 0016 0015 0041 0015 0016 0015 0016 0015 0016 0015 0041 0015 0041 0015 0016 0015 0041 0015 0016 0015 0041 0015 0041 0015 0041 0015 0016 0015 0016 0015 0689

Os primeiros seis valores podem ser ignorados, porque são parte do protocolo NEC.

0000 006D 0000 0022 00AC 00AB

O código mesmo só começa a partir do sétimo valor e devem ser organizados em grupos de dois. Cada grupo que tenha dois números iguais ou próximos é um “0”. Cada uma cujo segundo valor seja cerca do dobro do primeiro é um “1”

Os dois últimos grupos são ignorados porque são a finalização do protocolo.

O código é 11100000111000001010001101011100 ou E0E0A35C

Veja a minha lista de comandos discretos para TVs Samsung.

Postado em Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)

Cuidado ao usar o ESP8266 no modo AP_STA

Certas operações podem falhar silenciosamente nesse modo porque duas redes são criadas: a do AP e a do STA.

Por exemplo, se o ESP8266 estiver conectado a um roteador WiFi na sua rede (modo STA) e estiver com o modo AP habilitado, se o ESP8266 enviar um broadcast UDP para 255.255.255.255 esse broadcast não vai ser transmitido para a sua rede e sim para a rede criada pelo AP.

Mas se você mandar um broadcast para o endereço de broadcast da sua sub-rede, funciona, porque aí a biblioteca UDP sabe para onde mandar.

Por exemplo, se sua rede for da faixa 10.0.0.x:

resultado=udp.beginPacket(IPAddress(255, 255, 255, 255), 2391); //Não funciona

resultado=udp.beginPacket(IPAddress(10, 0, 0, 255), 2391); //Funciona mesmo com o AP habilitado

Claro, há situações em que mandar um broadcast para a sub-rede não é o bastante, pois você pode estar procurando o ESP8266 em outra sub-rede e não vai receber a mensagem. No momento eu não conheço outro jeito que não seja desligar o AP para enviar o broadcast.

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

Como testar o envio de notificações para o Pushbullet

Neste texto eu vou usar o complemento Postman do Google Chrome para enviar notificações para dispositivos com o Pushbullet configurado para a minha conta. Enviar notificações para outras pessoas será abordado em outra oportunidade.

Você vai precisar do Access Token que é obtido na sua conta em Settings -> Account -> Create Access Token

Digamos que seu AccessToken seja

Com o Postman:

Selecione “POST” e coloque o endereço “https://api.pushbullet.com/v2/pushes”

Chrome_Postman_Pushbullet_detalhe1_automalabs.com.br

Em Headers, acrescente um key de nome Authorization com o conteúdo

Chrome_Postman_Pushbullet_detalhe2_automalabs.com.br

Em Body, selecione “raw” e na caixa de seleção à direita escolha JSON

Cole na caixa diretamente abaixo o texto a seguir:

{“type”: “note”, “title”: “Enviado pelo Postman”, “body”: “Sucesso!”}

Chrome_Postman_Pushbullet_detalhe3_automalabs.com.br

Você verá que em Headers foi acrescentado um key de nome “Content-Type” e valor “application/json”

Chrome_Postman_Pushbullet_detalhe4_automalabs.com.br

Clique em SEND. Você deverá receber uma resposta do tipo:

E seus dispositivos conectados à mesma conta deverão receber a notificação

Se a resposta for do tipo “Invalid Token” como esta:

e você tiver certeza de que o Token está certo, experimente limpá-lo de caracteres estranhos (invisíveis).
Para isso você pode colar o Access Token no notepad e salvar como ANSI. Se for esse mesmo problema você verá uma mensagem sobre a conversão. Confirme e o Token já deverá estar limpo.

Porém essa “limpeza” às vezes dá mais trabalho. Eu notei que a versão anterior do Postman, quando ainda se chamava “Postman REST client” não tem esse problema.

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

Códigos do controle remoto do DVR ControlBR iDVR CBR-ST16H

controle_remoto_DVR_ControlBR_iDVR_CBR-ST16H_DSC02640_640_automalabs.com.br

Protocolo NEC de 32 bits

 

Postado em Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)