Slimme Meter aansluiten op Arduino

Ik heb sinds kort een slimme meter in mijn meterkast hangen met de mogelijkheid om hier eigen meet apparatuur op aan te sluiten. Nu wil ik hier zelf wat mee gaan experimenteren in combinatie met een Arduino bord, alleen zit ik wat te puzzelen met hoe het geheel aangesloten moet worden.

De koppeling met de slimme meter gaat via de P1 poort. Volgens de specificatie (DSMR v4.0 final P1.pdf) is de pin verdeling van de RJ-11 connector als volgt:

1. +5v (Power Supply)
2. Request
3. Data GND
4. -
5. Data
6. Power GND

Zodra er op de request pin 5V staat gaat de meter de waardes versturen over de data pins.
Voor zover ik terug kan halen gaat dit volgens het TTL systeem, eveneens op 5V.
Dit zou compatible moeten zijn met de UART die op de Arduino zit, echter dit geheel
rechtstreeks op de Arduino inpluggen lijkt mij niet wenselijk. In het hierboven genoemde
document wordt dan ook gesproken over een constructie mbv een opto-coupler (zie laatste
pagina). Helaas is mijn electronica kennis niet genoeg om uit te vogelen hoe het schema nu
volledig in elkaar zit, en welke componenten ik nodig heb hiervoor.

Mijn vraag is dan ook of jullie mij op weg kunnen helpen met de schakeling.

Shiptronic

Overleden

waarom een arduino ? die poort knoop je toch zo aan je serieele poort(rs232)? opto er tussen en gaan ?

met een terminal verster zie je zo de zooi voorbij komen, wel even de juiste baudrate ( )instellen ! (die staat standaart vaak op 9800 oid.)

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Omdat er dan een PC oid in mn meterkast moet.

Waarom met een PC, als het ook met een Arduino kan? :-)

@Linor: als je een optocoupler gebruikt, moet je er wel zorg voor dragen dat je het signaal niet inverteert. Zo, dus:

http://prosje.be/CO/Schemas/RS232OptoVerbinding.png

Voor een rechtstreekse verbinding met de PC moet je het signaal juist wèl inverteren, een optocoupler gebruiken die met hogere spanningen overweg kan, en hem (rechts) voeden met +6V ... +12V en -6V ... -12V (ipv. GND).

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Helemaal super pros, daar kan ik wat mee. Enige vraagje wat mij dan rest is die pin 2 van de slimme meter, daar moet ik een 5v signaal op zetten om het versturen te starten (zolang de 5v blijft, blijft de meter sturen). Kan ik daar dan rechtstreeks een output poort van de arduino op aansluiten? Door de opto-coupler zijn de circuits toch gescheiden, waardoor alleen een +5v niet werkt?

Als je de meter en de Arduino galvanisch gescheiden wil houden, kan je niet zomaar een Arduino-pin met de Request-pin van de meter verbinden.

Opties:
Je verbind aan de meter-zijde Request met +5V. De meter blijft dan data leveren, ook als er niemand luistert [seksistisch commentaar onderdrukt].
Je gebruikt een tweede optocoupler om vanuit de Arduino de Request-pin hoog te maken (te verbinden met de +5V van de meter).
Je gebruikt een klein relais (een reed-relais) om hetzelfde te bereiken.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Zoals ik het lees is de meter al voorzien van optoisolators. In de PDF staan de eisen die aan de meter worden gesteld en de eis is dat het signaal met opto-isolators gescheiden is. Maar correct me if I am wrong.

Als ik voor de request pin ook een opto coupler gebruik, dan kom ik toch op onderstaande schema terecht? Of moet er ook nog een weerstand richting de request line van de slimme meter zitten?

http://www.kschaap.dds.nl/arduino_slimmemeter.png

De request-pin zal wel over een interne pull-down weerstand beschikken. Anders weet de meter, als er niets op de uitgang aangesloten is, niet wat te doen.
Je kan dan voor IC2 beter een gewone optocoupler nemen (een 4N35 of zo), en diens uitgangen tussen +5V en Request plaatsen.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Uiteraard zat ik in de verkeerde specs te kijken, en maakt mijn Iskra meter gebruik van de DSMR 3.0 standaard, dit betekend dus onder andere geen aparte 5V om de request pin aan te sturen. Ik heb nu het geheel als volgt aangesloten:

http://www.dds.nl/~kschaap/arduino_slimmemeter2.png

Als ik het goed heb zou dit het signal van de slimme meter ook moeten inverteren. Specificatie zegt: SPACE (0) as > 4V, MARK (1) as < 1V, en zou de Arduino precies het tegenovergestelde verwachten.

Ik krijg nu ook een signaal binnen op de seriele poort (die ik nu op 9600 baud, 7E1 ingesteld heb), echter is het nog niet het verwachte resultaat. Voorlopig nog maar even doorzoeken dus.

Die had ik inderdaad al gezien, echter wordt hier gebruik gemaakt van een standaard kabel. Mogelijk dat ik die alsnog aanschaf, maar ik zou toch graag het werkende hebben met de Arduino. Ik heb berichten gezien van mensen die 't voor elkaar hadden, alleen heb ik nog geen schema's e.d. te pakken kunnen krijgen.

Op 25 juli 2012 23:23:56 schreef Linor:
Als ik het goed heb zou dit het signal van de slimme meter ook moeten inverteren. Specificatie zegt: SPACE (0) as > 4V, MARK (1) as < 1V, en zou de Arduino precies het tegenovergestelde verwachten.

Als de uitgang van de meter hoog is, spert de optocoupler-LED. Daardoor is het signaal aan de uitgang v/d optocoupler óók hoog! Van inverteren is dus geen sprake.
Pinnen 2 en 3 v/d optocoupler omwisselen tussen pin 5 en GND plaatsen, dus.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Is dat uitgaande van de oorspronkelijke schakeling Pros, of de laatst door mij geposte? In de constructie die ik nu heb zit er standaard 5v op pin 2, en ik ging er vanuit dat als de data pin dan laag was, de led ging branden. Of werkt een optocoupler uit zichzelf al inverterend?

Ik ga hier uit van jouw schema.
Als pin 5 v/d meter laag is, brand de LED en wordt de uitgang van de optocoupler ook laag. Er wordt dus niet geïnverteerd.

Als je de LED+weerstand tussen pin 5 en GND plaatst, gaat de optocoupler wèl inverteren.

[Bericht gewijzigd door pros op vrijdag 27 juli 2012 06:33:59 (22%)

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Ik heb jouw voorstel geprobeerd, maar op een of andere manier blijft er nog steeds verkeerde data uit komen. Ik heb nu alleen een 7404 zitten tussen data en de arduino, en nu werkt alles goed. Op zich mooi natuurlijk, maar ik ben nu wel benieuwd waarom de versie met de opto-coupler niet werkt.

Het pricipe is OK. Ik heb in meerdere zelfbouw-apparaten de 6N138 als optische koppeling gebruikt voor RS232-communicatie op 38400baud (in beide richtingen, dus).
Dat werkt zonder problemen ... maar er schiet me wel iets te binnen: in het begin liep het wel eens fout. Dat heb ik verholpen door tussen de beide GND-aansluitingen een hoogohmige weerstand te plaatsen - 220k of zo.
Er is dan geen sprake meer van 100% galvanische scheiding, maar het is nog steeds veiliger dan een rechtstreekse verbinding.
Waarom het zonder die weerstand minder goed werkte? Geen idee. Ik zou zeggen: probeer het eens.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Erg interessant bovenstaande...
Ik heb sinds kort ook een slimme meter en zou deze ook graag uit willen lezen met een Arduino. Ik heb nog een aantal 817C opto's liggen. Zou het daarmee ook kunnen i.p.v. de hier genoemde Opto.

@Linor: Je laatste bericht is al weer een poosje geleden. Heb je nog updates?

Mijn Kamstrup 382 meter lees ik nu uit met een Arduino Mega2560.
Aangezien het een redelijke puzzel was, hierbij mijn ervaringen.

De meter heeft bij mijn weten zelf een optocoupler.
Het RTS signaal stuur ik dan ook gewoon met 5V vanuit de Arduino, wel heb ik er voor de zekerheid maar een 220 Ohm weerstand tussen gezet.
Elke 10 seconden stuurt de meter nu data, maar inderdaad geinverteerd. Ik inverteer dit signaal met een simpele FET: de Gate zit aan de signaaldraad van de meter; de drain hangt middels een 10K weerstand aan de 5V en dit gaat naar poort 19 van de Arduino (Rx1, UART 1). Source uiteraard aan de massa; dit is de massa van de Arduino en die gaat ook naar de massa van de meter.
Al met al gaan er dus maar 3 draden naar de meter.
Uitlezen via de PC gaat via USB/UART0, gewoon via 9600/8/N/1.

Het data signaal inlezen via UART1 was wat lastiger, gezien de 9600/7/E/1 instelling.

Hierbij de code:


char x;

void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
Serial1.begin(9600);
// defaults to 7-bit, even parity, 1 stop bit 
//clear parity, stop bits, word length 
UCSR1C = UCSR1C & B11000001; 
UCSR1B = UCSR1B & B11111011; 

//Set word length to 7 bits 
UCSR1C = UCSR1C | B00000100;
UCSR1B = UCSR1B | B11111000;

//Even parity 
UCSR1C = UCSR1C | B00100000; 

//1 Stop bit 
UCSR1C = UCSR1C | B00001000; 

Serial1.flush(); 
}

void loop() {

if (Serial1.available() > 0) {
  x = Serial1.read();
  Serial.print(x);
  }
}

Happy metering!

Op 25 juli 2012 23:23:56 schreef Linor:
Uiteraard zat ik in de verkeerde specs te kijken, en maakt mijn Iskra meter gebruik van de DSMR 3.0 standaard, dit betekend dus onder andere geen aparte 5V om de request pin aan te sturen. Ik heb nu het geheel als volgt aangesloten:

[afbeelding]

Als ik het goed heb zou dit het signal van de slimme meter ook moeten inverteren. Specificatie zegt: SPACE (0) as > 4V, MARK (1) as < 1V, en zou de Arduino precies het tegenovergestelde verwachten.

Ik krijg nu ook een signaal binnen op de seriele poort (die ik nu op 9600 baud, 7E1 ingesteld heb), echter is het nog niet het verwachte resultaat. Voorlopig nog maar even doorzoeken dus.

Ik heb deze schakeling ook opgebouwd en ik krijg de volgende output
0-0:96.1.1(???)
1-0:1.8.1(00208.578*kWh)
1-0:1.8.2(00197.881*kWh)
1-0:2.8.1(00032.221*kWh)
1-0:2.8.2(00058.399*kW)
00:61.0002
1-:..00007*k)
1-0:27.(00.0*W
-:1..009.0*W)
0-0:9.31(1
00:6131)
00:6130)
!

Op zich lijkt het redelijk op het gewenste resultaat, echter op een gegeven moment is de binnenkomende data verminkt (en dan bedoel ik niet die lachebekjes...). Steeds bij meterstand 2.8.2
Iemand een idee hoe dit en wat ik er eventueel aan kan doen?

Dit is wat ik gevonden had voor een slimme meter uit te lezen.

Je kan je slimme meter uitlezen met enkel een oude RJ11 kabel en een Arduino. Sluit geel op pin10, zwart op pin4 en rood op ground, gebruik onderstaande code en je kan beginnen met uitlezen.


#include <SoftwareSerial.h>

const int requestPin =  4;
int incomingByte = 0;
String inputString = "";
boolean start_p1_record;
boolean data_ready = false;

SoftwareSerial mySerial(10, 11, true); // RX, TX, inverted

void setup () {
  mySerial.begin(9600);
  delay(1);
  Serial.begin(9600);

  Serial.println("P1 Smart meter reading - START\n");

  pinMode(requestPin, OUTPUT);
  digitalWrite(requestPin, HIGH);
}

void loop () {
  while (mySerial.available() > 0) {
    
    incomingByte = mySerial.read();
    incomingByte &= ~(1 << 7);
    char inChar = (char)incomingByte;
    inputString += inChar;

    if (inChar == '/') {
      start_p1_record = true;
    }

    if (inChar == '!') {
      data_ready = true;
      start_p1_record = false;
      Serial.println("\n\nData received!\n\n\n");
      Serial.println(inputString);
      inputString = "";
    }

    if (inputString.length() > 350) {
      start_p1_record = false;
      inputString = "";
    }
  }

}

Voorbeeld code :


/ISk5\2ME382-1003

0-0:96.1.1(xxxhierstaatmijnmetercodexxx)
1-0:1.8.1(00053.950*kWh)
1-0:1.8.2(00084.458*kWh)
1-0:2.8.1(00003.303*kWh)
1-0:2.8.2(00009.309*kWh)
0-0:96.14.0(0002)
1-0:1.7.0(0000.14*kW)
1-0:2.7.0(0000.00*kW)
0-0:17.0.0(0999.00*kW)
0-0:96.3.10(1)
0-0:96.13.1()
0-0:96.13.0()
!

Edit : Nog even aangeven dat ik dit gevonden had via google...
Niet dat ik dit zelf gepobeerd heb.

Het komt uit een Topic in GoT (Forum van Tweakers.net)

Beste Xtremer,

Bedankt voor deze informatie! Ik heb het geprobeerd na te bootsen, echter zonder goed resultaat:

  • Arduino Uno.
  • Kamstrup 382 JxC.
  • Code en aansluitingen zoals in je post. Geen weerstandjes, gewoon rechtstreeks.

Ik zie dat de meter elke 10 seconden wat doorgeeft, echter ik krijg niet zo'n mooie output als jij. Sterker nog, er is geen structuur in te herkennen. Veel niet-leestekens en controlecharacters uit het begin van de ascii tabel.

Vraagje: is de baudrate voor alle meters hetzelfde? In DSMR v4.0 lees ik namelijk 115200 baud. Niet dat dat werkt, overigens.

Heb je andere ideeen over wat er mis zou kunnen zijn, of wat ik zou kunnen testen? Ik heb helaas geen scoop.

Update: ik heb het op een andere manier aan de praat gekregen: via een 7404 naar de hardware Rx van de Arduino (i.p.v. via SoftwareSerial) en gewoon 9600 Baud. Waarom het met SoftwareSerial niet werkt, geen idee. Aangezien ik deels leesbare waarden kreeg, en voor 75% verder rotzooi, vermoed ik dat er mogelijk hier en daar een serial bitje miste.

[Bericht gewijzigd door wjmb op dinsdag 27 november 2012 20:57:47 (20%)

Xtremer,

Die code van jou werkt bij mijn meter ook. Hier kan ik wat mee.
Ik heb de schakeling van Linor (Gepost woensdag 25 juli 2012 23:23:56) hiervoor gebruikt.
Ik gebruik een Arduino Uno met ethernetshield.
Volgende stap is middels PHP de data in een SQL database poten.

Linor, bedankt voor de link naar de specificaties. Prachtige informatie.

I hear and I forget, I see and I remember, I do and I understand. ---- Confusius ----

Op 13 juli 2012 21:24:22 schreef Linor:
Omdat er dan een PC oid in mn meterkast moet.

Ik gebruik hiervoor een Moxa Nport werkt perfect...

Wilfred v/d Goorbergh