Vraag


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Ik wil graag mijn slimme meter uitlezen met een Arduino Mega om mijn Fibaro HC2 van informatie te voorzien.
Nu heb ik mij al kapot gegoogeld en het dichtst bij kwam ik met http://blog.hekkers.net/2...-meter-to-the-fibaro-hc2/

Alleen staat hier niet de volledige Arduino sketch.
De LUA code van de Fibaro is het probleem niet, de P1 info kan ik ook lezen met onderstaande code:

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
 void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
#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;
 
void setup() {
    Serial.begin(115200);
    altSerial.begin(115200);
}
 
void loop() {
    if (altSerial.available()) {
        c = altSerial.read();
   
        // --- 7 bits instelling ---
        c &= ~(1 << 7);
        char inChar = (char)c;

    Serial.print(c);
    }
}
}

Maar nu komt het moeilijkste (voor mij dan), hoe stuur ik die data door naar de EthernetShield of zijn SD kaartje zodat de Fibaro HC2 bij die data kan?

Ik heb hier voor gewoon de kennis niet in huis.
Wie is hier Arduino expert en vind het leuk om mij aan een werkende setup te helpen?

[ Voor 0% gewijzigd door ThinkPad op 20-06-2016 13:20 . Reden: [code]-tags toegevoegd om het leesbaarder te maken. ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 06:48
ruudvee schreef op maandag 20 juni 2016 @ 12:39:
[...]
Wie is hier Arduino expert en vind het leuk om mij aan een werkende setup te helpen?

Dat is niet de insteek hier. Je kunt hier niet simpelweg je wensenlijstje droppen en wachten tot iemand het voor je uitvogelt. Wat heb je zelf al geprobeerd, wat lukt er, wat lukt er niet?

P.S. Ik heb ook even code-tags toegevoegd aan je stukje code om het leesbaarder te maken.

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Nee, dat bedoel ik niet, ik hoop dat er meegedacht kan worden.
Wat er wel lukt is het uit uitlezen van de meter.
Alleen heb ik geen idee hoe ik dat via ethernetshield door moet geven aan de Fibaro.

Dus de P1 poort uitlezen lukt, check.
LUA code kan ik zelf, check.
Ethernetshield als doorgeefluik van de seriële data is voor mij nog hokuspokus.

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <Ethernet.h>
#include <SD.h>
#include <SPI.h>
#define TRIGPIN 48 // P1 Trigger Pin  
#define REQ_BUF_SZ 100

byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x8D, 0x1E}; // Arduino Ethernet 4
byte gateway[] = { 192, 168, 0, 1 };
IPAddress ip(192,168,0,203);
EthernetClient client; // client connect
EthernetServer server(80);  // create a server at port 80
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
File webFile; // the web page file on the SD card


Bovenstaande code zou de ethershield moeten activeren, maar een ping naar 192.168.0.203 geeft geen reply's.

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 06:48
Ik lees op internet dat een Arduino alleen reageert op ping als je in de code daar ook wat voor hebt geprogrammeerd. Mist er in bovenstaand stuk code trouwens ook niet een stuk om het IP-adres te verkrijgen (DHCP) of in te stellen (static) ?

Ik zou zorgen dat je eerst een webserver krijgt die je op je PC kunt openen. De data die je naar de Fibaro wilt hebben presenteer je dan op die pagina door ze uit variabelen op te vragen, die variabelen kun je dan later vullen met de P1-uitleesfunctie die je toe gaat voegen als alles werkt. Dit idee (fake code):
code:
1
2
meterstand = 1234.5
    echo "<meterstand>


P.S. Zorg ook dat je met functies gaat werken om het leesbaar te houden. Knal niet alles in de loop() maar maak een functie ServeerWebpagina() en een functie P1Uitlezen(). Is ook makkelijker debuggen.
En die functies zou je ook nog kunnen opsplitten, het uitlezen is bijv. niet alleen uitlezen maar ook het wegschrijven in het geheugen.

Stapje voor stapje dingen proberen.... ;)

[ Voor 33% gewijzigd door ThinkPad op 20-06-2016 20:02 ]


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Ik heb een stukje code gevonden die ik aangepast heb op mijn netwerk en Fibaro controller.
De reden dat ik hier mee wil testen is omdat de code direct waardes kan lullen met de Fibaro via JSon.
Nu alleen nog uitzoeken wat het format is van die json code.

De output is wel leuk om te zien, nu nog een valide string er heen sturen :-)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
connecting...
connected
HTTP/1.1 400 Bad Request
Date: Mon, 20 Jun 2016 20:21:10 GMT
Server: 0.9
Cache-Control: no-cache, no-store
Content-Type: application/json;charset=UTF-8
Connection: close
Transfer-Encoding: chunked

3e
{"type":"ERROR","reason":"id","message":"Incorrect id in url"}
0


disconnecting.

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Klein stapje verder gekomen.
In de Fibaro HC2 heb ik een variabele aangemaakt genaamd "Test2" en waarde "80".
De Arduino kan dit nu al lezen via JSON direct uit de HC2

connecting...
connected
HTTP/1.1 200 OK
Date: Tue, 21 Jun 2016 19:27:07 GMT
Server: 0.9
Cache-Control: no-cache, no-store
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked

68
{"name":"Test2","value":"80","readOnly":false,"isEnum":false,"created":1466532386,"modified":1466532386}
0


disconnecting.


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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x2E, 0x33 };
byte ip[] = {192,168,0,101}; 
byte gateway[] = {192,168,0,254};   
byte subnet[]  = {255,255,255,0};   
IPAddress server(192,168,0,110);

EthernetClient client;

void setup()
{
  Ethernet.begin(mac, ip); 
  Serial.begin(115200); 
  delay(1000);

  Serial.println("connecting...");
  String PostData = "{\r\n\"value\":\"166\"\r\n}"; //JSON data to send

  if (client.connect(server,80)) {
    Serial.println("connected");
    client.print("GET /api/globalVariables/Test2"); //Fibaro Global Variable
    client.println(" HTTP/1.1");
    client.println("Host: 192.168.0.110");
    client.println("Authorization: Basic XXXXXXXXXXXX");   //need to insert base 64 user:password
    client.print("Content-Length: ");
    client.println(PostData.length());
    client.println();
    client.println(PostData);  
  } 
  else {
   Serial.println("Connection Failed.");  
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}



Nu uitzoeken hoe ik die waarde vanuit de Arduino kan aanpassen naar de HC2
Volgens mij gaat dat met een PUT, maar ik heb de syntax daar nog niet van.

Wordt vervolgt

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Ik kwam er niet uit, dus heb het aan een collega gevraagd.

De variabele die ik Test2 heb genoemd met waarde 80 kan ik nu via de API wijzigen.

PUT
globalVariableID = Test2
Body= { "value": "81" }

Nu is variabele "Test2" 81 geworden, dit is te zien met een GET commando in de API, maar ook in de GUI van de Fibaro.

Deze waarde doorzetten naar LUA code.
Lees met LUA de waarde uit van Test2:

code:
1
2
3
4
5
6
--[[
%% properties
%% globals
--]]
local myVar1 = fibaro:getGlobal('Test2')
fibaro:debug ( ' De waarde is = ' .. myVar1 )


Waarde myVar1 geeft nu de waarde van variabele Test2 weer.


Weer een stap verder gekomen dus. :-)

[ Voor 28% gewijzigd door ruudvee op 23-06-2016 21:29 ]


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
De mainloop code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--[[
%% properties
%% globals
--]]
local _vd_id = fibaro:getSelfId()
local myDag = fibaro:getGlobal('Dag')
local myNacht = fibaro:getGlobal('Nacht')
local myHuidig = fibaro:getGlobal('Huidig')
local myGas = fibaro:getGlobal('Gas')

fibaro:call(_vd_id, "setProperty", "ui.Dag.value", myDag.. " Watt")
fibaro:call(_vd_id, "setProperty", "ui.Nacht.value", myNacht.. " Watt")
fibaro:call(_vd_id, "setProperty", "ui.Huidig.value", myHuidig.. " Watt")
fibaro:call(_vd_id, "setProperty", "ui.Gas.value", myGas.. " M3")


Bovenstaande code is de mainloop.
Elk device heeft een ID nodig, bij virtual devices moet je dat zelf laten genereren met getSelfid
Daarna de 3 variabelen, dag, nacht, huidig en gas
Deze variabelen worden door de Arduino in de Fibaro geschoten via JSON.
De setProperty geeft variabele myDag door aan Fibaro label ID en laat het zien in de GUI.

Geen idee of mensen dit leuk vinden om te lezen, maar voor mij is het meer een uitvogeldagboek.

Afbeeldingslocatie: https://i347.photobucket.com/albums/p474/Ruud_Velthoen/Fibaro_energie_zpsrxs2advd.jpg

[ Voor 5% gewijzigd door ruudvee op 24-06-2016 09:22 ]


Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 06:48
Goed om te zien dat je er langzaam maar zeker wel komt :Y

Maar laat je de Arduino het nu in de HC2 drukken, of maakt de Arduino een webpagina (met JSON had je het over) waar de HC2 het dan weer vanaf haalt? Dat is mij niet helemaal duidelijk.

Als je trouwens de boel werkend hebt zou ik geen AltSoftSerial meer gebruiken, maar de hardware serial van de Arduino. Je hebt dan geen debug informatie meer over de USB, maarja als het werkt is dat ook niet meer nodig. Voordeel van de hardware serial is dat hij veel betrouwbaarder werkt dan SoftSerial of AltSoftSerial.

[ Voor 39% gewijzigd door ThinkPad op 24-06-2016 09:23 ]


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
De Arduino schiet een waarde de Fibaro in:

String PostData = "{\r\n\"value\":\"166\"\r\n}"; //JSON data to send

In dit geval geeft Arduino waarde 166 aan Fibaro die dit realtime uitleest en in variabele Dag zet:
local myDag = fibaro:getGlobal('Dag')

Variabele Dag wordt myDag en zet het in de GUI
fibaro:call(_vd_id, "setProperty", "ui.Dag.value", myDag.. " Watt")

:*) :*)

Nu is die waarde 166 uit de Arduino nog een vast gegeven, maar het moet uiteindelijk van de P1 bus af komen.
Dat is dus mijn laatste stap.

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
ThinkPadd schreef op vrijdag 24 juni 2016 @ 09:22:
Als je trouwens de boel werkend hebt zou ik geen AltSoftSerial meer gebruiken, maar de hardware serial van de Arduino. Je hebt dan geen debug informatie meer over de USB, maarja als het werkt is dat ook niet meer nodig. Voordeel van de hardware serial is dat hij veel betrouwbaarder werkt dan SoftSerial of AltSoftSerial.
Bedankt voor je tip.
Als de code klaar is dan zal ik de HardwareSerial Library gaan gebruiken. d:)b

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
@ThinkPad, ik heb jouw code er ook eens bij gepakt, maar daarmee kan ik de P1 bus niet eens uitlezen.
Ik heb een Arduino Mega, dus ik gebruik poortje 48 om de meter uit te lezen.
Waar moet ik dat dan aangeven, in

1. const int requestPin = 5;
2. pinMode(4, OUTPUT);
3. digitalWrite(4, HIGH);

Heb ze alle 3 al geprobeerd maar geen telegrammen.

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 06:48
De requestPin zet +5V op de RTS pin van de slimme meter. Je kunt die RTS net zo goed aan de 5V van de Arduino hangen.

Die pin had iets met het Ethernet-shield te maken kan ik mij vaag herinneren (het is 2 jaar geleden dat ik dat gemaakt heb he :P )

Je hoeft volgens mij geen pin op te geven, de library ziet zelf dat je een Arduino mega gebruikt en pakt dan pin 48. Zie ook de documentatie: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Ik denk eerder dat je de RTS van je meter niet voed met 5V en dat hij daarom geen data uitspuugt. Knoop hem gewoon aan de 5V zoals ik zei dan hoef je je daar niet druk over te maken iig.

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Hardware werkt, met: Serial.print(c); krijg ik gewoon het telegram te zien.
Alleen wil onderstaande code niet lopen.
Heb er voor de test Serial.println("Ruud") tussen gezet om te zien hoe ver de code door loopt.
Mijn naam komt niet in beeld, dus werkt if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) niet
Ik begrijp dat 0-1:24.2.1 de regel is van de Gasmeting in het telegram en dat er iets precies 0 moet zijn, maar verder snap ik die regels niet.

Wie kan dit uitleggen?

// 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) {
Serial.println("Ruud");
// if (sscanf(strrchr(buffer, '(') + 1, "%d.%d", &tl, &tld) == 2) {
mG = (tl*1000)+tld;
Serial.print("&mG=");
Serial.println(mG);

[ Voor 91% gewijzigd door ruudvee op 27-06-2016 20:55 ]


Acties:
  • 0 Henk 'm!

  • siepeltjuh
  • Registratie: Maart 2003
  • Niet online
Onderstaande gebruik ik om het telegram te decoderen. De code is geloof ik ook gebaseerd op een van Thinkpad zijn blogs. Aan jouw code zie ik niet direct problemen, anders dan dat je if statement uitgecomment is en dat het deel waar je je buffer vult niet zichtbaar is. Zelf had ik wel wat sores met buffer lengte en de /n
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
void SlimmeMeterSensor::decodeTelegram() {
    
    while (Serial2.available() > 0) {
        input = Serial2.read();
        
        // Fill buffer up to and including a new line (\n)
        buffer[bufpos] = (char)input;
        if (bufpos >= BUFSIZE)
        {
            Serial.println("buffer overflow?!");
        }
        bufpos++;

        if (input == '\n') { // We received a new line (data up to \n)
            char valueAsString[75];

            if (sscanf(buffer, "0-0:96.14.0(%ld)", &valueAsString) == 1) { 
                NewTariff = strtol(valueAsString, NULL,10);
            }

            
            if (sscanf(buffer, "1-0:1.8.1(%[^*]", &valueAsString) == 1) { 
                NewLowValue = strtod(valueAsString, NULL);
            }

            // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
            if (sscanf(buffer, "1-0:1.8.2(%[^*]", &valueAsString) == 1) { 
                NewHighValue = strtod(valueAsString, NULL);
            }

            // 1-0:1.7.0 = Elektra huidig verbruik (DSMR v4.0)
            if (sscanf(buffer, "1-0:1.7.0(%[^*]", &valueAsString) == 1) {
                UsageValue = strtod(valueAsString, NULL);
            }

            // 0-1:24.2.1 = Gas (DSMR v4.0)
            if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) {             
NewGasValue = strtod(valueAsString, NULL);
                }
            }

            // Empty buffer again (whole array)
            memset(&buffer[0], 0, sizeof(buffer));
            bufpos = 0;
        }
    }
}

[ Voor 18% gewijzigd door siepeltjuh op 01-07-2016 17:55 ]

Can`t live without the mods


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Bedankt voor je code.
Ik krijg het alleen niet gecompileerd.

Ik post hier de sketch.

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
#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;
int input = 0;
int buffer = 0;
 
void setup() {
    Serial.begin(115200);
    altSerial.begin(115200);
}
 
void loop() {
    if (altSerial.available()) {
        c = altSerial.read();
   
        // --- 8 bits instelling ---
        c &= ~(1 << 8);
        char inChar = (char)c;

    Serial.print(c);
    }
}
void decodeTelegram() {
    
    while (Serial.available() > 0) {
        input = Serial.read();
        
        // Fill buffer up to and including a new line (\n)
        buffer[bufpos] = (char)input;
        if (bufpos >= BUFSIZE)
        {
            Serial.println("buffer overflow?!");
        }
        bufpos++;

        if (input == '\n') { // We received a new line (data up to \n)
            char valueAsString[75];

            if (sscanf(buffer, "0-0:96.14.0(%ld)", &valueAsString) == 1) { 
                NewTariff = strtol(valueAsString, NULL,10);
            }

            
            if (sscanf(buffer, "1-0:1.8.1(%[^*]", &valueAsString) == 1) { 
                NewLowValue = strtod(valueAsString, NULL);
            }

            // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
            if (sscanf(buffer, "1-0:1.8.2(%[^*]", &valueAsString) == 1) { 
                NewHighValue = strtod(valueAsString, NULL);
            }

            // 1-0:1.7.0 = Elektra huidig verbruik (DSMR v4.0)
            if (sscanf(buffer, "1-0:1.7.0(%[^*]", &valueAsString) == 1) {
                UsageValue = strtod(valueAsString, NULL);
            }

            // 0-1:24.2.1 = Gas (DSMR v4.0)
            if (strncmp(buffer, "0-1:24.2.1", strlen("0-1:24.2.1")) == 0) {             
NewGasValue = strtod(valueAsString, NULL);
                }
            }

            // Empty buffer again (whole array)
            memset(&buffer[0], 0, sizeof(buffer));
            bufpos = 0;
        }
    }

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Iedereen die mij geholpen heeft in dit draadje bedankt.

Ik stop er mee, ben al weken bezig en heb nog niet 1 getal van de meter in een variabele weten te krijgen.
Ik heb al heel veel sketches geprobeerd, maar of ze compileren niet, of ze geven geen output op de serial monitor.

Zo veel tijd is het mij niet waard.
De Arduino gaat de kast weer in en ik wacht wel op een plug n play oplossing voor de Fibaro.

;w

Acties:
  • +1 Henk 'm!

  • The Hive
  • Registratie: Mei 2009
  • Laatst online: 30-04 13:31
Het is wel een stuk duurder maar misschien is dit wat voor je...
en je kan ook je water meter uitlezen als je wil.


http://forum.fibaro.com/i...art-meter-values-in-a-vd/
http://www.iungo.nl/nl/

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Nadat ik op MP een defecte Plugwise had gekocht (bedankt daar voor verkoper) heb ik toch de draad weer op gepakt en het gaat vrij succesvol.
Het telegram wordt gelezen en de meterwaardes in variabelen gezet.
Alleen leest hij de gasmeter niet uit terwijl die waardes wel binnen komen.

Wie kan mij op weg helpen om ook het gasverbruik uit te lezen?

Onderstaande code is van internet gehaald en aangepast.

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
132
133
134
135
136
#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
 
AltSoftSerial altSerial;
 
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31};
IPAddress ip(192,168,0,112);
IPAddress server(192,168,0,110); //Fibaro
EthernetClient client;
 
const int requestPin =  4;        
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; //Laag tarief
long mEVHT = 0; //Hoog tarief
long mEAV = 0;  //Huidig verbruik
long mG = 0;   //Gasmeter
 
void setup() {
  Serial.begin(9600);
  delay(1000);
 
  altSerial.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();
 
} //Einde loop
 
void decodeTelegram() {
  long tl = 0;
  long tld =0;
 
  if (altSerial.available()) {
    input = altSerial.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;
        if (mEVLT > 0) {
          Serial.print("Elektra - meterstand verbruik LAAG tarief: ");
          Serial.println(mEVLT);
 
        }
      }

   if (input == '\n') { // We received a new line (data up to \n)
      if (sscanf(buffer,"1-0:1.8.2(%ld.%ld" ,&tl, &tld)==2){
        tl *= 1000;
        tl += tld;
        mEVHT = tl;
        if (mEVHT > 0) {
          Serial.print("Elektra - meterstand verbruik HOOG tarief: ");
          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;
        if (mEAV > 0) {
          Serial.print("Elektra - actueel verbruik (W): ");
          Serial.println(mEAV);
        }
      }
 
   // 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 - meterstand (liters): ");
          Serial.println(mG);
          
        }
      }
 
      // Empty buffer again (whole array)
      for (int i=0; i<75; i++)
      {
        buffer[i] = 0;
      }
      bufpos = 0;
 
    }
 
    if (input == '!') {   //uitroepteken geeft einde van telegram aan, dus we gaan data versturen
  
      mEVLT = 0;
      mEVHT = 0;
      mEAV = 0;
      mG = 0;
      client.stop();
    } //Einde uitroepteken detectie  
 
  } //Einde 'if AltSerial.available'
 
} //Einde 'decodeTelegram()' functie

}

Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Ik ben er achter dat de code stopt op regel 3.
Mijn naam komt n.l. niet voorbij op de seriële monitor als hij op regel 4 staat.
Toch is dit werkende code van Tweakers.net.

Kan iemand mij op weg helpen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 // 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) {
        Serial.print("Ruud");
        if (sscanf(strrchr(buffer, '(') + 1, "%d.%d", &tl, &tld) == 2) {
          mG = (tl*1000)+tld;
          Serial.print("Gas - meterstand (liters): ");
          Serial.println(mG);
          Serial.println("");
         
          
        }
      }

Acties:
  • 0 Henk 'm!

  • The_FrankO
  • Registratie: November 2001
  • Niet online
Bovenstaand voorbeeld is van ThinkPad. In zijn topic "Hulp bij slimme meter uitlezen met Arduino naar MySQL" komt een totaal beeld van zijn code. Mogelijk dat je net een deel van de code hebt wat niet compleet is.

Ik heb zelf op basis van zijn code ook wat opgezet, uiteindelijk ks het behoorlijk anders geworden. Je zou die kunnen gebruiken, ik heb het hier geplaatst:
The_FrankO in "Hulp bij slimme meter uitlezen met Arduino naar MySQL"

iRacing Profiel | Mijn SimRig


Acties:
  • 0 Henk 'm!

  • ruudvee
  • Registratie: November 2007
  • Laatst online: 08-02 00:58
Hoi Frank, ik vind jouw code gruwelijk moeilijk, omdat er heel veel code bij zit waar ik niks aan heb, ik ga de data niet opslaan in een database en zo.

Mijn ervaring is dat ik hier niet veel hulp krijg zoals Thinkpad dat wel kreeg.
Geen idee waarom, maar dit is wel de reden dat ik mijn vorderingen die ik stapje voor stapje maak, hier niet meer zal posten.
Pagina: 1