Analisando os dados de sensores com o Raspberry Pi e GCP

Diogo Miyake
13 min readAug 4, 2020

Já pensou em fazer um mini projeto de IoT para seu portifólio usando algumas ferramentas bem legais e um Raspberry Pi ? Borá lá que irei mostrar o step by step.

Objetivo

Usar um Raspberry Pi com sensores e enviar os dados ao GCP usando as seguintes ferramentas: Cloud IAM, Cloud Storage, Cloud Pub/Sub, Cloud IoT Core, Cloud Dataflow e BigQuery. Além do queridissímo Terrraform para subirmos nossa infra.

Ferramentas usadas

Lista de Materiais

Para seguir este passo a passo serão necessários os seguintes itens:

  • Uma máquina Linux (Estas etapas foram feitas no Linux (ubuntu 18.04)
  • Raspberry Pi 3 Model B ou superior com SO Raspian.
  • Python instalado (ja vem no raspian) e atualizado versão > 3.7.
  • Saber o básico de python.
  • 1 Sensor de movimento PIR.
  • 1 Protoboard, pode ser at a mini.
  • Cerca de 10 fios jumpers macho/femea ou mais.
  • Um sensor DHT11 ou DHT22 (O DHT22 precisa de um resistor)
  • 1 conta no Google Cloud Platform.
  • Saber o básico de terraform e ter ele instalado.
Nossa arquitetura simplificada

Repositório

GCP

Bom começaremos com o GCP pois é a etapa mais simples.

Crie uma conta no GCP é gratuito não precis de cartão e te dão 300 doletas para gastar basta clicar no link abaixo.

Crie um projeto

Precisamos de um projeto pois a partir dele que organizamos nossas contas de serviços usuarios e recursos dentro do GCP.

Vá para a página de gerenciamento de recursos no console da nuvem do Google e selecione Create Project (https://console.cloud.google.com/cloud-resource-manager)
Digite um nome para o projeto, ele pode ser o que você desejar e clique em Create.

Habilitando as APIs

É necessário que sejam habilitados as APIs que serão usadas para isso vá em home API’s & Services e clique em dashboard.

Procure pelas seguintes APIs:

  • Dataflow API
  • Cloud Pub/Sub API
  • Cloud IoT API

Vá em Enable API e selecione Enable APIs and Services

Pesquise pelas APIs conforme passado os nomes acima, por exemplo DataFlow.

Clique em DataFlow API e em Enable.

Repita o processo para as outras APIs.

Como estes processos precisam ser no cloud console não temos muitas opções para autmoatizar (Outra forma seria usar a CLI ou Cloud Shell ).

Criando um Bucket

Precisamos criar um bucket para armazenar os dados que serão enviados ao GCP pelos sensores para isso vá no menu à esquerda, selecione Storage e clique em Browser.

Clique em Create e dê o nome que desejar:

Criando uma conta de serviço

Esta é uma etapa crucial para nós, pois a partir desta conta de serviço usaremos tanto o terraform como o Raspberry para se comunicar com os recursos de nosso projeto no GCP.

Para isso vá em IAM & Admin > Service Accounts.

Clique em create service account:

Dê o nome que desejar e clique em Create.

Para este caso darei a role de project editor. Mas o ideal é você ter uma para cada aplicação e dar somente os privilégios referentes aos serviços que irá utilizar.

Após isso clique em Continue e Done, entre na conta de serviço clicando sobre ela e vá em Key > Create New Key > Json e selecione Create.

Será feito o download, após isso basta colocar em um diretário, recomendo já colocar em uma pasta onde utilizaremos os códigos do terraform e os scripts para ler os dados dos sensores.

QUando ouço Infra as a Code

Infra as a Cloud com o Terraform

Usaremos o Terraform, uma ferramenta da Hashicorp para poder subir nossa infra, essa ferramenta é F0d@, simplesmente sensacional. Basicamente permite fazer deploy, manutenção, atualizar e destruir recursos usando os principais providers de cloud existentes, o Terraform usa a linguagem HCL, uma linguagem baseada em JSON e YAML para realizar as configurações necessárias de IaC.

Para saber mais dê uma olhada na documentação, tem este video do Jefferson da Linuxtips, e neste video do Lucas Souza, onde ele ensina o terraform além do Básico. Se quiser fazer treinamentos recomendo o learn da Hashicorp que é de graça, se quiser algo mais completo e pago tem este da Linuxtips.

Etapas

Agora nesta parte sobre o terraform nós teremos as seguintes Etapas:

  1. Instalar o Terraform
  2. Criar os arquivos HCL
  3. Iniciar o terraform
  4. Criar um Plano
  5. Applicar um Plano
  6. Verificar na Cloud nossa infra
  7. Destruir tudo (Isso somente após realizarmos o experimento, vai estar na sessão limpando a bagunça)

Instalando o Terraform.

Para instalar o Terraform basta seguir este material da Hashicorp.
Onde instalar? onde vc quiser, pode ser no cloud shell do google, em uma instancia do compute engine, em sua máquina local ou no raspberry. Caso queira usar o Terraform Cloud esse processo muda um pouco. (sinceramente vai de CLI)

Códigos HCL

Para este exemplo usarei um código mais simples com todos os resources no main.tf, recomendo dar uma olhada em módulos pra poder criar da melhor forma e mais organizado, criando cada resource como um modulo especifico.

No artigo deste link, tem um overview sobre yaml, onde explico de forma bem direta alguns pontos principais para você ja começar a codar.

Codando o arquivo .tf

Bom para começarmos crie um arquivo chamado main.tf no diretório onde estaremos trabalhando. Como eu escrevi anteriormente, pode ser em seu notebook/pc/vm ou rapsberry, lembre de ter seu arquivo de credenciais junto. No meu caso eu executei o terraform em um pc para o deploy, e no raspberry eu executei somente os scripts de leitura de sensores envio para o pubsub.

Abaixo um exemplo simples de código, nesse caso usei umas variaveis para tirar um pouco do hardcode. O intuito é justamente mostrar que eu poderia usar variáveis em todos os preenchimentos de campos que não teria porblema, isso até facilitaria a nossa vida.

A e o backend eu mantive local para este exemplo, em produção não se faz isso, como melhor prática é usado um storage para armazenar o arquivo .tfstate.

Exemplo de main.tf estilo xgohorse …

Abaixo o exemplo utilizado do variables.tf

variable.tf ao estilo XgoHorse

Apos criar os arquivos a sua estrutura de arquivos vai ficar tipo isso:

Os arquivos que estarão no seu será o main.tf e o variables.tf

Agora verifique se esta ok com seu terraform digitando no terminal:

terraform --version

Version of terraform

Agora vamos iniciar ele com o comando:

terraform init

inicializando o terraform

Com o terraform inicializado vamos agora subir um plano

Após a inicialização, vamos criar um plano chamado gcp_tf_plan.

terraform plan -out gcp_tf_plan

Plano criado

Note que os simbolos de + indicam que os recursos serão adicionados ao usar um apply.

Agora vamos subir essa bodega com o comando apply:

terraform apply "gcp_tf_plan"

Que coisa mais linda o deploy…

E agora ???

Partiu GCP para ver nossos recursos criados…

  • Bucket
Bucket Ok
  • Tópico
  • IoT Core Registry
  • BigQuery Dataset e Tabela
  • Cloud Dataflow
Como tudo está ok…

Terraform Graph

Uma forma interessante de saber o que fizemos é realizar uma visualização como um grafo os nossos deploys podemos usar os seguintes comandos:

sudo apt install graphviz

terraform graph | dot -Tsvg > graph.svg

Olha a nossa infra que legalzinho

Algumas dicas e informações para as configurações do Cloud Dataflow:

Cuidado com as regioões e parameters, pois são necessários para fazer funcionar. A documentação do terraform sobre isso é pobre. portanto dê uma olhada nos links abaixo:

Trecho da documentação do terraform sobre os providers como o GCP: https://www.terraform.io/docs/providers/google/r/dataflow_job.html#template_gcs_path

Pergunta no StackOverflow sobre o assunto:https://stackoverflow.com/questions/59882595/deploy-a-dataflow-with-terraform

Endpoints de regioes e zonas do Dataflow: https://cloud.google.com/dataflow/docs/concepts/regional-endpoints

Infos sobre os templates: https://cloud.google.com/dataflow/docs/guides/templates/provided-streaming#gcloud_1

Para saber qual o nome do parâmetro dever ser passado no campo parameters dentro dos resources do Dataflow no terraform veja o nome do campo e seu formato neste link : https://cloud.google.com/dataflow/docs/guides/templates/provided-streaming#gcloud_2

Dai clique em GCLOUD, note o campos inputTopic e outputTableSpec, e confira no main.tf.

Obs.: Perdi um tempo entendendo como eles funcionam.

Configs do Dataflow

Outra forma de ver isso é na documentação de rest API do GCP: https://cloud.google.com/dataflow/docs/reference/rest/v1b3/projects.locations.templates/create

Raspberry Pi e sensores

Para acessar seu raspberry você pode usar um ssh, ou aplicação de controle remoto eu particularmente gosto do VNC, pois tenho acesso a 5 devices de graça sem limite de tempo de conexão.

Sobre os sensores eu comprei os meus a 2 anos no Aliexpress paguei barato neles, o mais caro é o raspberry que hoje esta acima de R$500,00 em alguns lugares (modelo 4 a partir de 2Gb de RAM), o meu é o model 3 B com 1GB de RAM, que no meu caso atende bem, pois fico apenas fazendo alguns labs.

Kit 37 sensores: https://pt.aliexpress.com/item/32691556711.html?spm=a2g0s.9042311.0.0.3641b90ah14X2D

Kit 16 Sensores: https://pt.aliexpress.com/item/32458783263.html?spm=a2g0s.9042311.0.0.3641b90ah14X2D

Hoje esta um pouco mais caro devido ao dólar na época esses dois kit mais um arduino eu paguei cerca de 120 reais.

Aqui tem o link de um RPI 4 com 2gb de RAM sai mais barato que no mercado Livre (não vi com o frete, pois dependendo da mercadoria, o frete no Aliexpress esta mais caro).

Deixando de lado os links de compra.

Recomendo atualizar o python, neste link é mostrado como fazer um update para a versão 3.8

Ligando os Sensores

Primeiro você precisa entender qual porta é referente ao quê:

  • As de 5V e 3v3 São de saídas de carga.
  • Ground é o terra.
  • As outras são específicas, neste momento usaremos as verdes escrito GPIO, no caso a GPIO17(pino11) e a GPIO4(Pino 7)

A ligação vai ficar conforme a imagem abaixo.

Made in Fritzing

Após montar os sensores é hora de acessar o Raspberry.

Acessando o Raspberry

Acesse seu RPi, crie uma pasta com o nome que desejar, e entre na pasta.

Para isso você pode usar o comando:

mkdir iot_projects

Entre na pasta usando o comando:

cd iot_projects

Agora verifique vamos criar nosso ambiente:

python -m venv venv

Ativar o ambiente

source venv/bin/activate

E instale as bibliotecas:

pip3 install google-cloud-pubsub
pip3 install Rpi.GPIO
pip3 install gpiozero
pip3 install Adafruit_DHT

Outra opção é usar este pacote: https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup

Agora vamos ao código. O código abaixo captura os dados utilizando os sensores.

Para enviar os dados ao GCP

Após isso coloque na mesma pasta o arquivo de credenciais do gcp.

Ao listar os documentos você terá uma pasta parecida com esta.

Hierarquia de pastas

Obs.: No meu caso eu usei um pip freeze > requirements.txt assim o python pega todos os pacotes e dependencias e salva no arquivo txt. Assim ao baixar eu uso um pip install -r requiments.txt para isntalar os pacotes ao baixar o diretório.

Além disso tem os arquivos motionsensor.py e o temp_humidity_sensor.py que forma criados para teste dos sensores e portas GPIO.

Subindo os dados

Antes de subir os dados é necessário passar o caminho do arquivo de credenciais. Com o comando:

export GOOGLE_APPLICATION_CREDENTIALS="(Path to JSON file)"

Depois execute o comando:

python3 sendMessageToCloud.py

Sobre as portas do GPIO

Neste video é explicado como elas funcionam: https://www.youtube.com/watch?v=U6N5pRDOrg4

Se desejar conteudo em português tem esse do curso em video: https://youtu.be/i3TwN8Ok-No, Ou este video do EDUKATIKA: https://youtu.be/eOT71ONIEpg

Visualização dos dados

Estamos chegando ao final de nosso tutorial, para isso vamos abrir o Google DataStudio (Uma ótima ferramenta gratuita para criar visualizações de dados)

Entre no link: https://datastudio.google.com/

Vai abrir uma janela para selecionar a fonte de dados, selecione o Google BigQuery.

Após isso selecione a tabela que criamos, e clique em adicionar

O Datastudio ja vai inserir automaticamente para você uma tabela com alguns dos campos, se quiser pode excluir ela.

Vá em Recurso > Gerenciar Fontes de dados adicionadas.

Clique em editar.

Clique sobre os três pontos ao lado de timestamp e selecione Duplicar.

Agora lique sobre o nome duas vezes e renomei para minutos, depois clique sobre a seta a direita de data (AAAAMMDD), e selecione data e hora > minuto.

Repita o processo duplicando a coluna minutos para horas, e se desejar renomeie os outros campos, ficará parecido com isso.

Após isso clique me conluido no canto superior direito e eme fechar.

Vá em adicionar gráfico.

Selecione série temporal.

Adicione as dimensões Horas e Minutos, e como métricas a Temperatura e a Umidade.

Agora vamos adicionar um gráfico de Barras.

Agora selecione Minutos como dimensão, em dimensão detalhada jogue o campo Movimento, e em métricas Movimento, após isso clique no canto esquerdo conforme na imagem abaixo:

Coloque um nome e em Agregação selecione Contagem.

Agora vé a direita em classificar e selecione minutos crescente.

Uma dica é criar um campo calculado de Umidade e dividir por 100, e colocar ele com o tipo porcentagem, assim o datastudio o calcula e formata da forma necessária para uma melhor visualização.

Caso queira adicione uns KPI’s (se chama visão geral no DataStudio) e alguns filtros.

No final o meu ficou assim:

Agora o céu(e seus créditos na nuve)m é o limite, dá para realizar muitas tarefas bacanas com sensores.

Limpando a bagunça

Bom agora vamos limpar a sujeira né… Volte ao terminal e use o comando:

terraform destroy

O terraform se encarrega de limpar a sujeira, imagina se tivessemos subido na unha cada um? seia tedioso ter de destruir cada item né…

Concluindo

Espero que tenham gostado, deste post, caso tenha alguma dúvida pode comentar ou me mandar mensagem no Linkedin.

Tentei trazer de uma forma simples e diferente dos conteúdos que encontrei na internet, e em português pois temos muito poucos conteúdos em nosso idioma.

Um grande abraço!

Obrigado

Referências

  1. A maior referência foi essa, pois foi a partir dele que fiz alguns testes e resolvi criar este material, mudei os sensores, embora eu tenha o de distancia eu preferi usar outro, as aplicabilidades são diversas — Iot 4 Beginers: https://iot4beginners.com/tutorial-on-google-iot-core-with-raspberry-pi-to-visualize-the-sensor-data/
  2. Curso em Video sobre raspberry pi: https://www.youtube.com/watch?v=X7WMSfEfZGg&list=PLHz_AreHm4dnGZ_nudmN4rvyLk2fHFRzy
  3. Uso da lib Adafruit DHT: https://github.com/adafruit/Adafruit_Python_DHT, e https://www.freva.com/2019/05/22/dht11-temperature-and-humidity-sensor-on-raspberry-pi/
  4. Video sobre o sensor de distancia com rpi: https://www.youtube.com/watch?v=ShnzQSFwVXQ
  5. Workshop Rpi e gcp: https://cloud.google.com/community/tutorials/cloud-iot-enviro-board-workshop
  6. Terraform GCP Learn: https://learn.hashicorp.com/terraform/gcp/build
  7. Caso goste de IoT e tecnologia recomendo seguir o Hackster.io, pois tem diversos projetos e competições (tipo um kaggle de IoT)
  8. Se desejar aprender mais de IoT (CodeIoT)
  9. Usei o Fritzing para poder fazer o schema(https://forum.fritzing.org/t/fixing-fritzing-on-ubuntu-18-04/6504)https://github.com/adafruit/Fritzing-Library)

--

--

Diogo Miyake

Big Data Platform Security Engineer with knowledge in architecture. Enthusiast in Technology, Software, trying to help people to live better.