Dat is wel een puntje inderdaad. Zal er binnenkort eens naar kijken, want hoewel het nu werkt, is dat natuurlijk geen garantie voor de toekomst
Ik heb net even naar de datatypes voor de 'dagtotalen' tabel in MySQL gekeken, aangezien ik die nog allemaal op varchar(11) had staan.
Instellen als DECIMAL was geen succes, dan kwam er alleen maar 0.999 te staan. DOUBLE ook geprobeerd, dat werkte wel, maar dat is weer verouderd toch? Nu als FLOAT, dat lijkt ook te werken. Is wel minder handig met vergelijken (in PHP mag/kan je een FLOAT niet 1:1 met een andere FLOAT vergelijken), maar zoals gezegd kreeg ik het met DECIMAL niet aan de gang.
Ik heb dan bijv. waarden als 4.324 of 0.392 of 22.541 (altijd 3 na de komma (punt in dit geval)). Is een FLOAT dan het handigste datatype in dit geval? Vind dat altijd wel lastig, om het goede datatype voor een kolom te kiezen.
Instellen als DECIMAL was geen succes, dan kwam er alleen maar 0.999 te staan. DOUBLE ook geprobeerd, dat werkte wel, maar dat is weer verouderd toch? Nu als FLOAT, dat lijkt ook te werken. Is wel minder handig met vergelijken (in PHP mag/kan je een FLOAT niet 1:1 met een andere FLOAT vergelijken), maar zoals gezegd kreeg ik het met DECIMAL niet aan de gang.
Ik heb dan bijv. waarden als 4.324 of 0.392 of 22.541 (altijd 3 na de komma (punt in dit geval)). Is een FLOAT dan het handigste datatype in dit geval? Vind dat altijd wel lastig, om het goede datatype voor een kolom te kiezen.
[ Voor 35% gewijzigd door ThinkPad op 29-09-2014 22:56 ]
Weet niet hoe je je decimal had gedefinieerd ?
https://dev.mysql.com/doc...imal-characteristics.html
DECIMAL columns in MySQL 5.1 do not permit values larger than the range implied by the column definition. For example, a DECIMAL(3,0) column supports a range of -999 to 999. A DECIMAL(M,D) column permits at most M - D digits to the left of the decimal point. This is not compatible with applications relying on older versions of MySQL that permitted storing an extra digit in lieu of a + sign.
https://dev.mysql.com/doc...imal-characteristics.html
DECIMAL columns in MySQL 5.1 do not permit values larger than the range implied by the column definition. For example, a DECIMAL(3,0) column supports a range of -999 to 999. A DECIMAL(M,D) column permits at most M - D digits to the left of the decimal point. This is not compatible with applications relying on older versions of MySQL that permitted storing an extra digit in lieu of a + sign.
Decimal (5,3) betekend 5 getallen, waarvan 3 achter de komma. Oftewel, twee voor de komma, drie erachter. Zodra je een getal boven de 100 hebt, past het dus niet en maakt hij er 99,999 van. Maak er eens decimal 10,3 van.
Nefit EnviLine IDU Monoblock E 7 E-S, Boiler 200 L, Buffervat 50L. BQQKees
Beiden; dat snap ik
Maar zoals je aan m'n voorbeeld waardes ziet moet het dus in een (5,3) passen. Ik denk dat FLOAT de enige optie is. In het script wat het dagtotaal berekend trek ik de meterstanden (INT) uit de database en trek van de hoogste, de laagste stand af = dagverbruik. Die waarde deel ik door 1000, zodat het een decimaal getal wordt. Op dat moment is het al een FLOAT (volgens var_dump() )
Vervolgens gebruik ik settype() om hem hard op een FLOAT te definieren. En voor getallen met een komma heb je bij settype() niet meer opties dan een FLOAT.
Vervolgens gebruik ik settype() om hem hard op een FLOAT te definieren. En voor getallen met een komma heb je bij settype() niet meer opties dan een FLOAT.
Misschien heb ik iets gemist, maar Ik snap nog niet helemaal waar die restrictie vandaan komt ?ThinkPadd schreef op dinsdag 30 september 2014 @ 07:24:
Beiden; dat snap ikMaar zoals je aan m'n voorbeeld waardes ziet moet het dus in een (5,3) passen.
Je definieert toch zelf je tabel en kolom (te krap) ?
En float is opzich prima, alleen even rekening houden met een beperkte afwijking bij testen voor equality dus.
[ Voor 13% gewijzigd door gekkie op 30-09-2014 09:25 ]
Ja, maar de meter spuugt het met 3 decimalen uit. En voor dagverbruik zit je maar op 2 getallen (100kWh op een dag lijkt me wat veel
), maar aangezien DECIMAL(2,3) niet mag, heb ik er maar een 5,3 van gemaakt.
Met 'moet passen' bedoelde ik: het kan prima in een 5,3. Ik zit niet vast aan een 5,3, maar groter maken heeft geen zin, die waarden komen toch niet voor.
Met 'moet passen' bedoelde ik: het kan prima in een 5,3. Ik zit niet vast aan een 5,3, maar groter maken heeft geen zin, die waarden komen toch niet voor.
[ Voor 27% gewijzigd door ThinkPad op 30-09-2014 10:34 ]
Ok dus ook een waarde van "44.111111111111" wordt bij jou "99.999" ondanks dat het zou moeten passen als 44,111 in je decimal(5,3) ?
Dat is wel vaag .. sowieso zou je dan een error verwachten .. maarja mysql houdt er over het algemeen van om "door te hobbelen" ipv te zeggen ho stop . dat gaat niet werken .. fix it yourself please
Dat is wel vaag .. sowieso zou je dan een error verwachten .. maarja mysql houdt er over het algemeen van om "door te hobbelen" ipv te zeggen ho stop . dat gaat niet werken .. fix it yourself please
[ Voor 33% gewijzigd door gekkie op 30-09-2014 11:01 ]
@ThinkPad,
Heb jij de Arduino Duemilanove gebruikt omdat je die toch had liggen? Of kan je hetzelfde bereiken met een Arduino Uno met het W5100 shield erop?
Of bijvoorbeeld met een Arduino Ethernet?
Ik wil er binnenkort zelf ook aan beginnen om mijn elektriciteitsverbruik te gaan loggen. Dit topic is daarbij een goede hulp!
Ik heb ook een NAS staan, maar heb eigenlijk geen zin om die 24h/dag aan te laten staan, dus ik denk dat ik het ga loggen naar een database bij mijn hosting provider.
Nog een extra vraagje:
Kan je misschien eens een foto posten van je opstelling?
Heb jij de Arduino Duemilanove gebruikt omdat je die toch had liggen? Of kan je hetzelfde bereiken met een Arduino Uno met het W5100 shield erop?
Of bijvoorbeeld met een Arduino Ethernet?
Ik wil er binnenkort zelf ook aan beginnen om mijn elektriciteitsverbruik te gaan loggen. Dit topic is daarbij een goede hulp!
Ik heb ook een NAS staan, maar heb eigenlijk geen zin om die 24h/dag aan te laten staan, dus ik denk dat ik het ga loggen naar een database bij mijn hosting provider.
Nog een extra vraagje:
Kan je misschien eens een foto posten van je opstelling?
[ Voor 7% gewijzigd door Paling1 op 08-10-2014 11:04 ]
Die had ik inderdaad nog liggen. Je kunt een willekeurige Arduino pakken, mits:
Vandaar dat het een Duemilanove is, dat is volgens mij een Chinese kloon van de Uno ofzo. De Uno kon ik iig niet goedkoop op eBay vinden.
Hostingprovider moet ook prima kunnen, als je het PHP script maar extern aanroepbaar maakt. Misschien wel iets met beveiliging gaan doen dan. M'n PHP scripts zijn niet bepaald veilig denk ik
(SQL injectie enzo).
Laat maar weten als je verder nog vragen hebt.
- De sketch er in past. Dit zal geen probleem zijn denk ik.
- Je Arduino een hardware serial heeft. Hebben volgens mij alle Arduino's wel.
- Er een Ethernetshield op kan (W5100, geen ENC28J60!) of ingebouwde W5100
Vandaar dat het een Duemilanove is, dat is volgens mij een Chinese kloon van de Uno ofzo. De Uno kon ik iig niet goedkoop op eBay vinden.
Hostingprovider moet ook prima kunnen, als je het PHP script maar extern aanroepbaar maakt. Misschien wel iets met beveiliging gaan doen dan. M'n PHP scripts zijn niet bepaald veilig denk ik
Laat maar weten als je verder nog vragen hebt.
[ Voor 8% gewijzigd door ThinkPad op 08-10-2014 11:08 ]
Thanks,
Ik denk dat ik een Arduino ethernet ga bestellen. Dan zit alles op 1 module, ook wel mooi.
USB kabel heb ik nog liggen, en ook een stukje telefoonsnoer met de stekker er al op.
Nog effe zoeken of ik nog een transistor en een weerstand heb liggen om het signaal te inverteren.
Ik heb een Kamstrup meter, die spuugt zijn signaal ook geinverteerd uit als het goed is.
Veiligheid mbt de mySQL zal ik wel eens over na gaan denken. Eerst maar eens de boel werkend krijgen, daarna fine-tunen...
Ik kan het natuurlijk altijd eerst werkend maken op mijn NAS, en daarna verhuizen naar de hosting provider.
Wordt die 'gratis' mySQL database daar ook nog eens gebruikt..
Edit:
Arduino ethernet was niet op voorraad, dus nu een UNO met W5100 shield besteld. Gewoon in NL, want ik kan echt geen weken meer wachten
Dit weekend maar eens gaan klooien dan.
Ik denk dat ik een Arduino ethernet ga bestellen. Dan zit alles op 1 module, ook wel mooi.
USB kabel heb ik nog liggen, en ook een stukje telefoonsnoer met de stekker er al op.
Nog effe zoeken of ik nog een transistor en een weerstand heb liggen om het signaal te inverteren.
Ik heb een Kamstrup meter, die spuugt zijn signaal ook geinverteerd uit als het goed is.
Veiligheid mbt de mySQL zal ik wel eens over na gaan denken. Eerst maar eens de boel werkend krijgen, daarna fine-tunen...
Ik kan het natuurlijk altijd eerst werkend maken op mijn NAS, en daarna verhuizen naar de hosting provider.
Wordt die 'gratis' mySQL database daar ook nog eens gebruikt..
Edit:
Arduino ethernet was niet op voorraad, dus nu een UNO met W5100 shield besteld. Gewoon in NL, want ik kan echt geen weken meer wachten
Dit weekend maar eens gaan klooien dan.
[ Voor 12% gewijzigd door Paling1 op 08-10-2014 12:29 ]
Nog niet. Geklooi met het Ethernetshield... Dus weinig mogelijkheden om het script uit te testen.
Wel alvast een andere shield besteld, die komt als het goed is vandaag binnen.
Gelijk ook een RTC klokmodule besteld. Daarmee weet de Arduino ook hoe laat het is. Daarmee wil ik het mezelf makkelijker maken om het meetinterval te regelen en de maand/dagtotalen in de database te zetten.
Wel al bezig geweest met het inrichten van de database bij mijn webhosting. Da's allemaal wel gelukt.
Ik had jouw script voor de Highcharts uitgeprobeerd, maar die wil bij mij niet werken op mijn android telefoon/tablet. Daarom ben ik nu bezig om mbv google charts alle data in grafieken te zetten. Dat werkt wel op android.
Ik moet er alleen nog eens goed over nadenken welke data ik hoe wil presenteren.
Wat ik nu ongeveer van plan ben is om de data van de afgelopen 7 dagen met grote nauwkeurigheid op te slaan. Dan kan je dus van de afgelopen week nauwkeurig het dagverloop volgen. Interval moet ik nog eens over nadenken 10 á 15 minuten lijkt me voldoende.
Alleen denk ik dat mijn database dan al snel heel groot wordt. Dus ik wil van alle dagen voor de afgelopen week alleen de eindstanden bij gaan houden.
Die data kan ik dan weer in een week/maand/jaar in grafieken zetten.
Dit betekent dat ik waarschijnlijk 2 tabellen nodig heb ipv 3. Een tabel voor alle dagtotalen en een tabel voor de afgelopen week.
Week/maand/jaartotalen is dan een kwestie van de juiste query op de tabel van de dagtotalen.
Ben er nog wel effe mee bezig dus...
[ Voor 25% gewijzigd door Paling1 op 15-10-2014 12:51 ]
Oke
Ik heb gewoon goedkoopste shield met W5100 chip (zelfde als op de officiele Ethernet shields) van eBay getrokken, werkt perfect 
RTC is niet echt nodig toch? Als je via millis werkt dan is de interval tussen twee metingen steeds gelijk. Tijdstip van de meting verloopt wel een klein beetje zie ik in m'n data, maar dat boeit niet zo erg
Of je nou om 13:00:00 meet, of om 13:00:07 ofzo. De interval blijft wel gelijk.
Ja klopt, Highcharts is op een mobiel apparaat niet heel ideaal, veel zoomen om het te kunnen zien.
Google Charts moet vast ook niet heel moeilijk zijn, zal op eenzelfde manier de data ophalen waarschijnlijk.
Het opslaan van de data doe ik ook met queries. De Arduino logt 24/7 elke minuut de binnengekomen waardes. Ik trek dan elke avond om 23:59 via een cronjob een query over de data. Dit is m'n dagtotaal. Tevens draait er om 23:59 een script wat de laatste gasmeterstand van die dag naar www.mindergas.nl upload.
Verder draait er nog een cronjob elke avond die kijkt of het de laatste dag van de maand is. Zo ja: bereken maandtotaal (MAX meterstand - MIN meterstand).
Verder verwijder ik nog geen data, al is dat met een PHP script via cronjob ook eenvoudig geregeld (DELETE blablba WHERE date > 31 dagen bijv). Het script wat de data ophaalt voor de grafieken laat ik twee dagen ophalen, vandaag en gisteren. Beiden worden dan als twee aparte series getoond.
Maar dat filteren en totalen etc moet je gewoon mooi aan de serverkant doen, moet je de Arduino niet mee lastig vallen. Dan blijft het tenminste ook goed lopen als de Arduino een keer gecrashed is ofzo.
Interval zou ik wel op 1 minuut houden denk ik, dan heb je lekker veel detail in je grafieken. Commerciële meters doen vaak ook 1 minuut (of 5 minuten). Met 10-15 minuten ga je bepaalde dingen niet in je grafiek terugzien (waterkoker, magnetron bijv.) Dat zijn dingen die meestal geen 10 minuten aanstaan.
RTC is niet echt nodig toch? Als je via millis werkt dan is de interval tussen twee metingen steeds gelijk. Tijdstip van de meting verloopt wel een klein beetje zie ik in m'n data, maar dat boeit niet zo erg
Ja klopt, Highcharts is op een mobiel apparaat niet heel ideaal, veel zoomen om het te kunnen zien.
Google Charts moet vast ook niet heel moeilijk zijn, zal op eenzelfde manier de data ophalen waarschijnlijk.
Het opslaan van de data doe ik ook met queries. De Arduino logt 24/7 elke minuut de binnengekomen waardes. Ik trek dan elke avond om 23:59 via een cronjob een query over de data. Dit is m'n dagtotaal. Tevens draait er om 23:59 een script wat de laatste gasmeterstand van die dag naar www.mindergas.nl upload.
Verder draait er nog een cronjob elke avond die kijkt of het de laatste dag van de maand is. Zo ja: bereken maandtotaal (MAX meterstand - MIN meterstand).
Verder verwijder ik nog geen data, al is dat met een PHP script via cronjob ook eenvoudig geregeld (DELETE blablba WHERE date > 31 dagen bijv). Het script wat de data ophaalt voor de grafieken laat ik twee dagen ophalen, vandaag en gisteren. Beiden worden dan als twee aparte series getoond.
Maar dat filteren en totalen etc moet je gewoon mooi aan de serverkant doen, moet je de Arduino niet mee lastig vallen. Dan blijft het tenminste ook goed lopen als de Arduino een keer gecrashed is ofzo.
Interval zou ik wel op 1 minuut houden denk ik, dan heb je lekker veel detail in je grafieken. Commerciële meters doen vaak ook 1 minuut (of 5 minuten). Met 10-15 minuten ga je bepaalde dingen niet in je grafiek terugzien (waterkoker, magnetron bijv.) Dat zijn dingen die meestal geen 10 minuten aanstaan.
[ Voor 4% gewijzigd door ThinkPad op 15-10-2014 13:32 ]
Hmmm, maak je me weer aan het twijfelen.
Dat van die cronjobs vs. missende dat als de arduino vastloopt had ik nog niet aan gedacht. Is wel een puntje. Maar het verlopen van de tijd als je geen RTC gebruikt is voor mij ook wel een dingetje. Dan zou je toch met enige regelmaat moeten checken of het allemaal nog wel klopt.
Meetinterval heb je wel gelijk in. Die zal ik wat kleiner maken.
Dat van die cronjobs vs. missende dat als de arduino vastloopt had ik nog niet aan gedacht. Is wel een puntje. Maar het verlopen van de tijd als je geen RTC gebruikt is voor mij ook wel een dingetje. Dan zou je toch met enige regelmaat moeten checken of het allemaal nog wel klopt.
Meetinterval heb je wel gelijk in. Die zal ik wat kleiner maken.
[ Voor 77% gewijzigd door Paling1 op 15-10-2014 13:28 ]
Nouja wil je kunnen opvragen wat je op 05-10-2014 om 12:46 als verbruik had? In dat geval moet je wel met een RTC aan de gang. Verder blijft zoals ik zei de interval tussen een meting wel telkens gelijk, dus het maakt voor de grafieken e.d. niet uit. 12:46 is dan misschien niet 12:46:00, maar kan ook best 12:46:59 zijn.
Stel dat hij in het begin van de maand zo is:
Meting1: 12:58:00
Meting2: 12:59:00
En aan het einde van de maand:
Meting1: 12:58:47
Meting2: 12:59:47
Er zit telkens een minuut tussen, alleen een minuut is dan niet 00 seconden zeg maar... Uiteindelijk gaat hij weer een poosje op xx:xx:00 precies lopen, dan weer afwijken, net zolang hij 'rond' is en weer op xx:xx:00 zit. Maar het tijdsverschil tussen twee metingen blijft altijd gelijk, dankzij die millis.
Stel dat hij in het begin van de maand zo is:
Meting1: 12:58:00
Meting2: 12:59:00
En aan het einde van de maand:
Meting1: 12:58:47
Meting2: 12:59:47
Er zit telkens een minuut tussen, alleen een minuut is dan niet 00 seconden zeg maar... Uiteindelijk gaat hij weer een poosje op xx:xx:00 precies lopen, dan weer afwijken, net zolang hij 'rond' is en weer op xx:xx:00 zit. Maar het tijdsverschil tussen twee metingen blijft altijd gelijk, dankzij die millis.
[ Voor 4% gewijzigd door ThinkPad op 15-10-2014 13:37 ]
Ah joh, ik zat in mijn hoofd met de dag en maandtotalen die dan uit gingen lopen, maar die doe je natuurlijk op de server met een cronjob.
Ik zit net effe te kijken bij mijn hoster...
Volgens mij heb ik daar, binnen mijn hostingpakket, geen mogelijkheid voor cronjobs. Dus toch effe met die RTC aan de gang denk ik.
Maar ik kan het natuurlijk ook allemaal binnen de .php regelen die ik toch elke minuut aanroep met de Arduino. Dan laat ik de .php ook de tijd checken en afhankelijk daarvan totalen laat wegschrijven naar een andere tabel.
Pfff opties opties.

Ik zit net effe te kijken bij mijn hoster...
Volgens mij heb ik daar, binnen mijn hostingpakket, geen mogelijkheid voor cronjobs. Dus toch effe met die RTC aan de gang denk ik.
Maar ik kan het natuurlijk ook allemaal binnen de .php regelen die ik toch elke minuut aanroep met de Arduino. Dan laat ik de .php ook de tijd checken en afhankelijk daarvan totalen laat wegschrijven naar een andere tabel.
Pfff opties opties.
Dat kan ook, of de cronjob extern laten draaien, en gewoon een PHP bestand op je host aanroepen die de actie uitvoert. Die cronjob laat je dan op je router of NAS uitvoeren.
Maar een check en evt. aanvullende acties kan ook in het wegschrijf-script. Dat stuk zou ik dan wel doen nadat je de data hebt weggeschreven, anders loopt dat wellicht door elkaar heen.
Maar een check en evt. aanvullende acties kan ook in het wegschrijf-script. Dat stuk zou ik dan wel doen nadat je de data hebt weggeschreven, anders loopt dat wellicht door elkaar heen.
Toch grappig om te zien hoeveel oplossingen er bedacht kunnen worden voor een probleem..;)
Als alle nieuwe spullen binnen zijn dan ga ik eerst maar eens kijken of ik de data uit de meter krijg. Daar heb ik nog niets van kunnen testen.
Sjips.... Postbode net gemist....
Morgen weer verder.
Als alle nieuwe spullen binnen zijn dan ga ik eerst maar eens kijken of ik de data uit de meter krijg. Daar heb ik nog niets van kunnen testen.
Sjips.... Postbode net gemist....

Morgen weer verder.
[ Voor 11% gewijzigd door Paling1 op 15-10-2014 18:56 ]
Duss...
Bij elkaar al weer een paar uur bezig om ook maar iets van leesbare data uit mijn P1 poort te krijgen.
Lukt dus echt voor geen meter!
Ik heb een Kamstrup 162JxC. Die zou op 9600 baud 7E1 uitgelezen moeten kunnen worden.
Alleen mij lukt het niet.
Ik ga het effe een paar daagjes laten rusten, want ik wordt er niet echt gezellig van.
Als ik 7E1 instel komt zelfs tekst die ik naar de serial schrijf er verminkt uit.
Als ik 8N1 instel dan komt er onleesbare data uit. Waarschijnlijk omdat mijn signaal geinverteerd moet worden. Alleen als ik dat doe met een transistor en een paar weerstandjes, komt er helemaal niets meer uit de meter.. Die inverter heb ik inmiddels al wel 20 keer op verschillende manieren opgebouwd, maar helaas lukt het me dus niet. Verschillende weerstanden, transistors etc...
Pffff... Wordt steeds bozer op mezelf, en dan gaat het uiteindelijk alleen maar meer tegenstaan.
Bij elkaar al weer een paar uur bezig om ook maar iets van leesbare data uit mijn P1 poort te krijgen.
Lukt dus echt voor geen meter!
Ik heb een Kamstrup 162JxC. Die zou op 9600 baud 7E1 uitgelezen moeten kunnen worden.
Alleen mij lukt het niet.
Ik ga het effe een paar daagjes laten rusten, want ik wordt er niet echt gezellig van.
Als ik 7E1 instel komt zelfs tekst die ik naar de serial schrijf er verminkt uit.
Als ik 8N1 instel dan komt er onleesbare data uit. Waarschijnlijk omdat mijn signaal geinverteerd moet worden. Alleen als ik dat doe met een transistor en een paar weerstandjes, komt er helemaal niets meer uit de meter.. Die inverter heb ik inmiddels al wel 20 keer op verschillende manieren opgebouwd, maar helaas lukt het me dus niet. Verschillende weerstanden, transistors etc...
Pffff... Wordt steeds bozer op mezelf, en dan gaat het uiteindelijk alleen maar meer tegenstaan.
Je probeert hem nu uit te lezen met Arduino? Of via PC?
Je moet het gewoon in stapjes aanpakken. Het duurde bij mij ook een poosje tot ik het werkend had (o.a. doordat het inverted was en ik de baudrate niet goed wist).
Je moet overigens zorgen dat de 'enable' pin (RTS) op de meter 5V krijgt van je Arduino. Signaal is inderdaad inverted, maar dat is geen probleem als je het zoals dit aansluit: schema.
Wat misschien ook nog mee kan spelen is de DSMR versie. Mijn meter is nog niet zo oud, en werkt dus volgens de nieuwste DSMR standaard (4.0 dacht ik). Jouw meter is volgens mij al wat ouder, en werkt waarschijnlijk met een oudere standaard. Dat is voor het uitlezen op zich geen probleem, maar mogelijk dat je mijn sketch wat moet aanpassen omdat bepaalde velden bij jouw telegrammen op een andere plek staan, en mijn sketch de waarden dan niet kan 'vinden'.
Je woont helaas niet in de buurt, anders kon ik je even helpen
Je moet het gewoon in stapjes aanpakken. Het duurde bij mij ook een poosje tot ik het werkend had (o.a. doordat het inverted was en ik de baudrate niet goed wist).
- Probeer eerst eens met een USB > Serial converter en 'putty' via een Windows PC de boel uit te lezen. Lukt dat? --> Mooi, je slimme meter spuugt dus iig data uit, en je weet met welke instellingen het werkt.
- Vervolgens pak je een basic Arduino sketch en kijk je of je daarmee kloppende waardes terugkrijgt
- Als dat allemaal lukt dan kun je met mijn sketch aan de gang
Je moet overigens zorgen dat de 'enable' pin (RTS) op de meter 5V krijgt van je Arduino. Signaal is inderdaad inverted, maar dat is geen probleem als je het zoals dit aansluit: schema.
Wat misschien ook nog mee kan spelen is de DSMR versie. Mijn meter is nog niet zo oud, en werkt dus volgens de nieuwste DSMR standaard (4.0 dacht ik). Jouw meter is volgens mij al wat ouder, en werkt waarschijnlijk met een oudere standaard. Dat is voor het uitlezen op zich geen probleem, maar mogelijk dat je mijn sketch wat moet aanpassen omdat bepaalde velden bij jouw telegrammen op een andere plek staan, en mijn sketch de waarden dan niet kan 'vinden'.
Je woont helaas niet in de buurt, anders kon ik je even helpen
[ Voor 53% gewijzigd door ThinkPad op 22-10-2014 20:46 ]
Volgens mij gaat het qua zomertijd/wintertijd omschakeling ook goed, toch?

De Arduino doet niks met tijd, die roept gewoon elke minuut het PHP script aan. De correcte tijd is afhankelijk van MySQL (het 'time' veld wordt bij toevoegen automatisch gevuld doordat ik als default waarde 'CURRENT_TIMESTAMP' heb geconfigureerd).
Als ik bovenstaand screenshot zie dan lijkt de overgang zomer/wintertijd goed te gaan, of kijk ik verkeerd?
De meterstanden lopen gewoon netjes verder, zonder dat de waardes ineens een stuk hoger zijn.
Ik moest alleen in m'n grafiek code wat aanpassen:
Op regel 8 stond eerst +7200000, dit moest ik aanpassen naar +3600000 (de helft) omdat de grafiek anders een uur voor liep. Weet iemand hoe ik dat kan oplossen? Ik snap niet waarom ik dat in de grafiek moet aanpassen, hij kan het toch gewoon uit de MySQL database ophalen?

De Arduino doet niks met tijd, die roept gewoon elke minuut het PHP script aan. De correcte tijd is afhankelijk van MySQL (het 'time' veld wordt bij toevoegen automatisch gevuld doordat ik als default waarde 'CURRENT_TIMESTAMP' heb geconfigureerd).
Als ik bovenstaand screenshot zie dan lijkt de overgang zomer/wintertijd goed te gaan, of kijk ik verkeerd?
De meterstanden lopen gewoon netjes verder, zonder dat de waardes ineens een stuk hoger zijn.
Ik moest alleen in m'n grafiek code wat aanpassen:
PHP:
1
2
3
4
5
6
7
8
| // Alle waardes van VANDAAG ophalen voor huidig verbruik. $result = mysql_query("SELECT unix_timestamp (time) AS ts, time, huidig_verbruik AS 'vandaag' FROM readings WHERE DATE(time) = CURRENT_DATE"); if (!$result) { mysql_close($link); die("Error met ophalen verbruik VANDAAG " . mysql_error()); } while ($row = mysql_fetch_array($result)) { $datetime = (($row['ts']) * 1000) + 3600000; // convert from Unix timestamp to JavaScript time |
Op regel 8 stond eerst +7200000, dit moest ik aanpassen naar +3600000 (de helft) omdat de grafiek anders een uur voor liep. Weet iemand hoe ik dat kan oplossen? Ik snap niet waarom ik dat in de grafiek moet aanpassen, hij kan het toch gewoon uit de MySQL database ophalen?
[ Voor 5% gewijzigd door ThinkPad op 26-10-2014 09:36 ]
De onderliggende 'seconden sinds 1970' (of welk nulpunt MySQL dan ook gebruikt) heeft geen reet te maken met de zomertijd. Waarschijnlijk is dat gewoon GMT. De 2014-10-26 02:59:17 is slechts een weergave van de tijd. De weergave wordt bij zomertijd gewoon +1 uur afgebeeld. De onderliggende timestamp wijzigt dus niet!!! Eigenlijk gebeurt hetzelfde bij time zones. Die is voor ons +1 t.o.v. GMT. Misschien een beetje moeilijk te bevatten maar het principe is erg eenvoudig.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Maar moet ik wat aanpassen of niet? Dat is mij uit je reactie niet duidelijk.
Je data staat in UTC (Greenwich tijd, GMT), wat handig is want die klok loopt altijd vooruit en kent geen zomer- of wintertijd, maar je wil het in de lokale tijd laten zien. Daarvoor is een conversie nodig:
http://stackoverflow.com/...one-in-mysql-select-query
Edit het is precies andersom, CURRENT_TIMESTAMP is localtime...
Je grafiek library verwacht blijkbaar UTC (en terecht).
Localtime is ambigu zonder DST en tijdzone info zoals je merkt.
Een fix zou zijn om in plaats van CURRENT_TIMESTAMP, UTC_TIMESTAMP te gebruiken.
http://stackoverflow.com/...one-in-mysql-select-query
Edit het is precies andersom, CURRENT_TIMESTAMP is localtime...
Je grafiek library verwacht blijkbaar UTC (en terecht).
Localtime is ambigu zonder DST en tijdzone info zoals je merkt.
Een fix zou zijn om in plaats van CURRENT_TIMESTAMP, UTC_TIMESTAMP te gebruiken.
[ Voor 30% gewijzigd door Proton_ op 26-10-2014 11:27 ]
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
En die conversie doet phpMyAdmin nu al voor mij? Omdat de tijd daar gelijk loopt met de klok op m'n PC...
Dat is ook de reden dat ik in Highcharts er een uur bij op moet tellen zeker?
Dat is ook de reden dat ik in Highcharts er een uur bij op moet tellen zeker?
Sorry, was bezig met een edit 
Zie mijn vorige post: 't Lijkt precies andersom: Highcharts interpreteert de tijd als UTC en CURRENT_TIMESTAMP in MySql geeft localtime.
Zie mijn vorige post: 't Lijkt precies andersom: Highcharts interpreteert de tijd als UTC en CURRENT_TIMESTAMP in MySql geeft localtime.
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
https://dev.mysql.com/doc/refman/5.5/en/datetime.htmlMySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time.
Dus in MySQL staat het als UTC, maar phpMyAdmin doet er +1 bij op (of +2 bij zomertijd) ?
Dan moet ik in m'n Highcharts code dus even een zomer/wintertijd detectie maken die +1 doet of +2
Nee, protip van een programmeur: nooit zelf met datum/tijd klooien. Het gaat altijd fout, er zijn bizar veel edge cases (zomer/wintertijd en schrikkeljaren zijn bekend maar er zijn vele andere).
Zoek een manier om UTC uit de timestamp kolom te trekken, bijvoorbeeld door de tijdzone van de SQL connectie op UTC te zetten:
Zoek een manier om UTC uit de timestamp kolom te trekken, bijvoorbeeld door de tijdzone van de SQL connectie op UTC te zetten:
Per-connection time zones. Each client that connects has its own time zone setting, given by the session time_zone variable. Initially, the session variable takes its value from the global time_zone variable, but the client can change its own time zone with this statement:
code:
1 mysql> SET time_zone = timezone;
The current session time zone setting affects display and storage of time values that are zone-sensitive. This includes the values displayed by functions such as NOW() or CURTIME(), and values stored in and retrieved from TIMESTAMP columns. Values for TIMESTAMP columns are converted from the current time zone to UTC for storage, and from UTC to the current time zone for retrieval.
The current time zone setting does not affect values displayed by functions such as UTC_TIMESTAMP() or values in DATE, TIME, or DATETIME columns. Nor are values in those data types stored in UTC; the time zone applies for them only when converting from TIMESTAMP values.
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
^^ Held.Proton_ schreef op zondag 26 oktober 2014 @ 12:05:
Nee, protip van een programmeur: nooit zelf met datum/tijd klooien. Het gaat altijd fout, er zijn bizar veel edge cases (zomer/wintertijd en schrikkeljaren zijn bekend maar er zijn vele andere).
[...]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Dank.
Maar ik hoef dus aan de MySQL kant qua inrichting niks te veranderen? Dat is mijn grootste zorg, als het daar maar goed wordt opgeslagen. Dat er in het tonen van de data via een script iets niet klopt kan ik dan wel aanpassen. Maar het vastleggen moet gelijk goed gaan.
Maar ik hoef dus aan de MySQL kant qua inrichting niks te veranderen? Dat is mijn grootste zorg, als het daar maar goed wordt opgeslagen. Dat er in het tonen van de data via een script iets niet klopt kan ik dan wel aanpassen. Maar het vastleggen moet gelijk goed gaan.
* je DB is OK
* unix_ timestamp op een timestamp kolom geeft UTC
* Je moet uitzoeken of Highcharts local- of UTC wil hebben (zo te zien local, ik weet het, net zei ik wat anders
)
* zoek een ingebouwde functie (mysql of js) die de vertaling goed doet
* tip: schrijf een test met tijden van vandaag en gisteren zodat je weet dat het klopt
* uiteindelijk heb je code zonder +3600/7200 fudge factor die het ook doet als de EU zomertijd of onze tijdzone afschaft, of überhaupt ergens anders op de wereld
* unix_ timestamp op een timestamp kolom geeft UTC
* Je moet uitzoeken of Highcharts local- of UTC wil hebben (zo te zien local, ik weet het, net zei ik wat anders
* zoek een ingebouwde functie (mysql of js) die de vertaling goed doet
* tip: schrijf een test met tijden van vandaag en gisteren zodat je weet dat het klopt
* uiteindelijk heb je code zonder +3600/7200 fudge factor die het ook doet als de EU zomertijd of onze tijdzone afschaft, of überhaupt ergens anders op de wereld
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
Oke.
Ik heb nu dit aangepast:
Aangepast naar:
Maar nu loopt de tijd nog steeds een uur achter. Ik kan het in de query wel aanpassen naar +2, maar dan zit ik met de zomertijd weer te klooien.
Want Amsterdam is in de winter toch UTC +1, en in de zomer UTC +2 ?
Ik heb nu dit aangepast:
MySQL:
1
| SELECT unix_timestamp (time) AS ts, time, huidig_verbruik AS 'vandaag' FROM readings WHERE DATE(time) = CURRENT_DATE |
Aangepast naar:
MySQL:
1
| SELECT UNIX_TIMESTAMP(CONVERT_TZ(time, '+01:00', @@global.time_zone)) AS ts, time, huidig_verbruik AS 'vandaag' FROM readings WHERE DATE(time) = CURRENT_DATE |
Maar nu loopt de tijd nog steeds een uur achter. Ik kan het in de query wel aanpassen naar +2, maar dan zit ik met de zomertijd weer te klooien.
Want Amsterdam is in de winter toch UTC +1, en in de zomer UTC +2 ?
[ Voor 6% gewijzigd door ThinkPad op 26-10-2014 15:20 ]
Ben maar weer eens begonnen...ThinkPadd schreef op woensdag 22 oktober 2014 @ 20:34:
Je probeert hem nu uit te lezen met Arduino? Of via PC?
Je moet het gewoon in stapjes aanpakken. Het duurde bij mij ook een poosje tot ik het werkend had (o.a. doordat het inverted was en ik de baudrate niet goed wist).Pinout ook goed? Deze persoon heeft dezelfde meter en leest hem met een Raspberry uit. Als je stukje naar beneden scrollt zie je een pinout staan.
- Probeer eerst eens met een USB > Serial converter en 'putty' via een Windows PC de boel uit te lezen. Lukt dat? --> Mooi, je slimme meter spuugt dus iig data uit, en je weet met welke instellingen het werkt.
- Vervolgens pak je een basic Arduino sketch en kijk je of je daarmee kloppende waardes terugkrijgt
- Als dat allemaal lukt dan kun je met mijn sketch aan de gang
Je moet overigens zorgen dat de 'enable' pin (RTS) op de meter 5V krijgt van je Arduino. Signaal is inderdaad inverted, maar dat is geen probleem als je het zoals dit aansluit: schema.
Wat misschien ook nog mee kan spelen is de DSMR versie. Mijn meter is nog niet zo oud, en werkt dus volgens de nieuwste DSMR standaard (4.0 dacht ik). Jouw meter is volgens mij al wat ouder, en werkt waarschijnlijk met een oudere standaard. Dat is voor het uitlezen op zich geen probleem, maar mogelijk dat je mijn sketch wat moet aanpassen omdat bepaalde velden bij jouw telegrammen op een andere plek staan, en mijn sketch de waarden dan niet kan 'vinden'.
Je woont helaas niet in de buurt, anders kon ik je even helpen
Helaas weer niet echt vorderingen gemaakt.
Ik probeer alles tot nu toe met de Arduino te doen. Een kabel voor de PC heb ik niet liggen helaas.
Pin out heb ik inderdaad volgens dat schema gemaakt. 5V request komt inderdaad van de Arduino (pin 5). en de 5V en GND voor de inverter komt van de 5V en GND pin van de Arduino.
De inverter al volgens 10 schema's gebouwd...
Heb daar dus ontzettend mee zitten prutsen omdat het niet werkte zoals het zou moeten. Uiteindelijk komt dat waarschijnlijk omdat er allemaal bagger uit mijn meter komt.
Ik ben nu zover dat ik dit uit mijn meter krijg:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| ¯KMP5 KA6U00±5²3´±·6±± 0-0:96.±.±(²0´B´±365530303±353²333´3±3·363±3±© ±-0:±.¸.±(0´±96.000ªë×è© ±-0:±.¸.²(03²²´.000ªë×è© ±-0:².¸.±(00000.000ªë×è© ±-0:².¸.²(00000.000ªë×è© 0-0:96.±´.0(000±© ±-0:±.·.0(0000.²5ªëש ±-0:².·.0(0000.00ªëש 0-0:±·.0.0(999ªA© 0-0:96.3.±0(±© 0-0:96.±3.±(© 0-0:96.±3.0(© 0-±:²´.±.0(3© 0-±:96.±.0(3²3¸30303930303±3±303·303¸35363±3±© 0-±:²´.3.0(±´±0²6±´0000©(00©(60©(±©(0-±:²´.².±©(í3© (0´´·5.´3´© 0-±:²´.´.0(±© ! |
Het begint er al op te lijken. Het zou er ongeveer zo uit moeten zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 0-0:96.1.1(204B413655303031363630323937393132) 1-0:1.8.1(00024.000*kWh) 1-0:1.8.2(00005.000*kWh) 1-0:2.8.1(00026.000*kWh) 1-0:2.8.2(00001.000*kWh) 0-0:96.14.0(0002) 1-0:1.7.0(0000.03*kW) 1-0:2.7.0(0000.00*kW) 0-0:17.0.0(999*A) 0-0:96.3.10(1) 0-0:96.13.1() 0-0:96.13.0() 0-1:24.1.0(3) 0-1:96.1.0(3238313031353431303034303232323131) 0-1:24.3.0(121030140000)(00)(60)(1)(0-1:24.2.1)(m3) (00024.123) 0-1:24.4.0(1) ! |
Dit is dus het signaal met inverter erop.
zonder inverter komt er alleen maar grotere zooi uit de meter.
Ik heb een sketch bij elkaar geknipt en geplakt die de data uit de meter in de serial monitor van de arduino moet tonen.
Dat lijkt te werken, alleen werken de standaard serial sketches met de standaard instellingen van 9600 baud, 8N1.
Voor mijn meter heb ik 9600 baud en 7E1 nodig.
Als ik daarvoor de serial verbinding start met de parameter SERIAL_7E1, dan werkt het helaas helemaal niet meer. Zelfs data die ik zelf schrijf naar de serial port komt er dan verminkt uit.
Nu heb ik iets gevonden over dat 7E1 hetzelfde is als 8N1 als je nog iets met de bitjes doet die uit de serail port komen. Dus ik denk dat dat nu de volgende uitdaging is om te tackelen.
Mijn meter is nog net geen 3 jaar oud (nieuwbouw). Dus een oudere DSMR versie zou best kunnen, maar dat merk je volgens mij alleen aan de format van de data die eruit komt.
Ben er voor vandaag in ieder geval weer klaar mee...
Van de week maar weer verder.
In ieder geval mooi dat je er nu iets redelijk leesbaar uit hebt gekregen!
Ik weet niet precies wat die rotzooi in de output als oorzaak heeft, maar ik vermoed de 8N1 / 7E1 instelling. Jammer dat je geen kabeltje voor de PC hebt, dan was het wat makkelijker debuggen.
Hoe lees je nu de seriele verbinding uit? Welke library? Software serial is kak, had ik veel problemen mee. AltSoftSerial is stukken beter. Maar Hardware serial is toch echt het beste. Maar in de debugfase kun je die nog niet gebruiken, omdat de USB>Serial verbinding van PC naar Arduino ook die pinnen (0 en 1) gebruikt
Ik weet niet precies wat die rotzooi in de output als oorzaak heeft, maar ik vermoed de 8N1 / 7E1 instelling. Jammer dat je geen kabeltje voor de PC hebt, dan was het wat makkelijker debuggen.
Hoe lees je nu de seriele verbinding uit? Welke library? Software serial is kak, had ik veel problemen mee. AltSoftSerial is stukken beter. Maar Hardware serial is toch echt het beste. Maar in de debugfase kun je die nog niet gebruiken, omdat de USB>Serial verbinding van PC naar Arduino ook die pinnen (0 en 1) gebruikt
Welke versie PHP gebruik je? Je kunt ook daar de 'time' vertalen naar unix timestamp: http://php.net/manual/en/datetime.gettimestamp.phpThinkPadd schreef op zondag 26 oktober 2014 @ 15:19:
Oke.
Ik heb nu dit aangepast:
MySQL:
1 SELECT unix_timestamp (time) AS ts, time, huidig_verbruik AS 'vandaag' FROM readings WHERE DATE(time) = CURRENT_DATE
Aangepast naar:
MySQL:
1 SELECT UNIX_TIMESTAMP(CONVERT_TZ(time, '+01:00', @@global.time_zone)) AS ts, time, huidig_verbruik AS 'vandaag' FROM readings WHERE DATE(time) = CURRENT_DATE
Maar nu loopt de tijd nog steeds een uur achter. Ik kan het in de query wel aanpassen naar +2, maar dan zit ik met de zomertijd weer te klooien.
Want Amsterdam is in de winter toch UTC +1, en in de zomer UTC +2 ?
Dan gaat dat dus uit de query en in de PHP code.
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
PHP versie 5.5.16
Maar met PHP trek ik er toch nog steeds de UTC tijd uit? Ik zie niet waarom het probleem dan ineens is opgelost
Maar met PHP trek ik er toch nog steeds de UTC tijd uit? Ik zie niet waarom het probleem dan ineens is opgelost
Kijk maar naar de 'time' kolom die je terugkrijgt - als ik de docs goed begrijp is dat weer localtime. PHP weet dat niet en behandelt dat als UTC (hopelijk).
Het ik-wil-een-warmtepomp FAQ topic- '23 MG5, douchen met wtw en Auer Edel Eau, verwarming met Vaillant Arotherm Plus.
Gelukt!!!ThinkPadd schreef op zondag 26 oktober 2014 @ 15:38:
In ieder geval mooi dat je er nu iets redelijk leesbaar uit hebt gekregen!
Ik weet niet precies wat die rotzooi in de output als oorzaak heeft, maar ik vermoed de 8N1 / 7E1 instelling. Jammer dat je geen kabeltje voor de PC hebt, dan was het wat makkelijker debuggen.
Hoe lees je nu de seriele verbinding uit? Welke library? Software serial is kak, had ik veel problemen mee. AltSoftSerial is stukken beter. Maar Hardware serial is toch echt het beste. Maar in de debugfase kun je die nog niet gebruiken, omdat de USB>Serial verbinding van PC naar Arduino ook die pinnen (0 en 1) gebruikt
Ik had dus gelezen dat 7E1 hetzelfde is als 8N1 als je nog een trucje uithaalt met de bitjes uit de serial port.
Ik moest dus aan mijn sketch nog dit regeltje toevoegen:
code:
1
| ch &= 0x7F; |
Waarbij ch dus de string is die uit de meter komt.
Nu heb ik dit als output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| /KMP5 KA6U001523417611 0-0:96.1.1(204B413655303031353233343137363131) 1-0:1.8.1(04205.000*kWh) 1-0:1.8.2(03225.000*kWh) 1-0:2.8.1(00000.000*kWh) 1-0:2.8.2(00000.000*kWh) 0-0:96.14.0(0002) 1-0:1.7.0(0000.23*kW) 1-0:2.7.0(0000.00*kW) 0-0:17.0.0(999*A) 0-0:96.3.10(1) 0-0:96.13.1() 0-0:96.13.0() 0-1:24.1.0(3) 0-1:96.1.0(3238303039303031313037303835363131) 0-1:24.3.0(141027090000)(00)(60)(1)(0-1:24.2.1)(m3) (04478.951) 0-1:24.4.0(1) ! |
Helemaal zoals het hoort. Nu weet ik dat mijn inverter tenminste goed is.
Tot nu toe heb ik voornamelijk de hardware serial gebruikt. Ik heb nog even zitten stoeien met de software serial omdat je daar met een parameter het signaal zou kunnen inverteren.
Alleen zat ik daar met een sketch te klooien die niet helemaal lekker was doordat ik er teveel mee wilde (output naar SD schrijven).
Nu dus met een simpele sketch die alleen de output in de serial monitor zet.
Van de week maar weer verder met het netjes solderen van de inverter en een paar pinnetjes. Die inverter zit nu op een mini breadboard in de behuizing, maar dat kan veel kleiner.
Ik heb een behuizing gekocht waar de ethernetshield ook netjes in past, zodat het er straks allemaal netjes uitziet in de meterkast.
Mooi dat het gelukt is! De aanhouder wint 
Bij jou ziet het gasverbruik er anders uit, die zet hij op een volgende regel. Bij mij is dat niet zo, zie de output van mijn Kaifa meter. Ik vermoed dat dit met de DSMR versie te maken heeft.
Om mijn script te kunnen gebruiken zul je dat even moeten aanpassen. Zie bijv. deze reactie: ThinkPadd in "Hulp bij slimme meter uitlezen met Arduino naar MySQL"
Bij mij was het precies andersom namelijk. De meeste scripts waren gebaseerd op de output zoals jouw meter het uitspuugt, maar omdat het bij mij op een volgende regel staat liep het daardoor in de soep.

Bij jou ziet het gasverbruik er anders uit, die zet hij op een volgende regel. Bij mij is dat niet zo, zie de output van mijn Kaifa meter. Ik vermoed dat dit met de DSMR versie te maken heeft.
Om mijn script te kunnen gebruiken zul je dat even moeten aanpassen. Zie bijv. deze reactie: ThinkPadd in "Hulp bij slimme meter uitlezen met Arduino naar MySQL"
Bij mij was het precies andersom namelijk. De meeste scripts waren gebaseerd op de output zoals jouw meter het uitspuugt, maar omdat het bij mij op een volgende regel staat liep het daardoor in de soep.
Het is een leuk projectje. Nou zit mijn meterkast in het portiek en heb ik niet echt een directe (kabel) verbinding naar de PC. Dus ik dacht we gaan een Arduino voorzien van een Wifi boardje die de data naar mijn Syno pompt. Nou dat doen we dus niet. Het doel is geld besparen en de terugverdientijd van het Wifi boardje is dan al een jaar. lol. Ik zoek nog wel even naar een andere oplossing, misschien is er nog ruimte in de buis voor een cat5 kabeltje.
[ Voor 3% gewijzigd door RobV op 01-11-2014 08:59 ]
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Heb je geen stopcontact in die meterkast? Dan zou Powerline nog kunnen? Of trafo van de bel die daar hangt, en dat je door die leiding nog een extra draad trekt?
En een nRF24L01 2,4Ghz transceiver setje? Kosten op eBay geen drol, zul je alleen aan de andere kant (bij je NAS) nog een Arduino moeten inrichten als ontvanger denk ik.
Spul draait overigens nog steeds stabiel hier, super
En een nRF24L01 2,4Ghz transceiver setje? Kosten op eBay geen drol, zul je alleen aan de andere kant (bij je NAS) nog een Arduino moeten inrichten als ontvanger denk ik.
Spul draait overigens nog steeds stabiel hier, super
[ Voor 43% gewijzigd door ThinkPad op 07-11-2014 12:30 ]
Misschien is 433MHz een beter idee, ivm bereik. Weet niet of RobV in een betonnen blokkendoos woont?
After the first glass you see things as you wish they were. After the second you see things as they are not. Finally you see things as they really are, and that is the most horrible thing in the world...
Oscar Wilde
Sorry guys, door allerlei medische zaken nog niet toegekomen aan het meterkastprojectie.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Gezondheid gaat voor natuurlijk
Ik moet zeggen dat ik echt tevreden ben met deze Arduino oplossing. Het draait nu sinds 18 september zonder problemen en zonder een meetwaarde te missen volgens mij. Dikke prima
Ook dagelijkse upload naar Mindergas (al regelt m'n NAS dat via een PHP scriptje, Arduino doet alleen maar uitlezen meterstand en dat in MySQL pompen).
Ik moet zeggen dat ik echt tevreden ben met deze Arduino oplossing. Het draait nu sinds 18 september zonder problemen en zonder een meetwaarde te missen volgens mij. Dikke prima
Er zijn 5 euro WiFi modules beschikbaar!RobV schreef op zaterdag 01 november 2014 @ 08:59:
Het is een leuk projectje. Nou zit mijn meterkast in het portiek en heb ik niet echt een directe (kabel) verbinding naar de PC. Dus ik dacht we gaan een Arduino voorzien van een Wifi boardje die de data naar mijn Syno pompt. Nou dat doen we dus niet. Het doel is geld besparen en de terugverdientijd van het Wifi boardje is dan al een jaar. lol. Ik zoek nog wel even naar een andere oplossing, misschien is er nog ruimte in de buis voor een cat5 kabeltje.
ESP8266 bijvoorbeeld
Ik heb gisteren 10 stuks nrf24l01+ modules besteld voor $7.50 incl verzendkosten. Leuk voor een sensor netwerkje, met plantjes bevochtigen, deurbel, brievenbus, garagedeur.. Ben nu bezig met ontwerpen van de PCB.MrNiles schreef op maandag 23 maart 2015 @ 16:04:
[...]
Er zijn 5 euro WiFi modules beschikbaar!
ESP8266 bijvoorbeeld
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
very niceRobV schreef op maandag 23 maart 2015 @ 17:22:
[...]
Ik heb gisteren 10 stuks nrf24l01+ modules besteld voor $7.50 incl verzendkosten. Leuk voor een sensor netwerkje, met plantjes bevochtigen, deurbel, brievenbus, garagedeur.. Ben nu bezig met ontwerpen van de PCB.
ik ben ook aan het pielen, maar het lukt me nog niet heel erg
ik wil graag mijn analoge gasmeter uitlezen
als je pcb gaat ontwerpen, laat je die dan ook ergens maken of is het meer een schets voor draadjes te solderen?
Ben namelijk altijd wel geinteresseerd in een goedkope leverancier van hobby pcb's
Zat chinese aanbieders, iteadstudio, elecrow, etc. leveren vanaf $9.90 prima prints voor de amateur. Kijk eens in het arduino topic daar ben ik bezig met een printje speciaal voor de nrf's
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Sinds vandaag - na de stroomstoring - krijg ik verkeerde gegevens uit mijn Arduino.
De output van de Kaifa geeft wisselend de juiste waarde en 2573 voor mEAV
Iemand dezelfde ervaring, beter nog een oplossing?
De output van de Kaifa geeft wisselend de juiste waarde en 2573 voor mEAV
code:
1
2
3
4
| // 1-0:1.7.0 = Electricity consumption actual usage (DSMR v4.0) if (sscanf(buffer,"1-0:1.7.0(%ld.%ld" , &tl, &tld) == 2) { mEAV = (tl*1000)+tld; |
Iemand dezelfde ervaring, beter nog een oplossing?
Anoniem: 669644
Hoi,
Voor een project ben ik bezig om de P1 poort uit te lezen met een controller die gebruik maakt van logic text. Hierbij gebruik ik de code die hier in het toppic word gebruikt, echter heb ik wat vragen om deze om te kunnen zetten naar het juiste formaat voor mijn controller.
Mijn vraag gaat over dit deel van de code.
// 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
if (sscanf(buffer,"1-0:1.8.2(%ld.%ld" ,&tl, &tld)==2){ //met name dit deel.
tl *= 1000;
tl += tld;
mEVHT = tl;
}
Wat word er gedaan in het (%ld.%ld" ,&tl, &tld) deel.
Ik hoop dat ik hierbij geholpen kan worden.
Voor een project ben ik bezig om de P1 poort uit te lezen met een controller die gebruik maakt van logic text. Hierbij gebruik ik de code die hier in het toppic word gebruikt, echter heb ik wat vragen om deze om te kunnen zetten naar het juiste formaat voor mijn controller.
Mijn vraag gaat over dit deel van de code.
// 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
if (sscanf(buffer,"1-0:1.8.2(%ld.%ld" ,&tl, &tld)==2){ //met name dit deel.
tl *= 1000;
tl += tld;
mEVHT = tl;
}
Wat word er gedaan in het (%ld.%ld" ,&tl, &tld) deel.
Ik hoop dat ik hierbij geholpen kan worden.
Anoniem: 286368
Kijk hier eens naar : wellicht helpt dat : http:/mywiki.nl/p1_projectAnoniem: 669644 schreef op donderdag 23 april 2015 @ 17:00:
Hoi,
Voor een project ben ik bezig om de P1 poort uit te lezen met een controller die gebruik maakt van logic text. Hierbij gebruik ik de code die hier in het toppic word gebruikt, echter heb ik wat vragen om deze om te kunnen zetten naar het juiste formaat voor mijn controller.
Mijn vraag gaat over dit deel van de code.
// 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
if (sscanf(buffer,"1-0:1.8.2(%ld.%ld" ,&tl, &tld)==2){ //met name dit deel.
tl *= 1000;
tl += tld;
mEVHT = tl;
}
Wat word er gedaan in het (%ld.%ld" ,&tl, &tld) deel.
Ik hoop dat ik hierbij geholpen kan worden.
Dit is welliswaar geschreven voor een Raspberry Pi maar wellicht kan je hier inspiratie opdoen qua code
[ Voor 5% gewijzigd door Anoniem: 286368 op 26-06-2015 07:28 ]
Graag wil ik dit alles ook uitproberen, heb echter geen NAS server. Wel een webruimte met database.
Hoe moet ik dit stukje dan opbouwen
[/quote]
byte mac[] = {
0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31};
IPAddress ip(192,168,4,7);
IPAddress server(192,168,4,4); hier moet dan de verwijzing naar db op webruimte
EthernetClient client;
[quote]
Hoe moet ik dit stukje dan opbouwen
[/quote]
byte mac[] = {
0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31};
IPAddress ip(192,168,4,7);
IPAddress server(192,168,4,4); hier moet dan de verwijzing naar db op webruimte
EthernetClient client;
[quote]
Wanneer je een shared hosting hebt dan heeft een IP-adres geen enkel nut, er zitten dan meerdere domeinen op 1 IP-adres. Je zult dan gebruik moeten maken van een domeinnaam.
Verder moet je natuurlijk zorgen dat je komma's geen komma's zijn maar punten. Anders gaat je IP-adres nooit werken. (maar dat is opgelost met een domeinnaam)
Verder moet je natuurlijk zorgen dat je komma's geen komma's zijn maar punten. Anders gaat je IP-adres nooit werken. (maar dat is opgelost met een domeinnaam)
Domeinnnaam weet ik niet hoe je dat moet gebruiken. Zal vast wel kunnen, zoek even op Google.
@sypie: de komma's in de code kloppen wel hoor, zo moet je een IP-adres gebruiken in de code van Arduino. Normaal is het idd met punten, dus beetje verwarrend. Maar kijk maar op de eerdere pagina's naar mijn code
@sypie: de komma's in de code kloppen wel hoor, zo moet je een IP-adres gebruiken in de code van Arduino. Normaal is het idd met punten, dus beetje verwarrend. Maar kijk maar op de eerdere pagina's naar mijn code
Met succes nu de arduino uno R3 met ethernet shield aan gesloten volgens schema met 7404 op een landis en gyr E350.
Een heel gepuzzel met de BS170 lukte het niet ,inverter werkte niet mee.
Ook de koppeling naar database op een lokale server xampp werkt.
Nu het lezen van p1.php dat werkt niet het resulteerd in
Notice: Undefined index: mEVLT in C:\xampp\htdocs\p1.php on line 28
Notice: Undefined index: mEVHT in C:\xampp\htdocs\p1.php on line 29
Notice: Undefined index: mEAV in C:\xampp\htdocs\p1.php on line 30
Notice: Undefined index: mG in C:\xampp\htdocs\p1.php on line 31
Graag een advies want ik weet niet hoe dit op te lossen .
Bedankt alvast
Een heel gepuzzel met de BS170 lukte het niet ,inverter werkte niet mee.
Ook de koppeling naar database op een lokale server xampp werkt.
Nu het lezen van p1.php dat werkt niet het resulteerd in
Notice: Undefined index: mEVLT in C:\xampp\htdocs\p1.php on line 28
Notice: Undefined index: mEVHT in C:\xampp\htdocs\p1.php on line 29
Notice: Undefined index: mEAV in C:\xampp\htdocs\p1.php on line 30
Notice: Undefined index: mG in C:\xampp\htdocs\p1.php on line 31
Graag een advies want ik weet niet hoe dit op te lossen .
Bedankt alvast
[ Voor 99% gewijzigd door arnaudarduino op 01-08-2015 18:08 ]
Stuur je de waarden wel mee als je het PHP-bestand aanroept?
Op deze manier: p1.php?mEVLT=13000&mEVHT=1000&mEAV=540&mG=15.48
Dat p1.php bestand is alleen voor het toevoegen van de waardes vanuit de meter. Je kunt hem op de PC niet gebruiken verder.
P.S. Graag niet hele lappen code plaatsen, doe dat op www.pastebin.com ofzo en zet dan een linkje naar je paste in je bericht. En als je stukjes code (de relevante stukken) hier wilt plaatsen, gebruik dan de [code] tags.
Op deze manier: p1.php?mEVLT=13000&mEVHT=1000&mEAV=540&mG=15.48
Dat p1.php bestand is alleen voor het toevoegen van de waardes vanuit de meter. Je kunt hem op de PC niet gebruiken verder.
P.S. Graag niet hele lappen code plaatsen, doe dat op www.pastebin.com ofzo en zet dan een linkje naar je paste in je bericht. En als je stukjes code (de relevante stukken) hier wilt plaatsen, gebruik dan de [code] tags.
[ Voor 29% gewijzigd door ThinkPad op 26-07-2015 14:11 ]
O beetje late reactie van mij. Ik heb het allemaal werkend .
Ook weergave op scherm .
Ben van plan om compleet werkende programma's en php beschikbaar te stellen .
Nu ben ik nog wat aan het proberen maar het wil niet.
Ik wil ook graag de amperes loggen dit staat bij serialprint 1-0:31.7.0(003*A)
GET /datalogger/p1.php?mEVLT=352906&mEVHT=331534&mELLZ=63588&mEHLZ=167031&mEAV=660&mEAA=0&mEPV=0&mG=61240 HTTP/1.1 Voor mEAA wordt dus 0 verstuurd ipv 003
Echter krijg ik het niet verbouwd zoals electra hoog tarief ofzo.
Hoe moet de notatie zijn
Wie helpt.
Ook weergave op scherm .
Ben van plan om compleet werkende programma's en php beschikbaar te stellen .
Nu ben ik nog wat aan het proberen maar het wil niet.
Ik wil ook graag de amperes loggen dit staat bij serialprint 1-0:31.7.0(003*A)
GET /datalogger/p1.php?mEVLT=352906&mEVHT=331534&mELLZ=63588&mEHLZ=167031&mEAV=660&mEAA=0&mEPV=0&mG=61240 HTTP/1.1 Voor mEAA wordt dus 0 verstuurd ipv 003
Echter krijg ik het niet verbouwd zoals electra hoog tarief ofzo.
Hoe moet de notatie zijn
code:
1
2
3
4
5
6
| // 1-0:31.7.0 = Elektra stroom (DSMR v4.0) if (sscanf(buffer,"1-0:31.7.0(%ld.%ld" ,&tl, &tld)==2){ tl *= 1000; tl += tld; mEAA = tl; } |
Wie helpt.
[ Voor 86% gewijzigd door arnaudarduino op 15-08-2015 14:42 . Reden: deelvraag ]
code:
1
2
3
4
5
| // 1-0:31.7.0 = Elektra stroom (DSMR v4.0) if (sscanf(buffer, "1-0:31.7.0(%ld" , &tl) == 1) { mEAA = tl; } |
Dit is de notatie.
Vraag die overblijft, rekenen met de waarden uit het telegram die de slimme meter uitspuugt.
Vooral de terug geleverde energie , hoe krijg ik dat op geteld ,zodat die de waarde benaderd van wat de omvormer aangeeft. Ik lees de meter uit elke minuut , oa : 1-0:2.7.0 Hoe moet ik rekenen om de totale terug geleverde energie voor die dag eruit te krijgen?
[ Voor 35% gewijzigd door arnaudarduino op 03-09-2015 22:37 ]
een paar leestekentjes zouden die zin (in elk geval oor mij) een stuk leesbaarder maken. Ik moest hem 3x lezen. Echter begrijp ik nog steeds je vraag niet.
| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Met interesse heb ik dit topic gelezen. Gelijk wat spulletjes besteld dus hopelijk doet meneer China Post er niet te lang over om alles te bezorgen
Enige arduino ervaring heb ik al. Heb thuis nog een uno liggen vanaf bijna t moment dat ze uitkwamen
Moet 'm even uit m'n huidige GPS project extraderen maar zal tzt wel een nieuwe bestellen denk ik zomaar.
Ik vroeg me wel af of het mogelijk is het uitlezen van mijn watermeter te integreren in het script van ThinkPad. Ik wil daarvoor de CNY70 gebruiken mocht ik dit een beetje stabiel krijgen. De bevindingen daarover zijn nogal verdeeld. Echter zie ik al een 'beer op de weg'. Dit moet waarschijnlijk met een interrupt gaan werken en ik ben bang dat ik dan halve telegrammen binnen krijg of de helft maar wegschrijf naar mijn db. Dit omdat de arduino gestoord wordt door de watermeter. Denk ik dan goed of zit ik er naast?
Graag jullie mening!

Enige arduino ervaring heb ik al. Heb thuis nog een uno liggen vanaf bijna t moment dat ze uitkwamen
Moet 'm even uit m'n huidige GPS project extraderen maar zal tzt wel een nieuwe bestellen denk ik zomaar.
Ik vroeg me wel af of het mogelijk is het uitlezen van mijn watermeter te integreren in het script van ThinkPad. Ik wil daarvoor de CNY70 gebruiken mocht ik dit een beetje stabiel krijgen. De bevindingen daarover zijn nogal verdeeld. Echter zie ik al een 'beer op de weg'. Dit moet waarschijnlijk met een interrupt gaan werken en ik ben bang dat ik dan halve telegrammen binnen krijg of de helft maar wegschrijf naar mijn db. Dit omdat de arduino gestoord wordt door de watermeter. Denk ik dan goed of zit ik er naast?
Graag jullie mening!
Anoniem: 119331
@ThinkPad,
Ik heb dit geweldige stukje eens helemaal door gelezen en heb alles uitgevoerd zoals je hebt beschreven, maar ik krijg de grafieken niet werkend.
Ik maak gebruik van een mysql database waar de gegevens uit worden gehaald. Ook maak ik gebruik van een pc waarop alles wordt opgeslagen in een wamp database.
Nu probeer ik al een tijdje grafieken te produceren, maar het enigste wat ik krijg zijn lege (witte) pagina's
Is hier iets van bekend dat het met wamp niet werkt?
Ik heb dit geweldige stukje eens helemaal door gelezen en heb alles uitgevoerd zoals je hebt beschreven, maar ik krijg de grafieken niet werkend.
Ik maak gebruik van een mysql database waar de gegevens uit worden gehaald. Ook maak ik gebruik van een pc waarop alles wordt opgeslagen in een wamp database.
Nu probeer ik al een tijdje grafieken te produceren, maar het enigste wat ik krijg zijn lege (witte) pagina's
Is hier iets van bekend dat het met wamp niet werkt?
Klinkt eerder alsof je problemen hebt met PHP.Anoniem: 119331 schreef op dinsdag 29 december 2015 @ 00:18:
@ThinkPad,
[...]
Is hier iets van bekend dat het met wamp niet werkt?
De inhoudelijke code heb ik 1,5 jaar geleden voor het laatst aangeraakt: ThinkPad's Tweakblog: Uitlezen van de slimme meter P1-poort met een Arduino en waarden opslaan in MySQL-database dus daar weet ik niet heel veel meer van en kan ik dus ook niet echt meer mee helpen.
Sindsdien lees ik de slimme meter uit via Domoticz (wat op een Raspberry Pi o.i.d. kan draaien), veel gemakkelijker
Ik ben dit project ook aan het uitvoeren en heb ondertussen een basis sketch op basis van jou sketch gemaakt maar blijf tegen het probleem aanlopen dat de gas waarde niet werken. De stroom waarde werken prima alleen de gas waarde krijg ik nooit in de mG variabele opgeslagen. Ik ben er al een aantal uur mee bezig maar begrijp ook niet precies hoe de if uit de voorbeelden nou precies werkt. Ik denk dat mijn meter misschien een iets andere output of iets dergelijks geeft waardoor de gas waarde dus niet netjes uit het resultaat gehaald kunnen worden.
Ook wil ik graag de datum/tijd van de laaste gas meting in een variabele stoppen maar hier blijft continue een compleet andere waarde uit komen.
Ik heb tot nu toe het volgende:
Een voorbeeld output van mijn meter geeft het volgende:
Ik heb de volgende meters:
- Iskra ME382 (stroom)
- Landys+ Gyr (Gas)
Is er iemand die mij kan helpen en netjes in de variabele opgeslagen krijg?
Ook wil ik graag de datum/tijd van de laaste gas meting in een variabele stoppen maar hier blijft continue een compleet andere waarde uit komen.
Ik heb tot nu toe het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
| /* Arduino 'slimme meter' P1-port reader. This sketch reads data from a Dutch smart meter that is equipped with a P1-port. Connect 'RTS' from meter to Arduino pin 5V Connect 'GND' from meter to Arduino GND Connect 'RxD' from meter to Arduino pin 8 (RX) Baudrate 115200, 8N1. BS170 transistor & 10k resistor is needed to make data readable if meter spits out inverted data A .php file is requested (with consumption numbers in the GET request) every minute (interval set at line #52) created by 'ThinkPad' @ Tweakers.net, september 2014 [TOPIC=1601301]Hulp bij slimme meter uitlezen met Arduino naar MySQL[/TOPIC] */ #include <AltSoftSerial.h> // AltSoftSerial always uses these pins: // // Board Transmit Receive PWM Unusable // ----- -------- ------- ------------ // Teensy 2.0 9 10 (none) // Teensy++ 2.0 25 4 26, 27 // Arduino Uno 9 8 10 // Arduino Mega 46 48 44, 45 // Wiring-S 5 6 4 // Sanguino 13 14 12 AltSoftSerial altSerial; char c; //const int requestPin = 5; char input; // incoming serial data (byte) bool readnextLine = false; #define BUFSIZE 75 char buffer[BUFSIZE]; //Buffer for serial data to find \n . int bufpos = 0; long mEVLT = 0; //Meter reading Electrics - consumption low tariff long mEVHT = 0; //Meter reading Electrics - consumption high tariff long mEAV = 0; //Meter reading Electrics - Actual consumption String mGDate; long mG = 0; //Meter reading Gas long lastTime = 0; // will store last time long interval = 60000; // interval at which to blink (milliseconds) void setup() { // Serial.begin(9600); altSerial.begin(9600); } void loop() { decodeTelegram(); // if (millis() - lastTime > interval) { // lastTime = millis(); // //Reset variables to zero for next run // Serial.println(mEVLT); // mEVLT = 0; // mEVHT = 0; // mEAV = 0; // mG = 0; // } } //Einde loop void decodeTelegram() { long tl = 0; long tld = 0; if (altSerial.available()) { input = altSerial.read(); // --- 7 bits instelling --- input &= ~(1 << 7); char inChar = (char)input; // Fill buffer up to and including a new line (\n) buffer[bufpos] = input & 127; bufpos++; if (input == '\n') { // We received a new line (data up to \n) if (sscanf(buffer, "1-0:1.8.1(%ld.%ld" , &tl, &tld) == 2) { tl *= 1000; tl += tld; mEVLT = tl; Serial.print("low: "); Serial.println(mEVLT); } // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0) if (sscanf(buffer, "1-0:1.8.2(%ld.%ld" , &tl, &tld) == 2) { tl *= 1000; tl += tld; mEVHT = tl; Serial.print("high: "); Serial.println(mEVHT); } // 1-0:1.7.0 = Electricity consumption actual usage (DSMR v4.0) if (sscanf(buffer, "1-0:1.7.0(%ld.%ld" , &tl , &tld) == 2) { mEAV = (tl * 1000) + tld; Serial.print("actual: "); Serial.println(mEAV); } // if (sscanf(buffer, "0-1:24.3.0(%ld" , &tld) == 1) // { // mGDate = tld; // Serial.print("gas date: "); // Serial.println(mGDate); // } // 0-1:24.2.1 = Gas (DSMR v4.0) on Kaifa MA105 meter if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) { if (sscanf(strrchr(buffer, '(') + 1, "%d.%d", &tl, &tld) == 2) { mG = (tl * 1000) + tld; Serial.print("gas: "); Serial.println(mG); } } // Empty buffer again (whole array) for (int i = 0; i < 75; i++) { buffer[i] = 0; } bufpos = 0; } } //Einde 'if AltSerial.available' } //Einde 'decodeTelegram()' functie |
Een voorbeeld output van mijn meter geeft het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| /ISk5\2ME382-1004 0-0:96.1.1(4B414C37303035313438323137303133) 1-0:1.8.1(03372.316*kWh) 1-0:1.8.2(03604.976*kWh) 1-0:2.8.1(00000.088*kWh) 1-0:2.8.2(00000.029*kWh) 0-0:96.14.0(0001) 1-0:1.7.0(0000.68*kW) 1-0:2.7.0(0000.00*kW) 0-0:17.0.0(0999.00*kW) 0-0:96.3.10(1) 0-0:96.13.1() 0-0:96.13.0() 0-1:24.1.0(3) 0-1:96.1.0(3238313031353431323030373036323133) 0-1:24.3.0(160102220000)(00)(60)(1)(0-1:24.2.1)(m3) (01227.711) 0-1:24.4.0(1) ! |
Ik heb de volgende meters:
- Iskra ME382 (stroom)
- Landys+ Gyr (Gas)
Is er iemand die mij kan helpen en netjes in de variabele opgeslagen krijg?
Er lijkt sinds de jaarwisseling een landelijke storing te zijn bij veel gebruikers, met betrekking tot het uitlezen van de gasmeterstand. Kijk hier maar eens: Slimme/digitale meter uitlezen met een Raspberry Pi
Hey ThinkPad bedankt voor je antwoord. Ik ben er vandaag weer even mee verder gegaan maar dit lijkt niet het probleem. De stand wordt inderdaad niet meer geupdate maar ik krijg wel netjes de stand van 31 december 2015 terug. Het probleem is dat deze stand ook niet netjes wordt omgezet naar een variabele. Ik heb nog een aantal dingen geprobeerd die ik op internet gevonden heb maar krijg het niet werkend. Ik denk zelf dat het komt doordat de code van jou/mijn eerdere sketch gebaseerd is op het decoden van de gaswaarde voor een meter die DSMR 4.0 terug geeft. Om die reden werkt alleen het stroom gedeelte.
Mijn meter(Iskra ME382) maakt gebruik van DSMR 2.2. Zoals ook te zien is in het voorbeeld van het telegram dat ik terug krijg wordt de gas waarde net iets anders genoteerd.(volgende regel). Heb jij toevallig een idee wat ik aan het volgende stukje moet aanpassen zodat deze ook werkt met mijn DSMR 2.2 ouput.
Ik hoop dat iemand kan aangeven wat er aan dit stukje code moet worden aangepast om wel de juiste waarde te krijgen. Ik heb al zitten zoeken en wat zitten lezen over strncmp maar begrijp niet helemaal hoe dit nou precies werkt.
Mijn meter(Iskra ME382) maakt gebruik van DSMR 2.2. Zoals ook te zien is in het voorbeeld van het telegram dat ik terug krijg wordt de gas waarde net iets anders genoteerd.(volgende regel). Heb jij toevallig een idee wat ik aan het volgende stukje moet aanpassen zodat deze ook werkt met mijn DSMR 2.2 ouput.
code:
1
2
3
4
5
6
7
8
| // 0-1:24.2.1 = Gas (DSMR v4.0) on Kaifa MA105 meter if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) { if (sscanf(strrchr(buffer, '(') + 1, "%d.%d", &tl, &tld) == 2) { mG = (tl * 1000) + tld; Serial.print("gas: "); Serial.println(mG); } } |
Ik hoop dat iemand kan aangeven wat er aan dit stukje code moet worden aangepast om wel de juiste waarde te krijgen. Ik heb al zitten zoeken en wat zitten lezen over strncmp maar begrijp niet helemaal hoe dit nou precies werkt.
-vraag verhuist-
[ Voor 177% gewijzigd door NBK op 09-01-2016 18:47 ]
PC's; Home; Met 8619 units als 72e geëindigd bij DPC @ SETI-classic
2 vraagjes,ThinkPadd schreef op zondag 03 januari 2016 @ 10:44:
Er lijkt sinds de jaarwisseling een landelijke storing te zijn bij veel gebruikers, met betrekking tot het uitlezen van de gasmeterstand. Kijk hier maar eens: Slimme/digitale meter uitlezen met een Raspberry Pi
1) ik zou verwachten dat ongeacht externe factor(en) de meter actuele data uitspuugt ? is dit niet juist ?
2) Ik wil de "gehele" meterkast gaan monitoren dus de slimme meter + elke groep individueel, waar kan ik beter mee starten een arduino of een rasp pi ?
Tja vanalles
Volgende week wordt er bij mij een slimme meter geinstalleerd. Ik weet nog niet welk type.
Momenteel meet ik mijn, niet zo slimme, meter al met een Arduino die de LED pulsjes telt. Dit wil ik dus nu gaan aanpassen en gebruik gaan maken van de telegram die via P1 poort is af te lezen.
Het is mij echter niet helemaal duidelijk wat voor kabel ik nou moet nemen. Ik heb al een aantal topics doorzocht en ik begrijp dat er 3 soorten kabels zijn:
1. HL-340: (CH340), inverts signaal automatisch
2. PL2303: inverts signaal niet automatisch, extra transistors en resistors nodig om dit voor elkaar te krijgen
3. FTDI: bevat een programmable chip, is eigenlijk de beste oplossing
Echter is het me compleet niet duidelijk hoe ik dit aan mijn Arduino moet koppelen. Er zijn FTDI kabels te vinden op ebay. Daarvoor moet eerst een RJ11 stekker eraan geknipt worden, en aan de andere kant heb je een USB stekker. Maar hoe steek ik die in mijn Arduino?
Moet dat zo?

Twee voorbeelden
Optie 1. een USB 2.0 naar RJ11 waar ik dan de FTDI kabel in kan steken. Om vervoglgens de losse draadjes in de Arduino te kunnen prikken.
Optie 2. Aan de FTDI kabel een RJ11 stekker knippen. FTDI kabel middels een USB naar USB mini adapter naar een FTDI to serial, die vervolgens weer naar de Arduino gaat.
Lijkt me allemaal niet ideaal. Optie 1 heeft minste onderdelen maar ik vraag me af of binnen de USB naar RJ11 adapter wel de juiste wiring zit.
Mijn vraag komt er eigenlijk op neer, hoe kan ik met een Arduino de P1 poort uitlezen zonder dat ik moet gaan solderen?
Momenteel meet ik mijn, niet zo slimme, meter al met een Arduino die de LED pulsjes telt. Dit wil ik dus nu gaan aanpassen en gebruik gaan maken van de telegram die via P1 poort is af te lezen.
Het is mij echter niet helemaal duidelijk wat voor kabel ik nou moet nemen. Ik heb al een aantal topics doorzocht en ik begrijp dat er 3 soorten kabels zijn:
1. HL-340: (CH340), inverts signaal automatisch
2. PL2303: inverts signaal niet automatisch, extra transistors en resistors nodig om dit voor elkaar te krijgen
3. FTDI: bevat een programmable chip, is eigenlijk de beste oplossing
Echter is het me compleet niet duidelijk hoe ik dit aan mijn Arduino moet koppelen. Er zijn FTDI kabels te vinden op ebay. Daarvoor moet eerst een RJ11 stekker eraan geknipt worden, en aan de andere kant heb je een USB stekker. Maar hoe steek ik die in mijn Arduino?
Moet dat zo?

Twee voorbeelden
Optie 1. een USB 2.0 naar RJ11 waar ik dan de FTDI kabel in kan steken. Om vervoglgens de losse draadjes in de Arduino te kunnen prikken.
Optie 2. Aan de FTDI kabel een RJ11 stekker knippen. FTDI kabel middels een USB naar USB mini adapter naar een FTDI to serial, die vervolgens weer naar de Arduino gaat.
Lijkt me allemaal niet ideaal. Optie 1 heeft minste onderdelen maar ik vraag me af of binnen de USB naar RJ11 adapter wel de juiste wiring zit.
Mijn vraag komt er eigenlijk op neer, hoe kan ik met een Arduino de P1 poort uitlezen zonder dat ik moet gaan solderen?
Geen van beide oplossingen gaat werken, je hebt niks met USB te maken op de ArduinoThe_FrankO schreef op woensdag 20 januari 2016 @ 15:20:
[...]
Mijn vraag komt er eigenlijk op neer, hoe kan ik met een Arduino de P1 poort uitlezen zonder dat ik moet gaan solderen?

De Arduino pins kun je instellen als serial poort en op die manier de meter uitlezen. Moet nog wel een transistor en een weerstand tussen, je meter zal het signaal geinverteerd uit spugen denk ik. Dit schema gaat wel werken dan:

Bron: http://domoticx.com/wp-co...itlezen_arduino_BS170.jpg
De weerstand in het schema is 10K.
Niet lullig bedoeld overigens, maar: als je al niet kunt/durft/wilt solderen, ben je dan niet veel beter af met een kant-en-klaar P1 USB-kabeltje (Marktplaats en andere sites wel te koop) die je in een Raspberry Pi met Domoticz plugt? Dan ben je in 5 min. klaar.
De Arduino aansluiten op je slimme meter is één, maar vervolgens moet je op de Arduino nog code hebben die het uitlezen regelt en die het wegschrijft naar een database. Vervolgens heb je het in een database staan en moet het nog getoond worden. Behoorlijke uitdaging als je daar geen ervaring mee hebt...
[ Voor 33% gewijzigd door ThinkPad op 20-01-2016 15:43 ]
Momenteel heb ik dat al draaien dus maak je geen zorgen om die ervaring. Momenteel schrijf ik het actuele verbruik weg in een database en wordt weergegeven in een eigen gemaakte website. Ook heb ik in de meterkast zelf een 7 segment display waar ik het actueel opgenomen verbruik kan zien, met een druk op een knopje kan ik ook andere dingen zien als het verbruik die dag en totaal sinds start Arduino.
Ik was opzoek naar een goedkope oplossing, Raspberry valt dus al af en een kant en klaar kabel ook.
Het advies is dus om een soldeerbout, PL2303, 10K weerstand en BS170 transistor te kopen? Had gehoopt voor minder dan €10,- klaar te kunnen zijn
Herstel, waarschijnlijk ook die PL2303 dan niet nodig, een bestaande telefoon draad kan ook gebruikt worden?
Ik was opzoek naar een goedkope oplossing, Raspberry valt dus al af en een kant en klaar kabel ook.
Het advies is dus om een soldeerbout, PL2303, 10K weerstand en BS170 transistor te kopen? Had gehoopt voor minder dan €10,- klaar te kunnen zijn
Herstel, waarschijnlijk ook die PL2303 dan niet nodig, een bestaande telefoon draad kan ook gebruikt worden?
[ Voor 7% gewijzigd door The_FrankO op 20-01-2016 16:06 ]
Vandaag geprobeerd om data uit de meter te krijgen. Het gaat om een Landis + Gyr E350 generatie DSMR4.0/DSMR4.2. Helaas weinig succes. 
Zoals verwacht stuurt deze meter de data reverted, daarom had ik al een. BS170 en 10k ohm weerstand aangeschaft. Met het eerder genoemde schema krijg ik echter helemaal geen data uit de meter. Als ik de BS170 er tussen uit haal komt er elke 10 seconde onleesbare data uit.
Ik heb volgende schema gebruikt:

Boven zoals aangesloten zonder BS170, levert onleesbare data
Onder zoals aangesloten met BS170, levert helemaal geen data
Zoals verwacht stuurt deze meter de data reverted, daarom had ik al een. BS170 en 10k ohm weerstand aangeschaft. Met het eerder genoemde schema krijg ik echter helemaal geen data uit de meter. Als ik de BS170 er tussen uit haal komt er elke 10 seconde onleesbare data uit.
Ik heb volgende schema gebruikt:

Boven zoals aangesloten zonder BS170, levert onleesbare data
Onder zoals aangesloten met BS170, levert helemaal geen data
Voor de E350 moet je nog een weerstand (1K schijnt genoeg te zijn) tussen pin 2 en pin 5 van je RJ11-connector zetten lees ik hier: http://domoticz.com/forum...p=41920&hilit=E350#p41920
Ik wil ook graag mijn meterstanden gaan uitlezen. Nu wil ik een standaard p1 kabel kopen.
Nu zit mijn pi 4-5 meter afstand in een andere kamer.
Er loopt een netwerk kabel naar mijn meterkast vanaf mijn pi.
Kan ik deze kabel om solderen zodat ik de p1 kabel verleng? Of geeft deze afstand problemen?
Nu zit mijn pi 4-5 meter afstand in een andere kamer.
Er loopt een netwerk kabel naar mijn meterkast vanaf mijn pi.
Kan ik deze kabel om solderen zodat ik de p1 kabel verleng? Of geeft deze afstand problemen?
Je zou het kunnen proberen, het is een serieel signaal op een niet al te hoge snelheid (115200 baud). Zeker omdat de meter elke 10 seconden een bericht uitstuurt is het niet heel erg als je er eens eentje mist.
Ik kom er nog niet helemaal uit. Mijn electronica kennis is zeer beperkt. Maar zet ik dan niet 5v op pin 5 die de transistor in gaat?ThinkPadd schreef op zaterdag 30 januari 2016 @ 20:32:
Voor de E350 moet je nog een weerstand (1K schijnt genoeg te zijn) tussen pin 2 en pin 5 van je RJ11-connector zetten lees ik hier: http://domoticz.com/forum...p=41920&hilit=E350#p41920
Ziet het er dan zo uit?

Ik heb geen 1k ohm weerstand in huis, met een 10k ohm weerstand gaat het zeker niet werken?
Overigens wat is de verklaring dat pin 2 en pin 5 aan elkaar knopen nodig is als de transitor er tussen zit? Zit er dan te weinig spanning op pin 5 ofzo?
Het is me uiteindelijk gelukt. Aangezien ik toch een 1k ohm weerstand moest kopen heb ik gelijk maar een 7404IC gekocht. Deze paar onderdeeltjes kwamen in een doos van 5 x 25 x 35 cm ....
Aangesloten volgens dit schema:

Bron: http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/
Een 7404IC is dan wel een paar centjes duurder maar je hebt geen gedoe met weerstanden. Voor iemand zoals ik met weinig kennis van electronica is dat toch een veel makkelijkere oplossing.
7404IC met Landis + Gyr E350 is dus de beste oplossing.
In eerste instantie had ik de code voor het uitlezen van de meter met de Arduino van Thinkpad gebruikt. Echter had ik veel last van foutieve berichten. Tijdens de debug fase gebruik ik namelijk AltSerial en het is al eerder hier aangegeven dat de hardware Serial gebruikt moet worden. Hardware Serial kreeg ik niet zo snel aan de praat, ik vermoed omdat ik de Arduino voed via USB.
Ik heb in iedergeval de code aangepast dat eerst het hele telegram wordt gedownload en in het geheugen wordt geladen. Pas als het bericht volledig binnen is ga ik pas bewerkingen doen. Hiermee zorg ik ervoor dat de Arduino alleen maar bezig is met het ontvangen via Serial, en daarna pas weer wat anders gaat doen. Hiermee waren het aantal berichten wat fout zijn een stuk kleiner.
Als ik op Serial '/' binnen zie komen zet ik een boolean waarmee ik aangeef dat ik een bericht aan het ontvangen ben. Zodra ik een '!' tegen kom en het vorige char een '/n' weet ik dat het einde van het bericht is en zet ik de boolean weer om.
Daarna middels substring haal ik de gewenste waardes uit het bericht.
Ik overweeg nog om het hele telegram naar de php pagina te sturen samen met de CRC check (komt na de '!'), om te kijken of het bericht juist is. Zijn er meer mensen die dit doen of hebben jullie zoiets van met hardware Serial komt het wel goed binnen en die enkele keer dat de cosmische straling een bitje omgooit neem ik voor lief?
Dit weekend, time permitting, wil ik de Ethernet code toevoegen aan mijn sketch, ik zal dan mijn complete code hier plaatsen.

Aangesloten volgens dit schema:

Bron: http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/
Een 7404IC is dan wel een paar centjes duurder maar je hebt geen gedoe met weerstanden. Voor iemand zoals ik met weinig kennis van electronica is dat toch een veel makkelijkere oplossing.
7404IC met Landis + Gyr E350 is dus de beste oplossing.
In eerste instantie had ik de code voor het uitlezen van de meter met de Arduino van Thinkpad gebruikt. Echter had ik veel last van foutieve berichten. Tijdens de debug fase gebruik ik namelijk AltSerial en het is al eerder hier aangegeven dat de hardware Serial gebruikt moet worden. Hardware Serial kreeg ik niet zo snel aan de praat, ik vermoed omdat ik de Arduino voed via USB.
Ik heb in iedergeval de code aangepast dat eerst het hele telegram wordt gedownload en in het geheugen wordt geladen. Pas als het bericht volledig binnen is ga ik pas bewerkingen doen. Hiermee zorg ik ervoor dat de Arduino alleen maar bezig is met het ontvangen via Serial, en daarna pas weer wat anders gaat doen. Hiermee waren het aantal berichten wat fout zijn een stuk kleiner.
Als ik op Serial '/' binnen zie komen zet ik een boolean waarmee ik aangeef dat ik een bericht aan het ontvangen ben. Zodra ik een '!' tegen kom en het vorige char een '/n' weet ik dat het einde van het bericht is en zet ik de boolean weer om.
Daarna middels substring haal ik de gewenste waardes uit het bericht.
Ik overweeg nog om het hele telegram naar de php pagina te sturen samen met de CRC check (komt na de '!'), om te kijken of het bericht juist is. Zijn er meer mensen die dit doen of hebben jullie zoiets van met hardware Serial komt het wel goed binnen en die enkele keer dat de cosmische straling een bitje omgooit neem ik voor lief?
Dit weekend, time permitting, wil ik de Ethernet code toevoegen aan mijn sketch, ik zal dan mijn complete code hier plaatsen.
Anoniem: 624983
Quote van bericht hierboven:
In eerste instantie had ik de code voor het uitlezen van de meter met de Arduino van Thinkpad gebruikt. Echter had ik veel last van foutieve berichten. Tijdens de debug fase gebruik ik namelijk AltSerial en het is al eerder hier aangegeven dat de hardware Serial gebruikt moet worden. Hardware Serial kreeg ik niet zo snel aan de praat, ik vermoed omdat ik de Arduino voed via USB.
Ik heb in iedergeval de code aangepast dat eerst het hele telegram wordt gedownload en in het geheugen wordt geladen. Pas als het bericht volledig binnen is ga ik pas bewerkingen doen. Hiermee zorg ik ervoor dat de Arduino alleen maar bezig is met het ontvangen via Serial, en daarna pas weer wat anders gaat doen. Hiermee waren het aantal berichten wat fout zijn een stuk kleiner.
Bovenstaand is ook mijn probleem. Geen enkele telegram is foutloos, dus ik krijg de waarden ook niet goed uitgelezen en doorgestuurd.
Ben benieuwd naar jouw code om eerst het telegram te lezen, en pas daarna te bewerken. Zou je dat eventueel ergens kunnen posten?
In eerste instantie had ik de code voor het uitlezen van de meter met de Arduino van Thinkpad gebruikt. Echter had ik veel last van foutieve berichten. Tijdens de debug fase gebruik ik namelijk AltSerial en het is al eerder hier aangegeven dat de hardware Serial gebruikt moet worden. Hardware Serial kreeg ik niet zo snel aan de praat, ik vermoed omdat ik de Arduino voed via USB.
Ik heb in iedergeval de code aangepast dat eerst het hele telegram wordt gedownload en in het geheugen wordt geladen. Pas als het bericht volledig binnen is ga ik pas bewerkingen doen. Hiermee zorg ik ervoor dat de Arduino alleen maar bezig is met het ontvangen via Serial, en daarna pas weer wat anders gaat doen. Hiermee waren het aantal berichten wat fout zijn een stuk kleiner.
Bovenstaand is ook mijn probleem. Geen enkele telegram is foutloos, dus ik krijg de waarden ook niet goed uitgelezen en doorgestuurd.
Ben benieuwd naar jouw code om eerst het telegram te lezen, en pas daarna te bewerken. Zou je dat eventueel ergens kunnen posten?
Doordat ik afgelopen weken naar het buitenland moest voor mijn werk was ik er nog niet aan toe gekomen om de ethernet code erin te verwerken. Wellicht kun je dit zelf of op basis van het voorbeeld van ThinkPad.
Ik heb een TM1638 7-segment display aan hangen waarop ik wat waardes kan zien, zoals het actuele verbruik, of hoeveel er verbruikt is op die dag. Als je het naar een website upload is het waarschijnlijk wat overbodig maar als je snel in de meterkast wilt kijken hoe het er voor staat is het handig. Ziet er ongeveer zo uit:

Je hebt de TM1638 library nodig, of je moet de code eruit halen als je toch geen TM1638 module gaat gebruiken. Tevens is het verstandig op de Serial.print() weg te halen als je klaar bent met debuggen.
De gegevens worden na iedere telegram (iedere 10 seconde) via HTTP verstuurd. Een php script schrijft dit vervolgens weg naar de database
Hier volgt de code:
Arduino Sketch:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
| /* Arduino 'slimme meter' P1-port reader. This sketch reads data from a Dutch smart meter that is equipped with a P1-port. Connect 'RTS' from meter to Arduino pin 5V Connect 'GND' from meter to Arduino GND Connect 'RxD' from meter to Arduino pin 8 (RX) Baudrate 115200, 8N1. A BS170 transistor & 10k resistor, or an 7404 IC inverter is needed to make data readable if meter spits out inverted data see: http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/ for connection examples I used the 7404 IC inverter, this requires no resistors. The TM1638 7 segment display will have 8 "menu's". Switch between menu's using the buttons: Menu 1: Show currently use electricity in Watt Menu 2: Show used electricity today in Wh Menu 3: Show used gas today in liters Menu 4: Show seconds left for day counter Menu 5: Show total low Tariff in kWh Menu 6: Show total high Tariff in kWh Menu 7: Show total gas in m3 Menu 8: Show days running (uptime) If you do not have a TM1638 7 segment display you can disable the following methods in the loop(): - fillDayReport(); - buttonPress(); - displayMenu(); Modify the sendHTTPRequest() method to the required information to your needs. created by 'The_FrankO' @ Tweakers.net, march 2016 Inspired by the sketch created by 'ThinkPad' @ Tweakers.net, september 2014 \[TOPIC=1601301]Hulp bij slimme meter uitlezen met Arduino naar MySQL\[/TOPIC] */ // Required for Ethernet #include <Ethernet.h> // Required for Display Module #include <TM1638.h> // Required for non-hardware Serial // TODO: remove when using hardware Serial #include <AltSoftSerial.h> AltSoftSerial altSerial; // For Ethernet byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192, 168, 2, 177); // IP Address for Arduino IPAddress server(192, 168, 2, 7); // IP Address of server where to send data to EthernetClient client; // Initialize the library instance: // For the TM1638 Display const byte dataPin = 7; const byte clockPin = 6; const byte strobePin = 9; TM1638 module(dataPin, clockPin, strobePin); // Data object containing the last telegram readout of the SmartMeter struct Telegram { unsigned int telegramCount; // How many telegrams received String content; // The entire Telegram received from the Smart Meter unsigned long elecLowTariff; // Meter reading Electrics - consumption low tariff in Wh unsigned long elecHighTariff; // Meter reading Electrics - consumption high tariff in Wh unsigned int elecConsumption; // Meter reading Electrics - actual consumed in W unsigned long gasConsumption; // Meter reading Gas - consumed gas in liters String gasLastReadOut; // Last Gas meter reading boolean isElecHighTariff; // Meter reading Electrics - currently in low or high tariff boolean isNew; // Will reset to false after once read, turn to true after new telegram boolean isReady; // Will be set to true when entire telegram has been received boolean isNewToDisplay; // Will reset to true after a new telegram has been decoded. Will be set to false by display boolean isNewToSend; // Will reset to true after a new telegram has been decoded. Will be set to false by httprequest }; Telegram telegram; // Data object containg the report of the day, will reset after every day struct DayReport { unsigned int dayReportCount; // How many days unsigned long millisInDayLeft; // millis left in this day report unsigned long elecLowTariffBeginOfDay; // Meter reading Electrics - consumption low tariff in Wh unsigned long elecHighTariffBeginOfDay; // Meter reading Electrics - consumption high tariff in Wh unsigned long gasConsumptionBeginOfDay; // Meter reading Gas - consumed gas in liters }; DayReport dayReport; // For menu byte menu = 1; const unsigned long millisInDayTotal = 86400000; // total millis in one day unsigned long previousMillis = 0; void setup() { // Set day countdown dayReport.millisInDayLeft = millisInDayTotal; // Start Serial to connect P1 Smart Meter Serial.begin(9600); altSerial.begin(115200); // Disable the SD Card pinMode(4, OUTPUT); digitalWrite(4, HIGH); // Start the Ethernet connection delay(1000); Ethernet.begin(mac, ip); // Set brightness to lowest for the display module module.setupDisplay(true, 0); } void loop() { receiveTelegram(); decodeTelegram(); fillDayReport(); buttonPress(); displayMenu(); sendHTTPRequest(); } // Will fill the dayReport, if first day or new day will use data from the telegram void fillDayReport() { // No telegram received? no need to create the day report yet if (telegram.telegramCount == 0) { return; } unsigned long currentMillis = millis(); unsigned long progressedMillis = currentMillis - previousMillis; previousMillis = currentMillis; boolean isNewDay = dayReport.millisInDayLeft <= progressedMillis; if (dayReport.dayReportCount == 0 || isNewDay) { // first time here or new day?, take values from telegram dayReport.dayReportCount++; dayReport.millisInDayLeft = millisInDayTotal; dayReport.elecLowTariffBeginOfDay = telegram.elecLowTariff; dayReport.elecHighTariffBeginOfDay = telegram.elecHighTariff; //dayReport.elecLowTariffReturnBeginOfDay = telegram.elecLowTariffReturn; //dayReport.elecHighTariffReturnBeginOfDay = telegram.elecHighTariffReturn; dayReport.gasConsumptionBeginOfDay = telegram.gasConsumption; } else { dayReport.millisInDayLeft = dayReport.millisInDayLeft - progressedMillis; } } // Display the data, based on which menu void displayMenu() { // If no new data is to be displayed // And we are not looking at menu 4 (contains countdown) // TODO: staat uit omdat anders twee keer een waarde zetten op display niet goed gaat, blijft namelijk alleen de laatste over // if (!telegram.isNewToDisplay && menu != 4) { // // nothing to do here, so we are done // return; // } // Turn LED 8 on/off based on tariff module.setLED(telegram.isElecHighTariff, 7); switch (menu) { case 1: // Show currently use electricity in Watt module.setDisplayToString(F("Cur"), 0b00100000); module.setDisplayToDecNumber(telegram.elecConsumption, 0, false); break; case 2: // Show used electricity today in Wh module.setDisplayToString(F("tot"), 0b00101010); module.setDisplayToDecNumber(((telegram.elecLowTariff - dayReport.elecLowTariffBeginOfDay) + (telegram.elecHighTariff - dayReport.elecHighTariffBeginOfDay)), 0, false); // will show high and low together break; case 3: // Show used gas today in liters module.setDisplayToString(F("Gas")); module.setDisplayToDecNumber(telegram.gasConsumption - dayReport.gasConsumptionBeginOfDay, 0, false); break; case 4: // Show seconds left for day counter module.setDisplayToDecNumber(dayReport.millisInDayLeft / 1000, 0, false); break; case 5: // Show total low Tariff in kWh module.setDisplayToString(F("L")); module.setDisplayToDecNumber(telegram.elecLowTariff, 0b10001000, false); break; case 6: // Show total high Tariff in kWh module.setDisplayToString(F("H")); module.setDisplayToDecNumber(telegram.elecHighTariff, 0b10001000, false); break; case 7: // Show total gas in m3 module.setDisplayToString(F("G")); module.setDisplayToDecNumber(telegram.gasConsumption, 0b10001000, false); break; case 8: // Days running module.setDisplayToDecNumber(dayReport.dayReportCount, 0, false); break; } // Now we've send the data to the display, it no longer is new to us telegram.isNewToDisplay = false; } char previousChar; // Receive the entire telegram from the Smart Meter and store it in memory void receiveTelegram() { while (altSerial.available()) { char inChar = (char) altSerial.read(); if (inChar == '/') { telegram.isReady = false; telegram.isNew = true; telegram.content = ""; } // Add char to the Telegram String telegram.content += inChar; // Check to see if end of telegram if (inChar == '!' && previousChar == '\n') { telegram.isReady = true; // TODO: prints weggooien Serial.println(F("\n\nData received!\n\n\n")); Serial.println(telegram.content); } // Save the current char as previous char, will be used to better handle corrupt messages previousChar = inChar; } } // Decode the received telegram and extract the required information int telegramStringSearchPosition; void decodeTelegram() { // If telegram is not complete yet, or if no new telegram has been reported... if (!telegram.isReady || !telegram.isNew) { // ... we will not try to decode it return; } // Fill the telegram object telegramStringSearchPosition = 0; telegram.telegramCount++; telegram.elecLowTariff = retrieveValue(F("1-0:1.8.1"), 10, 1); telegram.elecHighTariff = retrieveValue(F("1-0:1.8.2"), 10, 1); telegram.isElecHighTariff = retrieveValue(F("0-0:96.14.0"), 1, 4) - 1; telegram.elecConsumption = retrieveValue(F("1-0:1.7.0"), 6, 1); telegram.gasLastReadOut = retrieveStringValue(F("0-1:24.2.1"), 13, 1); telegram.gasConsumption = retrieveValue(F("0-1:24.2.1"), 9, 16); // We have decoded this telegram, so no longer new to us telegram.isNew = false; // But it is new to the display telegram.isNewToDisplay = true; // Also it is new so we can send it telegram.isNewToSend = true; // Clear the content to save memory telegram.content = ""; } // Convert to long value, kWh will be in Wh and m3 will be in liters. long retrieveValue(String property, int valueLength, int valueOffset) { float value = retrieveStringValue(property, valueLength, valueOffset).toFloat(); return (long) (value * 1000.0); } String retrieveStringValue(String property, int valueLength, int valueOffset) { int propertyStartIndex = telegram.content.indexOf(property, telegramStringSearchPosition); // Only when found we will do something to search the value if (propertyStartIndex > 0) { // Set this position, we know for the next property where we can start telegramStringSearchPosition = propertyStartIndex; // Extract the actual value and return it int valueStartIndex = propertyStartIndex + property.length() + valueOffset; return telegram.content.substring(valueStartIndex, valueStartIndex + valueLength); } return ""; } void buttonPress() { byte keys = module.getButtons(); // If a button is pressed, switch of all LED first and clear the data if (keys > 0) { module.setLEDs(0x00); // turn of all LEDs module.clearDisplay(); // clear display } else { // If no button is pressed, we are done here return; } switch (keys) { case 0: break; case 1: menu = 1; break; case 2: menu = 2; break; case 4: menu = 3; break; case 8: menu = 4; break; case 16: menu = 5; break; case 32: menu = 6; break; case 64: menu = 7; break; case 128: menu = 8; break; default: break; } module.setLED(TM1638_COLOR_RED, menu - 1); // When the button is pressed, we have something new to display telegram.isNewToDisplay = true; } // Will make HTTP Connection to the server and will send the data void sendHTTPRequest() { // Only send if telegram is new to us if (!telegram.isNewToSend) { // nothing to do here, so we are done return; } // Close any connection before send a new request. client.stop(); // If there is a successful connection: if (client.connect(server, 80)) { Serial.println(F("connecting...")); // send the HTTP GET request: client.print(F("GET /P1Reading.php?telegramCount=")); client.print(telegram.telegramCount); client.print(F("&elecLowTariff=")); client.print(telegram.elecLowTariff); client.print(F("&elecHighTariff=")); client.print(telegram.elecHighTariff); client.print(F("&elecConsumption=")); client.print(telegram.elecConsumption); client.print(F("&isElecHighTariff=")); client.print(telegram.isElecHighTariff); client.print(F("&gasConsumption=")); client.print(telegram.gasConsumption); client.print(F("&gasLastReadOut=")); client.print(telegram.gasLastReadOut); client.println(F(" HTTP/1.1")); client.println(F("Host: 192.168.2.4")); client.println(F("User-Agent: arduino-ethernet")); client.println(F("Connection: close")); client.println(); } else { // if you couldn't make a connection: Serial.println(F("connection failed")); } // We've send it now, no need to send this again telegram.isNewToSend = false; } |
TODOs:
- Hardware Serial gebruiken ipv AltSerial, aantal foute waardes moet daarmee verminderen
- CRC16 validatie op het telegram
- In php beter bepaling of het bericht fout is
- Retour levering meegeven
[ Voor 7% gewijzigd door The_FrankO op 27-03-2016 15:37 ]
Vandaag het Ethernet deel afgerond. Tijdens het testen liep ik al snel tegen de beperking van het beperkte werkgeheugen van de Arduino aan. Ik heb daarom de code iets aangepast, het was redelijk eenvoudig door alle constante string waardes binnen F() te plaatsen.
De orginele post heb ik aangepast met de nieuwe sketch. Overigens is met hardware serial nog het proberen waard, komt toch vaak voor dat het bericht niet juist is ontvangen. Met hardware serial heb je een buffer wat dit probleem zou moeten verhelpen.
Hier volgen het database script en het php deel.
Database:
P1Reading.php:
De orginele post heb ik aangepast met de nieuwe sketch. Overigens is met hardware serial nog het proberen waard, komt toch vaak voor dat het bericht niet juist is ontvangen. Met hardware serial heb je een buffer wat dit probleem zou moeten verhelpen.
Hier volgen het database script en het php deel.
Database:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| -- Log table CREATE TABLE `log` ( `id` mediumint(11) unsigned NOT NULL AUTO_INCREMENT, `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `level` varchar(45) NOT NULL, `actor` varchar(45) NOT NULL, `message` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- Reading table CREATE TABLE `reading` ( `id` mediumint(11) unsigned NOT NULL AUTO_INCREMENT, `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `telegramCount` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- Electricity table CREATE TABLE `electricity` ( `id` mediumint(11) unsigned NOT NULL AUTO_INCREMENT, `readingId` mediumint(11) unsigned NOT NULL, `lowTariff` int(11) NOT NULL, `highTariff` int(11) NOT NULL, `consumption` int(11) NOT NULL, `isHighTariff` tinyint(1) NOT NULL, PRIMARY KEY (`id`), KEY `FK_Reading_idx` (`readingId`), CONSTRAINT `FK_Reading_Electricity` FOREIGN KEY (`readingId`) REFERENCES `reading` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; -- Gas table CREATE TABLE `gas` ( `id` mediumint(11) unsigned NOT NULL AUTO_INCREMENT, `readingId` mediumint(11) unsigned NOT NULL, `gas` int(11) NOT NULL, `gasLastReadOut` varchar(45) NOT NULL, PRIMARY KEY (`id`), KEY `FK_Reading_idx` (`readingId`), CONSTRAINT `FK_Reading_Gas` FOREIGN KEY (`readingId`) REFERENCES `reading` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; |
P1Reading.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
| <?php error_reporting(E_ALL); ini_set('display_errors', 1); define('USER', 'p1logger'); define('PASS', 'p1logger'); // Database connection $connection = new PDO('mysql:host=localhost;dbname=energie;charset=utf8', USER, PASS); // Retrieve send information from GET variables $telegramCount = $_GET["telegramCount"]; $elecLowTariff = $_GET["elecLowTariff"]; $elecHighTariff = $_GET["elecHighTariff"]; $elecConsumption = $_GET["elecConsumption"]; $isElecHighTariff = $_GET["isElecHighTariff"]; $gasConsumption = $_GET["gasConsumption"]; $gasLastReadOut = $_GET["gasLastReadOut"]; // Set proper data types settype($telegramCount, "integer"); settype($elecLowTariff, "integer"); settype($elecHighTariff, "integer"); settype($elecConsumption, "integer"); settype($isElecHighTariff, "integer"); settype($gasConsumption, "integer"); settype($gasLastReadOut, "string"); // Retrieve the last reading from the database $lastTelegramCount = $connection->query('SELECT telegramCount FROM reading ORDER BY id DESC LIMIT 1')->fetchColumn(); // Check if we missed readings if ($lastTelegramCount > $telegramCount) { // Probably the device has reset, unable to determine how many readings we've missed // Log under WARN we are unable to determine if we missed readings $statement = $connection->prepare('INSERT INTO log (level, actor, message) VALUES (?, ?, ?)'); $statement->execute(["WARN", "P1Reading", "Unable to determine if we missed readings, probably Arduino reset or overflow"]); } else if ($telegramCount - $lastTelegramCount > 1) { // We've missed a few readings // Log under WARN we missed a few readings $statement = $connection->prepare('INSERT INTO log (level, actor, message) VALUES (?, ?, ?)'); $statement->execute(["WARN", "P1Reading", "Missed a total of " . ($telegramCount - $lastTelegramCount) . " readings"]); } // Create a new Reading record in the database $statement = $connection->prepare('INSERT INTO reading (telegramCount) VALUES (?)'); $statement->execute([$telegramCount]); $readingId = $connection->lastInsertId(); // Retrieve the last gas reading from the database $lastGasLastReadOut = $connection->query('SELECT gasLastReadOut FROM gas ORDER BY id DESC LIMIT 1')->fetchColumn(); // Check if it is a new gas reading if ($gasLastReadOut != $lastGasLastReadOut) { // Not the same so a new gas reading should be inserted in the database $statement = $connection->prepare('INSERT INTO gas (readingId, gas, gasLastReadOut) VALUES (?, ?, ?)'); $statement->execute([$readingId, $gasConsumption, $gasLastReadOut]); } // Create a new electric reading record in the database $statement = $connection->prepare('INSERT INTO electricity (readingId, lowTariff, highTariff, consumption, isHighTariff) VALUES (?, ?, ?, ?, ?)'); $statement->execute([$readingId, $elecLowTariff, $elecHighTariff, $elecConsumption, $isElecHighTariff]); echo "DONE"; ?> |
Mede door dit topic heb ik de afgelopen weken tijd gestopt in een eigen oplossing voor mijn meter. Ik heb de minimale implementatie gedaan:
- de arduino telt de IR-pulsen van de meter (geen P1 poort)
- de arduino meet de tijd tussen de pulsen en berekent het actuele electraverbruik
- de arduino stuurt via een nRF module de data naar mijn sensor netwerk (diy)
Het schema voor de pulse sensor is echt te simpel voor woorden: een photodiode met een pullup naar 5v.

- de arduino telt de IR-pulsen van de meter (geen P1 poort)
- de arduino meet de tijd tussen de pulsen en berekent het actuele electraverbruik
- de arduino stuurt via een nRF module de data naar mijn sensor netwerk (diy)
Het schema voor de pulse sensor is echt te simpel voor woorden: een photodiode met een pullup naar 5v.


| Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72
Hallo
Ik ben ook bezig met de P1 uit te lezen, en gebruik de code van solarmeter. De waardes stuur ik naar pvoutput. Maar het vreemde is, dat er af en toe een foutieve waarde opgestuurd wordt. Deze waarde "Power Used (W), is soms extreem hoog of soms wel eens 0. Lijkt wel of de telegram niet goed ingelezen is
Ook krijg ik af en toe code 144 van PVoutput terug , blijkbaar heb ik een negatieve"Energy Used (Wh)" waarde opgestuurd ?
Ik schrijf deze waardes ook naar SD, (arduino mega) . In de code hierboven wordt de SD disabled zoverre ik begrijp . Heeft iemand ervaring met deze problemen ?
Ik ben ook bezig met de P1 uit te lezen, en gebruik de code van solarmeter. De waardes stuur ik naar pvoutput. Maar het vreemde is, dat er af en toe een foutieve waarde opgestuurd wordt. Deze waarde "Power Used (W), is soms extreem hoog of soms wel eens 0. Lijkt wel of de telegram niet goed ingelezen is
Ook krijg ik af en toe code 144 van PVoutput terug , blijkbaar heb ik een negatieve"Energy Used (Wh)" waarde opgestuurd ?
Ik schrijf deze waardes ook naar SD, (arduino mega) . In de code hierboven wordt de SD disabled zoverre ik begrijp . Heeft iemand ervaring met deze problemen ?