RETEX - DomoMG - Une suite domotique sous Jeedom - EPISODE 3

Présentation de la saga DomoMG
tous les codes de DomoMG sont sur le GitHub

Liste des épisodes publiés :

EPISODE 1 - L’atelier de développement
EPISODE 2 - Installation - la class ‹ mg › - TABULATOR
EPISODE 3 - Le suivi des consommations électriques

Bonjour à tous,

Malgrès les polémiques du dernier épisode je vais essayer de continuer à dérouler les fonctions de DomoMG, donc, comme prévu cet épisode traitera du suivi des consommations électriques.

Pour ce suivi je tenais à avoir toutes les informations par poste de consommation sur les 13 derniers mois glissants ainsi qu’un accès aux graphiques « consommation » et « puissance » pour chacun de ces postes directement à l’écran.

L’autre contrainte que je m’étais fixée était de ne pas avoir de traitements différés (conso de fin de journée par exemple),

Pour celà, j’utilise 2 « pseudo cron » interne au script, le premier actualise toutes les mn les consommations instantanées, l’autre, toutes les xx mn recalcule les consos des 13 derniers mois en détails (poste par poste) ou par groupe de poste.
Au final cela nous donne cela en poste par poste :

  • Les boutons bleu et vert dans les colonnes de droite donnent accès directement au graphiques concernés (avec la possibilité de supprimer les points aberrants éventuels)

  • Les boutons on/off des colonnes de droite permettent … vous avez compris :slight_smile:

  • nous retrouvons en haut les douze derniers mois suivi du mois courant et des statistiques mensuelles et annuelles.

  • 3 lignes particulières apparaissent en bas du tableau,

    1. incertitude : Qui représente la différence entre la consommation globale mesurée au compteur et la somme des consommations mesurées sur chacun des postes. Dans mon cas environ 11 % qui correspondent donc aux appareillages non équipés de système de mesure (chauffage d’appoint, fer à repasser, aspirateur, outillages, etc …) ainsi qu’à la marge d’erreur de ces mesures.
    1. ZW095 : Qui est en fait la ligne du compteur électrique physique muni d’un capteur « ZW095 Home Energy Meter Gen5 » d’aeotec
    1. Enedis : Valeur provenant de Enedis (via le plugin Enedis de @Salvialf ) et permettant une comparaison avec les valeurs mesurées, dans mon cas avec un ZW095, l’erreur est de l’ordre de 1%.
  • Les boutons en haut d’écran permettent respectivement de :

    1. « MàJ » : Rafraichir les informations
    1. « Détails » : d’Afficher les valeurs détaillées par poste (cf ci dessus)
    1. « Regroupe » : D’afficher une vue « groupé » par poste de consommations (chauffage, lumières, etc).

Deux outils complémentaires sont fournis.
L’un permettant, pour les équipements dépourvus de capteur de puissance et de consommations, de simuler ceux ci dans un virtuel. Cet outil permet en outre d’ajuster automatiquement les valeurs min/max des commandes « Consommation » ce qui permet de filtrer les valeurs aberrantes (assez fréquente avec le Zwave …)

Le deuxième tient les différents index des consommation HP/HC :

L’ensemble repose sur un paramétrage dans TABULATOR, qui comme vous pouvez le voir est trés simple :

D’un point de vue plus technique, le programme de suivi de consommation repose sur une routine qui extrait directement de la base de données les valeurs utiles.

/************************************************************************************************************************
* UTIL													STATS_HISTO														*
*************************************************************************************************************************
* Extrait de l'histo d'une commande les valeurs correspondant au paramètres temporel d'entrée.							*
*	Paramètres :																										*
*		$infCmd : La commande dont on veut extraire des infos.															*
*		$result : Type de valeurs à extraire :																			*
												'S' valeur de départ,													*
												'E', valeur de fin,														*
												'D' différence Fin-Debut,												*
												'DB' Durée pendant lequel la cmd était à '1' durant la période).		*
*		$typePeriode : T heure, D Jour, M mois, Y année.																*
*		$deltaStart : Nb de période à soustraire à 'maintenant' pour avoir la date de début (positif ou négatif).		*
*		$nbPeriodes : Nb de périodes séparant la date de début de la date de fin (positif ou négatif).					*
*																														*
*	Exemple :																											*
*		StatsHisto($infCmd, 'D', 'Y', 0, 1); Année courante																*
*																														*
*		StatsHisto($infCmd, 'D', 'M', 0, 12); Les 12 derniers mois														*
*		StatsHisto($infCmd, 'D', 'M', 3, 1); Le mois -3																	*
*																														*
*		StatsHisto($infCmd, 'D', 'D', 0, 1); La dernière journée														*
*		StatsHisto($infCmd, 'D', 'D', 9, 365.25); Dernière année à partir du jour -9									*
*																														*
*		StatsHisto($infCmd, 'D', 'T', 0, 1); La dernière heure															*
************************************************************************************************************************/
	function StatsHisto($infCmd, $result = 'D', $typePeriode = 'M', $deltaStart = 0, $nbPeriodes = 1) {

C’est terminé pour aujourd’hui, la prochaine fois nous passerons en revue la régulation du chauffage et ses fonctions connexes.

3 « J'aime »

Pas de traitement différé, mais 2 pseudo-cron… c’est un peu pareil non ? c’est quoi tes « pseudo-cron » ?

Les crons de jeedom (debian) viennent du système, pour me permettre de différencier les déclenchements de certains traitements dans un même script je teste la mn courante et si elle est égale à … je déclenche.
Cela permet avec un cron à la mn de déclencher certains traitements à la mn 06 de chaque heure par exemple ou d’autres à 5:10 et cela sans risque de collision.
Une simple astuces de prog, on peut faire différemment :slight_smile:

Tu a refais un ordonnanceur « maison » en fait :smiley: au lieu d’ajouter un cron pour chaque action, genre « 6 * * * * » pour déclencher une action à la 6e minute, tu a un démon je suppose (?) qui tourne en permanence et déclenche les actions que tu a enregistré avec la même syntaxe que le cron.
A moins que tu n’utilise des scénarios programmés ?

Juste un cron à la mn pour la tâche courante

Par exemple pour les tâches lancées à une heure ronde précise j’utilise cette formule qui permet en outre de lancer toutes les heures avec timerNettoieLog = ‹ all ›

if (mg::getTag('#minute#') == 0 && ((mg::getTag('#heure#') == $timerNettoieLog) || $timerNettoieLog == 'all')) { ....... }

Sur ce modèle on peut lancer toutes les x mn ou x heures ou encore a h:mn en variant la formule
L’intérêt est de ne pas rajouter de process (cron) inutiles puisque le cron à la mn tourne déjà et de ne pas avoir à gérer d’éventuelles collisions.

Juste un cron à la mn pour la tâche courante

Par exemple pour les tâches lancées à une heure ronde précise j’utilise cette formule qui permet en outre de lancer toutes les heures avec timerNettoieLog = ‹ all ›

if (mg::getTag('#minute#') == 0 && ((mg::getTag('#heure#') == $timerNettoieLog) || $timerNettoieLog == 'all')) { ....... }

Sur ce modèle on peut lancer toutes les x mn ou x heures ou encore a h:mn en variant la formule
L’intérêt est de ne pas rajouter de process (cron) inutiles puisque le cron à la mn tourne déjà et de ne pas avoir à gérer d’éventuelles collisions.

1 cron à la minute = 1 nouveau process à chaque minute, 60 process par heure, 1440 process par jour ! Je suppose que ton cron ne fait rien la plupart du temps, et donc ça se passe vite et bien. Mais tu attendra vite la limite du système si tu charge un peu le truc
Je ne sais pas ce que tu entends par « collisions » mais si le programme est « étanche » ( thread-safe ) tu peux lancer plusieurs process en même temps, la BDD en particulier sait très bien gérer les problèmes des lock et contention (accès simultanés).
Au fait, quel est le point d’entrée du cron?

1 « J'aime »

Difficile de lancer en même temps des process qui lise/écrive sur le dd de manière séquentielle.
Je n’utilise ce procédé que pour des process qui effectivement tourne tt les mn mais qui demande de temps à autres des traitements de consolidation.
Dans le cas évoqué dans ma comm, j’ai un process à la mn pour mettre à jour les virtuels simulant la consommation (peut pas faire autrement) et toutes les 5 mn un autre qui rafraichis l’affichage du tableau.

Même topo pour le monitoring un process à la mn, un autre tous les 15 mn et le dernier de nuit à 3:00.

Dans d’autre cas comme les minuteries d’éclairage je pose un cron à + x mn dans le scénarios. Inconvénient majeur, en cas d’incident (reboot ou autres) si l’heure du cron est dépassée lors de la réactivation … cela devient un scénario mort :frowning:

Salut @m.georgein !

Encore un sacré travail ! Ta vision sur le suivi de la consommation est très intéressante. C’est d’ailleurs une logique « similaire » que veulent appliquer certains fournisseurs d’énergie pour sensibiliser le public aux dérapage de la conso électrique.

Pourrais-tu m’aiguiller par rapport à ton code ? J’aimerai comprendre comment sont stockées les valeurs de ton capteur aeotec dans jeedom et comment tu les requêtes. ça pourrait m’inspirer ou résoudre une question que j’ai en tête depuis longtemps sans jamais avoir trouvé de réponse : j’ai un capteur pour la téléinformation de mon compteur. Avant j’avais ma propre solution de suivi de la conso sur mon NAS, et j’aimerai pouvoir me faire mes propres graphiques comme je le faisais avant sur mon NAS :slight_smile:

bonsoir @decx,

A priori rien de spécial concernant l’aeotec, je me contente dans le tableau de comparer ses consommations avec la somme de celles de tous les autres capteurs de conso ce qui me permet d’afficher la marge d’incertitude. J’affiche aussi en parallèle le relevé d’enedis pondéré (le relevé date toujours de la veille à 00:00).

Tu trouveras tous les détails dans le fichier EDF_Conso.php et dans la librairie mg.class.php pour ce qui concerne les routines d’extraction des valeurs mensuelles/annuelles via SQL.

En pratique je travaille directement sur l’historique de la BdD sans aucun autre stockage.

Je vais aller voir tout ça. Merci !