Homeautomation System - Raspberry Pi 3
Desenvolvido com Python, Flask com AJAX e Firebase permite o controle local e remoto
Itens necessários
- Raspberry Pi3 Modelo B
- Relé
- 1 dispositivo para ser controlado (Usei uma lâmpada, mas pode ser qualquer outro)
- Jumpers
- Sensores (Se quiser melhorar ainda mais)
Getting start
Cenário 1: Clonar e executar
Cenário 2: Criar sua própria app seguindo o passo a passo
Clonar e executar
1. Instalação do sistema operacional
Se o seu Rasp for novo acompanhe o seguinte manual para instalação e configuração:
Instalação do SO Ou acompanhe o minicurso do Curso em vídeo
2. Conexõs físicas
Desligue seu Rasp antes de continuar para evitar danos.
Faça um esquema no Fritzing para definir qual pino será usado em qual dispositivo. Como na figura:
-O pino com conexão vermelha é o VCC, alimenta com 5V
-O pino com conexão preta é o GND (terra)
-O pino com conexão amarela é o 13 (GPIO), o que vamos conectar ao dispositivo a ser controlado
-O relé contém módulos, estamos utilizando o primeiro, atenção no processo das conexões para não danificar o Rasp nem causar mal funcionamento.
Para saber mais sobre as GPIO consulte Raspberry Pi GPIO
3. Instale o git com o comando
apt install git
4. Clone este repositório com
git clone https://github.com/joselinosantosti/homeautomation-raspberrypi.git
5. Execute a aplicação com o comando
python app.py
6. Acesse o browser e digite
localhost:5000
Faça o login com admin admin e teste seus dispositivos
Projeto Step by step
Realize os passos 1 e 2 se ainda não realizou, são pré-requisitos
1. Criando virtualenv e instalando os pacotes necessários
Abra o terminal e digite os comandos:
sudo su
(digite a senha)
apt-get update && apt-get upgrade
apt install virtualenv
Crie o virtualenv com o comando
virtualenv venv
Instale o flask
pip install flask
2. Estruturando o projeto Flask
Crie uma pasta com o nome smarthome ou outro que achar mais conveniente.
Crie as subpastas
-static (para arquivos de imagens, estilos css e Javascript)
-templates (para os arquivos html)
-models
Crie o arquivo app.py e adicione os códigos para as rotas de acordo com seu projeto. A seguinte rota aceita os método GET e POST e retorna a renderização da página index.html que por sua vez tem uma lógica para incorporar o código html da página lighting.html presente na pasta templates.
def lighting():
return render_template('index.html', module='lighting')
Arquivo html com os inputs Crie um formulário que chama outra rota e com os inputs que achar convenientes. O csrf_token é obrigatório nos formulários Flask.
Classe Device Crie um arquivo com o nome Device e adicione a classe:
gpio.setmode(gpio.BOARD)
class Device:
def __init__(self, pino, status):
self.pino = pino
self.status = status
gpio.setup(self.pino, gpio.OUT)
gpio.output(self.pino, self.status)
Com essa classe reaproveitamos o código para controlar uma grande quantidade de dispositivos de forma simples e enxuta.
3. Controlando dispositivos com AJAX
No seu arquivo principal importe a classe com o código:
from models.Device import Device
Crie um arquivo scripts.js na pasta /static/js e adicione o código AJAX
$(document).ready(function() {
function control(pino) {
$.ajax({
url: `/control/${pino}`,
data: $('form').serialize(),
type: 'POST',
success: (response) => {
console.log(response)
},
error: (error) => {
console.log(error)
}
})
}
//Selecionar todos os inputs e adicionar evento de click
document.querySelectorAll(".device").forEach(slider => {
slider.addEventListener("click", (e) => {
const pino = slider.getAttribute("name")
control(pino)
})
})
})
É um código AJAX convencional. A cada clique no botão do dispositivo é capturado o name(numero do pino) e executada a função control() passando o valor capturado como parâmetro
O código AJAX chama a rota '/control' passando o valor como parâmetro para ser usado no código Python.
Código Python
O seguinte código recebe a requisição via AJAX, instancia a classe Dispositivo passando o pino e ação. Em seguida retorna os dados para fins de debug.
@app.route("/control/
", methods=['GET','POST'])
def control(pino):
status = 1 if len(request.form) > 1 else 0
dev = Device(pino, status)
response = {'response': 200, 'pino': pino, 'status': status}
return response
A lógica da variável status retorna 1 se o resultado da requisição for maior que 1, o que só ocorre quando o resultado do input for positivo, no caso do checkbox desmarcado nada será retornado além do csrf_token. Desse modo saberemos que o campo está desmarcado e retorna status = 0.
Conexão com Firebase e controle via Internet
...