decoderen string uit P1 slimme meter

Arduino specifieke Software
Berichten: 7
Geregistreerd: 20 Okt 2016, 08:42

Re: decoderen string uit P1 slimme meter - solved

Berichtdoor bier » 21 Okt 2016, 13:06

Hoi,
met dank voor je uitgebreide reactie: het is me gelukt inmiddels.
Ik bleek met mijn eerdere code al vrij dichtbij te zijn, maar jouw idee om te zoeken op "(" bleek de oplossing:

Code: Alles selecteren
if (sscanf(buffer,"(%ld.%ld" , &tl, &tld)==2 ) //// // opzoeken van de tekst "0-1:24  " in de buffer geeft een true als die erin staat. (denk ik)
      {   mG = (tl*1000.0)+tld;
      mG = mG/1000;
      }


De output die ik nu lees ziet er zo uit:

{"data":"P1 output,12235.815,15727.805,0,660,775.230,281.157,4717.812,5.0","ttl":"100","published_at":"2016-10-21T11:04:34.043Z","coreid":"########","name":"xxx"}

en dat is precies wat ik nodig had! De gas meter stand staat aan het eind, 4717.812m3

bedankt.

Advertisement

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

Re: decoderen string uit P1 slimme meter

Berichtdoor Koepel » 21 Okt 2016, 19:46

bier schreef:bedankt.

Maar je bent er nog niet.
Op internet vond ik veel voorbeelden, maar alle code lijkt hetzelfde.

Zou je willen controleren of het aantal parameters van sscanf klopt ?
Als je bijvoorbeeld "%ld" ziet staan, dan moet er een unsigned long meegegeven worden.
Als er twee "%ld" staan, dan zijn er dus ook twee unsigned long variabelen nodig.

Deze:
Code: Alles selecteren
if (sscanf(buffer,"0-0:96.14.0(%ld.%ld*s" , &tl) >0  )

Probeert twee cijfers te lezen en naar twee parameters te schrijven. Maar je hebt maar één parameter. Dus graag wijzigen naar "0-0:96.14.0(%ld)" of naar "0-0:96.14.0(%ld"

Inmiddels heb ik het formaat voor sscanf gelezen, en een "%*s" is geen serieuze fout. De '*' geeft aan dat het overgeslagen kan worden.
Een "%*s" of een "*s" op het einde is niet nodig. En de '%' teveel die er eerste stond heb je al gecorrigeerd.

Zoals ik al zei, alleen naar het haakje openen '(' kijken is een beetje flauw, want dat ene teken is maar weinig als een check. Maar goed, als het eenmaal loopt, dan zal het wel werken.

Berichten: 7
Geregistreerd: 20 Okt 2016, 08:42

Re: decoderen string uit P1 slimme meter

Berichtdoor bier » 22 Okt 2016, 14:29

Hoi,
ik ben er wel volgens mij want de waarde die ik zoek komt stabiel binnen.

Om je vraag te beantwoorden: er worden wel twee getallen gelezen.
namelijk (04650.798) geeft 4650 voor de punt en 798 erna

Dit zet ik om naar een float en deel het weer door 1000. dan klopt het.

Het kan flauw zijn om alleen naar het haakje te kijken, maar het werkt toch? Ik ben niet zo goed in programmeren als jij, wil alleen iets maken dat doet wat ik wil. Verder erin duiken om het helemaal netjes te maken kost me meer tijd dan ik eraan kan besteden. En bovendien verwacht ik niet dat mijn meter snel een firmware update zal krijgen waardoor het ineens niet meer werkt.

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

Re: decoderen string uit P1 slimme meter

Berichtdoor Koepel » 22 Okt 2016, 18:26

Natuurlijk, kijken naar een haakje aan het begin van een regel werkt 8-) Ik vind het prima hoor.

Ik bedoelde deze regel:
Code: Alles selecteren
if (sscanf(buffer,"0-0:96.14.0(%ld.%ld*s" , &tl) >0  )   //)

Dat is dus niet de regel van het gas.
Daar staan twee "%ld" en maar één "&tl". De string met het format is nu "0-0:96.14.0(%ld.%ld*s". Zou je dat willen corrigeren naar "0-0:96.14.0(%ld)" of naar "0-0:96.14.0(%ld" ?

Mijn test met Arduino Uno heeft een float van 32-bit. Dan gaat toch echt het laatste cijfer verkeerd. Probeer die sketch maar op een Arduino Uno.

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Helenopish en 103 gasten