Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 getValue=function() est utilisé pour les conditions alors que action=function() est utilisé pour les actions. Hors tu as mis en getValue et tu utilise ton transpose dans les actions. Pour tester, remplace juste ton getValue= par action=
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 (modifié) Autre test avec : GEA.add(true, 0, "Test", {{"transpose", "B", {"A", "B", "C"}, {"a", "b", "c"}}, {"Popup", "Info", "Titre", "Retour = #value[1]#"}}, "Test Transpose") avec la condition suivante : transpose = {name="transpose", action=function(Value, Table1, Table2) for i = 1, #Table1 do if Table1 == Value then return Table2 end end return "" end }, J'ai bien le Popup sur l'application fibaro mais avec comme contenu : Retour = true et non Retour = b Une idée de ce qui cloche ? Modifié le 22 décembre 2017 par MAM78
Kristiano Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Seems like something good is coming soon. A small thing, but may I propose that the id of the sonos device is part of the parameters? It seems to be better to make the language hard-coded.
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 Il y a 6 heures, MAM78 a dit : Autre test avec : GEA.add(true, 0, "Test", {{"transpose", "B", {"A", "B", "C"}, {"a", "b", "c"}}, {"Popup", "Info", "Titre", "Retour = #value[1]#"}}, "Test Transpose") avec la condition suivante : transpose = {name="transpose", action=function(Value, Table1, Table2) for i = 1, #Table1 do if Table1 == Value then return Table2 end end return "" end }, J'ai bien le Popup sur l'application fibaro mais avec comme contenu : Retour = true et non Retour = b Une idée de ce qui cloche ? Si la table 1 est égale à la valeur ? alors retourne la table 2 ... bizarre tous cela Voici ma proposition : transpose = { name = "Transpose", action = function(value, tabEn, tabFr) for k, v in pairs(tabEn) do if (v:lower() == value:lower()) then return tabFr[k] end end end } print( transpose.action("B", {"A", "B", "C"}, {"a", "b", "c"} ) ) On parcours le tableau 1 en récupérant l'indice de chaque éléments (k) ainsi que sa valeur (v). On compare la valeur (v) avec la value souhaitée. Si elle correspond, on retourne la valeur du tableau 2 selon le même indice (k).
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 (modifié) @Steven En fait mon copier coller dans mon post avait supprimé [i] Vlici le bon code. transpose = {name="transpose", action=function(Value, Table1, Table2) for i = 1, #Table1 do if Table1[i] == Value then return Table2[i] end end return "" end }, Mais je garde le tient qui est plus propre et qui traite en plus les PB de majuscules. Mon code fonctionnait bien, mais mon problème est dans l'usager de l'événement. GEA.add(true, 0, "Test", {{"transpose", "B", {"A", "B", "C"}, {"a", "b", "c"}}, {"Popup", "Info", "Titre", "Retour = #value[1]#"}}, "Test Transpose") j'ai bien le Popup sur l'application fibaro mais avec comme contenu : Retour = true et non Retour = b Lorsque j'utilise la ligne ci-dessous, ça fonctionne bien print( "Transpose="..GEA.options.transpose.action("B", {"A", "B", "C"}, {"a", "b", "c"} ) ) j'ai bien Transpose=b Pourquoi mon GEA.add ne fonctionne pas. Modifié le 22 décembre 2017 par MAM78
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 C'est normal, le #value[1]# retourne la valeur de la condition et la condition est "true". Si tu veux que "transpose" soit capable d'être exploité ainsi, il faut le déplacer dans les conditions et donc changer action=function() par getValue=function() Mais attention, pour qu'une condition soit valide elle doit donc retourner une valeur qui puisse être comparée avec quelque chose. {"transpose", "B", {"A", "B", "C"}, {"a", "b", "c"}, <valeur attendue>} Comme on ne connait pas la valeur attendue, on peut tricher en utilisant la négation {"transpose!", "B", {"A", "B", "C"}, {"a", "b", "c"}, ""} On aura donc au final GEA.add({"transpose!", "B", {"A", "B", "C"}, {"a", "b", "c"}, ""}, 0, "Test", {"Popup", "Info", "Titre", "Retour = #value[1]#"}, "Test Transpose") Ce genre de traitement n'étant ni une condition, ni un action, mais une transformation, ce n'est pas vraiment inclus dans les mécanismes de GEA alors il faut tricher un peu.
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Ok, j'arrive bien maintenant à faire la transposition (traduction) avec la commande suivante (en renseignant en dur "Cloudy"), j'obtient bien "Retour = Nuageux" : GEA.add({"transpose!", "Cloudy", GEA.traduction.en.WeatherCondition, GEA.trad.WeatherCondition,""}, 0, "Test", {"Popup", "Info", "Titre", "Retour=#value[1]#"}, "Test Transpose") Mais maintenant, si je veux remplacer la valeur en du par la fonction GEA "weather". Ca ne fonctionne pas. GEA.add({"transpose!", {"weather"}, GEA.traduction.en.WeatherCondition, GEA.trad.WeatherCondition,""}, 0, "Test", {"Popup", "Info", "Titre", "Retour=#value[1]#"}, "Test Transpose") Mais en l'utilisant de cette façon, ça fonctionne : GEA.add({"transpose!", GEA.options.weather.getValue(), GEA.traduction.en.WeatherCondition, GEA.trad.WeatherCondition,""}, 0, "Test", {"Popup", "Info", "Titre", "Retour=#value[1]#"}, "Test Transpose") Je ne trouve pas ça très élégant. Est-il possible de faire mieux ?
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 Il faudrait pouvoir mettre {"Weather"} à la fin de tes paramètres ... exemple : {"transpose!", GEA.traduction.en.WeatherCondition, GEA.trad.WeatherCondition, {"weather"}, ""} Ainsi GEA va le transformer automatiquement. Sinon il faut ajouter dans ton code la ligne qui va chercher la bonne valeur. transpose = {name="transpose", getValue=function(Value, Table1, Table2) if (type(Value)=="table") then Value = GEA.getOption(Value).getValue() end for i = 1, #Table1 do if Table1[i] == Value then return Table2[i] end end return "" end },
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Génial, j'ai enfin réussi à faire l'intégration de l'événement avec envoi de message TTS vers ma Sonos : GEA.add({{"transpose!", GEA.traduction.en.WeatherCondition, GEA.trad.WeatherCondition, {"weather"}, ""}, {"Weather!", "Temperature" , ""}}, 0, "Test", {"SendVoiceMessage", "TTS", "Nous sommes #datefull# il fait #value[2]# degrer et le temps est #value[1]#", "30", "fr-FR"}, "Annonce de la météo") Voici, la fonction transpose finalisée : transpose = { name = "Transpose", getValue = function(table1, table2, value) for k, v in pairs(table1) do if (v:lower() == value:lower()) then return table2[k] end end return nil end } Maintenant, il reste plus que l'intégration de la fonction SONOS à intégrer dans GEA. @Steven tu vois ça comment ? 1
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 Un peu prêt comme cela : GEA.options.sonosmp3 = { name = "Sonos MP3", action = function(vd_id, button_id, filename, volume) local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} _x:set(tostring(vd_id), { stream = {stream=filename, source="local", duration="auto", volume=volume} }) _f:call(vd_id, "pressButton", button_id) end } GEA.options.sonostts = { name = "Sonos TTS", action = function(vd_id, button_id, message, langue, volume) local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} _x:set(tostring(vd_id), { tts = {message=message, duration='auto', language=langue, volume=volume} }) _f:call(vd_id, "pressButton", button_id) end } 1
Did Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Encore du nouveau, vous assurez les gars.
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 @MAM78, @pepite Cela va vous plaire ceci : GEA.add(true, 0, "Nous sommes le #datefull# la température ext. est de {WeatherLocal, Temperature}° - météo : {WeatherLocal}#") GEA.add(true, 0, "La lampe est : {turnOn, 73}") Résultat [DEBUG] 11:56:45: Nous sommes le vendredi 22 décembre 2017 la température ext. est de 4.3° - météo : nuageux# [DEBUG] 11:56:45: La lampe est : false Donc dans les messages, il est possible d'y mettre une condition qui sera traduite à la volée afin de connaitre sa valeur. Cela ouvre plein de possibilité car avant on avait par exemple #duration# et si je change on pourra faire "Durée : {Duration}" ... mais aussi GEA.add({"Duration+", 50}, 30, "Durée suppérieur à 50") Je vais sérieusement y réfléchir tout en gardant l'ancien mode (pour compatibilité) ET le future.
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 (modifié) Avec la fonction transpose, nous pourrions également faire ceci. GEA.add(({{"transpose!", {true, false}, {"alumée", "éteinte"}, {turnOn, 73}, ""}, 0, "La lampe est #value[1]#") Ce qui donnerait : [DEBUG] 11:56:45: La lampe est alumée Ce qui permetrait de faire la traduction de n'importe qu'elle donnée selon les 2 tables de correspondance. Modifié le 22 décembre 2017 par MAM78
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 (modifié) il y a une heure, Steven a dit : Un peu prêt comme cela : GEA.options.sonosmp3 = { name = "Sonos MP3", action = function(vd_id, button_id, filename, volume) local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} _x:set(tostring(vd_id), { stream = {stream=filename, source="local", duration="auto", volume=volume} }) _f:call(vd_id, "pressButton", button_id) end } GEA.options.sonostts = { name = "Sonos TTS", action = function(vd_id, button_id, message, langue, volume) local _f = fibaro local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end} _x:set(tostring(vd_id), { tts = {message=message, duration='auto', language=language, volume=volume} }) _f:call(vd_id, "pressButton", button_id) end } Il faudra ajouter les variables suivantes : sonosfoldername, contenant le chemin d'accès aux fichiers MP3 de la bibliotheque Sonos. Pour la fonction MP3 sonoslanguage, pour la langue, soit "fr-FR", "en-us" Modifié le 22 décembre 2017 par MAM78
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 sonoslanguage n'est utilisé que pour le TTS et est déjà inclus sous "langue" sonosfoldername : cela ne sert pas à grand chose, il suffit de mettre le chemin complet avec le nom du fichier dans "filename" Restons minimaliste
Kristiano Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Looks very promising! Tell me when I can try it? GEA 6.03?
kioneoranga Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Bonsoir les experts, Je vois que cela bosse fort. Je reviens vers vous car voici 24h que j'essai d'intégrer dans la version 6.02 (.02 maintenant) de nouvelles commandes provenant de mon GEA 5! Je rencontre quelques difficultés que je ne sais pas du tout expliquer. J'ai l'impression qu'il y a des dysfonctionnements avec la 6, entre autre sur la gestion des notifications. J'ai des lignes de controle pour l'ouverture de mes fenetres qui fonctionnent à merveille avec la 5, mais en 6, rien, nada... snif Voici le code que j'ai mis dans une version GEA 6.02 DEBUG Si vous savez m'expliquer pourquoi je ne recoi pas les notifications, cadeaux de noel J'ai essayé aussi d'ajouter dans les actions, l'allumage d'une lampe à l'ouverture (turnOn), cela ne fonctionne pas. Là j'ai besoin d'un remontant... --[[ %% autostart %% properties %% globals 596 value --]] function config() GEA.checkEvery = 30 GEA.debug = true GEA.portables = {} GEA.globalvariables = "GEA6_DEBUG_Tasks" GEA.control = true GEA.batteriesWithRoom = true GEA.language = "fr" end function setEvents() local getAlarm = function ( variable) return fibaro:getGlobalValue(variable) end local id = { TELEPHONE_ERIC = getAlarm("TELEPHONE_ERIC"), TELEPHONE_MANUELA = getAlarm("TELEPHONE_MANUELA"), DETEC_FENETRE_BURO_GAUCHE = 596 } -------------------------------------------------------- GEA.add({"Info+", "serverStatus", os.time()-120}, 0, "Box redémarée à #time# le #date#") GEA.add(true, 0, "Démarrage de GEA 6.0 le #date# à #time#") GEA.add({"Info", "updateStableAvailable", true }, 24*60*60, "Une nouvelle version est disponible", {"Repeat"}) GEA.add({"Info", "updateBetaAvailable", true }, 24*60*60, "Une nouvelle version BETA est disponible", {"Repeat"}) -- ### BUREAU - FENETRE GAUCHE ### -- Ouverture de la fenetre GEA.add(id["DETEC_FENETRE_BURO_GAUCHE"], -1, "Fenetre bureau gauche ouvert à #time#.",{"Portable", {id["TELEPHONE_ERIC"],id["TELEPHONE_MANUELA"]}}) -- Fermeture de la fenetre GEA.add(id["DETEC_FENETRE_BURO_GAUCHE"], -1, "Fenetre bureau gauche fermé à #time#.",{{"Inverse"},{"Portable", {id["TELEPHONE_ERIC"],id["TELEPHONE_MANUELA"]}}}) -- ### ### ### end
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 Le 596 value ne doit pas être sous %%global mais sous %%properties dans l'entête
kioneoranga Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Le 596 value ne doit pas être sous %%global mais sous %%properties dans l'entête et donc sous global, c'est les variables ?c'est ça ?Envoyé de mon ONEPLUS A5000 en utilisant Tapatalk
Steven Posté(e) le 22 décembre 2017 Auteur Signaler Posté(e) le 22 décembre 2017 Oui c'est bien cela. 1
kioneoranga Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Oui c'est bien cela. merciEnvoyé de mon ONEPLUS A5000 en utilisant Tapatalk
pepite Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 Bonsoir@kioneoranga, Conseil : si tu envoies un push aux 2 telephones, mets les 2 portables dansGEA.portables et utilise ta table d ids de tel uniquement lorsque tu veux envoyer le message qu a 1 personne. Par defaut GEA envoie le push aux ids de la variable GEA.portableEnvoyé de mon Nexus 5X en utilisant Tapatalk
MAM78 Posté(e) le 22 décembre 2017 Signaler Posté(e) le 22 décembre 2017 (modifié) Il y a 6 heures, Steven a dit : sonoslanguage n'est utilisé que pour le TTS et est déjà inclus sous "langue" sonosfoldername : cela ne sert pas à grand chose, il suffit de mettre le chemin complet avec le nom du fichier dans "filename" Restons minimaliste Pour sonoslanguage la variable langue devra être adapté dans GEA puisque le contenu n'est pas le même GEA.language = "Fr" versus "fr-FR", "en-us" pour les sonos Pour sonosfoldername le chemin sont vraiment long du coup on vas perdre en lisibilité des GEA.add Dans mon cas, c'est : "//xxxxxxxxxx/music/Domotique/Domotique/iTunes Media/Music/Sons Domotiques/Sons Domotiques/" Moi je dis ça, je ne dis rien .c'est toi le maitre J'ignore si les fonctions Sonos de @Krikroff intègrent déjà la possibilité de désigner l'enceinte sur la et lesquelles doivent se faire l'envoi du message, je pense que ce serait bien d'ajouter un paramètre pour ça si c'est déjà prévu. C'est peut-être l'adresse ip de l'enceinte qui permet la détermination. Modifié le 22 décembre 2017 par MAM78
schwinny Posté(e) le 29 décembre 2017 Signaler Posté(e) le 29 décembre 2017 (modifié) euh, il est passé ou GEA 6 ? je le trouve plus EDIT: ICI Modifié le 29 décembre 2017 par schwinny 1
Kristiano Posté(e) le 29 décembre 2017 Signaler Posté(e) le 29 décembre 2017 Le 2017-12-22 à 20:36, MAM78 a dit : Pour sonoslanguage la variable langue devra être adapté dans GEA puisque le contenu n'est pas le même GEA.language = "Fr" versus "fr-FR", "en-us" pour les sonos Pour sonosfoldername le chemin sont vraiment long du coup on vas perdre en lisibilité des GEA.add Dans mon cas, c'est : "//xxxxxxxxxx/music/Domotique/Domotique/iTunes Media/Music/Sons Domotiques/Sons Domotiques/" Moi je dis ça, je ne dis rien .c'est toi le maitre J'ignore si les fonctions Sonos de @Krikroff intègrent déjà la possibilité de désigner l'enceinte sur la et lesquelles doivent se faire l'envoi du message, je pense que ce serait bien d'ajouter un paramètre pour ça si c'est déjà prévu. C'est peut-être l'adresse ip de l'enceinte qui permet la détermination. I also to the master. Still agree with you. Language and "spoken language" are 2 different things. I use multiple VD for multiple sonos speaker. Each of them with its own IP.
Messages recommandés