[LUA] Bonjour ou annonce vocale du matin

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

[LUA] Bonjour ou annonce vocale du matin

Message par stephdes »

L'idée ici est d'avoir une annonce vocale les matins où je mets mon réveil avec les infos que je souhaite. Le tout est diffusé par SARAH (port 8888) sur une enceinte bluetooth dans ma pièce de vie.

Voici le script que j'ai fait. Il est modifiable selon vos besoins / équipements.

C'est mon premier "vrai script" alors soyez indulgent il n'est pas parfait mais fonctionne bien pour moi.

Merci au passage à jmleglise et Vil1driver pour leur aide !

Code : Tout sélectionner

--[[   
auteur : stephdes
version : 1.0
MAJ : 12/12/2016
Principe :
Si mon "réveil" est activé, tous les matins à 7H une annonce avec température, météo, fête du jour... est diffusée sur un HP bluetooth de ma pièce de vie"
]]--

commandArray = {}

local timeNow= os.date("*t")
local curl = 'C:\\curl\\bin\\curl.exe ' --METTRE ICI LE CHEMIN DE VOTRE CURL
local saint = otherdevices_svalues['Fête du jour'] -- METTRE ICI VOTRE DEVICE "fête du jour" si vous en avez un

-- #############  REMISE A ZERO DE LA VARIABLE "BONJOUR" ENTRE 6H et 7H (la variable doit être de type chaîne) #################

if (timeNow.hour >=5 and timeNow.hour <6) then
   commandArray['Variable:bonjour'] = tostring (0)
end

-- #############  CONDITIONS NECESSAIRES A L'EXECUTION DU SCRIPT  #################

if (otherdevices['Reveil'] == 'On' and
timeNow.hour >=7 and
uservariables["bonjour"] == '0')
then
    
-- #############  DEMARRAGE DE LA COMPOSITION DU MESSAGE  #################
    
local sentence="Bonjour ! Nous sommes le " ..(os.date("%A")).. " " ..(os.date("%d")).. " " .. os.date("%B")

-- #############  PASSAGE DU JOUR ET DU MOIS EN FRANCAIS  #################

local d = {
      ["Monday"] = " Lundi ",
      ["Tuesday"] = " Mardi ",
      ["Wednesday"] = " Mercredi ",
      ["Thursday"] = " Jeudi ",
      ["Friday"] = " Vendredi ",    
      ["Saturday"] = " Samedi ",
      ["Sunday"] = " Dimanche ",
      
      ["01"] = " premier ",
      ["02"] = " deux ",
      ["03"] = " trois ",
      ["04"] = " quatre ",
      ["05"] = " cinq ",    
      ["06"] = " six ",
      ["07"] = " sept ",
      ["08"] = " huit ",    
      ["09"] = " neuf ",

      ["January"] = " Janvier ",
      ["February"] = " Février ",
      ["March"] = " Mars ",    
      ["April"] = " Avril ",
      ["May"] = " Mai ",
      ["June"] = " Juin ",
      ["July"] = " Juillet ",
      ["August"] = " Août ",
      ["September"] = " Septembre ",
      ["October"] = " Octobre ",
      ["November"] = " Novembre ",
      ["December"] = " Décembre "   }
      
      for k, v in pairs (d) do
          sentence = string.gsub(sentence, k, v)
      end


-- #############  PROGRAMME D'ENCODAGE DU TEXTE POUR LE TTS  #################

function url_encode(str)
  if (str) then
    str = string.gsub (str, "\n", "\r\n")
    str = string.gsub (str, "([^%w %-%_%.%~])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str   
end

-- #############  TEMPERATURE ET METEO  #################   

if (otherdevices['Température extérieure'])  then --METTRE ICI VOTRE DEVICE DE TEMPERATURE
temperature1, hygro1, etat1= otherdevices_svalues['Température extérieure']:match("([^;]+);([^;]+)")
-- print("TEMP:"..temperature1);
-- print("HUM:"..hygro1);
end
   sentence=sentence..". La température extérieure est de "..temperature1.." degré et le taux d'humidité est de "..hygro1.." pourcent. "

   json = (loadfile "C:\\Program Files (x86)\\Domoticz\\scripts\\lua\\JSON.lua")() --METTRE ICI LE CHEMIN DU JSON
   local city = "xxx"
   local wuAPIkey = "xxx"
   local file=assert(io.popen(curl.. 'http://api.wunderground.com/api/'..wuAPIkey..'/forecast/lang:FR/q/France/'..city..'.json'))   
   local raw = file:read('*all')
   file:close()   
   local jsonForecast = json:decode(raw)   
   prevision=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric  -- Prévision complète
-- prevision=jsonForecast.forecast.simpleforecast.forecastday[1].conditions  -- Prévision rapide

 local t = {
      ["ºC"] = "degré",

      [" ENE "] = " Est Nord Est ",
      [" NNE "] = " Nord Nord Est ",
      [" NE "] = " Nord Est ",
      [" N "] = " Nord ",    
      [" NNO "] = " Nord Nord Ouest ",
      [" NO "] = " Nord Ouest ",

      [" SSE "] = " Sud Sud Est ",
      [" SE "] = " Sud Est ",
      [" S "] = " Sud ",    
      [" SSO "] = " Sud Sud Ouest ",
      [" SO "] = " Sud Ouest ",
      
      [" O "] = " Ouest ",
      [" E "] = " Est ",
      
      ["km/h"] = " kilomètre heure"   }
      
      for k, v in pairs (t) do
          prevision = string.gsub(prevision, k, v)
      end

sentence=sentence.."Le temps de la journée sera "..prevision

-- #############  AJOUT RISQUE DE GIVRE  ################# 

 if (otherdevices_svalues['Risque de givre'])=='Risque de givre' then
      sentence=sentence.." Il y a peut etre du givre, soyez prudent." 
   elseif (otherdevices_svalues['Risque de givre'])=='Présence de givre !' then
      sentence=sentence.." Attention il y a du givre, soyez très prudent!"
   end


-- #############  AJOUT DU SAINT DU JOUR  ################# 

sentence=sentence..". Aujourd'hui, nous fêtons les "..saint.." . "



-- #############  AJOUT JOUR DES POUBELLES  ################# 

numOfDay=os.date("%w")

if (numOfDay == '1') then
sentence=sentence.." Les poubelles sont ramassées ce matin."
end

-- #############  ENCODAGE DU TTS  ################# 

sentence = url_encode(sentence)


-- #############  SORTIE DU TEXTE  ################# 

--print (sentence)
commandArray['OpenURL']="http://localhost:8888/?tts="..sentence..""


-- #############  PASSAGE DE LA VARIABLE BONJOUR A 1 POUR N'AVOIR LE MESSAGE QU'UNE SEULE FOIS PAR JOUR  ################# 

commandArray['Variable:bonjour'] = tostring (1)

end

return commandArray
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
rapinou
Messages : 119
Inscription : 17 nov. 2016, 01:44

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par rapinou »

Super,
A force de voir ce genre de choses, je vais peut-être enfin passer le pas pour les commandes vocales :)
RPI 3 - Raspbian 8 (Jessie) - Domoticz V3.5877
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par vil1driver »

Joli, mais remplace ceci

Code : Tout sélectionner

commandArray['OpenURL']="http://localhost:8888/?tts="..sentence..""
Par ceci (pas de http dans OpenURL ;))

Code : Tout sélectionner

commandArray['OpenURL']="localhost:8888/?tts="..sentence
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
lost
Messages : 1511
Inscription : 12 nov. 2016, 11:01

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par lost »

rapinou a écrit :Super,
A force de voir ce genre de choses, je vais peut-être enfin passer le pas pour les commandes vocales :)
J'utilises déjà un peu de synthèse vocale... avec ce bon vieil espeak, qui fonctionne en fait bien mieux sur les prénoms que Svox pico tts pourtant plus récent... les deux fonctionnant en local.

Espeak est plus paramétrable en fait.

En reco et toujours local, il commence aussi à y avoir des choses utilisables cependant. Au moins niveau mots clef. J'essaierais Snowboy un de ces jours...
le belge
Messages : 346
Inscription : 12 déc. 2016, 19:02

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par le belge »

Bonjour ,
je suppose qu'il faut absolument avoir Sarah pour utiliser les annonces vocale ?
Le Belge
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par deennoo »

Attention !!

Ce script est pour un Domoticz sur Windows

Il a des ajustements a faire pour une version rpi et syno

Et oui il faut sarah dans cette version,
Qui a le courage de faire une version espeak? Svox ? Et meme mqtt pour la Custom page de Vil1D
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
le belge
Messages : 346
Inscription : 12 déc. 2016, 19:02

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par le belge »

Bonjour ,

merci pour les infos , ce n'est pas pour moi alors ....
kerherno
Messages : 2
Inscription : 15 oct. 2015, 19:30

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par kerherno »

Bonjour,

Merci pour vos partages. Pour ma part voici mon script.

1. Envoi de l'heure du réveil à Domoticz avec Tasker (autoalarm) quand je branche mon téléphone sur le courant
2. Déclenchement du scénario si on est à l'heure du réveil que je passe devant mon détecteur de mouvement
3. Démarrage de l'ampli avec Harmony Hub + allumage lumière
4. Création des annonces vocales dans un fichier avec Voxygen
5. Envoi de ce fichier sur un raspberry connecté à l'ampi (raspberry + dac + volumio)

Il y a tout de même quelques prérequis : ssh authorized_keys, gcalcli, csv.lua, script waze, mplayer sur volumio

Code : Tout sélectionner

commandArray = {}

-- Bibliothèques nécessaires---------------------------------------------------------------------------------------------------------------------------------
csv 		= (loadfile "/home/xxx/domoticz/scripts/lua/csv.lua")() 
json 		= (loadfile "/home/xxx/domoticz/scripts/lua/JSON.lua")() 

-- On récupère l'alarme dans les variables de domoticz -------------------------------------------------------------------------------------------------
alarm_day 	= string.format("%02d",uservariables["alarm_day"])
alarm_month 	= string.format("%02d",uservariables["alarm_month"])
alarm_year	= uservariables["alarm_year"]
alarm_hour 	= string.format("%02d",uservariables["alarm_hour"])
alarm_minute 	= string.format("%02d",uservariables["alarm_minute"])
alarm		= alarm_year .. '-' .. alarm_month .. '-' .. alarm_day .. ' ' .. alarm_hour .. ':' .. alarm_minute .. ':00'
now 			= os.date("%Y-%m-%d %H:%M:%S")

-- Différence entre deux dates------------------------------------------------------------------------------------------------------------------------------
function timedifference(s)
	year		= string.sub(s, 1, 4)
	month 	= string.sub(s, 6, 7)
	day 		= string.sub(s, 9, 10)
	hour 	= string.sub(s, 12, 13)
	minutes 	= string.sub(s, 15, 16)
	seconds 	= string.sub(s, 18, 19)
	t1 		= os.time()
	t2 		= os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
	difference 	= os.difftime (t1, t2)

	return difference
end

-- Encodage de la chaîne pour le TTS -----------------------------------------------------------------------------------------------------------------------------
function url_encode(str)
	if (str) then
		str = string.gsub (str, "\n", "\r\n")
		str = string.gsub (str, "([^%w %-%_%.%~])", function (c) return string.format ("%%%02X", string.byte(c)) end)
		str = string.gsub (str, " ", "+")
	end
	
	return str	
end

-- Fonction TTS --------------------------------------------------------------------------------------------------------------------------------------------------------------
function talk(text)
	text = url_encode(text)
	
	os.execute('wget -O /tmp/announcement.mp3 "http://www.voxygen.fr/sites/all/modules/voxygen_voices/assets/proxy/index.php?method=redirect&text='..text..'&voice=Michel"')
	os.execute('chmod 777 /tmp/announcement.mp3')
	os.execute('chown xxx:xxx /tmp/announcement.mp3')
	os.execute('scp /tmp/announcement.mp3 volumio@192.168.1.4:/home/volumio/announcement.mp3')
	os.execute('ssh volumio@192.168.1.4 "mplayer -ao alsa:device=hw=1,0 /home/volumio/announcement.mp3"')
end

-- Déclenchement du scénario ---------------------------------------------------------------------------------------------------------------------------------
if (timedifference(alarm)>=0) and uservariables["alarm_scene_launched"]==0 then

	if devicechanged['Présence couloir'] == 'On' then

		print("Présence confirmée. Activation scénario réveil")
		
		-- on valide le lancement du scénario---------------------------------------------------------------------------------------------------------------------------------
		os.execute('curl "http://192.168.1.2:8080/json.htm?type=command&param=updateuservariable&vname=alarm_scene_launched&vtype=0&vvalue=1"')

		-- on peut allumer les lumières------------------------------------------------------------------------------------------------------------------------------------------
		os.execute('curl "http://192.168.1.2:8080/json.htm?type=command&param=setcolbrightnessvalue&idx=10&hue=293&brightness=80&iswhite=false"')
		os.execute('curl "http://192.168.1.2:8080/json.htm?type=command&param=switchlight&idx=6&switchcmd=Set%20Level&level=31"')
		
		-- on démarre l'ampli
		os.execute('curl "http://192.168.1.2:8080/json.htm?type=command&param=switchlight&idx=138&switchcmd=On&level=0"')

		-- on patiente un peu
		os.execute("sleep " .. tonumber(10))
	
		pause = ". "
		
		text = "Bonjour !" .. pause

		-- Date du jour ################################################################
		-- Formatage de la date -----------------------------------------------------------------------------------------------------------------------------------------------
		JourSemaine 	= {}
		JourSemaine[0] 	= "Dimanche"
		JourSemaine[1]	= "Lundi"
		JourSemaine[2] 	= "Mardi"
		JourSemaine[3] 	= "Mercredi"
		JourSemaine[4] 	= "Jeudi"
		JourSemaine[5] 	= "Vendredi"
		JourSemaine[6] 	= "Samedi"

		Mois 		= {}
		Mois[1] 		= "Janvier"
		Mois[2] 		= "Février"
		Mois[3] 		= "Mars"
		Mois[4] 		= "Avril"
		Mois[5] 		= "Mai"
		Mois[6] 		= "Juin"
		Mois[7] 		= "Juillet"
		Mois[8] 		= "Août"
		Mois[9] 		= "Septembre"
		Mois[10] 		= "Octobre"
		Mois[11] 		= "Novembre"
		Mois[12] 		= "Décembre"
		
		text = text .. "Nous sommes le " .. JourSemaine[tonumber(os.date("%w"))] .. " " .. tonumber(os.date("%d")) .. " " .. Mois[tonumber(os.date("%m"))] .. pause
		-- ########################################################################

		-- Fête du jour ################################################################
		FeteduJour = io.popen('curl http://domogeek.entropialux.com/feastedsaint/tomorrow','r')
		text = text.."Nous fêtons les saints " .. FeteduJour:read() .. pause
		-- ########################################################################
		
		-- météo ####################################################################
		local city 		= "Marseille"
		local wuAPIkey	= "xxx"
		local file		= assert(io.popen('curl http://api.wunderground.com/api/'..wuAPIkey..'/forecast/lang:FR/q/France/'..city..'.json'))
		local raw 		= file:read('*all')
		file:close()
		local jsonForecast = json:decode(raw)
		prevision=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric
		
		-- Formatage de la météo -----------------------------------------------------------------------------------------------------------------------------------------------
		local t = {
			["ºC"] = "degré",

			[" N "] = " Nord ", 
			[" NNE "] = " Nord Nord Est ",
			[" NE "] = " Nord Est ",
			[" ENE "] = " Est Nord Est ",
			[" E "] = " Est ",
			[" ESE "] = " Est ",
			[" SE "] = " Sud Est ",   
			[" SSE "] = " Sud Sud Est ",
			[" S "] = " Sud ",
			[" SSO "] = " Sud Sud Ouest ",
			[" SO "] = " Sud Ouest ",
			[" OSO"] = " Ouest Sud Ouest",
			[" O "] = " Ouest ",
			[" ONO "] = "  Ouest Nord Ouest",
			[" NO "] = " Nord Ouest ",
			[" NNO "] = " Nord Nord Ouest ",

			["km/h"] = " kilomètre heure"   
		}
		
		for k, v in pairs (t) do prevision = string.gsub(prevision, k, v) end
		
		text = text.."La météo prévoit: " .. prevision .. pause
		-- ########################################################################
		
		--temps de trajet avec l'API waze###############################################################
		text = text .. "Le temps de trajet jusqu'au travail est de " .. string.sub(otherdevices["Temps trajet"],1,2) .. " minutes" .. pause
		-- ########################################################################
		
		-- Agenda ###################################################################
		local gcal = csv.open("/tmp/gcal.txt")
		local Event = ""
		
		for fields in gcal:lines() do
			
			for i, v in ipairs(fields) do
				if 	 i == 1 then 
					local EventStartDate = v
				elseif i == 2 then 
					if string.sub(v,1,2) == "00" then 
						local EventStartTime = "" 
					else 
						local EventStartTime 		= v
						local EventStartHour 		= tonumber(string.sub(EventStartTime,1,2))
						local EventStartMinute 	= tonumber(string.sub(EventStartTime,4,5))
						if EventStartMinute == 0 then EventStartMinute = "" end
						Event = Event .. " " .. EventStartHour .. " heures " .. EventStartMinute .. ','
					end
				elseif i == 3 then 
					local EventStopDate = v
				elseif i == 4 then 
					local EventStopTime = v
				elseif i == 5 then 
					local EventName = v
					Event = Event .. " " .. EventName .. ', '
				end
			end
		end
		
		text = text .. " Voici votre agenda de la journée: " Event .. pause
		-- #########################################################################
		
		talk(text)
	end
end

return commandArray
Toute amélioration est la bienvenue.

Bon dimanche
seblang
Messages : 116
Inscription : 27 déc. 2015, 11:06

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par seblang »

Bonjour

Je cherche a annoncer le matin ( a 6h) le temps et température qu'il fera a 10h et a 15h.
Pour cela j'ai changé l'adresse de la météo pour avoir des prévisons par heure :

http://api.wunderground.com/api/key/hou ... ndrey.json

Par analogie a l'existant, j'ai tenté d'extraire les données avec les commandes :

prevision = jsonValeur.hourly_forecast.condition
prevision1 = jsonValeur.hourly_forecast.temp.metric

Mais cela ne marche pas!
Quelqu'un peu m'aider?
Voir ci-joint ce que donne le liens.
weather.JPG
weather.JPG (146.97 Kio) Consulté 13068 fois
d'avance merci
stephdes
Messages : 285
Inscription : 06 oct. 2016, 20:50

Re: [SCRIPT] Bonjour ou annonce vocale du matin

Message par stephdes »

Bonjour à tous,

Depuis quelques jours, l'API Wunderground ne renvoie plus de texte pour le système métrique :

Code : Tout sélectionner

forecast	
txt_forecast	
date	"09:34 CET"
forecastday	
0	
period	0
icon	"cloudy"
icon_url	"http://icons.wxug.com/i/c/k/cloudy.gif"
title	"mardi"
fcttext	"Nuageux. Risque de pluies fines. Maximales : 50 ºF. Vents NNO soufflant de 10 à 15 mi/h."
fcttext_metric	""
pop	"10"
Est-ce que vous aussi ?
MiniPC W10 + RFXCom 433e + RFLINK
Elec : Téléinfo
Alexa + Alhau
MQTT...
(merci easydomoticz !)
Répondre