SlimmeMeter

Slimme Meter uitlezen met Arduino

Ik heb een slimme meter van het merk Landis & Gyr, type E350. Deze meters bieden de mogelijkheid om zelf je energieverbruik te monitoren. Daarom ben ik op zoek gegaan naar de mogelijkheden om deze meter zelf uit te lezen en de resultaten op te slaan in een database. Ik gebruik hiervoor een Arduino Uno en een virtuele Debian linux server met Apache, PHP5 en MySQL.

Het is vrij eenvoudig om deze slimme energiemeters uit te lezen via de aanwezige P1 poort. Elke 10 seconden genereert de meter een telegram dat er als volgt uitziet:

/XMX5LGBBFFB231170430

1-3:0.2.8(40)
0-0:1.0.0(150531205441S)                                           // Datum/tijd
0-0:96.1.1(4530303035303031353735373435333134)
1-0:1.8.1(000992.992*kWh)                                         // Elektra verbruik laag tarief
1-0:2.8.1(000348.890*kWh)                                         // Elektra opbrengst laag tarief
1-0:1.8.2(000560.157*kWh)                                         // Elektra verbruik hoog tarief
1-0:2.8.2(000859.885*kWh)                                         // Elektra opbrengst hoog tarief
0-0:96.14.0(0001)
1-0:1.7.0(00.424*kW)                                                  // Huidig verbruik
1-0:2.7.0(00.000*kW)                                                  // Huidige teruglevering
0-0:17.0.0(999.9*kW)
0-0:96.3.10(1)
0-0:96.7.21(00003)
0-0:96.7.9(00000)
1-0:99.97.0(0)(0-0:96.7.19)
1-0:32.32.0(00000)
1-0:52.32.0(00000)
1-0:72.32.0(00000)
1-0:32.36.0(00000)
1-0:52.36.0(00000)
1-0:72.36.0(00000)
0-0:96.13.1()
0-0:96.13.0()
1-0:31.7.0(001*A)
1-0:51.7.0(000*A)
1-0:71.7.0(001*A)
1-0:21.7.0(00.214*kW)
1-0:41.7.0(00.000*kW)
1-0:61.7.0(00.208*kW)
1-0:22.7.0(00.000*kW)
1-0:42.7.0(00.000*kW)
1-0:62.7.0(00.000*kW)
0-1:24.1.0(003)
0-1:96.1.0(4730303032333430313638393836383134)
0-1:24.2.1(150531200000S)(00811.923*m3)                 // Gasmeterstand
0-1:24.4.0(1)
!5F31

 De kunst is nu om dit telegram om te vormen naar iets wat je in een database op kunt slaan.

Componenten voor het uitlezen

Ik gebruik voor het uitlezen een Arduino Uno. Let op: met een Arduino Nano werkt het niet, omdat de ESP8266 teveel vermogen vraagt van de 3.3V poort. De slimme meter levert een geinverteerd signaal (0 is hoog en 1 is laag). Om dit voor de Arduino begrijpelijk te maken hebben we een weerstand en een condensator nodig. Verder is de Rx poort (pin 4) "zwevend". Om hier een juiste spanning te krijgen is het nodig om de RTS poort (pin 1) en de Rx poort met een weerstand te verbinden.

Na het solderen ziet dit er als volgt uit:

En gemonteerd:

 

Programma code

De benodigde code bestaat uit drie delen:

  • Een MySQL database
  • De Arduino code
  • De PHP pagina

De Arduino code genereert een url voor het aanroepen van de php pagina met alle meetwaardes als variabelen. Deze url wordt met een GET commando verstuurt naar de webserver. Daar zorgt de PHP code ervoor dat de ingelezen meetwaardes in de SQL database geplaatst worden.

De MySQL database is als volgt aangemaakt:

CREATE TABLE `SlimmeMeter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `lt_verbruik` int(11) NOT NULL,
  `ht_verbruik` int(11) NOT NULL,
  `lt_opbrengst` int(11) NOT NULL,
  `ht_opbrengst` int(11) NOT NULL,
  `huidig_verbruik` int(4) NOT NULL,
  `gas` int(11) NOT NULL,
  `sp_opbrengst` int(11) DEFAULT NULL,
  `sp_power` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

Het Arduino script vind je hier

En de PHP code hier