P1 poort slimme meter uitlezen (hardware)
Op internet zijn legio voorbeelden te vinden hoe je zelf je P1 poort kan uitlezen (zie bronnen onderaan de pagina), hetzij met RS232 USB kabeltjes tot aan de (net)Arduino toe, echter is niet elke methode een garantie voor succes!, omdat de P1 poort een rare seriële instelling heeft daar heb ik internet hier en daar afgespeurd om wat voorbeelden bij elkaar te brengen. Onderaan deze pagina heb ik ook een aantal scripts verzamelt om de P1 gegevens via ethernet/internet te versturen.
Waar moet ik rekening mee houden?
Er zijn twee standaarden voor het gebruikte (functionele) protocol in omloop:
– DSMR 3 protocol zijn de logische waarden zijn omgekeerd (0=1, 1=0) en 9600 7E1 (7 databits, even parity, 1 stop bit)
– DSMR 4 protocol zijn de logische waarden zijn omgekeerd (0=1, 1=0) en heeft een snelheid van 11500 baud.
Er zijn ook meters in omloop waarbij je niet de data hoeft te inverteren, en tussenvarianten, het is dus even uitproberen…
Het uitlezen met een Arduino is vrij lastig, mede omdat de Arduino een extra seriele poort moet “emuleren”, welke niet altijd goed werkt, de standaard “softwareSerial” library is ook niet de beste omdat deze library moeite heeft met hoge snelheden zoals 115200 baud!, daarom zijn er tal van andere “serial libraries” te vinden voor de Arduino”. Veelal is het beste om hardwarematig te seriele signalen te inverteren, dit kan met een MAX232, 7404 IC, of een BC547 / BS170 transistor, hieronder zijn een aantal voorbeelden gegeven.
Uitlezen met een USB <–> RS232 Kabel
Dit is de makkelijkste manier, de hardware in het kabeltje zelf kan vreemd genoeg al met de omgekeerde instellingen van de P1 poort overweg er is dus GEEN extra hardware nodig, gebruik de juiste seriële instellingen om de data binnen te krijgen.
P1 poort pin: | RS232 kabel pin: |
---|---|
01 (RTS / +5v) | |
02 (GND) | |
03 (NC) | |
04 (TxD) | 02 (RxD) |
De praktijk:
Putty voorbeeld: (let op: zelf je eigen COM poort nummer invullen)
Uitlezen met een Arduino Uno (library: AltSoftSerial, inverter: 7404 IC)
Wat heb je nodig?
1) Arduino UNO/NANO/MEGA:
2) ArduinoIDE software
3) ArduinoIDE AltSoftSerial library
4) 7404 IC (optioneel: breadboard + jumpwires)
Gebruik een 7404 IC (gate inverter) om de seriële data te inverteren (0=1, 1=0), van de 7404 heb je maar 1 inverter gate nodig:
– Sluit de TX pin van de P1 poort aan op pin 1 van de 7404.
– Sluit pin 2 van de 7404 aan op pin 8 van de Arduino Uno (staat beschreven in de “AltSoftSerial library”).
Dit is de pinout van een 7404 IC (er bestaan vele benamingen voor deze IC, zoals: 74HC04, SN74HC04N, HD74LS04P)
Voorbeeld aansluitschema:
De praktijk:
Uitlezen met een Arduino Uno (library: AltSoftSerial, inverter: BC547)
Wat heb je nodig?
1) Arduino UNO/NANO/MEGA:
2) ArduinoIDE software
3) ArduinoIDE AltSoftSerial library
4) BC547 transistor
5) 2x weerstand 1K Ohm
6) 1x weerstand 10K Ohm
Dit is een pinout van de BC547 transistor:
Voorbeeld aansluitschema:
De praktijk:
Alternatief met een BC547
*Mailtip* Dhr. Otten
Zie het Aansluitschema (zelfgebouwd) voor de P1-poort wat ik gebruikt heb. Die 2 diodes zijn voor extra veiligheid. De uitgang heb ik rechtstreeks aan de RX van een [WEMOS R1 D2 mini] hangen, zodat kan je mbv de harware-serial de data perfect kan uitlezen (115k baud rate). Superstabiel!
Uitlezen met een Arduino Uno (library: AltSoftSerial, inverter: BS170)
Wat heb je nodig?
1) Arduino UNO/NANO/MEGA:
2) ArduinoIDE software
3) ArduinoIDE AltSoftSerial library
4) BS170 transistor
5) 1x weerstand 1K Ohm
Dit is een pinout van de BS170 transistor:
Voorbeeld aansluitschema:
De praktijk:
Gebruik deze code met de “AltSoftSerial library”, de code is inclusief de 7-bit instellingen om de P1 poort uit te lezen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <AltSoftSerial.h> // AltSoftSerial always uses these pins: // // Board Transmit Receive PWM Unusable // ----- -------- ------- ------------ // Teensy 2.0 9 10 (none) // Teensy++ 2.0 25 4 26, 27 // Arduino Uno 9 8 10 // Arduino Mega 46 48 44, 45 // Wiring-S 5 6 4 // Sanguino 13 14 12 AltSoftSerial altSerial; char c; void setup() { Serial.begin(9600); altSerial.begin(9600); } void loop() { if (altSerial.available()) { c = altSerial.read(); // --- 7 bits instelling --- c &= ~(1 << 7); char inChar = (char)c; Serial.print(c); } } |
Als je nu de “serial monitor” van de Arduino software opent (@9600 baud), komt er elke 10 seconden een telegram binnen:
Update Juni 2016
Hebben we een firmware update gehad?, er ontbreken regels in het telegram, niet meer van toepassing?, het gaat om:
1 2 3 |
0-0:17.0.0(999*A) 0-0:96.3.10(1) 0-1:24.4.0(1) |
CRC Berekenen
*Mailtip* van Dhr. Otten
Voor wat betreft de CRC (de 4 hex waarden achter het “!”)
CRC is a CRC16 value calculated over the preceding characters in the data message
(from “/” to “!” using the polynomial: x16+x15+x2+1).
CRC16 uses no XOR in, no XOR out and is computed with least significant bit first.
The value is represented as 4 hexadecimal characters (MSB first).
Voorbeeldcode in C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
unsigned int CRC16(unsigned int crc, byte *buf, int len) { for(int pos=0; pos<len; pos++) { crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc for(int i=8; i!=0; i--) { // Loop over each bit if ((crc & 0x0001) != 0) { // If the LSB is set crc >>= 1; // Shift right and XOR 0xA001 crc ^= 0xA001; } else // Else LSB is not set crc >>= 1; // Just shift right } } return crc; } |
Bron: jantenhove @ github
Mailtips
De Sagemcom T210-D
De Sagemcom T210-D is ook een open collector. Met een 2kOhm weerstand tussen TX en +5V functioneert het uitlezen van telegrammen met een 1,8 meter lange kabel. Het functioneert ook met die 2 kilo-ohm tussen TX en RTS als je dat gebruikt om softwarematig het zenden van telegrammen te starten en stoppen.
Bronnen:
Zonnig Breda – Realtime Energiemeting online met COSM
Zonstraal.be – Datalogging van “slimme meters”
Circuits Online – Slimme Meter aansluiten op Arduino
Tweakers.net – Slimme meter via P1-poort loggen met een Netduino Plus
Tweakers.net – Alix 2d2 COM2 i.c.m. Kamstrup
Wij hebben zon! – P1 en Arduino
Maarten Damen – New smart meter installed
GEJanssen – Slimme meter uitlezen met Raspberry Pi
nodo-domotica.nl – Slimme meter P1 poort uitlezen