Page 1 sur 2

[DzVents] Voyant EJP

Publié : 25 févr. 2018, 20:11
par ftn
Le lien suivant ne fonctionnant plus; :roll:
http://domogeek.entropialux.com/ejpedf/nord/today

J'ai donc utilisé l'adresse suivante dans un script bash + cron pour mettre à jour mon voyant EJP
https://particulier.edf.fr/bin/edf_rc/s ... Alerte=EJP

Re: Voyant EJP

Publié : 10 mars 2018, 17:02
par petrapi
Bonjour a tous,

Cet hiver ayant laissé chauffer un cumulus de 200l froid toute une journée d'EJP *les boules*
Cela m'a motivé a écrire le script ci-dessous avec DzVents.
La saison étant fini ça arrive un peu tard mais peut être ça servira a quelqu’un l'année prochaine.

Code : Tout sélectionner

--[[ 

version 1.0

Ce script récupère les infos EJP et met a jour 3 capteurs de mesures virtuels seulement si necessaire.

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 "Text sensor" indiquant l'ejp du jour
local dzJourJ1  ='EJP Demain'       -- dz Text sensor   : Nom exact du "Text 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 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]['Total']
        
        --Nombre de jours restants
        local NbRestant = tonumber(NbTotal) - tonumber(NbPass)
        
        --Recup des valeurs dz
        local StatusEjpJ        = dz.devices(dzJourJ).text
        local StatusEjpJ1       = dz.devices(dzJourJ1).text
        local StatusEjpRestant  = dz.devices(dzNb).state
        
        --Update dz seulement si différent:
        if ( StatusEjpJ ~= EjpJ ) then
            dz.devices(dzJourJ).updateText(EjpJ)
            if (EjpJ == EJPok and dzNotifJ == true) then
                dz.notify('EJP', 'Journée EJP, il en reste encore: ' .. NbRestant, dz.PRIORITY_NORMAL)
            end
        end
        if ( StatusEjpJ1 ~= EjpJ1 ) then
            dz.devices(dzJourJ1).updateText(EjpJ1)
            if (EjpJ1 == EJPok and dzNotifJ1 == true) then
                dz.notify('EJP', 'Demain sera une journée EJP', dz.PRIORITY_NORMAL)
            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)
        end
        
    end
}


Re: Voyant EJP

Publié : 11 mars 2018, 10:01
par jeffdeleffe
Bonjour,
J'ai essayé ce script mais cela me retourne des erreurs comme :
2018-03-11 10:00:00.133 dzVents: Info: ------ Start internal script: EJP2:, trigger: every minute

2018-03-11 10:00:01.969 dzVents: Error (2.4.1): There is no device with that name or id: EJP Aujourdhui

2018-03-11 10:00:01.970 dzVents: Error (2.4.1): An error occured when calling event handler EJP2

2018-03-11 10:00:01.970 dzVents: Error (2.4.1): ...e/pi/domoticz/scripts/dzVents/generated_scripts/EJP2.lua:103: attempt to index a nil value

2018-03-11 10:00:01.970 dzVents: Info: ------ Finished EJP2

Re: Voyant EJP

Publié : 11 mars 2018, 14:53
par petrapi
Salut jeff,

J'avoue avoir balancer le script sans trop d'explications, désolé. :oops:

En fait il faut créer 3 capteurs de mesures virtuels "dummy", dans lesquels le script va pouvoir afficher les 3 infos indiquant:
- l'ejp du jour (de type texte)
- l'ejp de demain (de type texte)
- le nombre de jours ejp restants (de type custom sensor)

Ce qui donne:
Image

Tu peux modifier leurs noms, en renseignant les nouveaux dans cette section du script:

Code : Tout sélectionner

-----------------------------------------------------------------------
------------------ Variables utilisateur ------------------------------
-----------------------------------------------------------------------
local zone      ='sud'              -- Zone ejp concernée
local dzJourJ   ='EJP Aujourdhui'   -- dz Text sensor   : Nom exact du "Text sensor" indiquant l'ejp du jour
local dzJourJ1  ='EJP Demain'       -- dz Text sensor   : Nom exact du "Text 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
Dans cette même section il faudra aussi adapter sa propre zone d'habitation: sud,ouest,paca,nord
Le découpage des zones est comme ceci: https://m-particuliers.edf.com/jour-ejp/#_bk_x=1#

On peut aussi activer/désactiver les notifications envoyées par le script en mettant les valeurs true ou false:
dzNotifJ =true : n'enverra une notification uniquement si il y a EJP "aujourdhui"
dzNotifJ1 =true : n'enverra une notification uniquement si il y a EJP "demain"

=> Par contre en écrivant ces lignes je vient de tilter que si il y a plusieurs jours consécutifs EJP, la notification "EJP aujourdhui" ne préviendra que pour la 1ere. :? (les infos affichées elles seront bonnes, et en principe la notif "EJP demain" sera ok aussi dans ce cas la)

En dernier :
local dzDebugLog=true : pour voir les 3 valeurs récupérées toutes les heures

Les évolutions que je pense faire plus tard:
Prendre en compte les nouvelles fonctionnalités de DzVents 2.4.0 (je ne suis qu'en 2.2.0)
Régler/vérifier cette histoire de notification du jour J

Re: Voyant EJP

Publié : 09 août 2018, 17:38
par nene82
Bonsoir,
je n'arrive pas à faire marcher ce script.
Le log me revoie ce défaut : "2018-08-09 17:33:44.704 Error: EventSystem: in script_time_EJP.lua: [string "--[[..."]:43: attempt to call a nil value"
en ligne 43 votre code est celui là : "json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux"
Or moi, j'héberge Domoticz sur mon syno. Je pense que le chemin n'est pas bon. Avez vous une idée?
Ensuite, comme ça en vrac, j'ai quelques autres questions
- Est ce bien un script LUA de type time qui doit se nommer script_time_xxxxxxxx.lua?
- Quelle valeur doit on renseigner sur le capteur de type "custum sensor" du dummy "EJP restant" pour le nom de l'axe?
je vous en remercie par avance.
Cdt,

Re: Voyant EJP

Publié : 10 août 2018, 01:30
par petrapi
Bonjour nene,

C'est un script dzVents, dans dz 3.8153, il faut le créer dans réglages/plus d'options/éventements.
Normalement c'est indépendant de la plateforme.

voici ma version 1.2:

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      ='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 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]['Total']
        
        --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='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
        
        --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
}

Les capteurs a créer sont:
EJP Restant : type "custom sensor" (nom de l'axe: "jours" mais tu peux mettre ce que tu veux)
EJP Aujourdhui : type alert
EJP Demain : type alert

En hors saison EJP, bizarrement "EJP Restant" annonce -22j, j'ai l'impression qu'ils récapitulent les jours des 2 dernières années dans l'historique, ce qui conduit a un chiffre négatif.

A bientot

Re: Voyant EJP

Publié : 10 août 2018, 08:56
par nene82
Ok, merci j'essaie ça et vous dit.
@+

Re: Voyant EJP

Publié : 10 août 2018, 09:22
par nene82
re,
Voilà le log : 2018-08-10 09:17:45.770 Error: dzVents: Error: ...cz/var/scripts/dzVents/generated_scripts/Gestion_EJP.lua:45: attempt to call a nil value
je pense que c'est cette ligne qui me pose problème car je ne suis pas sur un Raspberry PI :"json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For Linux"
dans le log apparait ceci > Dumping domoticz data to /usr/local/domoticz/var/scripts/dzVents//domoticzData.lua, la syntaxe ci dessus devrait ressembler à ceci j'imagine...
Y'a t'il une syntaxe particulière pour le nom du script, comme pour les scripts LUA? ex: trucmuche.lua
Cdt,

Re: Voyant EJP

Publié : 10 août 2018, 11:17
par nene82
bon, avec cette syntaxe "json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Linux" je n'ai plus d'erreurs dans le log mais ça ne marche pas quand même. je passe à côté de quelque chose mais quoi....
un extrait du fichier log:
2018-08-10 11:15:12.234 (RfxCom) Temp + Humidity (Hr/T° Ext.)
2018-08-10 11:15:12.591 dzVents: Debug: Dumping domoticz data to /usr/local/domoticz/var/scripts/dzVents//domoticzData.lua
2018-08-10 11:15:12.619 dzVents: Debug: Event trigger type: device
2018-08-10 11:15:12.663 dzVents: Debug: Device-adapter found for Hr/T° Ch. 3/Ssprt: Temperature+humidity device adapter
2018-08-10 11:15:12.668 dzVents: Debug: Processing device-adapter for Hr/T° Ch. 3/Ssprt: Temperature+humidity device adapter
2018-08-10 11:15:12.668 dzVents: Debug: Device-event for: Hr/T° Ch. 3/Ssprt value: 25.9;56;1
2018-08-10 11:15:12.668 dzVents: Debug: Searching for scripts for changed item: Hr/T° Ch. 3/Ssprt
Si, dernier point quand même, j'ai créé 3 dummy différents associés à 3 capteurs virtuels tels que décrit ci dessus. Est ce bien ça qu'il faut faire?
je vous remercie,
cdt,

Re: Voyant EJP

Publié : 10 août 2018, 14:44
par petrapi
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 :

2018-08-10 14:00:00.484 dzVents: Info: ------ Start internal script: EJP:, trigger: every hour
2018-08-10 14:01:15.690 dzVents: NON_EJP
2018-08-10 14:01:15.690 dzVents: ND
2018-08-10 14:01:15.690 dzVents: -22
2018-08-10 14:01:15.690 dzVents: curl -s "https://particulier.edf.fr/bin/edf_rc/s ... 2018-08-10"
2018-08-10 14:01:15.690 dzVents: curl -s "https://particulier.edf.fr/services/res ... l.days.sud"
2018-08-10 14:01:15.690 dzVents: curl -s "https://particulier.edf.fr/services/res ... chType=ejp"
2018-08-10 14:01:15.691 dzVents: Info: ------ Finished EJP

En réglages/paramètres/autre/dzvents, je suis en: Errors + minimal execution infos + generic info

J'imagine que aucuns des 3 capteurs virtuels ne se mettent a jour c'est bien ça?

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:

Code : Tout sélectionner

timer = { 'every minute' }
--timer = { 'every hour' }