Page 2 of 4
Re: Vocal announcement - Good Morning Script
Posted: Monday 18 April 2016 19:08
by ldjldj
Strangely enough (language-settings on Dutch) the char " ' " in part of the sentence stating "Leo's gsm is aanwezig" (Leo's cell is at home) did block the output coming through the speakers. Removing the " ' " solved the problem.
Re: Vocal announcement - Good Morning Script
Posted: Tuesday 19 April 2016 10:28
by Scones
jmleglise wrote:Hi, it seems that the script doesn't like your sentence !
To be sure, just replace this line os.execute ("/usr/bin/tts "..sentence.." &")
by this :
Code: Select all
sentence ="test"
os.execute ("/usr/bin/tts "..sentence.." &")
If this works, you must have a weird car in the sentence.
show us your sentence ...
Haven't tried this, but you could try
Code: Select all
sentence ="test"
os.execute ("/usr/bin/tts '"..sentence.."' &")
The subtle difference is that the contents of sentence end up with single quote marks around it, making the whole sentence a single argument to /usr/bin/tts and also any odd character should get protected. Bear in mind that if you then include a single quote in the sentence variable, it will confuse things
Re: Vocal announcement - Good Morning Script
Posted: Friday 13 May 2016 14:26
by commodore white
Scones wrote:I've got a MAX2PLAY Squeezebox / LMS multi-room setup at home using RPi's as both the server and room players (using PiCorePlayer)
Did you get anywhere with this. I was hoping for something similar though my LMS is based on a Joggler or two.
Peter
Sorted: Re: Vocal announcement - Good Morning Script
Posted: Friday 13 May 2016 14:56
by commodore white
I'm modifying this script for use with dzVents. Though I don't think thats a root cause, I get this error:
2016-05-13 13:29:35.691 LUA: An error occured when calling event handler GoodMorning
2016-05-13 13:29:35.691 LUA: /home/pi/domoticz/scripts/lua/scripts/GoodMorning.lua:41: attempt to call a nil value
... when executing the first of the following lines of code from the original script:
Code: Select all
json = (loadfile "/home/pi/domoticz/scripts/lua/json.lua")()
local file=assert(io.popen('curl http://api.wunderground.com/api/'..wuAPIkey..'/forecast/q/'..city..'.json'))
Any ideas?
Peter
BTW does anyone know of a TTS that has a voice like HAL in 2001 or Marvin, the paranoid android??
--- silly me. Where do I get a copy of json.lua from? Sorted. Got from here:
http://regex.info/blog/lua/json
dzVents: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 19:12
by commodore white
Hi y'all. My Good Morning script is heavily based on the original with the exception that it relies on dzVent plug-in for domoticz. Little benefit in doing so other than it obviates the need for a domoticz variable.
My version has a chatty date intro that probably need improvement but it'll do for now.
Calendar reminders are on my to-do list.
Regards
Code: Select all
-- /lua/scripts/goodMorning.lua by commodore white
return {
active = true,
on = {
'pirKitchen',
'fobKeyfob' -- while testing
},
data = { goodMorning = {initial=0} },
execute = function(domoticz, device, eventInfo)
local s
local sentence
local dayOfMonth = domoticz.time.day
local fobkeyfob = domoticz.devices["fobKeyfob"]
if (device.state == 'On' and domoticz.time.hour >= 7 and domoticz.data.goodMorning ~= dayOfMonth)
or device==fobkeyfob -- on demand during testing
then
local say = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth", "tenth",
"eleventh", "twelveth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }
if dayOfMonth <= 20 then s = say[dayOfMonth] end
if dayOfMonth > 20 and dayOfMonth < 30 then s = "twenty " .. say[dayOfMonth-20] end
if dayOfMonth == 30 then s = "thirtieth" end
if dayOfMonth > 30 then s = "thirty " .. say[dayOfMonth-30] end
sentence="Good morning. Its " .. os.date("%A") .. " " .. os.date("%B") .. " the " .. s .. ". "
-- ############# TEMPERATURE & WEATHER FORECAST #################
sentence=sentence.."Its " .. domoticz.devices['THB'].temperature .. " degrees outside. " -- outdoor temperature
json = (loadfile "/home/pi/domoticz/scripts/lua/json.lua")()
local city = "EGUW"
local wuAPIkey = "xxxx" -- Your Weather Underground API Key
local file=assert(io.popen('curl http://api.wunderground.com/api/'..wuAPIkey..'/forecast/q/'..city..'.json'))
local raw = file:read('*all')
file:close()
local jsonForecast = json:decode(raw)
prevision=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric -- complete prevision
--prevision=jsonForecast.forecast.simpleforecast.forecastday[1].conditions -- small forecast
--[[
if tonumber(string.sub(otherdevices_svalues['Alerte Meteo'], 1, 1))==3 then -- Only for FRANCE. Weather Vigilance http://domogeek.entropialux.com/static/doc/index.html#api-Domogeek-GetVigilance
sentence=sentence.."La météo est en vigilance orange :".. string.sub(otherdevices_svalues['Alerte Meteo'], 11)
elseif tonumber(string.sub(otherdevices_svalues['Alerte Meteo'], 1, 1))==4 then
sentence=sentence.."La météo est en vigilance rouge :".. string.sub(otherdevices_svalues['Alerte Meteo'], 11)
end
--]]
sentence = sentence .. prevision
-- ############# TRASH DAY #################
numOfDay=os.date("%w")
if (numOfDay == '4') then -- thursday
sentence = sentence .. " Don't forget to put out the rubbish."
end
print("talk: "..sentence)
os.execute ("/usr/local/izsynth '"..sentence.."' &")
domoticz.data.goodMorning = dayOfMonth
end
end
}
Re: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 20:44
by Derik
Greaaaaat!!!!
Looks the best Talking option..
I was almost @ the point to buy a Homey voor dutch language voice switching....
Only voicerss sounds not bad for a NL voice. [ someone use a better ? ]
Is it possible to use more mics on 1 pi?
1 in the hall, living, kitchen...?
Multiple seakers?
Is there a simple wiki to add BT speakers..
What is the best option, add this to my CB2 with a lot of hardware, or use a other RPi?
Re: dzVents: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 22:30
by korniza
commodore white wrote:Hi y'all. My Good Morning script is heavily based on the original with the exception that it relies on dzVent plug-in for domoticz. Little benefit in doing so other than it obviates the need for a domoticz variable.
My version has a chatty date intro that probably need improvement but it'll do for now.
Calendar reminders are on my to-do list.
Regards
Code: Select all
-- /lua/scripts/goodMorning.lua by commodore white
return {
active = true,
on = {
'pirKitchen',
'fobKeyfob' -- while testing
},
data = { goodMorning = {initial=0} },
execute = function(domoticz, device, eventInfo)
local s
local sentence
local dayOfMonth = domoticz.time.day
local fobkeyfob = domoticz.devices["fobKeyfob"]
if (device.state == 'On' and domoticz.time.hour >= 7 and domoticz.data.goodMorning ~= dayOfMonth)
or device==fobkeyfob -- on demand during testing
then
local say = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth", "tenth",
"eleventh", "twelveth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }
if dayOfMonth <= 20 then s = say[dayOfMonth] end
if dayOfMonth > 20 and dayOfMonth < 30 then s = "twenty " .. say[dayOfMonth-20] end
if dayOfMonth == 30 then s = "thirtieth" end
if dayOfMonth > 30 then s = "thirty " .. say[dayOfMonth-30] end
sentence="Good morning. Its " .. os.date("%A") .. " " .. os.date("%B") .. " the " .. s .. ". "
-- ############# TEMPERATURE & WEATHER FORECAST #################
sentence=sentence.."Its " .. domoticz.devices['THB'].temperature .. " degrees outside. " -- outdoor temperature
json = (loadfile "/home/pi/domoticz/scripts/lua/json.lua")()
local city = "EGUW"
local wuAPIkey = "xxxx" -- Your Weather Underground API Key
local file=assert(io.popen('curl http://api.wunderground.com/api/'..wuAPIkey..'/forecast/q/'..city..'.json'))
local raw = file:read('*all')
file:close()
local jsonForecast = json:decode(raw)
prevision=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric -- complete prevision
--prevision=jsonForecast.forecast.simpleforecast.forecastday[1].conditions -- small forecast
--[[
if tonumber(string.sub(otherdevices_svalues['Alerte Meteo'], 1, 1))==3 then -- Only for FRANCE. Weather Vigilance http://domogeek.entropialux.com/static/doc/index.html#api-Domogeek-GetVigilance
sentence=sentence.."La météo est en vigilance orange :".. string.sub(otherdevices_svalues['Alerte Meteo'], 11)
elseif tonumber(string.sub(otherdevices_svalues['Alerte Meteo'], 1, 1))==4 then
sentence=sentence.."La météo est en vigilance rouge :".. string.sub(otherdevices_svalues['Alerte Meteo'], 11)
end
--]]
sentence = sentence .. prevision
-- ############# TRASH DAY #################
numOfDay=os.date("%w")
if (numOfDay == '4') then -- thursday
sentence = sentence .. " Don't forget to put out the rubbish."
end
print("talk: "..sentence)
os.execute ("/usr/local/izsynth '"..sentence.."' &")
domoticz.data.goodMorning = dayOfMonth
end
end
}
I get an error if I copy&paste as a lua script to events.
Code: Select all
Error: EventSystem: Lua script goodMorning did not return a commandArray
How can I use this script?

Re: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 23:17
by jmleglise
@Derik
For Text To Speech (TTS), I suggest you to use the awsome script "izsynth". search the forum. You can chose between more than 5 TTS system. For example the excellent "naturalreaders".
Re: dzVents: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 23:19
by commodore white
korniza wrote:
I get an error if I copy&paste as a lua script to events.
Code: Select all
Error: EventSystem: Lua script goodMorning did not return a commandArray
How can I use this script?

You need to install dzVents. Follow the install instructions here github.com/dannybloe/dzVents/tree/dev then copy/paste the script into your lua/scripts subdirectory.
You'll need to edit the script so it reflects the name of a motion detector thats in the same room as your domoticz and a speaker plugged into it but you knew that didn't you!. I also have a push button device I use to trigger scripts manually; handy when debugging.
Peter
Re: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 23:36
by korniza
Thank you so much sir! I'll try it!
Re: Vocal announcement - Good Morning Script
Posted: Sunday 15 May 2016 23:56
by jmleglise
Hi,
This is a part to enhance the synthesis of the prevision. This replace acronym :
(To be completed and to be adapted to your language)
Code: Select all
prevision=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric -- complete prevision
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"] = " kilometre heure" }
for k, v in pairs (t) do
prevision = string.gsub(prevision, k, v)
end
and this is a part to wish Birth Day or remember event :
Code: Select all
local tableBirthDay = {
jeanmarc="09/04/19xx",
isabelle="01/06/19xx",
justine="25/09/20xx"
}
print(os.date("%d/%m"))
for key, valeur in pairs(tableBirthDay) do
print(key, valeur)
print(string.sub(valeur, 1, 5))
if os.date("%m/%d") == string.sub(valeur, 1, 5)
then
print("BirthDay !")
end
end
PS : sorry , french date ... DD/MM/YYYY
Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 0:29
by commodore white
Thanks jmleglise, I was wondering the best best way to convert wind directions to something pronounceable.
Peter
Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 14:26
by Derik
jmleglise wrote:@Derik
For Text To Speech (TTS), I suggest you to use the awsome script "izsynth". search the forum. You can chose between more than 5 TTS system. For example the excellent "naturalreaders".
Thanks...
I think this is a simple way for me.
Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 15:25
by korniza
please help!
I install dzVents following wiki. I saved script under lua/scripts. I created a virtual switch named fobKeyfob.When I switch fobKeyfob to ON, I get error:
2016-05-16 16:05:46.192 User: Admin initiated a switch command
2016-05-16 16:05:46.272 LUA: Handling events for: "fobKeyfob", value: "On"
2016-05-16 16:05:46.272 LUA: =====================================================
2016-05-16 16:05:46.272 LUA: >>> Handler: goodMorning
2016-05-16 16:05:46.273 LUA: >>> Device: "fobKeyfob" Index: 27
2016-05-16 16:05:46.273 LUA: .....................................................
2016-05-16 16:05:46.273 LUA: An error occured when calling event handler goodMorning
2016-05-16 16:05:46.273 LUA: /home/pi/domoticz/scripts/lua/scripts/goodMorning.lua:17: attempt to compare number with nil
2016-05-16 16:05:46.273 LUA: .....................................................
2016-05-16 16:05:46.274 LUA: <<< Done
2016-05-16 16:05:46.274 LUA: -----------------------------------------------------
As error reports, error appeared in line 17 where I have the following line:
Code: Select all
if (device.state == 'On' and domoticz.time.hour >= 7 and domoticz.data.goodMorning ~= dayOfMonth)
Any Idea what is wrong?
Thank you!
Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 16:16
by korniza
I found that issue appeared due to wrong version of dzVents. It repuired DEV version

. Now I get another error
2016-05-16 17:12:38.102 LUA: Handling events for: "fobKeyfob", value: "On"
2016-05-16 17:12:38.102 LUA: =====================================================
2016-05-16 17:12:38.103 LUA: >>> Handler: goodMorning
2016-05-16 17:12:38.104 LUA: >>> Device: "fobKeyfob" Index: 27
2016-05-16 17:12:38.105 LUA: .....................................................
2016-05-16 17:12:38.107 LUA: An error occured when calling event handler goodMorning
2016-05-16 17:12:38.108 LUA: /home/pi/domoticz/scripts/lua/scripts/goodMorning.lua:34: attempt to index field 'THB' (a nil value)
2016-05-16 17:12:38.109 LUA: .....................................................
2016-05-16 17:12:38.109 LUA: <<< Done
2016-05-16 17:12:38.110 LUA: -----------------------------------------------------
2016-05-16 17:12:37.982 (Synth) Light/Switch (fobKeyfob)
I think this has to do with Weather Underground...

Re: dzVents: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 16:47
by korniza
commodore white wrote:korniza wrote:
I get an error if I copy&paste as a lua script to events.
Code: Select all
Error: EventSystem: Lua script goodMorning did not return a commandArray
How can I use this script?

You need to install dzVents. Follow the install instructions here github.com/dannybloe/dzVents/tree/dev then copy/paste the script into your lua/scripts subdirectory.
You'll need to edit the script so it reflects the name of a motion detector thats in the same room as your domoticz and a speaker plugged into it but you knew that didn't you!. I also have a push button device I use to trigger scripts manually; handy when debugging.
Peter
Final! It is working!!
Thanks again sir for sharing your script!

Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 20:15
by commodore white
Hi korniza. Pleased to hear you got it working and that you spotted my deliberate error in forgetting to tell you that you needed a device called THB from which you can derive the outside temperature.
Hi jmleglise. I incorporated your two suggestion - they work a treat. The birthday announce thingy was just in time for my sons birthday. Kudos.
Code: Select all
sentence="Good morning. Its " .. os.date("%A") .. " " .. os.date("%B") .. " the " .. s .. ". "
local birthdays = {
martyns="16/05/19xx",
peters="25/04/19xx",
gemmas="01/08/19xx",
ritas="01/03/19xx"
}
for key, valeur in pairs(birthdays) do
if os.date("%d/%m") == string.sub(valeur, 1, 5)
then
sentence = sentence .. key .. " birthday! "
end
end
Re: Vocal announcement - Good Morning Script
Posted: Monday 16 May 2016 21:36
by jmleglise
Re: Vocal announcement - Good Morning Script
Posted: Friday 20 May 2016 15:39
by commodore white
Liked this script so much, I created another.
It seemed a shame that I only ever got one weather report so this dzVents script checks the weather every hour and, if its changed and someone walks into the room, they'll get a weather update.
I'll probably drive us nuts in a few days but its fun for now.
Remember you'll have to install the dev version of dzVents to use it or just nick the good bits.
Code: Select all
-- /lua/scripts/weather.lua by commodore white
return {
active = true,
on = {
['timer'] = 'at *:10', -- fetch an update ten minutes past each hour
'pirTwo', -- my PIR sensor
'fobKeyfob' -- while testing
},
data = { goodMorning = {initial=0},
previousForecast = {initial=""},
recentForecast = {initial=""}
},
execute = function(domoticz, device, eventInfo)
local sentence = ""
local dayOfMonth = domoticz.time.day
local fobkeyfob = domoticz.devices["fobKeyfob"]
----------------------
fetchWeatherForecast = function()
json = (loadfile "/home/pi/domoticz/scripts/lua/json.lua")()
local city = "xxxx"
local wuAPIkey = "xxxx" -- Your Weather Underground API Key
local file=assert(io.popen('curl http://api.wunderground.com/api/'..wuAPIkey..'/forecast/q/'..city..'.json'))
local raw = file:read('*all')
file:close()
local jsonForecast = json:decode(raw)
domoticz.data.recentForecast=jsonForecast.forecast.txt_forecast.forecastday[1].fcttext_metric -- complete forecast
--domoticz.data.recentForecast=jsonForecast.forecast.simpleforecast.forecastday[1].conditions -- small forecast
print("fetchWeatherForecast: " .. domoticz.data.recentForecast)
end
----------------------
reportDate = function()
local s
local say = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth", "tenth",
"eleventh", "twelveth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" }
if dayOfMonth <= 20 then s = say[dayOfMonth] end
if dayOfMonth > 20 and dayOfMonth < 30 then s = " 20 " .. say[dayOfMonth-20] end
if dayOfMonth == 30 then s = "thirtieth" end
if dayOfMonth == 31 then s = "30 first" end
sentence=sentence .. "Its " .. os.date("%A %B") .. " the " .. s .. ". "
-- print("reportDate: " .. sentence)
end
----------------------
reportAniversaries = function()
local aniversaries = {
["martyns birthday"]="16/05/19xx",
["peters birthday"]="25/04/19xx",
["gemmas birthday"]="01/08/19xx",
["ritas birthday"]="01/03/19xx"
}
for event, date in pairs(aniversaries) do
if os.date("%d/%m") == date:sub(1, 5)
then
sentence = sentence .. event .. ". "
end
end
end
----------------------
reportWeather = function()
sentence=sentence.."Outside its " .. domoticz.devices['THB'].temperature .. " degrees. "
local report = domoticz.data.recentForecast
local t = {
["C. "] = " degrees. ",
[" N "] = " North ",
[" NNW "] = " Nor Nor West ",
[" NW "] = " North West ",
[" WNW "] = " West Nor West ",
[" W "] = " West ",
[" WSW "] = " West Sow West ",
[" SW "] = " South West ",
[" SSW "] = " Sow Sow West ",
[" S "] = " South ",
[" SSE "] = " Sow Sow East ",
[" SE "] = " South East ",
[" ESE "] = " East Sow East ",
[" E "] = " East ",
[" ENE "] = " East Nor East ",
[" NE "] = " North East ",
[" NNE "] = " Nor Nor East ",
["Winds"] = " Wind from the ",
["km/h"] = " kilometres per hour",
}
for k, v in pairs (t) do
report = string.gsub(report, k, v)
end
sentence = sentence .. report
end
----------------------
reportRubbish = function()
numOfDay=os.date("%w")
-- if thursday
if (numOfDay == '4') then sentence = sentence .. " Don't forget to put out the rubbish." end
end
--------------------------------------------------------
---------------------- start here ----------------------
-- fetch the weather forecast periodically
if device == nil then
fetchWeatherForecast()
end
-- if motion detected and its after 7 o'clock and before 9:00 pm
if device ~= nil and domoticz.time.hour >= 7 and domoticz.time.hour <=21
then
--if first time today
if domoticz.data.goodMorning ~= dayOfMonth
then
sentence = domoticz.time.hour <= 12 and "Good morning. " or "Good afternoon. "
reportDate()
reportAniversaries()
reportWeather()
if domoticz.time.hour <= 14 then reportRubbish() end
domoticz.data.goodMorning = dayOfMonth -- show first time report has been completed
domoticz.data.previousForecast = domoticz.data.recentForecast -- show recent forecast has been reported on
else -- other than the first time
if domoticz.data.recentForecast ~= domoticz.data.previousForecast -- if the forecast has changed in the last hour
or device == fobKeyfob -- during testing
then
sentence = "Here is an updated weather forecast. "
reportWeather()
domoticz.data.previousForecast = domoticz.data.recentForecast -- show recent forecast has been reported on
end
end
if sentence ~= "" then
print("talk: "..sentence)
os.execute ("/usr/local/izsynth -r '"..sentence.."' &")
end
end -- its after 7 o'clock in the morning
end
}
Oh! nearly forgot. You need an outside temperature sensor called "THB". I derive mine from weather underground.
good luck
Re: Vocal announcement - Good Morning Script
Posted: Sunday 22 May 2016 18:29
by micbou
Any idea how to get the audio over Bluetooth? I know there is a 0 (auto), 1 (mini jack) and 2 (HDMI) option, but dont see any BT