DZVents : Souhaitez la bienvenue

Vous avez crée 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.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Répondre
papoo
Messages : 1879
Enregistré le : 10 janv. 2016, 11:29
Localisation : Limoges (87)
Contact :

DZVents : Souhaitez la bienvenue

Message par papoo » 16 janv. 2019, 22:05

Ce script ne sert à rien c’est pour cela que je l’aime bien. Il est né d’un défi lancé à la hâte genre:
elle sert à rien ta domotique, elle ne dis même pas bonjour lorsque je rentre. Pour connaitre les occupants présents dans la maison, j’utilise le script livebox
les devices associés commencent tous par « Presence » suivi du prénom du propriétaire du téléphone, j’utilise donc dans ce script le terme générique « Presence* » pour surveiller le changement d’état d’un de ces devices Pour les notifications j’utilise un chromecast via un script et une notification http

Quelques messages de bienvenue (commençant tous par un espace) :

» Bienvenue chez toi »
» Heureux de te revoir »
» il est bon de te voir rentrer »
» vraiment heureux de te savoir à la maison »
» super, tu es rentré »
» cool, tu es déjà de retour »
» enfin à la maison »
n’hésitez pas à en proposer d’autre en commentaire
ensuite, 3 variables à configurer : « matin » pour définir l’heure avant laquelle aucun message ne sera envoyé « debut_soiree » pour définir l’heure après laquelle il sera notifié bonsoir au lieu de bonjour « soir » pour définir l’heure après laquelle plus aucun message ne sera envoyé

ensuite une petite fonction round et le tour est joué

le script complet

Code : Tout sélectionner

--[[ bonjour.lua
    
auteur = papoo
update/mise à jour = 10/01/2019
creation = 5/11/2018
https://pon.fr/dzvents-souhaitez-la-bienvenue/
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/bonjour.lua
--]]

--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------

local messages = {  " Bienvenue chez toi", 
                    " Heureux de te revoir", 
                    " il est bon de te voir rentrer", 
                    " vraiment heureux de te savoir à la maison", 
                    " super, tu es rentré", 
                    " cool, tu es déjà de retour",
                    " enfin à la maison"
                 }
local Devices = { 'Presence*' }     -- liste des devices à surveiller séparés par des virgules s'il y en a  plusieurs
local matin         = '08:00:00'    -- aucun message ne sera envoyé avant cette heure (+1 heure pour l'heure d'hiver)
local debut_soiree  = '19:00:00'    -- heure après laquelle il sera notifié bonsoir au lieu de bonjour (+1 heure pour l'heure d'hiver)
local soir          = '22:00:00'    -- aucun message ne sera envoyé après cette heure (+1 heure pour l'heure d'hiver)
local delai         = 60            -- délai avant que le script considère la personne réellement partie

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nomScript = 'Notification Bonjour'
local versionScript = '1.0'

return {
    active = true,
    on = { devices = Devices },
    
    logging =   {    level    =   domoticz.LOG_DEBUG,
                    -- level    =   domoticz.LOG_INFO,             -- Seulement un niveau peut être actif; commenter les autres
                    -- level    =   domoticz.LOG_ERROR,            -- Only one level can be active; comment others    
                    -- level    =   domoticz.LOG_MODULE_EXEC_INFO,

                    marker = nomScript..' '..versionScript },    

    execute = function(domoticz,switch)
    
    
        local Time = require('Time')
        local t = Time().getISO()
        local today = Time(domoticz.time.rawDate ..' '..  matin).getISO()
        local evening = Time(domoticz.time.rawDate ..' '..  debut_soiree).getISO()
        local tonight = Time(domoticz.time.rawDate ..' '.. soir).getISO()
        
        if switch.active and (switch.lastUpdate.minutesAgo > delai) and (t > today) and (t < tonight) then      
        
            local function notification(message, SubSystem)
                domoticz.log("Envoi de la notification ",domoticz.LOG_DEBUG)
                if SubSystem == nil then 
                   domoticz.notify(message, message)
                else
                   domoticz.notify(message, message, 'PRIORITY_NORMAL', ' ', ' ', SubSystem)
                end 
                domoticz.log(message, domoticz.LOG_INFO)
            end
            
            local function rand(Table)
                element = Table[math.random(1, #Table)]
                return element
            end
          
            message = rand(messages)

            domoticz.log(switch.name, domoticz.LOG_DEBUG) 
            local nom = string.gsub(switch.name, 'Presence ', '')
            domoticz.log("bonjour "..nom, domoticz.LOG_DEBUG)
            domoticz.log(message, domoticz.LOG_DEBUG)
            domoticz.log("heure "..t, domoticz.LOG_DEBUG)
            domoticz.log("matin "..today, domoticz.LOG_DEBUG)
            domoticz.log("soir "..tonight, domoticz.LOG_DEBUG)
            if t < evening then
                notification("Bonjour "..nom..", "..message, {domoticz.NSS_HTTP})
                    --[[ Systèmes de notification disponibles :
                        NSS_GOOGLE_CLOUD_MESSAGING NSS_HTTP NSS_KODI NSS_LOGITECH_MEDIASERVER NSS_NMA NSS_PROWL NSS_PUSHALOT NSS_PUSHBULLET NSS_PUSHOVER NSS_PUSHSAFER
                        Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule.
                        Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}
                    --]]
            else
            notification("Bonsoir "..nom.." "..message, {domoticz.NSS_HTTP})
                    --[[ Systèmes de notification disponibles :
                        NSS_GOOGLE_CLOUD_MESSAGING NSS_HTTP NSS_KODI NSS_LOGITECH_MEDIASERVER NSS_NMA NSS_PROWL NSS_PUSHALOT NSS_PUSHBULLET NSS_PUSHOVER NSS_PUSHSAFER
                        Pour une notification sur plusieurs systèmes, séparez les systèmes par une virgule.
                        Exemple :{domoticz.NSS_TELEGRAM, domoticz.NSS_HTTP}
                    --]]
            end
        end
   end   
}
domoticz beta/RaspBerry PI3 stretch
https://pon.fr github

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


niimp
Messages : 3
Enregistré le : 27 janv. 2019, 04:14

Re: DZVents : Souhaitez la bienvenue

Message par niimp » 27 janv. 2019, 04:16

Super, exactement ce que je cherchais ! Je vais tester et faire un retour :) Merci !

Edit : 1er retour très positif :) Par contre j'ai lancé une commande espeak plutôt que notify, et je vais enregistrer des mp3 pour sortir des meilleures voix (j'ai une enceinte sur le raspi).

Est-ce qu'il serait possible de lui faire dire l'heure ? Je vais aussi regarder pour lui faire dire la température de la pièce. Je pense essayer de chaîner un mp3 pour la partie fixe et espeak pour la partie dynamique.

Edit 2 : J'ai pas mal revu le script pour l'adapter à l'utilisation que je voulais en avoir, c'est à dire pouvoir faire lire le texte de bienvenue par le Raspi.
Au départ j'étais parti sur espeak mais vu la qualité je me suis tourné vers l'API TTS Azure. Du coup, j'ai aussi ajouté la température d'une pièce, la température extérieure et l'heure dans le texte qui est lu. Et en prime, une petite blague récupérée via une autre API :-)

Voici le script :

Code : Tout sélectionner

--[[ bonjour.lua
    
auteur = papoo (adapté par niimp)
update/mise à jour = 10/01/2019 (- niimp : 27/01/2019)
creation = 5/11/2018
https://pon.fr/dzvents-souhaitez-la-bienvenue/
https://github.com/papo-o/domoticz_scripts/blob/master/dzVents/scripts/bonjour.lua
--]]

--------------------------------------------
------------ Variables à éditer ------------
--------------------------------------------

local messages = {  " Bienvenue chez toi", 
                    " Heureuse de te revoir", 
                    " Il est bon de te voir rentrer", 
                    " Vraiment heureuse de te savoir à la maison", 
                    " Super, tu es rentré", 
                    " Cool, tu es déjà de retour",
                    " Enfin à la maison"
                 }
local Devices = { 'Mouvement Bureau' }     -- liste des devices à surveiller séparés par des virgules s'il y en a  plusieurs
local matin         = '05:00:00'    -- aucun message ne sera envoyé avant cette heure (+1 heure pour l'heure d'hiver)
local debut_soiree  = '18:00:00'    -- heure après laquelle il sera notifié bonsoir au lieu de bonjour (+1 heure pour l'heure d'hiver)
local soir          = '22:00:00'    -- aucun message ne sera envoyé après cette heure (+1 heure pour l'heure d'hiver)
local delai         = 0            -- délai avant que le script considère la personne réellement partie

--------------------------------------------
----------- Fin variables à éditer ---------
--------------------------------------------
local nomScript = 'Notification Bonjour'
local versionScript = '1.0'

return {
    active = true,
    on = { devices = Devices },
    
    logging =   {    level    =   domoticz.LOG_DEBUG,
                    -- level    =   domoticz.LOG_INFO,             -- Seulement un niveau peut être actif; commenter les autres
                    -- level    =   domoticz.LOG_ERROR,            -- Only one level can be active; comment others    
                    -- level    =   domoticz.LOG_MODULE_EXEC_INFO,

                    marker = nomScript..' '..versionScript },    

    execute = function(domoticz,switch)
    
    
        local Time = require('Time')
        local t = Time().getISO()
        local today = Time(domoticz.time.rawDate ..' '..  matin).getISO()
        local evening = Time(domoticz.time.rawDate ..' '..  debut_soiree).getISO()
        local tonight = Time(domoticz.time.rawDate ..' '.. soir).getISO()
        --domoticz.log(switch.lastUpdate.minutesAgo)
        
        local temp_bureau = domoticz.utils.round(domoticz.devices('Température Bureau').temperature, 1)
        local temp_ext = domoticz.utils.round(domoticz.devices('Météo').temperature, 1)
        
        --domoticz.log(temp_bureau)
        --domoticz.log(temp_ext)
        
        local scripts_dir = '/home/pi/domoticz/scripts/bash'
        local tmp_dir = '/home/pi/domoticz/scripts/tmp'
        local log_dir = '/var/log/domoticz'
        local api_blagues = 'https://bridge.buddyweb.fr/api/blagues/blagues'
        local randnum = math.random(1, 114); 
        local azure_api_key = 'MA_CLE_SECRETE_API_AZURE'
        
        if switch.active and (switch.lastUpdate.minutesAgo >= delai) and (t > today) and (t < tonight) then      
        
            local function rand(Table)
                element = Table[math.random(1, #Table)]
                return element
            end
          
            message = rand(messages)

            domoticz.log(switch.name, domoticz.LOG_DEBUG) 
            --local nom = string.gsub(switch.name, 'Presence ', '')
            --domoticz.log("bonjour ", domoticz.LOG_DEBUG)
            --domoticz.log(message, domoticz.LOG_DEBUG)
            --domoticz.log("heure "..t, domoticz.LOG_DEBUG)
            --domoticz.log("matin "..today, domoticz.LOG_DEBUG)
            --domoticz.log("soir "..tonight, domoticz.LOG_DEBUG)
            
            
            local function notification(message)
                os.execute("curl -s "..api_blagues.."/"..randnum.." | python3 -c \"import sys, json; print(json.load(sys.stdin)['blagues'])\" > "..tmp_dir.."/blague.txt")
                
                os.execute("echo '".. message..". La température du bureau est de "..temp_bureau.." degrés. Il fait "..temp_ext.." degrés dehors. Il est ' $(date +%H%theure%t%M) > "..tmp_dir.."/welcome.txt")
                
                os.execute("cat "..scripts_dir.."/tpl_azure_debut.txt /home/pi/domoticz/scripts/tmp/welcome.txt "..scripts_dir.."/tpl_azure_fin.txt > "..tmp_dir.."/tts_welcome.xml")
                os.execute("cat "..scripts_dir.."/tpl_azure_debut_male.txt /home/pi/domoticz/scripts/tmp/blague.txt "..scripts_dir.."/tpl_azure_fin.txt > "..tmp_dir.."/tts_blague.xml")
                
                os.execute(scripts_dir.."/azure.sh "..azure_api_key.." "..tmp_dir.."/tts_welcome.xml "..tmp_dir.."/welcome.mp3 "..log_dir)
                os.execute(scripts_dir.."/azure.sh "..azure_api_key.." "..tmp_dir.."/tts_blague.xml "..tmp_dir.."/blague.mp3 "..log_dir)
                
                os.execute("sudo -u pi cvlc --play-and-exit "..tmp_dir.."/welcome.mp3 "..tmp_dir.."/blague.mp3 > "..log_dir.."/vlc_bonjour.log 2>&1")
            end
            
            
            if t < evening then
                notification("Bonjour ! "..message)
               -- os.execute("espeak -v fr 'Bonjour. ".. message.."'")
            else
            --os.execute("espeak -v fr 'Bonsoir. "..message.."'")
              notification("Bonsoir ! "..message)
            end
        end
   end   
}
Le script pour l'API Azure :

Code : Tout sélectionner

#!/bin/bash

if [ -z $1 ] ; then
  echo "Please, specify a subscription key." && exit 1;
fi

if [ -z $2 ] ; then
  echo "Please, specify a file to transcribe." && exit 2;
fi

if [ -z $3 ] ; then
  echo "Please, specify a file dest." && exit 3;
fi

if [ -z $4 ] ; then
  echo "Please, specify a log dest." && exit 4;
fi


subscriptionKey=$1
filename=$2
output_file=$3
log_dir=$4
output_format="simple"
language="en-US"
locale="en-US"
recognition_mode="interactive"

token=$(curl --fail -q -X POST "https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken" \
                -H "Content-type: application/x-www-form-urlencoded" -H "Content-Length: 0" \
                -H "Ocp-Apim-Subscription-Key: $subscriptionKey"  2>/dev/null)

if [ -z $token ] ; then
  echo "Request to issue an auth token failed." && exit 1;
fi

request_url="https://westus.tts.speech.microsoft.com"
request_url+="/cognitiveservices/v1"
#request_url+="&format=$output_format&requestid=rest_sample_request_id"

retour=$(curl -v -o $output_file  -X POST $request_url -H "X-Microsoft-OutputFormat: audio-16khz-32kbitrate-mono-mp3" -H "Transfer-Encoding: chunked" \
        -H "Content-Type: application/ssml+xml" \
        -H "Authorization: Bearer $token" --data-binary @$filename  2>$log_dir/azure.log)

echo $retour

Et un des fichiers générés pour être lu par le TTS Azure :

Code : Tout sélectionner

<speak version='1.0' xml:lang='fr-FR'>
  <voice xml:lang='fr-FR' xml:gender='Female' name='Microsoft Server Speech Text to Speech Voice (fr-FR, Julie, Apollo)'>
    <prosody rate="+10.00%">

Bonsoir !  Heureuse de te revoir. La température du bureau est de 22.8 degrés. Il fait 3.9 degrés dehors. Il est  19 heure 49

</prosody>
</voice></speak>
Si ça peut servir / aider quelqu'un :)

Répondre