[Résolu] DzVents - domoticz.openURL({---}) est bloqué

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Répondre
Keros
Messages : 3766
Enregistré le : 23 juil. 2019, 20:57

[Résolu] DzVents - domoticz.openURL({---}) est bloqué

Message par Keros »

Bonjour,

J'essaye de récupérer les infos de https://particulier.edf.fr/services/res ... 2022-10-01 via un script Dzvents :

Code : Tout sélectionner

    if (item.isTimer) then
        domoticz.openURL({
            url = 'https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2022-10-01',
            callback = 'HTTPResponse'
        })
    end

    -- Traitement de la réponse
    if (item.isHTTPResponse) then
        domoticz.log('Réponse reçue : '..item.data, domoticz.LOG_FORCE)
        if (item.ok) then
            local jsonValeur = domoticz.utils.fromJSON(item.data)
            local couleur = jsonValeur.couleurJourJ1
            domoticz.log('Demain : '..couleur, domoticz.LOG_FORCE)   
        end
    end
Cela me donne ces erreurs dans les logs :
2022-10-01 21:40:32.724 Status: dzVents: Info: Script: ------ Start internal script: Script: Timer
2022-10-01 21:40:32.724 Status: dzVents: Debug: Script: OpenURL: url = https://particulier.edf.fr/services/res ... 2022-10-01
2022-10-01 21:40:32.724 Status: dzVents: Debug: Script: OpenURL: method = GET
2022-10-01 21:40:32.725 Status: dzVents: Debug: Script: OpenURL: post data = nil
2022-10-01 21:40:32.725 Status: dzVents: Debug: Script: OpenURL: headers = nil
2022-10-01 21:40:32.725 Status: dzVents: Debug: Script: OpenURL: callback = HTTPResponse
2022-10-01 21:40:32.725 Status: dzVents: Info: Script: ------ Finished Script
2022-10-01 21:40:33.551 Status: dzVents: Info: Script: ------ Start internal script: Script: HTTPResponse
2022-10-01 21:40:33.555 Status: dzVents: !Info: Script: Réponse reçue : <HTML><HEAD>
2022-10-01 21:40:33.555 <TITLE>Access Denied</TITLE>
2022-10-01 21:40:33.555 </HEAD><BODY>
2022-10-01 21:40:33.555 <H1>Access Denied</H1>
2022-10-01 21:40:33.555
2022-10-01 21:40:33.555 You don't have permission to access "http&#58;&#47;&#47;particulier&#46;edf&#46;fr&#47;services&#47;rest&#47;referentiel&#47;searchTempoStore&#63;" on this server.<P>
2022-10-01 21:40:33.555 Reference&#32;&#35;18&#46;8cc51102&#46;1664653233&#46;1a2c7d3d
2022-10-01 21:40:33.555 </BODY>
2022-10-01 21:40:33.555 </HTML>
2022-10-01 21:40:33.555
2022-10-01 21:40:33.555 Status: dzVents: Info: Script: ------ Finished
2022-10-01 21:40:33.464 Error: Error opening url: https://particulier.edf.fr/services/res ... 2022-10-01
2022-10-01 21:40:33.551 Error: dzVents: Error: (3.1.8)Script: HTTP/2 response: 403 ==>> No reason returned!

Je me fais jeter par le serveur :cry:

Pourtant, si je fais directement :

Code : Tout sélectionner

        json = (loadfile "/JSON.lua")()
      command = "curl -A 'Wget/1.20.3 (linux-gnu)' " .. '"' .. "https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2022-10-01" .. '"'
      
      config=assert(io.popen(command))
      blocjson = config:read('*all')
      config:close()
      jsonValeur = json:decode(blocjson)
      
      local couleur = jsonValeur.couleurJourJ1
    domoticz.log('Demain : '..couleur, domoticz.LOG_FORCE)
Le script fonctionne est l'info est récupérée :
dzVents: !Info: : Demain : TEMPO_BLEU

:arrow: D'une façon, c'est ok, mais pas de l'autre.

L'utilisation du HTTPResponse me permet d'éviter les erreurs avec un temps d'exécution supérieur à 10s.

Quelle est la différence entre ces deux appels ? Y a t'il un moyen de rendre le domoticz.openURL({---}) fonctionnel dans ce cas ?

Merci d'avance.

hestia
Messages : 332
Enregistré le : 12 sept. 2018, 22:36

Re: [DzVents] domoticz.openURL({---}) est bloqué

Message par hestia »

Bonjour Keros
je n'ai pas la raison du pourquoi du comment,
mais voici une solution qui fonctionne et répond aux exigences: avoir le réponse sans bloquer l'event management
The second way is different. Instead of passing a command you pass in a table with the command to be executed and a callback trigger which is just a string or a name:

return {
on = { ... }, -- some trigger
execute = function(domoticz)
domoticz.executeShellCommand({
command = 'some shell command',
callback = 'mycallbackstring',
timeout = timeoutinseconds,
})
end
}
In this case, Domoticz will execute the command and when done it will trigger an event. dzVents will capture that event and will execute all scripts listening for this callback trigger (mycallbackstring):

return {
on = {
shellCommandResponses = { 'mycallbackstring' }
},
execute = function(domoticz, response)
if response.ok then
if (response.isJSON) then
domoticz.log(response.json.some.value)
end
else
domoticz.log('There was an error', domoticz.LOG_ERROR)
end
end
}

Code : Tout sélectionner

LOGGING = domoticz.LOG_DEBUG
LOG_LEVEL = domoticz.LOG_DEBUG

local HTTPCALLBACK='EDF'

return {
    logging =   {   level   =   LOGGING,
	            },
	on = {

		devices = {1267},
        shellCommandResponses = {HTTPCALLBACK}
		},

	execute = function(domoticz, item)
	_G.logMarker =  domoticz.moduleLabel
	
    if item.isDevice then
    	local arg_url='https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2022-10-01'
        local command = 'curl "' .. arg_url .. '"'
        domoticz.log(command)

        domoticz.executeShellCommand({
            command = command,
            callback = HTTPCALLBACK,
            timeout = 9,
                        })


    -- Traitement de la réponse
    else
    
        domoticz.log('Réponse reçue')
        domoticz.log('Réponse reçue : '.. item.data)
        if (item.ok) then
            local jsonValeur = domoticz.utils.fromJSON(item.data)
            local couleur = jsonValeur.couleurJourJ1
            domoticz.log('Demain : '..couleur, domoticz.LOG_FORCE)
        else
        domoticz.log('Réponse KO : '..item.data, domoticz.LOG_FORCE)            
            
        end
    end

end
} 
 

Keros
Messages : 3766
Enregistré le : 23 juil. 2019, 20:57

Re: [DzVents] domoticz.openURL({---}) est bloqué

Message par Keros »

Merci Hestia.

L'idée est donc de faire le callback sur la commande Curl et non l'appel HTTP.

hestia
Messages : 332
Enregistré le : 12 sept. 2018, 22:36

Re: [DzVents] domoticz.openURL({---}) est bloqué

Message par hestia »

oui,
vu que je n'ai pas compris pourquoi le fonctionnement est différent (je ne connais pas grand chose en http il est vrai!)

Ce que je fais plutôt maintenant c'est un shell qui appelle dz sur la réponse, comme cela je suis sûr de ne pas bloquer l'event management de dz

Keros
Messages : 3766
Enregistré le : 23 juil. 2019, 20:57

Re: [DzVents] domoticz.openURL({---}) est bloqué

Message par Keros »

C'est pour ça que je voulais garder ce fonctionnement en 2 temps.

Le script fonctionne, c'est nickel. Merci ;)

Répondre