Aller au contenu

Notifications Pushover sous HC3


Julien92130

Messages recommandés

Bonjour le forum :) 

 

J'essaye de faire fonctionner les notifications Pushover.

 

Pour cela, je me suis très largement inspiré d'un exemple du forum officiel que j'essaye convertir en QA puisqu'il n'est apparement pas possible d'utiliser net.HTTPClient dans une scène (cela reste encore un mystère pour moi ^^). 

 

J'ai donc créé une QA de type Binary Switch avec le code suivant :

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)
  
    self.http:request("https://api.pushover.net/1/messages.json", {
        options = {
            data = json.encode(requestBody),
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json",
                ["Accept"] = "application/json",
                ["Authorization"] = "Basic XXX"
            }
        },
        success = function(response) 
            self:debug(response.status)
            self:debug(response.data)
        end,
        error = function(message)
            self:debug("error:", message)
        end
    })
end

function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false)    
end

function QuickApp:onInit()
    self:debug("onInit")
    self.http = net.HTTPClient({timeout=3000})
    local tkn = "XXX"
    local usr = "XXX"
    --local msg = fibaro.getGlobalVariable("pushoverBody")
    local msg = "Juste pour le test" 
    local dvc = "iPhone_Julien,iPad_Julien"
    local prio = "0"
    local snd = "0"
    local ttl = "Titre Message"
    local requestBody = 'token=' .. tkn .. '&user=' .. usr .. '&title=' .. ttl .. '&message=' .. msg .. '&priority=' .. tostring(prio) .. '&sound=' .. tostring(snd) .. '&device=' .. dvc
end

Le debug me retourne : 

[QUICKAPP297]: {"token":"invalid","errors":["application token is invalid"],"status":0,"request":"8fbfbaaa-3908-45b3-aca4-13026a354509"}

D'après ce que je comprend

  • Mon code semble correct et ce message est retourné par Pushover qui ne comprend pas ma requête ?
  • J'ai aussi un code de retour 400, donc à priori "Bad Request", qui semble confirmer mon hypothèse.  

 

L'API Pushover que j'utilise (et qui fonctionne très bien dans mon Domoticz)

 

Si quelqu'un à une idée :) ?

 

Portez-vous bien.

Lien vers le commentaire
Partager sur d’autres sites

Je n'ai jamais/pas encore développé sur HC3, mais d'un point de vue purement LUA quand je vois que tu déclares la variable requestBody en local dans la fonction onInit(), cette variable ne peut pas être utilisée dans turnOn()

 

Un petit rappel :

 

De façon générale quand tu développes et que tu as des messages d'erreurs, pensent à ajouter un maximum de traces (fibaro:debug() ou son équivalent sur HC3) pour afficher le contenu des variables que tu manipules sur ton écran. Tu verras que ça explique 99% des erreurs, car tu ne manipules en fait pas la bonne donnée que tu pensais avoir.

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Merci pour tes conseils Lazer. J'avais bien cette notion de variables locales vs. globales en tête, mais c'était un peu flou pour moi :wacko:

 

J'ai donc remonté la déclaration de mes variables dans le turnOn() mais j'ai exactement les mêmes retours. 

 

Le fibaro:debug() semble maintenant être devenu fibaro.debug() d'après la documentation, mais je ne sais pas comment l'utiliser... 

 

J'apprend beaucoup par des exemples, mais la difficulté avec la HC3 c'est qu'elle est quand même trop récente et que je trouve encore majoritairement du code pour HC2. Mais ce n'est pas grave, c'est en forgeant qu'on devient forgeron :lol:

Lien vers le commentaire
Partager sur d’autres sites

Oui, je suis certain pour le token. J'en ai effectivement déjà créé un nouveau pour différencier mes notifications Domoticz de celle de la HC3. 

 

Je vais aussi poser la question au support de Pushover car à priori je ne suis pas le seul : 

https://github.com/ioBroker/ioBroker.pushover/issues/23

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Oula avec plaisir oui... Mais comment je fais ça :lol: ?

 

(j'ai honte, ça doit sûrement être un truc bête...)

 

Voilà ce qui apparaît dans le debug lorsque j'allume le switch : 

[02.05.2020] [13:57:38] [DEBUG] [QUICKAPP297]: onAction: {"actionName":"turnOn","args":[297,"turnOn"],"deviceId":297}
[02.05.2020] [13:57:38] [DEBUG] [QUICKAPP297]: binary switch turned on
[02.05.2020] [13:57:39] [DEBUG] [QUICKAPP297]: 400
[02.05.2020] [13:57:39] [DEBUG] [QUICKAPP297]: {"token":"invalid","errors":["application token is invalid"],"status":0,"request":"110acf34-4567-4f84-94cf-4a08a04f4a3b"}

Et voilà mon LUA actuel : 

function QuickApp:turnOn()
    self:debug("binary switch turned on")
    self:updateProperty("value", true)

    -- Déclaration des variables
    tkn = "XXX"
    usr = "XXX"
    ttl = "Objet du messgae"
    --local msg = fibaro.getGlobalVariable("pushoverBody")
    msg = "Message" 
    dvc = "iPhone_Julien,iPad_Julien"
    prio = "0"
    snd = "0"
    requestBody = 'token=' .. tkn .. '&user=' .. usr .. '&title=' .. ttl .. '&message=' .. msg .. '&priority=' .. tostring(prio) .. '&sound=' .. tostring(snd) .. '&device=' .. dvc
    -- Pushover request
    self.http:request("https://api.pushover.net/1/messages.json", {
        options = {
            data = json.encode(requestBody),
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json",
                ["Accept"] = "application/json",
                ["Authorization"] = "Basic XXX"
            }
        },
        success = function(response) 
            self:debug(response.status)
            self:debug(response.data)
        end,
        error = function(message)
            self:debug("error:", message)
        end
    })
end

function QuickApp:turnOff()
    self:debug("binary switch turned off")
    self:updateProperty("value", false)    
end

function QuickApp:onInit()
    self:debug("onInit")
    self.http = net.HTTPClient({timeout=3000})
end

 

Lien vers le commentaire
Partager sur d’autres sites

Et avec un 

Content-Type: application/x-www-form-urlencoded

Avec le requestbody aggregé au message.json ?

 

requestBody = 'token=' .. tkn .. '&user=' .. usr .. '&title=' .. ttl .. '&message=' .. msg .. '&priority=' .. tostring(prio) .. '&sound=' .. tostring(snd) .. '&device=' .. dvc

 

car ton requestBody c'est de l'url et pas un Payload encodable en json.

 

Tu peux faire les deux, il faut juste choisir ;)

 

Je pense que l' API est correctement documenter sur le site, tu as été vérifier ?

Lien vers le commentaire
Partager sur d’autres sites

Alors... J'ai changé le Content-Type mais j'arrive au même résultat, avec la même sortie (application token is invalid)

 

Pour le debug, je ne suis pas vraiment certain où je dois le mettre :huh: J'ai mis ça comme ça (mais pas plus d'info en sortie) : 

self.http:request("https://api.pushover.net/1/messages.json", {
        options = {
            data = json.encode(requestBody),
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json",
                ["Accept"] = "application/json",
                ["Authorization"] = "Basic XXX"
            }
        },        
        success = function(response) 
            self:debug(response.status)
            self:debug(response.data)
            fibaro.debug(json.encode(requestBody))
        end,
        error = function(message)
            self:debug("error:", message)
            fibaro.debug(json.encode(requestBody))
        end
    })
 
Lien vers le commentaire
Partager sur d’autres sites

juste après la création de la chaine

 

requestBody = 'token=' .. tkn .. '&user=' .. usr .. '&title=' .. ttl .. '&message=' .. msg .. '&priority=' .. tostring(prio) .. '&sound=' .. tostring(snd) .. '&device=' .. dvc
self:debug(json.encode(requestBody))

 

Lien vers le commentaire
Partager sur d’autres sites

il y a 20 minutes, Krikroff a dit :

car ton requestBody c'est de l'url et pas un Payload encodable en json.

 

tu penses à le mettre directement dans l'URL ?

 

self.http:request("https://api.pushover.net/1/messages.json?"..'token=' .. tkn .. '&user=' .. usr .. '&title=' .. ttl .. '&message=' .. msg .. '&priority=' .. tostring(prio) .. '&sound=' .. tostring(snd) .. '&device=' .. dvc, {

 

Lien vers le commentaire
Partager sur d’autres sites

    local settings = {
        -- Application's API token
        token = "xxxxxxxxxxxx",
        -- User key
        user = "xxxxxxxxxxxxx",
        -- Device (optional)
        device = "",
        -- Title (optional)
        title = "",
        -- Priority
        priority = "0",
        -- Pushover sound (default)
        sound = "pushover",
        -- MEssage
        message = ""
    }
    settings.title = "HC3 Push"
    settings.message = "Push depuis mon HC3"
    settings.priority = "1"
    local http = net.HTTPClient({ timeout = 5000 })
    local payload = json.encode(settings)
	http:request("https://api.pushover.net/1/messages.json", {
        options = {
            headers = {
                ["content-type"] = "application/json;charset=UTF-8"
            },
            method = "POST",
            data = payload
        },        
        success = function(status)            
            if (tonumber(status.status) == 200) then
                print("success")
            end
        end,
		error = function(error)
            print(error)
        end
	})

Voila :)

 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

il y a 8 minutes, Krikroff a dit :

    local settings = {
        -- Application's API token
        token = "xxxxxxxxxxxx",
        -- User key
        user = "xxxxxxxxxxxxx",
        -- Device (optional)
        device = nil,
        -- Title (optional)
        title = nil,
        -- Priority
        priority = "0",
        -- Pushover sound (default)
        sound = "pushover"
    }
    local http = net.HTTPClient({ timeout = 5000 })
    local payload = json.encode(settings)
	http:request("https://api.pushover.net/1/messages.json", {
        options = {
            headers = {
                ["content-type"] = "application/json;charset=UTF-8"
            },
            method = "POST",
            data = payload
        },        
        success = function(status)            
            if (tonumber(status.status) == 200) then
                print("success")
            end
        end,
		error = function(error)
            print(error)
        end
	})

Voila :)

 

OH MY GOD ! Tu es mon sauveur !!! 

 

Un grand **GRAND** merci à toi, fonctionne impeccable :13:

 

Merci aussi jjacques68. 

 

Vous êtes au TOP !

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

à l’instant, Krikroff a dit :

Je viens de mettre à jour car il me semble de mémoire que sans le champ message cela ne fonctionne pas ;)

J'ai bien reçu le push au premier essai. J'ai juste rajouté mon Title et Device. 

 

Vous êtes géniaux les mecs ))) !

Lien vers le commentaire
Partager sur d’autres sites

J'ai remis à jour le code sur le post précédent avec le message et tu peux modifier les valeur du settings... ensuite tu dispatch tout cela comme tu veux dans ton QA pour faire un truc propre :)

 

Lien vers le commentaire
Partager sur d’autres sites

Lol quand j’ai vu comment tourne la version réécrite de mon VD Sonos en QA sur HC3 tu m’étonnes je n’ai pas de doutes, c’est le jour et la nuit ! Et ce n’est qu’un début vu ce que nous réserve les QA


Envoyé de mon iPhone en utilisant Tapatalk

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...