Skip to content

Commit

Permalink
Added hourly data and usage state
Browse files Browse the repository at this point in the history
  • Loading branch information
linsvensson committed Nov 30, 2020
1 parent 194c033 commit 7c700ca
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 17 deletions.
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ key | type | description
**platform (Required)** | string | `greenely`
**email (Required)** | string | Your Greenely username.
**password (Required)** | string | Your Greenely password.
**usage (Optional)** | boolean | Creates a sensor showing usage data. Default `true`.
**usage (Optional)** | boolean | Creates a sensor showing usage data. The state of this sensor is yesterday's total usage. Default `true`.
**prices (Optional)** | boolean | Creates a sensor showing price data. Default `true`.
**show_hourly (Optional)** | boolean | Show yesterday's hourly data. Default `false`.
**usage_days (Optional)** | number | How many days of usage data you want. Default `10`.
**date_format (Optional)** | string | Default `%b %d %Y`, shows up as `Jan 18 2020`. [References](https://strftime.org/)
**time_format (Optional)** | string | Default `%H:%M`, shows up as `10:00`. [References](https://strftime.org/)

## Example
**Configuration with default settings:**
Expand All @@ -50,7 +52,9 @@ sensor:
password: 1234
usage: true
prices: false
show_hourly: true
usage_days: 4
time_format: '%H'
date_format: '%d/%m/%Y'
```
Expand Down Expand Up @@ -120,5 +124,9 @@ sensor:
```
**days**
```json
[{ "date": "Jan 12 2020", "usage": "1.0" }]
[{ "date": "Jan 12 2020", "usage": "11.0" }]
```
**hourly**
```json
[{ "time": "10:00", "usage": "1.0" }]
```
44 changes: 29 additions & 15 deletions custom_components/greenely/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,19 @@
SENSOR_PRICES_NAME = 'Greenely Prices'

DATE_FORMAT_DEFAULT = '%b %d %Y'
TIME_FORMAT_DEFAULT = '%H:%M'
USAGE_DAYS_DEFAULT = 10
SHOW_HOURLY_DEFAULT = False

CONF_EMAIL = 'email'
CONF_PASSWORD = 'password'

CONF_USAGE_DAYS = 'usage_days'
CONF_USAGE = 'usage'
CONF_PRICES = 'prices'
CONF_SHOW_HOURLY = 'show_hourly'
CONF_DATE_FORMAT = 'date_format'
CONF_TIME_FORMAT = 'time_format'

MONITORED_CONDITIONS_DEFAULT = [
'is_retail_customer',
Expand All @@ -48,6 +52,8 @@
vol.Optional(CONF_PRICES): cv.boolean,
vol.Optional(CONF_USAGE_DAYS): cv.positive_int,
vol.Optional(CONF_DATE_FORMAT): cv.string,
vol.Optional(CONF_TIME_FORMAT): cv.string,
vol.Optional(CONF_SHOW_HOURLY): cv.boolean,
})

SCAN_INTERVAL = timedelta(minutes=60)
Expand All @@ -61,6 +67,9 @@ async def async_setup_platform(hass, config, async_add_entities,
date_format = config.get(CONF_DATE_FORMAT)
if date_format is None:
date_format = DATE_FORMAT_DEFAULT
time_format = config.get(CONF_TIME_FORMAT)
if time_format is None:
time_format = TIME_FORMAT_DEFAULT
show_usage = config.get(CONF_USAGE)
if show_usage is None:
show_usage = True
Expand All @@ -70,11 +79,14 @@ async def async_setup_platform(hass, config, async_add_entities,
usage_days = config.get(CONF_USAGE_DAYS)
if usage_days is None:
usage_days = USAGE_DAYS_DEFAULT
show_hourly = config.get(CONF_SHOW_HOURLY)
if show_hourly is None:
show_hourly = SHOW_HOURLY_DEFAULT

api = GreenelyAPI(email, password)
entities = []
if show_usage:
entities.append(GreenelyUsageSensor(SENSOR_USAGE_NAME, api, usage_days, date_format))
entities.append(GreenelyUsageSensor(SENSOR_USAGE_NAME, api, usage_days, show_hourly, date_format, time_format))
if show_prices:
entities.append(GreenelyPricesSensor(SENSOR_PRICES_NAME, api, date_format))
async_add_entities(entities, True)
Expand Down Expand Up @@ -154,15 +166,17 @@ def make_attribute(self, name, response, nameOfPriceAttr):
class GreenelyUsageSensor(Entity):
"""Representation of a Greenely usage sensor."""

def __init__(self, name, api, usage_days, date_format):
def __init__(self, name, api, usage_days, show_hourly, date_format, time_format):
"""Initialize a Greenely usage sensor."""
self._name = name
self._icon = "mdi:power-socket-eu"
self._state = 0
self._state_attributes = {}
self._unit_of_measurement = 'kWh'
self._usage_days = usage_days
self._show_hourly = show_hourly
self._date_format = date_format
self._time_format = time_format
self._api = api

@property
Expand Down Expand Up @@ -211,28 +225,28 @@ def update(self):

def make_attribute(self, date, today, response):
points = response.get('points', None)
yesterday = today - timedelta(days = 1)
daily_usage = 0
data = {}
yesterday_data = []
for point in points:
if (date == today):
_LOGGER.error("point " + str(point))
for key, value in point.items():
_LOGGER.error("GEBEGG " + str(key) + str(value))

pointTimestamp = datetime.fromtimestamp(point['timestamp'])
if (pointTimestamp.hour == datetime.now().hour):
usage_now = 0
usage_point = point['usage']
if usage_point != None and usage_point != 0:
usage_now += (usage_point / 1000)
self._state = usage_now
_LOGGER.error('usage: ' + str(usage_now))
usage = point['usage']
if (date == yesterday):
daily_data = {}
time = datetime.fromtimestamp(point['timestamp'])
daily_data['time'] = time.strftime(self._time_format)
yesterday_usage = point['usage']
daily_data['usage'] = str(yesterday_usage / 1000) if yesterday_usage != 0 and yesterday_usage != None else str(0)
yesterday_data.append(daily_data)
if usage != None and usage != 0:
daily_usage += usage
if daily_usage != 0:
data['date'] = date.strftime(self._date_format)
data['usage'] = str(daily_usage / 1000)
if (date == yesterday):
self._state = data['usage'] if daily_usage != 0 else 0
if self._show_hourly:
self._state_attributes['hourly'] = yesterday_data
return data

class GreenelyAPI():
Expand Down

0 comments on commit 7c700ca

Please sign in to comment.