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:
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...
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
Show!!! Parabéns Mauro!
ResponderExcluirE 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!
Pois é, Evelyn, quando aparece alguma coisa nova e interessante no parque, vem parar aqui...
ExcluirO seu Arduino nem precisa ser Mega, viu? Um Uno rola.
Quando haverá o proximo encontro no parque??
ResponderExcluirNo sábado tem, devo chegar mais tarde um pouco, mas ali pelas 10:30 já tem movimento por lá.
ExcluirMauro,
ResponderExcluirBoa 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
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.
ExcluirAs constantes são definidas quando vc cria uma conta no Temboo. Ele gera o arquivo Temboo.h para vc.
Obrigado pela visita,
Mauro
Boa noite, como incluir este programa com um para fazer o upload de dados tambem?
ResponderExcluir