Calcul de consommations électriques

Bonsoir,

J’ai 2 modules PZEM 004T V3 qui me remontent des consommations électriques en MQTT à mon installation domotique. Actuellement le calcul des consommations journalières (HP & HC) se font avec Homa Assistant via un component « utility_meter ». Tout marche très bien, cependant j’aimerai faire ce calcul dans NodeRed.
Il existe des compteurs (via Tasmota) dans le module PZEM (Jour J, Jour J-1, total) mais ils ne permettent pas je pense d’intégrer un coût, ni même de gérer les différents tarifs.
Je pensais donc mémoriser à 00h le compteur total que me remonte le module PZEM. Puis à chaque remontée d’infos du capteur, faire la différence entre la valeur mémorisée à 00h et celle actuelle. Ca me donne une valeur que je peux multiplier par le coût du KWh. Faire ce principe en double pour gérer les HP et les HC.

Est-ce que certains d’entre vous ont déjà mis en œuvre ce genre de chose sur NodeRed ? En utilisant ce principe ou autre ?

Merci

Soutenons la communuté.
Pzem 004T V3
https://amzn.to/3fd5UcC
https://s.click.aliexpress.com/e/_dWLPY62

J’ai regardé ce que faisait utility_meter. J’ai l’impression que reproduire cela avec Node Red va être plus compliqué.
Je vois deux options:

  • Faire les calculs dans node red et stocker les valeurs dans un fichier sur disque
  • Envoyer les données brutes dans influxdb et faire les calculs au moment des extractions avec Grafana par exemple.
    Mais, comme ça, à froid, je me dis que HA là-dessus est probablement un meilleur choix que NR.

Oui le module « utility_meter » est parfait pour ça sous Home Assistant. Le top serait d’avoir une palette ayant un node qui gère la même chose sous NR.
Je pense que je vais tenter de le faire comme je l’ai expliqué dans mon premier post. Sinon voir peut être voir du côté de ESPHome (au lieu de Tasmota), peut être il y a moyen de gérer ces compteurs HP HC dedans.
Le fait d’archiver les données brutes comme tu le dis fonctionnerait, mais j’ai peur que la requête soit assez lourde s’il faut intégrer les tarifs en fonction des horaires. A voir tout de même

Merci

@Jex2512,

Voici comment j’ai procédé avec mes PZEM, si ça peut t’aider.
Bon, ce sera forcément différent, vu que mes PZEM sont directement interfacés avec NR au travers d’une gateway Modbus.
Donc mon flow déclenche la lecture des données toutes les 5s et à minuit.

Les données sont ensuite traitées dans un node fonction, qui va générer les messages mqtt et le batch influxdb.

var mqttTopic = "maison/energies/electricite/pzem";
var batch = [];
var mqttMsg = [], influxdbMsg;
var timestamp = new Date();

// Get measures
var voltage = msg.payload[0] / 10.0;
var intensity = (msg.payload[1] + (msg.payload[2] << 16)) / 1000.0;
var frequency = msg.payload[7] / 10.0;
var power = (msg.payload[3] + (msg.payload[4] << 16)) / 10.0;
var energy = msg.payload[5] + (msg.payload[6] << 16);
var powerFactor = msg.payload[8] / 100.0;

// Saving energy value for daily calculation
var requestTimestamp = new Date(msg.modbusRequest.value);
if (requestTimestamp.getHours() === 0 & requestTimestamp.getMinutes() === 0 & requestTimestamp.getSeconds() === 0) {
    flow.set("energy_t0_pzem@".concat(msg.unitId), energy);
}

// Daily energy consumption 
var dailyEnergy = energy - flow.get("energy_t0_pzem@".concat(msg.unitId));
if (dailyEnergy < 0) { dailyEnergy = dailyEnergy + 4294967295 }

// Create mqtt messages
mqttMsg.push({ topic : mqttTopic.concat("/", "tension"), payload: voltage });
mqttMsg.push({ topic : mqttTopic.concat("/", "intensite"), payload: intensity });
mqttMsg.push({ topic : mqttTopic.concat("/", "frequence"), payload: frequency });
mqttMsg.push({ topic : mqttTopic.concat("/", "puissance"), payload: power });
mqttMsg.push({ topic : mqttTopic.concat("/", "energie"), payload: dailyEnergy });
mqttMsg.push({ topic : mqttTopic.concat("/", "facteur_puissance"), payload: powerFactor });

// Create influxdb batch
batch.push(
    {
        measurement: "maison",
        fields: {
            voltage: voltage,
            intensity: intensity,
            frequency: frequency,
            power: power,
            energy_total: energy,
            energy_daily: dailyEnergy,
            power_factor: powerFactor
        },
        tags: {
            building: "maison",
            floor: "",
            room: "",
            equipment: "pzem-016@2"
        },
        timestamp: timestamp
    }
);

// Create influxdb message
influxdbMsg = { payload: batch };

return [mqttMsg, influxdbMsg];

Alors dans mon cas, j’ai la chance d’avoir un horodatage de la trame modbus, ce qui fait que lorsque je déclenche la lecture des données du PZEM, j’ai un horodatage à minuit pile.

// Saving energy value for daily calculation
var requestTimestamp = new Date(msg.modbusRequest.value);
if (requestTimestamp.getHours() === 0 & requestTimestamp.getMinutes() === 0 & requestTimestamp.getSeconds() === 0) {
    flow.set("energy_t0_pzem@".concat(msg.unitId), energy);
}

Avec ce bout de code, je stocke l’énergie dans le contexte du flow, ce qui me permettra ensuite de calculer l’énergie consommée journalière.

// Daily energy consumption 
var dailyEnergy = energy - flow.get("energy_t0_pzem@".concat(msg.unitId));
if (dailyEnergy < 0) { dailyEnergy = dailyEnergy + 4294967295 }

Là je calcule l’énergie consommée journalière, en prenant le compte le passage à 0 du compteur du PZEM.

Vu que tu récupères les données par mqtt, voilà comment je procèderai. Tu utilises un bloc fonction (A) qui enregistre la valeur de l’énergie en continu dans le context du flow (energie_instantanée).
Ensuite, comme moi, tu déclenches à minuit un autre bloc fonction (B) qui va récupéré la valeur instantanée dans le contexte, puis la sauvegarder dans le contexte sous un autre nom (energie_t0).
Dans le premier bloc fonction (A), il suffit alors de soustraire les deux valeurs enregistrées dans le contexte (energie_instantanée - energie_t0), en prenant soint de traiter le passage à 0 du compteur, comme je l’ai fait.
Une fois l’énergie conjommée journalière calculée, il est facile de calculée les coûts.

Pour les heures creuses / pleines, ca va être un poil plus tricky, mais j’ai quelques idées, qu je te communiquerai ultérieurement.

@Ikes_72000,

Merci pour ce retour très détaillé !
Je comprends très bien le principe, j’ai appris pas mal de choses sur NodeRed avec cet exemple. En effet il y a possibilité d’adapter assez facilement ce code pour qu’il puisse coller à mon installation.
Je me demande si faire un petit programme Arduino pour le Wemos qui gérerait la récupération des données, les compteurs, et toutes les remontées d’infos via MQTT ne serait pas également une bonne solution. L’on pourrait imaginer envoyer les différents paramètres du programmes (coûts KwH, créneau horaire HP, créneau horaire HC) via MQTT également.

A réfléchir !