Lire erreur fichier log dans script lua

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 <\>.
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Lire erreur fichier log dans script lua

Message par Sherco49 »

Bonjour

J'ai Domoticz installé avec docker sur un Synology, et quelques interrupteurs espEasy qui communiquent en wifi.
Il arrive que la commande http ne passe pas, le récepteur ne change pas d'état, j'ai un message d'erreur dans le log et le bouton de commande de Domoticz lui change bien d'état.
Au final, je me trouve avec une information On dans Domoticz, alors que le récepteur est toujours à Off.
J'utilise des commandes du type http://192.168.xxx.xxx/control?cmd=GPIO,4,1 et espEasy doit me renvoyer une réponse OK/NOK que lit Domoticz
Quand la requête foire, j'ai immédiatement un message d'erreur du type
2022-08-24 10:24:46.762 Error: Error opening url: http://192.168.xxx.xxx/control?cmd=GPIO,4,1

De mes recherches, j'ai vu des solutions allant chercher des commandes externes à Domoticz, mais ne sachant pas manipuler les "curl" sous synology/Docker, DzVents ne fonctionnant pas avec mon installation, je cherche à vérifier que la commande à réussi en lisant le log de domoticz avec Lua.
Est-il possible de lire le log avec une requete JSON du type
/json.htm?type=command&param=getlog&lastlogtime=LASTLOGTIME&loglevel=LOGLEVEL
avec un script lua ?
Si je dois charger le fichier Json.lua pour decoder le Json, peut-on me dire ou le trouver sur une installation Docker/Synology ?
Merci de votre aide
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Lire erreur fichier log dans script lua

Message par Keros »

Analyser les logs me semble compliqué.

Regarde peut-être en DzVents, tu peux faire de la gestion d'erreur sur des requêtes http.
Tu peux également regarder en utilisant du MQTT : tu auras le retour d'info.
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
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Re: Lire erreur fichier log dans script lua

Message par Sherco49 »

Bonjour, merçi de la réponse
Je n'ai pas réussi à faire fonctionner DzVents sur mon installation, par contre le MQTT peut être une piste, même si ma dernière tentative Synology/Docker/Mosquitto n'a pas été franchement réussie...
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Lire erreur fichier log dans script lua

Message par Keros »

Pardon oui, j'ai perdu de l'idée que tu avais un souci avec DzVents. Désolé.
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: Lire erreur fichier log dans script lua

Message par denis_brasseur »

Sherco49 a écrit : 24 août 2022, 11:40 Est-il possible de lire le log avec une requete JSON du type
/json.htm?type=command&param=getlog&lastlogtime=LASTLOGTIME&loglevel=LOGLEVEL
avec un script lua ?
OUi, il est tout a fait possible de lire les logs pour ensuite enchaine une action.
Voici la fonction que j'utilise, il te faudra évidement l'adapter (définition des variables curl et domoticzURL)

Code : Tout sélectionner

function lastLogEntry(loglevel)
    local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getlog'..loglevel..'"'))
    local list = rid:read('*all')
    rid:close()
    local tableau = json:decode(list).result
    if tableau ~= nil then
        return tableau
    else
        tableau = {}
        return tableau
    end
end
Et voici un exemple d'utilisation de cette fonction depuis un script lua de type time

Code : Tout sélectionner

    LastLogTime = os.time() - 61
    for n, line in ipairs(lastLogEntry('&lastlogtime='..LastLogTime..'&loglevel=268435455')) do
        if line['message'] ~= '' then
                if string.match(line['message'], "message a personnaliser") then  
                       --action a définir
                end
        end
end
SI besoin d'aide, n'hésites pas
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Re: Lire erreur fichier log dans script lua

Message par Sherco49 »

Bonjour, et merçi pour la solution.
J'ai fais un exemple de script à partir de ton code, et j'ai trouvé comment définir le chemin de curl.
Par contre , j'ai le message d'erreur suivant:

Code : Tout sélectionner

EventSystem: in test curl: [string "function lastLogEntry(loglevel) ..."]:2: attempt to concatenate a nil value (global 'domoticzURL')
je comprends qu'il me dit que je tente de concaténer une valeur non définie qui serait domoticzURL, alors que je la définit.
en mettant directement l'IP dans la commande curl, j'ai le message d' erreur.

Code : Tout sélectionner

Error: EventSystem: in test curl: [string "function lastLogEntry(loglevel) ..."]:2: attempt to concatenate a nil value (global 'curl')
mon code:

Code : Tout sélectionner

function lastLogEntry(loglevel)
    local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getlog'..loglevel..'"'))
    local list = rid:read('*all')
    rid:close()
    local tableau = json:decode(list).result
    if tableau ~= nil then
        return tableau
    else
        tableau = {}
        return tableau
    end
end

local curl = '/usr/bin/curl'
local domoticzURL='http://192.168.1.20'

LastLogTime = os.time() - 61
for n, line in ipairs(lastLogEntry('&lastlogtime='..LastLogTime..'&loglevel=268435455')) do
    if line['message'] ~= '' then
            if string.match(line['message'], "RF433: RFXMeter (Cuve fioul)") then  
                   print("coucou")
            end
    end
end
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Lire erreur fichier log dans script lua

Message par denis_brasseur »

Il manque le port dans domoticzURL
exemple

Code : Tout sélectionner

local domoticzURL='http://192.168.1.20:8060'
Tu peux aussi écrire en dur dans la fonction les valeurs de domoticzURL et curl, je pense qu'il ne trouve pas les 2 variables, a définir dans la fonction peut etre.
Cela donne ceci chez moi :

Code : Tout sélectionner

local rid = assert(io.popen('/usr/bin/curl -m 15'..'"http://192.168.1.111:8099/json.htm?type=command&param=getlog'..loglevel..'"'))
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Re: Lire erreur fichier log dans script lua

Message par Sherco49 »

Effectivement, je ne maitrise pas correctement la portée des variables....
En mettant dans la fonction la définition de curl et de l'adresse Domoticz, je n'ai plus le même message d'erreur :?
Maintenant, c'est la commande Json.decode qu'il ne comprends pas.
Ce que je comprends, c'est qu'il faut charger une fois la bibliothèque Json.lua avec la commande :

Code : Tout sélectionner

JSON = assert(loadfile "JSON.lua")()
Pouvez vous m'aider à charger cette librairie sur mon système ? (Synology/Docker/Domoticz) ?
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Lire erreur fichier log dans script lua

Message par Keros »

J'ai ceci comme exemple :

Code : Tout sélectionner

--Sélectionner le chemin vers votre fichier JSON.lua en enlevant les dé commentant  la ligne pour votre système d'exploitation

--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
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
Sherco49
Messages : 46
Inscription : 18 mars 2018, 16:29

Re: Lire erreur fichier log dans script lua

Message par Sherco49 »

merci pour l'exemple, il correspond à ce que j'ai deviné en continuant mes recherches. (j'ai trouvé cette page: https://easydomoticz.com/lua-et-json/
La version Docker de Domoticz installée n'a pas le fichier JSON.lua en natif, j'ai fait un find à partir de la racine, rien... ( find ne s'occupe pas des droits ou des fichiers cachés ?)

J'ai chargé le fichier JSON.lua dans le répertoire /volume1/docker/domoticz/userdata/scripts/lua, et ai mis le chemin dans mon code, mais...

Code : Tout sélectionner

cannot open /volume1/docker/domoticz/userdata/scripts/lua/JSON.lua: No such file or directory
j'ai rajouté "assert" devant loadfile, sans celà il y a une erreur "attempt to call a nil value"
Ou est mon erreur sur le chemin du fichier ? ou y a t il des soucis avec les permissions ? toute l'arborescence est avec mon ident comme owner

Code : Tout sélectionner

function lastLogEntry(loglevel)
    local curl = '/usr/bin/curl'
local domoticzURL='http://192.168.1.20:8080'
    local rid = assert(io.popen(curl..'"'..domoticzURL..'/json.htm?type=command&param=getlog'..loglevel..'"'))
    local list = rid:read('*all')
    rid:close()
    local tableau = json:decode(list).result
    if tableau ~= nil then
        return tableau
    else
        tableau = {}
        return tableau
    end
end

json = assert(loadfile "/volume1/docker/domoticz/userdata/scripts/lua/JSON.lua")()

LastLogTime = os.time() - 61
for n, line in ipairs(lastLogEntry('&lastlogtime='..LastLogTime..'&loglevel=268435455')) do
    if line['message'] ~= '' then
            if string.match(line['message'], "RF433: RFXMeter (Cuve fioul)") then  
                   print("coucou")
            end
    end
end
Dernière modification par Sherco49 le 25 août 2022, 12:18, modifié 2 fois.
Répondre