Aller au contenu

Messages recommandés

Posté(e)

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=

Posté(e) (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é par MAM78
Posté(e)

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.

Posté(e)
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).

 

Posté(e) (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é par MAM78
Posté(e)

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.

Posté(e)

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 ?

Posté(e)

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
                },

 

Posté(e)

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 ?

  • Like 1
Posté(e)

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
  }

 

  • Like 1
Posté(e)

@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.

Posté(e) (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é par MAM78
Posté(e) (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é par MAM78
Posté(e)

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 :P

Posté(e)

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

 

Posté(e)
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

Posté(e)

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.portable

Envoyé de mon Nexus 5X en utilisant Tapatalk

Posté(e) (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 :P

 

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 .:13:c'est toi le maitre :P

 

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é par MAM78
Posté(e)
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 .:13:c'est toi le maitre :P

 

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 :13: 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. 

 

 

×
×
  • Créer...