From affd4e7df36d7c063ee1a583b1e8cdcbea02d1e0 Mon Sep 17 00:00:00 2001
From: Jesse Rizzo <32472573+jesserizzo@users.noreply.github.com>
Date: Thu, 2 Aug 2018 16:14:43 -0500
Subject: [PATCH] Add Enphase Envoy component (#15081)

* add enphase envoy component

* Add Enphase Envoy component for energy monitoring

* Fix formatting problems

* Fix formatting errors

* Fix formatting errors

* Fix formatting errors

* Change unit of measurement to W or Wh. Return sensor states as integers

* Fix formatting errors

* Fix formatting errors

* Fix formatting errors

* Move import json to update function

* Fix formatting. Add file to .coveragerc

* Add new component to requirements_all.txt

* Move API call to third party library on PyPi

* Refactor

* Run gen_requirements_all.py

* Minor refactor

* Fix indentation

* Fix indentation
---
 .coveragerc                                   |   1 +
 .../components/sensor/enphase_envoy.py        | 107 ++++++++++++++++++
 requirements_all.txt                          |   3 +
 3 files changed, 111 insertions(+)
 create mode 100644 homeassistant/components/sensor/enphase_envoy.py

diff --git a/.coveragerc b/.coveragerc
index 5dd2c66b56e..f42bd5cd3db 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -636,6 +636,7 @@ omit =
     homeassistant/components/sensor/eddystone_temperature.py
     homeassistant/components/sensor/eliqonline.py
     homeassistant/components/sensor/emoncms.py
+    homeassistant/components/sensor/enphase_envoy.py
     homeassistant/components/sensor/envirophat.py
     homeassistant/components/sensor/etherscan.py
     homeassistant/components/sensor/fastdotcom.py
diff --git a/homeassistant/components/sensor/enphase_envoy.py b/homeassistant/components/sensor/enphase_envoy.py
new file mode 100644
index 00000000000..3c132fcf7df
--- /dev/null
+++ b/homeassistant/components/sensor/enphase_envoy.py
@@ -0,0 +1,107 @@
+"""
+Support for Enphase Envoy solar energy monitor.
+
+For more details about this platform, please refer to the documentation at
+https://home-assistant.io/components/sensor.enphase_envoy/
+"""
+import logging
+
+import voluptuous as vol
+
+from homeassistant.helpers.entity import Entity
+from homeassistant.components.sensor import PLATFORM_SCHEMA
+import homeassistant.helpers.config_validation as cv
+from homeassistant.const import (CONF_IP_ADDRESS, CONF_MONITORED_CONDITIONS)
+
+
+REQUIREMENTS = ['envoy_reader==0.1']
+_LOGGER = logging.getLogger(__name__)
+
+SENSORS = {
+    "production": ("Envoy Current Energy Production", 'W'),
+    "daily_production": ("Envoy Today's Energy Production", "Wh"),
+    "7_days_production": ("Envoy Last Seven Days Energy Production", "Wh"),
+    "lifetime_production": ("Envoy Lifetime Energy Production", "Wh"),
+    "consumption": ("Envoy Current Energy Consumption", "W"),
+    "daily_consumption": ("Envoy Today's Energy Consumption", "Wh"),
+    "7_days_consumption": ("Envoy Last Seven Days Energy Consumption", "Wh"),
+    "lifetime_consumption": ("Envoy Lifetime Energy Consumption", "Wh")
+    }
+
+
+ICON = 'mdi:flash'
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+    vol.Required(CONF_IP_ADDRESS): cv.string,
+    vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SENSORS)):
+        vol.All(cv.ensure_list, [vol.In(list(SENSORS))])})
+
+
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Set up the Enphase Envoy sensor."""
+    ip_address = config[CONF_IP_ADDRESS]
+    monitored_conditions = config[CONF_MONITORED_CONDITIONS]
+
+    # Iterate through the list of sensors
+    for condition in monitored_conditions:
+        add_devices([Envoy(ip_address, condition, SENSORS[condition][0],
+                           SENSORS[condition][1])], True)
+
+
+class Envoy(Entity):
+    """Implementation of the Enphase Envoy sensors."""
+
+    def __init__(self, ip_address, sensor_type, name, unit):
+        """Initialize the sensor."""
+        self._ip_address = ip_address
+        self._name = name
+        self._unit_of_measurement = unit
+        self._type = sensor_type
+        self._state = None
+
+    @property
+    def name(self):
+        """Return the name of the sensor."""
+        return self._name
+
+    @property
+    def state(self):
+        """Return the state of the sensor."""
+        return self._state
+
+    @property
+    def unit_of_measurement(self):
+        """Return the unit of measurement of this entity, if any."""
+        return self._unit_of_measurement
+
+    @property
+    def icon(self):
+        """Icon to use in the frontend, if any."""
+        return ICON
+
+    def update(self):
+        """Get the energy production data from the Enphase Envoy."""
+        import envoy_reader
+
+        if self._type == "production":
+            self._state = int(envoy_reader.production(self._ip_address))
+        elif self._type == "daily_production":
+            self._state = int(envoy_reader.daily_production(self._ip_address))
+        elif self._type == "7_days_production":
+            self._state = int(envoy_reader.seven_days_production(
+                self._ip_address))
+        elif self._type == "lifetime_production":
+            self._state = int(envoy_reader.lifetime_production(
+                self._ip_address))
+
+        elif self._type == "consumption":
+            self._state = int(envoy_reader.consumption(self._ip_address))
+        elif self._type == "daily_consumption":
+            self._state = int(envoy_reader.daily_consumption(
+                self._ip_address))
+        elif self._type == "7_days_consumption":
+            self._state = int(envoy_reader.seven_days_consumption(
+                self._ip_address))
+        elif self._type == "lifetime_consumption":
+            self._state = int(envoy_reader.lifetime_consumption(
+                self._ip_address))
diff --git a/requirements_all.txt b/requirements_all.txt
index 00d6df6b06e..3c67f00e5a0 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -308,6 +308,9 @@ enocean==0.40
 # homeassistant.components.sensor.envirophat
 # envirophat==0.0.6
 
+# homeassistant.components.sensor.enphase_envoy
+envoy_reader==0.1
+
 # homeassistant.components.sensor.season
 ephem==3.7.6.0
 
-- 
GitLab