The need for an Enphase Envoy Solar monitor
I decided to set up an Envoy solar panel monitoring system for my solar installation after a fuse and the breaker panel broke down leaving me without solar generation for a couple stretches during near-peak, up to about 1,400 kWh, or about $140-210 worth of solar generation. Here’s the output of the Enphase Envoy Solar report:
Monitor Components (physical and software)
- A RaspberryPi Zero W on the same wireless network as the Envoy controller was set up on (initially used PiBakery to configure hostname/wifi/username/password, but the project is a little bit stale at this point).
- A Nexmo account (part of Vonage APIs now) to allow for SMS alerts on zero output when the sun is up.
- RubySunrise for only emailing alerts from dusk until dawn.
- Ruby Gmail and a Gmail account for email informational “down” alerts just to be aware that the cron job is running.
- cron and gmail
Connections and Configuration for the Raspberry Pi Script
These are described in the source code repo as well
- ENVOY_HOST for me was
envoy.local, but depending on your DNS situation, your mileage may vary. I got my local DNS in a weird enough state that I just looked up the envoy.local IP on my wireless router’s status page and used that.
- USERNAME and PASSWORD are the Gmail username and app-specific password credentials I generated for the gmail account I used.
- INVERTER_COUNT is compared to the number of inverters you should have so that even if the array is producing, you can still generate an error if one of them isn’t reporting (only valid when producing)
- LATITUDE and LONGITUDE plucked from a site that displays your geolocation… this, along with your TZ represented in a form within the TZInfo::Timezone list, and RubySunrise allow you to figure out if the sun’s up.
- NEXMO* are api keys and config from the Nexmo site (NEXMO_SMS_TO is your personal mobile to alert to)
- TO_EMAIL is the email to actually mail to
Code for the Raspberry Pi Solar Monitor script
.config must be of the form that follows but the rest of the code can be cloned from envoy-rpi-zero-monitor
USERNAME='some.burner.gmail.account' PASSWORD='gmai1@cc0untp@$$w0rd' TO_EMAILemail@example.com' NEXMO_API_KEY="3ab3789123" NEXMO_API_SECRET="123456sSD8dh" NEXMO_SMS_FROM="19281123581" NEXMO_SMS_TO="15551112222" LATITUDE=20.1237899 LONGITUDE=-57.3364631 TZ='America/Chicago' ENVOY_HOST='192.168.1.222' INVERTER_COUNT=100
# crontab runs every hours and inits rbenv to use the right ruby version because # I didn't really care about "production readiness"... it's a Raspberry Pi Zero W 0 * * * * cd /home/twill/envoy-rpi-zero-monitor && eval "$(rbenv init -)" && ruby read-envoy.rb
This is specific to building for the Enlighten Envoy
This all depends on having an Enphase Enlighten Envoy (and a bunch of other random “E” names) as your solar monitor, but if you have a relatively recent solar install and your technician needed to configure the monitor for your wifi, then you probably have a similar device with a pollable endpoint. Look at your wireless router’s web console and you’ll see that monitor:
If you browse to that name or the IP address associated, you’ll probably get a web page with status. If you reload with the network tab up, you’ll probably see it retrieve the data via a .json endpoint. Fortunately there is no envoy solar login for the data collector at envoy.local for my system, so the data can be accessed directly via that json, and there was no need for an Enphase Envoy manual.
From there, you can build your own monitor around it.