Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
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:
  • 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.
Maar goed, voordat de boel ging werken moest ik uiteraard eerst een kabel fabriceren die van de P1-poort naar de Arduino leidt. Daarvoor had ik bij Ali voor een paar euro ook een 74LS04-chip gekocht die het probleem van de inverted berichten op zou moeten lossen. Ik heb toen een oude telefoonkabel die ik nog in mijn kabel-verzameling had liggen doorgeknipt, en verbonden met de 74LS04 en Arduino volgens onderstaand schema. De 5V en GND-pinnen zijn volgens mij ook als zodanig aangegeven op de Mega zelf, voor de Digital 0 heb ik volgens mij pin 48 gebruikt als ik mijn documentatie nog op orde heb.



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();
  }
}

Kroesss wijzigde deze reactie 10-11-2019 16:01 (59%)


  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
@ThinkPad De mysql op een usb-stick is inderdaad een optie waar ik nog niet aan had gedacht! Dat is zeker een beetje googlen waard!

@Bezuiniger De meter geeft standaard iedere 10 seconden de stand af op de P1-poort. Per uur kom je dan dus op 360 metingen, en ik weet niet hoeveel er in het geheugen van de NAS passen. Ik zou ook niet standaard ieder uur de HDD's uit hibernation willen halen, want volgens mij blijven ze dan 20 minuten actief, en dan heb je dus alsnog 33% van de tijd alles op volle bak draaien. In combinatie met de USB kan het inderdaad wel interessant zijn.

Ik blijf uiteraard openstaan voor tips en tricks!

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
quote:
Bezuiniger schreef op zondag 26 januari 2014 @ 09:03:
[...]

De 212J heeft 256MB geheugen, dus daar kun je wel wat in kwijt. Uiteindelijk zijn het per meting maar 6 getallen die nuttig zijn dus daar kun je er heus wel wat van in het geheugen houden.
En dat je 6x per minuut data binnenkrijgt wil niet zeggen dat je die ook perse moet opslaan. Zelf sla ik per minuut een meting op, dat geeft op de lange termijn ook genoeg resolutie.
Ik ben het er mee eens dat eens per minuut opslaan genoeg is. Gebruik jij ook toevalig een Synology voor het uitlezen dan? Als dat zo is,kun je me dan voort helpen met het instellen? Ik vind namelijk overal verwijzingen naar python-scripts, maar ik vind eigen nergens de scripts zelf die gebruikt worden.

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
Op zich heb je gelijk, maar ik zie het ook als een gedeelte van de hobby om het zo zuinig mogelijk te krijgen :)

Zijn er anderen met ideeen?

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
Intussen heb ik me er iets dieper in ingelezen, en hoewel het kan lijkt het niet ideaal om een NAS hiervoor te gebruiken. Iedereen die het doet komt er ook na korte tijd op terug als ik het allemaal zo lees.

Ik heb dus besloten om het met een Arduino te gaan doen. Ik heb de hardware reeds besteld, maar kwam ergens nog een opmerking tegen die mij aan het denken zette. Ik las ergens dat op de request-pin van de P1-poort max 30mA (5V) gezet mag worden, en dat een Arduino 5V op 40mA afgeeft. Ik kan echter verder netgens hier iets over vinden, dus ik twijfel of dit klopt. Heeft iemand hier ervaring mee? De grens van 30mA zou volgen uit de technische specificatie van de P1-poort, maar ik haal het er zelf niet uit, hoofdzakelijk omdat ik totaal niet thuis ben in technische documentatie :)

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
Okee, dus het is wel belangrijk om met een weerstandje het amperage op de request pin te beperken tot max 30mA. Vreemd dat er dan verder niemand het hierover heeft bij alle opstellingen die je tegenkomt. Er is een boel informatie over manieren om het signaal te inverten, maar die las ik toevallig in een comment-regel in een of ander stukje code...

In ieder geval bedankt rooot!

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
Jazsie schreef op vrijdag 18 oktober 2019 @ 11:59:
Een overzicht zou inderdaad wel veel mensen opweg helpen die hier pas aan beginnen.
Misschien wordt het tijd om de openingspost te updaten @Kroesss?
Hahaha, ik wist niet dat deze post nog steeds leefde. Ik zal binnenkort eens kijken wat ik er van kan maken. Ik heb nu al een paar jaar (sinds eind 2015) een Arduino draaien op mijn slimme meter. Het wordt dus voor mij ook wel even weer wat informatie bij elkaar zoeken, maar dat komt goed. Ik kan me nog wel herinneren dat het lastig was om de benodigde informatie te vinden bij elkaar. Er zijn overal wel gedeeltes beschikbaar, maar nergens een totaal-overzicht (nou moet ik ook zeggen dat mijn opstelling niet helemaal standaard is door bepaalde eisen/ideeën die ik hier zelf achter heb zitten). Een Arduino kan een en ander echter prima aan, dat staat voor mij wel als een paal boven water.

Ik zal een dezer dagen eens een overzicht opstellen, en deze inderdaad in de openingspost bijvoegen.

  • Kroesss
  • Registratie: februari 2005
  • Laatst online: 20-12-2019
Jazsie schreef op vrijdag 18 oktober 2019 @ 11:59:
Een overzicht zou inderdaad wel veel mensen opweg helpen die hier pas aan beginnen.
Misschien wordt het tijd om de openingspost te updaten @Kroesss?
Ik heb mijn openingspost aangepast. Ik hoop dat dit sommigen verder kan helpen!
Pagina: 1


Apple iPhone 11 Microsoft Xbox Series X LG OLED C9 Google Pixel 4 CES 2020 Samsung Galaxy S20 Sony PlayStation 5 Nintendo Switch Lite

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2020 Hosting door True