Wattwatcher 0.2 – Nå med templogging og sms varsling

Fikk gjort om koden litt slik at den nå enkelt kan støtte flere kWh målere, samt at jeg nå har en 1wire port.  Dette lar meg logge temperaturer på sensorer(DS18B20) i hele huset på kun 1 ledningspar i en cat5 kabel. Kabelen kan ha en lengde på opptil 300m.

Les mer om 1Wire Templogging med Arduino

Jeg har også laget 3.5mm jack kontakter til LDR sensor, lcd og  1Wire nettet. Dette satt jeg på et custom  ProtoShield som nå kan stackes mellom Arduino og Ethernet shieldet.



Alle delene den består av: 

«Ferdig» montert og i drift ser det slik ut.. Henger i kablene enn så lenge.

LDR montert på hovedstrømmåleren:

Det hender jo at internettlinjen detter ned, eller at strømmen går,  i disse tilfellene blir det ikke registrert noe til databasen. Om det går 5 min eller mer mellom to registreringer så får jeg en sms om det. Og etter ytterligere en time så en ny. Dette er løst vha et php script som sjekker differanse mellom tidspunkt for siste rad i basen mot nåværende tidspunkt. Er dette mer enn 5 min, så sendes SMS, og jeg setter et «flagg» for at wattwatcher er offline. På den måten slipper jeg å varsles flere ganger for samme feil. Denne sjekken kjører via cron hvert 5 minutt, og neste gang den oppdager ny registrering så fjernes «offline» flagget, og sms sendes om at den nå er oppe å kjører.

php kode for sms varsling

<?
include ("db.php");
$watts = $_GET['watt'];
$pw = $_GET['pw'];
$temp1 = $_GET['temp1'];
$temp2 = $_GET['temp2'];
$mail_to="espen@gmx.no";
$mail_from="Powermeter";
$mail_sub="No update last 2 minutes";
$mail_mesg="Sjekk kWh tellern!!!";
$time = date("Y-m-d H:i:s");

$link = mysql_connect($mysql_host, $mysql_user, $mysql_pass) or die("Feil x01");

if ( $link ) {
mysql_select_db($mysql_db) or die(mysql_error());

$result = mysql_query("SELECT * FROM 14418_usage order by id DESC LIMIT 0,1 ") or die(mysql_error());
while($row = mysql_fetch_array($result))
{
$lastdate = $row['time'];

}

//Sjekker først om 5min sms er sendt.
$result2 = mysql_query("SELECT * FROM config where id= 1") or die(mysql_error());
while($row2 = mysql_fetch_array($result2))
{

$status5 = $row2['value'];

}

//Sjekker så om 60min sms er sendt.
$result2 = mysql_query("SELECT * FROM config where id= 2") or die(mysql_error());
while($row2 = mysql_fetch_array($result2))
{

$status60 = $row2['value'];

}

echo"lastupdate: ".$lastdate."&lt;br&gt;";

//$curtime = date("Ymdhi", strtotime(date("Y-m-d h:i:s")));
$curtime = time();
echo"curtime: ".$curtime."&amp;amp;amp;amp;amp;amp;amp;lt;br&amp;amp;amp;amp;amp;amp;amp;gt;";
$lastupdate = strtotime($lastdate);
echo"lastupdate stamp: ".$lastupdate."&amp;amp;amp;amp;amp;amp;amp;lt;br&amp;amp;amp;amp;amp;amp;amp;gt;";
$diff =  $curtime - $lastupdate;
echo "Det er : ". $diff ." sekunder siden oppdatering.&amp;amp;amp;amp;amp;amp;amp;lt;br&amp;amp;amp;amp;amp;amp;amp;gt;";

}
if ($diff &amp;amp;amp;amp;amp;amp;amp;lt; "300") // Vi har ferske data, sjekker om sms er satt til sendt, hvis den er det så nuller vi flagget, slik at den kan sendes på nytt neste gang vi har feil..
{
if ($status5 == "1")
{
mysql_query("UPDATE config SET value = '0' WHERE id =1") or die(mysql_error());
$msg = "[online] last update: ";
$sendurl = sendsms($msg, $lastdate);
if (file_get_contents($sendurl)) {

echo "&amp;amp;amp;amp;amp;amp;amp;lt;BR&amp;amp;amp;amp;amp;amp;amp;gt;SMS er sendt!! OK&amp;amp;amp;amp;amp;amp;amp;lt;br\&amp;amp;amp;amp;amp;amp;amp;gt;";
//echo $sendurl;
}

else
{
echo "error while sending";
}

}

if ($status60 == "1")
{
mysql_query("UPDATE config SET value = '0' WHERE id =2") or die(mysql_error());
$msg = "[online] last update: ";
$sendurl = sendsms($msg, $lastdate);
if (file_get_contents($sendurl)) {

echo "&amp;amp;amp;amp;amp;amp;amp;lt;BR&amp;amp;amp;amp;amp;amp;amp;gt;SMS er sendt!! OK&amp;amp;amp;amp;amp;amp;amp;lt;br\&amp;amp;amp;amp;amp;amp;amp;gt;";

}

else
{
echo "error while sending";
}
}
}

if ($diff &amp;amp;amp;amp;amp;amp;amp;gt; "300") // Mer enn 5 min siden siste oppdatering. Vi sender sms

{

if ($status5 == "0") // SMS er ikke sendt, så vi sender nå.
{

$msg = "[5min]Ingen update siden: ";
$sendurl = sendsms($msg, $lastdate);
if (file_get_contents($sendurl)) {

echo "&amp;amp;amp;amp;amp;amp;amp;lt;BR&amp;amp;amp;amp;amp;amp;amp;gt;SMS er sendt!! OK&amp;amp;amp;amp;amp;amp;amp;lt;br\&amp;amp;amp;amp;amp;amp;amp;gt;";
//echo $sendurl;
}

else
{
echo "error while sending";
}

// Må nå lagre i DB at sms er sendt.
mysql_query("UPDATE config SET value = '1' WHERE id =1") or die(mysql_error());
}

}

if ($diff &amp;amp;amp;amp;amp;amp;amp;gt; "3600") // Mer enn 1 time siden siste oppdatering. Vi sender mail og sms på nytt.
{

$msg = "[60min] Ingen update siden: ";
$sendurl = sendsms($msg, $lastdate);
if (file_get_contents($sendurl)) {

echo "&amp;amp;amp;amp;amp;amp;amp;lt;BR&amp;amp;amp;amp;amp;amp;amp;gt;SMS er sendt!! OK&amp;amp;amp;amp;amp;amp;amp;lt;br\&amp;amp;amp;amp;amp;amp;amp;gt;";
//echo $sendurl;
}

else
{
echo "error while sending";
}

if(mail($mail_to,$mail_from,$mail_sub,$mail_mesg))
{
echo "&amp;amp;amp;amp;amp;amp;amp;lt;span class='red'&amp;amp;amp;amp;amp;amp;amp;gt;E-mail has been sent successfully from $mail_from to ###### &amp;amp;amp;amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;amp;amp;amp;gt;";
}
else
echo "&amp;amp;amp;amp;amp;amp;amp;lt;span class='red'&amp;amp;amp;amp;amp;amp;amp;gt;Failed to send the E-mail from $mail_from to #######&amp;amp;amp;amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;amp;amp;amp;gt;";
}

function sendsms($msg, $lastupdate)
{
$userid="sensur";
$time = date('Y-m-d H:i:s');
$password="sensur";
$last = $lastupdate;
$sender="WattWatcher";
$receiver="dittmobilnr;
$message= "[".$time ."]". $msg."[".$last."]";
$url="http://kjappsms.no/sms/SendSms.aspx?id=".$userid."&amp;amp;amp;amp;amp;amp;amp;amp;Password=".$password."&amp;amp;amp;amp;amp;amp;amp;amp;Sender=".$sender."&amp;amp;amp;amp;amp;amp;amp;amp;Recipient=".$receiver."&amp;amp;amp;amp;amp;amp;amp;amp;Msg=".urlencode($message);
return $url;
}

?&amp;amp;amp;amp;amp;amp;amp;gt;

Koden for Arduinoen er nå slik:

#include 
#include 
#include 
#include 
#define rxPin 2
#define txPin 3
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress utesensor = { 0x28, 0x7E, 0xF9, 0x5E, 0x2, 0x0, 0x0, 0x42 }; // loddet på 3.5mm
// DeviceAddress innetemp = { 0x28, 0xF0, 0x12, 0x5F, 0x02, 0x0 , 0x0, 0x9E }; //  på hylla
DeviceAddress innesensor = { 0x28,0x2A,0xDE,0x5E,0x02,0x00,0x00,0x19 }; // I BODEN.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte gw[] = {10,0,0,101};
byte server[] = { 88,87,42,5 }; // gmx.no
byte subnet[] = { 255, 255, 255, 0 };

SoftwareSerial lcdSerial =  SoftwareSerial(rxPin, txPin);
int ledPin = 6;
int avgwatt = 5;
int switchPin = 7;              
const int numReadings = 20;
unsigned long period_start;
unsigned long period_length = 57000;
unsigned long period_total;
unsigned long period_stop;
unsigned long run = 0;
int period_average;
int period_counter;
float itemp;
float utemp;

void setup()                    
{
  Serial.begin(9600);
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);  
  pinMode(switchPin, INPUT);    
  pinMode(ledPin, OUTPUT);
  lcdSerial.begin(9600); 
  sensors.begin();
  sensors.setResolution(innesensor, 12);
  sensors.setResolution(utesensor, 12);
}
void loop()                    
{
  sensors.requestTemperatures(); // Send the command to get temperatures
  lcdcls();
  period_total = 0;
  period_counter = 0;
  period_start = millis();
  period_stop = period_start + period_length;
  if (run > 0) {
     lcdgoTo(0);   
     lcdSerial.print(avgwatt);
     lcdSerial.print(" Current.  ");
     lcdgoTo(17);
     lcdSerial.print(period_average);
     lcdSerial.print(" Average.  ");

      }
      else {        // First run.. write no data.
     lcdgoTo(0);
     lcdSerial.print("No data.");
     lcdgoTo(17);
     lcdSerial.print("No data.");
       
      }
   
  while( millis() 
2 replies
  1. Tunlid
    Tunlid says:

    Veldig flott prosjekt 🙂
    Har du noe mere informasjon over utstyret du bruker og verktøy som brukes ?

  2. Espen
    Espen says:

    @Tunlid
    Heisann, kan skrive litt om det ja. I utganspunktet kommer man langt med en loddebolt 🙂
    Utstyret kjøpet jeg stort sett fra sparkfun.com, men finner en del på elfa/clas ohlson også.

    Noe spesielt du tenkte på?

Legg igjen et svar

Want to join the discussion?
Feel free to contribute!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *