JossAlf Posté(e) le 21 mai 2014 Signaler Posté(e) le 21 mai 2014 (modifié) Je souhaitais me simplifier la vie et pouvoir confirmer un ordre par TTS sur mes squeezebox (ex l'allumage du fer à repasser depuis le second alors qu'il est au sous-sol).J'en ai 5 (Cuisine, Salon, Garage, Chambre du Haut et Chambre du Bas).J'ai donc fait un module virtuel "EmissionSqueeze" qui me permet d'émettre une phrase depuis n'importe qu'elle scène (ou bouton) en 5 lignes ! Voici le code qui vous permettra d'appeler ce module virtuel en 4 ligne depuis n'importe où : -- Faire un copier/coller de ce code dans le bouton -- depuis lequel on souhaite diffuser un message -- Le niveau sonore est attribué à chaque squeeze individuellement -- à la suite du nom avec comme valeur de 01 à 99 (pas 100 ! on doit rester sur 2 chiffres) -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Liste des squeezes sous la forme {"Cuisine30","Garage80","Salon60","ChambreH30","ChambreB50"} local ListeSqueeze = {"Cuisine55","Garage99","Salon60","ChambreH30","ChambreB30"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) -- Taper le message fibaro:setGlobal('Messager' , "Ouverture du portail") fibaro:call(144, "pressButton", "1"); -- fin annonce Squeezebox Voici le code principal du bouton 1 du module virtuel 144 : -- JossAlf ; 02/07/14 (V2.1) 21/06/14 (V2.0) 17/06/14 (V1.3) ; 22/05/14 (V1.1) ; 23/05/14 (V1.2) -- V2.1 : Ajout du réglage individuel duniveau sonore pour chaque squeeze en ajoutant 2 chiffre après le nom -- V2.0 : Simplification du code et possibilité d'allumer 1,2,3,4 ou 5 squeeze. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : SqueezeNom ; Messager -- (Ne pas utiliser dans une scène le json bug) -- l'appel de module virtuel se fera dans un autre module virtuel de façon simple -- en affectant les valeurs aux variables Globales -- puis en simulant le clic sur un bouton : exemple -> fibaro:call(144, "pressButton", "1"); local ListeSqueeze = fibaro:getGlobal("SqueezeNom"); local TableauSqueezeNom = json.decode(ListeSqueeze); local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:xx:xx:xx:00 ", ['Salon'] = "00:04:xx:xx:xx:3e ", ['ChambreB'] = "00:04:xx:xx:xx:fe ", ['ChambreH'] = "00:04:xx:xx:xx:ba ", ['Garage'] = "00:04:xx:xx:xx:bc ", } --On allume toutes les squeezes for i = 1, #TableauSqueezeNom do --on récupère uniquement le nom en retirant les 2 derniers caractères qui correspondent au niveau sonore local player = string.sub(TableauSqueezeNom[i], 1 , -3) fibaro:debug(player) local player = Squeezers[player] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on règle le son -- on prend que les 2 dernier caractères qui correspondent au niveau sonore. local VolumeSon = string.sub(TableauSqueezeNom[i], -2) local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) -- On envoie le message en utilisant la première radio local player = string.sub(TableauSqueezeNom[1], 1 , -3) local player = Squeezers[player] local notification = fibaro:getGlobalValue('Messager') -- On remplace les espaces par des %20 local notification = string.gsub((notification)," ", "%%20"); fibaro:debug(notification) -- Attention google ne fonctionne plus il vaut mieux utiliser VoiceRSS pour le TTS -- local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. notification; -- Voicerss TTS local cmnd = "playlist play http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src=" .. notification; local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(20*1000) -- on éteint les squeezes for i = 1, #TableauSqueezeNom do fibaro:debug("debut de la boucle") local player = string.sub(TableauSqueezeNom[i], 1 , -3) local player = Squeezers[player] local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end MAJ : Simplification du code avec une boucle et le passage des "paramètres" sous forme de variable traduite en tableau en passant par un json. On peux maintenant choisir d'émettre sur une ou plusieurs radio en les nommants.Attention à bien renseigner le nom de votre squeeze avec le niveau sonore collé (exemple "Cuisine80") si non ... Pour la diffusion d'un message/fichier MP3, se référer au message 20 de ce sujet.PS : Merci à Steven pour le coup du Json (pour obtenir un tableau) et pour Shad et la boucle "for". MAJ2 : Evolution du code afin de choisir individuellement le niveau sonore des squeezer. MAJ3 : Google ne fonctionne plus en lien directe (à la ligne 62) Je l'ai remplacé par VoiceRSS (ligne 65) qui fait très bien le travail http://www.voicerss.org/controls/speech.ashx?hl=fr-fr&src= J'en parle ici : #80 Modifié le 18 avril 2016 par JossAlf 4
cedriclocqueneux Posté(e) le 22 mai 2014 Signaler Posté(e) le 22 mai 2014 Génial ! Exactement ce que je voulais faire ! Bo, faut que je me dépêche de terminer l'installation de mes Squeezebox
JossAlf Posté(e) le 22 mai 2014 Auteur Signaler Posté(e) le 22 mai 2014 Merci Cédric. Envoyé de mon iPhone àl'aide de Tapatalk
JossAlf Posté(e) le 23 mai 2014 Auteur Signaler Posté(e) le 23 mai 2014 Amélioration du code dans le message 1 : • Suppression des if then end au profit d'une table dictionnaire ligne 18 (Merci Steven) • Suppression d'une variable globale "Player" inutile • Ajout de debug pour comprendre le déroulement du programme et vérifier vos réglages
JossAlf Posté(e) le 23 mai 2014 Auteur Signaler Posté(e) le 23 mai 2014 Ajout du fichier oublié avec la mise à jour
JossAlf Posté(e) le 29 mai 2014 Auteur Signaler Posté(e) le 29 mai 2014 Up pour oufman Ne pas oublier de créer les 3 variables globales dans le panneau variables : NivSonore SqueezeNom Messager
PITP2 Posté(e) le 17 juin 2014 Signaler Posté(e) le 17 juin 2014 Bonjour, j'ai mis en oeuvre le script pour faire dire la température de mes pièces. Je bute sur le point .. par exemple pour faire dire 24.3 Degrés en 24 virgule 3 degrés il faut que je transforme le point en virgule j'ai essayé ceci mais cela ne donne rien local notification = string.gsub((notification),".", "virgule");
BenjyNet Posté(e) le 18 juin 2014 Signaler Posté(e) le 18 juin 2014 Et si tu mettais un espace avant et apres le mot virgule, genre " virgule " ?
PITP2 Posté(e) le 18 juin 2014 Signaler Posté(e) le 18 juin 2014 En fait la ptetite dame dit 4 fois Virgule ......
JossAlf Posté(e) le 18 juin 2014 Auteur Signaler Posté(e) le 18 juin 2014 Peux-tu placer un debug avant et après ta ligne pour afficher les contenus du "notification" (et les copier coller ici) ?
JossAlf Posté(e) le 21 juin 2014 Auteur Signaler Posté(e) le 21 juin 2014 Mise à jour du code. Voir message 1.
Bouliboule Posté(e) le 22 juin 2014 Signaler Posté(e) le 22 juin 2014 Salut Jossalf, Merci pour ton tuto mais j'ai quelque soucis pour faire fonctionner le tout. Quand tu parles des variables globales, pourrais tu me faire un screenshot de ton panneau de variables ? D'avance une grand merci
JossAlf Posté(e) le 22 juin 2014 Auteur Signaler Posté(e) le 22 juin 2014 Alors attention le fichier n'était pas bon. Fais un copier/coller du code présent à l'écran en message 1. Pour la variables globales (Tu les laisse à 0 quand tu le crées) c'est par exemple celle à la ligne 9 (les autres est trop basses pour les prendre dans la copie d'écran) : [/url]
Bouliboule Posté(e) le 23 juin 2014 Signaler Posté(e) le 23 juin 2014 Hello merci pour ta réponse je vais essayer ce soir.... Merci encore
Bouliboule Posté(e) le 23 juin 2014 Signaler Posté(e) le 23 juin 2014 Bon j'ai essayé mais lorsque je lance la scène il me fait une erreur sur cette ligne : error : attempt to index 'jason' (a nil value) Merci pour votre aide
JossAlf Posté(e) le 23 juin 2014 Auteur Signaler Posté(e) le 23 juin 2014 Tu as créé un module virtuel ? Car avec une scène il y a un bug sur la HC2 et le Json apparemment. Tu places donc ce qui suit dans un module virtuel (pas dans une scène) : -- Faire un copier/coller de ce code dans le bouton d'un module virtuel (attention bug si utilisé depuis une scène) -- depuis lequel on souhaite diffuser un message -- NivSonore -> de 1 à 100 -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> Texte pour la TTS (inutile de mettre des %20) --Annonce sur la Squeezebox ... fibaro:setGlobal('NivSonore' , 60) --Liste des squeezes sous la forme {"Cuisine","Garage","Salon"} local ListeSqueeze = {"Cuisine","Garage","Salon","ChambreH","ChambreB"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) -- Taper le message fibaro:setGlobal('Messager' , "Ouverture du portail") fibaro:call(123, "pressButton", "1"); -- fin annonce Squeezebox
JossAlf Posté(e) le 23 juin 2014 Auteur Signaler Posté(e) le 23 juin 2014 error : attempt to index 'jason' (a nil value) Au cas où -> On est d'accord c'est json et pas "jason"
Bouliboule Posté(e) le 23 juin 2014 Signaler Posté(e) le 23 juin 2014 hello oui c'est bien json, Je teste ce soir car je peux pas entendre ma squeeze depuis mon boulot
Bouliboule Posté(e) le 23 juin 2014 Signaler Posté(e) le 23 juin 2014 Ca marche tip top ! je te remercie !
JossAlf Posté(e) le 23 juin 2014 Auteur Signaler Posté(e) le 23 juin 2014 Et si tu veux jouer un MP3 enregistré sur ton NAS ou un disque réseau (c'est à la ligne 53 de cette copie du code que ça change) : -- JossAlf ; 21/06/14 (V2.0) 17/06/14 (V1.3) ; 22/05/14 (V1.1) ; 23/05/14 (V1.2) -- V2.0 : Simplification du code et possibilité d'allumer 1,2,3,4 ou 5 squeeze. -- Scène permettant simplifier la diffusion de messages sur 1 ou plusieurs squeezeboxes. -- Nécessite de créer les Variables Globales : NivSonore ; SqueezeNom ; Messager -- l'appel de cette scene dans un module virtuel ou une autre scène se fera de façon simple -- en affectant les valeurs aux variables Globales -- puis en lancant cette scène. local ListeSqueeze = fibaro:getGlobal("SqueezeNom"); local TableauSqueezeNom = json.decode(ListeSqueeze); local player = nil -- Adresse IP du Logitech Media Server local ipadd = "192.168.0.46" -- le port du serveur local portno = 9090 local Squeezers = { ['Cuisine'] = "00:04:XX:XX:XX ", ['Salon'] = "00:04:XX::xx:xx ", ['ChambreB'] = "00:04:xx:xx:xx ", ['ChambreH'] = "00:04:xx:xx:xx ", ['Garage'] = "00:04:xx:xx:xx ", ['Toutes'] = "00:04:xx:xx:xx ", --permet d'utiliser la squeeze de la cuisine en maitre } --On allume toutes les squeezes for i = 1, #TableauSqueezeNom do local player = Squeezers[TableauSqueezeNom[i]] local cmnd = "power 1 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- on règle le son local VolumeSon = fibaro:getGlobalValue('NivSonore') local cmnd = "mixer volume " .. VolumeSon .. " " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end -- on laisse une seconde pour laisser le temps à toutes les squeeze de s'allumer fibaro:sleep(1000) -- On envoie le message local player = Squeezers[TableauSqueezeNom[1]] fibaro:debug(player) local notification = fibaro:getGlobalValue('Messager') fibaro:debug(notification) local cmnd = "playlist play /volume1/music/Itunes/%20Sons/" .. notification; fibaro:debug(cmnd) local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) -- OFF des squeezeBoxs après 10 secondes fibaro:sleep(10*1000) -- on éteint toutes les squeezes for i = 1, #TableauSqueezeNom do fibaro:debug("debut de la boucle") local player = Squeezers[TableauSqueezeNom[i]] fibaro:debug(player) local cmnd = "power 0 " local stringtosend = player .. cmnd .. string.char(10) tcpSocket = Net.FTcpSocket(ipadd, portno) tcpSocket:setReadTimeout(2*1000) bytes, errorCode = tcpSocket:write(stringtosend) end Avec le petit code d'appel : -- Faire un copier/coller de ce code dans le bouton ou la scène -- depuis lequel on souhaite diffuser un message -- NivSonore -> de 1 à 100 -- SqueezeNom -> Cuisine ; Salon ; ChambreB ; ChambreH ; Garage -- Attention à ne pas se tromper sur l'orthographe des Squeezes !!! -- Messager -> nom des fichiers MP3 ou m4a sur la NAS dans /volume1/music/Itunes/%20Sons/ -- Atable.m4a , Atable5Min , annonceiphone1.pm3 --Annonce sur la Squeezebox ... fibaro:setGlobal('NivSonore' , 70) -- Taper le message "Atable.m4a" ou "Atable5Min.m4a" ou "annonceiphone1.pm3" local ListeSqueeze = {"Cuisine"} fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze)) -- Taper le message "Atable.m4a" ou "Atable5Min" ou "annonceiphone1.pm3" fibaro:setGlobal('Messager' , "leo.m4a") fibaro:call(123, "pressButton", "3"); -- fin annonce Squeezebox
Bouliboule Posté(e) le 23 juin 2014 Signaler Posté(e) le 23 juin 2014 Top je vais regarder ça mais par contre comment fait-on pour connaître l'id d'un bouton de virtual device (C'est pour cela que j'avais des soucis avant...)
JossAlf Posté(e) le 23 juin 2014 Auteur Signaler Posté(e) le 23 juin 2014 Tu te mets sur le module virtuel et tu regardes dans l'adresse (c'est le dernier chiffre).
Bouliboule Posté(e) le 24 juin 2014 Signaler Posté(e) le 24 juin 2014 Merci Jossalf mais je me suis mal exprimé, je cherche l'id du bouton du virtual device en lui même, pas du virtual device lui même. Bonne journée
JossAlf Posté(e) le 24 juin 2014 Auteur Signaler Posté(e) le 24 juin 2014 Ha ! Ben là je les comptes visuellement ... J'ai pas trouvé d'autre solution... Attention : les labels compte comme un bouton ! Dans la copie d'écran qui suit, le bouton "Vacances" "Eté" est le numéro 8 alors que c'est le 6 ème vrai bouton ?! Il faut considérer sa place label compris. Attention aussi dans l'avenir, car si tu effaces, ajoutes ou déplaces un bouton ou un label, ça changera son ID (puisque c'est sa place son ID) ! [ 2
Moicphil Posté(e) le 24 juin 2014 Signaler Posté(e) le 24 juin 2014 Dans la copie d'écran qui suit, le bouton "Vacances" est le numéro 8 alors que c'est le 6 ème vrai bouton ?! I Tu voulais dire "été" je pense... Sinon, je vais vous donner la manière la plus simple et plus sur... Si je part de ce module : Et que je souhaite connaitre le numéro du bouton "reset appels"... ben, tout simple...un clic droit sur le bouton puis sélectionner "inspecter l"élément"...ensuite une fenêtre s'ouvre et on retrouve plein de chose comme l'id du module mais aussi le numéro du bouton, ici, le " 14 "
Messages recommandés