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
Toon posts:

Hulp bij slimme meter uitlezen met Arduino naar MySQL

Pagina: 1 2 Laatste
Acties:

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Ik denk dat ik voorzichtig (en misschien te voorbarig) de conclusie kan trekken dat het gebruiken van de hardware serial (pin 0, RX) de oplossing is om niet kloppende waarden tegen te gaan. Gisteravond rond 21:00 de aanpassing van AltSoftSerial (pin 8 ) naar hardware serial (pin 0) gedaan, en tot nu toe nog niet één verkeerde waarde doorgekregen _O_

Ik vermoed dat het komt omdat de hardware serial een UART is, die is voorzien van een hardware buffer. Daardoor hoeft de Arduino zich daar niet mee bezig te houden en verloopt het nu vlekkeloos

Ik dacht eerst dat je de hardware serial niet kon gebruiken als je de Arduino via USB voedt, maar dat zou volgens een bron op internet geen invloed moeten hebben. En dat klopt inderdaad. Ik voed de Arduino nu via USB, maar lees wel een serial device uit via pin 0 (RX), waar ook de FTDI chip van de USB/Serial aan hangt.

* ThinkPad happy *O*

ThinkPad wijzigde deze reactie 18-09-2014 17:55 (21%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
De hardware serial is alleen aan de USB gekoppeld tijdens het uploaden van een sketch. Door de juiste pulsen te geven na een reset neemt herkent de bootloader dat er geupload wordt en neemt hij de controle van de UART op zich. Daarna is de serial wel weer vrij. Let wel op dat je geen Serial.println meer gebruikt want die gaan gewoon over de hardware serial, omdat 'ie denkt dat daar een USB aan hangt.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Klopt, ik heb alle Serial.print eruit gesloopt :)
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
/* 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 5
 Connect 'GND' from meter to Arduino GND
 Connect 'RxD' from meter to Arduino pin 0 (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
 
 http://gathering.tweakers.net/forum/list_messages/1601301
 */

#include <AltSoftSerial.h>
#include <SPI.h>
#include <Ethernet.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

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31};
IPAddress ip(192,168,4,7);
IPAddress server(192,168,4,4);
EthernetClient client;

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
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(115200);
  delay(1000);
  Ethernet.begin(mac, ip);
  delay(1000);
  pinMode(4, OUTPUT);                  // SD select pin
  digitalWrite(4, HIGH);               // Explicitly disable SD

  //Set RTS pin high, so smart meter will start sending telegrams
  pinMode(requestPin, OUTPUT);
  digitalWrite(requestPin, HIGH);
}

void loop() {

  decodeTelegram();

  if(millis() - lastTime > interval) {
    lastTime = millis();   
    //send data to PHP/MySQL
    httpRequest();
    //Reset variables to zero for next run
    mEVLT = 0;
    mEVHT = 0;
    mEAV = 0;
    mG = 0;
    //Stop Ethernet
    client.stop();
  }
} //Einde loop

void decodeTelegram() {
  long tl = 0;
  long tld =0;

  if (Serial.available()) {
    input = Serial.read();
    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;
      }

      // 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;
      }

      // 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;
      }

      // 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; 
        }
      }

      // Empty buffer again (whole array)
      for (int i=0; i<75; i++)
      { 
        buffer[i] = 0;
      }
      bufpos = 0;
    }
  } //Einde 'if AltSerial.available'
} //Einde 'decodeTelegram()' functie

void httpRequest() {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    client.print("GET /www/slimmemeter/p1.php?mEVLT=");
    client.print(mEVLT);
    client.print("&mEVHT=");
    client.print(mEVHT);
    client.print("&mEAV=");
    client.print(mEAV);
    client.print("&mG=");
    client.print(mG);
    client.println(" HTTP/1.1");
    client.println("Host: 192.168.4.4");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    //Request complete; empty recieve buffer
    while (client.available()) { //data available
      char c = client.read(); //gets byte from ethernet buffer
    }
    client.println();
  } 
  else {
    client.stop();
  }
}

ThinkPad wijzigde deze reactie 18-09-2014 19:33 (3%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Philippas
  • Registratie: september 2014
  • Laatst online: 05-11-2014
Hallo,

Ik ben een tweedejaars elektro student en heb als project gekregen om een systeem te bedenken ipv met energiemanagement. Ik heb beginners ervaring met programmeren en volg dit topic al een aantal dagen om kennis op te doen. Ik ben alleen niet van plan om echt een slimme meter aan te schaffen, maar te simuleren/testen op de manier hoe jij het hebt gedaan (via de arduino nano).

Echter is mijn vraag via welke aansluitingen je de Arduino en de nano hebt verbonden?

Ook zie ik dat je bepaalde headerfiles include in je programma, heb je daar ook nog de code pagina's van op het moment dat je nog aan het testen was via de nano?

Ik ben niet van de copy/paste, maar heb de interesse om me hierin te verdiepen en zelf toe te passen.

Ik zou het echt heel erg waarderen.

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Hoi,

De P1 dummy Arduino heb ik gemaakt met deze code: http://pastebin.com/rhfg0KWk
De AltSoftSerial library die ik gebruikte kun je hier vinden: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html bij de Duemilanove zat de AltSoftSerial RX pin op pin 8. Voor andere Arduino's moet je even zoeken op die pagina.

Maar hardware serial werkt dus stabieler, en is makkelijker, daar hoef je verder ook geen extra libraries voor te includen ;)

Mocht je verder nog vragen hebben dan gelieve via een DM of even een eigen topic starten.

En wat mijn grote vriend hieronder zegt ;)

ThinkPad wijzigde deze reactie 18-09-2014 19:57 (4%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
@Philippas, die header files zijn onderdeel van de Arduino toolkit, en eventuele nonstandard libs kun je gewoon vinden op de Arduino Playground. Daar is geen rocket science mee gemoeid.

Voordat je hieraan begint stel ik voor dat je gewoon eerste de Arduino tutorials doorloopt. Dat scheelt ons een hoop uitleggen en al je vragen als beginner worden daar prima uitgelegd. Kijk ook op het Arduino forum, er is zelfs een Nederlands topic (maar ik neem aan dat je als Electro student geen enkele moeite hebt met Engels.)

De bovenstaande code van Thinkpad heeft al een paar updates gehad en verschillende rondes aan bugfixes en 'grammar cop'-commentaar van robv (ik dus). Mijn complimentjes overigens aan Thinkpad voor de opmaak en het commentaar zoals het nu geworden is.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • Raven
  • Registratie: november 2004
  • Niet online

Raven

Marion Raven fan

quote:
RobV schreef op donderdag 18 september 2014 @ 19:09:
De hardware serial is alleen aan de USB gekoppeld tijdens het uploaden van een sketch. Door de juiste pulsen te geven na een reset neemt herkent de bootloader dat er geupload wordt en neemt hij de controle van de UART op zich. Daarna is de serial wel weer vrij. Let wel op dat je geen Serial.println meer gebruikt want die gaan gewoon over de hardware serial, omdat 'ie denkt dat daar een USB aan hangt.
Kun je die niet gebruiken dan? Ik dacht altijd dat je tijdens het uploaden van de sketch de tx en rx pinnen moest loskoppelen, maar dat die daarna gewoon met serial.println gebruikt kunnen worden.

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


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Still goin' strong zonder rare meetwaardes *O*

Ondertussen nog wat PHP scriptjes geschreven om o.a. dagtotaal weg te schrijven naar een tabel elke avond (cronjob om 23:59). Zelfde voor maandtotaal.

Die data toon ik vervolgens weer met wat mooie Highcharts staafgrafiekjes. En gasverbruik gaat ook iedere avond automatisch naar Mindergas.nl
Zal de code van de scriptjes vanavond even hier posten, zit nu op m'n werk.

* ThinkPad happy

Dingen waar ik ooit nog een keer naar wil kijken als ik tijd heb (nu niet ivm afstuderen):
  • Watchdog implementeren voor auto-reset bij rariteiten, zodat hij echt 24/7/365 kan loggen zonder aandacht eraan te schenken.
  • Code iets efficiënter maken, hij ontvangt nu nog 6x per minuut de verbruikswaardes, is niet nodig in principe. Dan is de Arduino meer idle, scheelt ook in stroomverbruik/warmte (die al zeer gering is bij Arduino)

ThinkPad wijzigde deze reactie 24-09-2014 11:12 (52%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • .SnifraM
  • Registratie: december 2012
  • Niet online
quote:
ThinkPad schreef op woensdag 24 september 2014 @ 11:01:
Still goin' strong zonder rare meetwaardes *O*

Ondertussen nog wat PHP scriptjes geschreven om o.a. dagtotaal weg te schrijven naar een tabel elke avond (cronjob om 23:59). Zelfde voor maandtotaal.

Die data toon ik vervolgens weer met wat mooie Highcharts staafgrafiekjes.
Zal de code van de scriptjes vanavond even hier posten, zit nu op m'n werk.

* ThinkPad happy
Thanks, die wil ik ook hebben :) _/-\o_

lol+lol=hihi


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Ja, want de bedoeling is minder verbruiken en niet méér

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • gekkie
  • Registratie: april 2000
  • Laatst online: 18:37
quote:
RobV schreef op woensdag 24 september 2014 @ 11:31:
Ja, want de bedoeling is minder verbruiken en niet méér
Kan ik beter 1 keer in het jaar minder de waterkoker, koffieperser of oven gebruiken :)
(ik gebruik alleen een arduino bluetoothshield zonder arduino, geen idee hoeveel watt dat eet eigenlijk)

Maar opzich wel grappig om te zien dat je op basis van het huidige verbruik inderdaad na verloop van tijd aardig kunt inschatten wat je op een bepaald moment gedaan hebt op basis van de spikes in de chart.

Net als in mijn matig geisoleerde huis de vakanties er qua gasgebruik aardig uitspringen in de S-curve.
quote:
ThinkPad schreef op woensdag 24 september 2014 @ 11:01:
Still goin' strong zonder rare meetwaardes *O*

* ThinkPad happy
Mooi dat het toch gelukt is en dat je het gevonden hebt als een hardware issue .. had je nog lang aan kunnen prutsen aan de software kant zonder effect :)

gekkie wijzigde deze reactie 24-09-2014 11:52 (50%)


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
jammer dan je PC wel altijd aan moet staan om de eaarden te loggen, en data versturen kost powerrr. Wellicht een ideetje om elke 30 minuten te flushen en tussendoor de waarden op iets als een SD kaartje te zetten als de webserver niet brnaderbaar is?

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Ik schrijf de data naar m'n NAS, die 24/7 draait (15W).
SD zou nog een optie kunnen zijn, maar volgens mij is dat niet stabiel. Lees iig veel problemen daarover.

Hierbij ook de scripts om de dagtotalen, maandtotalen te berekenen, en om staafgrafieken per dag van elke maand te tonen:

dagtotaal.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
<?php
error_reporting(E_ALL);

//Connect to database
$MyUsername = "p1logger";  // enter your username for mysql
$MyPassword = "p1logger";  // enter your password for mysql
$MyHostname = "localhost";      // this is usually "localhost" unless your database resides on a different server

$dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword);
$selected = mysql_select_db("p1",$dbh);

$query = mysql_query("SELECT (MAX(hoog_tarief)-MIN(hoog_tarief)) as e_hoog, (MAX(laag_tarief)-MIN(laag_tarief)) as e_laag, ((MAX(hoog_tarief)-MIN(hoog_tarief))+(MAX(laag_tarief)-MIN(laag_tarief))) as e_totaal, (MAX(gas)-MIN(gas)) as dagverbruik_g FROM p1.readings WHERE DATE(time) = CURRENT_DATE");
$row = mysql_fetch_array($query);
$e_hoog = $row[0]/1000;
$e_laag = $row[1]/1000;
$e_totaal = $row[2]/1000;
$dagverbruik_g = $row[3]/1000;
settype($e_hoog, "float");
settype($e_laag, "float");
settype($e_totaal, "float");
settype($dagverbruik_g, "float");

//Bereken totaal en schrijf weg naar 'dagtotalen' tabel
$SQL = "INSERT INTO p1.dagtotalen (id, time, e_hoog, e_laag, e_totaal, verbruik_g) VALUES (NULL, NULL, '".$e_hoog."', '".$e_laag."', '".$e_totaal."','".$dagverbruik_g."')"; 

//Voer bovenstaande query uit
mysql_query($SQL);

?>




maandtotaal.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
<?php
error_reporting(E_ALL);

//Connect to database
$MyUsername = "p1logger";  // enter your username for mysql
$MyPassword = "p1logger";  // enter your password for mysql
$MyHostname = "localhost";      // this is usually "localhost" unless your database resides on a different server

if ( date('j') == date('t') ) { //Date 'j' is current daynumber of month. Date 't' is amount of days in month, this equation ensures query is only ran at last day of month

$dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword);
$selected = mysql_select_db("p1",$dbh);

$query = mysql_query("SELECT ((MAX(laag_tarief)-MIN(laag_tarief))+(MAX(hoog_tarief)-MIN(hoog_tarief))) as e_totaal, (MAX(laag_tarief)-MIN(laag_tarief)) as e_laag, (MAX(hoog_tarief)-MIN(hoog_tarief)) as e_hoog, (MAX(gas)-MIN(gas)) as g_totaal FROM p1.readings WHERE YEAR(time) = YEAR(CURDATE()) AND MONTH(time) = MONTH(CURDATE())");
$row = mysql_fetch_array($query);
$maandtotaal_e_totaal = $row[0]/1000;
$maandtotaal_e_laag = $row[1]/1000;
$maandtotaal_e_hoog = $row[2]/1000;
$maandtotaal_g = $row[3]/1000;
settype($maandtotaal_e_totaal, "float");
settype($maandtotaal_e_laag, "float");
settype($maandtotaal_e_hoog, "float");
settype($maandtotaal_g, "float");

//Bereken totaal en schrijf weg naar 'dagtotalen' tabel
$SQL = "INSERT INTO p1.maandtotaal (id, time, e_hoog, e_laag, e_totaal, g_totaal) VALUES (NULL, NULL, '".$maandtotaal_e_hoog."', '".$maandtotaal_e_laag."', '".$maandtotaal_e_totaal."', '".$maandtotaal_g."')"; 
//echo $SQL;

//Voer bovenstaande query uit
mysql_query($SQL);

}

?>




Dit bestand haalt de data op voor de staafgrafiek per dag:
data.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
<?php
$con = mysql_connect("localhost","p1logger","p1logger");

if (!$con) {
  die('Could not connect: ' . mysql_error());
}

mysql_select_db("p1", $con);

$query = mysql_query("SELECT DATE(time) as day, e_hoog, e_laag, e_totaal, verbruik_g FROM dagtotalen ORDER BY day ASC;");

$category = array();
$category['name'] = 'day';

$series1 = array();
$series1['name'] = 'Elektra hoog tarief';

$series2 = array();
$series2['name'] = 'Elektra laag tarief';

$series3 = array();
$series3['name'] = 'Elektra TOTAAL';

$series4 = array();
$series4['name'] = 'Gas';

while($r = mysql_fetch_array($query)) {
    $category['data'][] = $r['day'];
    $series1['data'][] = $r['e_hoog'];
    $series2['data'][] = $r['e_laag'];
    $series3['data'][] = $r['e_totaal'];
    $series4['data'][] = $r['verbruik_g']; 
}

$result = array();
array_push($result,$category);
array_push($result,$series1);
array_push($result,$series2);
array_push($result,$series3);
array_push($result,$series4);

print json_encode($result, JSON_NUMERIC_CHECK);

mysql_close($con);
?>




Dit bestand toont de daadwerkelijke grafiek
index.html
HTML:
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
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Energieverbruik per dag</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function() {
            var options = {
                chart: {
                    renderTo: 'container',
                    type: 'column',
                    marginRight: 130,
                    marginBottom: 25
                },
                title: {
                    text: 'Energieverbruik',
                    x: -20 //center
                },
                subtitle: {
                    text: '',
                    x: -20
                },
                xAxis: {
                    categories: []
                },
                yAxis: {
                    title: {
                        text: 'kWh / m3'
                    },
                    plotLines: [{
                        value: 0,
                        width: 1,
                        color: '#808080'
                    }]
                },
                tooltip: {
                    formatter: function() {
                            return '<b>'+ this.series.name +'</b><br/>'+
                            this.y+ ' kWh / m3';
                    }
                },
                legend: {
                    layout: 'vertical',
                    align: 'right',
                    verticalAlign: 'top',
                    x: -10,
                    y: 100,
                    borderWidth: 0
                },
                series: []
            }
            
            $.getJSON("data.php", function(json) {
                options.xAxis.categories = json[0]['data'];
                options.series[0] = json[1];
                options.series[1] = json[2];
                options.series[2] = json[3];
                options.series[3] = json[4];

                chart = new Highcharts.Chart(options);
            });
        });
        </script>
        <script src="http://code.highcharts.com/highcharts.js"></script>
        <script src="http://code.highcharts.com/modules/exporting.js"></script>
    </head>
    <body>
        <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
    </body>
</html>




De code om het gasverbruik te uploaden naar Mindergas vind je hier: ThinkPad in "Mindergas, upload automatiseren ???"

ThinkPad wijzigde deze reactie 24-09-2014 20:22 (97%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • .SnifraM
  • Registratie: december 2012
  • Niet online
Thinkpad, hoe ziet jou DB table er uit? Wellicht dat je die er ook nog bij kan zetten :-)

lol+lol=hihi


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Van die laatste PHP scriptjes met totalen bedoel je? De structuur om m'n meetwaardes op te slaan heb ik beschreven in m'n blogpost namelijk.

dagtotalen
code:
1
2
3
4
5
6
7
8
9
10
11
12
MariaDB [p1]> describe dagtotalen;
+------------+-------------+------+-----+-------------------+----------------+
| Field      | Type        | Null | Key | Default           | Extra          |
+------------+-------------+------+-----+-------------------+----------------+
| id         | int(11)     | NO   | PRI | NULL              | auto_increment |
| time       | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| e_hoog     | varchar(11) | NO   |     | NULL              |                |
| e_laag     | varchar(11) | NO   |     | NULL              |                |
| e_totaal   | varchar(11) | NO   |     | NULL              |                |
| verbruik_g | varchar(11) | NO   |     | NULL              |                |
+------------+-------------+------+-----+-------------------+----------------+
6 rows in set (0.03 sec)



maandtotaal
code:
1
2
3
4
5
6
7
8
9
10
11
12
MariaDB [p1]> describe maandtotaal;
+----------+-------------+------+-----+-------------------+----------------+
| Field    | Type        | Null | Key | Default           | Extra          |
+----------+-------------+------+-----+-------------------+----------------+
| id       | int(11)     | NO   | PRI | NULL              | auto_increment |
| time     | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| e_hoog   | varchar(11) | NO   |     | NULL              |                |
| e_laag   | varchar(11) | NO   |     | NULL              |                |
| e_totaal | varchar(11) | NO   |     | NULL              |                |
| g_totaal | varchar(11) | NO   |     | NULL              |                |
+----------+-------------+------+-----+-------------------+----------------+
6 rows in set (0.01 sec)

Meeste gewoon nog als varchar, moet eigenlijk naar DECIMAL(5,3) o.i.d., maar dat ging niet helemaal lekker, toen stond er ineens 99.999 in. Ergens met datatype gaat het dus niet helemaal goed in één van m'n scripts. Daarom maar als varchar, dan weet ik iig zeker dat het goed wordt weggeschreven voor nu.

ThinkPad wijzigde deze reactie 26-09-2014 22:55 (89%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • .SnifraM
  • Registratie: december 2012
  • Niet online
Bedankt voor het delen!

Houd er wel rekening mee dat als je in MySQL de MIN, MAX, AVG gaat bepalen aan de hand van een varchar, je hele rare (niet kloppende) getallen krijgt.

Daar liep ik laatst zelf tegenaan : Uitkomst mysql query tegen verwachting (avg, min, max)

lol+lol=hihi


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 ;)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

ThinkPad wijzigde deze reactie 29-09-2014 22:56 (35%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • gekkie
  • Registratie: april 2000
  • Laatst online: 18:37
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.

  • s441558
  • Registratie: mei 2002
  • Laatst online: 11-11 11:59
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.

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • gekkie
  • Registratie: april 2000
  • Laatst online: 18:37
quote:
ThinkPad schreef op dinsdag 30 september 2014 @ 07:24:
Beiden; dat snap ik ;) Maar zoals je aan m'n voorbeeld waardes ziet moet het dus in een (5,3) passen.
Misschien heb ik iets gemist, maar Ik snap nog niet helemaal waar die restrictie vandaan komt ?
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.

gekkie wijzigde deze reactie 30-09-2014 09:25 (13%)


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :p ), 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.

ThinkPad wijzigde deze reactie 30-09-2014 10:34 (27%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • gekkie
  • Registratie: april 2000
  • Laatst online: 18:37
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 :p

gekkie wijzigde deze reactie 30-09-2014 11:01 (33%)


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

@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?

Paling1 wijzigde deze reactie 08-10-2014 11:04 (7%)


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Die had ik inderdaad nog liggen. Je kunt een willekeurige Arduino pakken, mits:
  • 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
Arduino en Ethernetshield komen gewoon van eBay, goedkoopste die ik kon vinden.
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 :P (SQL injectie enzo).

Laat maar weten als je verder nog vragen hebt.

ThinkPad wijzigde deze reactie 08-10-2014 11:08 (8%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

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... :9
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.. 8)

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 :9
Dit weekend maar eens gaan klooien dan.

Paling1 wijzigde deze reactie 08-10-2014 12:29 (12%)


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Al gelukt :9 ?

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

quote:
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...

Paling1 wijzigde deze reactie 15-10-2014 12:51 (25%)


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

ThinkPad wijzigde deze reactie 15-10-2014 13:32 (4%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

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.

Paling1 wijzigde deze reactie 15-10-2014 13:28 (77%)


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

ThinkPad wijzigde deze reactie 15-10-2014 13:37 (4%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

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. 8)7

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. 8)

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

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.... -O-
Morgen weer verder.

Paling1 wijzigde deze reactie 15-10-2014 18:56 (11%)


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

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.

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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).
  • 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 :)
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.

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

ThinkPad wijzigde deze reactie 22-10-2014 20:46 (53%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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:
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?

ThinkPad wijzigde deze reactie 26-10-2014 09:36 (5%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
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


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Maar moet ik wat aanpassen of niet? Dat is mij uit je reactie niet duidelijk.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
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.

Proton_ wijzigde deze reactie 26-10-2014 11:27 (30%)

'15 Zoe, douchen met wtw en Auer Edel Eau


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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?

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
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.

'15 Zoe, douchen met wtw en Auer Edel Eau


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
quote:
MySQL 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.
https://dev.mysql.com/doc/refman/5.5/en/datetime.html
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

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
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:
quote:
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.

'15 Zoe, douchen met wtw en Auer Edel Eau


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
quote:
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).
[...]
^^ Held.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
* 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 :)

'15 Zoe, douchen met wtw en Auer Edel Eau


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 ?

ThinkPad wijzigde deze reactie 26-10-2014 15:20 (6%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

quote:
ThinkPad 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).
  • 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 :)
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.

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 ;)
Ben maar weer eens begonnen... :P
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... 8)
Van de week maar weer verder.

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :+

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
quote:
ThinkPad 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 ?
Welke versie PHP gebruik je? Je kunt ook daar de 'time' vertalen naar unix timestamp: http://php.net/manual/en/datetime.gettimestamp.php
Dan gaat dat dus uit de query en in de PHP code.

'15 Zoe, douchen met wtw en Auer Edel Eau


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :+

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Proton_
  • Registratie: november 2011
  • Laatst online: 19:09
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).

'15 Zoe, douchen met wtw en Auer Edel Eau


  • Paling1
  • Registratie: juni 2001
  • Niet online

Paling1

R 8.5

quote:
ThinkPad 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 :+
Gelukt!!! _/-\o_
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.

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Mooi dat het gelukt is! De aanhouder wint :Y

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: ThinkPad 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.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
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.

RobV wijzigde deze reactie 01-11-2014 08:59 (3%)

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :*)

ThinkPad wijzigde deze reactie 07-11-2014 12:30 (43%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • Raven
  • Registratie: november 2004
  • Niet online

Raven

Marion Raven fan

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


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
Heb je het geheel al werkend Paling1 ?

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
Sorry guys, door allerlei medische zaken nog niet toegekomen aan het meterkastprojectie.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :D 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).

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • MrNiles
  • Registratie: mei 2003
  • Laatst online: 03-03 14:09
quote:
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.
Er zijn 5 euro WiFi modules beschikbaar!
ESP8266 bijvoorbeeld

  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
quote:
MrNiles schreef op maandag 23 maart 2015 @ 16:04:
[...]


Er zijn 5 euro WiFi modules beschikbaar!
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.

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • MrNiles
  • Registratie: mei 2003
  • Laatst online: 03-03 14:09
quote:
RobV 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.
very nice
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

  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
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


  • asay
  • Registratie: december 2009
  • Laatst online: 30-10 16:44
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
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?

  • peterlogic
  • Registratie: april 2015
  • Laatst online: 10-07-2015
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.

  • bernardflach
  • Registratie: januari 2009
  • Laatst online: 07-09 19:21
quote:
peterlogic 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.
Kijk hier eens naar : wellicht helpt dat : http:/mywiki.nl/p1_project
Dit is welliswaar geschreven voor een Raspberry Pi maar wellicht kan je hier inspiratie opdoen qua code

bernardflach wijzigde deze reactie 26-06-2015 07:28 (5%)


Acties:
  • 0Henk 'm!

  • arnaudarduino
  • Registratie: juli 2015
  • Laatst online: 10-11 16:19

arnaudarduino

Trial and error, and reverse

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]

Acties:
  • 0Henk 'm!

  • sypie
  • Registratie: oktober 2000
  • Niet online
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)

Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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 :+

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • arnaudarduino
  • Registratie: juli 2015
  • Laatst online: 10-11 16:19

arnaudarduino

Trial and error, and reverse

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

Acties:
  • 0Henk 'm!

  • arnaudarduino
  • Registratie: juli 2015
  • Laatst online: 10-11 16:19

arnaudarduino

Trial and error, and reverse

:)

arnaudarduino wijzigde deze reactie 01-08-2015 18:08 (99%)


Acties:
  • 0Henk 'm!

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

ThinkPad wijzigde deze reactie 26-07-2015 14:11 (29%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • arnaudarduino
  • Registratie: juli 2015
  • Laatst online: 10-11 16:19

arnaudarduino

Trial and error, and reverse

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
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.

arnaudarduino wijzigde deze reactie 15-08-2015 14:42 (86%)
Reden: deelvraag


  • arnaudarduino
  • Registratie: juli 2015
  • Laatst online: 10-11 16:19

arnaudarduino

Trial and error, and reverse


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?

arnaudarduino wijzigde deze reactie 03-09-2015 22:37 (35%)


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
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


  • Arjan_IO
  • Registratie: december 2015
  • Laatst online: 01-03-2016
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 :X

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!

  • dreezy
  • Registratie: juli 2004
  • Laatst online: 07-01-2016
@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? :o

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
quote:
dreezy schreef op dinsdag 29 december 2015 @ 00:18:
@ThinkPad,
[...]

Is hier iets van bekend dat het met wamp niet werkt? :o
Klinkt eerder alsof je problemen hebt met PHP.

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 ;) Alleen een P1 USB-Serial kabeltje nodig.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • killer8
  • Registratie: juni 2009
  • Laatst online: 15-11 17:38
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:
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?

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • killer8
  • Registratie: juni 2009
  • Laatst online: 15-11 17:38
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.
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.

  • NBK
  • Registratie: oktober 2002
  • Laatst online: 13-07 00:26

NBK

Weercam-Avatar

-vraag verhuist-

NBK wijzigde deze reactie 09-01-2016 18:47 (177%)

PC's; Home; Met 8619 units als 72e geëindigd bij DPC @ SETI-classic


  • vso
  • Registratie: augustus 2001
  • Laatst online: 19:15

vso

raap voor zijn recht

quote:
ThinkPad 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
2 vraagjes,

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 ?

Searching internet is like drinking from a fire hydrant


  • The_FrankO
  • Registratie: november 2001
  • Niet online
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?

iRacing Profiel | Mijn SimRig


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
quote:
The_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?
Geen van beide oplossingen gaat werken, je hebt niks met USB te maken op de Arduino 8)7 Die verloopjes die je laat zien gaan dan ook niet werken. Dat de aansluitingen fysiek passen wil nog niet zeggen dat de communicatie ook gaat werken...

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...

ThinkPad wijzigde deze reactie 20-01-2016 15:43 (33%)

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • The_FrankO
  • Registratie: november 2001
  • Niet online
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?

The_FrankO wijzigde deze reactie 20-01-2016 16:06 (7%)

iRacing Profiel | Mijn SimRig


  • The_FrankO
  • Registratie: november 2001
  • Niet online
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

iRacing Profiel | Mijn SimRig


  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • joostnl
  • Registratie: januari 2010
  • Laatst online: 18:49
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?

  • ThinkPad
  • Registratie: juni 2005
  • Nu online

ThinkPad

Moderator Duurzame Energie & Domotica

L460

Topicstarter
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.

Gas besparen door CV-tuning | Elektriciteit besparen
Geen (Domoticz) vragen via privébericht die ook via het forum kunnen a.u.b.


  • The_FrankO
  • Registratie: november 2001
  • Niet online
quote:
ThinkPad 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
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?

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?

iRacing Profiel | Mijn SimRig


  • The_FrankO
  • Registratie: november 2001
  • Niet online
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 .... 8)7

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.

iRacing Profiel | Mijn SimRig


  • Baldoldman
  • Registratie: oktober 2014
  • Laatst online: 24-03-2016
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?

  • The_FrankO
  • Registratie: november 2001
  • Niet online
quote:
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
Geen idee of ik deze TODOs ooit ga implementeren

The_FrankO wijzigde deze reactie 27-03-2016 15:37 (7%)

iRacing Profiel | Mijn SimRig


  • The_FrankO
  • Registratie: november 2001
  • Niet online
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:
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";

?>

iRacing Profiel | Mijn SimRig


  • RobV
  • Registratie: juni 2013
  • Niet online

RobV

Welcome to the grid, Program.

(overleden)
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.

Dash

Graph

 | Mijn joystick / simpit project | Blog | Elite Dangerous CMDR Cataclysm72


  • niek1974
  • Registratie: oktober 2008
  • Laatst online: 13-01 20:00
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 ?
Pagina: 1 2 Laatste


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

'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