The operators of the national grid in Ireland provide information about the fuel mix used for electrical power generation. This is updated every 15 minutes and can be seen here http://www.eirgridgroup.com/how-the-grid-works/system-information/
Delving into the source for this page a little it is possible to locate the web resource for the fuel mix which, it turns out, returns data in JSON.
So, a little bit of building later….

Followed by a little bit of coding:
#include <ArduinoJson.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <SPI.h>
const char* ssid = "XXXXXXXXX";
const char* password = "XXXXXXXXXX";
StaticJsonDocument<1024> doc;
#define COAL 0
#define GAS 1
#define IMPORT 2
#define OTHER 3
#define RENEW 4
float coal, gas, import, other, renew;
float domestic;
void setup() {
SPI.begin(1, 4, 2, 3); // (int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting to Wifi");
writePL9823(0x00);
delay(1000);
writePL9823(0xffff00);
delay(1000);
}
Serial.println("Wifi ready");
}
void loop() {
// put your main code here, to run repeatedly:
if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status
HTTPClient http;
// Interesting discovery : setting the date/time to a future data returns the latest value
http.begin("http://smartgriddashboard.eirgrid.com/DashboardService.svc/data?area=fuelmix®ion=ALL&datefrom=17-Dec-2050+23:59&dateto=17-Dec-2050+23:59"); //Specify the URL
int httpCode = http.GET(); //Make the request
if (httpCode > 0) { // Http error?
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
deserializeJson(doc, payload);
coal = doc["Rows"][COAL]["Value"];
gas = doc["Rows"][GAS]["Value"];
import = doc["Rows"][IMPORT]["Value"];
other = doc["Rows"][OTHER]["Value"];
renew = doc["Rows"][RENEW]["Value"];
domestic = coal + gas + other + renew;
Serial.print("Total (without export)= ");
Serial.println(domestic);
Serial.print("Renew = ");
Serial.println(renew);
Serial.print("% = ");
Serial.println(renew / domestic);
if ( (renew / domestic) > 0.5)
{
writePL9823(0x00ff00);
}
else
{
writePL9823(0xff0000);
}
delay(15 * 60 * 1000); // wait 15 minutes as that is the update interval
}
else {
Serial.print("HTTP Error ");
Serial.println(httpCode);
writePL9823(0xff);
delay(10000);
}
http.end(); //Free the resources
}
}
void writePL9823(uint32_t Colour)
{
// each colour bit should map to 4 SPI bits.
// Format of Colour (bytes) 00RRGGBB
uint8_t SPI_Output[12];
int SrcIndex = 0;
int DestIndex = 0;
for (DestIndex = 0; DestIndex < 12; DestIndex++)
{
if (Colour & (1 << 23))
{
SPI_Output[DestIndex] = 0xe0;
}
else
{
SPI_Output[DestIndex] = 0x80;
}
Colour = Colour << 1;
if (Colour & (1 << 23))
{
SPI_Output[DestIndex] |= 0xe;
}
else
{
SPI_Output[DestIndex] |= 0x8;
}
Colour = Colour << 1;
}
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
SPI.transfer(SPI_Output, 12);
delay(10);
SPI.endTransaction();
}
And hey presto!
A traffic light which is green when renewable power on the grid is greater than 50%, red otherwise. This could inform you when is a good time to turn on the clothes dryer for example.
I wouldn’t recommend that this be used to control devices directly as there are many ways it could be hacked.