Alleen 3 regels uit p1 poort

Arduino specifieke Software
Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 14 Dec 2019, 14:04

Met een ESP heb je geen externe hardware nodig om de software een keuze te laten maken voor de juiste variant.
Je kan met een webpagina via een soft accespoint of direct via WiFi de keuze vastleggen.
Dus dat wordt stoeien met HTML.
Eventueel door de keuze een EEPROM bewaren zodat bij herstart de keuze bewaart blijft.
Maar misschien begreep ik je m.b.t. de serial input waarde verkeerd.
Misschien wilde je alleen een oude waarde met een nieuwe vergelijken.
In dat geval moet je die oude waarde ergens vastleggen zodat je elke keer als de nieuwe waarde 1 kW groter is je de gewenste actie kan uitvoeren.
Na die actie het veld oude waarde weer opnieuw bewaren.

m.v.g. Nico

Advertisement

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 14 Dec 2019, 15:04

Eeprom ga ik denk ik niet gebruiken, die complete waarde wordt na een eventuele herstart toch weer opgehaald.
Die Long value moet ik dan denk ik naar een float omzetten en daarmee gaan vergelijken.
Ik ga even snuffelen hoe ik dat het beste kan doen.

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 16 Dec 2019, 12:15

Vanmorgen even de sketch getest met de Serial.write( inChar); aan. Hieronder het register wat eruit kwam:

Code: Alles selecteren
Gestart
P1 poort op 9600 baud
/ISk5\2MT382-1003
---> Telegram iedere : 1.75 seconden

0-0:96.1.1(5A424556303035303938363130333132)
1-0:1.8.1(72118.031*kWh)
Elektra - meterstand verbruik LAAG tarief (Wh): 72118031
1-0:1.8.2(57428.169*kWh)
Elektra - meterstand verbruik HOOG tarief (Wh): 57428169
1-0:2.8.1(00000.000*kWh)
Elektra - meterstand teruglevering LAAG tarief (Wh): 0
1-0:2.8.2(00000.000*kWh)
Elektra - meterstand teruglevering HOOG tarief (Wh): 0
0-0:96.14.0(0002)
1-0:1.7.0(0011.27*kW)
Elektra - actueel verbruik (W): 11027
1-0:2.7.0(0000.00*kW)
Elektra - actueel teruglevering (W): 0
0-0:17.0.0(0999.00*kW)
0-0:96.3.10(1)
0-0:96.13.1()
0-0:96.13.0()
!


Die 72118031 is dus niet goed en er moet nog een 1 voor in dit geval. (1721180)


Ook met de Unsigned long kreeg ik dit niet te zien.
Ook mEVLT = tl ; mocht niet baten..

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 16 Dec 2019, 12:35

Foutje van de METER.

De hoge tellerstand wordt dus niet in het bericht getoond, wel op het display.
Voor je programma waarschijnlijk verder geen bezwaar.

Onze eerste slimme meter (2012) was het bericht ook niet geheel juist.
Daar bleek de actuele terug levering altijd 0 W.
In die tijd wel lastig de netbeheerder zover te krijgen dat het opgelost werd
Uiteindelijk hebben we een nieuwe meter gekregen zonder de fout in de meter software.
m.v.g.Nico

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 16 Dec 2019, 12:40

Dat vind ik wel fijn om te horen!
Ik ga sowieso een nieuwe meter voor die locatie aanvragen omdat ik het gas er ook bij wil hebben.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 16 Dec 2019, 12:43

Koppelen van gas aan de slimme meter is bij ons helaas geen optie.
De afstand tussen gasmeter en elektra meter is te groot.
(gas staat buiten op 200 meter afstand :)

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 16 Dec 2019, 15:35

Ow echt, dat is balen..

Ik heb geprobeerd de sketch naar een ESP32 te brengen en laden gaat goed alleen de serial verwerking gaat niet lekker.

Deze sketch gebruik ik op mijn ESP32. Hier zijn die sscanf_P vervangen voor sscanf.

Code: Alles selecteren
// Aangepast voor Arduino Mega 2560
// Het geinverteerde P1 poort signaal wordt verbonden met pin 19 (Serial1 RX).
//

const int buttonPin = 2;    // schakelaar op pin 2, hoog voor 115200, laag voor 9600.
int lastButtonState;

bool readnextLine = false;

#define BUFSIZE 75
char buffer[BUFSIZE];    // Buffer voor seriele data voor een regel tot \n
int bufpos = 0;

unsigned long previousMillis;

unsigned long mEVLT;   // Meterstand Elektra - verbruik laag tarief
//long mEVLT;   // Meterstand Elektra - verbruik laag tarief
long mEVHT;   // Meterstand Elektra - verbruik hoog tarief
long mETLT;   // Meterstand Elektra - teruglevering laag tarief
long mETHT;   // Meterstand Elektra - teruglevering hoog tarief
long mEAV;    // Meterstand Elektra - actueel verbruik
long mEAT;    // Meterstand Elektra - actueel teruglevering
float mG;     // Meterstand Gas


void setup()
{
  Serial.begin( 9600);   // seriele monitor op de computer
  Serial.println( "Gestart");

  // Ik heb RTS aan pin 13
  // pinMode( 13, OUTPUT);
  // digitalWrite( 13, HIGH);

  pinMode( buttonPin, INPUT_PULLUP);      // de schakelaar aan pin 2 en GND

  int buttonState = digitalRead( buttonPin);
  if( buttonState == LOW)
  {
    Serial1.begin( 9600);
    Serial.println( F( "P1 poort op 9600 baud"));
  }
  else
  {
    Serial1.begin( 115200);
    Serial.println( F( "P1 poort op 115200 baud"));
  }
  lastButtonState = buttonState;
}


void loop()
{
  // -------------------------------
  // Verwerk de data van de P1 poort
  // -------------------------------

  long tl = 0;
  long tld = 0;
  unsigned int crc;    // 16 bits crc

  if( Serial1.available())     // iets van de P1 poort ?
  {
    char inChar = Serial1.read();

    // Het zou 8N1 kunnen zijn, maar ook 7E1.
    // Verwijder de eventuele parity bit in het hoogste bit.
    inChar &= 0x7F;
   
    // Vul buffer tot en met een nieuwe lijn (\n)
    buffer[bufpos] = inChar;

    // Voor debuggen:
    //Serial.write( inChar);//waardes uit de meter, om te vergelijken

    // Laat de laatste positie een nul, zodat het een zero-terminated string blijft.
    // De laatste positie is "BUFSIZE - 1".
    // Het laatste teken kan dan nog op "BUFSIZE - 2".
    if( bufpos < BUFSIZE - 2)
    {
      bufpos++;
    }

    if( inChar == '\n')        // we hebben een lijn binnen (gegevens tot \n)
    {
      if( readnextLine)
      {
        // Er zit een bug in sommige telegrammen, waardoor de gaswaarde over twee regels is verdeeld.
        // Als de eerste regel is ontvangen, dan kan de volgende regel gelezen worden.
        // Die tweede regel moet de gaswaarde bevatten.
        // Als dat niet zo is, dan wordt de gaswaarde niet meer gelezen.
        //if( sscanf_P( buffer, PSTR( "(%ld.%ld%*s"), &tl, &tld) == 2)
        if( sscanf( buffer, PSTR( "(%ld.%ld%*s"), &tl, &tld) == 2)//ESP versie
        {
          mG = float( tl * 1000 + tld ) / 1000.0;
          Serial.print( F( "Gas     - meterstand (m3): "));
          Serial.println( mG);
        }
        readnextLine = false;
      }
      else if( buffer[0] == '/')
      {
        // Het telegram begint met een slash '/'.
        unsigned long currentMillis = millis();
        float t = float( currentMillis - previousMillis) / 1000.0;  // de tijd tussen twee telegrammen in seconden
        Serial.print( F( "---> Telegram iedere : "));
        Serial.print( t, 2);
        Serial.println( F( " seconden"));
        previousMillis = currentMillis;
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//ESP versie
      {
        // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
        mEVLT = tl * 1000 + tld;
       // mEVLT = tl ;  // test voor juiste weergave
        Serial.print( F( "Elektra - meterstand verbruik LAAG tarief (Wh): "));
        Serial.println( mEVLT);
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
        mEVHT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand verbruik HOOG tarief (Wh): "));
        Serial.println( mEVHT);
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:2.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:2.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 1-0:2.8.1 = Elektra teruglevering hoog tarief (DSMR v4.0)
        mETLT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand teruglevering LAAG tarief (Wh): "));
        Serial.println( mETLT);
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:2.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:2.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 1-0:2.8.2 = Elektra teruglevering hoog tarief (DSMR v4.0)
        mETHT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand teruglevering HOOG tarief (Wh): "));
        Serial.println( mETHT);
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:1.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:1.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)//esp versie
      {
        // Dit is mogelijk anders voor DSMR v4.0 en DSMR v5.0.
        // Hieronder staat voor 5.0
        // 1-0:1.7.0 = Elektra actueel verbruik
        mEAV = tl * 1000 + tld;
        Serial.print( F( "Elektra - actueel verbruik (W): "));
        Serial.println( mEAV);
      }
      //else if( sscanf_P( buffer, PSTR( "1-0:2.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:2.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)//esp versie
      {
        // Dit is mogelijk anders voor DSMR v4.0 en DSMR v5.0.
        // Hieronder staat voor 5.0
        // 1-0:2.7.0 = Elektra actueel teruglevering
        mEAT = tl * 1000 + tld;
        Serial.print( F( "Elektra - actueel teruglevering (W): "));
        Serial.println(mEAT);
      }
      //else if( sscanf_P( buffer, PSTR( "0-1:24.3.0(%6ld%4ld%*s"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "0-1:24.3.0(%6ld%4ld%*s"), &tl, &tld) == 2)//esp versie
      {
        // 0-1:24.3.0 = Gas (DSMR v4.0)
        // Dit is de gaswaarde met de bug, waardoor dit over twee regels is verdeeld.
        readnextLine = true; // we moeten de volgende lijn hebben
      }
      //else if( sscanf_P( buffer, PSTR( "0-1:24.2.1(%*ld%*c)(%ld.%3ld*m3)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "0-1:24.2.1(%*ld%*c)(%ld.%3ld*m3)"), &tl, &tld) == 2)//esp versie
      {
        // De gaswaarde zonder de bug (DSMR v5.0)
        mG = float( tl * 1000 + tld ) / 1000.0;
        Serial.print( F( "Gas     - meterstand (m3): "));
        Serial.println( mG, 3);
      }
      //else if( sscanf_P( buffer, PSTR( "!%4x\n"), &crc) == 1)
      else if( sscanf( buffer, PSTR( "!%4x\n"), &crc) == 1)//esp versie
      {
        // Kijk of er een checksum voorbij komt
        Serial.print( F( "---> CRC checksum gedetecteerd: "));
        Serial.println( crc, HEX);
      }

      // Maak de buffer weer leeg (hele array)
      memset( buffer, 0, BUFSIZE);
      bufpos = 0;
    }
  }


  // -------------------------------
  // Kijk of de schakelaar wordt omgezet
  // -------------------------------
  int buttonState = digitalRead( buttonPin);
  if( buttonState != lastButtonState)
  {
    // reset sommige variabelen voor de zekerheid
    readnextLine = false;
    memset( buffer, 0, BUFSIZE);
    bufpos = 0;
    previousMillis = millis();
   
    if( buttonState == LOW)
    {
      Serial1.end();
      Serial1.begin( 9600);
      Serial.println( F( "P1 poort op 9600 baud"));
    }
    else
    {
      Serial1.end();
      Serial1.begin( 115200);
      Serial.println( F( "P1 poort op 115200 baud"));
    }

    lastButtonState = buttonState;
  }
}



Ik krijg deze melding op de serial monitor:

Code: Alles selecteren
78000,len:9232
14:30:38.378 -> lnK⸮Gestart
14:30:38.548 -> P1 poort otd}vttdfeudDTudtoovtdotduuuvttdfeudDleldneldenwDGewdddddmdmetevwtenddlmwm~dDmmm~dTelegvemdmedeved~dDdwegondenDumt~un|nuleldnewldnoWlmDEleotvedmdmetevwtenddvevfvumodLEEGdtevmefdlWlm~dDumt~un|nvleldnewldnoWlmDEleotvedmdmetevwtenddvevfvumodLOOGdtevmefdlWlm~dDumt~vn|nuleldnewldnoWlmDEleotvedmdmetevwtenddtevuglevevmngdLEEGdtevmefdlWlm~dDumt~vn|nvleldnewldnoWlmDEleotvedmdmetevwtenddtevuglevevmngdLOOGdtevmefdlWlm~dDumt~unwntleldnewldnoWmDEleotvedmdegtueeldvevfvumodlWm~dDumt~vnwntleldnewldnoWmDEleotvedmdegtueeldtevuglevevmngdlWm~dDtmu~vtnwntlevldetldenwDtmu~vtnvnulenldengmleldnewldnmwmDeet|NDmmm~dGVGdglegowumdgedetegteevd~dDDDDDDDDDDDDt⸮ND⸮
@⸮
@⸮
@H
@t
@T
@⸮
@
14:30:39.260 -> Guru Meditation Error: Core  1 panic'ed (StoreProhibited). Exception was unhandled.
14:30:39.330 -> Guru Meditation Error: Core  1 panic'ed (IllegalInstruction). Exception was unhandled.
14:30:39.433 -> Memory dump at 0x400ed948: 444444f4 dd444576 cd44fd47
14:30:39.501 -> Guru Meditation Error: Core  1 panic'ed (IllegalInstruction). Exception was unhandled.
14:30:39.569 -> Memory dump at 0x400ed948: 444444f4 dd444576 cd44fd47
14:30:39.635 -> Guru Meditation Error: Core  1 panic'ed (IllegalInstruction). Exception was unhandled.
14:30:39.738 -> Memory dump at 0x400ed948: 444444f4 dd444576 cd44fd47
14:30:39.772 -> GGuru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:39.875 -> Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:39.944 -> Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:40.011 -> Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:40.080 -> Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:40.148 -> Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1)
14:30:40.250 -> Guru Medita⸮

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 16 Dec 2019, 16:35

Het geinverteerde P1 poort signaal wordt verbonden met pin 19 (Serial1 RX).

Volgens mij (ik heb geen ESP32 maar wel Google) is RX1 pin09
mvg Nico

Berichten: 247
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 16 Dec 2019, 16:40

Sorry, was vergeten te melden dat ik hem nog niet fysiek aan de meter heb gehangen. Dus wilde alleen nog maar de sketch in de esp zien te laden en dan even met een draad tussen pin 2 en de gnd de switch testen in de serial.
Dus hij krijgt nog helemaal geen data binnen nu eigenlijk.

Gebruikers-avatar
Berichten: 241
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 16 Dec 2019, 21:14

Als het goed is wordt alleen dit stukje code uitgevoerd in de loop:
Code: Alles selecteren
// -------------------------------
  // Kijk of de schakelaar wordt omgezet
  // -------------------------------
  int buttonState = digitalRead( buttonPin);
  if( buttonState != lastButtonState)
  {
    // reset sommige variabelen voor de zekerheid
    readnextLine = false;
    memset( buffer, 0, BUFSIZE);
    bufpos = 0;
    previousMillis = millis();
   
    if( buttonState == LOW)
    {
      Serial1.end();
      Serial1.begin( 9600);
      Serial.println( F( "P1 poort op 9600 baud"));
    }
    else
    {
      Serial1.end();
      Serial1.begin( 115200);
      Serial.println( F( "P1 poort op 115200 baud"));
    }

    lastButtonState = buttonState;
  }

Ik zou de "F" in de println instructie weghalen.
Maar ook de memset instructie is een mogelijke veroorzaker.
Succes met zoeken.
m.v.g. Nico

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten