pepite Posté(e) le 6 novembre 2016 Signaler Posté(e) le 6 novembre 2016 Salut tout le monde, Merci @master, J'ai mis du temps à le mettre en place, mais c'est OK ;-), enfin presque. Si je modifie dans la fonction "send" id par device, j'ai une erreur : DEBUG] 18:26:46: line 50: attempt to index local 'self' (a function value) Si je laisse "id", je recois bien le push "Pushbullet" Bon moi j'ai fait le choix d'eviter la VG et d'utiliser les LABELS qui ont la même portée. Une scene à part dont le trigger est le label --[[ %% properties xx ui.Pushbullet.value --]] Puis dans la scene modifier if (trigger.type == "other") then pushbullet:getDevices() elseif (trigger.type == "global") then local value = fibaro:getGlobalValue("Pushbullet") if (value ~= "") then pushbullet:send(value, device) fibaro:setGlobal("Pushbullet", "") end end Par if (trigger.type == "other") then pushbullet:getDevices() elseif (trigger.type == "property") then local value = fibaro:getValue(idVDMaison, "ui.Pushbullet.value") if (value ~= "") then pushbullet:send(value, device) fibaro:call(idVDMaison, "setProperty", "ui.Pushbullet.value", "") end end Depuis n'importe quelle scene : fibaro:call(id, "setProperty", "ui.Pushbullet.value", "message") Depuis GEA {"Label", id, "Pushbullet", "message"}
pepite Posté(e) le 6 novembre 2016 Signaler Posté(e) le 6 novembre 2016 Au fait, quelqu'un pourrait me faire une icone Pushbullet et une pour le Popup de Fibaro svp? La question bete dont je connais peut-etre la réponse : je voudrais que le WAF utilise aussi pushbullet, obligé de faire une 2eme scene ? Je n'arrive pas à modifier pour tout mettre dans 1 scene, quoique en changeant toutes les variables Qu'en pensez-vous ? c'est le token qui m'embete :-)
Steven Posté(e) le 7 novembre 2016 Auteur Signaler Posté(e) le 7 novembre 2016 le id ou device n'est pas important sur tu ne souhaite pas que le push part sur un device spécifique.
pepite Posté(e) le 7 novembre 2016 Signaler Posté(e) le 7 novembre 2016 Salut @master, Ok compris, mais ca ne part pas si je mets DEVICE ;-) Et tu as une idée si je veux utiliser 2 tokens diferents pour le WAF ;-) 2 scenes ? Merci pour l'icone, TOP
Steven Posté(e) le 7 novembre 2016 Auteur Signaler Posté(e) le 7 novembre 2016 Il y avait encore une erreur dans mon script. J'ai donc modifié le 1er post avec la correction. Je ne peux pas tester depuis mon travail, mais je compte sur toi . Pour info, je faisais : self.getDevices() au lieu de self:getDevices()
pepite Posté(e) le 7 novembre 2016 Signaler Posté(e) le 7 novembre 2016 (modifié) Je testerai, avec plaisir, mais je ne peux pas non plus du boulot ;-) J'avais relu tout le code, je n'avais pas vu le "point" lol Je viens enfin de jeter un oeil sur l'envoi à 2 devices. Je pense que ceci va fonctionner : local device = {"HTC One_M8 dual sim", "WAF Tel"} local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then pushbullet:getDevices() elseif (trigger.type == "global") then local value = fibaro:getGlobalValue("Pushbullet") if (value ~= "") then for i = 1, #device do pushbullet:send(value, device[i]) end fibaro:setGlobal("Pushbullet", "") end end MAis je ne sais pas comment faire avec la méthode POST avec le self.token :-( self.token(i] ? token = {"o.Af6SXfI4Qa8WZX1AFoWzozmVL5plEwGd", "tokenWAF"} Modifié le 7 novembre 2016 par pepite
pepite Posté(e) le 7 novembre 2016 Signaler Posté(e) le 7 novembre 2016 Voila voila, Alors : - pushbullet:getDevices() : ok - envoi notif : ko L'erreur : [DEBUG] 20:46:48: [1;31m2016-11-07 20:46:48.451031 [ fatal] LUA error: /opt/fibaro/scenes/21.lua:109: attempt to index global 'data' (a nil value) Ligne 109 : for k,v in ipairs(data.devices) do
Steven Posté(e) le 8 novembre 2016 Auteur Signaler Posté(e) le 8 novembre 2016 Laisse tomber pour l'instant, je corrigerais plus tard (cet après-midi), j'ai réunion ce matin et j'ai vu qu'il y avait encore des erreurs. Je sais pas ce que j'ai fabriqué car j'avais pourtant bien tester. Mais comme d'habitude, je fais mon code, je le test, et une fois que tout fonctionne, je renomme les variables pour être plus parlant, je modifie encore un peu par-ci par-làet résultat ... c'est de la caca.Alors désolé et je reviens vers toi cet après-midi. 1
Steven Posté(e) le 8 novembre 2016 Auteur Signaler Posté(e) le 8 novembre 2016 Réunion terminée, script modifié (voir page 1).
pepite Posté(e) le 8 novembre 2016 Signaler Posté(e) le 8 novembre 2016 Ok, Je copie colle le script de la page 1 et je lis comme d'hab pour essayer de piger. Vais essayer de tester dans pas trop longtemps ;-) Tu as une idée pour 2 token, j'ai encore essye hier soir, amis rien..je n'y arrive pas (rien d'etonnant a cela ;-))
Steven Posté(e) le 8 novembre 2016 Auteur Signaler Posté(e) le 8 novembre 2016 Je mettrais ceci àla fin du script : local devices = {"sssadadasd", "asdasdasdasdas"} local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then pushbullet:getDevices() elseif (trigger.type == "global") then local value = fibaro:getGlobalValue("Pushbullet") if (value ~= "") then for k, v in ipairs(devices) do pushbullet:send(value, v) end fibaro:setGlobal("Pushbullet", "") end end En faisant donc attention aux lignes : 2, 11, 12 et 13
pepite Posté(e) le 8 novembre 2016 Signaler Posté(e) le 8 novembre 2016 ah oui, j'avais pas fait avec ipairs mais une boucle for. Mais ca ca roule avec 2 devices, mais comment faire avec 2 token différents ? Ou alors je rajoute pushbullet en me connectant avec le meme compte sur les 2 devices, je pensais faire un compte chacun
Steven Posté(e) le 8 novembre 2016 Auteur Signaler Posté(e) le 8 novembre 2016 Ah, j'avais pas compris que tu souhaitais 2 comptes disticts. Soit tu fait 2 scénarios séparés ... bof, soit du duplifie le code local pushbullet = { ... } .. beurkkkkk, soit tu te fais ch.. (censuré) tu passes la variable token en paramètre de méthode. Exemple : send = function(self, message, device)... devient send = function(self, message, device, token) ... Et au lieu d'utiliser self.token dans le code tu utilise token après, tu remplace ipairs(devices) du post précédent par ipairs(tokens) que tu auras bien évidement créer avant. local tokens = {"AxDfsdasdasdadasdada", "Ay8Frsadadjakldjadlkajd"} Et le tour est joué ... facile non ? Allez essaie de le faire toi de ton côté, et si tu y arrives sinon, envoi moi ton code et je le corrigerais bien volontiers, mais essaie avant. Edit : 1 compte par personne c'est mieux sinon tu risque de polluer Madame avec des notifications qui ne la concerne pas. Ma femme a son compte, moi le mien ... sauf que la HC2 ne lui envoi pas de notification ce pourquoi je n'ai pas eu besoin des 2 tokens comme toi.
pepite Posté(e) le 8 novembre 2016 Signaler Posté(e) le 8 novembre 2016 Thanks a lot ;-) Evidemment vais essayer @master. En tout cas, j'ai compris, c'est ce qui me fat peur. 1- test du nouveau code ce soir 2- Modifier la fonction send en rajoutant en arguments token et utiliser "token" au lieu de self.token La question : je supprime ca alors dans la declaration de "pushbullet" ? token = "o.Ax6xXFI5Qa8YZX1BFoWzozmVL5plEwGd", 3- Modifier la table devices en tokens 4- boucle for pour les lister les index valeur (ipairs) de la table tokens J'ai bon ? @master : petite explication stp ? l'usage du self ..pas tres clair encore
Steven Posté(e) le 8 novembre 2016 Auteur Signaler Posté(e) le 8 novembre 2016 Tu as tout bon. L'usage du self est très spécial, il représente l'objet lui même, dans le cas de ce scénario, c'est l'objet "pushbullet". Cela revient au même de faire. local pushbullet = {} pushbullet.send = function(pushbullet, ...) mais en lua, si tu notes pushbullet:send (avec les 2 points) il sait qu'il doit envoyer comme 1er paramètre l'objet parent à la méthode soit "pushbullet". l'utilité de faire passer la variable "self" dans tout les méthodes c'est qu'une méthode sera capable d'appeler une même méthode du même objet via cette variable. Bref, c'est pas facile à expliquer. Il y a une explication ici. Personnellement, je n'aime pas l'utiliser parce que justement on s'embrouille facilement mais c'est du LUA et je me doit donc d'exploiter ses forces et faiblesses.
pepite Posté(e) le 8 novembre 2016 Signaler Posté(e) le 8 novembre 2016 Me revoilà , pas simple le self..trop de self tue le self, je trouve que c'est lourd à lire, pas sur de pouvoir le reutiliser.. Le Code de la premiere page fonctionne parfaitement !! Le code modifié avec 2 tokens ne veut rien savoir :-(, j'ai du me tromper, mais où... l'erreur [DEBUG] 21:23:37: [1;31m2016-11-08 21:23:37.537930 [ fatal] LUA error: /opt/fibaro/scenes/21.lua:34: bad argument #1 to 'ipairs' (table expected, got nil) MA ligne 34 est la recup du data.devices for k,v in ipairs(data.devices) do Mon code modifié pour 2 tokens --[[%% properties72 ui.Pushbullet.value%% events%% globals--]] local pushbullet = { --token = "o.xxxxxxxxxxxx", titreDesMessage = "Fibaro", debug = false, -- ============================================== -- Affichage dans la console -- Paramètres : -- message : le message a afficher -- force : affiche le message même si debug est à false -- ============================================== log = function(self, message, force) force = force or false if (self.debug or force) then print(__convertToString(message)) end end, -- ============================================== -- Affichage les devices reconnus et actifs -- Paramètres : -- data : tableau des devices -- ============================================== displayDevices = function(self, data) self:log("----------========== D e v i c e s =========----------", true) for k,v in ipairs(data.devices) do if (v.model) then self:log(v.model .. " --- " .. v.iden, true) end end end, -- ============================================== -- Interrogation des devices -- Paramètres : -- func : une fonction a rappeler après traitement ou nil -- ============================================== getDevices = function(self, func) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/devices", { options = { method = 'GET', headers = { ["Access-Token"] = token, ["Content-Type"] = "application/json" }, data = "" }, success = function(response) if (func) then func(json.decode(response.data)) else self:displayDevices(json.decode(response.data)) end end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi un message -- Paramètres : -- message : le message à envoyer -- id : l'identifiant du device OU nil -- ============================================== sendPush = function(self, message, id) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/pushes", { options = { method = 'POST', headers = { ["Access-Token"] = token, ["Content-Type"] = "application/json" }, data = json.encode({ ["body"]=message, ["title"]= self.titreDesMessage, ["type"]="note" }), device_iden = id, }, success = function(response) local data = json.decode(response.data) self:log("----------========== P u s h e s =========----------") self:log("Identifiant du message : " .. data.iden) end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi d'un message push -- Paramètres : -- message : le message à envoyer -- device : le nom du device concerné ou nil -- ============================================== send = function(self, message, device, token) if (device) then self:getDevices(function(data) local found for k,v in ipairs(data.devices) do if (v.model == device or v.iden == device) then found = true self:sendPush(message, v.iden) end end if (not found) then self:log(device .. " non trouvé", true) end end) else self:sendPush(message, nil) end end } -- ============================================== -- Démarrage du script -- ============================================== local tokens = {"o.xxxxxxx", "o.xxxxxxxxx"} --local device = "Nexus 5X" local idVDMaison = 72 local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then pushbullet:getDevices() elseif (trigger.type == "property") then local value = fibaro:getValue(idVDMaison, "ui.Pushbullet.value") if (value ~= "") then for k, v in ipairs(tokens) do pushbullet:send(value, v) end fibaro:call(idVDMaison, "setProperty", "ui.Pushbullet.value", "") end end
Steven Posté(e) le 10 novembre 2016 Auteur Signaler Posté(e) le 10 novembre 2016 Aucune idée si cela va fonctionner mais voici une correction (non testé, non validée) --[[ %% properties 72 ui.Pushbullet.value %% events %% globals --]] local pushbullet = { --token = "o.xxxxxxxxxxxx", titreDesMessage = "Fibaro", debug = false, -- ============================================== -- Affichage dans la console -- Paramètres : -- message : le message a afficher -- force : affiche le message même si debug est àfalse -- ============================================== log = function(self, message, force) force = force or false if (self.debug or force) then print(__convertToString(message)) end end, -- ============================================== -- Affichage les devices reconnus et actifs -- Paramètres : -- data : tableau des devices -- ============================================== displayDevices = function(self, data) self:log("----------========== D e v i c e s =========----------", true) for _,v in ipairs(data.devices) do if (v.model) then self:log(v.model .. " --- " .. v.iden, true) end end end, -- ============================================== -- Interrogation des devices -- Paramètres : -- func : une fonction a rappeler après traitement ou nil -- ============================================== getDevices = function(self, func, token) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/devices", { options = { method = 'GET', headers = { ["Access-Token"] = token, ["Content-Type"] = "application/json" }, data = "" }, success = function(response) if (func) then func(json.decode(response.data), token) else self:displayDevices(json.decode(response.data)) end end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi un message -- Paramètres : -- message : le message àenvoyer -- id : l'identifiant du device OU nil -- ============================================== sendPush = function(self, message, id, token) local http = net.HTTPClient() http:request("https://api.pushbullet.com/v2/pushes", { options = { method = 'POST', headers = { ["Access-Token"] = token, ["Content-Type"] = "application/json" }, data = json.encode({ ["body"]=message, ["title"]= self.titreDesMessage, ["type"]="note" }), device_iden = id, }, success = function(response) local data = json.decode(response.data) self:log("----------========== P u s h e s =========----------") self:log("Identifiant du message : " .. data.iden) end, error = function(response) self:log(" ERROR !!! " .. url, true) end, }) end, -- ============================================== -- Envoi d'un message push -- Paramètres : -- message : le message àenvoyer -- device : le nom du device concerné ou nil -- ============================================== send = function(self, message, device, token) if (device) then self:getDevices(function(data) local found for _,v in ipairs(data.devices) do if (v.model == device or v.iden == device) then found = true self:sendPush(message, v.iden, token) end end if (not found) then self:log(device .. " non trouvé", true) end end, token) else self:sendPush(message, nil, token) end end } -- ============================================== -- Démarrage du script -- ============================================== local tokens = {"o.xxxxxxx", "o.xxxxxxxxx"} --local device = "Nexus 5X" local idVDMaison = 72 local trigger = fibaro:getSourceTrigger() if (trigger.type == "other") then for _, v in ipairs(tokens) do pushbullet:getDevices(nil, v) end elseif (trigger.type == "property") then local value = fibaro:getValue(idVDMaison, "ui.Pushbullet.value") if (value ~= "") then for _, v in ipairs(tokens) do pushbullet:send(value, nil, v) end fibaro:call(idVDMaison, "setProperty", "ui.Pushbullet.value", "") end end
pepite Posté(e) le 10 novembre 2016 Signaler Posté(e) le 10 novembre 2016 Salut @master, tu as modifié quoi ? le for _,v et le nil ? je teste et je te tiens au jus comme d'hab ;-) Merci beaucoup
Steven Posté(e) le 10 novembre 2016 Auteur Signaler Posté(e) le 10 novembre 2016 Et j'ai rajouté le "token" en paramètre de TOUTES les fonctions sauf le displayDevices() qui n'en a pas besoin. 1
pepite Posté(e) le 10 novembre 2016 Signaler Posté(e) le 10 novembre 2016 Je fais bien de te surnommer le @master ;-) Fonctionne à 99 %, le getDevices ok, je recois bien la notification sur changement de la valeur du label ;-). Le dernier % : savoir si le WAF a recu..et pour l'instant, pas d'info à ce sujet. Merci beaucoup le @master !!
jojo Posté(e) le 12 novembre 2016 Signaler Posté(e) le 12 novembre 2016 Ou directement importer le script "pushbullet" dans GEA puis l'appeler directement. for i = 1, #GEA.portables do pushbullet:send(GEA.getMessage(entry, nil), fibaro:getName(tonumber(GEA.portables[i]))) GEA.log("sendActions", entry, "!ACTION! : sendPush " .. GEA.getMessage(entry, nil), true) end Je viens de mettre en place ce script. C'est génial, surtout pour l'historique des notif. Maintenant, l'intégration avec GEA est un MUST have pour moi, car vous savez que tout chez moi tourne sous GEA. Donc remplacer l'option {"Portables",..} par ce qu'il faut est "mandatory", histoire de pouvoir utiliser les variables des messages, ..., de ne pas devoir changer toutes mes instructions GEA, ... Bon ok, pour remplacer la ligne fibaro:call(tonumber(GEA.portables[i]), "sendPush",GEA.getMessage(entry, nil)) par pushbullet:send(GEA.getMessage(entry, nil), fibaro:getName(tonumber(GEA.portables[i]))) mais où, comment, ... insérer le script Pushbullet ? Ou directement importer le script "pushbullet" dans GEA puis l'appeler directement.
pepite Posté(e) le 13 novembre 2016 Signaler Posté(e) le 13 novembre 2016 SAlut @jojo, Tu inseres le code de la scene pushbullet quelque part dans le code de GEA. Un petit copier coller ;-) et hop ca devrait etre bon ;-) @master, All is good, le code fonctionne parfaitement, les notifs pushbullet arrivent bien sur les 2 smartphones ;-) Au top. Pour ceux que ca interessent, envoyer les notifs sur 2 smartphones ayant chacun un compte donc un token chacun, c'est ici : http://www.domotique-fibaro.fr/index.php/topic/8417-pushbullet/?p=143143 1
Nico Posté(e) le 13 novembre 2016 Signaler Posté(e) le 13 novembre 2016 Hum, vais m'y mettre aussi dès que je trouve un peu de temps de tout refaire àce niveau, il me faut ça !
jojo Posté(e) le 13 novembre 2016 Signaler Posté(e) le 13 novembre 2016 @pepite, Si on le fait via GEA , théoriquement, il devrait déjà gérer plusieurs potables (avec le même token). De plus il n'y aurait plus besoins d'utiliser la variable globale. Or le code de la première page y fait appel (à partir du démarrage du script). Je dois peut-être ne coller que la variable locale pushbullet dans GEA ?
jojo Posté(e) le 13 novembre 2016 Signaler Posté(e) le 13 novembre 2016 bon, j'y arrive pas. J'ai collé l code de la vairablepushbullet dans GEA (après mes devices) rajouté la ligne pushbullet:send vers la fin du GEA et en paralèle envoyé par GEA un pushbullet via la variable, et ça ça fonctionne => mon token est bon. Mon instruction dans GEA : GEA.add({"Global", "DayPart", ""}, 30, "La valeur de DayPart est : #value#", {{"Inverse"}, {"Portable", MobileID["V_Nexus5"]}})
Messages recommandés