Home Monitoring (home made) – Export

Reading the export meter

Reading the export meter is relatively easy as the Arduino in the meter cupboard can be extended to have another light voltage converter to read the export meter.

So we purchased another part from CPC (for those interested in replicating this, you can use one of these: http://cpc.farnell.com/taos/tsl257-lf/sensor-light-voltage-converter/dp/SC12392?Ntt=SC12392)

The Arduino program then needed extending to attach another interrupt for the export meter. The only gotcha here is that the export meter flashes 1000 times for 1kh, but the import meter only 800 times for 1kwh.

And it looks like this:

arduino-meter-reader

The complete Arduino program:

#include <SPI.h>
#include <WiFi.h>
#include <WiFiUDP.h>

///////// CHANGEABLE VALUES /////////

double importMultiplier = 1.25;
double exportMultiplier = 1.0;

char ssid[] = "REPLACE THIS";
char pass[] = "REPLACE THIS";

char pompeii[] = "192.168.0.16";
int pompeiiPort = 80;

double minutesBetweenCalls = 1.0;

///////// CHANGEABLE VALUES ABOVE /////////

int status = WL_IDLE_STATUS;

WiFiClient pompeiiClient;
char pompeiiService[] = "/pvoutput-post.php";

unsigned long importImpulseCount = 0;
unsigned long exportImpulseCount = 0;

unsigned long lastTimeUploaded = millis();

boolean importInterruptAttached = false;
boolean exportInterruptAttached = false;

double millisecondsPerMinute = 60000.0;
double timeBetweenCalls = minutesBetweenCalls * millisecondsPerMinute;

void setup() {
  Serial.begin(9600);
  connectToWiFi();
}

void connectToWiFi()
{
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:    
    status = WiFi.begin(ssid, pass);

    delay(5000);
  }

  Serial.print("Connected to the network");
  printWifiData();
}

void loop() {
  addImportFlashInterrupt();
  addExportFlashInterrupt();

  if (isTimeToUploadData())
  {
    Serial.println("Uploading data");
    sendResultsToPompeii();
  }
}

void addImportFlashInterrupt()
{
  if (!importInterruptAttached)
  {
    importInterruptAttached = true;
    Serial.println("Attaching import interrupt on pin 3");
    attachInterrupt(1, flashImport, FALLING);
  }
}

void addExportFlashInterrupt()
{
  if (!exportInterruptAttached)
  {
    exportInterruptAttached = true;
    Serial.println("Attaching export interrupt on pin 2");
    attachInterrupt(0, flashExport, FALLING);
  }
}

boolean isTimeToUploadData() {
  unsigned long time = millis();

  if( (time - lastTimeUploaded) >= timeBetweenCalls) {
    Serial.println("Time to upload");
    lastTimeUploaded = time;
    return true;
  }
  return false;
}


void printWifiData() {
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
}

/* Handles the interrupt flash logic */
void flashImport() {
  importImpulseCount++;
}

void flashExport() {
  exportImpulseCount++;
}

void sendResultsToPompeii() {
  Serial.println("sendResultsToPompeii");

  String postData = getPostData();
  Serial.println(postData);

  if (pompeiiClient.connect(pompeii, pompeiiPort)) {
    Serial.println("connected to pompeii");
    // Make a HTTP request:
    pompeiiClient.print("POST ");
    pompeiiClient.print(pompeiiService);
    pompeiiClient.println(" HTTP/1.1");
    pompeiiClient.print("Host: ");
    pompeiiClient.print(pompeii);
    pompeiiClient.print(":");
    pompeiiClient.println(pompeiiPort);
    pompeiiClient.println("Accept: text/html");
    pompeiiClient.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8");
    pompeiiClient.print("Content-Length: ");
    pompeiiClient.println(postData.length());
    pompeiiClient.println("Pragma: no-cache");
    pompeiiClient.println("Cache-Control: no-cache");
    pompeiiClient.println("Connection: close");
    pompeiiClient.println();

    pompeiiClient.println(postData);
    pompeiiClient.println();

    pompeiiClient.stop();
    pompeiiClient.flush();
    Serial.println("Called pompeii");
  }
}

String calculateImportWattsAndResetFlashes()
{
  if (importImpulseCount == 0UL) {
    return "0";
  }

  double watts = (importImpulseCount * importMultiplier);
  Serial.print("Calculated Import Watts: ");
  Serial.println(watts);
  
  importImpulseCount = 0UL;
  
  return doubleToString(watts);
}

String calculateExportWattsAndResetFlashes()
{
  if (exportImpulseCount == 0UL) {
    return "0";
  }

  double watts = (exportImpulseCount * exportMultiplier);
  Serial.print("Calculated Export Watts: ");
  Serial.println(watts);
  
  exportImpulseCount = 0UL;
  
  return doubleToString(watts);
}

String doubleToString(double valueToConvert)
{
  char doubleChar[15];
  dtostrf(valueToConvert,9,2,doubleChar);
  String dts = String(doubleChar);
  Serial.println(dts);
  return dts;
}

String getPostData()
{
  String importWatts = calculateImportWattsAndResetFlashes();
  String exportWatts = calculateExportWattsAndResetFlashes();
  
  String wattHourPeriod = doubleToString(timeBetweenCalls);
  
  return "iw=" + importWatts + "&ew=" + exportWatts + "&msBetweenCalls=" + wattHourPeriod;
}

Next Part

Part 3: Reading the temperature of the hot water tank

Home Monitoring (home made) – Overview

We have been working towards monitoring more and more items within the house to see the benefits of the solar array. Last time I posted an article about the meter reader which uses an Arduino and a light voltage converter to read the impulses from the import meter (a huge thanks goes out to Lars for his post here: http://www.lindnilsson.dk/lars/en/powermeter.php) but we wanted to expand on that and add in:

(Because of the size of the code, this article has been split in to separate pages)

And finally the results of all work!

The real cost of GU10s

Before we had the kitchen upgraded, the dining room had the brightest lights (eight, 40 watt standard bulbs) and it was thee room to be in during the winter because of the light. That all changed when we had a new kitchen fitted back in 2001. Back then the modern(ish) thing to have in your redecorated room were GU10 halogen spotlights and we had 9 added in the kitchen and 4 in the bathroom. Each GU10 spotlight uses 50 watts and when all on, the room is really well lit. While 50 watts might not seem a lot, when you work out how much that equates to over an average year, it soon adds up!

I’ve made a simple spreadsheet which roughly represents the cost to our family from having these spotlights on.

Click to download the spreadsheet. MD5 checksum: 8f90bce78a6fc865f1b7564b170121eb

If you’re interested in seeing what your own lighting costs you, simply fill in c7 through c18 with your estimated daily average time the lights are on each month, the number of bulbs, watts per bulb and the cost per unit of electricity (near total). The spreadsheet should add up the other values and present a total estimated yearly cost of using your lights.

Recently the cost of LEDs has dropped quite a bit and the technology has moved on too. We first bought an LED replacement GU10 over a year ago and were not impressed. The light produced was in a very narrow beam and bright blue! It made the entire room seem very cold. The second wasn’t much better. However the third one, which we bought in October 2011, is very impressive! It’s a 4 watt GU10 LED replacement with a warm white light. Having tested it out, the light is very similar to the old bulbs in the ceiling and the colour is no longer bright blue, but a slightly off white heading to yellow colour.

We’ll be upgrading the entire ceiling to use the new bulbs as soon as the price drops. Currently each bulb is £8.28 (including VAT), which would take a year and a half to make back, but as soon as the price drops to £5, I’ll be upgrading J

Interested in buying LED lights? See here: 4 watt GU10 LED warm white

Number of bulbs

9

Watts per bulb

50

Total kWh

0.45

Estimated number of hours a day lights on Total days in month Estimated hours per month Estimated kWh per month
January

3

31

93

41.85

February

3

28

84

37.8

March

2.5

31

77.5

34.875

April

2

30

60

27

May

1.5

31

46.5

20.925

June

1

30

30

13.5

July

1

31

31

13.95

August

1.5

31

46.5

20.925

September

2

30

60

27

October

2.5

31

77.5

34.875

November

3

30

90

40.5

December

3

31

93

41.85

Total

365

789

355.05

Price per unit (pence)

17.5

Total estimated cost per year (pounds)

£62.13