[DzVents] Voyant EJP

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

hi,
Bien vu pour le fichier JSON.lua > ;)

Pour le reste du log je ne vois pas trop d'erreurs, mais ça ne ressemble pas non plus a ce que j'ai dans réglages/log/status : > je comprends pas!

En réglages/paramètres/autre/dzvents, je suis en: Errors + minimal execution infos + generic info > Ok, ça c'est fait.

J'imagine que aucuns des 3 capteurs virtuels ne se mettent a jour c'est bien ça? > C'est ça!
1.png
1.png (60.21 Kio) Consulté 8046 fois
Actuellement le script ne se lance qu'une fois par heure, si tu veux toutes les minutes pour debugger, tu peux changer ces 2 lignes 83 et 84 comme ceci: > Sauf erreur de ma part je pense que c'est déjà comme ça dans ton script ver. 1.2 :) .

Bon merci quand même.
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message par petrapi »

Désolé que ça ne fonctionne pas.

Par "réglages/log/status" je voulais dire dans la page log de dz, accessible par les menus réglages puis log, il y a 3 onglets tout/statut/erreur, et l'exemple de log que j'ai posté provient de l'onglet statut.

Les 3 capteurs semblent ok.

Lignes 83 et 84, dans le script 1.2 c'est 1 lancement par heure:

Code : Tout sélectionner

--timer = { 'every minute' }
timer = { 'every hour' }
Et si tu veux qu'il se lance toutes les minutes c'est bien ( '--' met la ligne en commentaire):

Code : Tout sélectionner

timer = { 'every minute' }
--timer = { 'every hour' }
As tu configuré un login? je crois que pour que dzVents fonctionne il faut autoriser localhost sans mot de passe:
Dans le menu réglages/système: "Réseaux locaux (pas d'identification):" Tu peux ajouter 127.0.0.1

Bon courrage
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

bonjour,

Bon il se passe bien quelque chose....mais les capteurs ne semblent pas se mettre à jour.
les logs,
"2018-08-11 10:21:00.152 dzVents: Info: ------ Start internal script: Gestion_EJP:, trigger: every minute
2018-08-11 10:21:01.640 dzVents: Debug: Device-adapter found for EJP Aujourdhui: Alert sensor adapter
2018-08-11 10:21:01.658 dzVents: Debug: Processing device-adapter for EJP Aujourdhui: Alert sensor adapter
2018-08-11 10:21:01.659 dzVents: Debug: Device-adapter found for EJP Demain: Alert sensor adapter
2018-08-11 10:21:01.659 dzVents: Debug: Processing device-adapter for EJP Demain: Alert sensor adapter
2018-08-11 10:21:01.659 dzVents: Debug: Device-adapter found for EJP Restant: Custom sensor device adapter
2018-08-11 10:21:01.660 dzVents: Debug: Processing device-adapter for EJP Restant: Custom sensor device adapter
2018-08-11 10:21:01.660 dzVents: NON_EJP
2018-08-11 10:21:01.660 dzVents: curl -s "https://particulier.edf.fr/bin/edf_rc/s ... 2018-08-11"
2018-08-11 10:21:01.660 dzVents: curl -s "https://particulier.edf.fr/services/res ... chType=ejp"
2018-08-11 10:21:01.660 dzVents: Info: ------ Finished Gestion_EJP "
Est ce que le script doit s’appeler "Gestion_EJP" ou "Gestion_EJP.lua" ou est ce que ça n'a pas d'importance?

derniers points,
--Edf
local URLhisto ="https://particulier.edf.fr/services/res ... chType=ejp" > Ok revoie quelque chose
local URLparams ="https://particulier.edf.fr/services/res ... _PROPERTY=" > renvoie une erreur si on met cette url directement dans l'explorateur!
local URLetat ="https://particulier.edf.fr/bin/edf_rc/s ... _remonter="> renvoie aussi une erreursi on met cette url directement dans l'explorateur!
local EJPok ="EST_EJP" > est ce là qu'il faut régler la région?

Merci
Pièces jointes
1.png
1.png (53.46 Kio) Consulté 8024 fois
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message par petrapi »

Ah cool tes 3 capteurs sont bien mis a jour!
En fait ils se mettent a jour seulement si les valeurs affichées sont différentes de celles récupérées.
Tu peux essayer de mettre des valeurs bidon dans tes capteurs, et tu verras qu'ils se mettront a jour lors du prochain lancement de script.

Pour le nom du script tu peux mettre ce que tu veux oui, aucune importance.

Pour régler ta région c'est plutôt ici (pour moi c'est sud):

Code : Tout sélectionner

local zone      ='sud'              -- Zone ejp concernée
Les url de la section constantes ne sont pas entiers, ils sont complétés par le script, par exemple:
local URLetat ="https://particulier.edf.fr/bin/edf_rc/s ... _remonter="
Dans ton log ça devient:
2018-08-11 10:21:01.660 dzVents: curl -s "https://particulier.edf.fr/bin/edf_rc/s ... 2018-08-11"

Bonne journée :)
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

Ok, bon be c'est cool alors.
moi aussi c'est Sud.
merci et @ bientôt.
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

Bonjour,
EDF n'a t'il pas changé quelque chose sur leur site ?
Le voyant EJP m'affiche maintenant "EJP restant : 0"
CI dessous le retour des logs

2018-11-14 07:59:00.428 Error: dzVents: Error: An error occured when calling event handler Gestion_EJP
2018-11-14 07:59:00.429 Error: dzVents: Error: /volume1/@appstore/domoticz/var/scripts/lua/JSON.lua:1009: /volume1/@appstore/domoticz/var/scripts/lua/JSON.lua:660: can't parse JSON at char 1 of: �

Image

Merci,
Cdt
Pièces jointes
EJP.png
EJP.png (25.41 Kio) Consulté 7671 fois
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message par petrapi »

Bonjour Nene,

Effectivement il a du y avoir des modifs sur le site edf (et ça doit être aussi pour ça que ça affichait -22 en hors saison ejp).
la page semble remonter le total des 2 dernières années.

J'ai donc remplacé la ligne 99:

Code : Tout sélectionner

local NbPass = jsonEtat[MajZone]['Total']
par:

Code : Tout sélectionner

local NbPass = jsonEtat[MajZone]['TotalCurrentPeriod']
En espérant que ça fonctionne, a vérifier dès qu'il y aura une journée ejp ;)

J’espère que ça résoudra aussi tes erreurs dans le log, mais j'ai des doutes.
Merci pour ton retour, a++
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

Bonsoir,
Tout à l'air d'être rentré dans l'ordre. A priori je n'ai plus d'erreurs dans le journal.
Super!
Maintenant on va vite être fixé :)
Bonne soirée et merci encore
JP
Pièces jointes
log_1.png
log_1.png (23.28 Kio) Consulté 7596 fois
log.png
log.png (71.03 Kio) Consulté 7596 fois
Paldor
Messages : 64
Inscription : 06 mai 2019, 16:54

Re: Voyant EJP

Message par Paldor »

Bonjour petrapi, je me lance dans Domoticz est je suis intéresser par ton code lua pour EJP j'ai mis ton code dans Domoticz
Réglage/Plus d'options/Evénements

Code : Tout sélectionner

--[[ 

Ce script récupère les infos EJP et met a jour 3 dummy sensor seulement si necessaire.

version 1.2 : 15/03/2018
    Changement des widgets type text par des widgets type Alert
    variable NbRestant convertie en string pour les opérateur logiques
    
infos site EDF:
    Période ejp : 1er novembre 20xx au 31 mars 20xx
    Journee ejp: de 7h à 1h le lendemain
    Le jour ejp de demain : Cette information est actualisée tous les jours à partir de 17h.
    Liste des status : "EST_EJP" "NON_EJP" "ND"
    
sources:
    https://github.com/DjMomo/eedomus-ejp/blob/master/eedomus-ejp.php
    https://easydomoticz.com/lua-et-json/
    https://m-particuliers.edf.com/jour-ejp/#_bk_x=1#
    https://particulier.edf.fr/fr/accueil/contrat-et-conso/options/ejp.html

]]--


-----------------------------------------------------------------------
------------------ Variables utilisateur ------------------------------
-----------------------------------------------------------------------
local zone      ='Nord'                    -- Zone ejp concernée
local dzJourJ   ='EJP_Aujourdhui'          -- dz Text sensor   : Nom exact du "Alert sensor" indiquant l'ejp du jour
local dzJourJ1  ='EJP_Demain'              -- dz Text sensor   : Nom exact du "Alert sensor" indiquant l'ejp de demain
local dzNb      ='EJP_Jours_Restant'       -- dz Custom sensor : Nom exact du "Custom sensor" indiquant le nombre de jours ejp restants
local dzNotifJ  =true                      -- Recevoir une notification lorsque EJP aujourdhui
local dzNotifJ1 =true                      -- Recevoir une notification lorsque EJP demain
local dzDebugLog=true                      -- Debug


-----------------------------------------------------------------------
------------------ Constantes -----------------------------------------
-----------------------------------------------------------------------
--Edf
local URLhisto  ="https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=ejp"
local URLparams ="https://particulier.edf.fr/services/rest/referentiel/getConfigProperty?PARAM_CONFIG_PROPERTY="
local URLetat   ="https://particulier.edf.fr/bin/edf_rc/servlets/ejptemponew?TypeAlerte=EJP&Date_a_remonter="
local EJPok     ="NORD_EJP"
--Chargement du fichier JSON.lua
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux


-----------------------------------------------------------------------
------------------ Traitement de chaine -------------------------------
----------------------------------------------------------------------- 
--formatage zone
local MinZone = string.lower(zone)
local MajZone = string.upper(zone)
local KeyZone = MinZone:gsub("^%l", string.upper)
--date du jour
local dateJ = os.date("%F",d)
--url/json du nombre de jours total
local KeyNbj = 'param.total.days.' .. MinZone
--Commandes url:
local cmdHisto  = 'curl -s \"' .. URLetat .. dateJ .. '\"'
local cmdParams = 'curl -s \"' .. URLparams .. KeyNbj .. '\"'
local cmdEtat   = 'curl -s \"' .. URLhisto .. '\"'


-----------------------------------------------------------------------
------------------ fonctions ------------------------------------------
-----------------------------------------------------------------------
--Fonction pour récupérer le retour d'une commande
function os.capture(cmd)
  local f = assert(io.popen(cmd, 'r'))
  local s = assert(f:read('*a'))
  f:close()
  return s
end


-----------------------------------------------------------------------
------------------ DzVents --------------------------------------------
-----------------------------------------------------------------------
return {
    
    on = {
        timer = { 'every minute' }
        --timer = { 'every hour' }
    },
    execute = function(dz)

        --Extraction des EJP du jour et du lendemain
        local jsonHisto = json:decode(os.capture(cmdHisto))
        local EjpJ  = jsonHisto['JourJ']['Ejp' .. KeyZone]
        local EjpJ1 = jsonHisto['JourJ1']['Ejp' .. KeyZone]
        
        --Extraction du nombre de jours total
        local jsonParams = json:decode(os.capture(cmdParams))
        local NbTotal = jsonParams[KeyNbj]
        
        --Extraction du nombre de jours passés
        local jsonEtat = json:decode(os.capture(cmdEtat))
        local NbPass = jsonEtat[MajZone]['TotalCurrentPeriod']
        
        --Nombre de jours restants
        local NbRestant = tostring(tonumber(NbTotal) - tonumber(NbPass))
        
        --Recup des valeurs dz
        local StatusEjpJ        = dz.devices(dzJourJ).state
        local StatusEjpJ1       = dz.devices(dzJourJ1).state
        local StatusEjpRestant  = dz.devices(dzNb).state
        
        --EjpJ='NORD_EJP'
        --EjpJ1='test'--'NORD_EJP_EJP'
        --NbRestant='1'
        
        --Notifications
        if ( (dzNotifJ == true) and (EjpJ == EJPok) and (StatusEjpRestant ~= NbRestant) ) then
            -- Si plusieurs jour "EST_EJP" consécutifs, on detecte le nouveau jour avec NbRestant qui lui change
            dz.notify('EJP', 'Journée EJP, il en reste encore: ' .. NbRestant, dz.PRIORITY_NORMAL)
        end
        if ( dzNotifJ1 == true and EjpJ1 == EJPok and StatusEjpJ1 ~= EjpJ1 ) then
            -- Le lendemain passe par l'etat ND entre chaque annonce, donc "EST_EJP" détecté même si plusieurs jours consécutifs
            dz.notify('EJP', 'Demain sera une journée EJP', dz.PRIORITY_NORMAL)
        end
        
        --Update dz seulement si différent:
        if ( StatusEjpJ ~= EjpJ ) then
            if ( EJPok == EjpJ ) then
                dz.devices(dzJourJ).updateAlertSensor(dz.ALERTLEVEL_RED,EjpJ)
            else
                dz.devices(dzJourJ).updateAlertSensor(dz.ALERTLEVEL_GREY,EjpJ)
            end
        end
        if ( StatusEjpJ1 ~= EjpJ1 ) then
            if ( EJPok == EjpJ1 ) then
                dz.devices(dzJourJ1).updateAlertSensor(dz.ALERTLEVEL_RED,EjpJ1)
            else
                dz.devices(dzJourJ1).updateAlertSensor(dz.ALERTLEVEL_GREY,EjpJ1)
            end
        end
        if ( StatusEjpRestant ~= NbRestant ) then
           dz.devices(dzNb).updateCustomSensor(NbRestant)
        end
        
        --debug
        if ( dzDebugLog == true ) then
            dz.log(EjpJ, dz.PRIORITY_LOW)
            dz.log(EjpJ1, dz.PRIORITY_LOW)
            dz.log(NbRestant, dz.PRIORITY_LOW)
            --dz.devices(dzJourJ).dump()
            --dz.devices(dzNb).dump()
            dz.log(cmdHisto, dz.PRIORITY_LOW)
            dz.log(cmdParams, dz.PRIORITY_LOW)
            dz.log(cmdEtat, dz.PRIORITY_LOW)
        end
        
    end
}
créer les 3 capteurs de mesures virtuels "dummy",
- l'ejp du jour (de type texte)
- l'ejp de demain (de type texte)
- le nombre de jours ejp restants (de type custom sensor)

mais voila rien ne ce lance ?
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message par petrapi »

Bonjour Paldor,
Le plus simple dans ces cas la est d'aller voir dans le log pour voir si il n'y a pas d'erreurs affichées.
Voici tout de même la dernière version du script qui fonctionne chez moi:

Code : Tout sélectionner

--[[ 

Ce script récupère les infos EJP et met a jour 3 dummy sensor seulement si necessaire.

version 1.4 : 4/11/2019
    Ajout du userAgent dans la commande curl sinon "access denied"
    
infos site EDF:
    Période ejp : 1er novembre 20xx au 31 mars 20xx
    Journee ejp: de 7h à 1h le lendemain
    Le jour ejp de demain : Cette information est actualisée tous les jours à partir de 17h.
    Liste des status : "EST_EJP" "NON_EJP" "ND"
    
sources:
    https://github.com/DjMomo/eedomus-ejp/blob/master/eedomus-ejp.php
    https://easydomoticz.com/lua-et-json/
    https://m-particuliers.edf.com/jour-ejp/#_bk_x=1#
    https://particulier.edf.fr/fr/accueil/contrat-et-conso/options/ejp.html

]]--


-----------------------------------------------------------------------
------------------ Variables utilisateur ------------------------------
-----------------------------------------------------------------------
local zone      ='sud'              -- Zone ejp concernée
local dzJourJ   ='EJP Aujourdhui'   -- dz Text sensor   : Nom exact du "Alert sensor" indiquant l'ejp du jour
local dzJourJ1  ='EJP Demain'       -- dz Text sensor   : Nom exact du "Alert sensor" indiquant l'ejp de demain
local dzNb      ='EJP Restant'      -- dz Custom sensor : Nom exact du "Custom sensor" indiquant le nombre de jours ejp restants
local dzNotifJ  =true               -- Recevoir une notification lorsque EJP aujourdhui
local dzNotifJ1 =true               -- Recevoir une notification lorsque EJP demain
local dzDebugLog=true               -- Debug


-----------------------------------------------------------------------
------------------ Constantes -----------------------------------------
-----------------------------------------------------------------------
--Edf
local URLhisto  ="https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=ejp"
local URLparams ="https://particulier.edf.fr/services/rest/referentiel/getConfigProperty?PARAM_CONFIG_PROPERTY="
local URLetat   ="https://particulier.edf.fr/bin/edf_rc/servlets/ejptemponew?TypeAlerte=EJP&Date_a_remonter="
local EJPok     ="EST_EJP"
--Chargement du fichier JSON.lua
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()  -- For Linux


-----------------------------------------------------------------------
------------------ Traitement de chaine -------------------------------
----------------------------------------------------------------------- 
--formatage zone
local MinZone = string.lower(zone)
local MajZone = string.upper(zone)
local KeyZone = MinZone:gsub("^%l", string.upper)
--date du jour
local dateJ = os.date("%F",d)
--url/json du nombre de jours total
local KeyNbj = 'param.total.days.' .. MinZone
--Commandes url:
local userAgent = '-A \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0\" '
local cmdHisto  = 'curl -s ' .. userAgent .. '\"' .. URLetat .. dateJ .. '\"'
local cmdParams = 'curl -s ' .. userAgent .. '\"' .. URLparams .. KeyNbj .. '\"'
local cmdEtat   = 'curl -s ' .. userAgent .. '\"' .. URLhisto .. '\"'


-----------------------------------------------------------------------
------------------ fonctions ------------------------------------------
-----------------------------------------------------------------------
--Fonction pour récupérer le retour d'une commande
function os.capture(cmd)
  local f = assert(io.popen(cmd, 'r'))
  local s = assert(f:read('*a'))
  f:close()
  return s
end


-----------------------------------------------------------------------
------------------ DzVents --------------------------------------------
-----------------------------------------------------------------------
return {
    
    on = {
        --timer = { 'every minute' }
        timer = { 'every hour' }
    },
    execute = function(dz)
        
        --debug
        if ( dzDebugLog == true ) then
            dz.log(cmdHisto, dz.PRIORITY_LOW)
            dz.log(cmdParams, dz.PRIORITY_LOW)
            dz.log(cmdEtat, dz.PRIORITY_LOW)
        end    
            
        --Extraction des EJP du jour et du lendemain
        local jsonHisto = json:decode(os.capture(cmdHisto))
        local EjpJ  = jsonHisto['JourJ']['Ejp' .. KeyZone]
        local EjpJ1 = jsonHisto['JourJ1']['Ejp' .. KeyZone]
        
        --Extraction du nombre de jours total
        local jsonParams = json:decode(os.capture(cmdParams))
        local NbTotal = jsonParams[KeyNbj]
        
        --Extraction du nombre de jours passés
        local jsonEtat = json:decode(os.capture(cmdEtat))
        local NbPass = jsonEtat[MajZone]['TotalCurrentPeriod']
        
        --Nombre de jours restants
        local NbRestant = tostring(tonumber(NbTotal) - tonumber(NbPass))
        
        --debug
        if ( dzDebugLog == true ) then
            dz.log(EjpJ, dz.PRIORITY_LOW)
            dz.log(EjpJ1, dz.PRIORITY_LOW)
            dz.log(NbRestant, dz.PRIORITY_LOW)
            --dz.devices(dzJourJ).dump()
            --dz.devices(dzNb).dump()
        end
        
        --Recup des valeurs dz
        local StatusEjpJ        = dz.devices(dzJourJ).state
        local StatusEjpJ1       = dz.devices(dzJourJ1).state
        local StatusEjpRestant  = dz.devices(dzNb).state
        
        --EjpJ='EST_EJP'
        --EjpJ1='test'--'EST_EJP'
        --NbRestant='1'
        
        --Notifications
        if ( (dzNotifJ == true) and (EjpJ == EJPok) and (StatusEjpRestant ~= NbRestant) ) then
            -- Si plusieurs jour "EST_EJP" consécutifs, on detecte le nouveau jour avec NbRestant qui lui change
            dz.notify('EJP', 'Journée EJP, il en reste encore: ' .. NbRestant, dz.PRIORITY_NORMAL)
        end
        if ( dzNotifJ1 == true and EjpJ1 == EJPok and StatusEjpJ1 ~= EjpJ1 ) then
            -- Le lendemain passe par l'etat ND entre chaque annonce, donc "EST_EJP" détecté même si plusieurs jours consécutifs
            dz.notify('EJP', 'Demain sera une journée EJP', dz.PRIORITY_NORMAL)
        end
        
        --Update dz seulement si différent:
        if ( StatusEjpJ ~= EjpJ ) then
            if ( EJPok == EjpJ ) then
                dz.devices(dzJourJ).updateAlertSensor(dz.ALERTLEVEL_RED,EjpJ)
            else
                dz.devices(dzJourJ).updateAlertSensor(dz.ALERTLEVEL_GREY,EjpJ)
            end
        end
        if ( StatusEjpJ1 ~= EjpJ1 ) then
            if ( EJPok == EjpJ1 ) then
                dz.devices(dzJourJ1).updateAlertSensor(dz.ALERTLEVEL_RED,EjpJ1)
            else
                dz.devices(dzJourJ1).updateAlertSensor(dz.ALERTLEVEL_GREY,EjpJ1)
            end
        end
        if ( StatusEjpRestant ~= NbRestant ) then
           dz.devices(dzNb).updateCustomSensor(NbRestant)
        end
        
        
        
    end
}

Répondre