Прогноз погоды по телефону

    Решил я, что получится весьма полезная возможность собираясь на работу послушать прогноз погоды на громкоговорителе телефона нажав одну запрограммированную кнопку. Как я это сделал смотрите под катом.



    Первое что нам потребуется это сам прогноз погоды. Я решил его брать с сайта gismeteo.ru.
    Как я это сделал:
    Зашел на сайт gismeteo.ru нашел свой город.
    Нажал в шапке ссылку «Информеры».
    На открывшейся странице нашел текст «Данные в формате XML» и взял ссылку с кнопки «получить код».
    Таким образом мы теперь знаем как нам получать свежий прогноз в формате XML.

    Теперь нужно его сохранить для последующей обработки:
    Велосипед изобретать я не стал и написал скрипт на bash из двух строк


    Copy Source | Copy HTML
    1. #!/bin/bash
    2. cd /usr/isp/weather
    3. /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml
    4.  


    где informer.gismeteo.ru/xml/34214_1.xml и есть ссылка для вашего города. Команда wget скачивает наш XML и записывает его в фаил 34214_1.xml в текущем каталоге, он нам потребуется далее. Что бы прогноз был всегда свежим необходимо этот скрипт записать на выполнение в cron например вот так:

    */60 * * * * /usr/isp/weather/weather_up.sh

    Алгоритм озвучивающий прогноз я решил сделать на Perl который взаимодействует с Asterisk через AGI. От нашего алгоритма требуется произвести разбор XML файла и вывести в stdout последовательность строк с командами для Asterisk на воспроизведение звуковых файлов примерно вот так:

    Copy Source | Copy HTML
    1. EXEC Playback weather/Po_dannym_Gismeteo ""
    2. EXEC Playback weather/tod/dnem ""
    3. EXEC Playback weather/m/15ogo ""
    4. EXEC Playback weather/budet ""
    5. EXEC Playback weather/cloudiness/pasmurno ""
    6. EXEC Playback weather/precipitation/dozhd' ""<br/>
      EXECPlayback weather/temp_vosduha_sostavit ""<br/>EXECPlayback weather/digits/20 ""<br/>EXECPlayback weather/digits/2 ""<br/>EXECPlayback weather/Do ""<br/>EXECPlayback weather/digits/20 ""<br/>EXECPlayback weather/gradusov_C ""<br/>EXECPlayback weather/Skorost'_vetra_sostavit ""
    7. EXEC Playback weather/digits/5 ""
    8. EXEC Playback weather/Do ""
    9. EXEC Playback weather/digits/3 ""
    10. EXEC Playback weather/metrov_v_sekundu ""
    11. EXEC Playback weather/Atmosfernoe_davlenie_sostavit ""
    12. EXEC Playback weather/digits/700 ""
    13. EXEC Playback weather/digits/40 ""
    14. EXEC Playback weather/digits/7 ""
    15. EXEC Playback weather/Do ""
    16. EXEC Playback weather/digits/700 ""
    17. EXEC Playback weather/digits/40 ""
    18. EXEC Playback weather/digits/5 ""
    19. EXEC Playback weather/milimetrov_rtutnogo_stolba ""


    Как вы заметели звуковых записей придётся подготовить очень много, но ведь это раз и навсегда.

    В моём варианте в некоторых записанных фразах присутствует слово «от». Например: Atmosfernoe_davlenie_sostavit читать как «Атмосферное давление составит от».

    Собственно для разбора XML я использовал модуль XML::Simple он мне показался самым простым в использовании. Для замены XML тэгов на необходимые мне строки для озвучивания применил списки:

    Copy Source | Copy HTML
    1. my $date_name = {
    2.     1 => ["EXEC Playback weather\/m\/1ogo \"\"\n"],
    3.     2 => ["EXEC Playback weather\/m\/2ogo \"\"\n"],
    4.     3 => ["EXEC Playback weather\/m\/3ogo \"\"\n"],
    5. .....
    6.  

    С алгоритмом для преобразования чисел в набор команд для воспроизведения цифр решил тоже не изобретать велосипед и взял готовый алгоритм преобразования денег в пропись (к сожалению уже не вспомню чей), заменил в нужных местах строки такие как "один" на "Playback weather\/digits\/1 \"\"\n" и алгоритм адаптирован (куча времени сэкономлена).
    Думаю теперь всё будет понятно, пришло время посмотреть на скрипт:


    Copy Source | Copy HTML
    1. #!/usr/bin/perl
    2.  
    3. use strict;
    4. use XML::Simple;
    5. use Data::Dumper;
    6.  
    7. my $date_name = {
    8.     1 => ["EXEC Playback weather\/m\/1ogo \"\"\n"],
    9.     2 => ["EXEC Playback weather\/m\/2ogo \"\"\n"],
    10.     3 => ["EXEC Playback weather\/m\/3ogo \"\"\n"],
    11.     4 => ["EXEC Playback weather\/m\/4ogo \"\"\n"],
    12.     5 => ["EXEC Playback weather\/m\/5ogo \"\"\n"],
    13.     6 => ["EXEC Playback weather\/m\/6ogo \"\"\n"],
    14.     7 => ["EXEC Playback weather\/m\/7ogo \"\"\n"],
    15.     8 => ["EXEC Playback weather\/m\/8ogo \"\"\n"],
    16.     9 => ["EXEC Playback weather\/m\/9ogo \"\"\n"],
    17.     10 => ["EXEC Playback weather\/m\/10ogo \"\"\n"],
    18.     11 => ["EXEC Playback weather\/m\/11ogo \"\"\n"],
    19.     12 => ["EXEC Playback weather\/m\/12ogo \"\"\n"],
    20.     13 => ["EXEC Playback weather\/m\/13ogo \"\"\n"],
    21.     14 => ["EXEC Playback weather\/m\/14ogo \"\"\n"],
    22.     15 => ["EXEC Playback weather\/m\/15ogo \"\"\n"],
    23.     16 => ["EXEC Playback weather\/m\/16ogo \"\"\n"],
    24.     17 => ["EXEC Playback weather\/m\/17ogo \"\"\n"],
    25.     18 => ["EXEC Playback weather\/m\/18ogo \"\"\n"],
    26.     19 => ["EXEC Playback weather\/m\/19ogo \"\"\n"],
    27.     20 => ["EXEC Playback weather\/m\/10ogo \"\"\n"],
    28.     21 => ["EXEC Playback weather\/m\/21ogo \"\"\n"],
    29.     22 => ["EXEC Playback weather\/m\/22ogo \"\"\n"],
    30.     23 => ["EXEC Playback weather\/m\/23ogo \"\"\n"],
    31.     24 => ["EXEC Playback weather\/m\/24ogo \"\"\n"],
    32.     25 => ["EXEC Playback weather\/m\/25ogo \"\"\n"],
    33.     26 => ["EXEC Playback weather\/m\/26ogo \"\"\n"],
    34.     27 => ["EXEC Playback weather\/m\/27ogo \"\"\n"],
    35.     28 => ["EXEC Playback weather\/m\/28ogo \"\"\n"],
    36.     29 => ["EXEC Playback weather\/m\/29ogo \"\"\n"],
    37.     30 => ["EXEC Playback weather\/m\/30ogo \"\"\n"],
    38.     31 => ["EXEC Playback weather\/m\/31ogo \"\"\n"]
    39. };
    40.  
    41. my $hour_name = {
    42.      0 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    43.     1 => ["EXEC Playback weather\/hour\/chas \"\"\n"],
    44.     2 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
    45.     3 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
    46.     4 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
    47.     5 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    48.     6 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    49.     7 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    50.     8 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    51.     9 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    52.     10 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    53.     11 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    54.     12 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    55.     13 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    56.     14 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    57.     15 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    58.     16 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    59.     17 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    60.     18 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    61.     19 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    62.     20 => ["EXEC Playback weather\/hour\/chasov \"\"\n"],
    63.     21 => ["EXEC Playback weather\/hour\/chas \"\"\n"],
    64.     22 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
    65.     23 => ["EXEC Playback weather\/hour\/chasa \"\"\n"],
    66. };
    67.  
    68. my $m_name = {
    69.     1 => ["EXEC Playback weather\/m\/yanvarya \"\"\n"],
    70.     2 => ["EXEC Playback weather\/m\/fevralya \"\"\n"],
    71.     3 => ["EXEC Playback weather\/m\/marta \"\"\n"],
    72.     4 => ["EXEC Playback weather\/m\/aprelya \"\"\n"],
    73.     5 => ["EXEC Playback weather\/m\/maya \"\"\n"],
    74.     6 => ["EXEC Playback weather\/m\/iunya \"\"\n"],
    75.     7 => ["EXEC Playback weather\/m\/iylya \"\"\n"],
    76.     8 => ["EXEC Playback weather\/m\/avgusta \"\"\n"],
    77.     9 => ["EXEC Playback weather\/m\/sentyabrya \"\"\n"],
    78.     10 => ["EXEC Playback weather\/m\/octyabya \"\"\n"],
    79.     11 => ["EXEC Playback weather\/m\/noyabrya \"\"\n"],
    80.     12 => ["EXEC Playback weather\/m\/decabrya \"\"\n"]
    81. };
    82.  
    83. my $tod_name = {
    84.      0 => ["EXEC Playback weather\/tod\/noch'u \"\"\n"],
    85.     1 => ["EXEC Playback weather\/tod\/utrom \"\"\n"],
    86.     2 => ["EXEC Playback weather\/tod\/dnem \"\"\n"],
    87.     3 => ["EXEC Playback weather\/tod\/vecherom \"\"\n"]
    88. };
    89.  
    90. my $cloudiness_name = {
    91.      0 => ["EXEC Playback weather\/cloudiness\/yasno \"\"\n"],
    92.     1 => ["EXEC Playback weather\/cloudiness\/malooblachno \"\"\n"],
    93.     2 => ["EXEC Playback weather\/cloudiness\/oblachno \"\"\n"],
    94.     3 => ["EXEC Playback weather\/cloudiness\/pasmurno \"\"\n"]
    95. };
    96.  
    97. my $precipitation_name = {
    98.     4 => ["EXEC Playback weather\/precipitation\/dozhd' \"\"\n"],
    99.     5 => ["EXEC Playback weather\/precipitation\/liven' \"\"\n"],
    100.     6 => ["EXEC Playback weather\/precipitation\/sneg \"\"\n"],
    101.     7 => ["EXEC Playback weather\/precipitation\/sneg \"\"\n"],
    102.     8 => ["EXEC Playback weather\/precipitation\/groza \"\"\n"],
    103.     9 => [""],
    104.     10 => ["EXEC Playback weather\/precipitation\/bez_osadkov \"\"\n"]
    105. };
    106.  
    107. my $wind_direction_name = {
    108.      0 => ["EXEC Playback weather\/wind_direction\/severnyi \"\"\n"],
    109.     1 => ["EXEC Playback weather\/wind_direction\/severo-vostochnyi \"\"\n"],
    110.     2 => ["EXEC Playback weather\/wind_direction\/vostochno-uzhnyi \"\"\n"],
    111.     3 => ["EXEC Playback weather\/wind_direction\/ugo-zapadnyi \"\"\n"]
    112. };
    113.  
    114.  
    115. my $xmlWeather = new XML::Simple(keeproot => 1,searchpath => ".", forcearray => 1, suppressempty => '');
    116. my $xmlData1 = $xmlWeather->XMLin('/usr/isp/weather/34214_1.xml');
    117. my $xmlData = $xmlData1->{MMWEATHER}[ 0]->{REPORT}[ 0]->{TOWN}[ 0]->{FORECAST};
    118.  
    119. $| = 1;
    120. while( <STDIN> ) {
    121.   chomp($_);
    122.     last if length($_) ==  0;
    123. }
    124.  
    125. # "Po dannym Gismeteo"
    126. print "EXEC Playback weather\/Po_dannym_Gismeteo \"\"\n";
    127. my $i= 0;
    128. for ($i =  0; $i < 4; $i++)
    129. {
    130. print $tod_name->{$xmlData->[$i]->{tod}}->[ 0];
    131. print $date_name->{$xmlData->[$i]->{day}}->[ 0];
    132. print $m_name->{$xmlData->[$i]->{month}}->[ 0];
    133. #
    134. print "EXEC Playback weather\/budet \"\"\n";
    135. print $cloudiness_name->{$xmlData->[$i]->{PHENOMENA}[ 0]->{cloudiness}}->[ 0];
    136. print $precipitation_name->{$xmlData->[$i]->{PHENOMENA}[ 0]->{precipitation}}->[ 0];
    137. # Temp
    138. print "EXEC Playback weather\/temp_vosduha_sostavit \"\"\n";
    139. print digit_string( $xmlData->[$i]->{TEMPERATURE}[ 0]->{max} );
    140. print "EXEC Playback weather\/Do \"\"\n";
    141. print digit_string( $xmlData->[$i]->{TEMPERATURE}[ 0]->{min} );
    142. print "EXEC Playback weather\/gradusov_C \"\"\n";
    143. # Veter
    144. print "EXEC Playback weather\/Skorost'_vetra_sostavit \"\"\n";
    145. print digit_string( $xmlData->[$i]->{WIND}[ 0]->{max} );
    146. print "EXEC Playback weather\/Do \"\"\n";
    147. print digit_string( $xmlData->[$i]->{WIND}[ 0]->{min} );
    148. print "EXEC Playback weather\/metrov_v_sekundu \"\"\n";
    149. # Atmosfernoe davlenie
    150. print "EXEC Playback weather\/Atmosfernoe_davlenie_sostavit \"\"\n";
    151. print digit_string( $xmlData->[$i]->{PRESSURE}[ 0]->{max} );
    152. print "EXEC Playback weather\/Do \"\"\n";
    153. print digit_string( $xmlData->[$i]->{PRESSURE}[ 0]->{min} );
    154. print "EXEC Playback weather\/milimetrov_rtutnogo_stolba \"\"\n";
    155.  
    156. }
    157.  
    158.  
    159. #===================================================================================================
    160. #===================================================================================================
    161. #===================================================================================================
    162. sub digit_string {
    163.     my $digit = shift;
    164.     local $_;
    165.  
    166.     my $sign = 1 if $digit =~ s/^-+//;
    167.  
    168.  
    169.     $digit =~ s#^0+##;
    170.     my ( $b_dig, $s_dig ) = ( split( m/[,.]/, $digit, 2 ) );
    171. $s_dig ="";
    172. #
    173. # Очищаем числа от `лишних' символов ( 100_000,43 )
    174. #
    175.     if ( defined $b_dig and length $b_dig ) {
    176. #        $b_dig =~ s#[^\d]##sg;
    177.     } else {
    178.         $b_dig = "";
    179.     }
    180.     if ( defined $s_dig and length $s_dig ) {
    181. #        $s_dig =~ s#[^\d]##sg;
    182.     } else {
    183.         $s_dig = "";
    184.     }
    185. #
    186. # Округляем копейки в большую сторону, если в результате округления
    187. # получаем рубль, то приплюсовываем его к b_dig ( рублям )
    188. #
    189. #    if ( sprintf('%0.2f', "0.$s_dig" ) == 1 ) {
    190. #        $b_dig ++;
    191. #        $s_dig = '00';
    192. #    } else {
    193. #        $s_dig = substr( sprintf('%0.2f', "0.$s_dig" ), 2 );
    194. #    }
    195. #
    196.     my @array = split( //, ( $b_dig || 0 ) );
    197.  
    198. #
    199. # Определяем разрядность числа.
    200. #
    201.     my $class_id = int( scalar ( @array ) / 3);
    202.     $class_id++ if ( scalar ( @array ) % 3 );
    203. #
    204. # Неподдерживаемая разрядность.
    205. #
    206.     return $digit if $class_id > 5;
    207.  
    208.     my $digits_name = {
    209.              0 => ["EXEC Playback weather\/digits\/0 \"\"\n","",""],
    210.             1 => [["EXEC Playback weather\/digits\/1 \"\"\n","EXEC Playback weather\/digits\/1a \"\"\n"],"EXEC Playback weather\/digits\/10 \"\"\n","EXEC Playback weather\/digits\/100 \"\"\n"],
    211.             2 => [["EXEC Playback weather\/digits\/2 \"\"\n","EXEC Playback weather\/digits\/2e \"\"\n"],"EXEC Playback weather\/digits\/20 \"\"\n","EXEC Playback weather\/digits\/200 \"\"\n"],
    212.             3 => ["EXEC Playback weather\/digits\/3 \"\"\n","EXEC Playback weather\/digits\/30 \"\"\n","EXEC Playback weather\/digits\/300 \"\"\n"],
    213.             4 => ["EXEC Playback weather\/digits\/4 \"\"\n","EXEC Playback weather\/digits\/40 \"\"\n","EXEC Playback weather\/digits\/400 \"\"\n"],
    214.             5 => ["EXEC Playback weather\/digits\/5 \"\"\n","EXEC Playback weather\/digits\/50 \"\"\n","EXEC Playback weather\/digits\/500 \"\"\n"],
    215.             6 => ["EXEC Playback weather\/digits\/6 \"\"\n","EXEC Playback weather\/digits\/60 \"\"\n","EXEC Playback weather\/digits\/600 \"\"\n"],
    216.             7 => ["EXEC Playback weather\/digits\/7 \"\"\n","EXEC Playback weather\/digits\/70 \"\"\n","EXEC Playback weather\/digits\/700 \"\"\n"],
    217.             8 => ["EXEC Playback weather\/digits\/8 \"\"\n","EXEC Playback weather\/digits\/80 \"\"\n","EXEC Playback weather\/digits\/800 \"\"\n"],
    218.             9 => ["EXEC Playback weather\/digits\/9 \"\"\n","EXEC Playback weather\/digits\/90 \"\"\n","EXEC Playback weather\/digits\/900 \"\"\n"],
    219.         };
    220.  
    221.     my $dec_digits = {
    222.                 11 => "EXEC Playback weather\/digits\/11 \"\"\n",
    223.                 12 => "EXEC Playback weather\/digits\/12 \"\"\n",
    224.                 13 => "EXEC Playback weather\/digits\/13 \"\"\n",
    225.                 14 => "EXEC Playback weather\/digits\/14 \"\"\n",
    226.                 15 => "EXEC Playback weather\/digits\/15 \"\"\n",
    227.                 16 => "EXEC Playback weather\/digits\/16 \"\"\n",
    228.                 17 => "EXEC Playback weather\/digits\/17 \"\"\n",
    229.                 18 => "EXEC Playback weather\/digits\/18 \"\"\n",
    230.                 19 => "EXEC Playback weather\/digits\/19 \"\"\n"
    231.             };
    232.  
    233.     my $digits_class = {
    234.             '-1'=> [ 1,"","",""],
    235.              0 => [  0,"","",""],
    236.             1 => [ 1, "EXEC Playback weather\/digits\/tysiacha \"\"\n","EXEC Playback weather\/digits\/tysiach \"\"\n","EXEC Playback weather\/digits\/tysiachi \"\"\n" ],
    237.             2 => [  0, "EXEC Playback weather\/digits\/million \"\"\n","EXEC Playback weather\/digits\/millionov \"\"\n","EXEC Playback weather\/digits\/milliona \"\"\n" ],
    238.             3 => [  0, "EXEC Playback weather\/digits\/milliard \"\"\n","EXEC Playback weather\/digits\/milliardov \"\"\n","EXEC Playback weather\/digits\/milliarda \"\"\n" ],
    239.             4 => [  0, "EXEC Playback weather\/digits\/trillion \"\"\n","EXEC Playback weather\/digits\/trillionov \"\"\n","EXEC Playback weather\/digits\/trilliona \"\"\n"],
    240.         };
    241. #
    242. # Определяем длину левой `тройки'...
    243. #
    244.     my $id =  0;
    245.     unless ( ( scalar @array ) % 3 ) {
    246.         $id = 2;
    247.     } else {
    248.         $id = ( ( scalar @array ) % 3 ) - 1;
    249.     }
    250.  
    251.     my $str = '';
    252.     my $sub_str =  0;
    253.     my $tvar =  0;
    254.  
    255.     if ( $array[ 0] ==  0 ) {
    256. #
    257. # Если рублей таки ноль, то так и пишем 'ноль рублей',
    258. # если не надо то просто закомнтировать следующую строку...
    259. #
    260.         $str .= $digits_name->{'0'}->[ 0] . ' ' . $digits_class->{'0'}->[2] . ' ';
    261.     } else {
    262.         while ( defined ( $_ = shift @array ) ) {
    263.             if ( $_ >  0 ) {
    264.                 if ( $_ == 1 and $id == 1 ) {
    265. #
    266. # Считаем сумму для использования в sub num()
    267. #
    268.                     $sub_str += $_ * 10;
    269.                     if ( defined ( $tvar = shift @array ) and $tvar >  0 ) {
    270.                         $str .= $dec_digits->{ $_ . $tvar };
    271.                         $sub_str += $tvar;
    272.                         $id--;
    273.                     } else {
    274.                         unshift @array, $tvar;
    275.                         if ( ref $digits_name->{$_}->[$id] eq 'ARRAY' ) {
    276. #                            $str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id-1}->[0]];
    277.                         } else {
    278.                             $str .= $digits_name->{$_}->[$id];
    279.                         }
    280.                     }
    281.                 } else {
    282. #
    283. # Считаем сумму для использования в sub num()
    284. #
    285.                     $sub_str += ( $_ * ( 10 ** $id ) );
    286.                     if ( ref $digits_name->{$_}->[$id] eq 'ARRAY' ) {
    287.                         $str .= $digits_name->{$_}->[$id]->[$digits_class->{$class_id-1}->[ 0]];
    288.                     } else {
    289.                         $str .= $digits_name->{$_}->[$id];
    290.                     }
    291.                 }
    292.                 $str .= ' ';
    293.             }
    294.             if ( --$id == -1 ) {
    295.                 $id = 2;
    296.                 $class_id--;
    297.                 if ( $sub_str >  0 ) {
    298.                     $str .= num( $sub_str, ( @{ $digits_class->{$class_id} } )[ 1 .. 3 ] ) . ' ';
    299.                 } elsif ( $class_id ==  0 ) {
    300.                     $str .= $digits_class->{$class_id}->[2] . ' ';
    301.                 }
    302.                 $sub_str =  0;
    303.             }
    304.         }
    305.     }
    306.  
    307.     $str .= $s_dig . ' ' . num( $s_dig, ( @{ $digits_class->{ '-1' } } )[ 1 .. 3 ] );
    308.  
    309.     if ( defined $sign ) {
    310.         $str = "EXEC Playback weather\/digits/minus \"\"\n" . $str;
    311.     }
    312.  
    313.     $s_dig = substr( $str,  0, 1 );
    314. #
    315. # В том случае где оно пользовалось оказалось проще
    316. # так, чем через use locale & ucfirst...
    317. #
    318.     if ( $s_dig =~ tr/абвгдеёжзийклмнопрстуфхцчшщъыьэюя/АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ/ ) {
    319.         substr( $str,  0, 1, $s_dig );
    320.     }
    321.  
    322.     return $str;
    323. }
    324.  
    325. #
    326. # Используется при переводе денежного числа в строку прописью..
    327. #
    328.  
    329. sub num {
    330.     my $d1 = $_[ 0] % 10;
    331.     my $d2 = int( ( $_[ 0] % 100 ) / 10 );
    332.     return $_[2] if ( ( $d2 == 1 ) or ( $d1 =~ /[05-9]/ ) );
    333.     return $_[1] if ( $d1==1 );
    334.     return $_[3];
    335. }
    336.  


    Далее нам необходимо научить Asterisk пользваться этим скриптом. Для этого в файле extensions.conf в нужном контексте прописываем вот так:


    Copy Source | Copy HTML
    1. exten => XXXX,1,Wait(1)
    2. exten => XXXX,n,Answer()
    3. exten => XXXX,n,Agi(/usr/isp/weather/weather.pl)
    4. exten => XXXX,n,Hangup()
    5.  

    Где XXXX номер который вы хотите присвоить сервису «Погода». У меня к примеру стоит плата Digium, через которую все желающие могут узнать погоду позвонив с любого телефона.
    Вот и всё!
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 31
    • 0
      Спасибо, полезно!
      А поделитесь готовыми звуковыми файлами? :)
      • +1
        Если четко поставите ТЗ, можно будет бесплатно записать в студии ivrvoice.ru.
      • +2
        Голос записан не мой, а владелец голоса будет против :)
        Но все желающие могу его послушать по номеру 8(4722) 784801.
        Или загляните на sip.magistraly.ru и пройдите регистрацию.
        • 0
          habra эффект goes offline :)
          • +3
            Ух ты, мне даже не понадобилось набирать первые пять цифр номера, чтобы дозвониться :)
            • 0
              а в этом ужасном программном телефоне надо только 784801 набирать?
              иначе он молчит, а с таким номером — разговор типа идет, только подогоды в Белгороде не слышу))
              • 0
                Чрез SIP клиент достаточно 784801.
                Настройки программы проверьте на странице помощи.
            • 0
              >Зашел на сайт gismetio.ru нашел свой город.

              На этом сайте, конечно, можно поискать свой город, но вряд ли это будет чем-то полезно.
            • +1
              А ведь есть речевой синтезатор festival
              • 0
                решение прекрасное.
                но мне удобнее воспринимать информацию зрительно — поэтому я просто гляжу на экран своего телефона, а он уже обновил по вай-фаю информацию о погоде.

                вам за решение — поклон )
                • 0
                  прошу прощения, а зачем
                  </span>
                  в смене директории? предполагаю, немного съехала разметка…
                • +2
                  а можно подробнее, что за плата у вас такая?
                • 0
                  Чорт…
                  • 0
                    идея — использовать ubot для чтения погоды, полученной через rss
                    • 0
                      буду скачивать и парсить питоном. потом вставлю осадки в приглашение командной строки или в статус мессенджера )
                    • 0
                      скрипт про погоду, а в комментах рубли :-)
                      • –3
                        Не люблю астериск. Да, можно делать такие ивращения, однако sipx нравится больше
                        • +1
                          ух ты, а у меня есть аналогичная разработка :-) правда в виде python-модуля к Sems, а в качестве sip-прокси Openser, работает в городе Оренбурге, номер 8 (3532) 405-505, голос женский и приятный :)
                          • 0
                            Эх, для Москвы бы, и по SIP снаружи… ;)
                          • 0
                            Надо бы стартапчик делать: привязать бота-говоруна ubot.ru к данным по прогнозам gismeteo.ru и выдавать готовые mp3-шки кому надо.
                            • 0
                              Я не спец в телефонии, но стоит задача сделать прозвонку абонентов. Есть обычный Voice-модем ZyXEL. Можно ли организовать с помощью Астерикса подобное. Или подскажите другую бесплатную прогу, желательно (но не обязательно) для Linux.
                              • 0
                                Вот тут пишут что можно использовать модем, сам не проверял. Нет таких модемов у меня.
                                P.S.: Вообще всю серию статей «Asterisk и Linux: миссия IP-телефония» рекомендую к прочтению.
                                • 0
                                  Спасибо, я читал эту статью, и именно абзац, где говорится о модемах, меня и заинтересовал. Но там нужно специальные модемы.

                                  Порылся в интернете — что-то простое можно реализовать на vgetty (дозвон и проигрывание файло с записью)
                              • 0
                                А для Москвы нет готового прогноза по SIP? Неохота астериск поднимать из-за этого, а позвонить на SIP URI и послушать прогноз хочется. :)
                                • 0
                                  Отвечу сам себе: 100@sipnet.ru.

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.