Arduino Mega slimme meter uitlezen met Solarmeter Harold65

Arduino specifieke Software
Berichten: 17
Geregistreerd: 13 Jun 2019, 14:24

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 15 Jun 2019, 15:44

Hoi master64nl,

Op regel 38 van het bestandje P1Power.cpp staat:
Code: Alles selecteren
Serial.println(bufpos);


Dat kan je wegcommentarien door er // voor te plaatsen:
Code: Alles selecteren
//    Serial.println(bufpos);


Ik zie nog niet dat het veel uitmaakt :( De webserver van de arduino lijkt wel iets minder foute waarden te tonen, maar mijn PVOutput waarden voor consumption zijn erger dan ooit.
Als ik betere resultaten boek zal ik die hier zeker delen. Tot nu toe echter trial en veel error :D

@Koepel; Zou het mogelijk zijn om mijn slimme meter apart uit te lezen met een snelle P1-Meter-ESP8266 en mijn water en zonnepanelen nog steeds op de Arduino Mega te laten draaien? Dan moet ik de data van de ESP8266 zien in te lezen in de Arduino (dat mag dus langzamer) en die daar weer te combineren met de opbrengst van mijn zonnepanelen om het daadwerkelijk verbruik uit te rekenen (om uit te rekenen wat ik meteen achter de meter aan eigen verbruik heb van mijn opgewekte PV-energie) voordat ik het naar PVOutput stuur.

Advertisement

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, 22:33

Ik heb contact gehad met Harold de maker van Solarmeter. Dit is zijn antwoord:
Verkeerde waardes komen door storingen op de seriële lijn.
Als je het goed wilt doen moet je de crc checken. Dat is een lastig stukje code.
Je kan ook simpel kijken of de waarde in de buurt van de vorige ligt.

Wat hij daar ook mee bedoeld :?

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 16 Jun 2019, 18:58

Ik heb nog eens beter gekeken naar de library harold65/SolarMeter.
Het is volgens mij niet geschikt om een telegram op 115200 baud te verwerken.

Reken maar even mee :geek:

Een telegram is vaak zo'n 700 tot 900 byte, ik ga uit van 1000 byte.
Bij 9600 baud duurt een telegram ongeveer 1 seconde.
Bij 115200 baud duurt een telegram ongeveer 0.1 seconde.

Gedurende die 100ms moet de Arduino zijn best doen om dat bij te benen. Dat is normaal gesproken wel te doen met een Arduino Mega 2560, mits de hele sketch daar voor geschreven is.

De seriële RX en TX buffers in de Serial library zijn 64 byte groot (https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial.h).
Die 64 byte buffer is met 9600 baud gevuld in 67 ms.
Die 64 byte buffer is met 115200 baud gevuld in 6 ms :!:

Dus als de Arduino even 6 ms de andere kant op kijkt, dan is de buffer al vol en raken er bytes zoek :o

In de library van harold65/SolarMeter zitten meerdere delays. Daarnaast ook .parseInt() en .parseFloat(), dat zijn ook een soort van delays.
Tijdens communicatie met internet zijn er lange delays, maar ook 50 ms delay aan het einde van de loop() (https://github.com/harold65/SolarMeter/blob/master/Solarmeter.ino#L207).
Die 50 ms delay aan het einde van de loop() begrijp ik wel. Mijn Ethernet Shield met W5100 chip werd een stuk warmer als ik er continue mee bezig ben. Maar het kan hier niet samen met een telegram op 115200 baud.

Vermoeden
Ik vermoed dat er stukken van het Telegram zoek raken, omdat de RX buffer (in de Serial library) vol raakt.

Oplossingen
Helaas zie ik niet zomaar een snelle oplossing.

Misschien helpt het om de seriële buffer te vergroten. Naar 128 of 256, als de Arduino Mega 2560 daar voldoende geheugen voor heeft.

De afhandeling van een regel uit het telegram kan sneller. Ik heb nog eens zitten denken over een voorselectie maken. Zonder functies aan te roepen, met code waar het heel snel doorheen rolt. Dan zou het op deze manier gedaan kunnen worden:
cpp code
// Index  : 0123456789
// Formaat: 1-0:1.8.1(003808.351*kWh)
if( strlen( buffer > 8) && buffer[1] == '-' && buffer[3] == ':')
{
switch( buffer[0])
{
case 0:
switch( buffer[2])
{
case 0:
switch( buffer[4])
{
case 9:
break;
}
break;
case 1:
switch( buffer[4])
{
case 2:
// Het is nu: 0-1:2
break;
case 9:
break;
}
break;
}
break;
case 1:
switch( buffer[2])
{
case 0:
break;
}
break;
}
}

Dat is hopelijk niet nodig. Het ziet er niet uit.

Met een ESP8266 inlezen en langzaam doorgeven aan de Arduino Mega 2560 zou kunnen, maar de ESP8266 is een 3.3V chip en de ATmega2560 een 5V chip. Dat maakt het minder betrouwbaar.
Met een Arduino Leonardo inlezen en vertraagd doorgeven, dat kan volgens mij ook. Dat kan met één seriële poort. De RX van de P1 poort en TX naar de Arduino Mega 2560. De vertraagde uitgang kan gerust op 115200 baud, maar met voldoende pauze tussen de bytes.
Een mini-uitvoering van de Arduino Leonardo is dit: https://www.aliexpress.com/item/Pro-Micro-ATmega32U4-5V-16MHz-Replace-ATmega328-For-arduino-Pro-Mini-With-2-Row-Pin-Header/32957185656.html.
Een extra Arduino board maakt het niet eenvoudiger, ik geef er de voorkeur aan om de sketch in de Arduino Mega 2560 aan te passen.

Het telegram komt iedere 10 seconden. In principe is er in de tussentijd voldoende ruimte om iets met internet te doen.
Dus misschien is het mogelijk om na de ontvangst van het P1 telegram een paar seconden van alles doen, en ruim op tijd weer klaar te staan voor het volgende telegram.
Ik kan dat niet zomaar toevoegen, en ik weet niet of Harold zijn library helemaal wil omgooien. Het idee van die library is de modulaire opbouw om sensors en gegevens toe te kunnen voegen, en dit gaat daar tegenin.

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 16 Jun 2019, 20:44

Hi Koepel, dat is niet zo mooi dan. Je had eerder ook al iets gezegd om te doen om het geheel sneller te maken. Ik weet nu niet wat ik moet doen? Er kan ook een SD kaart in. Kan die niet bufferen?

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 16 Jun 2019, 21:56

Het belangrijkste is om een heel telegram te pakken te krijgen in plaats van met andere dingen bezig zijn.
Zodra er een '/' komt en de sketch is met iets anders bezig, dan heeft sketch 6 ms om het hele telegram te gaan lezen.
Volgens mij kunnen er nu stukken tussen uit vallen met al die delays.
Iets met een SD kaart doen, betekent dat de sketch weer met andere dingen bezig is.

Volgens mij is het niet erg als er een heel telegram gemist wordt.
Als er maar niet een combinatie van het vorige telegram met een nieuwe telegram gecombineerd wordt.

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 16 Jun 2019, 22:07

Ik ben bang dat Koepel gelijk heeft. Ik heb vanmiddag nog wat testjes en troubleshooting gedaan in de meterkast. Ik heb de eerder geposte "lichte" P1test sketch op mij Arduino geupload en daarbij dezelfde P1 kabel gebruikt heb waarbij ik nu allerlei rare pieken zie in de Arduino sebserver en op PVOutput. Vervolgens een half uur de binnenkomende telegrammen bekeken op de seriele monitor => Geen enkele seriele fout!
Daarmee is uitgesloten dat mijn P1 kabel niet goed zou werken.

Zodra ik dan de volledige code van Harold weer upload gaat het weer fout. Als ik de webserver vaak refresh gaat het ook significant vaker fout; ik denk omdat ik de Arduino dan op dat moment nog sterker belast.
De data die nu naar PVOutput wordt geupload is volledig onbruikbaar. Langzaam oplopende consumptiewaardes tot 99kW!

Helaas denk ik dat stroomlijnen van de code weinig soelaas biedt. Mijn slimme meter (Sagemcom T210-D) spuugt namelijk elke seconde een telegram uit en niet elke 10 seconden. De Mega heeft dus niet echt tijd om bij te komen.

Ik zie misschien de volgende oplossing ingegeven door de suggestie van Koepel om de snellere ESP8266 te overwegen.

Als uitgangspunt wil ik graag mijn P1 data (+gas) en de data van mijn zonnepanelen en watermeter inzichtelijk hebben. Ik kan na wat googlen echter geen enkele kant en klare ESP8266 oplossing vinden die zowel P1, zonopwek alsook waterstand verwerkt (behalve misschien https://gathering.tweakers.net/forum/list_messages/1872361, maar dat vergt heel wat knutsel en bestelwerk).

Als ik nu de P1 poort uitlees met een ESP8266 en van PVOutput afstap en de data stuur naar Domoticz (bijvoorbeeld met http://domoticx.com/p1-poort-slimme-meter-data-naar-domoticz-esp8266/).
Dan laat ik de watermeter en mijn zonnepanelen vrolijk doordraaien op mijn Arduino Mega, die dan ontlast is van het binnenhalen van telegrammen met 115200 baud. Dat gaat voorlopig wel goed.

Het probleem is dat ik dan de Zon-PV data en watermeterdata van mijn Arduino op een of andere manier ook moet doorsturen naar Domoticz. Dat is nog niet heel eenvoudig blijkt uit wat googlen, maar denk ik wel wat eenvoudiger dan het omgooien van Harolds code. Wat denken jullie? Is dat te doen, of is dat een "whole new can of worms"?

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Koepel » 16 Jun 2019, 23:27

Iedere seconde is wel erg veel. Met allerlei trucs zou het nog wel mogelijk zijn met een Arduino Mega 2560, maar een Arduino board en een Ethernet Shield is ook niet echt meer van deze tijd.

Ik zie dat soms de Raspberry Pi wordt gebruikt. Een volledige computer voor 11 euro: https://www.kiwi-electronics.nl/raspberry-pi/raspberry-pi-zero/raspberry-pi-zero-w.
De ESP32 is de opvolger van de ESP8266. Ze hebben de ESP32 meer geschikt gemaakt voor Arduino met meer pinnen.
Op dit moment wordt de ESP8266 nog veel vaker gebruikt voor de P1 telegrammen dan de ESP32.

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 17 Jun 2019, 07:25

Als ik jullie zo hoor ziet het er niet veelbelovend uit :( Toch wil ik niet de moed opgeven. Ik ben er al zo lang mee bezig en nu er getallen uit rollen wil ik die graag goed hebben.
Koepel, je hebt al heel wat tips and trics aangedragen, kunnen we deze niet eerst uitvoeren?
- Seriele buffer verhogen (Arduino Mega has Flash 256k bytes (of which 8k is used for the bootloader) SRAM 8k bytes EEPROM 4k byte).
- De afhandeling van een regel
- Deze code Serial.println(bufpos); weg commentariëren
- Alle sscanf() te vervangen door strncmp()
- if (sscanf ... vervangen voor else if (sscanf ...

Ik zou dit wel willen uitproberen met jouw hulp natuurlijk :)

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor Handz » 17 Jun 2019, 20:23

Master64NL, ik heb nog eens gekeken naar de variabelen in je Arduino webserver en je eerdere opmerking:
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.


Maar je kan volgens mij toch echt niet in je Arduino sketch (userdefs.h) de P1Power P1() en de P1GasSensor P1Gas() naar dezelfde PVoutput variabele sturen. Die staan bij jouw allebei op 24. Dat lijkt wel goed te gaan als je alleen naar de Arduino webserver kijkt, maar als ik dat doe krijg ik de gekste resultaten op PVOutput. Bij mij staat P1GasSensor op een andere variabele (6) anders gaat PVOutput de consumptiondata verstieren.

Dus:
regel 117 P1Power P1(&Serial1, xxxxx, 24, 1)

en

regel 124 P1GasSensor P1Gas(&P1, xxxxx, 6, 1);

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

Re: Arduino Mega slimme meter uitlezen met Solarmeter Harold

Berichtdoor master64nl » 17 Jun 2019, 21:21

Ja, dat klopt. Want ik zie niets in PVOutput. Normaal werd die in voltage weer gegeven. Hoe gaat dat nu dan? Word PVOutput nu beter doordat je 6 gekozen hebt?

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: odixlpihmave, Seo-Ul-Gag en 20 gasten