Pull to refresh

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

Reading time 22 min
Views 8.7K

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



Первое что нам потребуется это сам прогноз погоды. Я решил его брать с сайта 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, через которую все желающие могут узнать погоду позвонив с любого телефона.
Вот и всё!
Tags:
Hubs:
+29
Comments 31
Comments Comments 31

Articles