[Amélioration] Délai des règles

Discutez ici de vos souhaits d'évolutions et de vos idées pour eedomus

[Amélioration] Délai des règles

Messagepar Terrano » 05 Mai 2015 13:25

Bonjour,

J'effectue un paramétrage poussé de la eeDomus avec intégration sur serveur Asterisk.

Par exemple, lors d'une détection incendie, ma eeDomus peut envoyer un message audio sur tous les téléphones SIP de la maison (y compris les mobiles en extérieur) et fait sonner les sirènes d'alarme.

Or, le fait de faire sonner les sirènes d'alarme masque le message diffusé par les téléphones.
Je n'ai pas trouvé de moyen de déclencher une règle par exemple 5 minutes après le déclenchement ou le changement d'état d'un périphérique.

Serait-il possible, tout comme il l'est de pouvoir mettre un délai avant le réclenchement d'une règle, de pouvoir mettre un délai avant le déclenchement d'une règle ?

Le but serait qu'une règle passe en l'état d'attente (5 minutes) par exemple et qu'au bout des 5 minutes, qu'elle vérifie si les conditions sont toujours d'actualité ou pas.

Qu'en pensez-vous ?
Terrano
 
Messages : 23
Inscription : 27 Fév 2015

Re: [Amélioration] Délai des règles

Messagepar influman » 05 Mai 2015 18:04

il te suffit de passer par un état virtuel à deux valeurs avec une macro de tempo de 5mn.

Tu lances la macro à la détection d'incendie.
Tu rajoutes cet état comme critère de déclenchement dans ta règle à temporiser, et qui le remets également à zéro comme action.

Si tu prévoies de stopper d'une manière ou d'une autre la procédure en cours, il te suffit de prévoir un "macro -> Arreter" sur cet état dans une règle.
influman
 
Messages : 2324
Inscription : 30 Oct 2013

Re: [Amélioration] Délai des règles

Messagepar Terrano » 06 Mai 2015 08:38

Noté, je vais tester, merci pour le tuyau :)
Terrano
 
Messages : 23
Inscription : 27 Fév 2015

Re: [Amélioration] Délai des règles

Messagepar mmaatt86 » 10 Juil 2015 00:23

Salut Terrano,

Comment as tu fait pour intégrer l'Eedomus avec Asterisk?
Je cherche à faire l'inverse c'est à dire qu'un appel lance un macro par exemple.
mmaatt86
 
Messages : 19
Inscription : 13 Fév 2015

Re: [Amélioration] Délai des règles

Messagepar Terrano » 10 Juil 2015 09:06

Bonjour,

J'ai réalisé quelques tutos dont tu peux t'inspirer :
http://www.nas-forum.com/forum/topic/46 ... de-google/
http://www.nas-forum.com/forum/topic/46 ... -francais/

J'ai également créé un ensemble de script très complet :
  • Donner les informations météos (choix de la ville et du nombre de jours)
  • IVR avec reconnaissance vocale
  • Alertes vocales

Pour se faire, faut disposer d'un NAS Synology bien configuré.

D'abord, créer un dossier partagé /volume1/scripts/Asterisk/ et y déposer le fichier tts.sh suivant :
Code : Tout sélectionner
#!/bin/sh

# Need IPKG packages
# MD5deep
# mpg123

LANG="fr"
GOOGLEKEY="XXXXXXXXXXXXXXXXXXXXXXXX" # Clé Google Reconnaissance Vocale à obtenir auprès de Google
GOOGLETTS="http://translate.google.com/translate_tts?ie=utf-8&tl=$LANG"
GOOGLEREC="https://www.google.com/speech-api/v2/recognize?key=$GOOGLEKEY&lang=$LANG&output=json"
ASF="/var/lib/asterisk/sounds/"
AOF="/var/packages/Asterisk/target/var/spool/asterisk/outgoing/"
TMP="/tmp/"

makeweather () {
   WPHP=$1
   
   VALUE=$(/usr/bin/php -f $WPHP - $ACTION $CONTEXT $COUNTRY 3 3)
   echo "$VALUE"
}

recosound () {
   RECOFILE=$1
   RECOFOLDER=$2
   RECOCONTEXT=$3
   
   mkdir $ASF$RECOFOLDER
   
    case "$RECOCONTEXT" in
        ("initial")
            DATE=$(date +%Y%m%d%H%M%S%n)
            cd $ASF$RECOFOLDER
         mv $ASF$RECOFILE $ASF$RECOFOLDER/$RECOFILE
           curl -X POST --data-binary @"${RECOFILE}" --header 'Content-Type: audio/l16; rate=8000;' "$GOOGLEREC" >> $TMP$DATE.json
           rm $ASF$RECOFOLDER$RECOFILE
            echo $TMP$DATE.json
            ;;
        ("confidence")
            RET=$(cat $RECOFILE | tail -n +2 | python -m 'json.tool' | jq '.result[].alternative[0].confidence')
            echo $RET
            ;;
        ("utterance")
            RET=$(cat $RECOFILE | tail -n +2 | python -m 'json.tool' | jq '.result[].alternative[0].transcript')
            echo $RET
            ;;
        (*)
            exit 1
            ;;
    esac
}

loadfile () {
   LOADFILE=$1
   LOADFOLDER=$2
   LOADFILTER=$3
   
   let "INCR=0"
   while read -r line || [ -n "$line" ]
   do
       VAR=$(echo $line | perl -nle 'm/{([^}]*)/; print $1')
       REP='{'$VAR'}'
       if [ "${VAR/$LOADFILTER}" != "$VAR" ]
      then
            TEXT=$line
            TEXT=${TEXT#*${REP}}
         let "INCR++"
      fi
   done < $LOADFILE
    if [[ $INCR == 1 ]]
   then
        makesound "${TEXT}" $LOADFOLDER
   else
      echo $INCR
   fi
}

makefile () {
   TEXTTOSPEECH=$1
   SOUNDFOLDER=$2
   
   while read -r line || [ -n "$line" ]
   do
       TEXT=$line
       VAR=$(echo $TEXT | perl -nle 'm/{([^}]*)/; print $1')
       REP='{'$VAR'}'
       TEXT=${TEXT#*${REP}}
       makesound "${TEXT}" $SOUNDFOLDER
   done < $TEXTTOSPEECH
}

makesound () {
   TEXTTOSPEECH=$1
   SOUNDFOLDER=$2
   
   mkdir $ASF$SOUNDFOLDER
   
   SOUND=$(echo -n $TEXTTOSPEECH | /opt/bin/md5deep)
   curl -A "Mozilla" --data-urlencode "q=$TEXTTOSPEECH" "$GOOGLETTS" > $ASF$SOUNDFOLDER/$SOUND.mp3
   /opt/bin/mpg123 -r 8000 -w $ASF$SOUNDFOLDER/$SOUND.wav $ASF$SOUNDFOLDER/$SOUND.mp3
   rm $ASF$SOUNDFOLDER/$SOUND.mp3
   echo "$SOUNDFOLDER/$SOUND"
}

makecall () {
   CALLFILE=$1
   CALLFOLDER=$2
   CALLCALLED=$3
   CALLCALLER=$4
   CALLCONTEXT=$5
   
   let "INCRCALLED=1"
   while read -r line || [ -n "$line" ]
   do
       TEXT=$line
       VAR=$(echo $TEXT | perl -nle 'm/{([^}]*)/; print $1')
       REP='{'$VAR'}'
       TEXT=${TEXT#*${REP}}
      
      DATE=$(date +%Y%m%d%H%M%S%n)$TEXT
      DATE=$(echo -n $DATE | /opt/bin/md5deep)
      touch $TMP$DATE.call
      echo "Channel: $TEXT" >> $TMP$DATE.call
      echo "Callerid: $CALLCALLER" >> $TMP$DATE.call
      echo "MaxRetries: 10" >> $TMP$DATE.call
      echo "RetryTime: 5" >> $TMP$DATE.call
      echo "WaitTime: 20" >> $TMP$DATE.call
      echo "Context: $CALLCONTEXT" >> $TMP$DATE.call
      echo "Extension: $CALLCALLER" >> $TMP$DATE.call
      
      let "INCR=1"
      if [ -f ${CALLFILE} ]
      then
         while read -r line || [ -n "$line" ]
         do
             TEXT=$line
             VAR=$(echo $TEXT | perl -nle 'm/{([^}]*)/; print $1')
             REP='{'$VAR'}'
             TEXT=${TEXT#*${REP}}
             echo "Setvar: $VAR="$(makesound "${TEXT}" $CALLFOLDER) >> $TMP$DATE.call
            let "INCR++"
         done < $CALLFILE
      fi
      let "INCR--"
      echo "Setvar: file_max=$INCR" >> $TMP$DATE.call
      # cp $TMP$DATE.call /volume1/scripts/Asterisk/$DATE.call.sh
      mv $TMP$DATE.call $AOF
      echo "$DATE.call"
      
      let "INCRCALLED++"
   done < $CALLCALLED
   rm $CALLCALLED
   rm $CALLFILE
}

while getopts ":a:t:T:F:f:c:C:s:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG" >&2
      ACTION=$OPTARG
      ;;
    t)
      echo "-t was triggered, Parameter: $OPTARG" >&2
      FILE=$OPTARG
      ;;
    F)
      echo "-F was triggered, Parameter: $OPTARG" >&2
      CALLER=$OPTARG
      ;;
    T)
      echo "-T was triggered, Parameter: $OPTARG" >&2
      CALLED=$OPTARG
      ;;
    c)
      echo "-c was triggered, Parameter: $OPTARG" >&2
      CONTEXT=$OPTARG
      ;;
    C)
      echo "-C was triggered, Parameter: $OPTARG" >&2
      COUNTRY=$OPTARG
      ;;
    f)
      echo "-f was triggered, Parameter: $OPTARG" >&2
      FOLDER=$OPTARG
      ;;
    s)
      echo "-s was triggered, Parameter: $OPTARG" >&2
      SOURCE=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

case "$ACTION" in
    ("CALL")
       echo $(makecall "${FILE}" $FOLDER "${CALLED}" $CALLER $CONTEXT)
      ;;
    ("SOUND")
      echo $(makesound "${FILE}" $FOLDER) | tr -d '\n'
      ;;
    ("WEATHER")
      echo $(makeweather $SOURCE $ACTION $CONTEXT $COUNTRY) | tr -d '\n'
      ;;
    ("FILE")
      echo $(makefile "${FILE}" $FOLDER) | tr -d '\n'
      ;;
    ("LOAD")
      echo $(loadfile "${FILE}" $FOLDER $CALLER) | tr -d '\n'
      ;;
    ("RECOG")
      echo $(recosound "${FILE}" $FOLDER $CONTEXT) | tr -d '\n'
      ;;
    (*)
      exit 1
      ;;
esac


Ensuite, créer un dossier Web avec accès restreint (par IP locale) \volume1\web\perso\asterisk et y déposer les fichiers suivants :
class.php :
Code : Tout sélectionner
<?php
$makecall_sh = "/volume1/scripts/Asterisk/tts.sh";
$ssh2_ip = "192.168.0.1"; // IP NAS Synology
$ssh2_port = "22"; // Port SSH local
$ssh2_account = "YYYYYYYY"; // Compte SSH pouvant exécuter les scripts et accèder aux dossiers Asterisk
$ssh2_password = "XXXXXXXXXXX"; // Mot de passe du compte ci-dessus

include_once(dirname(__FILE__) . "/class.weather.php");

function isJSON($string){
   return is_string($string) && is_object(json_decode($string)) ? true : false;
}

function xml_to_array($xml,$main_heading = '') {
    $deXml = simplexml_load_string($xml);
    $deJson = json_encode($deXml);
    $xml_array = json_decode($deJson,TRUE);
    if (! empty($main_heading)) {
        $returned = $xml_array[$main_heading];
        return $returned;
    } else {
        return $xml_array;
    }
}

function arguments ( $args )
{
   array_shift( $args );
   $endofoptions = false;
   
   $ret = array
   (
      'commands' => array(),
      'options' => array(),
      'flags'    => array(),
      'arguments' => array(),
   );
   
   while ( $arg = array_shift($args) )
   {
      // if we have reached end of options,
      //we cast all remaining argvs as arguments
      if ($endofoptions)
      {
         $ret['arguments'][] = $arg;
         continue;
      }
      // Is it a command? (prefixed with --)
      if ( substr( $arg, 0, 2 ) === '--' )
      {
         // is it the end of options flag?
         if (!isset ($arg[3]))
         {
            $endofoptions = true;; // end of options;
            continue;
         }
         $value = "";
         $com   = substr( $arg, 2 );
         // is it the syntax '--option=argument'?
         if (strpos($com,'='))
         list($com,$value) = split("=",$com,2);
         
         // is the option not followed by another option but by arguments
         elseif (strpos($args[0],'-') !== 0)
         {
            while (strpos($args[0],'-') !== 0)
               $value .= array_shift($args).' ';
               $value = rtrim($value,' ');
         }
         $ret['options'][$com] = !empty($value) ? $value : true;
         continue;
      }
      // Is it a flag or a serial of flags? (prefixed with -)
      if ( substr( $arg, 0, 1 ) === '-' )
      {
         for ($i = 1; isset($arg[$i]) ; $i++)
            $ret['flags'][] = $arg[$i];
         continue;
      }
      // finally, it is not option, nor flag, nor argument
      $ret['commands'][] = $arg;
      continue;
   }
   if (!count($ret['options']) && !count($ret['flags']))
   {
      $ret['arguments'] = array_merge($ret['commands'], $ret['arguments']);
      $ret['commands'] = array();
   }
   return $ret;
}

function makeCall($context, $caller, $called, $soundfolder, $text, $action){
    $stack = array();
   
    global $makecall_sh, $ssh2_ip, $ssh2_port, $ssh2_account, $ssh2_password;
   
    if(isJSON($text)){
        //Store content on file
        $jsonIterator = new RecursiveIteratorIterator( new RecursiveArrayIterator(json_decode($text, TRUE)), RecursiveIteratorIterator::SELF_FIRST);
        $file = dirname($makecall_sh)."/".md5($text).".txt";
        $myfile = fopen($file, "w") or die("Unable to open file!");
        fwrite($myfile, "\xEF\xBB\xBF");
        foreach ($jsonIterator as $key => $val) {
            if(!is_array($val)) {
                fwrite($myfile, "{".$key."}".$val."\n");
            }
        }
        fclose($myfile);
        $text = $file;
    }
   
    if(isJSON($called)){
        //Store content on file
        $jsonIterator = new RecursiveIteratorIterator( new RecursiveArrayIterator(json_decode($called, TRUE)), RecursiveIteratorIterator::SELF_FIRST);
        $file = dirname($makecall_sh)."/".md5($called).".txt";
        $myfile = fopen($file, "w") or die("Unable to open file!");
        fwrite($myfile, "\xEF\xBB\xBF");
        foreach ($jsonIterator as $key => $val) {
            if(!is_array($val)) {
                fwrite($myfile, "{".$key."}".$val."\n");
            }
        }
        fclose($myfile);
        $called = $file;
    }else {
       $called = trim(stripslashes($called), '"');
        $file = dirname($makecall_sh)."/".md5($called).".txt";
        $myfile = fopen($file, "w") or die("Unable to open file!");
        fwrite($myfile, "\xEF\xBB\xBF");
        fwrite($myfile, "{Called}".$called."\n");
        fclose($myfile);
        $called = $file;
    }
   
    $connection = ssh2_connect($ssh2_ip, $ssh2_port);
    if (!ssh2_auth_password($connection, $ssh2_account, $ssh2_password)) {
            array_push($stack, 'Echec de l\'identification...');
            die();
    }
   
    $stream = ssh2_exec($connection, $makecall_sh.' -a '.$action.' -t '.$text.' -F '.$caller.' -T '.$called.' -c '.$context.' -f '.$soundfolder);   

    // Enable blocking for both streams
    stream_set_blocking($stream, true);
    while($line = fgets($stream)) {
            flush();
            array_push($stack, $line);
    }

    // Close the streams
    fclose($stream);
    ssh2_exec($connection, 'exit');
    unset($connection);
       
    header('Content-Type: application/json');
    echo json_encode($stack, JSON_FORCE_OBJECT);
}
?>


class.weather.php :
Code : Tout sélectionner
<?php
class wMeteo {
    public function getCityCode($search) {
        $search = explode(',', $search);
        $search = array_map('urlencode', $search);
        $search = implode(',+', $search);
        $dom = new DomDocument;
        $dom->load("http://wxdata.weather.com/wxdata/search/search?where=" . $search);
       
        $elements = $dom->getElementsByTagName('search');
        $element = $elements->item(0);
        $enfants = $element->childNodes;
       
        foreach ($enfants as $enfant) {
            if ($enfant->nodeName != "#text") {
                $nom[] = $enfant->nodeValue;
            }
            if ($enfant->nodeType == XML_ELEMENT_NODE) {
                $id[] = $enfant->getAttribute('id');
            } 
        }
        return $id[0];
    }
    static function date_fr($date) {
        $date= explode(" ", $date);
        $jourFR = array("Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche");
        $jourUS = array("Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday","Sunday");       
        $moisFR = array("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
        $moisUS = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
       
        $dateFrancais = str_replace($jourUS, $jourFR, $date[0]);
        $dateFrancais .= " ".$date[2]." ";
        $dateFrancais .= str_replace($moisUS, $moisFR, $date[1]);
        return $dateFrancais;
    }
    public static function to24H($time) {
        preg_match('#(\d+)\:(\d+)\s+(AM|PM)?#', $time, $matches);
       
        if ($matches[3] == 'PM')
        {
            $matches[1] += 12;
        }
        return $matches[1] . ':' . $matches[2];
    }
    public static function temps_FR($temps) {
        $tempsFR=strtolower(str_replace(array(" ","/"),"",$temps));
        switch ($tempsFR) {
            case "afewclouds":return "parsemé de quelques nuages";break;
            case "amcloudspmsun":return "nuageux dans la matinée et ensoleillé dans l'après-midi";break;
            case "amcloudspmsunwind":return "nuageux dans la matinée et ensoleillé dans l'après-midi accompagné de vent";break;
            case "amdrizzle":return "soumis à de la bruine dans la matinée";break;
            case "amfogpmsun":return "soumis à du brouillard dans la matinée et ensoleillé dans l'après-midi";break;
            case "amfogpmclouds":return "soumis à du brouillard dans la matinée et nuageux dans l'après-midi";break;
            case "amlightrain":return "parsemé de légère pluie dans la matinée";break;
            case "amlightrainwind":return "parsemé de légère pluie dans la matinée accompagnée de vent";break;
            case "amlightsnow":return "parsemé de légères chutes de neige dans la matinée";break;
            case "amlightsnowwind":return "parsemé de légères chutes de neige dans la matinée accompagnées de vent";break;
            case "amlightwintrymix":return "parsemé de légères précipitations hivernales dans la matinée";break;
            case "amrain":return "à la pluie dans la matinée";break;
            case "amrainice":return "à la pluie dans la matinée accompagnée de glace";break;
            case "amrainsnow":return "à la pluie dans la matinée accompagnée de neige";break;
            case "amrainsnowwind":return "à la pluie dans la matinée accompagnée de neige et de vent";break;
            case "amrainsnowshowers":return "à la pluie accompagnée de chutes de neige dans la matinée";break;
            case "amrainwind":return "à la pluie dans la matinée accompagnée de vent";break;
            case "amshowers":return "aux averses dans la matinée";break;
            case "amshowerswind":return "aux averses dans la matinée accompagnées de vent";break;
            case "amsnow":return "à la neige dans la matinée";break;
            case "amsnowshowers":return "soumis à des chutes de neige dans la matinée";break;
            case "amsnowshowerswind":return "soumis à des chutes de neige dans la matinée accompagnées de vent";break;
            case "amt-storms":return "orageux dans la matinée";break;
            case "amwintrymix":return "soumis à des précipitations hivernales dans la matinée";break;
            case "blowingsandandwindy":return "soumis à des rafales de sable et de vent";break;
            case "blowingsnow":return "soumis à des rafales de neige";break;
            case "clear":return "dégagé";break;
            case "cloudsearlyclearinglate":return "nuageux d'abord laissant place a des éclaircies par la suite";break;
            case "cloudy":return "nuageux";break;
            case "cloudywind":return "nuageux accompagné de vent";break;
            case "cloudyandwindy":return "nuageux et Venteux";break;
            case "driftingsnow":return "soumis à des rafales de neige";break;
            case "drizzle":return "soumis à de la bruine";break;
            case "drizzlefog":return "soumis à de la bruine et du Brouillard";break;
            case "fair":return "beau";break;
            case "fairandwindy":return "beau et venteux";break;
            case "fewshowers":return "propice à quelques averses";break;
            case "fewshowerswind":return "propice à quelques averses accompagnées de vent";break;
            case "fewsnowshowers":return "propice à quelques chutes de neige";break;
            case "fewsnowshowerswind":return "propice à quelques chutes de neige accompagnées de vent";break;
            case "flurries":return "propice à des chutes de neige fondante";break;
            case "flurrieswind":return "propice à des chutes de neige fondante accompagnées de vent";break;
            case "fog":return "soumis à du brouillard";break;
            case "fogclouds":return "soumis à du brouillard tout en se couvrant";break;
            case "foggy":return "soumis à du brouillard";break;
            case "foglate":return "soumis à du brouillard";break;
            case "freezingrain":return "chargé de pluie verglaçante";break;
            case "haze":return "soumis à une légère brume";break;
            case "heavydrizzle":return "soumis à une forte bruine";break;
            case "heavyrain":return "soumis à une forte pluie";break;
            case "heavyrainwind":return "soumis à une forte pluie accompagnée de vent";break;
            case "heavyrainshower":return "soumis à de fortes averses";break;
            case "heavyrainshowerandwindy":return "soumis à de fortes averses accompagnées de vent";break;
            case "heavysnow":return "soumis à de fortes chutes de neige";break;
            case "heavyt-storm":return "propice à des orages violents";break;
            case "heavyt-stormandwindy":return "Orage violent accompagné de vent";break;
            case "heavyt-storms":return "propice à des orages violents";break;
            case "heavyt-stormswind":return "propice à des orages violents accompagnés de vent";break;
            case "hvyrainfreezingrain":return "soumis à une forte pluie voir des pluies verglaçantes";break;
            case "icetorain":return "chargé de givre suivi de pluie";break;
            case "isot-stormswind":return "propice à des orages isolés accompagnés de vent";break;
            case "isolatedt-storms":return "propice à des orages isolés";break;
            case "lightdrizzle":return "soumis à une légère bruine";break;
            case "lightfreezingdrizzle":return "soumis à une légère bruine verglaçante";break;
            case "lightfreezingrain":return "soumis à une légère pluie verglaçante";break;
            case "lightrain":return "soumis à une légère pluie";break;
            case "lightrainearly":return "soumis à une légère pluie";break;
            case "lightrainfog":return "soumis à une légère pluie accompagnée de brouillard";break;
            case "lightrainfreezingrain":return "soumis à une légère pluie voir une pluie verglaçante";break;
            case "lightrainlate":return "soumis à une légère pluie tardive";break;
            case "lightrainwind":return "soumis à une légère pluie accompagnée de vent";break;
            case "lightrainandfog":return "soumis à une légère pluie et du brouillard";break;
            case "lightrainandfreezingrain":return "soumis à une légère pluie accompagnée de pluie verglaçante";break;
            case "lightrainandwindy":return "soumis à une légère pluie accompagnée de vent";break;
            case "lightrainshower":return "soumis à de légères averses";break;
            case "lightrainshowerandwindy":return "soumis à de légères averses accompagnées de vent";break;
            case "lightrainwiththunder":return "soumis à une légère pluie avec du tonnerre";break;
            case "lightsnow":return "soumis à de légères chutes de neige";break;
            case "lightsnowwind":return "soumis à une légère neige accompagnée de vent";break;
            case "lightsnowandfog":return "soumis à une légère neige et du brouillard";break;
            case "lightsnowfog":return "soumis à une légère neige et du brouillard";break;
            case "lightsnowearly":return "soumis à de légères chutes de neige";break;
            case "lightsnowgrains":return "soumis à de légers granules de neige";break;
            case "lightsnowgrainsandfog":return "soumis à de légers granules de neige et du brouillard";break;
            case "lightsnowlate":return "soumis à de légères chutes de neige";break;
            case "lightsnowshower":return "soumis à de légères chutes de neige";break;
            case "lightsnowshowerwind":return "soumis à de légères chutes de neige accompagnées de vent";break;
            case "mist":return "soumis à de la brume";break;
            case "mostlyclear":return "plutôt dégagé";break;
            case "mostlyclearwind":return "plutôt dégagé accompagné de vent";break;
            case "mostlycloudy":return "plutôt nuageux";break;
            case "mostlycloudywind":return "plutôt nuageux accompagné de vent";break;
            case "mostlycloudyandwindy":return "plutôt nuageux et Venteux";break;
            case "mostlysunny":return "plutôt ensoleillé";break;
            case "mostlysunnywind":return "plutôt ensoleillé accompagné de vent";break;
            case "partlycloudy":return "couvert par des passages nuageux";break;
            case "partlycloudywind":return "couvert par des passages nuageux accompagnés de vent";break;
            case "partlycloudyandwindy":return "couvert par des passages nuageux accompagnés de vent";break;
            case "patchesoffog":return "chargé de bancs de brouillard";break;
            case "pmdrizzle":return "chargé de bruine dans l'après-midi";break;
            case "pmfog":return "chargé de brouillard dans l'après-midi";break;
            case "pmlightrain":return "soumis à une légère pluie dans l'après-midi";break;
            case "pmlightrainice":return "soumis à une légère pluie dans l'après-midi accompagnée de verglas";break;
            case "pmlightrainwind":return "soumis à une légère pluie dans l'après-midi accompagnée de vent";break;
            case "pmlightsnow":return "soumis à de légères chutes de neige dans l'après-midi";break;
            case "pmlightsnowwind":return "soumis à de légères chutes de neige dans l'après-midi accompagnées de vent";break;
            case "pmrain":return "pluvieux dans l'après-midi";break;
            case "pmrainsnow":return "pluvieux accompagné de neige dans l'après-midi";break;
            case "pmrainsnowwind":return "pluvieux accompagné de neige et de vent dans l'après-midi";break;
            case "pmrainsnowshowers":return "pluvieux accompagné de chutes de neige dans l'après-midi";break;
            case "pmshowers":return "propice à des averses dans l'après-midi";break;
            case "pmshowerswind":return "propice à des averses accompagnées de vent dans l'après-midi";break;
            case "pmsnow":return "propice à des chutes de neige dans l'après-midi";break;
            case "pmsnowwind":return "propice à des chutes de neige dans l'après-midi accompagnées de vent";break;
            case "pmsnowshowers":return "propice à des chutes de neige dans l'après-midi";break;
            case "pmsnowshowerswind":return "propice à des chutes de neige dans l'après-midi accompagnées de vent";break;
            case "pmt-showers":return "propice à des averses orageuses dans l'après-midi";break;
            case "pmt-storms":return "chargé d'orages dans l'après-midi";break;
            case "pmwintrymix":return "soumis à des précipitations hivernales dans l'après-midi";break;
            case "rain":return "pluvieux";break;
            case "rainearly":return "pluvieux";break;
            case "rainfreezingrain":return "pluvieux avec quelques pluies verglaçantes";break;
            case "rainsleet":return "pluvieux accompagné de granules de glace";break;
            case "rainsnow":return "pluvieux accompagné de neige";break;
            case "rainsnowlate":return "pluvieux accompagné de neige tardive";break;
            case "rainsnowwind":return "pluvieux accompagné de neige et de vent";break;
            case "rainsnowshowers":return "pluvieux accompagné de chutes de neige";break;
            case "rainsnowshowerswind":return "pluvieux accompagné de chutes de neige et de vent";break;
            case "rainsnowshowerslate":return "pluvieux accompagné de chutes de neige";break;
            case "rainthunder":return "pluvieux accompagné de tonnerre";break;
            case "rainthunderwind":return "pluvieux accompagné de tonnerre et de vent";break;
            case "rainwind":return "pluvieux accompagné de vent";break;
            case "rainandsleet":return "propice à de la pluie et à des granules de glace";break;
            case "rainandsnow":return "propice à de la pluie et à de la neige";break;
            case "rainshower":return "propice à des averses";break;
            case "rainshowerandwindy":return "propice à des averses accompagnées de vent";break;
            case "raintosnow":return "pluvieux voir neigeux";break;
            case "raintosnowwind":return "pluvieux voir neigeux accompagné de vent";break;
            case "scatteredflurries":return "propice à des chutes de neige fondante éparses";break;
            case "scatteredflurrieswind":return "propice à des chutes de neige fondante éparses accompagnées de vent";break;
            case "scatteredshowers":return "propice à des averses éparses";break;
            case "scatteredshowerswind":return "propice à des averses éparses accompagnées de vent";break;
            case "scatteredsnowshowers":return "soumis à des alternance de chutes de neige";break;
            case "scatteredsnowshowerswind":return "propice à des chutes de neige éparses accompagnées de vent";break;
            case "scatteredstrongstorms":return "propice à des orages violents épars";break;
            case "scatteredt-storms":return "propice à des orages épars";break;
            case "scatteredt-stormswind":return "propice à des orages épars accompagnés de vent";break;
            case "shallowfog":return "chargé de brouillard";break;
            case "showers":return "soumis à des averses";break;
            case "showerswind":return "soumis à des averses accompagnées de vent";break;
            case "showerswindlate":return "soumis à des averses accompagnées de vent";break;
            case "showerswindearly":return "soumis à des averses accompagnées de vent";break;
            case "showersearly":return "soumis à des averses";break;
            case "showersinthevicinity":return "soumis à des averses dans le voisinage";break;
            case "showerslate":return "soumis à des averses";break;
            case "sleet":return "soumis à des granules de glace";break;
            case "smoke":return "chargé de fumée";break;
            case "snow":return "neigeux";break;
            case "snowwind":return "neigeux accompagné de vent";break;
            case "snowandfog":return "neigeux accompagné de brouillard";break;
            case "snowandicetorain":return "neigeux accompagné de glace puis suivi par de la pluie";break;
            case "snowgrains":return "chargé de granules de neige";break;
            case "snowshower":return "soumis à des chutes de neige";break;
            case "snowshowerwind":return "soumis à des chutes de neige accompagnées de vent";break;
            case "snowshowerwindearly":return "soumis à des chutes de neige accompagnées de vent";break;
            case "snowshowersearly":return "soumis à des chutes de neige";break;
            case "snowshowerslate":return "soumis à des chutes de neige tardive";break;
            case "snowtoice":return "neigeux puis verglaçant";break;
            case "snowtoicewind":return "neigeux avec de la neige se transformant en glace accompagné de vent";break;
            case "snowtorain":return "neigeux puis suivi de pluie";break;
            case "snowtorainwind":return "neigeux puis suivi de pluie accompagnée de vent";break;
            case "snowtowintrymix":return "neigeux puis suivi de précipitations hivernales";break;
            case "sprinkles":return "soumis à des averses";break;
            case "strongstorms":return "chargé d'orages violents";break;
            case "strongstormswind":return "chargé d'orages violents accompagné de vent";break;
            case "sunny":return "ensoleillé";break;
            case "sunnywind":return "ensoleillé accompagné de vent";break;
            case "sunnyandwindy":return "ensoleillé et Venteux";break;
            case "t-showers":return "soumis à des averses orageuses";break;
            case "t-showerswind":return "soumis à des averses orageuses accompagnées de vent";break;
            case "t-storm":return "chargé d'orage";break;
            case "t-storms":return "chargé d'orages";break;
            case "t-stormswind":return "chargé d'orages accompagnés de vent";break;
            case "t-stormsearly":return "chargé d'orages";break;
            case "t-stormslate":return "chargé d'orages";break;
            case "thunder":return "secoué par du tonnerre";break;
            case "thunderandwintrymix":return "secoué par du tonnerre et soumis à des précipitations hivernales";break;
            case "thunderinthevicinity":return "secoué par du tonnerre dans le voisinage";break;
            case "unknownprecip":return "soumis à des précipitations";break;
            case "widespreaddust":return "chargé de brume sèche";break;
            case "wintrymix":return "soumis à des précipitations hivernales";break;
            case "wintrymixwind":return "soumis à des précipitations hivernales accompagnées de vent";break;
            case "wintrymixtosnow":return "soumis à des précipitations hivernales puis à de la neige";break;
            default : return $temps;break;
        }
    }
    function getWeather($city_code, $days, $duMoment = true) {
       
        $weather = new DomDocument;
        $weather->load('http://wxdata.weather.com/wxdata/weather/local/' . $city_code . '?cc=*&unit=m&dayf=' . $days);
        if ($duMoment == true) {
            $meteoActuel = $weather->getElementsByTagName('cc');
           
            foreach ($meteoActuel as $meteo) {
                $Day['actuel']['icon'] = $meteo->getElementsByTagName("icon")->item(0)->nodeValue;
                $Day['actuel']['t'] = $this->temps_FR($meteo->getElementsByTagName("t")->item(0)->nodeValue);
                $Day['actuel']["temperature"]= $meteo->getElementsByTagName("tmp")->item(0)->nodeValue;
                $Day['actuel']["temperatureRessentie"]= $meteo->getElementsByTagName("flik")->item(0)->nodeValue;
                $Day['actuel']["humidite"]= $meteo->getElementsByTagName("hmid")->item(0)->nodeValue;
                $Day['actuel']["visibilite"]= $meteo->getElementsByTagName("vis")->item(0)->nodeValue;
                $Day['actuel']["pointDeRose"]= $meteo->getElementsByTagName("dewp")->item(0)->nodeValue;
                $pression = $meteo->getElementsByTagName('bar');
                foreach ($pression as $press) {
                    $Day['actuel']['press']["r"] = $press->getElementsByTagName("r")->item(0)->nodeValue;
                    $Day['actuel']['press']["d"] = $this->temps_FR($press->getElementsByTagName("d")->item(0)->nodeValue);
                }
                $pression = $meteo->getElementsByTagName('wind');
                foreach ($pression as $press) {
                    $Day['actuel']['wind']["s"] = $press->getElementsByTagName("s")->item(0)->nodeValue;
                    $Day['actuel']['wind']["gust"] = $press->getElementsByTagName("gust")->item(0)->nodeValue;
                    $Day['actuel']['wind']["d"] = $press->getElementsByTagName("d")->item(0)->nodeValue;
                    $Day['actuel']['wind']["t"] = $press->getElementsByTagName("t")->item(0)->nodeValue;
                }
                $pression = $meteo->getElementsByTagName('uv');
                foreach ($pression as $press) {
                    $Day['actuel']['uv']["i"] = $press->getElementsByTagName("i")->item(0)->nodeValue;
                    $Day['actuel']['uv']["t"] = $this->temps_FR($press->getElementsByTagName("t")->item(0)->nodeValue);
                }
                $pression = $meteo->getElementsByTagName('moon');
                foreach ($pression as $press) {
                    $Day['actuel']['moon']["icon"] = $press->getElementsByTagName("icon")->item(0)->nodeValue;
                    $Day['actuel']['moon']["t"] = $this->temps_FR($press->getElementsByTagName("t")->item(0)->nodeValue);
                }
            }
        }
        $elements = $weather->getElementsByTagName('day');
 
          foreach ($elements as $enfant) {
            $idJour = "jour".$enfant->getAttribute('d');
 
            if ($enfant->nodeType == XML_ELEMENT_NODE) {
           
                $Day[$idJour]['jour'] = $this->date_fr($enfant->getAttribute('t')." ".$enfant->getAttribute('dt'));
             
            }
            $Day[$idJour]['TempMax']= $enfant->getElementsByTagName("hi")->item(0)->nodeValue;
            $Day[$idJour]['TempMin']= $enfant->getElementsByTagName("low")->item(0)->nodeValue;
            $Day[$idJour]['soleilLeve']= $this->to24H($enfant->getElementsByTagName("sunr")->item(0)->nodeValue);
            $Day[$idJour]['soleilCouche']= $this->to24H($enfant->getElementsByTagName("suns")->item(0)->nodeValue);
            $parties = $enfant->getElementsByTagName('part');
            foreach ($parties as $partie) {
                $partieJournee = $partie->getAttribute('p');
                $Day[$idJour]["partie"][$partieJournee]['icon'] = $partie->getElementsByTagName("icon")->item(0)->nodeValue;
                $Day[$idJour]["partie"][$partieJournee]['t'] = $this->temps_FR($partie->getElementsByTagName("t")->item(0)->nodeValue);
                $vents = $partie->getElementsByTagName("wind");
                foreach ($vents as $vent) {
                    $Day[$idJour]["partie"][$partieJournee]['ventVitesse'] = $vent->getElementsByTagName("s")->item(0)->nodeValue;
                    $Day[$idJour]["partie"][$partieJournee]['VentMax'] = $vent->getElementsByTagName("gust")->item(0)->nodeValue;
                    $Day[$idJour]["partie"][$partieJournee]['ventDirectionEnDegree'] = $vent->getElementsByTagName("d")->item(0)->nodeValue;
                    $Day[$idJour]["partie"][$partieJournee]['ventDirection'] = $this->temps_FR($vent->getElementsByTagName("t")->item(0)->nodeValue);
                }
                $Day[$idJour]["partie"][$partieJournee]['btd'] = $partie->getElementsByTagName("bt")->item(0)->nodeValue; //aucune idée sur cette information
                $Day[$idJour]["partie"][$partieJournee]['PourcentageDePrecipitation'] = $partie->getElementsByTagName("ppcp")->item(0)->nodeValue;
                $Day[$idJour]["partie"][$partieJournee]['humidite'] = $partie->getElementsByTagName("hmid")->item(0)->nodeValue;
            }
           
        }
        return $Day;
    }
}
?>


weather.php :
Code : Tout sélectionner
<?php
include_once(dirname(__FILE__) . "/class.php");
$data = json_decode(file_get_contents('php://input'), true);
$arr = arguments($argv);

$nbdays = $_POST['nbdays'].$_GET['nbdays'].$data['nbdays'].$arr['arguments'][3];
$city = $_POST['city'].$_GET['city'].$data['city'].$arr['arguments'][1];
$country = $_POST['country'].$_GET['country'].$data['country'].$arr['arguments'][2];
$dayoffset = $_POST['dayoffset'].$_GET['dayoffset'].$data['dayoffset'].$arr['arguments'][4];
$action = $_POST['action'].$_GET['action'].$data['action'].$arr['arguments'][0];

$context = $_POST['context'].$_GET['context'].$data['context'];
$caller = $_POST['caller'].$_GET['caller'].$data['caller'];
$called = $_POST['called'].$_GET['called'].$data['called'];
$soundfolder = $_POST['soundfolder'].$_GET['soundfolder'].$data['soundfolder'];

$weather = new wMeteo();
$code     = $weather->getCityCode($city.', '.$country);
$days    = $weather->getWeather($code, $nbdays);

//affiche le tableau de données
//echo "<pre>";
//print_r($days);
//echo "</pre>";
switch ($action) {
    case "WEATHER":
      $j = 1;
      foreach ($days as $day => $value)
      {
         switch ($day) {
            case "actuel":
               $i = 1;
                $text["day".$j."_".$i++] = "Le soleil se lèvera à ".str_replace(":", " heure ", str_replace(":0", " heure ", str_replace(":00", " heure", $days["jour0"]["soleilLeve"])))." et se couchera à ".str_replace(":", " heure ", str_replace(":0", " heure ", str_replace(":00", " heure", $days["jour0"]["soleilCouche"]))).".";
                $text["day".$j."_".$i++] = "Actuellement, la température est de ".$value["temperature"]." degrés avec une humidité de ".$value["humidite"]." pourcent.";
                $text["day".$j."_".$i++] = "La température ressentie est de ".$value["temperatureRessentie"]." degrés avec un vent de ".$value["wind"]["s"]." kilomètres heures.";
               $text["day".$j."_".$i++] = "Le ciel est ".$value["t"].".";
               break;
            case "jour0":
                $text["day".$j."_".$i++] = "La température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
               $text["day".$j."_".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
               $text["day".$j."_".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
               $j++;
               break;
            case "jour1":
               $i = 1;
                $text["day".$j."_".$i++] = "Pour demain, la température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
                $text["day".$j."_".$i++] = "Un vent de ".$value["partie"]["d"]["ventVitesse"]." kilomètres heures sera présent avec un risque de précipitations de ".$value["partie"]["d"]["PourcentageDePrecipitation"]." pourcent.";
               $text["day".$j."_".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
               $text["day".$j."_".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
               $j++;
               break;
            default:
               $i = 1;
                $text["day".$j."_".$i++] = "Pour ".substr($value["jour"], 0, strpos($value["jour"], " ")).", la température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
                $text["day".$j."_".$i++] = "Un vent de ".$value["partie"]["d"]["ventVitesse"]." kilomètres heures sera présent avec un risque de précipitations de ".$value["partie"]["d"]["PourcentageDePrecipitation"]." pourcent.";
               $text["day".$j."_".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
               $text["day".$j."_".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
               $j++;
         }
      }
      $fp = fopen(dirname(__FILE__) . '/weather.json', 'w');
      foreach ($text as $key => $val)
      {
         fwrite($fp, "{".$key."}".$val."\r\n");
      }
      fclose($fp);
      echo dirname(__FILE__).'/weather.json';
        break;
    case "CALL":
      $i = 1;
      $text = array (
       "file".$i++  => "Bonjour à tous.",
       "file".$i++  => "Je vous propose les informations météo du jour pour ".$city.", ".$country
      );
      foreach ($days as $day => $value)
      {
         {
            
         }
         if ($i <= 6+3*$dayoffset) {
             if ($day == "actuel") {
                $text["file".$i++] = "Le soleil se lèvera à ".str_replace(":", " heure ", str_replace(":0", " heure ", str_replace(":00", " heure", $days["jour0"]["soleilLeve"])))." et se couchera à ".str_replace(":", " heure ", str_replace(":0", " heure ", str_replace(":00", " heure", $days["jour0"]["soleilCouche"]))).".";
                $text["file".$i++] = "Actuellement, la température est de ".$value["temperature"]." degrés avec une humidité de ".$value["humidite"]." pourcent.";
                $text["file".$i++] = "La température ressentie est de ".$value["temperatureRessentie"]." degrés avec un vent de ".$value["wind"]["s"]." kilomètres heures.";
               $text["file".$i++] = "Le ciel est ".$value["t"].".";
             } else {
               if ($i == 7) {
                   $text["file".$i++] = "La température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
                  $text["file".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
                  $text["file".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
               } else {
                  if ($i == 10) {
                      $text["file".$i++] = "Pour demain, la température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
                      $text["file".$i++] = "Un vent de ".$value["partie"]["d"]["ventVitesse"]." kilomètres heures sera présent avec un risque de précipitations de ".$value["partie"]["d"]["PourcentageDePrecipitation"]." pourcent.";
                     $text["file".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
                     $text["file".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
                  } else {
                      $text["file".$i++] = "Pour ".substr($value["jour"], 0, strpos($value["jour"], " ")).", la température minimum sera de ".$value["TempMin"]." degrés et maximum de ".$value["TempMax"]." degrés.";
                      $text["file".$i++] = "Un vent de ".$value["partie"]["d"]["ventVitesse"]." kilomètres heures sera présent avec un risque de précipitations de ".$value["partie"]["d"]["PourcentageDePrecipitation"]." pourcent.";
                     $text["file".$i++] = "Le ciel pour la journée sera ".$value["partie"]["d"]["t"].".";
                     $text["file".$i++] = "Le ciel pour le soir sera ".$value["partie"]["n"]["t"].".";
                  }
               }
             }
         }
      }
      $text = json_encode($text, JSON_UNESCAPED_UNICODE);
      
      makeCall($context, $caller, $called, $soundfolder, $text, $action);
        break;
   default:
      ?>
      <style type="text/css">
      * {
         font-size: 12px;
         
      }
      .divImage{
         border:1px solid white; width:48%;float:left;
      }
      IMG.centrer {
          display: block;
          margin-left: auto;
          margin-right: auto
      }
      </style>
      <?
      //debut du tableau
      echo '<table cellpadding="4" cellspacing="1" border="0">
      <tr>';
      //premiere ligne du tableau (optionnelle)
      if ($dayoffset != null)
      {
         $nbdays = 1;
      }else{
         echo '<tr>
               <td align="center">actuel</td>
               <td colspan="'.$nbdays.'" align="center">previsions</td>
             </tr>';
      }
      //pour chaque jour
      foreach ($days as $day => $value)
      {
          if ($day == "actuel" ) {
             if ($dayoffset == null) {
                echo '<td>'; //une nouvelle ligne
                echo "Temp ".$value["temperature"]." °C<br>";
                echo "T ressentie ".$value["temperatureRessentie"]." °C<br>";
                echo "Humidite ".$value["humidite"]." %<br>";
                echo "Vent ".$value["wind"]["s"]." km/h<br>";
                echo "Indice UV ".$value["uv"]["i"]." sur 10<br>";
               echo '<div class="divImage">
               <img class="centrer" src="./pic_meteo/'.$value["icon"].'" title="'.$value["t"].'"/>
               </div>';
                echo '</td>';
             }
          } else {
             if ($dayoffset == null || ($day == "jour".$dayoffset)) {
                echo '<td>'; //une nouvelle ligne
                echo "<strong>".$value["jour"]."</strong><br>"; //affiche le jour
                echo "temperature Max : ".$value["TempMax"]." °C<br>";
                echo "temperature Min : ".$value["TempMin"]." °C<br>";
                echo "Précipitation ".$value["partie"]["d"]["PourcentageDePrecipitation"]." %<br>";
                echo "Vent ".$value["partie"]["d"]["ventVitesse"]." km/h<br>";
                $parties = $value["partie"];
                //pour chaque partie de la journée
                foreach ($parties as $p => $value)
               {
                  echo '<div class="divImage">
                  <img class="centrer" src="./pic_meteo/'.$value["icon"].'" title="'.$value["t"].'"/>
                  </div>';
               }
                echo '</td>';
             }
          }
      }
      //fin du tableau
      echo '</tr>
      </table>';
}
?>


Maintenant, coté eeDomus, déposer le script suivant :
asterisk.php :
Code : Tout sélectionner
<?

$GLOBALS['makecall'] = 'https://192.168.0.1/perso/asterisk/makecall.php';
$GLOBALS['app_version'] = '1.0.0';
$GLOBALS['app_id'] = 'fr.asterisk.eedomus';

function sdk_page_style()
{
   ?><style type="text/css">
body,td,th {
   font-family: Arial, Helvetica, sans-serif;
   font-size: 14px;
}
body {
   margin-left: 10px;
   margin-top: 10px;
}
   button
   {
      font-size: 100%;
      padding: 0.5em 1em;
      text-decoration: none;
      -moz-user-select: none;
      cursor: pointer;
      line-height: normal;
      text-align: center;
      vertical-align: baseline;
      white-space: nowrap;
      border: 0 none rgba(0, 0, 0, 0);
      border-radius: 4px;
      background-color: #0078e7;
      color: #fff;
   }
</style>
  <?
}

function sdk_step1()
{
   sdk_page_style();
   
   echo("<br />Ce script nécessite les variables suivantes afin de pouvoir fonctionner :
         <br />context :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context de l'appel tel que défini dans le fichier /var/packages/Asterisk/target/etc/asterisk/extensions.conf pour Asterisk
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple : alert
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple de définition du context dans le fichier asterisk :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[alert]
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exten => 8001,1,Answer()
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exten => 8001,n,Hangup()
         <br />caller :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nom ou numéro du poste appelant : 8001 dans l'exemple alert
         <br />called :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifiant SIP du poste à appeler :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple : SIP/6000
         <br />soundfolder :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sous-dossier où sont stockés les fichiers vocaux générés dans /var/lib/asterisk/sounds
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple : alert
         <br />text :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Emplacement du fichier contenant les variables et phrases à énoncer par asterisk.
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple : /volume1/asterisk/call.txt
         <br />
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exemple de contenu du fichier txt :
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{file1}Bonjour à tous.
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{file2}Il n'y a pas de fumée sans feu.
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{file3}Tu comprends ?
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{file4}La maison est en feu !
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{file5}Faut appeler les pompiers.
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chaque phrase ne doit pas dépasser les 100 caractères (limitation de Google TTS)
         <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;La variable entre accolade permet d'utiliser des extensions avec gestion de variable afin par exemple de définir l'ordre des phrases voir de mettre en place un IVR pour demander une action utilisateur");
}

function sdk_asterisk_query($url, $method = 'GET', $post = NULL, $return_xml = false)
{
   $response = httpQuery($url, $method, $post);
   echo $response;
   $json = sdk_json_decode($response);
   echo $json;
   if ($return_xml)
   {
      // permet d'avoir une mise en forme plus lisible dans un browser
      sdk_header('text/xml');
      echo jsonToXML($response);
   }
   else
   {
      return $json;
   }
}

switch($_GET['step'])
{
   default:
   case '1':
      sdk_step1();
   break;
   
   case 'makecall':
      $action = getArg('action');
      $context = getArg('context');
      $caller = getArg('caller');
      $called = addslashes(getArg('called'));
      $soundfolder = getArg('soundfolder');
      $text = addslashes(getArg('text'));
      $post = '{ "context": "'.$context.'", "caller": "'.$caller.'", "called": "'.$called.'", "soundfolder": "'.$soundfolder.'", "text": "'.$text.'", "action": "'.$action.'"}';
      sdk_asterisk_query($makecall, 'POST', $post);
   break;
}
?>
Terrano
 
Messages : 23
Inscription : 27 Fév 2015

Re: [Amélioration] Délai des règles

Messagepar Terrano » 10 Juil 2015 09:07

Maintenant, reste à configurer les extensions Asterisk, en SSH, faire :
vi /var/packages/Asterisk/target/etc/asterisk/extensions.conf

Dans le fichier placer les variables globales suivantes :
Code : Tout sélectionner
[globals]
WEATHERDEFAULTCITY=Paris
WEATHERDEFAULTCOUNTRY=France
WEATHERDEFAULTNBDAY=3
WEATHERDEFAULTJSON=/volume1/web/perso/asterisk/weather.json
SCRIPTTTS=/volume1/scripts/Asterisk/tts.sh
SCRIPTWEATHER=/volume1/web/perso/asterisk/weather.php


Placer ensuite les extensions suivantes :
Code : Tout sélectionner
[work]
;extensions des IVR
exten => 8000,1,Goto(weather,eeDomus,1)
exten => 1000,1,Goto(recognition,eeDomus,1)
exten => 2000,1,Goto(meteo,eeDomus,1)

[meteo]
exten => eeDomus,1,Answer()
exten => eeDomus,n,GotoIf($[${LEN(${COUNTRY})} = 0]?countrydef:countryset)
exten => eeDomus,n(countrydef),Set(COUNTRY=${WEATHERDEFAULTCOUNTRY})
exten => eeDomus,n(countryset),Set(COUNTRY=${COUNTRY})
exten => eeDomus,n,GotoIf($[${LEN(${CITY})} = 0]?citydef:cityset)
exten => eeDomus,n(citydef),Set(CITY=${WEATHERDEFAULTCITY})
exten => eeDomus,n(cityset),Set(CITY=${CITY})
exten => eeDomus,n,Set(TIMEOUT(response)=10)
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Set(WFILE=${SHELL(${SCRIPTTTS} -a WEATHER -s ${SCRIPTWEATHER} -c ${CITY} -C ${COUNTRY})})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a FILE -f tts -t ${WFILE})})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Bonjour à tous.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Je vous propose les informations météo du jour pour ${CITY}, ${COUNTRY}")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,Goto(weather,3,1)

[recognition]
exten => eeDomus,1,Answer()
exten => eeDomus,n(stepp),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Dites le nom du pays après le bip et appuyez sur dièse.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,Set(IDFILE=${SHELL(date +%Y%m%d%H%M%S%n | tr -d '\n')})
exten => eeDomus,n(recordp),Record(${IDFILE}:wav,0,15,y)
exten => eeDomus,n,Set(initial=${SHELL(${SCRIPTTTS} -a RECOG -t "${IDFILE}.wav" -f rec -c initial)})
exten => eeDomus,n,Set(confidence=${SHELL(${SCRIPTTTS} -a RECOG -t ${initial} -f rec -c confidence)})
exten => eeDomus,n,Set(_COUNTRY=${SHELL(${SCRIPTTTS} -a RECOG -t ${initial} -f rec -c utterance)})
exten => eeDomus,n,Verbose(1,Script returned: ${confidence} , ${_COUNTRY})

exten => eeDomus,n(successp),GotoIf($["${confidence}" > "0.80"]?stepv:retryp)

exten => eeDomus,n(retryp),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Je n'ai pas compris, pouvez-vous le répéter plus clairement ?")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,goto(recordp)

exten => eeDomus,n(stepv),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Dites le nom de la ville en ${COUNTRY} le bip et appuyez sur dièse.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,Set(IDFILE=${SHELL(date +%Y%m%d%H%M%S%n | tr -d '\n')})
exten => eeDomus,n(recordv),Record(${IDFILE}:wav,0,15,y)
exten => eeDomus,n,Set(initial=${SHELL(${SCRIPTTTS} -a RECOG -t "${IDFILE}.wav" -f rec -c initial)})
exten => eeDomus,n,Set(confidence=${SHELL(${SCRIPTTTS} -a RECOG -t ${initial} -f rec -c confidence)})
exten => eeDomus,n,Set(_CITY=${SHELL(${SCRIPTTTS} -a RECOG -t ${initial} -f rec -c utterance)})
exten => eeDomus,n,Verbose(1,Script returned: ${confidence} , ${_CITY})

exten => eeDomus,n(successv),GotoIf($["${confidence}" > "0.80"]?stepw:retryv)

exten => eeDomus,n(retryv),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Je n'ai pas compris, pouvez-vous le répéter plus clairement ?")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Playback(${RESULT})
exten => eeDomus,n,goto(recordv)

exten => eeDomus,n(failp),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Je suis désolé, je ne peux pas récupérer les informations.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n(endp),Hangup()

exten => eeDomus,n(stepw),Goto(weather,eeDomus,1)

[weather]
exten => eeDomus,1,Answer()
exten => eeDomus,n,GotoIf($[${LEN(${COUNTRY})} = 0]?countrydef:countryset)
exten => eeDomus,n(countrydef),Set(COUNTRY=${WEATHERDEFAULTCOUNTRY})
exten => eeDomus,n(countryset),Set(COUNTRY=${COUNTRY})
exten => eeDomus,n,GotoIf($[${LEN(${CITY})} = 0]?citydef:cityset)
exten => eeDomus,n(citydef),Set(CITY=${WEATHERDEFAULTCITY})
exten => eeDomus,n(cityset),Set(CITY=${CITY})
exten => eeDomus,n,Set(TIMEOUT(response)=10)
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Set(WFILE=${SHELL(${SCRIPTTTS} -a WEATHER -s ${SCRIPTWEATHER} -c ${CITY} -C ${COUNTRY})})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a FILE -f tts -t ${WFILE})})
exten => eeDomus,n(repeat),Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Tapez un pour la météo du jour à ${CITY}, ${COUNTRY}.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Background(${RESULT})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Tapez deux pour la météo de demain.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Background(${RESULT})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Tapez trois pour la météo des trois prochains jours.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Background(${RESULT})
exten => eeDomus,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a SOUND -f tts -t "Appuyez sur dièse si vous souhaitez réécouter ce  message.")})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,Background(${RESULT})
exten => eeDomus,n,Wait(1)
exten => eeDomus,n,WaitExten()

exten => 1,1,Wait(1)
exten => 1,2,Set(RESULT=${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day1)})
exten => 1,3,Wait(1)
exten => 1,n,Set(i=1);
exten => 1,n,While($[${i} <= ${RESULT}])
exten => 1,n,Playback(${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day1_${i})})
exten => 1,n,Set(i=$[ ${i} + 1 ])
exten => 1,n,EndWhile
exten => 1,n,Wait(1)

exten => 2,1,Wait(1)
exten => 2,2,Set(RESULT=${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day2_)})
exten => 2,3,Wait(1)
exten => 2,n,Set(i=1);
exten => 2,n,While($[${i} <= ${RESULT}])
exten => 2,n,Playback(${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day2_${i})})
exten => 2,n,Set(i=$[ ${i} + 1 ])
exten => 2,n,EndWhile
exten => 2,n,Wait(1)

exten => 3,1,Wait(1)
exten => 3,n,Set(j=1);
exten => 3,n,While($[${j} <= ${WEATHERDEFAULTNBDAY}])
exten => 3,n,Set(RESULT=${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day${j}_)})
exten => 3,n,Wait(1)
exten => 3,n,Set(i=1);
exten => 3,n,While($[${i} <= ${RESULT}])
exten => 3,n,Playback(${SHELL(${SCRIPTTTS} -a LOAD -t ${WEATHERDEFAULTJSON} -f tts -F day${j}_${i})})
exten => 3,n,Set(i=$[ ${i} + 1 ])
exten => 3,n,EndWhile
exten => 3,n,Set(j=$[ ${j} + 1 ])
exten => 3,n,EndWhile
exten => 3,n,Wait(1)
exten => 3,n,Hangup()

exten => _[4-9#],1,Goto(weather,eeDomus,repeat)
exten => t,1,Goto(weather,eeDomus,repeat)


Pour faire parler eeDomus sur un SIP, suffit alors de créer un actionneur HTTP et de l'appeler "eeDomus vous parle" par exemple.
Il faut alors rentrer plusieurs valeurs en fonction des alertes vocales souhaitées :

A vous de définir les textes souhaités et les incorporer dans vos règles.

A noter que ces scripts peuvent également être utilisés en batch pour le tts.sh ou en web.
Pour le moment, je suis toujours entrain de les améliorer et je ferais un tuto sur le site http://www.nas-forum.com/forum/forum/28-tutorials/ quand ils seront parfaits. :D
Terrano
 
Messages : 23
Inscription : 27 Fév 2015


Retour vers Suggestions

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 24 invité(s)