Differences

This shows you the differences between two versions of the page.

Link to this comparison view

fr:protocole_tcp [2016/01/13 20:28] (current)
Line 1: Line 1:
 +====== Protocole Client/Serveur ======
  
 +===== Introduction =====
 +
 +La centrale Calaos permet le contrôle et la récupération d'information de la maison au travers d'un protocole en ligne de commande simple par TCP/IP. La centrale permet les connections sur un port spécifique et peut être utilisé pour le débugage avec l'utilitaire Telnet. La centrale écoute sur le port 4456.
 +
 +Le protocole est relativement simple et chaque commande reçu par la centrale est renvoyé en retour. Si une réponse est attendu, elle sera ajouté à la requête. Le séparateur de fin de ligne est le retour chariot (<LF>, soit le caractère ASCII 10 ou 0x0A). Le serveur accèpte <LF>, <CR>, 0x00 ou n'importe quel combinaison des trois. Il répondra avec ce qui a été envoyé dans la requête. Pour les chaines de caractères, la centrale utilise l'encodage UTF-8 et les paramètres des requêtes sont encodés grâce au principe d'url encoding ([[http://en.wikipedia.org/wiki/Percent-encoding|Percent-encoding]])
 +
 +===== Format des commandes =====
 +
 +Le format des commandes, requêtes et réponses est le suivant:
 +
 +  <command> <param0> ... <paramN> <LF>
 +
 +<param0> à <paramN> sont les paramètres envoyés ou reçus.
 +
 +**Note:** Chaque paramètre doit être encodé suivant le procédé d'URL encoding ([[http://en.wikipedia.org/wiki/Percent-encoding|Percent-encoding]], les espaces sont remplacés par %20).
 +
 +===== Liste des commandes =====
 +
 +==== Commande de base ====
 +
 +=== Login ===
 +
 +  login <user> <password>
 +
 +La commande //login// permet de s'authentifier sur la centrale. Les paramètres //user// et //password// doivent être url-encodé comme pour n'importe quel paramètre. Si l'authentification réussi, le serveur renvoie "ok" à la place du mot de passe. Si elle échoue, le serveur se déconnecte.
 +
 +Exemples:
 +  Requête : "login theuser thepassword<LF>"
 +  Réponse : "login theuser ok<LF>"
 +
 +  Requête : "login theuser mauvaispassword<LF>"
 +  Réponse : fermeture de la connection
 +
 +=== Version ===
 +
 +  version
 +
 +Cette commande renvoie la version du serveur.
 +
 +Exemple:
 +  Requête : "version ?<LF>"
 +  Réponse : "version 1.23<LF>"
 +
 +=== Save ===
 +
 +  save <option>
 +
 +Cette commande sauvegarde la configuration dans la mémoire et/ou dans la compact flash.
 +
 +Exemple:
 +  Requête : "save default<LF>" Sauvegarde la configuration par defaut (chargé en cas de probleme avec la configuration courante)
 +  Réponse : "save ok<LF>"
 +  Requête : "save<LF>" Sauvegarde la configuration sur la compact flash
 +  Réponse : "save ok<LF>"
 +
 +=== System ===
 +
 +  system reboot <option>
 +
 +Cette commande permet d'arrêter calaosd, calaos_gui ou les 2 (all)
 +
 +Exemple:
 +  Requête : "system reboot calaosd"
 +  Requête : "system reboot calaos_gui"
 +  Requête : "system reboot all"
 +
 +=== System date ntp_on ===
 +
 +  system date ntp_on <timezone>
 +
 +Active le ntp et règle le fuseau horaire.
 +
 +Exemple:
 +    Requête : "system date ntp_on 4"
 +    Réponse : "system date ok"
 +
 +=== System date ntp_off ===
 +
 +  system date ntp_off <hh> <mm> <ss> <JJ> <MM> <YYYY>
 +
 +Désactive le ntp et règle l'heure.
 +hh: heures
 +mm: minutes
 +ss: secondes
 +
 +JJ: jour
 +MM: mois
 +YYYY: années
 +
 +Exemple:
 +    Requête : "system date ntp_off 0 12 34 46 4 2 9"
 +    Réponse : "system date ok"
 +
 +=== firmware ===
 +
 +  firmware <option>
 +
 +Cette commande permet de demander la mise à jour du firmware
 +
 +Exemple:
 +    Requête : "firmware webupdate"
 +
 +=== Listen ===
 +
 +  listen
 +
 +Cette commande mets la connexion en mode d'écoute. Le serveur va envoyer les différents évennements survenant dans le systeme sur toutes les connexions en mode listen. Une telle connexion ne pourra plus envoyer de commande.
 +
 +Exemple:
 +    Requête : "listen"
 +
 +=== Listen (polling) ===
 +
 +  poll_listen
 +
 +Cette commande similaire à listen permet d'interroger la centrale à intervalle régulière pour avoir les évènements survenant dans le systeme. Il faut tout d'abord créer un identifiant et ensuite utiliser cet identifiant pour récupérer les évènements. Après 5 min d'inactivité, un identifiant devient automatiquement invalide.
 +
 +Exemple:
 +    Requête : "poll_listen register"
 +    Réponse : "poll_listen 5716cb99-235c-4ac0-a99b-28d59659a9f4"
 +    
 +    Requête : "poll_listen get 5716cb99-235c-4ac0-a99b-28d59659a9f4"
 +    Réponse : "poll_listen get input%3Ainput_2%3Astate%3Aonsongchange output%3Aoutput_0%3Astate%3Atrue"
 +    
 +    Requête : "poll_listen unregister 5716cb99-235c-4ac0-a99b-28d59659a9f4"
 +    Réponse : "poll_listen unregister true"
 +
 +
 +==== Commandes des caméras ====
 +
 +=== camera ===
 +
 +  camera <param1> <paramN>
 +
 +La commande camera permet soit de récupérer le nombre de caméra disponible (argument "?"), soit de récupérer les informations (url du flux mjpeg, capture d'une image, nom, etc...) des caméras avec l'argument "get", soit encore d'effectuer des actions (Uniquement pour les caméras disposant de ces fonctionnalités) sur une caméra avec l'argument "action".
 +
 +Exemple:
 +    Requête : "camera ?<LF>"
 +    Réponse : "camera 2<LF>" 2 caméras disponibles
 +    Requête : "camera get 0<LF>"
 +    Réponse : "camera 0 id:cam0 name:Caméra1 url:!http://10.0.0.1:80 mjpeg_url:!http://10.0.0.1:80/mjpeg.cgi mpeg_url:!http://10.0.0.1:80/mpeg4.cgi jpeg_url:!http://10.0.0.1:80/picture.cgi ptz:false<LF>"
 +
 +Uniquement pour les modèles PTZ (motorisé):
 +    Requête : "camera move 0 left<LF> bouge la camera a gauche (left, right, up, down, home)"
 +    Réponse : "camera move 0 ok<LF>"
 +    Requête : "camera save 0 5<LF> sauvegarde la position de la camera à l'emplacement 5 (emplacement de 1 à 16)"
 +    Réponse : "camera save 0 ok<LF>"
 +    Requête : "camera move 0 5<LF> bouge la camera a la position sauvegardé en 5"
 +    Réponse : "camera move 0 ok<LF>"
 +
 +Gestion des propriété des cameras:
 +    Requête : "camera capabilities 0 get<LF>"
 +    Réponse : "camera capabilities 0 ptz:true resolution:640x480 led:true contrast:255<LF>"
 +    Requête : "camera capabilities 0 set contrast:100 led:false<LF>" mets le contraste a 100 et eteint les leds
 +    Réponse : "camera capabilities 0 set ok<LF>"
 +
 +Notes: Les propriétés renvoyés par camera get peuvent varier suivant le type de caméras.
 +
 +==== Commandes de la maison ====
 +
 +=== home ===
 +
 +  home <param1> <paramN>
 +
 +La commande home, avec l'argument "?", sert à récupérer les types de pièces définit dans la maison. Avec l'argument "get", on peut récupérer les informations d'un type de pièce. Par ex, pour récupérer tous les salons de la maison, on utilisera les paramètres "get salon". Pour obtenir tous les types disponibles, il faut utiliser "get ?".
 +
 +Notes: L'ordre des pièces dans les réponses respecte l'ordre du fichier [wiki:StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "home ?<LF>"
 +    Réponse : "home salon:2 cuisine:1 sdb:1 chambre:2 chambre_parent:1<LF>" Dans cette configuration, nous avons 2 salons, 1 cuisine, etc...
 +    Requête : "home get salon<LF>"
 +    Réponse : "home count:2 0:name:Salon1 0:hits:152 1:name:Salon2 1:hits:59<LF>" Récupération des salons (noms, plus nombre de [wiki:hits Hits])
 +
 +=== room ===
 +
 +  room <type>
 +
 +La commande room permet de récupérer les différentes entrées/sorties d'une pièce de type <type>
 +
 +Exemple:
 +    Requête : "room salon ?<LF>"
 +    Réponse : "room salon:2<LF>" 2 salons disponibles
 +    Requête : "room salon get 0<LF>" demande les infos du salon 0
 +    Réponse : "room salon:0 name:salon1 hits:99 input:in1 input:in2 output:out1 input:in45 output:lum01 input:scenario23<LF>"
 +    Requête : "room salon delete 0<LF>"
 +    Réponse : "room salon delete ok<LF>" Le salon a été supprimé
 +
 +=== room get ===
 +
 +  room get <id>
 +
 +La commande room get permet de récupérer les différentes entrées/sorties d'une pièce
 +
 +Notes: id respecte l'ordre des pièces du fichier [wiki:StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "room get 0<LF>"
 +    Réponse : "room id:0 input:in1 input:in2 output:out1 input:in45 output:lum01 input:scenario23<LF>"
 +
 +=== room get ===
 +
 +  room <type> get <nom>
 +
 +Cette commande permet de récupérer les informations concernant la pièce de nom "nom".
 +
 +Exemple:
 +    Requête : "room chambre get chambre_parent"
 +    Réponse : "room id:0 input:in1 input:in2 output:out1 input:in45 output:lum01 input:scenario23<LF>"
 +
 +=== room set ===
 +
 +  room <type> set <id> <type> <nouvelle_valeur>
 +
 +La commande room set permet de modifier une variable d'un enregistrement room.
 +
 +Notes: id respecte l'ordre des pièces du fichier [wiki:StructureXML io.xml]
 +
 +Exemple:
 +    Requête : "room salon set 0 name Chambre3<LF>"
 +    Réponse : "room salon set 0 name ok<LF>" le nom a été changé
 +    Requête : "room salon set 0 type chambre<LF>"
 +    Réponse : "room salon set 0 type ok<LF>" le type a été changé en chambre
 +    Requête : "room chambre set 0 hits 56<LF>"
 +    Réponse : "room chambre set 0 hits ok<LF>"
 +    Requête : "room add chambre Chambre1<LF>"
 +    Réponse : "room add ok<LF>"
 +
 +=== room create ===
 +
 +  room <type> <id> create <io_type> <param1>...<paramN>
 +
 +La commande room <type> <id> create permet de créer une entrée/sortie dans une pièce.
 +
 +Exemple:
 +    Requête : "room salon 0 create input type:WIDigitalTriple name:Inter1 host:10.0.0.123 port:502<LF>"
 +    Réponse : "room salon 0 create ok<LF>" l'interrupteur a été crée
 +    Requête : "room salon 0 create camera name:Camera1 host:10.0.0.5<LF>"
 +    Réponse : "room salon 0 create ok<LF>"
 +
 +=== input ===
 +
 +  input <id> <action>
 +
 +Permet de récuperer les informations d'une entrée, ou de forcer une entrée (pour activer un scénario par exemple)
 +
 +Exemple:
 +    Requête : "input id1 get<LF>"
 +    Réponse : "input id:id1 name:Entree1 type:scenario<LF>"
 +    Requête : "input id1 set true<LF>"
 +    Réponse : "input id1 set ok"
 +    Requête : "input id1 state?<LF>"
 +    Réponse : "input id1 123"
 +    Requête : "input id1 states?<LF>"
 +    Réponse : "input id1 default:123 power:true statusN:valueN"
 +    Requête : "input id1 delete<LF>"
 +    Réponse : "input id1 ok"
 +    Requête : "input id1 query input_source ?<LF>" Envoie une demande d'infos complémentaire (uniquement pour certaines entrées et paramètre renvoyant une liste d'items)
 +    Réponse : "input id1 query input_source 0:Test 2:Param2"
 +    Requête : "input id1 params?<LF>" Permet de récupérer les paramètres avancés
 +    Réponse : "input name:truc id:id1 var:3 ip:192.168.0.4"
 +    Requête : "input id1 set_param name bidule<LF>"
 +    Réponse : "input id1 set_name name ok"
 +    Requête : "input id1 delete_param name<LF>"
 +    Réponse : "input id1 delete_param ok"
 +    Requête : "input plage1 plage get<LF> à utiliser uniquement pour les entrées de type InPlageHoraire"
 +    Réponse : "input plage1 1:13:00:00:0:1:15:00:00:0:1 1:17:00:00:0:1:17:30:00:0:1 2:13:00:00:1:1:15:00:00:0:1<LF>" 1..7 représente le jour de la semaine suivit de la plage
 +    Requête : "input plage1 plage set 1:12:00:00:0:1:14:00:00:0:1<LF>" à utiliser uniquement pour les entrées de type InPlageHoraire
 +    Réponse : "input plage1 plage set ok<LF>"
 +    Requête : "input plage1 plage months get<LF>"
 +    Réponse : "input plage1 plage months 111010011000<LF>"
 +    Requête : "input plage1 plage months set 000000111111<LF>"
 +    Réponse : "input plage1 plage months set ok<LF>"
 +    Requête : "input list<LF>" Retourne une liste de toutes les entrées disponibles
 +    Réponse : "input id2 in3 scenar4<LF>"
 +
 +=== output ===
 +
 +  ouput <id> <action>
 +
 +Permet de récuperer les informations d'une sortie, ou de forcer une sortie (pour activer/désactiver une lumière par exemple)
 +
 +Exemple:
 +    Requête : "output id1 get<LF>"
 +    Réponse : "output id:id1 name:Sortie1 type:WODigital gtype:light state:true<LF>"
 +    Requête : "output id1 set true<LF>"
 +    Réponse : "output id1 set ok"
 +    Requête : "output id1 state?<LF>"
 +    Réponse : "output id1 true"
 +    Requête : "output id1 delete<LF>"
 +    Réponse : "output id1 ok"
 +    Requête : "input id1 query input_source ?<LF>" Envoie une demande d'infos complémentaire (uniquement pour certaines entrées et paramètre renvoyant une liste d'items)
 +    Réponse : "input id1 query input_source 0:Test 2:Param2"
 +    Requête : "output id1 params?<LF>" Permet de récupérer les paramètres avancés
 +    Réponse : "output name:truc id:id1 var:3 ip:192.168.0.4"
 +    Requête : "output id1 set_param name bidule<LF>"
 +    Réponse : "output id1 set_name name ok"
 +    Requête : "output id1 delete_param name<LF>"
 +    Réponse : "output id1 delete_param ok"
 +    Requête : "output list<LF>" Retourne une liste de toutes les sorties disponibles
 +    Réponse : "output volet1 tr1 lum2<LF>"
 +
 +==== Commandes des règles ====
 +
 +=== rules ===
 +
 +  rules <type:name> <action> <param0> ... <paramN>
 +
 +Permet de gérer les règles.
 +
 +Exemple:
 +    Requête : "rules ?<LF>"
 +    Réponse : "rules light:2 volet:5<LF>"Il y a 2 catégories de règles
 +    Requête : "rules light get 0 condition<LF>"
 +    Réponse : "rules type:light name:Lumiere1 0:id:id1 0:oper:== 0:val:true 0:var_val:id3<LF>"
 +    Requête : "rules light get 0 action<LF>"
 +    Réponse : "rules type:light name:Lumiere1 0:id:id2 0:val:true 1:id:id3 1:val:false<LF>"
 +    Requête : "rules light set 0 condition 0 id:id6 oper:!= val:false var_val:<LF>"
 +    Réponse : "rules light set 0 condition 0 ok<LF>"
 +    Requête : "rules light set 0 action 0 id:id8 val:false<LF>"
 +    Réponse : "rules light set 0 action 0 ok<LF>"
 +    Requête : "rules light delete 0 condition 0<LF>"
 +    Réponse : "rules light delete 0 condition 0 ok<LF>"
 +    Requête : "rules light delete 0 action 0<LF>"
 +    Réponse : "rules light delete 0 action 0 ok<LF>"
 +    Requête : "rules light delete 0<LF>"
 +    Réponse : "rules light delete ok<LF>"
 +    Requête : "rules add light Regle 0:iid:id2 0:ioper:true 0:ival:true 0:ivar_val:true 0:oid:id3 1:oval:false<LF>"
 +    Réponse : "rules add ok<LF>"
 +    Requête : "rules light add 0 condition id:id2 oper:true val:true var_val:true<LF>"
 +    Réponse : "rules light add ok<LF>"
 +    Requête : "rules light add 0 action id:id2 val:true<LF>"
 +    Réponse : "rules light add ok<LF>"
 +
 +==== Commandes des zones de musique ====
 +
 +=== audio ===
 +
 +  audio <param1> <paramN>
 +
 +La commande audio permet de gérer les lecteurs de musiques.
 +
 +Exemple:
 +    Requête : "audio ?<LF>"
 +    Réponse : "audio 2<LF>" 2 lecteurs audios disponibles
 +    Requête : "audio get 0<LF>"
 +    Réponse : "audio 0 id:audio0 name:Lecteur%20Salon playlist:true database:true<LF>" On est capable de gerer la playlist du lecteur et on a également accès a sa base de donnée de musiques.
 +
 +    Requête : "audio 0 play<LF> lance la lecture
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 pause<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 stop<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 next<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 previous<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 off<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 on<LF>
 +    Réponse : "audio 0 ok<LF>"
 +    Requête : "audio 0 volume?<LF>
 +    Réponse : "audio 0 volume:75<LF>"
 +    Requête : "audio 0 volume 80<LF>
 +    Réponse : "audio 0 volume ok<LF>"
 +    Requête : "audio 0 songinfo?<LF>
 +    Réponse : "audio 0 title:Some%20Title artist:Some%20Artist album:Some%20Album cover:true Genre:Rock duration:10.5566 bitrate:192Kbps type:mp3<LF>"
 +    Requête : "audio 0 cover?<LF>
 +    Réponse : "audio 0 cover:http://host/cover.jpg<LF>"
 +    Requête : "audio 0 cover 456<LF>
 +    Réponse : "audio 0 cover http://host/cover.jpg<LF>"
 +    Requête : "audio 0 time?<LF>
 +    Réponse : "audio 0 time:5.12233<LF>"
 +    Requête : "audio 0 time 15.65<LF>
 +    Réponse : "audio 0 time ok<LF>"
 +    Requête : "audio 0 status?<LF>
 +    Réponse : "audio 0 status:playing<LF>"
 +    Requête : "audio stop all<LF>" arrête toutes les lectures en cours
 +    Réponse : "audio stop ok<LF>"
 +
 +Commandes pour la playlist:
 +    Requête : "audio 0 playlist size?<LF>
 +    Réponse : "audio 0 playlist 25<LF>"
 +    Requête : "audio 0 playlist current?<LF>
 +    Réponse : "audio 0 playlist 5<LF>" La piste courrante est la 5
 +    Requête : "audio 0 playlist 13 getitem?<LF>
 +    Réponse : "audio 0 playlist item:13 title:Some%20Title artist:Some%20Artist album:Some%20Album cover:true Genre:Rock duration:10.5566 bitrate:192Kbps type:mp3<LF>"
 +    Requête : "audio 0 playlist 13 cover?<LF>
 +    Réponse : "audio 0 playlist 13 cover:http://host/cover.jpg<LF>"
 +    Requête : "audio 0 playlist 13 moveup<LF>
 +    Réponse : "audio 0 playlist 13 ok<LF>"
 +    Requête : "audio 0 playlist 13 movedown<LF>
 +    Réponse : "audio 0 playlist 13 ok<LF>"
 +    Requête : "audio 0 playlist 13 delete<LF>
 +    Réponse : "audio 0 playlist 13 ok<LF>"
 +    Requête : "audio 0 playlist 13 play<LF>
 +    Réponse : "audio 0 playlist 13 ok<LF>"
 +    Requête : "audio 0 playlist clear<LF>
 +    Réponse : "audio 0 playlist ok<LF>"
 +    Requête : "audio 0 playlist save Ma_Playlist<LF>
 +    Réponse : "audio 0 playlist save ok<LF>"
 +    Requête : "audio 0 playlist add track_id:123<LF> Peut etre track_id, album_id, artist_id, genre_id, year, playlist_id, folder_id, radio_id
 +    Réponse : "audio 0 playlist add ok<LF>"
 +    Requête : "audio 0 playlist play track_id:123<LF>
 +    Réponse : "audio 0 playlist play ok<LF>"
 +
 +Notes:
 +  Pour radio_id, il faut passer le type de radio: radio_id:123:shoutcast
 +
 +    Requête : "audio 0 options?<LF>
 +    Réponse : "audio 0 options sync:true sleep:true<LF>"
 +    Requête : "audio 0 options sync?<LF>
 +    Réponse : "audio 0 options sync id:123123 name:Lecteur1<LF>"
 +    Requête : "audio 0 options sync list?<LF>
 +    Réponse : "audio 0 options sync id:123123 name:Lecteur1 id:456456 name:Lecteur2<LF>"
 +    Requête : "audio 0 options sync id:123123<LF>
 +    Réponse : "audio 0 options sync ok<LF>"
 +    Requête : "audio 0 options sync off<LF>
 +    Réponse : "audio 0 options sync ok<LF>"
 +    Requête : "audio 0 options sleep?<LF>
 +    Réponse : "audio 0 options sleep:45<LF>"
 +    Requête : "audio 0 options sleep:60<LF>
 +    Réponse : "audio 0 options sleep ok<LF>"
 +
 +Commandes pour la librairie de musique:
 +    Requête : "audio 0 database capabilities?<LF>
 +    Réponse : "audio 0 database artist:true album:true genre:false year:false music%20folder:true playlist:true radio:false search:true<LF>"
 +    Requête : "audio 0 database stats?<LF>
 +    Réponse : "audio 0 database artists:563 albums:2033 genres:53 years:123 music%20folder:4456 playlists:13 radios:5<LF>"
 +
 +  Les requetes de base de donnée se présente sous cette forme:
 +    audio <id> database <type de requete> <from> <nb max de reponse> [paramètres optionnels]
 +
 +    Requête : "audio 0 database albums 0 2<LF>renvoie la liste d'albums
 +    Réponse : "audio 0 database albums id:563 year:1999 name:Album%20machin artist:Artiste%20machin cover_id:4456 id:123 year:2000 name:Album%20machin2 artist:Artiste%20machin2 cover_id:66445<LF>"
 +    Requête : "audio 0 database album_titles 0 1 album_id:123<LF>renvoie la liste de piste d'un album
 +    Réponse : "audio 0 database album_titles id:563 title:Titre year:2000 artist:Artiste album:Album genre:Genre cover_id:4456 duration:1233 type:mp3 bitrate:128<LF>"
 +
 +    Requête : "audio 0 database artists 0 2<LF>renvoie la liste d'artistes
 +    Réponse : "audio 0 database artists id:563 name:Artiste id:123 name:Artiste2<LF>"
 +    Requête : "audio 0 database artist_albums 0 1 artist_id:123<LF>renvoie la liste d'album d'un artiste
 +    Réponse : "audio 0 database artist_albums id:563 name:Nom year:2000 artist:Artiste cover_id:4456<LF>"
 +
 +    Requête : "audio 0 database genres 0 2<LF>renvoie la liste de genres
 +    Réponse : "audio 0 database genres id:563 name:Rock id:123 name:Valse<LF>"
 +    Requête : "audio 0 database genre_artists 0 1 genre_id:123<LF>renvoie la liste d'artiste d'un certain genre
 +    Réponse : "audio 0 database genre_artists id:563 name:Nom<LF>"
 +
 +    Requête : "audio 0 database years 0 2<LF> renvoie la liste d'années
 +    Réponse : "audio 0 database years year:1960 year:2000<LF>"
 +    Requête : "audio 0 database year_albums 0 1 year:2000<LF> renvoie la liste d'albums d'une certaine année
 +    Réponse : "audio 0 database year_albums id:563 name:Nom year:2000 artist:Artiste cover_id:4456<LF>"
 +
 +    Requête : "audio 0 database playlists 0 2<LF>renvoie la liste de playlists
 +    Réponse : "audio 0 database playlists id:123 name:playlist1 id:234 name:playlist2<LF>"
 +    Requête : "audio 0 database playlist_titles 0 1 playlist_id:123<LF>renvoie la liste de piste d'une playlist
 +    Réponse : "audio 0 database playlist_titles id:563 title:Titre year:2000 artist:Artiste album:Album genre:Genre cover_id:4456 duration:1233 type:mp3 bitrate:128<LF>"
 +    Requête : "audio 0 database playlist delete playlist_id:123<LF>supprime une playlist
 +
 +    Requête : "audio 0 database radios 0 2<LF>renvoie la liste de radios
 +    Réponse : "audio 0 database radios id:shoutcast name:ShoutCAST id:radioio name:RadioIO<LF>"
 +    Requête : "audio 0 database radio_items 0 2 radio_id:shoutcast<LF> renvoie la liste d'item pour un certaine radio
 +    Réponse : "audio 0 database radio_items id:563 name:NomRadio isaudio:1 id:5634 name:NomRadio2 isaudio:0<LF>"
 +    Requête : "audio 0 database radio_items 0 1 radio_id:shoutcast item_id:5634<LF> renvoie la liste d'item pour un certaine radio et un sous item
 +    Réponse : "audio 0 database radio_items id:5634.1 name:NomRadioSousItem isaudio:1<LF>"
 +    Requête : "audio 0 database radio_items 0 1 radio_id:shoutcast item_id:5634 search:Nirvana<LF> renvoie la liste d'item pour un certaine radio et un sous item, inclut aussi une recherche
 +    Réponse : "audio 0 database radio_items id:5634.1 name:NomRadioSousItem isaudio:1<LF>"
 +
 +    Requête : "audio 0 database randoms 0 100<LF>renvoie la liste de type de random disponible
 +    Réponse : "audio 0 database randoms id:tracks name:RandomTracks id:albums name:RandomAlbums id:artists name:RandomArtists id:years name:RandomYears<LF>"
 +    Requête : "audio 0 random random_id:tracks<LF> active le mode de random sélectionné
 +    Réponse : "audio 0 random ok<LF>"
 +
 +    Requête : "audio 0 database search 0 2 search_terms:quelquechose<LF> renvoie la reponse a une recherche
 +    Réponse : "audio 0 database search id:123 type:album name:quelquechose id:234 type:track track_id:563 title:Titre year:2000 artist:Artiste album:Album genre:Genre cover_id:4456 duration:1233 type:mp3 bitrate:128<LF>"
 +
 +    Requête : "audio 0 database music_folder 0 2<LF> renvoie la liste du dossier racine
 +    Réponse : "audio 0 database music_folder id:1.1 type:folder name:Dossier id:1.3 type:track track_id:563 title:Titre year:2000 artist:Artiste album:Album genre:Genre cover_id:4456 duration:1233 type:mp3 bitrate:128<LF>"
 +    Requête : "audio 0 database music_folder 0 2 folder_id:1.1<LF> renvoie la liste d'un sous dossier
 +    Réponse : "audio 0 database music_folder id:2.1 type:folder name:Dossier id:2.3 type:track track_id:563 title:Titre year:2000 artist:Artiste album:Album genre:Genre cover_id:4456 duration:1233 type:mp3 bitrate:128<LF>"