MAM78 Posté(e) le 18 décembre 2017 Signaler Posté(e) le 18 décembre 2017 (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é le 18 décembre 2017 par MAM78
MAM78 Posté(e) le 18 décembre 2017 Signaler Posté(e) le 18 décembre 2017 (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 endpar : 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é le 19 décembre 2017 par MAM78
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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. 1
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 @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.
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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} )
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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.
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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é.
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 (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é le 19 décembre 2017 par MAM78
Steven Posté(e) le 19 décembre 2017 Auteur Signaler Posté(e) le 19 décembre 2017 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}}})
Steven Posté(e) le 19 décembre 2017 Auteur Signaler Posté(e) le 19 décembre 2017 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"}}})
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 j'y ai pense aussi @Steven mais @MAM78 veut lancer la diffusion du 2eme message uniquement après le 1er message. Donc rien de sur pour le 10 du Sleep ;-)
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 (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é le 19 décembre 2017 par MAM78
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 Ca ne viendrait pas de ta fonction Wait que tu as voulu rajouter ?
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 (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é le 19 décembre 2017 par MAM78
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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 ?
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 Quelle est cette ligne 208 pour toi ?
Steven Posté(e) le 19 décembre 2017 Auteur Signaler Posté(e) le 19 décembre 2017 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 Tu es en quel version de ta HC2 @MAM78 ? (C'est pour chercher cette fameuse ligne 208)
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 (modifié) @Steven Juste par acquis de concience : 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). 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é le 19 décembre 2017 par MAM78
pepite Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 @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.
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 Ok merci, ça devrait répondre à mon besoin, enfin quand ça marchera (plus de bug ?)
Steven Posté(e) le 19 décembre 2017 Auteur Signaler Posté(e) le 19 décembre 2017 Le plugin est bien détecté ?
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 OuiEnvoyé de mon iPhone en utilisant Tapatalk Pro
Steven Posté(e) le 19 décembre 2017 Auteur Signaler Posté(e) le 19 décembre 2017 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.
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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 ?
MAM78 Posté(e) le 19 décembre 2017 Signaler Posté(e) le 19 décembre 2017 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 ?
Messages recommandés