Desenvolvimento

27 jun, 2017

Crie um app móvel de home assistant com serviços Watson e IoT Platform da IBM – Parte 01

Publicidade

No passado, construir um home assistant exigia muito esforço e poderia ser tecnicamente desafiador. No entanto, com o IBM Watson e outros serviços em nuvem complementares, você agora tem o poder de criar e inovar por si mesmo.

Este tutorial explica como combinar o poder do Watson com a simplicidade da plataforma IBM IoT para criar um home assistant para controlar alguns dispositivos eletrônicos básicos (uma luz e uma câmera). O framework pode ser estendido para controlar eletrodomésticos reais habilitados com a conectividade. Você pode usar este tutorial como um guia para construir seu próprio aplicativo.

Desenvolvido no iOS Swift, o aplicativo móvel do Home Assistant se comunica com o IBM Watson Conversation usando as entradas de teclas e os comandos de voz; as interfaces do usuário permitem enviar mensagens ou falar. Usei os serviços Text to Speech e Speech to Text do Watson para tornar possível essa conversa. Watson Conversation é treinado para derivar uma intenção com base em comandos de voz ou mensagens de entrada. Com base nas intenções, o aplicativo Home Assistant envia comandos aos dispositivos através do serviço IoT Platform e um Home Gateway (um Raspberry Pi). O Home Gateway controla os dispositivos e envia eventos do dispositivo para o aplicativo Home Assistant através do serviço IoT Platform. O sistema também usa o Serviço Object Storage para armazenar imagens que são carregadas pelo Home Gateway.

Você pode baixar o código do Home Assistant como um começo para criar seu próprio aplicativo.

O fluxo básico do aplicativo é:

  • O usuário fala ou digita em um comando na interface do usuário do Home Assistant.
  • (2, 3) O comando de voz é transcrito em texto usando o serviço Speech to Text do Watson. Este passo é ignorado se o usuário digitar no comando.
  • (4,5) O texto transcrito é encaminhado para Watson Conversation para que possa derivar uma intenção do discurso do usuário.
  • (6) Ao receber a intenção, o Home Assistant constrói uma mensagem JSON de comando e a envia para a IoT Platform.
  • (7) Um aplicativo Node-RED está sendo executado no Home Gateway, que se inscreve no tópico do comando e recebe a mensagem de comando.
  • (8a, 8b) O Home Gateway executa a ação, ligando ou desligando a luz ou tirando uma foto.
  • (8c) A imagem capturada é carregada no Object Storage.
  • (9) Após a conclusão da tarefa, o aplicativo Node-RED envia um evento de dispositivo (contendo o status) como uma mensagem JSON para a IoT Platform.
  • (10) O Home Assistant, que se inscreve no tópico do dispositivo, recebe o evento do dispositivo.
  • (10a) A imagem capturada é baixada do Object Storage e exibida na interface do usuário.
  • (11, 12) O Home Assistant extrai o texto de status e encaminha-o para o serviço Text to Speech do Watson para ser traduzido para áudio.
  • (13) O Home Assistant, em seguida, reproduz o áudio para o usuário.

As seguintes capturas de tela mostram o aplicativo móvel do Home Assistant.

O que você precisará para construir seu aplicativo

Para criar um aplicativo como o Home Assistant, você precisará estar familiarizado com:

  • O ambiente de desenvolvimento iOS
  • Programação Swift
  • O ambiente de desenvolvimento Node-RED
  • SDKs do Desenvolvedor do Watson
  • IoT Platform e protocolo MQTT

Para criar o aplicativo, usei os seguintes ambientes de desenvolvimento, hardware e serviços Bluemix:

Ambientes de desenvolvimento

Serviços Bluemix

Hardware

  • Kit Raspberry Pi 3B Starter, inclui cartão SD e adaptador de alimentação (com cabo USB)
  • Adafruit NeoPixel Diffused 8mm Through-Hole LED – 5 Pack
  • Placa de módulo de câmera de vídeo com webcam de 5 MP 1080 p x720 p rápido para Raspberry Pi 3B/2B/B+
  • Cabo de ligação de fio fêmea a fêmea 1P-1P
  • Condensador, 0.1μF
  • Resistor, 560 Ω
  • Cabo Ethernet (necessário apenas na primeira vez que inicializa o hardware)
  • Teclado USB (necessário apenas na primeira vez que inicializa o hardware)
  • Cabo de exibição HDMI (necessário apenas na primeira vez que inicializa o hardware)
  • Mouse (necessário apenas na primeira vez que inicializa o hardware)

1. Prepare os serviços Watson no Bluemix

No catálogo Bluemix, selecione e crie os seguintes serviços. Certifique-se de salvar todas as credenciais.

  1. Faça o login no Bluemix.
  2. Clique em Catalog
  3. Clique em Watson na lista Serviços.
  4. Clique em Conversation
  5. Após a criação do Serviço, clique em Service Credentials > View credentials e grave os nomes das credenciais do Serviço.
  6. Clique em Create.

Repita essas etapas para criar instâncias dos serviços Text to Speech do Watson e Speech to Text do Watson.

2. Importar o serviço Watson Conversation

Depois de criar a instância do serviço Watson Conversation, clique em Launch tool para iniciá-la.

Você pode clicar em Create para começar a criar uma nova conversa e definir intenções, entidades e diálogos ou clicar em Importar para importar uma área de trabalho completa. Para este tutorial, eu importo um arquivo.

Clique em Import, selecione workspace – homeassistant.json (incluído nos arquivos em Get the code) e clique em Import.

Volte para a área de trabalho e clique no ícone de três pontos verticais para abrir o menu. Selecione View details. Isso carrega os detalhes da área de trabalho, incluindo o ID da área de trabalho.

Copie o WORKSPACE_ID. Você precisa dele ao usar o serviço de Conversation a partir do seu aplicativo móvel.

Agora, vou discutir os artefatos que estão definidos no serviço Conversation. Os diálogos são simples porque o foco está mais na integração entre os vários serviços Bluemix, aplicativos móveis e o Node-RED em execução no Raspberry Pi.

O serviço Conversation é usado principalmente para deduzir a intenção com base na interação do usuário por mensagem ou voz. Os Diálogos são usados para dirigir a conversa

Diálogo Descrição
Início Este é o diálogo de início da conversa
Saudações Gerencia as saudações do usuário
Luz ligada Converte comandos de usuário para uma intenção “Luz ligada”
Luz Desligada Converte comandos de usuário para uma intenção “Luz desligada”
Tirar foto Converte os comandos do usuário para uma intenção “Tirar uma foto”
Outros Este é um genérico que gerencia todos os outros casos

3. Prepare os serviços do Object Storage no Bluemix

No catálogo Bluemix, selecione Storage > Object Storage e crie uma instância. Lembre-se de selecionar a free tier.

Depois de criar o Object Storage, copie as credenciais. Salve OS_PROJECTID, OS_USERID, OS_USERNAME e OS_PASSWORD necessários para se conectar ao Object Storage do Node-RED e aplicações móveis.

{
  "auth_url": "https://identity.open.softlayer.com",
  "project": "object_storage_750f36e0_f61b_42c0_9458_0876db9f3e36",
  "projectId": [OS_PROJECTID],
  "region": "dallas",
  "userId": [OS_USERID],
  "username": [OS_USERNAME],
  "password": [OS_PASSWORD],
  "domainId": "508e3dcdff0a4d7eb7246a6852bdcc16",
  "domainName": "1307809",
  "role": "admin"
}

4. Prepare o serviço IoT Platform do Watson

Para preparar o serviço IoT Platform do Watson, você precisará conectar o Raspberry Pi como um “Dispositivo” e o aplicativo móvel como um “Aplicativo” para a IoT Platform.

Conecte o Raspberry Pi como um dispositivo para a IoT Plataform

No catálogo Bluemix, crie uma instância do serviço da IoT Plataform clicando em Internet of Things > Internet of Things Platform.

Selecione o plano Lite e clique em Create.

Clique em Launch na página da Internet of Things Platform.

Na barra de navegação esquerda, clique em Devices.

Selecione a guia Device Type e clique em Create Type para criar o tipo de dispositivo.

Na janela Create Device Type, clique em Create device type e especifique o Nome e a Descrição. Salve o nome DEV_TYPE.

Clique em Next até que seu tipo de dispositivo seja criado.

Clique em Devices na barra de navegação esquerda novamente e, em seguida, clique em Add device.

Na janela Add device, selecione seu dispositivo na lista suspensa Choose Device Type e clique em Next.

Na janela Add device > Define Info, especifique o ID do Dispositivo e o Número de Série (usado no Node-RED para conectar). Salve o DEV_ID para ser usado na configuração de Credencial do Node-RED.

Aceite os padrões para os outros campos e clique em Avançar até o dispositivo ser adicionado. É exibido um token de autenticação. Salve ORG_ID, DEV_ID e AUTH_TOKEN para serem usados na configuração de Credenciais do Node-RED.

Você pode ver mais detalhes neste passo-a-passo do developerWorks.

Conecte o aplicativo móvel à IoT Plataform

Na barra de navegação à esquerda, clique em Apps para acessar a página Aplicativos.

Clique em Generate API Key para gerar uma chave de API para seu aplicativo móvel.

Na janela Gerar chave de API, selecione Standard Application para a(s) Função(ões) da API e salve o API_KEY e APP_AUTH_TOKEN para serem usados mais tarde no seu aplicativo móvel. Clique em Generate.

5. Prepare o Raspberry Pi

Você pode seguir estas instruções detalhadas para configurar o Raspberry Pi. Eu usei Raspbian Jessie com Pixel porque ele vem instalado com o Node-RED, que será necessário mais tarde.

Por padrão, a conexão wifi não está configurada. Você precisa conectar seu Raspberry Pi a um roteador através de um cabo Ethernet. Você também precisa conectar seu teclado USB e cabo de exibição HDMI.

Conecte-se à sua rede wifi clicando no botão wifi no canto superior direito.

Selecione Pi > Preferences > Raspberry Pi Configuration para habilitar as interfaces necessárias: SSH e VNC para que você possa acessar o Raspberry Pi sem teclado e tela e GPIO Remoto e Câmera.

Conecte o Raspberry Pi com o LED e a câmera de acordo com a figura a seguir.

  • O GPIO 3 V PIN é conectado ao 5 V PIN do LED.
  • O GPIO GND PIN é conectado ao GND PIN do LED.
  • O GPIO18 PIN é conectado ao resistor (560 Ω), antes de entrar no DIN PIN do LED.
  • O Condensador (0.1μF) é conectado em paralelo ao 5 V PIN e ao GND.
  • A Câmera está conectada à Camera CSI no Raspberry Pi.

6. Desenvolva o Node-RED no Raspberry Pi

Em seguida, você precisará desenvolver e preparar o ambiente Node-RED no seu Raspberry Pi.

Prepare o ambiente Node-RED no Raspberry Pi

  1. Do terminal, ssh para o Raspberry Pi e navegue até a pasta Node-RED. Talvez seja necessário verificar o endereço IP fazendo login no seu roteador.
ssh pi@ipaddr-raspberrypi
  1. Instale node-red-node-pi-neopixel para controlar o NeoPixel LED.
curl -sS get.pimoroni.com/unicornhat | bash
npm install node-red-node-pi-neopixel
  1. Instale node-red-contrib-camerapi para controlar a câmera.
npm install node-red-contrib-camerapi
  1. Instale node-red-contrib-objectstore para acessar o Bluemix Object Store.
npm install node-red-contrib-objectstore

Outros nodes necessários, os nodes de entrada e saída Watson IoT, estão pré-instalados.

  1. Execute o seguinte comando para configurar o Node-RED para iniciar automaticamente quando o sistema for inicializado.
sudo systemctl enable nodered.service
  1. Abra um navegador e aponte para http://ipaddr-raspberrypi:1880 para acessar Node-RED. Você encontrará os seguintes nodes instalados nos paletes.

Desenvolver fluxo para controlar o LED

Antes de seguir esta etapa, verifique se você completou o passo anterior para preparar o ambiente Node-RED em seu Raspberry Pi. Então, você precisará navegar para o aplicativo Node-RED do seu navegador.

  1. Conecte o fluxo da seguinte maneira. Ele recebe um comando, decide a intenção, executa a intenção (liga ou desliga o LED) e envia um evento ao aplicativo móvel.

Veja a seguir o que cada parte do fluxo controla

  • Nome do node: Light cmd
  • Tipo de node: Watson IoT Input
  • Descrição: Usado para receber comandos do aplicativo móvel através da plataforma IoT. O formato é iot-2/cmd/[CMD_TYPE]/fmt/json, onde [CMD_TYPE] está definido no campo Comando (por exemplo, “light”).

Usa credenciais que são definidas no configuration objetc raspberrypi

  • Nome do node: Decide Intent
  • Tipo de node: Function
  • Descrição: Obtém a intenção da carga útil e reformata a carga útil para ligar ou desligar o LED.
action = msg.payload.action
object = msg.payload.object
intent = msg.payload.intent
if (intent == "OnLight") {
    msg.payload = "#ffffff"
    return [msg, null]
} else if (intent == "OffLight") {
    msg.payload = "#000000"
    return [null, msg];
}
return msg;
  • Nome do node: NeoPixel LED
  • Tipo de node: rpi neopixels
  • Descrição:  Isto é configurado da seguinte forma:

  • Nome do node: Format Status On
  • Tipo de node: Function
  • Descrição: Construir uma mensagem de Status “ligado” no JSON
var jsonObj = { "dev":"light", "status": "on"};
msg.payload = JSON.stringify(jsonObj)
return msg;
  • Nome do node: Format Status Off
  • Tipo de node: Function
  • Descrição: Construir uma mensagem de Status “desligado” no JSON
var jsonObj = { "dev":"light", "status": "off"};
msg.payload = JSON.stringify(jsonObj)
return msg;
  • Nome do node: Light Event
  • Tipo de node: Watson IoT Output
  • Descrição: Usado para enviar o evento do dispositivo a partir do aplicativo móvel através da IoT Plataform. O formato é iot-2/type/[DEV_TYPE]/id/ [DEV_ID]/evt/[EVT_TYPE]/fmt/json, onde:
      • [DEV_TYPE] está definido no serviço IoT Platform.
      • [DEV_ID] está definido no serviço IoT Platform.
      • [EVT_TYPE] está configurado no campo Tipo de evento (por exemplo, luz).

  • Nome do node: raspberrypi
  • Tipo de node: Configuration object for wiotp-credentials
  • Descrição: Existem nodes de injeção que são usados para testar as funções On e Off do LED. Os nodes Debug são usados para enviar o payload da mensagem para a janela de debug no lado direito.

Os objetos de configuração Credenciais/Credentials obtidos da IoT Plataform e usados pelos nodes IoT do Watson são:

  • Organização: ORG_ID
  • Nome do Servidor: ORG_ID.messaging.internetofthings.ibmcloud.com
  • Tipo de Dispositivo: DEV_TYPE
  • ID do Dispositivo: DEV_ID
  • Auth Token: AUTH_TOKEN
  • Nome: raspberrypi

Desenvolva um fluxo para tirar uma foto e fazer o upload para Storage Object

Antes de seguir esta etapa, verifique se você completou a etapa para preparar o ambiente Node-RED no seu Raspberry Pi. Então, você precisará navegar para o aplicativo Node-RED do seu navegador.

  1. Conecte o fluxo conforme mostrado na imagem a seguir. O fluxo recebe um comando para tirar uma foto e depois de capturar a foto, ela carrega a foto para Storage Object e gera um evento.

Veja abaixo o que o que cada parte do fluxo controla.

  • Nome do node: Camera Cmd
  • Tipo de node: Watson IoT Input
  • Descrição: Usado para receber comandos do aplicativo móvel através da IoT Plataform. O formato é iot-2/cmd/[CMD_TYPE]/ fmt/json, onde [CMD_TYPE] está definido no campo Comando (por exemplo, câmera).

Ela usa credenciais que estão definidas no objeto de configuração raspberrypi.

  • Nome do node: Take Photo
  • Tipo de node: camerapi take photo
  • Descrição: Tire uma foto usando a câmera Raspberry Pi. O modo de arquivo “Gerar”/”Generate” cria um arquivo na pasta. O nome do arquivo, o nome da pasta e o formato são encontrados em msg.filename, msg.filepath e msg.fileformat, respectivamente.

  • Nome do node: ObjectStorage Upload
  • Tipo de node: os-put
  • Descrição: Obtém o arquivo de imagem capturado e faz o upload do arquivo para Object Storage no Bluemix. O comando pega o arquivo que está especificado na mensagem de entrada (msg.filename, msg.filepath e msg.fileformat) e carrega o arquivo no contêiner especificado no node. Após o upload bem-sucedido, ele retorna o URL no msg.url e o nome do objeto em msg.objectname. Obtém as credenciais do serviço a partir da configuração de armazenamento do objeto.

  • Nome do node: Format Event
  • Tipo de node: Function
  • Descrição: Constrói uma mensagem de evento no JSON que contém a URL, o nome do objeto e o nome do contêiner para que o aplicativo móvel saiba onde baixar o arquivo.
var json = { "url": msg.url, 
"objectname": msg.objectname, 
"containername": "visual-recognition-images"};
msg.payload = JSON.stringify(json);
return msg;
  • Nome do node: Camera Event
  • Tipo de node: Watson IoT Output
  • Descrição: Usado para enviar o evento do dispositivo a partir do aplicativo móvel através da IoT Plataform. O formato é iot-2/type/[DEV_TYPE]/id/ [DEV_ID]/evt/[EVT_TYPE]/fmt/json, onde:
    • [DEV_TYPE] está definido no serviço IoT Platform.
    • [DEV_ID] está definido no serviço IoT Platform
    • [EVT_TYPE] está configurado no campo Tipo de evento (por exemplo, câmera).

  • Nome do node: ‘none’
  • Tipo de node: os-config
  • Descrição: Define as credenciais de login para o serviço Object Storage. Elas são obtidas das Credenciais de Armazenamento de Objetos/Object Storage Credentials que você salvou anteriormente.
    • Informações de Configuração: baseadas em API
    • Região: Dallas
    • Id do inquilino: OS_PROJECTID
    • ID de usuário: OS_USERID
    • Nome de usuário: OS_USERNAME
    • Senha: OS_PASSWORD

Pronto. Já temos o cenário totalmente preparado. Na sequência deste artigo, vamos desenvolver nosso aplicativo móvel. Depois, você pode usar este tutorial como um guia para construir seu próprio aplicativo.

 

***

Khong Kok Sing faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://www.ibm.com/developerworks/mobile/library/cc-build-home-assistant-watson-iot-platform/

“>