Aller au contenu

Messages recommandés

Posté(e) (modifié)

Est-il possible de pouvoir utiliser le texte du message généré (3ème paramètre de la fonction GEA.add) qui est un texte dans lequel il peut y avoir des valeurs calculés afin de le réutiliser comme un texte dans les actions ?

 

Cf. exemple ci-dessous : où je souhaiterais passer à ma scène "SendSonosMessage" en deuxième paramètre le texte avec le remplacement de #durationfull# par la durée d'ouverture de la porte.

 

GEA.add( id["DETECTEUR_PORTE_GARAGE"], 5, "La porte du garage est ouverte depuis plus de #duration#", {{"Repeat"}, {"SendSonosMessage", "TTS", "La porte du garage est ouverte depuis plus de #durationfull#", "50"}})

 

Peut-être une nouvelle fonctionnalité de GEA à développer ?

 

Modifié par MAM78
Posté(e) (modifié)

J'ai trouvé la solution pour répondre à mon besoin ci-dessus, c'est relativement simple, mais cela passe par une petite modification du code GEA.

 

@Steven tu pourrais STP l'intégrer dans une prochaine version. Cela permet de mettre dans les actions des paramètres dynamiques reprenant les variables qui seront remplacées à la volée selon ta liste prédéfinie.

 

Pour la fonction "PluginScenario", il convient de :

 

Remplacer la ligne 602 :

    for i, v in ipairs(args) do table.insert(params, {["param"..i] = v}) end

par :

    for i, v in ipairs(args) do table.insert(params, {["param"..i] = GEA.getMessage(v)}) end

 

Pour la fonction "Scenario" qui propose également le passage d'argument au scenario mais qui n'utilise pas dans la ligne ci-dessous la boucle ci-dessus, je ne suis pas certain d'avoir trouver l'adaptation qu'il conviendrait de faire ?

 

Peut-être, qu'il suffit juste de modifier la ligne  407de la façon suivante :

 

Remplacer la ligne 407 :

    action=function(id, args) if (type(id) ~= "table") then id = {id} end for i=1, #id do fibaro:startScene(id, args) end end
par :

    action=function(id, args) local params = {...} for i, v in ipairs(args) do table.insert(params, {["param"..i] = GEA.getMessage(v)}) end if (type(id) ~= "table") then id = {id} end for i=1, #id do fibaro:startScene(id, params) end end

 

@Steven tu peux confirmer si c'est bon selon toi ?

 

A quoi correspond la boucle sur #id, est-ce pour lancer plusieurs scènes dans une même action. Et dans ce cas là, ce sera toujours les mêmes arguments qui seront passés aux scènes. Et est-ce que ça ne devrait être plutôt fibaro:startScene(i, args) que fibaro:startScene(id, args). 

 

  • J'ai du mal à comprendre la logique de cette ligne.
  • Ne conviendrait-il pas de faire la même chose que la partie action=function(...) pour la fonction "PluginScenario" ?

 

 

Modifié par MAM78
Posté(e)
Il y a 9 heures, Dragoniacs a dit :

e "Power" ne fonctionne pas, mais avec "Value" ça marche... tout simplement...

 

Tant mieux, prends l'habitude quand tu ne sais pas quelle propriété utilisée d'aller voir

http://ipHC2/api/devices/id_du_module

 

Tu auras le retour json avec toutes les propriétes et les valeurs dont tu as besoin.

 

@MAM78,

 

Bien joue la recup du message, efectivement, la fonciton GEA.getMessage permet de capturer le message de n'importe où.


 

GEA.add(id["DETECTEUR_PORTE_GARAGE"], -1, "La porte du garage vient d'être ouverte", {VD", id["SONOS_MP3"], 3} )

GEA.add(id["DETECTEUR_PORTE_GARAGE"], 30, "La porte du garage vient d'être fermée", { {"Inverse"}, {VD", id["SONOS_MP3"], 4} } )

effcetivement la 2eme ligne correspond à une durée de "fermeture de porte de garage", si elle est ouverte depuis 30 sec..donc cela correspond à une temporisation aussi. Ton 1er message est en instantané et l'autre en auto donc 30 secondes, tes messages ne sont donc pas rapprochés.

 

Sinon ceci peut peut-etre aussi fonctionner, en jouant avec une variable et temporiser sur la duree de variable.


 

GEA.add({ id["DETECTEUR_PORTE_GARAGE"], {"VariableCache", "porte_garage", "fermee"} }, -1, "La porte du garage vient d'être ouverte", {"VariableCache", "porte_garage", "ouverte"} )

GEA.add({ {"VariableCache", "porte_garage", "ouverte"}, id["DETECTEUR_PORTE_GARAGE"] }, 1*60, "La porte du garage vient d'être fermée", { {"Inverse", 2},  {"VariableCache", "porte_garage", "fermee"} } )

 

Il y a 7 heures, MAM78 a dit :

J'ai du mal à comprendre la logique de cette ligne.

En fait avec Scenario tu peux faire :

 

{"Scenario", {22, 23} } : qui va lancer les 2 scenes 23 et 23 quelque soit le code de ces scenes, voila pourquoi la boucle sur les #id

ou

{"Scenario", 22, {toto=nuit, titi=jour} } pour passer à la scene 22 les arguments toto et titi recuperer par fibaro:args() de la scene 22.

  • Like 1
Posté(e)

@pepite je viens de faire les 2 solutions que tu m'as proposé ci-dessus. Mais elles ne répondent pas à mon besoins que je reexplique ci-dessous.

 

Quelqu'un ouvre la porte -> immédiatement le message porte ouverte doit être envoyé

Quelqu'un ferme la porte -> le message porte fermée doit être envoyé une fois que le premier message est terminé d'être diffusé.

 

Le tempo de 30 secondes que tu suggères correspond à la durée pendant laquelle la porte est restée ouverte, hors dans mon cas cette porte peut être fermée au bout de 10 seconde et donc dans ce cas sa ne fonctionne pas.

 

Ce que je recherche à faire, ce serais de mettre une tempo dans la partie action qui durerait X secondes avant de réaliser l'action suivante afin de laisser au premier message le temps être diffusé.

 

CQFD.

Posté(e)

Bon ben on va y arriver ;-) @MAM78

 

Alors comme ceci ;-) ca a l'air de répondre à ton besoin ;-) . Evidemment, à tester pour vérifier ;-)

La ligne ne sera exécutée que lorsque la 1ere sera elle-même exécutée, pas avant.


 

local garageouvert = GEA.add(id["DETECTEUR_PORTE_GARAGE"], -1, "La porte du garage vient d'être ouverte" )

GEA.add( { {"Depend", garageouvert}, id["DETECTEUR_PORTE_GARAGE"] }, 30, "La porte du garage vient d'être fermée", {"Inverse", 2} )

 

Posté(e)

Je ne pense pas, puisque la durée d'attente est en fonction de la longueur du message vocal et non de l'exécution de l'action précédente.

Posté(e)

oui tout à fait d'accord.

Ton message est un TTS ou un mp3 finalement ?

tu peux certainement augmenter la durée de la ligne du Depend pour arriver a quelquechose de satisfaisant

 

Sinon je ne vois pas comment avec GEA on peut récuperer la duree du message qui vient d'etre diffusé sur le SONOS.

A moins dans ton code de passer un parametre à une variable globale ou à un label au début de la diffusion du message puis à l'arrêt du message, changer la valeur de la variable globale ou du label puis avec GEA ca devient simple de récupérer la valeur.

 

@Steven fera certainement mieux que moi. Désolé.

 

 

Posté(e) (modifié)

J'essaye d'ajouter une fonction GEA de Wait dont l'objet est de faire un sleep de 10 secondes. Voir code ci-dessous.

 

    wait       = {name="Wait", 
                    action=function(...)
                    local params = {{geaid = __fibaroSceneId}, {gealine = GEA.currentEntry.id.."@"..GEA.currentAction.option_id}, {geamode = "action"}}
                    fibaro:sleep(params[1]*1000)
                  end

 

avec l'événement suivant :

 

  GEA.add({id["DETECTEUR_PORTE_GARAGE"]}, -1, "La porte du garage vient d'être fermée", {{"Inverse"}, {"Wait", 10}, {"SendVoiceMessage", "MP3", "Fermeture Porte Cave.mp3", "50"}})  

 

Mais j'ai l'erreur suivante :

 

[DEBUG] 09:38:20: Erreur, vérifier : [Wait, [10]]

 

Est-ce que vous pourriez m'indiquer ce qui cloche ?

Modifié par MAM78
Posté(e)

Je n'y connais rien en Sonos, mais dans le principe, ce n'est pas possible de récupérer la durée de diffusion. 

 

Perso, j'utiliserais un "Sleep" de 10 secondes.

 

GEA.add(id["DETECTEUR_PORTE_GARAGE"], -1, "", {{"Inverse}, {"Sleep", 10, {"VD", id["SONOS_MP3"], 4}}})

 

Posté(e)

Pas de fibaro:sleep dans GEA svp, c'est juste bon pour tuer le script.

 

De plus fibaro:sleep() prend des secondes donc 10*1000 ... ça fait beaucoup de secondes tous cela.

 

Il y a le {"Sleep", <durée>, <action>} qui est déjà implémenté et qui fait un setTimeout.

 

Donc :

GEA.add(id["DETECTEUR_PORTE_GARAGE"], -1, "La porte du garage vient d'être fermée", {{"Inverse}, {"Sleep", 10, {"SendVoiceMessage", "MP3", "Fermeture Porte Cave.mp3", "50"}}})

 

Posté(e) (modifié)

Je viens de faire le test de @Steven mais du coup j'ai erreur suivante :

 

[DEBUG] 10:08:15: [1;31m2017-12-19 10:08:15.121762 [ fatal] LUA error: /opt/fibaro/FibaroSceneAPI.lua:208: attempt to concatenate local 'sceneID' (a nil value)

 

Voici ma ligne GEA :

 

  GEA.add({id["DETECTEUR_PORTE_GARAGE"]}, -1, "La porte du garage vient d'être fermée", {{"Inverse"}, {"Sleep", 10, {"SendVoiceMessage", "MP3", "Fermeture Porte Cave.mp3", "50"}}})  

 

 

Modifié par MAM78
Posté(e) (modifié)
il y a 28 minutes, Steven a dit :

Il y a le {"Sleep", <durée>, <action>} qui est déjà implémenté et qui fait un setTimeout.

 

@Steven Est-ce la fonction Sleep ne va pas redonner la main immédiatement si l'action s'execute immédiatement ? Du coup pas d'attente de 10 secondes.

Modifié par MAM78
Posté(e)
il y a 7 minutes, pepite a dit :

Ca ne viendrait pas de ta fonction Wait que tu as voulu rajouter ?

Non, je viens de supprimer ma fonction Wait et le problème est toujours présent. Bug ?

Posté(e)

La fonction {"Sleep", <durée>, <action>} provoque un setTimeout de 10 secondes ... une fois les 10 secondes écoulées, elle va envoyer ton action.

 

@pepite C'est la ligne 208 du fichier FibaroSceneAPI.lua :P

 

Tu es en quel version de ta HC2 @MAM78 ? (C'est pour chercher cette fameuse ligne 208)

Posté(e) (modifié)

@Steven 

 

Juste par acquis de concience :

  1. De mon expérience IT, un setTimeout correspond à une durée maximum d'attente d'un retour d'une fonction et au-delà de cette durée en principe il y a un code retour en erreur (de type Timeout).
  2. Ce que tu indiques correspond à une temporisation avant d'executer cette fonction.

Pourrais-tu me confirmer que la fonction Sleep de GEA correspond au cas 2 ci-dessus.

 

ma HC2 est en version 4.150

 

 

Modifié par MAM78
Posté(e)

@Steven : ah oui, j'avais lu trop vite ;-)

 

@MAM78

le settimeout dont te parle Steven est bien une temporisation avant l'execution du code qui suit. Soit dans la ligne de Steven, tu auras une temporisation de 10 secondes après la detection puis l'execution de ton SendVoice.

Posté(e)

Est-ce que tu pourrais exécuter cette commande 

print(fibaro:getGlobalValue("GEA_Plugins"))

Et voir si l'ID qu'il t'affiche est bien celui de ton scénario. Car apparemment, la détection des plugins a du retourner une information incohérente.

 

Je sais que c'est pénible mais c'est vraiment votre collaboration qui permet à GEA d'exister et de croître.

Posté(e)

J'obtiens effectivement le résultat suivant :

 

[DEBUG] 14:22:55: {"sendsonosmessagetts":61,"sendvoicemessage":82}

 

alors que mon plugin s'appelle "SendVoiceMessage" et que le plugin "SendSonosMessageTTS" ne contient plus le code de reconnaissance des plugins GEA.

 

Comment est-ce que l'on réinitialise la variable globale ? Une simple suppression de la VG ?

Posté(e)

Pour arriver à supprimer la mon ancien plugin de la variable GEA_Plugins, j'ai du :

supprimer la variable globale

supprimer la ligne de code de reconnaissance des plugins GEA de mon ancien scénario "sendsonosmessagetts". La mise en commentaire de la ligne ne suffisait pas !

Arrêter et relancer GEA

 

Du coup, je n'ai plus que :

Recherche de plugins, ... : sendvoicemessage


Mais là, n'étant pas chez-moi il est impossible pour moi de refaire le test, sauf si vous avez une idée pour simuler à distance l'ouvertue et la fermeture de ma porte de garage ?
 

×
×
  • Créer...