Autonomie Energétique Etape 1 : la mesure de sa consommation

Mon objectif est  de viser l’autonomie.

Quelle soit énergétique, alimentaire, en eau, … l’autonomie 🙂

Mais avant de penser concrètement à l’autonomie et dimensionner tout un système, il faut savoir vers où aller.

Quelle est ma consommation en électricité ? Ma consommation réelle, pas simplement une consommation basée sur trois questions comme sur certains sites qui vendent des panneaux solaires « vous êtes 3 dans la maison, un four, un pc, … ca fait 3000kWh/an » (comme dans certains magasins de bricolage).

Cela permettra tout d’abord de prendre conscience de sa consommation  et de  la réduire en gardant un confort (en étant informé de ce qui consomme et quand), et d’envisager de placer des panneaux solaires/éolienne/… pour produire mon électricité et la stocker/consommer sans la réinjecter sur le réseau.

Hardware

Au départ j’avais pensé utiliser les systèmes proposés par OpenEnergyMonitor, et les adapter à mon usage, avec un arduino, un shield ethernet, quelques capteurs de courantet un capteur de tension.

Génial pour un ingénieur, de quoi s’éclater quelques soirées.

Après avoir tout installé et configuré, j’ai trouvé des résultats de mesure bizarres sur mon installation triphasée sans neutre déséquilibré (une consommation plus élevée lorsque je débranche le frigo par exemple).

Et j’ai commencé à chipoter dans le code de calcul des puissances de OpenEnergyMonitor. Puis ca devenait trop bricolage et pas du tout robuste, alors j’ai décidé de passer sur un compteur à impulsions.

Un compteur à impulsions, c’est simple à installer, c’est robuste, efficace et précis. Pas de calibration. Pas de bidouille à faire, pas de bricolage. Il suffit de compter les impulsions sur une période de temps donnée.

J’ai décidé de partir sur un compteur à impulsions de Eastron SDM72M. C’est du made in china, mais qui a pignon sur rue et une filiale en Europe (ca me semble important pour quelque chose qu’on installe dans son tableau électrique, avec le marquage CE). Pour 70€ on a quelque chose de correct, avec les frais de douanes, d’importation et tout le tralala.

Pour compter les impulsions, j’utilise un arduino, avec la sortie impulsion du compteur branchée sur une pin qui peut recevoir un interrupt sur un flanc montant ou descendant.

Niveau schématique cela donne :

Et c’est tout ce qu’il faut pour connaître sa consommation électrique. Il faut ensuite s’attaquer à la partie software.

Software

Le côté software se divise en trois parties. D’une part, l’arduino qui compte les impulsions et envoie un chiffre toutes les 30 secondes à mon server de domotique.

Ensuite, il y a le petit server UDP qui tourne en permanence sur mon server et qui stocke les infos dans une base de données.

Et pour finir, il y a l’affichage, via grafana, sans quoi tout cela serait difficilement exploitable.

Arduino

Sur l’arduino, je passe les commandes de base pour configurer son shield ethernet et mettre en route le port série.
On configure la PIN comme étant un interrupt de type FALLING (on lancera donc l’interrupt sur chaque flanc descendant des impulsions)
Et enfin, on compte, et on envoie toutes les 30secondes sur le serial monitor (au cas où) et sur le reseau.

J’ai aussi prévu un « débounce » software pour éviter de compter des impulsions trop rapprochées (qui ressembleraient à du parasitage dû au bounce de capteurs électromécaniques, même si sur le compteur que j’ai acheté ce n’est pas le cas)

Si vous avez des questions là dessus, n’hésitez pas à laisser un commentaire !

#define ELECPIN 21
volatile unsigned int elecpulse; 
unsigned long time;
unsigned long debounceInterval = 300;

static byte webServerIp[] = { 192,168,1,100};
static int webServerPort = 80;

EthernetClient client;
char bufferString[25];

static long timer;
char cParam[255];
EthernetUDP Udp;
unsigned int localPort = 8888;


void setup() { 
  Serial.begin(9600); 
  
  pinMode(ELECPIN, INPUT_PULLUP); 
  attachInterrupt(digitalPinToInterrupt(ELECPIN), count_pulse_elec, FALLING);
  elecpulse=0; 
  time=0;
  Ethernet.begin(mymac,myip);
  delay(500);
  Udp.begin(localPort);
} 
 
void loop() { 
  if (millis() - time > (long)30*1000) {
    time = millis();
    Serial.print("ELEC: "); 
    Serial.println(elecpulse); 

    if(elecpulse >0){
      String param = "elec:";
      param += floatToString(bufferString, elecpulse, 2);
      Udp.beginPacket(webServerIp, 52123);
      Udp.print(param);
      Udp.endPacket();
      Serial.println(F("data sent"));
      elecpulse=0;
    }
    else{
      Udp.beginPacket(webServerIp, 52123);
      Udp.print("PING");
      Udp.endPacket();
    }
  }
} 

void count_pulse_elec()
{
  static unsigned long last_interrupt_time = 0;
  unsigned long interrupt_time = millis();
  if (interrupt_time - last_interrupt_time > debounceInterval) //declare the debounce/block out interval in setup
  {
    elecpulse++;
  }
  last_interrupt_time = interrupt_time;
 }

Server

J’ai décidé de coder le petit script de server UDP en PHP, par facilité.

if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
        $errorcode = socket_last_error();
  $errormsg = socket_strerror($errorcode);
  die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
if( !socket_bind($sock, "0.0.0.0" , 52123) )
{
        $errorcode = socket_last_error();
  $errormsg = socket_strerror($errorcode);
  die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";

ensuite il suffit de vérifier les paquets que l’on recoit sur ce server et de les stocker quelque part, sur influxdb, sql, csv … n’importe où !

while(1)
{
	echo "Waiting for data ... \n";
	$r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
	echo "$remote_ip : $remote_port -- " . $buf;

	if (preg_match('/elec:([0-9.]+)/', $buf, $matches, PREG_OFFSET_CAPTURE)){
		$power = (float)$matches[1][0];
		// ici on peut faire ce qu'on veut avec $power.
		...
	}
}

socket_close($sock);

Pour que ce script se lance au démarrage, il faut aussi un script de démarrage qui sera placé dans /etc/systemd/system

[Unit]
Description=UDP server for arduino
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/php -f /home/XXXXX/www/energy/udp.php
Restart=on-failure
KillSignal=SIGINT
SyslogIdentifier=energymonitor_UDP
StandardOutput=syslog

[Install]
WantedBy=multi-user.target

Grafana

Toutes les 30secondes nous stockons dans influxDB le nombre d’impulsions reçues.
Chaque impulsion correspond à 1Wh d’énergie (le compteur renvoie 1000 impulsions pour chaque kWh).

Je décide de configurer un histogramme, dont les barres représentent 30secondes. Je dois donc multiplier le nombre d’impulsions recues pendant ces 30 secondes par 120 pour avoir une idée de la puissance consommée (1Wh toutes les 30secondes, ca fait 2Wh par minute, donc 120Wh par heure, soit une puissance de 120W allumée pendant 1h. 1Wh/30secondes correspond donc à une charge de 120W).

Ensuite, je prends ma facture d’electricité, et je peux calculer combien chaque kWh me coute, et je peux ressortir le résultat.

Résultats immédiats

Je constate rapidement que :

  • je me suis fait du thé à 20h en écrivant cet article 🙂
  • mon petit chauffe-eau sous évier dans la cuisine s’allume toutes les 4h, avec un pic d’environ 1.5kW. Tout cela pour avoir de l’eau chaude instantanée au robinet avant que la chaudière ne prenne le relais.
    Il n’y a aucun intérêt de le faire fonctionner la nuit, je ne vais pas nettoyer une grande casserole à 2h du matin… Niveau énergie, si je coupe le chauffe eau la nuit, avec la déperdition de chaleur, je devrais chauffer plus lorsqu’il se rallume le matin (et reviendra donc au même).
    SAUF :
    – si j’ai des panneaux solaires qui me donnent de l’énergie « gratuite » en journée. Dans ce cas, il vaut mieux mettre toutes ces charges la journée et éteindre la nuit
    – si j’optimise ses heures de fonctionnement pour chauffer l’eau que lorsqu’on faire théoriquement la vaisselle : avant et après les repas
    A voir donc …
  • Ma consommation « en veille » est quand même de 200W, ce que je trouve important mais pas si mal sachant que j’ai un NAS qui tourne en permanence dans le garage et que je suis un gros geek.
    Le frigo et le congélateur y sont aussi pour quelque chose. D’ailleurs, le congélateur sera bientôt éteint (on ne l’utilise qu’en été principalement, pour faire des glaces pour les enfants. En été, avec des panneaux solaires, on peut se permettre ce genre de consommation la journée)

Et vous ? Quelles sont vos analyses de votre consommation ?

Si cet article vous a plu, inscrivez-vous à la newsletter pour être informé de la publication d'autres articles.

Vous pouvez aussi partager cet article sur les réseaux sociaux

Laisser un commentaire