Wifi live solar power display

A simple visual display of live solar power generation data from on a RGB LED dial

Similar projects worth following
I wanted a way to quickly see how much solar power I am generating at a glance. So I created this wifi connected display dial to connect to my home wifi network, download the latest live power generation interval data from pvoutput and display it. The dial connects to pvoutput every 5 minutes to grab the latest interval data.

The final goal is to get my power usage data in there too and be able to clearly see how much power is being used directly and how much is being either imported from or exported to the grid. Then I can load shift (i.e. make decisions about when and how I consume energy) with the latest live info. For now, the dial shows total solar power generated.


The first step was to get the solar data from my Growatt 3000MTL inverter online into, which is a great tool for uploading and comparing PV data. The method for getting the data into pvoutput is beyond the scope of this project (but was accomplished using these excellent instructions by Sander Plug and a raspberry pi).

The data stored in pvoutput is the live power (in Watts), and is loaded at 5 minute intervals.


I have used a NodeMCU board which takes care of powering and connecting USB to the ESP8266 module and breaks out the pins to allow easy breadboard prototyping. The display is a 24 Neopixel Ring using addressable LEDS (WS2812). The neopixels are being powered through the NodeMCU board's VIN pin (so there are limits on overall LED current draw, but plenty of power for this application). The NodeMCU board is programmed using the Arduino IDE plugin for ESP8266, which works seamlessly.

For now, the parts are loaded into an enclosure made from a mineral water bottle lid, some plastic from a milk bottle and a rubber band...really just to hold it together until I can make a nice 3D printed or laser cut enclosure.

The device is powered by USB.


The code is programmed with the Arduino IDE using the ESP8266 plugin, which was surprisingly straightforward to use. The Wifi connections are handled with the ESP8266Wifi.h library (thanks ESP8266 community!) and the LEDs are driven with the Adafruit_Neopixel.h library (Thanks Adafruit!).

You can get the code here.


The display shows one green pixel per full 200 Watts of output. As my system usually sees up to a maximum of 3kW (3000W) this will use up to 15 pixels. The data is truncated to show only full multiples of 200 Watts. So if I have 2000 Watts I see 10 green pixels. If I have 1999 Watts I see 9 green pixels. If the power is zero, there is a single blue LED to show that the system is powered on. When power is less than 200 Watts, the display shows a single yellow pixel to show there is some power generation, but not enough to light a full pixel. I hope to add some pixels for error reporting later.

  • 1 × NodeMCU v1.0 (ESP8266 12E)
  • 1 × 24 Neopixel Ring generic 24 x WS2812 RGB LED Ring
  • 1 × Small Breadboard 170 points
  • 1 × 470 Ohm, 1/4W resistor
  • 1 × 470 uF, 25v Electrolytic Capacitor (probably a bit bigger than strictly required)

View all 10 components

  • 1
    Step 1

    Hookup guide - here are some basic details to make the connections. See the parts list for values.

    VCC on the neopixel ring is attached to VIN on the NodeMCU

    GND on the neopixel ring is attached to GND on the NodeMCU

    The capacitor is placed across VCC and GND.

    IN on the neopixel ring is attached, via the resistor, to D1 / GPIO5 on the NodeMCU which is pin 5 in the Arduino code.

    The whole thing is powered by USB connected to the NodeMCU.

  • 2
    Step 2

    See the links to the code in Github if you would like to try to implement this. You will need to fill in some of your own details for your wifi network and your pvoutput account.

    Replace <your network ssid> and <your network password> with…you guessed it…your SSID and password (the login details for your wifi).

    const char* ssid     = "<your network ssid>"; // The ssid of your wifi network
    const char* password = "<your network password>"; // the password for your wifi network
  • 3
    Step 3

    To use this, you need to have an account at and have live data being loaded to it. The code assumes 5 minute interval data, but will still work if your interval is longer. To log into your account and grab the data, you need to add your pvoutput sid and API key in place of <your pvoutput sid> and <your pvoutput API key> respectively. You can find these under "settings" once you have logged into

    const char* sid = "<your pvoutput sid>"; // sid
    const char* key = "<your pvoutput API key>"; // API key

View all 4 instructions

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates