Aller au contenu

Diffuser Un Message Tts Sur Squeezebox


JossAlf

Messages recommandés

 

Je vous propose un petit tutoriel pour créer un bouton qui diffusera un message (que vous taperez) sur vos squeezebox.

 

Pour cela il vous faut une ou plusieurs squeezebox et un NAS avec Logitech media Serveur installé dessus.

 

En suite vous créez un module virtuel avec un bouton qui contient le code suivant :

--Taper ici la phrase à  diffuser
-- ATTENTION les accents sont mal lus par google
-- Utiliser l'infinitif pour prononcer "diffusé" il faut taper "diffuser"
local notification = "Message traduit par google et diffuser sur squeezebox"
-- réglage du niveau sonore
local NiveauSo = 60
-- On remplace les espaces par des %20
local notification = string.gsub((notification)," ", "%%20"); 
--fibaro:debug(notification)

-- Adresse IP du Logitech Media Server 
local ipadd = "192.168.0.46" 
-- le port du serveur
local portno = 9090 
-- L'adresse MAC de la squeeze
local player = "00:xx:xx:xx:xx:00 " 
local playername = "SqueezeBox " 

-- Allumage de la squeezebox
local cmnd = "Power 1 "
--Fabrication de la ligne qui sera envoyée au serveur squeeze
local stringtosend = player .. cmnd .. string.char(10)
-- ouverture du socket 
tcpSocket = Net.FTcpSocket(ipadd, portno) 
--réglage du timeout de 2 secondes 
tcpSocket:setReadTimeout(2*1000) 
-- envoi de la commande
bytes, errorCode = tcpSocket:write(stringtosend)

-- On règle le volume sonore ici 60
local cmnd = "mixer volume " .. NiveauSo .. " "
--Fabrication de la ligne qui sera envoyée au serveur squeeze
local stringtosend = player .. cmnd .. string.char(10)
-- ouverture du socket 
tcpSocket = Net.FTcpSocket(ipadd, portno) 
--réglage du timeout de 2 secondes 
tcpSocket:setReadTimeout(2*1000) 
-- envoi de la commande
bytes, errorCode = tcpSocket:write(stringtosend)

-- On envoi le message
local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q="   .. notification;
--Fabrication de la ligne qui sera envoyée au serveur squeeze
local stringtosend = player .. cmnd .. string.char(10)
-- ouverture du socket 
tcpSocket = Net.FTcpSocket(ipadd, portno) 
--réglage du timeout de 2 secondes 
tcpSocket:setReadTimeout(2*1000) 
-- envoi de la commande
bytes, errorCode = tcpSocket:write(stringtosend)

-- OFF des squeezeBoxs après 10 secondes
fibaro:sleep(10*1000)

local cmnd = "power 0 "
--Fabrication de la ligne qui sera envoyée au serveur squeeze
local stringtosend = player .. cmnd .. string.char(10)
-- ouverture du socket 
tcpSocket = Net.FTcpSocket(ipadd, portno) 
--réglage du timeout de 2 secondes 
tcpSocket:setReadTimeout(2*1000) 
-- envoi de la commande
bytes, errorCode = tcpSocket:write(stringtosend)

Voilà .

 

PS : On pourrait se passer d'allumer la squeezebox avent de diffuser le message, mais cela nous permet de régler le niveau sonore. Ainsi vous pouvez choisir de pousser à  fond pour dire "A table !!!" ou avoir un niveau plus faible pour annoncer que "Toutes les portes sont bien fermées" à  minuit quand vous cliquez sur le bouton dodo... ;)

 

Je vous conseille une amélioration du code ici (Emission Tts Simplifiée Sur Squeezebox). Ce nouveau code permet de simplifier les appels depuis un bouton en insérant seulement 5 lignes pour diffuser un message sur 1 ou plusieurs squeezebox.

Lien vers le commentaire
Partager sur d’autres sites

Allé, pendant que j'y suis voici le code qui permet de checker mes portes le soir quand je déclenche la scène "dodo" ;)

 

[MAJ du code] Il passe de 204 ligne à  126... :)



-- Adresse IP du Logitech Media Server
local ipadd = "192.168.0.46"
-- le port du serveur
local portno = 9090
-- L'adresse MAC de la squeeze
local player = "xx:xx:xx:xx:xx:xx "
local playername = "SqueezeBox "

-- réglage du niveau sonore
local NiveauSo = 25

local notification = ""
local NombrePorte = 0

-- 32 Garage
if tonumber(fibaro:getValue(32, "value")) > 0
then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et du garage ."
else
notification = notification.." du garage ."
end

fibaro:call(4, "sendPush", "Garage ouvert")
fibaro:call(15, "sendPush", "Garage ouvert")
end

-- 34 Chambre bas
if tonumber(fibaro:getValue(34, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de la chambre du bas ."
else
notification = notification.." de la chambre du bas ."
end
fibaro:call(4, "sendPush", "Chambre du bas ouverte")
fibaro:call(15, "sendPush", "Chambre du bas ouverte")
end

-- 38 Entrée principale
if tonumber(fibaro:getValue(38, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de lentrer ."
else
notification = notification.." de lentrer ."
end
fibaro:call(4, "sendPush", "Entrée principale ouverte")
fibaro:call(15, "sendPush", "Entrée principale ouverte")
end

-- 39 cuisine du bas
if tonumber(fibaro:getValue(39, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et de la cuisine du bas ."
else
notification = notification.." de la cuisine du bas ."
end
fibaro:call(4, "sendPush", "Cuisine du bas ouverte")
fibaro:call(15, "sendPush", "Cuisine du bas ouverte")
end

-- 45 portail
if tonumber(fibaro:getValue(45, "value")) > 0 then
NombrePorte = NombrePorte + 1
if NombrePorte > 1 then
notification = notification.." et du portail ."
else
notification = notification.." du portail ."
end
fibaro:call(4, "sendPush", "Portail ouvert")
fibaro:call(15, "sendPush", "Portail ouvert")
end

-- Si il n'y a pas de porte ouverte :
if NombrePorte == 0 then
notification = "Toutes les portes sont fermée."
end

-- Si il n'y a qu'un porte ouverte :
if NombrePorte == 1 then
notification = "Attention a la porte "..notification.." elle me semble ouverte ."
end

-- Si on a plusieurs portes ouvertes :
if NombrePorte > 1 then
notification = "Attention il y a "..NombrePorte.." porte ouverte . Celle "..notification
end

-- Allumage de la squeezebox
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 volume sonore ici 25
local cmnd = "mixer volume " .. NiveauSo .. " "
local stringtosend = player .. cmnd .. string.char(10)
tcpSocket = Net.FTcpSocket(ipadd, portno)
tcpSocket:setReadTimeout(2*1000)
bytes, errorCode = tcpSocket:write(stringtosend)

-- On envoie le message
local notification = string.gsub((notification)," ", "%%20");
fibaro:debug(notification)
local cmnd = "playlist play http://translate.google.com/translate_tts?tl=FR&ie=UTF-8&q=" .. 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(10*1000)

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)

Modifié par JossAlf
Lien vers le commentaire
Partager sur d’autres sites

Ché po suis sous Mac ;)

Il y a peut être un émulateur squeezebox sous PC ? Si non ça existe sous raspberry ( j'en ai un).

C'est super facile, il y même un tuto de Cédric Locqueneux sur Maison et Domotique :

http://maison-et-domotique.com/books/diy-votre-squeezebox-pour-40e/

Lien vers le commentaire
Partager sur d’autres sites

J'ai une autre petite astuce avec Alon Dictaphone sur iPhone qui me permet d'enregistrer un message vocal et de l'envoyer sur le NAS pour le diffuser sur les Squeezes. Si ça intéresse quelqu'un je peux faire un petit tutot.

Envoyé de mon iPhone àl'aide de Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

Hello 

 

Avant tout, Un tout grand merci pour ces partages, on ne le dit pas assez souvent  :P

 

je vais essayer de faire la même chose avec mon NAS xpenology ( Merci a cédric locqueneux pour son fabuleux article à  propos de DSM 5 sur un N54L )

 

 

A bientôt.

 

Coolride.

Lien vers le commentaire
Partager sur d’autres sites

Je profite du topic pour vous partager une news sur laquelle je suis tombée hier: possibilité de downgrader une Logitech UE Smart Radio et obtenir donc une Squeezebox standard qui peut donc s'interfacer sur le serveur LMS. Jusqu'ici Logitech avait arrêté la Squeezebox et la nouvelle gamme ne s'interfaçait plus sur le serveur LMS... Du coup, plus de problème pour obtenir une Squeezebox et fini les enchères pour du vieux matériel au prix du neuf ;-)

 

http://www.ericboisseau.com/squeezebox-meilleur-poste-radio-numerique-radios-internet-fichiers-musicaux-streamings-web/

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Salut JossAlf, c'est vraiment top comme astuce merci bien.

 

J'ai une question, serait-il possible d'envisager de remplacer le texte dicté, par une variable prédéfinie ?

 

Histoire de pouvoir créer des scènes mais avec un seul bouton ?

 

Comme ça je peux créer une variable avec plusieurs texte défini, 1 bouton virtuel pour chaque squeezebox et dans mes scènes j'ai plus qu'à  choisir la variable à  lancer :)

 

Tu penses que c'est jouable ?

 

Merci encore je m'éclate comme un fou avec cette fonction. :)

Lien vers le commentaire
Partager sur d’autres sites

Vas voir ce sujet : http://www.domotique-fibaro.fr/index.php/topic/1185-emission-simplifiée-sur-squeezebox/?hl=squeeze

J'ai fait un petit MV qui va te permettre de faire ce que tu veux en créant autant de boutons que tu veux avec 5 lignes pour chaque bouton ! ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Bonjour,

j'ai ce message d'erreur lorsque je lance le plugin

[ERROR] 19:00:40: line 35: attempt to index global 'Net' (a nil value)

 

 

la ligne 35 correspond à  ceci

tcpSocket = Net.FTcpSocket(ipadd, portno)

 

Avez vous une idée de problème ?

Lien vers le commentaire
Partager sur d’autres sites

 

Tu n'aurais pas placer le code dans une scène ?

Heu je cherche...

 

Tu as bien adapté ton code dans les ligne du début ?

-- Adresse IP du Logitech Media Server 
local ipadd = "192.168.0.46" 
-- le port du serveur
local portno = 9090 
-- L'adresse MAC de la squeeze
local player = "00:xx:xx:xx:xx:00 " 
local playername = "SqueezeBox " 
Lien vers le commentaire
Partager sur d’autres sites

 

Au passage, je te conseille de te servir du code du sujet suivant qui est une amélioration de celui proposé ici et qui est plus souple au niveau des appels depuis d'autre modules virtuels :

http://www.domotique-fibaro.fr/index.php/topic/1185-emission-tts-simplifiée-sur-squeezebox/

Lien vers le commentaire
Partager sur d’autres sites

alors j'ai créé le module virtuel avec le nouveau code que tu as indiqué.

J'ai toujours le même message.

 

Par contre concernant l'ID du module virtuel comment le trouves tu ? autant je le vois dans les devices "nomraux" autant je n'arrive pas à  le voir dans le module virtuel.

 

[ERROR] 11:10:08: line 13: attempt to index global 'json' (a nil value)

 

la ligne 13 correspond à  celle ci

fibaro:setGlobal("SqueezeNom" , json.encode(ListeSqueeze))

 

Je pense que je ne maitrise pas bien les différences entre Module Virtuel Scene ID des boutons et que je ne comprends pas non plus la ligne

fibaro:call(123, "pressButton", "1");

 

Ps => Pour le problème initiale avec l'ancien code je l'ai résolu j'avais créé une scene au lieu d'un device virtuel avec bouton.

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...