homebridge-enlighten-power
Version:
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.
209 lines (161 loc) • 5.71 kB
Markdown
<p align="center">
<a href="https://github.com/homebridge/homebridge"><img src="https://raw.githubusercontent.com/homebridge/branding/master/logos/homebridge-color-round-stylized.png" height="140"></a>
</p>
<span align="center">
# homebridge-enlighten-power
[](https://www.npmjs.com/package/homebridge-enlighten-power) [](https://www.npmjs.com/package/homebridge-enlighten-power)
</span>
## 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](http://envoy.local/production.json)):
```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:
```json
"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](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:
```json
"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:
```bash
curl -s "http://envoy.local/production.json" | python -c "import sys, json; print json.load(sys.stdin)['production'][1]['wNow']"
```
Result:
```bash
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](https://github.com/piface/pifacedigitalio/issues/39#issuecomment-633291166) with Buster:
1. Get PIP (PIP3 for Python3)
`sudo apt-get install python3-pip`
2. Get the libraries
`sudo pip3 install pifacedigitalio`
`sudo pip3 install pifacecommon`
3. 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`
4. Reboot
`sudo reboot`
Script can now be executed with `python3 check_power_local.py`
#### Script
*check_power_local.py*
```python
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*
```python
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
```shell
crontab -e
```
Execute local script every minutes
```
# m h dom mon dow command
* * * * * python3 /home/pi/check_power_local.py
```