Connaitre le délai restant (du délai allumage / extinction automatique)

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 <\>.
Tintin77
Messages : 9
Inscription : 19 août 2023, 14:57

Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Tintin77 »

Bonjour,

Je cherche à connaitre le délai d'allumage et le délai d'extinction restant pour un device.

L'objectif est d'être notifié quelques minutes avant qu'un appareil ne s'éteigne automatiquement (via l'option "Délai d'extinction" du device).

Savez-vous comment Domoticz détermine cette information ?

Il me semble possible de calculer cette information en utilisant la date de dernière mise à jour du device, son statut, et l'horodatage actuel. Voyez-vous une méthode plus simple ?

Merci d'avance pour votre aide !
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Keros »

Bonjour Tintin77 et bienvenu sur le forum :)

Je ne connais pas fonction native dans DomoticZ permettant de faire ce que tu souhaites.
Néanmoins, oui, via un script, tu dois pouvoir faire cette détermination du délai avant extinction.

Il serait possible, via un script de paramétrer l'envoi d'une notification avec un délai Temps -X minutes mais ça peut vite devenir compliqué si la minuterie peut être relancée.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Tintin77
Messages : 9
Inscription : 19 août 2023, 14:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Tintin77 »

Merci Keros pour votre retour.

J'ai tenté de réaliser un script, lancé toutes les minutes. Il me reste encore quelques réglages à affiner. Notamment de récupérer la valeur du paramètre "delais exctinction" [AddjValue]. Car c'est l'un des rares paramètres non disponible avec Dzevent... Dommage !
En attendant je suis obligé de passer par une variable utilisateur mais c'est moins pratique.


Pour info si qqn à une idée, voici l'information que je chercher à récupérer :

Requête : http://192.168.1.10:8080/json.htm?type=devices&rid=254
Résultat :
{
"ActTime" : 1322519236,
"ServerTime" : "2023-08-20 10:13:56",
"app_version" : "2023.1",
"result" :
[
{
"AddjMulti" : 1.0,
"AddjMulti2" : 1.0,
"AddjValue" : 10800.0,
"AddjValue2" : 0.0,
"BatteryLevel" : 255,
"CustomImage" : 2,
"Data" : "Off",
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Keros »

La donnée est dans un Json que tu peux récupérer dans ton script. Tu peux regrader comment faire avec mon tuto OpenWeatherMap (lien dans ma signature).

Je déplace ton sujet dans la section dédiée aux script.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par denis_brasseur »

Je partage une fonction de mon fichier modules.lua permettant de récupérer les valeurs d'un dispositif

Code : Tout sélectionner

curl = '/usr/bin/curl -m 15 '   -- ne pas oublier l'espace à la fin
domoticzIP = '192.168.1.xxx'
domoticzPORT = '80yy'
domoticzURL = 'http://'..domoticzIP..':'..domoticzPORT


function jsonInfos(device)
	local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getdevices&rid='..otherdevices_idx[device]..'"'))
    local list = rid:read('*all')
    rid:close()
    return json:decode(list).result[1]
end

Code : Tout sélectionner

--récupèrer les infos json du périphérique
-- usage
local device = jsonInfos('mon device')
-- print(device.Name)
-- print(device.Status)
print(device.AddjValue)
-- etc..
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Tintin77
Messages : 9
Inscription : 19 août 2023, 14:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Tintin77 »

Merci ! C'est exactement ce qu'il me manque. Mais je n'arrive pas à le faire fonctionner :-( je pense que le problème vient du fait que mon script est fait dans Dzvents, et non dans un fichier lua :-((

J'ai temporairement simplifié pour me faciliter le débogage, mais je ne trouve pas comment remplacer la commande json de toute façon. retour à la case départ...

Code : Tout sélectionner

function jsonInfos(device)
    --local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getdevices&rid='..device..'"'))
    rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=devices&rid=435"'))
    local list = rid:read('*all')
    rid:close()
    return json:decode(list).result[1] << ligne 17
end
2023-08-22 15:55:26.753 Error: dzVents: Error: (3.1.8) : An error occurred when calling event handler AUTO_OFF_ALERT_TEST
2023-08-22 15:55:26.753 Error: dzVents: Error: (3.1.8) : ...cripts\dzVents\generated_scripts/AUTO_OFF_ALERT_TEST.lua:17: attempt to index a nil value (global 'json')
2023-08-22 15:55:28.315 zWave com6: Usage (Unknown)
Dernière modification par Keros le 22 août 2023, 17:09, modifié 1 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Keros »

tu as bien le "json load file ..." dans ton script ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Tintin77
Messages : 9
Inscription : 19 août 2023, 14:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Tintin77 »

Bonjour, Je ne sais pas à quoi vous faites allusion. Je n'ai rien qui ressemble à ça dans mon script en tout cas.

Je ne sais pas dans quelle mesure avoir tout le code peux aider à répondre à cette question :

Code : Tout sélectionner

return {
	on = {
		devices = {
			'Chime'
		}
	},

	logging = {
		level = domoticz.LOG_INFO,
		marker = 'ALERTE AUTO-OFF TEST >>> ',
	},
	
	execute = function(domoticz, timer)

    -- TEST API  -----------------------------------------------------------------------------------------
    curl = '/usr/bin/curl -m 15 '   -- ne pas oublier l'espace à la fin
    domoticzIP = '192.168.1.xx'
    domoticzPORT = '80xx'
    domoticzURL = 'http://'..domoticzIP..':'..domoticzPORT
    
    function jsonInfos(device)
        --local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getdevices&rid='..device..'"'))
        rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=devices&rid=35"'))
        local list = rid:read('*all')
        rid:close()
        return json:decode(list).result[1]
    end

    --récupèrer les infos json du périphérique
    -- usage
    local device = jsonInfos('Switch-Lumiere1')
    -- print(device.Name)
    -- print(device.Status)
    print(device.AddjValue)
    -- etc..
    -- TEST API -----------------------------------------------------------------------------------------

        function TempsRestantAutoOff(zDevice, zDeviceAlerte, zVariable, zCompteur)
        	if domoticz.devices(zDevice).state == 'On' then 
        		zDelai_off = domoticz.variables('exctinction_tv').value 
        		zDelai_off = zDelai_off / 60
        		zlastUpdate = domoticz.devices(zDevice).lastUpdate.minutesAgo
                zTempsRestant = zDelai_off - zlastUpdate
            	domoticz.log(zDevice.." - Variable delai d'exctinction automatique : "..zDelai_off..' minutes')
                domoticz.log(zDevice..' - Temps restant avant exctinction :      '..zTempsRestant..' minutes')
                domoticz.variables(zVariable).set(zTempsRestant)
                domoticz.devices(zCompteur).updateCounter(zTempsRestant)
                if (zTempsRestant == zMinAvantAlerte) then 
                    domoticz.log('Il reste 10 minutes ! Alerte déclenchée')
                    domoticz.devices(zDeviceAlerte).toggleSwitch().forSec(3).repeatAfterSec(3, 3)
                end
            else
                domoticz.log(zDevice..' est éteint. Rien à faire.')
                domoticz.variables(zVariable).set(0)
                domoticz.devices(zCompteur).updateCounter(0)
            end
            
        end   

	zDevice = 'Switch-Lumiere1' 
	zDeviceAlerte = 'Switch-Lumiere2' 
	zVariable = 'exctinction_tv_tps_restant_test' 
	zCompteur = 'Tps restant test' 
	zMinAvantAlerte = 10
        local OnLanceLafonction = TempsRestantAutoOff(zDevice, zDeviceAlerte, zVariable, zCompteur)
Dernière modification par Keros le 22 août 2023, 17:41, modifié 1 fois.
Raison : Ajout des balises code
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Keros »

Il te manque la brique pour intégrer la fonction permettant de décortiquer les Json.
Regrde mon Tuto sur OpenWeatherMAp, c'est dedans (en plus cette commande dépend de ton système).
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Tintin77
Messages : 9
Inscription : 19 août 2023, 14:57

Re: Connaitre le délai restant (du délai allumage / extinction automatique)

Message par Tintin77 »

Merci pour cette précision. J'ai essayé de tout reprendre depuis le début, en m'inspirant de votre cote, et avec l'api openweather dans un premier temps, mais je n'arrive pas non plus à le faire fonctionner.

C'est toujours la même erreur, au niveau de cette ligne : "temp = jsonValeur.current.temp"

2023-08-22 18:15:42.693 Error: dzVents: Error: (3.1.8) ALERTE AUTO-OFF TEST >>> : An error occurred when calling event handler AUTO_OFF_ALERT_TEST
2023-08-22 18:15:42.693 Error: dzVents: Error: (3.1.8) ALERTE AUTO-OFF TEST >>> : ...cripts\dzVents\generated_scripts/AUTO_OFF_ALERT_TEST.lua:27: attempt to index a nil value (global 'jsonValeur')

return {
on = {
devices = {
'Chime', 'DO1open'
}
},

logging = {
level = domoticz.LOG_INFO,
marker = 'ALERTE AUTO-OFF TV TEST >>> ',
},

execute = function(domoticz, timer)


api = 'xx'
lat = 'xx'
long = 'xx'

json = (loadfile "scripts/lua/JSON.lua")() -- Relative path for most systems

config=assert(io.popen('/usr/bin/curl "https://api.openweathermap.org/data/2.5 ... its=metric"'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)

temp = jsonValeur.current.temp <<< LIGNE 27

Print(temp)



J'ai testé l'appel en directe de l'API openweather qui fonctionne bien avec l'URL indiquée :

{
"lat": ,
"lon": ,
"timezone": "Europe/Paris",
"timezone_offset": 7200,
"current": {
"dt": ,
"sunrise": ,
"sunset": ,
"temp": 303.38,
"feels_like": 304.07,
"pressure": 1019,
"humidity": 47,
"dew_point": 290.82,
"uvi": 1.71,
"clouds": 0,
"visibility": 10000,
"wind_speed": 3.13,
"wind_deg": 60,
"wind_gust": 3.13,
"weather": [
{
"id": 800,
"main": "Clear",
"description": "ciel dégagé",
"icon": "01d"
}
]
},
"minutely": [
{
"dt": 1692721080,
"precipitation": 0
},
{
Répondre