Aller au contenu
JossAlf

Emission Simplifiée Sur Squeezebox Tts Ou Mp3

Recommended Posts

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é par JossAlf
  • Upvote 4

Partager ce message


Lien à poster
Partager sur d’autres sites

Génial ! Exactement ce que je voulais faire ! Bo, faut que je me dépêche de terminer l'installation de mes Squeezebox :P

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Cédric.

Envoyé de mon iPhone àl'aide de Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites
 

Ajout du fichier oublié avec la mise à  jour :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Up pour oufman ;)

Ne pas oublier de créer les 3 variables globales dans le panneau variables :

NivSonore

SqueezeNom

Messager

Partager ce message


Lien à poster
Partager sur d’autres sites

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"); 

Partager ce message


Lien à poster
Partager sur d’autres sites

Et si tu mettais un espace avant et apres le mot virgule, genre " virgule " ?

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait la ptetite dame dit 4 fois Virgule ......

Partager ce message


Lien à poster
Partager sur d’autres sites

Peux-tu placer un debug avant et après ta ligne pour afficher les contenus du "notification" (et les copier coller ici) ?

Partager ce message


Lien à poster
Partager sur d’autres sites
 

Mise à  jour du code. Voir message 1.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites
 

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) :

 

752371Capturedcran20140622224954.png[/url]

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello merci pour ta réponse je vais essayer ce soir....

 

Merci encore

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

 

error : attempt to index 'jason' (a nil value)

 

Au cas où -> On est d'accord c'est json et pas "jason"  :P

Partager ce message


Lien à poster
Partager sur d’autres sites

hello oui c'est bien json,

 

Je teste ce soir car je peux pas entendre ma squeeze depuis mon boulot :rolleyes:

Partager ce message


Lien à poster
Partager sur d’autres sites
 

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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...)

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu te mets sur le module virtuel et tu regardes dans l'adresse (c'est le dernier chiffre).

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha ! Ben là  je les comptes visuellement ... J'ai pas trouvé d'autre solution...

 

922862Capturedcran20140624142931.png

 

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) !

 

462274Capturedcran20140624143710.png[

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

 

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 :

gallery_2_5_13301.jpg

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 "

gallery_2_5_78929.jpg

Partager ce message


Lien à poster
Partager sur d’autres sites

×