Page 1 sur 2
[DzVents] Voyant EJP
Publié : 25 févr. 2018, 20:11
par ftn
Le lien suivant ne fonctionnant plus;
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é.
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:
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: