Arduino Mega slimme meter uitlezen met Solarmeter Harold65

Arduino specifieke Software
Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 14 Jun 2019, 07:54

Ik zie nu net in jouw Arduino webbrowser dat jij met je gas nog op Type 6 zit en volgens mij moet die op Type 24. Je krijgt wel op Type 6 je gaswaarden zie ik, dus dat werkt dan ook. Type 6 wordt in voltage uitgezet in PVOutput geloof ik.

Advertisement

Berichten: 17
Geregistreerd: 13 Jun 2019, 14:24

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 14 Jun 2019, 16:31

Ik heb je advies gevolgd en de temperatuur weggehaald en de gassensor op type 24 gezet. Verder had ik inderdaad zitten prutsen in de code waardoor ik geen waardes meer op m1 t/m m4 kreeg. Gecorrigeerd naar de oorspronkelijke code van Harald en nu werkt alles min of meer weer:

Arduino webserver.jpg
Arduino webserver.jpg (36.46 KiB) 7712 keer bekeken


Maar ik blijf het probleem houden dat ik zo nu en dan hele hoge waarden krijg voor PowerUsage of PowerSolar. Ik probeer te snappen waarom hij deze waardes uit het telegram haalt voor PowerUsage en PowerSolar. In de waarden van M1 t/m M4 heb ik nog geen fout kunnen ontdekken. Dus dat gaat vlekkeloos.

Eerst dacht ik dat het lag aan mijn seriele kabel, zoals jij ook suggereerde. Ik heb flink lopen prutsen met pull-up weerstanden, maar dat was het probleem niet, de telegrammen blijven perfect binnenkomen. Dus moet het volgens mij liggen aan het verwerken van het telegram in de code van Harald.
Jarenlang geen enkel probleem gehad met verkeerd gelezen DSMR2.2 telegrammen en nu de slimme meter werkt met ESMR5.0 telegrammen gaat het fout.

Zou het kunnen liggen aan het stukje code wat nu misschien overbodig is geworden door de gassensor code wijziging van Koepel? Die is volgens mij geschreven om de gassensor waarde uit de DSMR2.2 telegrammen te lezen. Heb jij die ook nog staan?

Code: Alles selecteren
  if (readnextLine)
  {
    // gas actual counter: (00127.969)
    if (sscanf(buffer,"(%ld.%ld)" , &tl, &tld) == 2)
    {
      GasUsage =  tl * 1000 + tld;
      readnextLine = false;
    }


De gascode komt nu bij mij binnen als:
0-1:24.2.1(190612151500S)(00001.139*m3)

en niet meer als:
(001.139)

Misschien proberen om dit stukje als comment aan te merken en kijken wat er gebeurt ;-)

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 14 Jun 2019, 17:07

// gas definition: 0-1:24.3.0
if (sscanf(buffer,"0-1:24.%d.%d",&i,&j) == 2)
{
if(i == 3 && j == 0) readnextLine = true; // the actual gas counter is found on the next line

}
Bovenstaande moet je idd weghalen, is bij mij ook weg.

Ik heb ook af en toe hoge waarden zoals vandaag weer. Snap er ook niets van. Het kan zijn dat de Arduino Mega moeite heeft om met een baudrate van 115200???
Ik meen zoiets ooit van Harold gelezen te hebben op wijhebbenzon forum maar dat bestaat niet meer. De code voor het programma is voor de 1e slimme meters gemaakt en later kreeg je nieuwere versies met ieder zijn eigen manier van regels spugen. Misschien moeten ze die regels voor het elektra gedeelte ook iets aanpassen???
Zie voorbeeld hieronder. Er zijn een aantal regels die betrekking hebben op het uitlezen van die M1 t/m M4.
1-3:0.2.8(50)
0-0:1.0.0(181106140429W)
0-0:96.1.1(4530303334303036383130353136343136)
1-0:1.8.1(003808.351*kWh)
1-0:1.8.2(002948.827*kWh)
1-0:2.8.1(001285.951*kWh)
1-0:2.8.2(002876.514*kWh)

0-0:96.14.0(0002)
1-0:1.7.0(00.000*kW)
1-0:2.7.0(00.498*kW)
0-0:96.7.21(00006)
0-0:96.7.9(00003)
1-0:99.97.0(1)(0-0:96.7.19)(180529135630S)(0000002451*s)
1-0:32.32.0(00003)
1-0:52.32.0(00002)
1-0:72.32.0(00002)
1-0:32.36.0(00001)
1-0:52.36.0(00001)
1-0:72.36.0(00001)
0-0:96.13.0()
1-0:32.7.0(236.0*V)
1-0:52.7.0(232.6*V)
1-0:72.7.0(235.1*V)
1-0:31.7.0(002*A)
1-0:51.7.0(000*A)
1-0:71.7.0(000*A)
1-0:21.7.0(00.000*kW)
1-0:41.7.0(00.033*kW)
1-0:61.7.0(00.132*kW)
1-0:22.7.0(00.676*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(4730303339303031373030343630313137)
0-1:24.2.1(181106140010W)(01569.646*m3)
!1F28
/ISK5\2M550T-1011

Berichten: 17
Geregistreerd: 13 Jun 2019, 14:24

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 14 Jun 2019, 18:27

Ik geloof niet dat de Mega echt moeite heeft met de baudrate van 115200 op de hardware seriele poort 19. Ik heb inderdaad gelezen dat de softwarematige seriele poort moeite heeft (volgens mij bij de Uno) met hoge baudrates. Ik heb een tweede Arduino Mega en die haalt moeiteloos en foutloos de P1 telegrammen binnen. Om dat te testen gebruik ik een stukje code wat ik ergens op een forum heb gevonden:

Code: Alles selecteren
// ***************************** P1 testprogramma *******************
// juiste Serial poort kiezen (hier default op Serial1 pin 19/RX1 voor een Mega
// upload
// seriele monitor aanzetten (rechtsboven, vergrootglas symbool)
// zodra er info van de P1 meter binnen komt gaat een led op je board even aan
// en in je seriele monitor verschijnt het P1 bericht op je scherm.
// ******************************************************************
HardwareSerial *_serial;

// Pin 13 has an LED connected on most Arduino boards.
// Op Mega werkt onderstaande.
int led = 13;
 
void setup () {

  // ****** aanpassen ahv de serial poort! *******
  //Mega:
  //Pin 0/RX   = Serial
  //Pin 19/RX1 = Serial1
  //Pin 17/RX2 = Serial2
  // verander onderstaande regel in &Serial, &Serial1, &Serial2 afhankelijk van je serial input poort.
  _serial = &Serial1;
 
  _serial->begin(115200);
  delay(500);

  Serial.begin(115200);
  delay(500);

  pinMode(led, OUTPUT);
 
  Serial.println("Setup complete");
}

// led op het board gaat aan bij ontvangst data via Serial
void loop () {
  byte incomingByte;
 
  while (_serial->available() > 0) {
    digitalWrite(led, HIGH);
    incomingByte = _serial->read();
    incomingByte &= ~(1 << 7);    // forces 0th bit of x to be 0.  all other bits left alone.
    char inChar = (char)incomingByte;
    Serial.write(inChar);
  }
  digitalWrite(led, LOW);
}


Ik heb gisteren in de code van P1Power.cpp van Harald zitten rommelen, met name aan dit stukje:
Code: Alles selecteren
   
// Actual Consumption: 1-0:1.7.0(0000.50*kW)
// Actual Generation:  1-0:2.7.0(0001.20*kW)
    if (sscanf(buffer,"1-0:%d.7.0([b]%ld.%ld[/b]" , &i, &tl , &tld) == 3)

en toen ging het binnenhalen van de actuals wel goed. Daarentegen had ik de M1 t/m M4 wel om zeep geholpen.

De vraag is of iemand ons kan helpen de code geschikt te maken voor onze telegrammen. Anders toch maar zelf heel hard aan de studie, maar ik wou dat ik iets meer van de syntax bijv. (sscanf(buffer,"1-0:%d.7.0(%ld.%ld" , &i, &tl , &tld) == 3) begreep ????

Zucht!

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 14 Jun 2019, 22:12

Niet zo gauw de moed opgeven. Ik ben al maanden bezig om data uit de slimme meter te krijgen. En dat is nu gelukt dus kop op :)

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 14 Jun 2019, 23:15

De library van harold65/SolarMeter begrijp ik niet zo goed. Ik weet bijvoorbeeld niet waar "P1Power P1(&Serial1, 17934, 24, 1);" voor is.
De komende tijd heb ik waarschijnlijk te weinig tijd om daar in te duiken.

SoftwareSerial voor dit soort dingen gaat altijd problemen geven, ongeacht of het met 9600 of 115200 baud is.

Bij 115200 baud krijgen de Arduino Mega 2560 of een Arduino Uno of Nano het best wel moeilijk. Dan mag de code niet onnodig lang duren.

De P1-Meter-ESP8266 (https://github.com/jantenhove/P1-Meter-ESP8266) heeft snellere code met de strncmp() functie. En het draait ook nog eens op een veel snellere ESP8266.

De SolarMeter (https://github.com/harold65/SolarMeter) is veel langzamer met de sscanf() en de code kan sneller.
Ze bekijken beiden de gegevens regel voor regel. Dus de CRC zou hier aan toegevoegd kunnen worden, maar dan wordt het nog langzamer :(
Wat me opvalt is een Serial.println(bufpos) (https://github.com/harold65/SolarMeter/blob/master/P1Power.cpp#L38). Dat lijkt debug-informatie, maar dat kost extra interrupts. Misschien die regel wegcommentariëren.

Deze constructie:
Code: Alles selecteren
if (sscanf ...
if (sscanf ...
if (sscanf ...
Kan sneller zo:
Code: Alles selecteren
if (sscanf ...
else if (sscanf ...
else if (sscanf ...
Dat levert misschien 30% winst op.
Een tijdelijke oplossing zou zijn om met strncmp() een voorselectie tussen "0-1:" en "1-0:" te maken. Dat levert misschien nog eens 30% winst op.
Voor 115200 baud is het beste om alle sscanf() te vervangen door strncmp().

De
Code: Alles selecteren
if (readnextLine)
...

is om compatible met de oude meters te zijn, maar dat kost vrijwel geen tijd. De sscanf() kost waarschijnlijk 100 of 1000 keer meer tijd.

De referentie van sscanf staat hier: http://www.cplusplus.com/reference/cstdio/scanf/.
Lees dat een paar keer door, en dan zie je dat de tekst in de buffer wordt afgetast, soms wordt een getal ingelezen, en dat alles met een bepaald formaat dat veel mogelijkheden heeft.
Deze week leerde ik zelfs nog iets nieuws over sscanf :o (https://forum.arduino.cc/index.php?topic=620216.0).

Het inlezen van de iets langere getallen is geen enkel probleem. Een "%ld" samen met een "long" kan een getal tot ongeveer 2 miljard inlezen.

De Arduino Mega 2560 is een ouder board. Mijn voorkeur zou een ESP8266, ESP32 of Arduino Zero of Arduino MKR zijn.

Berichten: 17
Geregistreerd: 13 Jun 2019, 14:24

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 15 Jun 2019, 08:41

Wauw Koepel, super bedankt voor je uitvoerige en heldere uitleg! Ik vermoed dat je gelijk hebt en ik begin het nu steeds beter te snappen. Vroeger kon mijn Mega de telegrammen eenvoudig bijsloffen op 9600 baudrate en 1 telegram per 10 sec. Nu met 115200 en elke seconde een telegram ziet de Mega aan zijn tax.
Het gaat al iets beter met master64nl zijn suggestie om de niet werkende temperatuur sensor weg te halen. Dat scheelt ietsje in de workload.

Hoewel het heel aanlokkelijk is om een nieuw en sneller boardje te kopen (dank voor je suggesties) ben ik bang dat ik toch vastzit aan de code van Harold.
Hij is de enige die ook rekening houdt met het uitlezen van een aparte kWh uur meter voor zonnepanelen (uitlezen S0) en de watermeter en dan alles uploaden naar PVOutput en Mindergas.

Je laat inderdaad overtuigend zien dat de code van Harold niet heel efficient is geschreven (sorry Harold ;) ).
Ik denk dat ik maar eerst je suggestie probeer om deze wat te stroomlijnen. Probleem is echter dat het zo'n 20 jaar geleden is dat ik iets heb geprogrammeerd (MatLab) en ik meer stuk maak dan verbeter :lol:

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 15 Jun 2019, 11:28

Handz, snap jij wat Koepel allemaal zegt :?
Als jij het snapt kun jij dan hier plaatsen wat ik precies moet doen om het sneller te krijgen?

Berichten: 17
Geregistreerd: 13 Jun 2019, 14:24

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 15 Jun 2019, 13:33

Nou snappen is een groot woord :D

Ik ben nu wat met het experimenteren met de geneste "if" en "else" functies.

Wat in ieder geval veilig is, is de suggestie van Koepel om Serial.println(bufpos) weg te commentariëren. Dat levert weer wat minder workload op.

Wat me opvalt is een Serial.println(bufpos) (https://github.com/harold65/SolarMeter/ ... er.cpp#L38). Dat lijkt debug-informatie, maar dat kost extra interrupts. Misschien die regel wegcommentariëren.


Tot nog toe krijg ik echter nog steeds veel te hoge waarden binnen op PVOutput: bijv. 58000 kW :lol: :lol:
Wat ik zou willen doen is om Koepel's voorstel te volgen om alle sscanf() te vervangen door strncmp(), maar dat vereist dat ik eerst de code van Harold snap en dan de syntax van het strncmp() commando.

Trouwens @Koepel de beschrijving van P1Power P1(&Serial,sid,v,f) staat in Harold's software manual of Github:

&Serial defines the serial port that is connected to the P1 port. If you have an Arduino MEGA, you can select one of 4 serial ports named “&Serial”, “&serial1”, “&Serial2” and “&Serial3”.
sid = the pvoutput SID where you want the temperature to be logged.
v = the variable number of the SID. See PvOutput for an explanation.
f = the scaling factor. The value calculated by the sensor will be divided by the factor before uploading to PvOutput.

Gebruikers-avatar
Berichten: 117
Geregistreerd: 10 Jun 2019, 12:16
Woonplaats: Amsterdam

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 15 Jun 2019, 14:13

Handz schreef:Nou snappen is een groot woord :D

Ik ben nu wat met het experimenteren met de geneste "if" en "else" functies.

Wat in ieder geval veilig is, is de suggestie van Koepel om Serial.println(bufpos) weg te commentariëren. Dat levert weer wat minder workload op.

Wat me opvalt is een Serial.println(bufpos) (https://github.com/harold65/SolarMeter/ ... er.cpp#L38). Dat lijkt debug-informatie, maar dat kost extra interrupts. Misschien die regel wegcommentariëren.


Tot nog toe krijg ik echter nog steeds veel te hoge waarden binnen op PVOutput: bijv. 58000 kW :lol: :lol:
Wat ik zou willen doen is om Koepel's voorstel te volgen om alle sscanf() te vervangen door strncmp(), maar dat vereist dat ik eerst de code van Harold snap en dan de syntax van het strncmp() commando.

Trouwens @Koepel de beschrijving van P1Power P1(&Serial,sid,v,f) staat in Harold's software manual of Github:

&Serial defines the serial port that is connected to the P1 port. If you have an Arduino MEGA, you can select one of 4 serial ports named “&Serial”, “&serial1”, “&Serial2” and “&Serial3”.
sid = the pvoutput SID where you want the temperature to be logged.
v = the variable number of the SID. See PvOutput for an explanation.
f = the scaling factor. The value calculated by the sensor will be divided by the factor before uploading to PvOutput.


Jij snapt het beter als mij heb ik al gezien.
Zou je de tekst origineel kunnen neerzetten en daarna dezelfde tekst maar dan veranderd en aangeven in welk file je dit doet?
Dan testen we het beiden en misschien kan Koepel weer een wijziging op github zetten wat betreft Harold zijn Solarmeter.

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten