Postagem em destaque

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

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 15 de março de 2015

Raspberry Pi - acessando dados do Yahoo Weather a respeito do clima via Temboo

E no Raspberry, será que rola?

R: rola, e é o mesmo procedimento que fizemos no caso do Edison.

Apenas na hora dos comandos python setup.py build e python setup.py install devemos colocar o sudo antes:

sudo python setup.py build
sudo python setup.py install

Depois é só entrar no Python e testar, exatamente como fiz no Edison,

É isso.

Intel Edison - acessando dados do Yahoo Weather a respeito do clima via Temboo

Como no Yún não deu muito certo a ideia de acessar o Yahoo Weather pelo Python, surgiu a ideia: será que funciona  no Edison? Boralá!

Roteiro para usar a python-weather-api no Edison:

1) Faça o download dos arquivos necessários. Para isso, o Edison deve estar conectado à internet e vc deve acessá-lo via algum programa de terminal, por exemplo o Putty. Para ver como fazer isso, clique aqui.

2) Primeiro, crie um diretório para colocar os arquivos de instalação:

mkdir pywapiinstall
cd pywapiinstall

3) Baixe o arquivo contendo os arquivos de instalação:

wget --no-check-certificate 'https://launchpad.net/python-weather-api/trunk/0.3.8/+download/pywapi-0.3.8.tar.gz'

4) Descompacte o arquivo

tar -xvf pywapi-0.3.8.tar.gz

5) Mude para o dir onde foram descompactados os arquivos

cd pywapi-0.3.8 

6) Instale os arquivos

python setup.py build
python setup.py install

7) Em seguida, entre no python e faça o teste:

import pywapi
pywapi.get_weather_from_yahoo('BRXX0228')

E... não é que funcionou de prima? Veja aí o resultado:

{'html_description': u'\n<img src="http://l.yimg.com/a/i/us/we/52/30.gif"/><br />\n<b>Current Conditions:</b><br />\nPartly Cloudy, 30 C<BR />\n<BR /><b>Forecast:</b><BR />\nSun - Thunderstorms. High: 28 Low: 20<br />\nMon - PM Thunderstorms. High: 31 Low: 21<br />\nTue - Thunderstorms. High: 27 Low: 21<br />\nWed - Thunderstorms. High: 29 Low: 20<br />\nThu - PM Thunderstorms. High: 28 Low: 20<br />\n<br />\n<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/>\n(provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>\n', 'atmosphere': {'pressure': u'1015.92', 'rising': u'0', 'visibility': u'9.99', 'humidity': u'58'}, 'title': u'Yahoo! Weather - Sao Jose Dos Campos, BR', 'condition': {'date': u'Sun, 15 Mar 2015 1:01 pm BRT', 'text': u'Partly Cloudy', 'code': u'30', 'temp': u'30', 'title': u'Conditions for Sao Jose Dos Campos, BR at 1:01 pm BRT'}, 'forecasts': [{'code': u'4', 'text': u'Thunderstorms', 'high': u'28', 'low': u'20', 'date': u'15 Mar 2015', 'day': u'Sun'}, {'code': u'38', 'text': u'PM Thunderstorms', 'high': u'31', 'low': u'21', 'date': u'16 Mar 2015', 'day': u'Mon'}, {'code': u'4', 'text': u'Thunderstorms', 'high': u'27', 'low': u'21', 'date': u'17 Mar 2015', 'day': u'Tue'}, {'code': u'4', 'text': u'Thunderstorms', 'high': u'29', 'low': u'20', 'date': u'18 Mar 2015', 'day': u'Wed'}, {'code': u'38', 'text': u'PM Thunderstorms', 'high': u'28', 'low': u'20', 'date': u'19 Mar 2015', 'day': u'Thu'}], 'link': u'http://us.rd.yahoo.com/dailynews/rss/weather/Sao_Jose_Dos_Campos__BR/*http://weather.yahoo.com/forecast/BRXX0228_c.html', 'location': {'city': u'Sao Jose Dos Campos', 'region': u'', 'country': u'BR'}, 'units': {'distance': u'km', 'speed': u'km/h', 'temperature': u'C', 'pressure': u'mb'}, 'astronomy': {'sunset': u'6:19 pm', 'sunrise': u'6:05 am'}, 'geo': {'lat': u'-23.23', 'long': u'-45.83'}, 'wind': {'direction': u'220', 'speed': u'3.22', 'chill': u'30'}}

O código BRXX0228 corresponde a São José dos Campos. E como eu descobri isso? Nessa lista: https://www.edg3.uk/snippets/weather-location-codes/brazil/

Também é possível acessar outros serviços de previsão de tempo, bem como obter uma determinada informação em vez de toda essa string aí em cima. Abaixo, um exemplo:

# -*- coding: cp1252 -*-
import  pywapi
import string

weather_com_result = pywapi.get_weather_from_weather_com('BRXX0228')
yahoo_result = pywapi.get_weather_from_yahoo('BRXX0228')

print "Weather.com diz que agora o tempo esta " + string.lower(weather_com_result['current_conditions']['text']) + " e " + weather_com_result['current_conditions']['temperature'] + "C agora em Sao Jose dos Campos.\n\n"

print "Yahoo diz que agora o tempo esta " + string.lower(yahoo_result['condition']['text']) + " e " + yahoo_result['condition']['temp'] + "C agora em Sao Jose dos Campos."

O resultado? Abaixo:

Weather.com diz que agora o tempo esta partly cloudy e 30C agora em Sao Jose dos Campos.


Yahoo diz que agora o tempo esta partly cloudy e 30C agora em Sao Jose dos Campos.

Bom, é isso! Enjoy!


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