Smart meter in de revisie

Slimme Meter

Hoewel ik al een tijdje de slimme meter uitlas met een op ESP01 gebaseerd draadloze interface, bleef dit een een beetje een zorgenkindje: hoewel het een op Arduino gebaseerde sketch was, had ik veel moeite om het te compileren, en bovendien was het een erg gecompliceerde oplossing, die teveel mogelijkheden had voor mijn doel: ik wilde alleen de meterwaarden uitlezen via MQTT, zodat ik ze kon gebruiken in Home Assistant.
Op een gegeven moment hield de interface op met werken, dus dit was het punt om schoon schip te maken. Mijn aanpak was als volgt:

  1. Een eigen interface bouwen om de seriële output van de meter te lezen. Ik had al een paar pogingen ondernomen, maar het was elke keer mislukt.
  2. De software integreren in de 'library' die ik gebouwd had voor de Arduino Mega controllers. Dit was ook al een keer gestrand op het 'blokkerende' karakter van het uitlezen van een seriële verbinding.

Interface

De interface bouwen bleek na wat naspeurwerk simpel te zijn: het seriële signaal moest worden geïnverteerd, en dat kon met een enkele transistor en wat weerstanden:
Ik kon hierbij profiteren van het feit dat de Arduino Mega meerdere seriële interfaces kon definiëren, dus ik heb deze aansluiting via de 2e interface aangesloten:

Serial1.begin(115200); // P1 meter connected to pin 19 (RX1) of Arduino Mega

Nu zag ik keurig de zogenaamde 'telegrammen' binnenkomen, 1 x per seconde, dus ik kon verder. Ik wist ook wat de vorige keren de problemen waren:
  1. Versie 5 van het DSRM protocol, wat de slimme meter gebruikt, heeft een baudrate van 115200 baud, in plaats van 9600 in de oudere (versie 2.0), en vanaf versie 5 zijn de instellingen: 115200 baud, 8 bits, 1 stopbit, no parity (in plaats van 7 bits, 1 stopbit, even parity bij versie 4.2). Het kostte me even tijd om dit duidelijk te krijgen…
  2. De meter heeft +5V nodig op de RTS pin, anders wordt er geen data verstuurd.
Ik kon toen verder, en kwam al gauw een handige library tegen voor Arduino: https://github.com/matthijskooijman/arduino-dsmr, die voor mij de kastanjes uit het vuur haalde wat betreft het uitlezen van de data. Ik hoefde nog maar een paar zaken te regelen in mijn code:
  • Initialiseren van de seriële poort:
Serial1.begin(115200); // P1 meter connected to pin 19 (RX1) of Arduino Mega
  • bepalen welke velden werden gebruikt uit het telegram wat de meter verstuurd, dit kon middels een data construct:
using MyData = ParsedData <
               /* FixedValue */ energy_delivered_tariff1,
               /* FixedValue */ energy_delivered_tariff2,
               /* String */ electricity_tariff,
               /* FixedValue */ power_delivered,
               /* FixedValue */ voltage_l1,
               /* FixedValue */ current_l1,
               /* FixedValue */ power_delivered_l1,
               /* TimestampedFixedValue */ gas_delivered
               >;
MyData last_p1_data;
  • In de hoofdlus van het Arduino programma de seriële uitlezing activeren:
  reader.loop();
  unsigned long now = millis();
  if (now - last_p1_read > READER_INTERVAL) {
    reader.enable(true);
    last_p1_read = now;
  }
  if (reader.available()) {
    MyData data;
    String err;
    if (reader.parse(&data, &err)) {
      // Parse succesful, print result
      last_p1_data = data;
    } else {
      // Parser error, print error
      ShowDebug(err);
    }
  }
Op deze manier kwamen bij elke succesvolle leesactie de benodigde velden in de variabele 'last_p1_data' terecht, en deze werden als standaard sensoren weer teruggegeven aan Home Assistant:



Reacties

Populaire posts van deze blog

Automatisering in Home Assistant

Automatische gordijnen