Go Down

Topic: Slimme-meter en S0-bus uitlezen en naar Database (Read 9395 times) previous topic - next topic

nicoverduin

Ik weet dat er tools zijn die bijvoorbeeld messages naar een php programma elders buiten het privé domein. Je zou kunnen testen of je vanaf je PC met zo'n tool een boodschap uberhaupt nog wel bij die php kan komen. Zou zo wel moeten maar dit is een debug traject van deductie. Er zitten een aantal punten in het traject die individueel getest moeten worden om uit te sluiten waar het zit. Het zit vermoedelijk in de routering naar de externe WAN (dus buiten jouw huis). maar nu weet je het niet zeker. En een tool (eigenlijk een wat geavanceerde terminal) kan wat meer vertellen. Wie weet bereik je wel de server maar gaat er toch iets fout daar. Enz enz. 
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

MAS3

MAC adres is als het ware het serienummer van je netwerkkaart.
Officieel behoren er geen 2 dezelfde daarvan te zijn, je IP hoeft alleen maar uniek te zijn binnen het netwerk waarin 'ie zich bevindt (bij jou dus 192.168.2.x).
Je buurman en de overbuurman kunnen heel goed hetzelfde IP in gebruik hebben als jij, maar het is vrijwel onmogelijk dat jullie dezelfde MAC adressen hebben.
De router heeft het MAC adres nodig, al was het alleen maar om via DHCP een IP toe te wijzen.
Jouw PC meldt zich daarvoor in het netwerk en laat weten dat ie wil deelnemen aan de DHCP pool, en dus wat zijn MAC adres is.
Vervolgens krijgt ie een lading instellingen, waaronder het IP adres toegewezen en je router vertelt daarbij voor welk MAC adres dat bedoeld is.
De router staat ook in de gaten te houden welke apparaten er nog steeds in het netwerk aanwezig zijn, en dat doet ie dan ook weer aan de hand van het MAC adres.
Als ie een MAC adres is kwijtgeraakt, dan kan ie het IP dat ie eerder daaraan gekoppeld had, vrijgeven en voor een volgend apparaat gaan gebruiken.
Als je wisselende apparaten hebt (zoals een aantal mobieltjes) binnen je netwerk en je zou gaan bijhouden welk IP die telkens hebben, dan kun je dus zien dat dat ook verandert (maar in de praktijk valt dat bij de meeste routers nogal mee).
Ook een eventueel aanwezige netwerk switch houdt de aangesloten apparaten bij aan de hand van het MAC adres.
Hij weet zo op welke poort welk MAC adres zit en kan daarom de data gericht door zijn poorten sturen.
Zo'n switch zal alleen data gooien naar de poort waar de MAC adressen zitten voor wie die data bedoeld is.
Zo bespaar je bandbreedte binnen je netwerk.
Apparaten die wel alle data naar alle poorten gooit zijn er ook.
Ze zien er vrijwel hetzelfde uit als een netwerk switch, maar ze heten dan een netwerk hub.
Een beetje druk netwerk loopt helemaal vol als er een aantal hubs in zitten.
Lollig word het als je minimaal 2 hubs met minimaal 2 poorten onderling aan elkaar verbind.

Eh, ik ga een beetje off topic geloof ik.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

arnaudarduino

NicoVerduin  en Mas3   jullie geven veel info is zeker handig nuttig. Heb nu al veel geprobeerd en gelezen.

Net een andere sketch ingeladen om de arduino ip op te laten zoeken.
Deze gecontrolleerd in de router deze statisch vast gezet (zo werkte het bij de inbraakbeveiliging ook) maar niets.

arnaudarduino

Zo raar    Van een werkend systeem en database naar niet werkend systeem
enkel door veranderen van internet modem/router enige wijziging die ik in principe moest uitvoeren is een 1 naar een 2 veranderen (192.168.2.114). Van draytek naar experia v8. Vodafone naar Telfort.
Webhosting en database onveranderd


Nadat ik een andere sketch had ingeladen heeft de experia de arduino zelf gevonden met ipadres 192.168.2.4 daarna dataloggersketch met dit ip ingevuld maar helaas ook geen resultaat.

Hoe en wat kan ik jullie nog vragen, verduidelijken zodat er bij jullie een lampje aangaat en zeggen oooooooooooooooooo dat moet zo bij de experiabox v8. Want ik denk echt dat die de roet in het eten strooit.


Jantje

#49
Oct 20, 2016, 10:05 pm Last Edit: Oct 20, 2016, 10:06 pm by Jantje
Zo raar    Van een werkend systeem en database naar niet werkend systeem
enkel door veranderen van internet modem/router enige wijziging die ik in principe moest uitvoeren is een 1 naar een 2 veranderen (192.168.2.114). Van draytek naar experia v8. Vodafone naar Telfort.
Webhosting en database onveranderd

Dat klinkt helemaal niet raar in mijn oren. Ik heb al heel wat routers/bridges/WAP versleten en elke keer een ander type gekocht. Elke keer andere miserie.
Netwerk setup is nu eenmaal geen kattepies (en dat stinkt al behoorlijk ;-) ) als daar dan ook nog een internetprovider bijkomt met zijn eigen materiaal (dat niet gemaakt is voor jou maar voor de netwerkbeheerder) zoals telenet in België moet je al heel beslagen zijn om een bestaand netwerk vlot over te dragen.

Als je probleem in je netwerk ligt (en dat weet ik niet) dan kan je beter hulp zoeken op een netwerk forum. Hier is die kennis gewoon onvoldoende aanwezig om je vlot te kunnen helpen.

Met vriendelijke groet
Jantje
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

MAS3

Hoi.

Wist je dat je voor veel van de Arduino producten documentatie kunt ophalen van de Reference pages (klik !)?
En wist je dat dat er ook is voor Ethernet.h (ik weet niet of jij deze of een andere met dezelfde naam gebruikt) ?
Daarin staat bijvoorbeeld hoe je een en ander kunt instellen.
Je hebt in je eerder geplaatste sketch alleen het MAC adres en je IP ingesteld.
Maar er kan meer worden ingesteld, kijk hier maar eens naar.

Omdat je problemen ervaart, zou je dit nog kunnen proberen.
Maar precies dat ding is een rotding want er word nogal over geklaagd in verband met precies dit probleem(welke trouwens een verouderd model lijkt te zijn, dus vreemd dat je die recent zou hebben ontvangen als ik het goed begrijp).

Ethernet.begin(mac, ip, dns, gateway, subnet)

Even om jou te helpen (iemand anders moet waarschijnlijk ook iets anders instellen):


mac:0xDE, 0xAD, 0xBE, 0x30, 0x32, 0x31
ip:192, 168, 2, 114
dns:192, 168, 2, 254
gateway:192, 168, 2, 254
subnet:255,255,255,0


Uiteraard zorg je er voor dat het MAC adres uniek is binnen jouw netwerk.
Die subnet stelt zichzelf al in op 255.255.255.0 als je niks opgeeft (default).
Maar de gateway (to the internet) die defaults naar 192.168.2.1 als je niets opgeeft, want zo is dat meestal.
En daar zit die deur naar het internet bij jou helemaal niet.
Die zit op 192.168.2.254, en daarom moet je 'm dus wel instellen.
Als je de gateway wil instellen, dan moet je ook de DNS instellen, want anders kun je de gateway niet doen.
De DNS (Domain Name Server) is waar de URL wordt omgezet naar een IP, waar ik het eerder al over had.
De meeste routers kun je ook daarvoor aanwijzen, maar jij schijnt dus een eigenwijs ding te hebben.
Dus wat je hiervoor als alternatief kunt instellen, is een DNS die vrij te gebruiken is van sponsor Google:
4.4.4.4 (jawel, vier keer vier dus gemakkelijk te onthouden).

Probeer het maar eens zou ik zeggen.

[edit]
In die sketch die ik van de eerste pagina in deze thread heb, zit nog wel een dingetje.
Zoals je kunt lezen in de bovengenoemde documentatie, moeten al deze gegevens arrays zijn.
In die sketch is de IP geen array, of vergis ik me nou ?
[/edit]
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

arnaudarduino

Bedankt voor zeer duidelijke uitleg.
Dit in/aangevuld, wel verbetering maar niet de oplossing.

Nu heb ik er een modem/router achter de experia geplaatst.
Deze ingesteld met de gegevens maar dan met aanpassing naar 192.168.1.1
Ik blij er werd wat verstuurd en kwam in de database. 1 minuut later nog 1 daarna weer stil.
Bij deze router een Draytek Vigor 2860 kan ik nat-sessions zien daar zie ik dat er telkens (nu nog) dat er verbinding gemaakt wordt met de website.
Op de ea manier wordt de gegevens overdracht tegen gehouden.
Aan de database is niets veranderd, waar verdwijnen de gegevens.
Conclusie arduino script werkt nog, er wordt verbinding gemaakt naar de website.
WORDT VERVOLGD.

MAS3

Ik raad je aan om contact op te nemen met Telfort, en ze te vragen of ze iets blokkeren met die router want daar lijkt het wel op.
Ik zou het trefwoord "netneutraliteit" laten vallen, omdat dat hier in het geding lijkt te raken.
Netneutraliteit gaat eigenlijk niet over het totaal blokkeren van verkeer, maar over het wel of niet voorrang geven aan bepaalde zaken.
Voorrang geven (ook als die service niet in gebruik is), is op Europees nivo niet toegestaan.
Als ze hier geen antwoord op kunnen en/of willen geven, dan zou ik ze om een andere router vragen (dus ander type), omdat dit ding niet doet wat jij verwacht van je "internet experience".
Als zij jou dan gaan vertellen dat je iets niet zou mogen doen via jouw verbinding, dan nogmaals netneutraliteit aankaarten.
Oftewel het gaat ze niets aan wat jij doet via jouw verbinding zolang het niet tot misbruik leidt.

O, en als je nog meer issues hebt met dit project, dan is het raadzaam als je je huidige code erbij plaatst (tussen [code][/code] tags natuurlijk).
Er zou inmiddels het een en ander aangepast moeten zijn in die code, en dan is het wel goed om de actuele versie te kunnen zien voor degenen die je willen helpen.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

arnaudarduino

#53
Oct 23, 2016, 04:18 pm Last Edit: Oct 23, 2016, 04:34 pm by arnaudarduino
Na veel andere test sketch(en) te hebben geprobeerd , oa ip achterhalen mbv MAC adres, enz en een simpele database input via web.
173x dezelfde sketch ingevoerd te hebben werkt het ineens.
Enige echte verandering in   ethernet.begin (mac) dus zonder ip.En mac adres zonder nummers maar de wel bekende tekst .
Nu werkt het , weer afwachten voor hoelang. En of de router het ip goed static houd.
Bij de experia box v8 zoek je eerst het ip van de arduino a.h.v mac adres en zet deze static
Code: [Select]

/* 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>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/*byte mac[] = {0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32};
IPAddress ip(192, 168, 1, 114);
// the router's gateway address:
IPAddress gateway(192, 168, 1, 1);
// the subnet:
IPAddress subnet(255, 255, 255, 0);*/

//IPAddress ip(192, 168, 2, 9);
IPAddress dnServer(8, 8, 8, 8);
IPAddress gateway(192,168,2,254);
IPAddress subnet(255, 255, 255, 0);
IPAddress server(188, 188, 188, 188);
//char serverName[] = "www.sitemijndomein.com";

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;
unsigned long mEVLT = 0;        // consumption low tariff
unsigned long mEVHT = 0;        // consumption high tariff
unsigned long mELLZ = 0;        // produced low tariff
unsigned long mEHLZ = 0;        // produced high tariff
unsigned long mEAV = 0;         // Actual consumption
unsigned long mEAA = 0;         // Actual ampere
unsigned long mEPV = 0;         // Actual delivery
unsigned long kwh = 0;          // pulse
unsigned long sum = 0;          // sum pulse
unsigned long mG = 0;           // Gas
unsigned long lastTime = 0;     // will store last time
unsigned long interval = 60000; // interval at which to blink (milliseconds)60000


volatile unsigned long rpk = 0;         // raw pulse kwh counter (private)
volatile unsigned long rpk_old = 0;     // value of last read (private)
volatile boolean CS_kwh = false;        // Critical Section for kwh meter (private)

// The interrupt routine
void Kirq()
{
 rpk++;                      // just increment raw pulse counter.
 if (rpk > 1000000000)       // reset pulse counter after 10e9 pulse = 500.000 KW
 {
   if (false == CS_kwh)    // in critical section? // assumption IRQ-call is handled atomic on arduino.
   {
     rpk -= rpk_old;
     rpk_old = 0;
   }
 }
}

// returns kwh's since last reset
float readkwh1()
{
 return rpk / 2000.0;        // one pulse = 0.5 watt.
}

// returns kwh's since last call
float readkwh()
{
 CS_kwh = true;              // Start Critical Section - prevent interrupt Kirq() from changing rpk & rpk_old ;
 long t = rpk;               // store the raw pulse counter in a temp var.
 long k = t - rpk_old;       // subtract last measure to get delta
 rpk_old = t;                // remember old value
 CS_kwh = false;             // End Critical Section
 return k / 2000.0;          // return delta, one pulse = 0.5 watt.
}



void setup()
{
 Serial.begin(115200);
 Serial.print("Start ");
 Serial.println(__FILE__);
 delay(1000);
//Ethernet.begin(mac, ip);
 Ethernet.begin(mac);
 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);

 // kwh interrupt attached to IRQ 0 = pin2
 attachInterrupt(0, Kirq, FALLING);
}

void loop()
{
 decodeTelegram();

 if (millis() - lastTime > interval) {
   lastTime = millis();
   // read the pulses
   kwh = readkwh1();
   sum += kwh;

   // send new data
   httpRequest();

   //Reset variables to zero for next run
   mEVLT = 0;
   mEVHT = 0;
   mELLZ = 0;
   mEHLZ = 0;
   mEAV = 0;
   mEAA = 0;
   mEPV = 0;
   mG = 0;
 }
}


bool decodeTelegram()
{
 bool newData = false;
 long tl = 0;
 long tld = 0;

 while (Serial.available())
 {
   input = Serial.read();
   Serial.write(input);
   buffer[bufpos++] = input & 127;
   char inChar = (char)input;
   if (input == '\n') // We received a new line (data up to \n)
   {
     newData = true;
     // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
     if (sscanf(buffer, "1-0:1.8.1(%ld.%ld" , &tl, &tld) == 2)
     {
       mEVLT = tl * 1000 + tld;
     }
     // 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)
     {
       mEVHT = tl * 1000 + tld;
     }
     // 1-0:2.8.1 = Elektra levering laag tarief (DSMR v4.0)
     if (sscanf(buffer, "1-0:2.8.1(%ld.%ld" , &tl, &tld) == 2)
     {
       mELLZ = tl * 1000 + tld;
     }
     // 1-0:2.8.2 = Elektra levering hoog tarief (DSMR v4.0)
     if (sscanf(buffer, "1-0:2.8.2(%ld.%ld" , &tl, &tld) == 2)
     {
       mEHLZ = tl * 1000 + tld;
     }
     // 1-0:1.7.0 = Elektra huidig verbruik (DSMR v4.0)
     if (sscanf(buffer, "1-0:1.7.0(%ld.%ld" , &tl , &tld) == 2)
     {
       mEAV = tl * 1000 + tld;
     }
     // 1-0:31.7.0 = Elektra stroom (DSMR v4.0)
     if (sscanf(buffer, "1-0:31.7.0(%ld" , &tl) == 1)

     {
       mEAA = tl;
       Serial.print("Ampere = ");
       Serial.print(mEAA);
       Serial.println(" ");
     }
     // 1-0:2.7.0 = Elektra geleverd (DSMR v4.0)
     if (sscanf(buffer, "1-0:2.7.0(%ld.%ld" , &tl , &tld) == 2)
     {
       mEPV = 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;
     break;
   }
 }
 return newData;
}


void httpRequest()
{
 // if there's a successful connection:
 if (client.connect(serverName, 80))
 { float kwh = readkwh();
   float sum = readkwh1();

   Serial.print("GET /logger/p3.php?mEVLT=");
   Serial.print(mEVLT);
   Serial.print("&mEVHT=");
   Serial.print(mEVHT);
   Serial.print("&mELLZ=");
   Serial.print(mELLZ);
   Serial.print("&mEHLZ=");
   Serial.print(mEHLZ);
   Serial.print("&mEAV=");
   Serial.print(mEAV);
   Serial.print("&mEAA=");
   Serial.print(mEAA);
   Serial.print("&mEPV=");
   Serial.print(mEPV);
   Serial.print("&kwh=");
   Serial.print(kwh, 4);
   Serial.print("&sum=");
   Serial.print(sum, 4);
   Serial.print("&mG=");
   Serial.print(mG);
   Serial.println(" HTTP/1.1");
   Serial.println("Host: sitemijndomein.com");
   Serial.println("User-Agent: arduino-ethernet");
   Serial.println("Connection: stop/close");
   Serial.println();
   Serial.println("web ");

   client.print("GET /logger/p3.php?mEVLT=");
   client.print(mEVLT);
   client.print("&mEVHT=");
   client.print(mEVHT);
   client.print("&mELLZ=");
   client.print(mELLZ);
   client.print("&mEHLZ=");
   client.print(mEHLZ);
   client.print("&mEAV=");
   client.print(mEAV);
   client.print("&mEAA=");
   client.print(mEAA);
   client.print("&mEPV=");
   client.print(mEPV);
   client.print("&kwh=");
   client.print(kwh, 4);
   client.print("&sum=");
   client.print(sum, 4);
   client.print("&mG=");
   client.print(mG);
   client.println(" HTTP/1.1");
   client.println("Host: sitemijndomein.com");
   client.println("User-Agent: arduino-ethernet");
   client.println("Connection: close");
   //Request complete; empty recieve buffer
   while (client.available())
   {
     //char c = client.read(); //gets byte from ethernet buffer

     if (client.available() == false)
     {
       delay(25); // give some extra time for next packet to arrive
     }
   }
   client.println();
   Serial.println("Success!");
 }
 else
 {
   Serial.println("Failed");
 }
 client.stop();

}



MAS3

Hoi.

Zoals te zien in de eerder vermelde documentatie, ondersteunt ethernet.h DHCP.
Als het bij jou "ineens" werkt nadat je alleen het MAC adres hebt opgegeven, dan is het zeer waarschijnlijk dat je daarmee ethernet.h kenbaar maakt dat ie DHCP moet raadplegen om een IP toegewezen te krijgen.
En zo staat dat trouwens ook in die documentatie.

Fijn dat ik dat nu ook geleerd heb (door jouw problemen), dit is precies waarom ik deelneem aan de discussies hier; leren door mee te denken aan oplossingen voor anderen.

Ik kan je ook nog wat meer vertellen over de problematiek waarmee je te maken hebt, en dat komt doordat je je nieuwe sketch hebt geplaatst.

Code: [Select]

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/*byte mac[] = {0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32};
IPAddress ip(192, 168, 1, 114);
// the router's gateway address:
IPAddress gateway(192, 168, 1, 1);
// the subnet:
IPAddress subnet(255, 255, 255, 0);*/

Hier zet je het MAC adres tussen {accolades},en de overige data tussen (haakjes).
Heb je het ook geprobeerd met alleen alles tussen de {} accolades ?
Dat is namelijk niet hetzelfde.
En zo staat het ook niet in het daar getoonde voorbeeld.
Ik weet niet of dit werkelijk een probleem is.
Ga er wel binnenkort maar eens mee spelen denk ik, maar ja, tijd he...
Maar als je dit nog niet eerder gezien hebt, zou ik toch eens proberen wat er gebeurt als je die gegevens tussen de {} accolades zet en zo vaste gegevens invult ipv van DHCP afhankelijk te zijn.
DHCP hoeft overigens helemaal geen probleem te zijn als je niet via het netwerk naar je Arduino hoeft te verbinden, maar alleen er uit wil gaan.

Overigens heb ik hier op het forum ooit eens een handtekening voorbij zien komen over hoe slim het is om telkens hetzelfde te doen, en steeds te verwachten dat er een ander resultaat zal zijn....
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Wonderzoek

Dit is al een wat ouder topic en weet ook niet of alles nu werkt. Maar ik heb ondertussen vaak genoeg ervaren dat sommige routers in combinatie met de W5100 chip dit op het Ethernet Shield wordt gebruikt een eigenaardigheid hebben waardoor registratie bij de router, eventueel in combinatie met DHCP, niet goed gaat.

Probleem is het volgende. Als de eerste drie bytes van het MAC-adres de hoogste bit gezet hebben, dan registreert de router het MAC-adres niet en is communicatie uitgesloten. Een oplossing die in al deze gevallen goed werkt, is de eerste drie bytes een karakter maken die in de ASCII-reeks voor leesbare tekens valt, i.e. 0-9 / a-z /A-Z (hex 30-39 / 61-7A / 41-5A).

Dus in plaats van
mac[] = {0xDE,0XAD,0XBE,0x00,0X00,0X01};

Gebruik je
mac[] = {0X54,0X4F,0X50,0x00,0x00,0x01};

Of dit een bug in de library of de W5100 chip is, heb ik nooit een goed antwoord kunnen vinden. Maar deze oplossing is wel bevestigd door gebruikers op meerdere forums en de ontwerpers bij Freetronics.


Jeroen

arnaudarduino

#56
Feb 06, 2018, 09:27 pm Last Edit: Feb 07, 2018, 05:37 pm by arnaudarduino
Deze sketch werkt, nu al een hele tijd goed.
Echter wil ik nu een arduino die alleen de s0 kwh meter leest en schrijft naar de database. De sketch hieronder is met P1 kabel naar slimmemeter, de 2de sketch is zonder p1.
Code: [Select]

/* 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>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/*byte mac[] = {0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32};
IPAddress ip(192, 168, 1, 114);
// the router's gateway address:
IPAddress gateway(192, 168,


bool decodeTelegram()
{
 bool newData = false;
 long tl = 0;
 long tld = 0;

 while (Serial.available())
 {
   input = Serial.read();
   Serial.write(input);
   buffer[bufpos++] = input & 127;
   char inChar = (char)input;
   if (input == '\n') // We received a new line (data up to \n)
  
   Serial.print("&kwh=");
   Serial.print(kwh, 4);
   Serial.print("&sum=");
   Serial.print(sum, 4);
   Serial.print("&mG=");
   Serial.print(mG);
   Serial.println(" HTTP/1.1");
   Serial.println("Host: sitemijndomein.com");
   Serial.println("User-Agent: arduino-ethernet");
   Serial.println("Connection: stop/close");
   Serial.println();
   Serial.println("web ");

   client.print("GET /logger/p3.php?mEVLT=");
   client.print(mEVLT);
   client.print("&mEVHT=");
   client.print(mEVHT);
   client.print("&mELLZ=");
   client.print(mELLZ);
   client.print("&mEHLZ=");
   client.print(mEHLZ);
   client.print("&mEAV=");
   client.print(mEAV);
   client.print("&mEAA=");
   client.print(mEAA);
   client.print("&mEPV=");
   client.print(mEPV);
   client.print("&kwh=");
   client.print(kwh, 4);
   client.print("&sum=");
   client.print(sum, 4);
   client.print("&mG=");
   client.print(mG);
   client.println(" HTTP/1.1");
   client.println("Host: sitemijndomein.com");
   client.println("User-Agent: arduino-ethernet");
   client.println("Connection: close");
   //Request complete; empty recieve buffer
   while (client.available())
   {
     //char c = client.read(); //gets byte from ethernet buffer

     if (client.available() == false)
     {
       delay(25); // give some extra time for next packet to arrive
     }
   }
   client.println();
   Serial.println("Success!");
 }
 else
 {
   Serial.println("Failed");
 }
 client.stop();

}



[/quote]

Code: [Select]
/*
 *    FILE: KWh monitoring
 *  AUTHOR: Rob Tillaart
 *    DATE: 2010 03 31
 *     URL: http://playground.arduino.cc/Main/EEM12L-32AKWhMonitoring
 *
 * PURPOSE: prototype KWh monitoring  
 *
 * Digital Pin layout ARDUINO
 * =============================
 *  2     IRQ 0    - to KW meter EEM12L-32A
 *
 * This KWh meter gives a pulse every 0.5 Watt
 */

//
// KWH SENSOR CODE
//
// TODO - make a class
//
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xAF, 0x82, 0x31, 0x30};
IPAddress ip(192, 168, 2, 7);
IPAddress dnServer(8, 8, 8, 8);
IPAddress gateway(192,168,2,254);
IPAddress subnet(255, 255, 255, 0);
IPAddress server(0,0,0,0);
char serverName[] = "www.mijnwebsite.com";

EthernetClient client;


char input;                     // incoming serial data (byte)
bool readnextLine = false;
#define BUFSIZE 500
char buffer[BUFSIZE];           //Buffer for serial data to find \n .

unsigned long kwh = 0;          // pulse
unsigned long sum = 0;          // sum pulse
unsigned long lastTime = 0;     // will store last time
unsigned long interval = 60000; // interval at which to blink (milliseconds)60000

volatile unsigned long rpk = 0;               // raw pulse KWH counter (private)
volatile unsigned long rpk_old = 0;           // value of last read (private)
volatile boolean CS_kwh = false;              // Critical Section for KWH meter (private)

// The interrupt routine
void Kirq()
{
  rpk++;                    // just increment raw pulse counter.
  if (rpk > 1000000000)     // reset pulse counter after 10e9 pulse = 500.000 KW
  {
    if (false == CS_kwh)    // in critical section?  // assumption IRQ-call is handled atomic on arduino.
    {
      rpk -= rpk_old;
      rpk_old = 0;
    }
  }
}

// returns kwh's since last reset
float readkwh1()
{
 return rpk / 1000.0;        // one pulse = 0.5 watt.
}

// returns kwh's since last call
float readkwh()
{
  CS_kwh = true;           // Start Critical Section - prevent interrupt Kirq() from changing rpk & rpk_old ;
      long t = rpk;            // store the raw pulse counter in a temp var.
      long k = t - rpk_old;    // subtract last measure to get delta
      rpk_old = t;             // remember old value
  CS_kwh = false;          // End Critical Section
  return k/2000.0;         // return delta, one pulse = 0.5 watt.
}

//
// SETUP
//
void setup()
{
   Serial.begin(115200);
 Serial.print("Start ");
 Serial.println(__FILE__);
 delay(1000);
//Ethernet.begin(mac, ip);
 Ethernet.begin(mac);
 delay(1000);
 pinMode(4, OUTPUT);         // SD select pin
 digitalWrite(4, HIGH);      // Explicitly disable SD
  // KWH interrupt attached to IRQ 0  = pin2
  attachInterrupt(0, Kirq, FALLING);
}
//
// MAIN LOOP
//
void loop()
{
 if (millis() - lastTime > interval) {
   lastTime = millis();
   // read the pulses
   kwh = readkwh1();
   sum += kwh;

   // send new data
   httpRequest();
  
    delay(1000);
  float kwh = readkwh();
  float sum = readkwh1();
  Serial.print("kwh: ");    
  Serial.print(kwh, 5);
  Serial.print("    ");
  Serial.println(sum, 5);
}
}
void httpRequest()
{
 // if there's a successful connection:
 if (client.connect(serverName, 80))
 { float kwh = readkwh();
   float sum = readkwh1();
   Serial.print("GET /datalogger/p32.php?kwh=");
   Serial.print(kwh, 4);
   Serial.print("&sum=");
   Serial.print(sum, 4);
   Serial.println(" HTTP/1.1");
   Serial.println("Host: mijnwebsite.com");
   Serial.println("User-Agent: arduino-ethernet");
   Serial.println("Connection: stop/close");
   Serial.println();
   Serial.println("web ");

   client.print("GET /datalogger/p32.php?kwh=");
   client.print(kwh, 4);
   client.print("&sum=");
   client.print(sum, 4);;
   client.println(" HTTP/1.1");
   client.println("Host: mijnwebsite.com");
   client.println("User-Agent: arduino-ethernet");
   client.println("Connection: close");
    //Request complete; empty recieve buffer
   while (client.available())
   {
     char c = client.read(); //gets byte from ethernet buffer

     if (client.available() == false)
     {
       delay(25); // give some extra time for next packet to arrive
     }
   }
   client.println();
   Serial.println("Success!");
 }
 else
 {
   Serial.println("Failed");
 }
 client.stop();
}

      

//
// END OF PROGRAM
//


In de Serial monitor  wordt de kwh en sum  wel  weergegeven echter gaat niet naar de database.
Ook de sketch hierboven schrijft niet naar de database wanneer p1 niet is aangesloten.
Vraag wat is de trigger die de actie verzenden naar database geeft.

arnaudarduino

De fout zat hem in oude MySQL ipv MySQLi en onverwacht  "else"

Code: [Select]
<?php
error_reporting
(E_ALL);

//Connect to database
include 'configp3.php';
include 
'opendb.php';

//Waardes van vorige wegschrijf actie ophalen
$query mysql_query("SELECT id, time, kwh, sum  FROM `pellets` ORDER BY `pellets`.`time`  DESC LIMIT 1");
$row mysql_fetch_array($query);


//GET variabelen naar andere variabele schrijven

$kwh $_GET["kwh"];
$sum $_GET["sum"];


//GET variabelen op 'integer' zetten 

settype($kwh"integer");
settype($sum"integer");
 

   
$SQL = ("INSERT INTO md1452255.pellets (kwh, sum) VALUES ('".$_GET["kwh"]."','".$_GET["sum"]."')");  
mysql_query($SQL);
}
[
s]else { 

    
//Foutieve waarden wegschrijven naar tabel voor latere debugging
    
$SQL "INSERT INTO md1452255.faulty_pellets (kwh, sum) VALUES ('".$_GET["kwh"]."','".$_GET["sum"]."')";    
    
mysql_query($SQL);
}[/
s]


?>

Go Up