decoderen string uit P1 slimme meter
14 berichten
• Pagina 2 van 2 • 1, 2
Re: decoderen string uit P1 slimme meter - solved
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:
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.
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
Re: decoderen string uit P1 slimme meter
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.
Re: decoderen string uit P1 slimme meter
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.
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.
Re: decoderen string uit P1 slimme meter
Natuurlijk, kijken naar een haakje aan het begin van een regel werkt Ik vind het prima hoor.
Ik bedoelde deze regel:
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.
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.
14 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Google Adsense [Bot], tutigiwuq en 22 gasten