[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.
ftn
Messages : 27
Inscription : 08 janv. 2016, 13:01

[DzVents] Voyant EJP

Message 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
Raspberry PI2, Domoticz, RFXtrx433E, PCR800 (Capteur pluie), 3 x THGR 810, BTHGN129, Une prise 230V DIO, un contacteur d’ouverture, Aeotec ZW075-C16, aeotec aeoezw090, Zipato ph-pat02.
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message 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
}

jeffdeleffe
Messages : 1
Inscription : 11 mars 2018, 09:58

Re: Voyant EJP

Message 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
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message 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
Pièces jointes
dummy_ejp.PNG
dummy_ejp.PNG (31.04 Kio) Consulté 9707 fois
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message 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,
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message 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
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message par nene82 »

Ok, merci j'essaie ça et vous dit.
@+
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message 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,
nene82
Messages : 61
Inscription : 17 févr. 2017, 11:05

Re: Voyant EJP

Message 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,
petrapi
Messages : 19
Inscription : 10 mars 2018, 16:41

Re: Voyant EJP

Message 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' }
Répondre