DONOFF dimmer iot light
Colocado sobreo firmware
O que você precisaPara compilar e transferir o firmware DONOFF para um ESP-01 você vai precisar de:
- A IDE Arduino
- A extensão do núcleo ESP8266 (2.4.2 ou 2.5.0)
- Instalou a 'Ferramenta de upload de esboço do ESP8266'
- O patch PUYA (para o núcleo ESP8266 versão 2.4.2)
Muitas placas ESP-01 que você pode comprar agora possuem um chip flash que causa problemas na leitura do conteúdo da memória flash (eles possuem um chip Flash da marca PUYA). Para resolver os problemas, há um patch temporário para a versão 2.4.2 (olhe aqui) disponível (provavelmente este patch está incluído na versão 2.5.0 da extensão ESP8266). Para a versão 2.4.2 (e anteriores), é imperativo que você aplique este patch na cadeia de ferramentas.
WebSockets – uma breve introdução
A world wide web foi criada com a ideia de que um cliente (um navegador, por exemplo) faz uma solicitação a um servidor e que o servidor honra essa solicitação enviando uma página da Web (modelo de solicitação-resposta). A desvantagem desse método é que o servidor só pode enviar algo a um cliente se o cliente solicitar especificamente. Mas e se um servidor tiver novas informações que deseja enviar ao cliente? Para lidar com esse problema, foram desenvolvidas várias estratégias que permitem ao servidor "enviar" dados para o cliente. Uma das estratégias mais populares (fora do AJAX) era a votação longa. O servidor e o cliente mantêm a conexão HTTP aberta até que o servidor tenha dados para enviar ao cliente.O problema com todas essas soluções é que elas envolvem a sobrecarga do protocolo HTTP. Cada 'solicitação HTTP' envia uma montanha de cabeçalhos e cookies para o servidor. E isso rapidamente se torna uma grande montanha de dados que precisam ser enviados pela linha, o que, por sua vez, causa atrasos (latência). Se você deseja construir algo como um sistema em tempo REAL baseado em navegador, você deseja o menor 'atraso' possível para manter as coisas funcionando sem problemas.
O que o www precisa é de uma conexão 'persistente' e de 'baixo atraso' que suporte transações iniciadas pelo cliente e/ou servidor! E é exatamente isso que o WebSockets oferece e o firmware DONOFF faz uso extensivo dessa funcionalidade.
Como funcionam os WebSockets
O WebSockets mantém uma conexão entre o cliente e o servidor que pode ser usada por ambas as partes para enviar mensagens entre si a qualquer momento.O cliente estabelece a conexão WebSocket por meio de um processo conhecido como 'aperto de mão WebSocket'. O processo começa quando o cliente envia uma solicitação HTTP normal ao servidor. Essa solicitação contém o chamado 'cabeçalho de atualização' por meio do qual o servidor sabe que o cliente deseja estabelecer uma conexão WebSocket.
Se o servidor suportar o protocolo WebSocket, ele concorda com o Upgrade e o confirma ao cliente retornando um cabeçalho Upgrade.
Agora que o handshake foi acordado, a conexão HTTP usada até então é substituída por uma conexão WebSocket sobre a mesma conexão TCP/IP subjacente. A partir de agora, ambas as partes (cliente e servidor) podem enviar dados entre si. Os dados são enviados via WebSocket como uma mensagem por meio de um ou mais pacotes contendo os dados enviados (a carga útil).
Como funciona o firmware DONOFF
Antes de me aprofundar no funcionamento do firmware DONOFF, primeiro explico alguns conceitos. O que quero dizer com:- Mestre - este é o DONOFF que tem controle sobre seu próprio dispositivo local e sobre todos os Donoffs escravos
- Escravo - este é um DONOFF que controla apenas seu próprio dispositivo local
- Servidor – este é o servidor web em um DONOFF (mestre ou escravo)
- Cliente – este é o navegador que se conecta a um servidor web DONOFF. É a interface entre o hardware e o usuário
- local-Device – este é o dispositivo físico que cada DONOFF (Mestre ou Escravo) atende
Depois que um DONOFF estiver conectado à rede elétrica, ele iniciará um servidor da web. Se o servidor da web tiver um URL como:
“http://hostname.local/”
do cliente, o servidor enviará a página index.html para o cliente.
Este arquivo index.html contém, além do código html, também o código Javascript. O código Javascript garante que uma conexão WebSocket seja estabelecida com o servidor web.
Após esta conexão ser estabelecida, o cliente envia a mensagem “getDevInfo” ao servidor ao qual responde por uma mensagem contendo o hostname deste DONOFF, que tipo de DONOFF é este (Master ou Slave) e qual firmware está rodando no DONOFF.
O cliente então envia uma mensagem solicitando a versão mais recente do DOM (“updateDOM”). O servidor agora constrói um DOM contendo seu dispositivo local (se for um mestre, de todos os outros DONOFFS que conhece) e o envia de volta ao cliente.
A partir daqui, toda a comunicação entre o cliente e o servidor é orientada por eventos. Se o usuário mover um controle deslizante na tela, o cliente perceberá isso e enviará um novo valor do controle deslizante para o servidor que, por sua vez, ajustará a intensidade de seu dispositivo local. Quando o usuário clicar no botão On/Off, o cliente enviará o novo status para o servidor, que tomará as ações necessárias para atender à solicitação do usuário.
No entanto, há algo mais que é acionado quando o estado de um dispositivo muda:
- Se o DONOFF for um Slave ele enviará uma requisição HTTP para o DONOFF Master com o novo status de seu Local-Device. O Master irá processar esta informação e o servidor (Master) enviará este novo status para seu cliente. Assim, se você mover o controle deslizante no Escravo, a nova posição do controle deslizante também ficará visível no cliente conectado ao Mestre.
- Se o DONOFF for um Master, e não for uma mudança de seu Local-Device, então o Master enviará uma solicitação HTTP para o DONOFF Slave com o novo status do Slave-device, que por sua vez mudará seu Local-Device e o servidor (Slave) enviará o novo status para seu cliente que atualizará o navegador. Resumindo, todas as alterações no cliente Master também serão visíveis no cliente Slave.
Se o Master receber uma solicitação HTTP de um Slave que ainda não conhece, ele incluirá os dados do novo Slave em sua lista de dispositivos e construirá um novo DOM. Em seguida, ele enviará um DOM atualizado (com o novo dispositivo nele) para seu cliente. O novo dispositivo ficará visível no navegador.
Esta informação é enviada em uma solicitação HTTP:
IPaddress // identificação única deste DONOFF Label // conforme mostrado na tela Type // este é um D)immer ou um S)switch minState // qual é o menor valor de PWM que pode ser definido maxState // qual é o maior Valor de PWM que pode ser definido Estado // qual é o valor atual de PWM OnOff // a lâmpada está ligada ou desligada pulsação // quando este DONOFF foi visto pela última vez?
Periodicamente, cada Escravo envia uma requisição HTTP ao Mestre para que ele saiba que ainda está online. Toda vez que o Master receber uma requisição HTTP, ele zerará o heartbeat do Slave. Caso o valor do heartbeat ultrapasse um determinado limite, o Master concluirá que o Slave não está mais online e removerá os dados deste Slave de sua lista de dispositivos, construirá um novo DOM e enviará para seu cliente.
Sistema de nome de domínio multicast
O firmware DONOFF faz uso extensivo da funcionalidade do Multicast Domain Name System (mDNS). Em redes de computadores pequenas (locais), o protocolo mDNS traduz nomes de host em endereços IP. É o chamado serviço de configuração zero. Graças a este protocolo, é possível acessar um servidor ou outro dispositivo usando seu nome mDNS (hostname) em vez de seu endereço IP. Em outras palavras, se você digitar "DONOFF.local" como URL em seu navegador, o mDNS procurará o endereço IP do dispositivo DONOFF e apresentará a página da web do DONOFF Master (ou Slave).O firmware DONOFF no Slave usa isso para encontrar o endereço IP do DONOFF Master e rastrear mudanças no endereço IP. DONOFF não usa endereços IP fixos, portanto, de tempos em tempos, o endereço IP do DONOFF Master pode mudar. Embora o mDNS "funcione" na maioria das redes, existem alguns (mais antigos) WiFiRouters e extensores WiFi que bloqueiam os pacotes mDNS. Se você não pode acessar o DONOFF por seu nome de host (