Page 1 sur 2

Lire erreur fichier log dans script lua

Publié : 24 août 2022, 11:40
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

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 12:02
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.

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 12:13
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...

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 12:23
par Keros
Pardon oui, j'ai perdu de l'idée que tu avais un souci avec DzVents. Désolé.

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 17:02
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

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 18:31
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

Re: Lire erreur fichier log dans script lua

Publié : 24 août 2022, 22:36
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..'"'))

Re: Lire erreur fichier log dans script lua

Publié : 25 août 2022, 09:28
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) ?

Re: Lire erreur fichier log dans script lua

Publié : 25 août 2022, 09:57
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

Re: Lire erreur fichier log dans script lua

Publié : 25 août 2022, 10:08
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