Arduino Yún - acessando dados do Yahoo Weather a respeito do clima via Temboo

A partir da demanda de uma nova frequentadora do Automação no Parque, que quer fazer um mecanismo automático para fechar uma janela quando houver previsão de chuva, resolvemos nos aventurar pela ideia de acessar algum serviço de previsão do tempo e obter os dados a respeito de uma localização geográfica, no caso a nossa São José dos Campos.

Ela trouxe para a brincadeira um shield Yún chamado Dragino. Esse shield transforma o Arduino que a ele se acoplar num Arduíno Yun, com uma ou outra limitação, por exemplo, não dá para colocar um cartão micro SD para aumentar o "espaço em disco" como podemos fazer com o "Yún de verdade".

Acontece que o Arduino Mega que ela trouxe acoplado ao Dragino é um Mega mais antigão, daqueles com processador ATMega 1280, sendo que agora o Mega sai com o processador 2560. O Dragino não é compatível com essa placas mais velhinhas. Testamos com um Mega mais novo e funcionou "like a charm", como dizem os eleitores de Barack Obama.

Aqui um parênteses: as plaquinhas como Yún, Arduino Tre, Galileo, Edison etc são tipo 2 em 1: elas tem um processador rodando Linux e também algum mecanismo (pode ser outro processador, como no caso do Yún ou um emulador no caso do Galileo e do Edison) para rodar sketches (programas) feitos especificamente para o Arduino. Ou seja, para fazer uma tarefa vc tanto pode fazer uma aplicação rodando no Linux usando algum recurso do Linux como Python, C, Node.js etc quanto pode fazer um programa para rodar no Arduino, usando a parte Linux para acessar a internet via WiFi. Enfim, são dos ambientes de desenvolvimento em um só. Mais sobre isso aqui.

Google prá lá e prá cá, achamos um caminho para fazer um sketch (programa) para o Arduino que acessa a internet via Dragino. Acontece que, como o Mega que tínhamos não era compatível com o shield, essa forma não nos atendia. Partimos então para achar um exemplo em Python que fizesse o mesmo serviço. Achamos aqui uma lib que serve exatamente para isso, ou seja, acessar o webservice que o Yahoo disponibiliza para acesso gratuito com informações climáticas.

Acontece que... não funcionou. Rodando o "pograminha" que existe de exemplo nessa página dá o seguinte erro "No module named pyexpat" na lib expat.py, que por sua vez faz parte do serviços DOM do Python, que são necessários para processar os dados retornados pelo webservice Yahoo.

Tentamos de tudo, até reinstalar xml.dom do Python, o que também dá pau porque tem que recompilar umas libs em C e o compilador gcc também tem alguma zica no Yún... :(

Assim foi-se o dia. Em casa resolvi pegar o meu Yún "de verdade" e rodar o sketch para Arduino. Para isso usei o exemplo do excelente Temboo, que é uma biblioteca que vem já no Yún e serve para acessar diversos webservices disponíveis mundo afora.

É só vc criar seu login e o primeiro exemplo que aparece é o do Yahoo Weather, então é só usar esse teste. Para isso, vc deve copiar o fonte que os caras geram para o programa do Arduino e salvar no disco. Vc deve também criar um arquivo TembooAccount.h e colocar na mesma pasta onde vc salvou o programa exemplo. Esse arquivo contém os parâmetros que definem a nossa aplicação, ou seja, que identificam o usuário que vc criou com a aplicação que vc fez. O conteúdo desse arquivo também é gerado automaticamente no site, e contém a definição de três constantes:

#define TEMBOO_ACCOUNT "assismauro"  // your Temboo account name 
#define TEMBOO_APP_KEY_NAME "myFirstApp" // your Temboo app key name
#define TEMBOO_APP_KEY  "minha chave"  // your Temboo app key

Abaixo o programa, comentado em português:


#include <Bridge.h>
#include <Temboo.h>
#include "TembooAccount.h" // contém as informações da minha conta no Temboo.

int numRuns = 1;   // Contadoe de execuções
int maxRuns = 10;   // Máximo número de execuções

void setup() {
  Serial.begin(9600);
  
  // Espera até a conexão serial, é necessário no Yún e no Leonardo
  delay(4000);
  while(!Serial);
  
  // Inicializa a biblioteca Bridge, que faz a "ponte"
  // ou seja a comunicação entre o Arduino e o Linux.
  Bridge.begin();
}

void loop() {
  if (numRuns <= maxRuns) {
    Serial.println("Executando GetWeatherByAddress - Execucao #" + String(numRuns++));
    
    TembooChoreo GetWeatherByAddressChoreo;

    //Acessa o cliente Temboo
    GetWeatherByAddressChoreo.begin();

    // Passa as credenciais definidas no TembooAccount.h para a biblioteca
    GetWeatherByAddressChoreo.setAccountName(TEMBOO_ACCOUNT);
    GetWeatherByAddressChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
    GetWeatherByAddressChoreo.setAppKey(TEMBOO_APP_KEY);
    
    // Define o uso de unidades métricas 
    // (graus Celsius em vez de Farenheight, por exemplo)
    GetWeatherByAddressChoreo.addInput("Units","c");
    
    // Define o endereço a ser pesquisado
    GetWeatherByAddressChoreo.addInput("Address", "São José dos Campos, SP, Brazil");
    
    // Identifica o serviço a ser acessado (webservice)
    GetWeatherByAddressChoreo.setChoreo("/Library/Yahoo/Weather/GetWeatherByAddress");
    
    // Executa o webservice
    GetWeatherByAddressChoreo.run();

    // Envia os dados para a porta serial    
    while(GetWeatherByAddressChoreo.available()) {
      char c = GetWeatherByAddressChoreo.read();
      Serial.print(c);
    }
    GetWeatherByAddressChoreo.close();
  }

  Serial.println("Esperando...");
  delay(30000); // Espera 30 segundos antes de chamar o serviço novamente
}

Fazemos em seguida o upload do programa para o Yún. Para isso, vamos observar um detalhe:

Tem duas formas de nos comunicarmos com a plaquinha: via serial e via rede WiFi. As duas formas aparecem quando a gente clica em Tools\Port. Ocorre que, como vamos utilizar a biblioteca Bridge, é necessário que a gente escolha a comunicação via porta serial (COM mais um número, selecione a indicada como sendo do Yún), porque senão a gente não consegue ler a saída serial do Arduino. Capisce?

Abra então o Serial Monitor do Arduino (aquela lupinha no canto esquerdo superior da tela do programa) e obtenha o resultado do programa, mostrado abaixo:

Executando GetWeatherByAddress - Execucao #1
Low
20
ConditionText
Partly Cloudy
ConditionCode
30
Response
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<channel>

<title>Yahoo! Weather - Sao Jose dos Campos, BR</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Sao_Jose_dos_Campos__BR/*http://weather.yahoo.com/forecast/BRXX0228_c.html</link>
<description>Yahoo! Weather for Sao Jose dos Campos, BR</description>
<language>en-us</language>
<lastBuildDate>Sun, 15 Mar 2015 11:00 am BRT</lastBuildDate>
<ttl>60</ttl>
<yweather:location city="Sao Jose dos Campos" region="SP"   country="Brazil"/>
<yweather:units temperature="C" distance="km" pressure="mb" speed="km/h"/>
<yweather:wind chill="28"   direction="280"   speed="1.61" />
<yweather:atmosphere humidity="66"  visibility="9.99"  pressure="1015.92"  rising="0" />
<yweather:astronomy sunrise="6:05 am"   sunset="6:19 pm"/>
<image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com</link>
<url>http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif</url>
</image>
<item>
<title>Conditions for Sao Jose dos Campos, BR at 11:00 am BRT</title>
<geo:lat>-23.2</geo:lat>
<geo:long>-45.87</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/Sao_Jose_dos_Campos__BR/*http://weather.yahoo.com/forecast/BRXX0228_c.html</link>
<pubDate>Sun, 15 Mar 2015 11:00 am BRT</pubDate>
<yweather:condition  text="Partly Cloudy"  code="30"  temp="28"  date="Sun, 15 Mar 2015 11:00 am BRT" />
<description><![CDATA[
<img src="http://l.yimg.com/a/i/us/we/52/30.gif"/><br />
<b>Current Conditions:</b><br />
Partly Cloudy, 28 C<BR />
<BR /><b>Forecast:</b><BR />
Sun - PM Thunderstorms. High: 31 Low: 20<br />
Mon - PM Thunderstorms. High: 31 Low: 21<br />
Tue - Thunderstorms. High: 27 Low: 21<br />
Wed - Thunderstorms. High: 28 Low: 20<br />
Thu - Thunderstorms. High: 29 Low: 20<br />
<br />
<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Sao_Jose_dos_Campos__BR/*http://weather.yahoo.com/forecast/BRXX0228_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>
]]></description>
<yweather:forecast day="Sun" date="15 Mar 2015" low="20" high="31" text="PM Thunderstorms" code="38" />
<yweather:forecast day="Mon" date="16 Mar 2015" low="21" high="31" text="PM Thunderstorms" code="38" />
<yweather:forecast day="Tue" date="17 Mar 2015" low="21" high="27" text="Thunderstorms" code="4" />
<yweather:forecast day="Wed" date="18 Mar 2015" low="20" high="28" text="Thunderstorms" code="4" />
<yweather:forecast day="Thu" date="19 Mar 2015" low="20" high="29" text="Thunderstorms" code="4" />
<guid isPermaLink="false">BRXX0228_2015_03_19_7_00_BRT</guid>
</item>
</channel>
</rss>

<!-- fan1600.sports.bf1.yahoo.com Sun Mar 15 07:16:42 PDT 2015 -->

Temperature
28
Humidity
66
Visibility
9.99
High
31
Pressure
1015.92
ForecastText
PM Thunderstorms
WOEID
455912
ForecastCode
38
HTTP_CODE
200
Esperando...

Vc pode analisar a resposta e achar várias informações interessantes, por exemplo a temperatura atual (28°C), a umidade relativa do ar (66%), a máxima temperatura esperada (31°C), um texto sobre a previsão do tempo (PM Thunderstorms, tempestade com trovões à tarde), pressão atmosférica (1015.92 mbar).

Tem também uma parte sobre previsão do tempo (yweather:forecast)para os próximos cinco dias, incluindo a temperatura máxima e mínima.

É possível vc filtrar também que informação vc quer pegar, em vez de pegar todo esse texto.

Por fim, se vc tiver um Arduino e um shield Ethernet também é possível acessar esse tipo de serviço, mas é um pouco mais enrolado...

Bom, é o que temos prá hoje no Yún.

Abacadabraço,

Mauro

Comentários

  1. Show!!! Parabéns Mauro!
    E obrigado pela ajuda!

    Vou arrumar outra placa arduino e ser feliz com minha Shield! =)

    Muito obrigada msm!

    Hahah meu problema virou assunto de Post! Rs

    Parabéns! Ótimo conteúdo!

    ResponderExcluir
    Respostas
    1. Pois é, Evelyn, quando aparece alguma coisa nova e interessante no parque, vem parar aqui...

      O seu Arduino nem precisa ser Mega, viu? Um Uno rola.

      Excluir
  2. Quando haverá o proximo encontro no parque??

    ResponderExcluir
    Respostas
    1. No sábado tem, devo chegar mais tarde um pouco, mas ali pelas 10:30 já tem movimento por lá.

      Excluir
  3. Mauro,
    Boa Noite!
    Estou começando a mexer agora com o YUN, porém não entendi da onde eu consigo essas informações abaixo.

    fonte que os caras geram para o programa do Arduino
    criar um arquivo TembooAccount.h.
    O conteúdo desse arquivo também é gerado automaticamente no site. Qual Site?

    O que seriam essas constantes?

    #define TEMBOO_ACCOUNT "assismauro" // your Temboo account name
    #define TEMBOO_APP_KEY_NAME "myFirstApp" // your Temboo app key name
    #define TEMBOO_APP_KEY "minha chave" // your Temboo app key

    ResponderExcluir
    Respostas
    1. Bom, parece que essa lib foi congelada no Google Code, ou seja, não tem ninguém mantendo-a mais. Mas ela está lá, dá para pegar e tem as informações que vc precisa.

      As constantes são definidas quando vc cria uma conta no Temboo. Ele gera o arquivo Temboo.h para vc.

      Obrigado pela visita,

      Mauro

      Excluir
  4. Boa noite, como incluir este programa com um para fazer o upload de dados tambem?

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte III

Dividindo um programa (sketch) do Arduino em mais de um arquivo

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I