Er wordt niet geschreven naar de mysql database.

Status
Niet open voor verdere reacties.

vogeltje39

Gebruiker
Lid geworden
27 sep 2006
Berichten
13
Hallo Graag jullie hulp.
Met een arduino lees ik een slimmemeter uit en een kwh meter met s0 bus.
Deze gegevens stuur ik naar een database middels get en insert to. Dit werkt prima.
Nu heb ik die sketch aangepast dat werkt , echter er wordt niks meer verstuurd naar de database.
De werking kan ik zien met serial monitor daar komen de gegevens ,ook laat deze zien dat er verbinding is met de database maar schrijven ho maar.
Code:
/*
 *    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
//

bij behorende php

Code:
<?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);
}
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);
}


?>

de inlog en wachtwoord gegevens zijn 100% goed.

Graag jullie hulp
 
Laatst bewerkt:
Heb je het script al droog geprobeerd, zonder tussenkomst van je Arduino-script?

Wat mij opvalt:
- Ik mis foutafhandeling in je PHP-code. Handel dit netjes af met if-else en mysql_error() of mysqli_error($conn) ($conn = variabele van je connectie).
- Ik zie dat je de oude MySQL-driver in PHP gebruikt welke in PHP7 ten einde is gekomen. Gebruik daarom bij sterke voorkeur de PHp-functies van MySQLi i.p.v. MySQL.
- Ik zie dat SQL-injection mogelijk is, je escapet je $_GET waarden niet in je query met mysql_real_escape_string(). Dit beschermt je ook bij invoer van een kwade characters zoals de '. Bij MySQLi is dit: mysqli_real_escape_string($conn); Waarbij $conn hier voor de variabele staat van je connectie.
 
Snap ik wel en niet.

Ik kan het niet aanpassen wat je hierboven schreef te weinig kennis.
Wel heb ik de andere sketch die wel werkt die is wat uitgebreider, die schrijft wel netjes naar de database.
Echter voor de toepassing welke ik wil gaan gebruiken heb ik geen slimmemeter dus die trigger is er niet.
Ik denk dat er geen "start" commando ,seintje (jip J) gegeven wordt.
De sketch
Code:
/* 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();

}

Met bijbehorende p3.php
Code:
<?php
error_reporting(E_ALL);

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

//Waardes van vorige wegschrijf actie ophalen
$query = mysql_query("SELECT laag_tarief, hoog_tarief, laag_tarief_geleverd, hoog_tarief_geleverd, huidig_verbruik, stroom_verbruik, huidig_geleverd, kwh, sum, gas  FROM `readings3` ORDER BY `readings3`.`time`  DESC LIMIT 1");
$row = mysql_fetch_array($query);
$previous_laag_tarief = $row[0];
$previous_hoog_tarief = $row[1];
$previous_laag_tarief_geleverd = $row[2];
$previous_hoog_tarief_geleverd = $row[3];
$previous_huidig = $row[4];
$previous_huidig_geleverd = $row[5];
$previous_gas = $row[6];
$min_vermogen = 0;
$max_vermogen = 230*25; //Maximale vermogen = 230V * vermogen hoofdzekering (1x25A)

//Alle opgehaalde variabelen op type 'INTEGER' zetten ivm vergelijken zometeen
settype($previous_elektra, "integer");
settype($previous_huidig, "integer");
settype($previous_huidig_geleverd, "integer");
settype($previous_gas, "integer");

//GET variabelen naar andere variabele schrijven
$mEVLT = $_GET["mEVLT"];
$mEVHT = $_GET["mEVHT"];
$mELLZ = $_GET["mELLZ"];
$mEHLZ = $_GET["mEHLZ"];
$mEAV = $_GET["mEAV"];
$mEAA = $_GET["mEAA"];
$mEPV = $_GET["mEPV"];
$kwh = $_GET["kwh"];
$sum = $_GET["sum"];
$mG = $_GET["mG"];

//GET variabelen op 'integer' zetten 
settype($mEVLT, "integer");
settype($mEVHT, "integer");
settype($mELLZ, "integer");
settype($mEHLZ, "integer");
settype($mEAV, "integer");
settype($mEAA, "integer");
settype($mEPV, "integer");
settype($kwh, "integer");
settype($sum, "integer");
settype($mG, "integer"); 


//Checken of binnengekomen standen voldoen aan eisen (meterstand = hoger dan vorige, huidig verbruik > minimale vermogen, kleiner dan maximale vermogen) om incorrecte waarden te negeren
if (
    $mEVLT >= $previous_laag_tarief
    && $mEVHT >= $previous_hoog_tarief 
    && $mG >= $previous_gas //Inkomende meterstand moet groter zijn dan vorige meterstand
    && $mG <= ($mG + 6000) //Gasmeter is type 'G6', which stands for max. 6m3/hour. So value can never be bigger than value + 6000
    && $mEAV >= $min_vermogen //Huidig verbruik moet groter zijn dan minimale verbruik (nachtverbruik)
    && $mEAV <= $max_vermogen //Huidig verbruik moet kleiner zijn dan max. vermogen 1fase aansluiting
    ) 
{ 
	$SQL = ("INSERT INTO md1452255.readings3 (laag_tarief, hoog_tarief, laag_tarief_geleverd, hoog_tarief_geleverd, huidig_verbruik, stroom_verbruik, huidig_geleverd,kwh,sum,gas) VALUES ('".$mEVLT."', '".$mEVHT."', '".$mELLZ."', '".$mEHLZ."', '".$mEAV."', '".$mEAA."', '".$mEPV."', '".$_GET["kwh"]."','".$_GET["sum"]."', '".$mG."')");  
	mysql_query($SQL);
}
else { 

    //Foutieve waarden wegschrijven naar tabel voor latere debugging
    $SQL = "INSERT INTO md1452255.faulty_readings3 (laag_tarief, hoog_tarief, laag_tarief_geleverd, hoog_tarief_geleverd, huidig_verbruik,  huidig_geleverd, gas, kwh, sum) VALUES           (NULL, NULL, '".$mEVLT."', '".$mEVHT."', '".$mELLZ."', '".$mEHLZ."', '".$mEAV."', '".$mEAA."', '".$mEPV."','".$_GET["kwh"]."','".$_GET["sum"]."', '".$mG."')";    
    mysql_query($SQL);
}


?>

Alvast bedankt, en hoop met jullie hulp script/sketch netjes te krijgen.
wellicht vertaald naar mySQLi .
 
Laatst bewerkt:
Daarom zeg ik: ga eerst het PHP-script eens droog uitvoeren, door hem direct uit te voeren in je browser, of via wget in de command-line.:

Code:
http://mijnwebsite.com/logger/p3.php?mEVLT=[waarde]&mELLZ=[waarde]&mEHLZ=[waarde]&mEAV=[waarde]&mEAA=[waarde]&mEPV=[waarde]&kwh=[waarde]&sum=[waarde]&mG=[waarde]

Die waardes staan voor: laag_tarief, hoog_tarief, laag_tarief_geleverd, hoog_tarief_geleverd, huidig_verbruik, stroom_verbruik, huidig_geleverd, kwh, sum, gas
Als alles goed gaat moeten die waardes worden opgeslagen in de database.
 
Laatst bewerkt:
Yes ,daar heb ik wat aan !
Nu nog aanpassen voor mySQLi, maar het werkt wel er wordt geschreven in de database.
Deze melding komt er nu, dus er moet wel wat veranderd worden:
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /public/sites/www.mijnwebsite.com/datalogger/opendb.php on line 3

En daar staat:
Code:
<?php
// This is an example opendb.php
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');
mysql_select_db($dbname);
?>

Dat moet dus voor nog 3 andere databases van mij , slik
 
Net wat ik dacht, je hebt PHP 5.6 die je al waarschuwt dat mysql-functies verouderd zijn. Dit kan je in php.ini aanpassen.

Waarom je Arduino-script niet jouw php-script niet oproept weet ik niet.
Misschien kan je wat vinden in het topic op Tweakers
 
Niet nodig nu, daar stond de vraag ook al uit echter lag het probleem niet daar maar aan mysql.
En door het in de browser in te vullen kwam de fout melding naar voren, namelijk onverwachte else deze eerst // gegeven daardoor werkt het voor nu.
Werkt nu goed.
Komen vast nog meer vragen ivm mysql naar MySQLi

Bedankt,
 
Opsich valt die ombouw wel mee. Voornamelijk is het meestal het toevoegen van een 'i' maar de connectie in de databasekeuze is nu één enkele functie: mysqli_connect(.....).
Let er ook op dat sommige functies de variabelen van je connectie nodig hebben.
 
...
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /public/sites/www.mijnwebsite.com/datalogger/opendb.php on line 3

En daar staat:
Code:
<?php
// This is an example opendb.php
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');
mysql_select_db($dbname);
?>

Dat moet dus voor nog 3 andere databases van mij , slik

tussen de sterf 'die' en de haakjes kan je geen spaties plaatsen omdat je dan de melding niet meer ziet vermoedelijk.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan