Files
hass-fpl/custom_components/fpl/sensor.py
2020-11-08 22:47:37 +00:00

119 lines
3.4 KiB
Python

import logging
from datetime import datetime, timedelta
from .fplapi import FplApi
import aiohttp
import asyncio
from homeassistant.helpers.entity import Entity
from homeassistant import util
from homeassistant.helpers.event import async_call_later
from homeassistant.const import (
CONF_NAME,
EVENT_CORE_CONFIG_UPDATE,
STATE_UNKNOWN,
CONF_USERNAME,
CONF_PASSWORD,
STATE_UNKNOWN,
ATTR_FRIENDLY_NAME,
)
from .const import DOMAIN, DOMAIN_DATA, ATTRIBUTION
from .DailyUsageSensor import FplDailyUsageSensor
from .AverageDailySensor import FplAverageDailySensor
from .ProjectedBillSensor import FplProjectedBillSensor
_LOGGER = logging.getLogger(__name__)
MIN_TIME_BETWEEN_SCANS = timedelta(minutes=30)
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=60)
def setup(hass, config):
return True
async def async_setup_entry(hass, config_entry, async_add_entities):
accounts = config_entry.data.get("accounts")
fpl_accounts = []
for account in accounts:
_LOGGER.info(f"Adding fpl account: {account}")
fpl_accounts.append(FplSensor(hass, config_entry.data, account))
fpl_accounts.append(FplDailyUsageSensor(hass, config_entry.data, account))
fpl_accounts.append(FplAverageDailySensor(hass, config_entry.data, account))
fpl_accounts.append(FplProjectedBillSensor(hass, config_entry.data, account))
async_add_entities(fpl_accounts)
class FplSensor(Entity):
def __init__(self, hass, config, account):
self._config = config
self._state = None
self.loop = hass.loop
self._account = account
self._data = None
async def async_added_to_hass(self):
await self.async_update()
@property
def device_info(self):
return {
"identifiers": {(DOMAIN, self._account)},
"name": f"Account {self._account}",
"manufacturer": "Florida Power & Light",
}
@property
def unique_id(self):
"""Return the ID of this device."""
id = "{}{}".format(DOMAIN, self._account)
return id
@property
def name(self):
return f"{DOMAIN.upper()} {self._account}"
@property
def state(self):
data = self._data
if type(data) is dict:
if "budget_bill" in data.keys():
if data["budget_bill"]:
if "budget_billing_projected_bill" in data.keys():
self._state = data["budget_billing_projected_bill"]
else:
if "projected_bill" in data.keys():
self._state = data["projected_bill"]
return self._state
# @property
# def unit_of_measurement(self):
# return "$"
@property
def icon(self):
return "mdi:flash"
@property
def state_attributes(self):
return self._data
@util.Throttle(MIN_TIME_BETWEEN_SCANS, MIN_TIME_BETWEEN_UPDATES)
async def async_update(self):
# Send update "signal" to the component
await self.hass.data[DOMAIN_DATA]["client"].update_data()
# Get new data (if any)
if "data" in self.hass.data[DOMAIN_DATA]:
data = self.hass.data[DOMAIN_DATA]["data"][self._account]
if data != {}:
self._data = data
self._data["attribution"] = ATTRIBUTION