venerdì 9 gennaio 2015

Il meteo con Php e le API di Yahoo Weather

A tempo perso sto preparando una sveglia con Raspberry PI, che al momento di suonare si colleghi ad un sistema meteo, scarichi le informazioni e le pronunci tramite un sintetizzatore vocale.


Il primo passo è quindi quello di sviluppare un sistema che possa comprendere le condizioni meteo esterne. Ho trovato il servizio di API Yahoo Weather e me ne sono innamorato!
Di seguito è mostrato il codice dello script php che ho sviluppato: utilizza le funzioni curl per interfacciarsi con le API che rispondono in JSON, ho mappato i codici delle condizioni meteo in italiano (come da documentazione ufficiale) e ho scovato su stackoverflow una funzione per tradurre la direzione del vento da gradi alle classiche direzioni da rosa dei venti.
<?php

//Tradotto in php dall'originale 
//http://stackoverflow.com/questions/7490660/converting-wind-direction-in-angles-to-text-words
function degToCompass($num) {
    $val=floor(($num/22.5)+.5);
    $arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];
    return $arr[($val % 16)];
}


$condizioni = array(
"0"=>  "tornado",
"1"=>  "tempesta tropicale",
"2"=>  "uragano",
"3"=>  "forti temporali",
"4"=>  "temporali",
"5"=>  "pioggia mista a neve",
"6"=>  "pioggia mista a nevischio",
"7"=>  "neve mista a nevischio",
"8"=>  "pioviggine gelata",
"9"=>  "pioggerella",
"10"=>  "pioggia gelata",
"11"=>  "rovesci",
"12"=>  "rovesci",
"13"=>  "raffiche di neve",
"14"=>  "rovesci di neve leggeri",
"15"=>  "soffia neve",
"16"=>  "neve",
"17"=>  "grandinare",
"18"=>  "nevischio",
"19"=>  "polvere",
"20"=>  "nebbioso",
"21"=>  "foschia",
"22"=>  "foschia",
"23"=>  "ventoso",
"24"=>  "ventoso",
"25"=>  "freddo",
"26"=>    "nuvoloso",
"27"=>  "Sereno",
"28"=>  "Sereno",
"29"=>  "parzialmente nuvoloso",
"30"=>  "parzialmente nuvoloso",
"31"=>  "Sereno",
"32"=>  "soleggiato",
"33"=>  "Sereno",
"34"=>  "Sereno",
"35"=>  "pioggia mista e grandine",
"36"=>  "caldo",
"37"=>  "isolati temporali",
"38"=>  "temporali sparsi",
"39"=>  "temporali sparsi",
"40"=>  "Rovesci sparsi",
"41"=>  "tormenta di neve",
"42"=>  "rovesci di neve sparsi",
"43"=>  "tormenta di neve",
"44"=>  "parzialmente nuvoloso",
"45"=>  "rovesci temporaleschi",
"46"=>  "rovesci di neve",
"47"=>  "Temporali isolati",
"3200"=>  "non disponibile"
);

$BASE_URL = "http://query.yahooapis.com/v1/public/yql";

$yql_query = 'select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="Rimini, Italy") and u="c"';
$yql_query_url = $BASE_URL . "?q=" . urlencode($yql_query) . "&format=json";

$session = curl_init($yql_query_url);
curl_setopt($session, CURLOPT_RETURNTRANSFER,true);
$json = curl_exec($session);
$phpObj =  json_decode($json);
echo "\nMeteo per Rimini\n";
echo "----------------\n";
echo "Temperatura:      ";
echo $phpObj->query->results->channel->item->condition->temp."° C\n";
echo "Condizioni meteo: ";
echo $condizioni[$phpObj->query->results->channel->item->condition->code]."\n";
echo "Alba:             ";
echo $phpObj->query->results->channel->astronomy->sunrise."\n";
echo "Tramonto:         ";
echo $phpObj->query->results->channel->astronomy->sunset."\n";
echo "Umidità:          ";
echo $phpObj->query->results->channel->atmosphere->humidity."%\n";
echo "Pressione:        ";
echo $phpObj->query->results->channel->atmosphere->pressure." millibar\n";
echo "Previsioni:       ";
echo $condizioni[$phpObj->query->results->channel->item->forecast[0]->code];
echo ", t. max ".$phpObj->query->results->channel->item->forecast[0]->high;
echo "° C, t. min ".$phpObj->query->results->channel->item->forecast[0]->low." °C \n";

echo "Vento:            ";
echo $phpObj->query->results->channel->wind->speed." km/h ";
echo degToCompass($phpObj->query->results->channel->wind->direction)."\n";

1 commento:

DJRoby19 ha detto...

Ciao Stefano volevo sapere se e possibile inserire anche icona meteo