homebridge-enlighten-power
v1.1.3
Published
This plugin simulates a CO2 air quality accessory that you can switch to the "detected" state when the power produced by your Envoy solar system reaches a threshold.
Downloads
7
Maintainers
Readme
homebridge-enlighten-power
Description
This plugin simulates a CO2 air quality accessory that you can switch to the "detected" state when the power produced by your Envoy solar system reaches a threshold.
You can use this state to automate other tasks or just to get information.
Current power is not displayed directly, but appears in the accessory settings under "Current level" in [ppm], but it is [W].
It can work locally (with Bonjour or custom url) or via API.
Local API returns two production values: inverters and eim
{"production":[ { "type":"inverters", "wNow":5007, ....}, { "type":"eim", "wNow":5766.563, ....}]
The plug-in read eim value by default but you can override this behavior by adding "type": "inverters"
in config.json.
Bonjour
Example config.json for Bonjour (http://envoy.local/production.json):
"accessories": [
{
"accessory": "enlighten-power",
"name": "> 6000 W",
"type": "eim", // optionnal, default "eim"
"update_interval": 1,
"power_threshold": 6000,
}
]
Custom url
Example config.json for custom url:
"accessories": [
{
"accessory": "enlighten-power",
"name": "> 6000 W",
"type": "inverters", // optionnal, default "eim"
"url": "http://envoy_ip/production.json",
"update_interval": 1,
"power_threshold": 6000
}
]
API
Please note that API data is updated only every 15 minutes and access is limited:: https://developer.enphase.com/plans
The free plan allowing to make 10'000 requests per month, by default it refreshes every 5 minutes (12 * 24 * 31 = 8928).
Example config.json for API:
"accessories": [
{
"accessory": "enlighten-power",
"name": "> 6000 W",
"connection": "api",
"api_key": "API_KEY",
"api_user_id": "USER_ID",
"site_id": "SITE_ID",
"update_interval": 5,
"power_threshold": 6000
}
]
Bonus: aks with Python
You can ask the current power produced with this one line command:
curl -s "http://envoy.local/production.json" | python -c "import sys, json; print json.load(sys.stdin)['production'][1]['wNow']"
Result:
5788.47
Bonus: Python script and Piface2
In my case, I execute this script every minute to activate my boiler via Piface2 extension board when level of production reach 6000 W.
Install pifacedigitalio
Thanks to @rfennel who have manage to get it working with Buster:
- Get PIP (PIP3 for Python3)
sudo apt-get install python3-pip
- Get the libraries
sudo pip3 install pifacedigitalio
sudo pip3 install pifacecommon
- Make sure the SPI access is enabled to the IO (you get errors when you run the script if you miss this out)
sudo sed -i 's/#dtparam=spi=on/dtparam=spi=on/' /boot/config.txt
- Reboot
sudo reboot
Script can now be executed with python3 check_power_local.py
Script
check_power_local.py
import sys
import requests
import json
import pifacedigitalio
response = requests.get('http://envoy.local/production.json')
data = response.json()
current_power = data['production'][1]['wNow']
if isinstance(current_power, float):
pfd = pifacedigitalio.PiFaceDigital(init_board=False)
state = pfd.relays[0].value
if (current_power >= 6000):
if (state == 1):
print (current_power, "W - Relay already ON")
else:
pfd.relays[0].turn_on()
print(current_power, "W - Relay in now ON")
else:
if (state == 0):
print (current_power, "W - Relay already OFF")
else:
pfd.relays[0].turn_off()
print(current_power, "W - Relay in now OFF")
else:
print("Error")
exit()
Same for API, replace API_KEY, USER_ID and SITE_ID values:
check_power.py
import sys
import requests
import json
import pifacedigitalio
params = (
('key', 'API_KEY'),
('user_id', 'USER_ID'),
)
response = requests.get('https://api.enphaseenergy.com/api/v2/systems/SITE_ID/summary', params=params)
data = response.json()
current_power = data['current_power']
if isinstance(current_power, int):
pfd = pifacedigitalio.PiFaceDigital(init_board=False)
state = pfd.relays[0].value
if (current_power >= 6000):
if (state == 1):
print (current_power, "W - Relay already ON")
else:
pfd.relays[0].turn_on()
print(current_power, "W - Relay in now ON")
else:
if (state == 0):
print (current_power, "W - Relay already OFF")
else:
pfd.relays[0].turn_off()
print(current_power, "W - Relay in now OFF")
else:
print("Error")
exit()
cron example
Launch cron editor
crontab -e
Execute local script every minutes
# m h dom mon dow command
* * * * * python3 /home/pi/check_power_local.py