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: 02-12 14:16
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%)


Acties:
  • 0Henk 'm!
  • Pinned

  • MoiZie
  • Registratie: februari 2004
  • Laatst online: 04-12 14:58
Dank voor je reactie; ik heb geprobeerd dit te volgen, die spraken over BS170:
http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/

De 5V komt van een paar verschillende websites die allemaal claimen de heilige graal gevonden te hebben :P Deze zeiden dat het soms wel werkt met 5V ipv 3.3 volt, ook omdat je het spul zelf kan voeden dmv de 5v draad output van de P1 poort zelf

De datapoort van de raspberry is idd een rx pin op de seriele receiver van de gpio, of die op de ESP unit nodemcu.
Pagina: 1


Apple iPhone 11 Nintendo Switch Lite LG OLED C9 Google Pixel 4 FIFA 20 Samsung Galaxy S10 Sony PlayStation 5 Smartphones

'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 - 2019 Hosting door True