Hallo allemaal,
Ik ben momenteel veel aan het lezen over mogelijkheden over het zelf uitlezen van mijn slimme meter met behulp van de P1-poort. Er is een heleboel info op dit forum, maar ook op andere sites en fora te vinden, en in al die informatie vind ik ook veel mogelijkheden. Ik ben benieuwd welke van deze mogelijkheden voor mij het beste zou zijn, en daarvoor ben ik dan ook op zoek naar jullie mening (en eventueel tips).
Ik heb een Kamstrup slimme meter, waar ook mijn gasmeter aan gekoppeld is. Ik heb geen zonnepanelen (misschien in de toekomst, maar dat zien we dan wel weer). Dat ik de P1 uit wil lezen is voor een (groot) deel uit hobby. Ik ben dus ook niet op zoek naar een kant-en-klare oplossing waarbij ik voor een paar tientjes meer alles plug-en-play klaar heb, daar heb ik geen lol aan
Mijn eerste ingeving was om een USB->TTL kabel met een FTDI-chip te voorzien van een RJ11-stekkertje en deze aan mijn Synology DS212j te hangen welke ook in de meterkast staat. Ik zou dan voor nog geen 10 euro klaar zijn. Bij het zoeken op informatie hierover kwam ik erachter dat iedereen die dit doet de data opslaat in een database op de NAS zelf, maar dat betekent volgens mij dat de HDD's volcontinue aan het draaien zullen zijn, en dat is gezien het stroomverbruik niet mijn bedoeling. Ik heb (nog) niet gevonden hoe ik in Python de informatie naar een URL kan sturen zodat ik het vanaf daar met PHP verder kan verwerken (ik ben goed bekend met PHP/MySQL en HTML/CSS/Javascript, maar niet direct met Python of een andere programmeertaal).
Tijdens mijn zoektocht ben ik ook vaak oplossingen met Raspberry's, Arduino's en Netduino's tegengekomen. Het probleem met zo'n zoektocht is dat je van alles wat tegenkomt, en op een gegeven moment de bomen niet meer door het bos ziet. Ik ben zoals gezegd niet bekend met deze printplaten, maar ik ga een uitdaging niet uit de weg.
Wie kan me helpen met advies over welk apparaat ik zou moeten proberen? Ik ben dus op zoek naar een manier waarbij ik op een goedkope manier (niet alleen in de aanschaf, maar ook in stroomverbruik) mijn meterstanden kan uitlezen, opslaan en bekijken. Gezien het kostenaspect denk ik dat een raspberry geen optie is, en een netduino lijkt ook minder aantrekkelijk qua prijs. een Arduino uno met ethernet-shield kost echter maar een euro of 15, maar of ik daarmee kan wat ik wil en wat het stroomverbruik hiervan is weet ik niet.
Ik kreeg onlangs het verzoek om mijn startpost aan te vullen met info hoe ik een en ander nu heb draaien, dus bij deze!
Mijn oplossing loopt via een Arduino Mega. Een Uno had als het goed is ook gekund, maar een Mega heeft meer geheugen en toen ik het kocht was het prijsverschil minimaal, dus waarom niet. Ik heb het via Ali gekocht, totale kosten voor de Mega, ethernet-shield en 1A stroomadapter was net geen 22 euro.
Toen dat allemaal binnen was ben ik begonnen met het script voor op de Mega. Ik heb denk ik enkele tientallen voorbeelden bekeken omdat ik dus totaal nog niet bekend was met de taal van Arduino. Enkele andere talen ken ik echter wel, dus door voorbeelden door te nemen lukt het op een gegeven moment wel om een beetje door te hebben wat er moet gebeuren, en met behulp van kopiëren/plakken uit de bekeken voorbeelden een eigen script op te bouwen.
Ik heb hierbij wel enkele keuzes gemaakt die voor mij werken, maar wellicht niet altijd voor iedereen:

Ik heb nu het volgende script draaien. Hierin is ongetwijfeld heel veel te verbeteren. Zo is de manier van doorsturen verre van geavanceerd, maar het is dan ook een hobby-projectje. De verwerking van de data aan de PHP-kant is denk ik voor velen niet heel interessant omdat de meesten de data door zullen sturen naar mindergas of iets soortgelijks. Mocht er echter behoefte aan zijn dan kan ik het uiteraard wel plaatsen, laat dan even een berichtje achter
Ik ben momenteel veel aan het lezen over mogelijkheden over het zelf uitlezen van mijn slimme meter met behulp van de P1-poort. Er is een heleboel info op dit forum, maar ook op andere sites en fora te vinden, en in al die informatie vind ik ook veel mogelijkheden. Ik ben benieuwd welke van deze mogelijkheden voor mij het beste zou zijn, en daarvoor ben ik dan ook op zoek naar jullie mening (en eventueel tips).
Ik heb een Kamstrup slimme meter, waar ook mijn gasmeter aan gekoppeld is. Ik heb geen zonnepanelen (misschien in de toekomst, maar dat zien we dan wel weer). Dat ik de P1 uit wil lezen is voor een (groot) deel uit hobby. Ik ben dus ook niet op zoek naar een kant-en-klare oplossing waarbij ik voor een paar tientjes meer alles plug-en-play klaar heb, daar heb ik geen lol aan
Mijn eerste ingeving was om een USB->TTL kabel met een FTDI-chip te voorzien van een RJ11-stekkertje en deze aan mijn Synology DS212j te hangen welke ook in de meterkast staat. Ik zou dan voor nog geen 10 euro klaar zijn. Bij het zoeken op informatie hierover kwam ik erachter dat iedereen die dit doet de data opslaat in een database op de NAS zelf, maar dat betekent volgens mij dat de HDD's volcontinue aan het draaien zullen zijn, en dat is gezien het stroomverbruik niet mijn bedoeling. Ik heb (nog) niet gevonden hoe ik in Python de informatie naar een URL kan sturen zodat ik het vanaf daar met PHP verder kan verwerken (ik ben goed bekend met PHP/MySQL en HTML/CSS/Javascript, maar niet direct met Python of een andere programmeertaal).
Tijdens mijn zoektocht ben ik ook vaak oplossingen met Raspberry's, Arduino's en Netduino's tegengekomen. Het probleem met zo'n zoektocht is dat je van alles wat tegenkomt, en op een gegeven moment de bomen niet meer door het bos ziet. Ik ben zoals gezegd niet bekend met deze printplaten, maar ik ga een uitdaging niet uit de weg.
Wie kan me helpen met advies over welk apparaat ik zou moeten proberen? Ik ben dus op zoek naar een manier waarbij ik op een goedkope manier (niet alleen in de aanschaf, maar ook in stroomverbruik) mijn meterstanden kan uitlezen, opslaan en bekijken. Gezien het kostenaspect denk ik dat een raspberry geen optie is, en een netduino lijkt ook minder aantrekkelijk qua prijs. een Arduino uno met ethernet-shield kost echter maar een euro of 15, maar of ik daarmee kan wat ik wil en wat het stroomverbruik hiervan is weet ik niet.
Ik kreeg onlangs het verzoek om mijn startpost aan te vullen met info hoe ik een en ander nu heb draaien, dus bij deze!
Mijn oplossing loopt via een Arduino Mega. Een Uno had als het goed is ook gekund, maar een Mega heeft meer geheugen en toen ik het kocht was het prijsverschil minimaal, dus waarom niet. Ik heb het via Ali gekocht, totale kosten voor de Mega, ethernet-shield en 1A stroomadapter was net geen 22 euro.
Toen dat allemaal binnen was ben ik begonnen met het script voor op de Mega. Ik heb denk ik enkele tientallen voorbeelden bekeken omdat ik dus totaal nog niet bekend was met de taal van Arduino. Enkele andere talen ken ik echter wel, dus door voorbeelden door te nemen lukt het op een gegeven moment wel om een beetje door te hebben wat er moet gebeuren, en met behulp van kopiëren/plakken uit de bekeken voorbeelden een eigen script op te bouwen.
Ik heb hierbij wel enkele keuzes gemaakt die voor mij werken, maar wellicht niet altijd voor iedereen:
- Waar sla je de gegevens op? Ik wilde geen gebruik maken van een dienst buiten mijn eigen control. Er zijn best veel diensten die je data graag voor je willen opslaan, maar dat voelde voor mij niet goed. Ik programmeer zelf in PHP, dus de logische optie voor mij was om het op te slaan in een database op mijn eigen domeinnaam.
- Hoe vaak wil je de gegevens opslaan? De P1-poort geeft iedere 10 seconden een nieuwe stand. Dat vond ik zelf wat fanatiek, vooral omdat ik het dus op een server ging opslaan. Ik heb er voor gekozen om in mijn script 1 bericht per minuut uit te lezen, en de andere 5 gewoon helemaal over te slaan. Dat scheelt uiteraard al 80% van de omvang van de database, terwijl ik nu nog steeds per minuut de data kan inzien wat voor mij meer dan voldoende is. Daarnaast verzamel ik in de Arduino eerst 5 berichten voordat ik het naar de server stuur. Dat scheelt weer een heleboel calls.

Ik heb nu het volgende script draaien. Hierin is ongetwijfeld heel veel te verbeteren. Zo is de manier van doorsturen verre van geavanceerd, maar het is dan ook een hobby-projectje. De verwerking van de data aan de PHP-kant is denk ik voor velen niet heel interessant omdat de meesten de data door zullen sturen naar mindergas of iets soortgelijks. Mocht er echter behoefte aan zijn dan kan ik het uiteraard wel plaatsen, laat dan even een berichtje achter
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
| #include <AltSoftSerial.h> #include <SPI.h> #include <Ethernet.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192,168,0,25); // IP-adres van Arduino Mega char server[] = "www.mijn-domeinnaam.nl"; // Domeinnaam EthernetClient client; AltSoftSerial altSerial; char c; String inputString; int interpret = 0; int pos181; int pos182; int pos281; int pos282; int pos170; int pos270; int pos9614; int pos2430; int pos2440; String T181; String T182; String T281; String T282; String T170; String T270; String T9614; String T2430; String T2440; String single; String querystr = ""; int minutecounter = 1; int sendcounter = 1; void setup() { Serial.begin(9600); altSerial.begin(9600); Ethernet.begin(mac, ip); delay(1000); } void loop() { while (altSerial.available() > 0) { c = altSerial.read(); c &= ~(1 << 7); char inChar = (char)c; //Serial.print(inChar); inputString += c; if(c == '!'){ interpret = 1; } } if (interpret == 1) { if (minutecounter == 6) { pos181 = inputString.indexOf("1-0:1.8.1", 0); T181 = inputString.substring(pos181 + 10, pos181 + 15) + inputString.substring(pos181 + 16, pos181 + 19); // Serial.println("T181 = " + T181); pos182 = inputString.indexOf("1-0:1.8.2", 0); T182 = inputString.substring(pos182 + 10, pos182 + 15) + inputString.substring(pos182 + 16, pos182 + 19); // Serial.println("T182 = " + T182); pos281 = inputString.indexOf("1-0:2.8.1", 0); T281 = inputString.substring(pos281 + 10, pos281 + 15) + inputString.substring(pos281 + 16, pos281 + 19); // Serial.println("T281 = " + T281); pos282 = inputString.indexOf("1-0:2.8.2", 0); T282 = inputString.substring(pos282 + 10, pos282 + 15) + inputString.substring(pos282 + 16, pos282 + 19); // Serial.println("T282 = " + T282); pos170 = inputString.indexOf("1-0:1.7.0", 0); T170 = inputString.substring(pos170 + 10, pos170 + 14) + inputString.substring(pos170 + 15, pos170 + 17); // Serial.println("T170 = " + T170); pos270 = inputString.indexOf("1-0:2.7.0", 0); T270 = inputString.substring(pos270 + 10, pos270 + 14) + inputString.substring(pos270 + 15, pos270 + 17); // Serial.println("T270 = " + T270); pos9614 = inputString.indexOf("0-0:96.14.0", 0); T9614 = inputString.substring(pos9614 + 15, pos9614 + 16); // Serial.println("T9614 = " + T9614); pos2430 = inputString.indexOf("0-1:24.3.0", 0); T2430 = inputString.substring(pos2430 + 11, pos2430 + 23); // Serial.println("T2430 = " + T2430); pos2440 = inputString.indexOf("(m3)", 0); T2440 = inputString.substring(pos2440 + 7, pos2440 + 12) + inputString.substring(pos2440 +13, pos2440 + 16); // Serial.println("T2440 = " + T2440); single = "-" + String(sendcounter) + "_" + T181 + "_" + T182 + "_" + T281 + "_" + T282 + "_" + T9614 + "_" + T170 + "_" + T270 + "_" + T2430 + "_" + T2440; Serial.println("single = " + single); querystr += single; // Serial.println("single = " + querystr); sendcounter++; if(sendcounter > 5){ httpRequest(); sendcounter = 1; querystr = ""; delay(1000); client.stop(); } minutecounter = 1; } else { minutecounter++; } inputString = "0"; interpret = 0; } } void httpRequest() { // if there's a successful connection: if (client.connect(server, 80)) { Serial.println("connected"); Serial.println(String(sendcounter - 1) + querystr); client.println("GET /p1Save.php?q=" + String(sendcounter - 1) + querystr + " HTTP/1.1"); client.println("Host: www.mijn-domeinnaam.nl"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); Serial.println("upload done"); } else { client.stop(); } } |
[ Voor 59% gewijzigd door Kroesss op 10-11-2019 16:01 ]