Aller au contenu

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

le id ou device n'est pas important sur tu ne souhaite pas que le push part sur un device spécifique.

 

 

post-339-0-75660200-1478511191_thumb.png

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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()

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Réunion terminée, script modifié (voir page 1).

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;-))

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

--[[
%% 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 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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Et j'ai rajouté le "token" en paramètre de TOUTES les fonctions sauf le displayDevices() qui n'en a pas besoin.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !!

Partager ce message


Lien à poster
Partager sur d’autres sites

 

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Hum, vais m'y mettre aussi dès que je trouve un peu de temps de tout refaire àce niveau, il me faut ça !

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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"]}})

Partager ce message


Lien à poster
Partager sur d’autres sites

×