Optická čtečka elektroměru 62056-21

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 06 říj 2019, 11:36

Ahoj, mám elektroměr Logarex a zjistil jsem, že má možnost optického čtení stavu. Měl by komunikovat pomocí Ir přijímače a vysílače, kdy mu pošlu kód a on mi pošle odpověď se stavem. Má s tím někdo zkušenosti? Přečetl jsem desítky diskuzí a zdá se, že by to mělo mít relativně jednoduché řešení. Ale rád bych se pobavil a někým, kdo už to stavěl.
Takový čidlo se už prodává, ale dávat 3k opravdu nechci, plus je k tomu nutný paušál, který data sbírá a to je otrava a drahý.

Objednal jsem už Ir přijímače a vysílač, vytisknu si k tomu krabičku a pak to poslu do domácího asistenta přes mqtt. Napájet to budu ideálně baterií.

Le-Ze
Příspěvky: 201
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Le-Ze » 06 říj 2019, 12:55

Bojkas píše:
06 říj 2019, 11:36
mám elektroměr Logarex
Ja take, tak pokud na něco přijdeš, poděl se.

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 06 říj 2019, 13:45

Zatím mám weby, které by mohly pomoct.
https://www.forum.iobroker.net/topic/46 ... meter/1081
http://tunn.us/arduino/landisgyr.php
https://forum.arduino.cc/index.php?topic=119247.0
https://www.google.com/url?sa=t&source= ... 0227815153

Komunikace
Optische Kommunikation EN 62056-21, Push, 9600 Bd EN 62056-21, Push, 9600 Bd
RS 485 Kommunikation EN 62056-21, Pull, 9600 Bd EN 62056-21, Pull, 9600 Bd
Eigenbedarf des
Spannungskreises
< 1W und < 10VA
(EN62053-21, EN 50470-1
< 1W und < 10VA
(EN62053-21, EN 50470-1
Eigenbedarf des
Stromkreises
< 0,5VA
(EN 62053-21,EN 50470-1)
< 0,5VA
(EN 62053-21,EN 50470-1)

Pokud by ses do toho pustil, tak den vědět i ty. Příští týden mi přijdou rx a tx Infra 38, tak si začnu hrát.

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 07 říj 2019, 11:56

Tak, pokud si s tím budeš hrát, asi by šlo použít viz níže s tím, že namísto <ACK>"000"<CR><LF> použiješ <ACK>051<CR><LF>
Jen nevím, jak přeložit 051 do toho jejich IR kódu. Uměl by někdo poradit?

Kód: Vybrat vše

// I have to use an Arduino Mega to use two different serial ports (one for usb to computer and one for the optical probe)
#include < SPI.h>

int irled = 5;
int phototransistor = A5;
bool query = 0;

void setup() {
    pinMode(irled, OUTPUT);
    Serial.begin(115200);
    Serial1.begin(300); // Starting with 300 Bd
    while (!Serial) {
      ;  
    }
    Serial.print("Arduino reading Landis+Gyr E350:\r\n\n" );


}

void loop() {
  if(query){
      byte cmd[] = {0x2F,0x3F,0x21,0x0D,0x0A}; // query "/?!"+< 13>< 10>
      Serial1.write(cmd,5); 
  }

  if(query){
      byte cmd[] = {0x06,0x30,0x30,0x30,0x0D,0x0A}; // < 06>"000"< 13>< 10> for energy data
      Serial1.write(cmd,6); 
  }

  if(Serial.available()){
      int inByte = Serial.read();
      Serial1.print(inByte, BYTE); 
  }

  if(Serial1.available()){
       a = Serial1.read() & 0x7F; // cheap way of converting from 8N1 to 7E1
       char b = a; // convert serial byte to ASCII character
       Serial.print(b);
  }   
}

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 07 říj 2019, 13:44

Tak finální verze by měla být, změnil jsem rychlost a předělal ACK z 000 na 051. Pokud by to nefungovalo, zkusím ACK 050 "{0x06,0x30,0x35,0x30,0x0D,0x0A}"

Kód: Vybrat vše

// I have to use an Arduino Mega to use two different serial ports (one for usb to computer and one for the optical probe)
#include < SPI.h>

int irled = 5;
int phototransistor = A5;
bool query = 0;

void setup() {
    pinMode(irled, OUTPUT);
    Serial.begin(115200);
    Serial1.begin(9600); // Starting with 300 Bd
    while (!Serial) {
      ;  
    }
    Serial.print("Arduino reading Landis+Gyr E350:\r\n\n" );


}

void loop() {
  if(query){
      byte cmd[] = {0x2F,0x3F,0x21,0x0D,0x0A}; // query "/?!"+< 13>< 10>
      Serial1.write(cmd,5); 
  }

  if(query){
      byte cmd[] = {0x06,0x30,0x35,0x31,0x0D,0x0A}; // < 06>051< 13>< 10> for energy data
      Serial1.write(cmd,6); 
  }

  if(Serial.available()){
      int inByte = Serial.read();
      Serial1.print(inByte, BYTE); 
  }

  if(Serial1.available()){
       a = Serial1.read() & 0x7F; // cheap way of converting from 8N1 to 7E1
       char b = a; // convert serial byte to ASCII character
       Serial.print(b);
  }   
}

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 07 říj 2019, 18:32

Tak jsme to zkusil nahrát do nodemcu, ale vyhodilo mi to chybu. Nejsem v tom úpně profík, mohl by mi to prosím někdo pomoct opravit? Je to ten kód o příspěvek víš.

Kód: Vybrat vše

opticky_sensor_elektromer:33:30: error: Klíčové slovo 'BYTE' není podporováno.
Od verze Arduino 1.0, klíčové slovo 'BYTE' přestalo být podporováno.
Užijte namísto toho funkci Serial.write()


       Serial1.print(inByte, (BYTE)); 

                              ^

opticky_sensor_elektromer:37:8: error: 'a' was not declared in this scope

        a = Serial1.read() & 0x7F; // cheap way of converting from 8N1 to 7E1

        ^

exit status 1
Klíčové slovo 'BYTE' není podporováno.

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Optická čtečka elektroměru 62056-21

Příspěvek od RomanB » 07 říj 2019, 20:47

Zdravím, tento kód je, jak uvádí autor, pouze takový myšlenkový nástřel. Já to chápu asi takto:

Tímto musíme elektroměr probudit, ale s baudrate 300:

Kód: Vybrat vše

byte cmd[] = {0x2F,0x3F,0x21,0x0D,0x0A}; // query "/?!"+< 13>< 10>
      Serial1.write(cmd,5); 
a pokud bude příjem ve tvaru:

Kód: Vybrat vše

/XXX5YYYYY<CR><LF>  (XXX is the manufacturer ID; YYYYY is the meter ID; 5 is the new baudrate = 9600 bps)
dále nastavíme rychlost na 9600 a odešleme:

Kód: Vybrat vše

byte cmd[] = {0x06,0x30,0x35,0x31,0x0D,0x0A}; // < 06>051< 13>< 10> for energy data
      Serial1.write(cmd,6); 
A čekáme na příjem dat. Mrkni na https://forum.mysensors.org/topic/9673/ ... ergy-meter
a nebo tady https://wiki.hal9k.dk/projects/kamstrup

Dohromady to nedám, nemám budík s IR.

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 07 říj 2019, 21:28

Zdravím, tomu rozumím. Nejdřív potřesení rukou a pak už konkrétní dotaz s rychlostí. To by snad nemělo být až takový problém, ale ten jeho kód je trochu zvláštní. Sice definuje A5, jako přijímač, ale už jej pak nikde nepoužívá. Z mých velmi malých zkušeností by to pak nemělo fungovat, nebo se mýlím? Zkompilovat a nahrát do desky to šlo, ale co to přesně bude dělat tak úplně nevím. Snad pozítří to vyzkouším s IR TX a RX.

Chlapík v tomto postu tvrdí, že data čte a má velice podobný kód, jako ten první. https://forum.arduino.cc/index.php?topi ... msg1242628

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 07 říj 2019, 21:41

Tak se mi podařilo dopátrat k původnímu kódu na githubu, zkusím ho podrobněji prozkoumat, jestli mi to bude dávat smysl. https://github.com/infr/arduino/blob/ma ... is_gyr.ino

Kód: Vybrat vše

/*
Mode A (IEC 62056-21)
/ = 2FH or AFH
? = 3FH
! = 21H
CR = 0DH
LF = 0AH
Mode B(?) (DLMS/COSEM)
(https://github.com/gurux)
Could help:
https://github.com/securestate/termineter
http://www.build-electronic-circuits.com/arduino-remote-control/
https://github.com/z3t0/Arduino-IRremote
https://github.com/sigio/dsmr22-landis-gyr-interface
http://forum.arduino.cc/index.php?topic=119247.0
About the meter:
http://www.landisgyr.fi/webfoo/wp-content/uploads/2012/09/D000028193_E350_d_en11.pdf
About the optical sensor:
Has been used: http://www.seeedstudio.com/wiki/index.php?title=Photo_Reflective_Sensor
Will be used: http://www.bebek.fi/kauppa/lisatiedot.php?PHPSESSID=v0fdpcds4eupvfaf92rjq5ppu5&&tuote_id=15973
http://www.vishay.com/docs/83760/tcrt5000.pdf
*/

#include <SoftwareSerial.h>

int led = 7;
int del = 100;

SoftwareSerial softSerial(10, 11); // TX, RX

byte a;

void setup() {
    pinMode(led, OUTPUT);
    Serial.begin(115200);
    while (!Serial) {
      ;  
    }
    
    softSerial.begin(9600);
    //softSerial.println("Hello, world?");
    Serial.println("Data from port:");
}

void loop() {
  digitalWrite(led, HIGH);
  delayMicroseconds(del);
  digitalWrite(led, LOW);
  delayMicroseconds(del);

  if(digitalRead(6)){
    del = del + 10;
    Serial.print("+");
    Serial.println(del);
  }
  
  if(digitalRead(5)){
    del = del - 10;
    Serial.print("-");
    Serial.println(del);

  }
  
   /*
  softSerial.listen();
  
  // while there is data coming in, read it
  // and send to the hardware serial port:
  while (softSerial.available() > 0) {
    Serial.write(softSerial.read());
    digitalWrite(led, HIGH);
  }
  
  delay(1000);
  digitalWrite(led, LOW);
*/
 /*
  byte cmd[] = {0xAF,0x3F,0x21,0x8D,0x0A};
  softSerial.write(cmd,5);
  
  while (softSerial.available() > 0){
    a = softSerial.read() & 0x7F; // cheap way of converting from 8N1 to 7E1
    char b = a; // convert serial byte to ASCII character
    Serial.print(b);
  }
  //Serial.println();
  delay(100);
 
  digitalWrite(TXpin, HIGH);
  delay(100);
  output = analogRead(RXpin);
  if(output 1){
     digitalWrite(led, HIGH);
     Serial.println("BING!");
     delay(1000);
     Serial.println("");
  }
  Serial.println(output);
  delay(100);
  digitalWrite(led, LOW);
  digitalWrite(TXpin, LOW);
  delay(200);*/
  

  Serial.println("Meter type");
  
  byte cmd[] = {0xAF,0x3F,0x21,0x8D,0x0A}; // query the meter for data "/?!"+<13><10> (OR {0x2F,0x3F,0x21,0x0D,0x0A}??)
  iskSer.write (cmd,5);
  
  byte a;
  while (iskSer.available() > 0){
    a = iskSer.read() & 0x7F; // cheap way of converting from 8N1 to 7E1
    char b = a; // convert serial byte to ASCII character
    Serial.print(b);
  }
  Serial.println();

  //<06>"000"<13><10> for energy data
  //loop through every single byte in the buffer and convert it to readable characters
  
}

Bojkas
Příspěvky: 15
Registrován: 12 črc 2018, 12:41
Reputation: 0

Re: Optická čtečka elektroměru 62056-21

Příspěvek od Bojkas » 11 říj 2019, 09:39

Tak jsem zkusil už asi 10 nalezených kódů, ale ani jeden s lehkými úpravami nefunguje korektně. Nepomohl by mi prosím někdo pomoct se sestavením kódu? Myslím, že by to bylo užitečné pro spousty "bastlířů", kteří mají elektroměry EONu.

Mám:
IR vysílač a přijímač
https://www.laskarduino.cz/ir-infracerv ... khz-modul/
https://www.laskarduino.cz/robotdyn-ir- ... -ovladani/

Lolin NodeMCU 0.9

Potřebuji odeslat pravděpodobně přes IR 300 baud
Zpráva: 0x2F, 0x3F, 0x21,0x0D, 0x0A
Počkat na odpověď: Pravděpodobně typ elektroměru
Zpráva: 0x06,0x30,0x35,0x30,0x0D,0x0A
Počkat na odpověď: data z elektroměru

Nějaké základy bych dohromady dal, ale s IR žádné zkušenosti nemám.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů