0

I'm trying to make a voice weather system with voiceXML and the Yahoo Weather API. To develop my program I'm using voxeo evolution.

To call the Weather API I'm using the data vxml tag with an srcexpr because I need a dynamic URL (the program asks the user for a city to check weather in).

Here is my code:

<?xml version="1.0" encoding="UTF-8"?>
<vxml version = "2.1">
    <form id="mainMenu">
        <field name="City">
            <prompt> 
                Please, name a spanish city.
            </prompt>

            <grammar src="city.grammar"/>
        </field>
        <!-- code taken from the javascript example of the yahoo weather api -->
        <script>
        <![CDATA[
            var callbackFunction = function(data) {
                var wind = data.query.results.channel.wind;
                alert(wind.chill);
            };
        ]]>
        </script>

        <data srcexpr="https://query.yahooapis.com/v1/public/yql?q=select * from weather.forecast where woeid in (select woeid from geo.places where text='"+City+", spain')&callback=callbackFunction"/>
    </form>
</vxml>

The program doesn't work because of the data tag to connect to the weather API, but I don't know why. Do someone know why is failing?

1 Answers1

0

I finally solved my problem making a php script to connect to the yahoo api and calling it using submit tag in VoiceXML.

<?php
    $City = $_REQUEST["City"];
    $Day = $_REQUEST["Day"];
    $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="('.$City.', spain)") 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);
    $yahooapi = curl_exec($session);
    $weather =  json_decode($yahooapi,true);

    $weather_resumen = $weather['query']['results']['channel']['item']['forecast'];

    $weather_today = $weather_resumen[0]['day'];
    // yahoo api returns an array with the weather for the next week ordered by
    // day (0 -> today, 1 -> tomorrow...). Function get_day gets the index of
    // the day the user said
    $index_weather = get_day($weather_today, $Day);
    $condition_index = $weather_resumen[$index_weather]['code'];
    $weather_condition = $cond_met[intval($condition_index)];
    $min_temp = $weather_resumen[$index_weather]['low'];
    $max_temp = $weather_resumen[$index_weather]['high'];

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
?>
<vxml version="2.1" xml:lang="es-ES">
    <form id="form_main">
        <block>
            <prompt>
                The weather for <?php echo $Day ?> in <?php echo $City ?> is <?php echo $weather_condition ?>. The lowest temperature will be <?php echo $min_temp ?> and the highest <?php echo $max_temp ?>.
                <break/>
            </prompt>
        </block>
    </form>
</vxml>