Add POD support, sleep fitness sensor to EightSleep (#31874)

* Add POD support, sleep fitness sensor

* Black format changes

* Change dict formatting
This commit is contained in:
mezz64 2020-02-17 04:15:21 -05:00 committed by GitHub
parent b77f2670a7
commit 164e970ba0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 11 deletions

View file

@ -43,12 +43,14 @@ SIGNAL_UPDATE_USER = "eight_user_update"
NAME_MAP = {
"left_current_sleep": "Left Sleep Session",
"left_current_sleep_fitness": "Left Sleep Fitness",
"left_last_sleep": "Left Previous Sleep Session",
"left_bed_state": "Left Bed State",
"left_presence": "Left Bed Presence",
"left_bed_temp": "Left Bed Temperature",
"left_sleep_stage": "Left Sleep Stage",
"right_current_sleep": "Right Sleep Session",
"right_current_sleep_fitness": "Right Sleep Fitness",
"right_last_sleep": "Right Previous Sleep Session",
"right_bed_state": "Right Bed State",
"right_presence": "Right Bed Presence",
@ -57,14 +59,21 @@ NAME_MAP = {
"room_temp": "Room Temperature",
}
SENSORS = ["current_sleep", "last_sleep", "bed_state", "bed_temp", "sleep_stage"]
SENSORS = [
"current_sleep",
"current_sleep_fitness",
"last_sleep",
"bed_state",
"bed_temp",
"sleep_stage",
]
SERVICE_HEAT_SET = "heat_set"
ATTR_TARGET_HEAT = "target"
ATTR_HEAT_DURATION = "duration"
VALID_TARGET_HEAT = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=100))
VALID_TARGET_HEAT = vol.All(vol.Coerce(int), vol.Clamp(min=-100, max=100))
VALID_DURATION = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=28800))
SERVICE_EIGHT_SCHEMA = vol.Schema(
@ -101,7 +110,7 @@ async def async_setup(hass, config):
_LOGGER.error("Timezone is not set in Home Assistant.")
return False
timezone = hass.config.time_zone
timezone = str(hass.config.time_zone)
eight = EightSleep(user, password, timezone, partner, None, hass.loop)

View file

@ -2,7 +2,7 @@
"domain": "eight_sleep",
"name": "Eight Sleep",
"documentation": "https://www.home-assistant.io/integrations/eight_sleep",
"requirements": ["pyeight==0.1.2"],
"requirements": ["pyeight==0.1.3"],
"dependencies": [],
"codeowners": ["@mezz64"]
}

View file

@ -28,6 +28,11 @@ ATTR_ACTIVE_HEAT = "Heating Active"
ATTR_DURATION_HEAT = "Heating Time Remaining"
ATTR_PROCESSING = "Processing"
ATTR_SESSION_START = "Session Start"
ATTR_FIT_DATE = "Fitness Date"
ATTR_FIT_DURATION_SCORE = "Fitness Duration Score"
ATTR_FIT_ASLEEP_SCORE = "Fitness Asleep Score"
ATTR_FIT_OUT_SCORE = "Fitness Out-of-Bed Score"
ATTR_FIT_WAKEUP_SCORE = "Fitness Wakeup Score"
_LOGGER = logging.getLogger(__name__)
@ -151,7 +156,11 @@ class EightUserSensor(EightSleepUserEntity):
@property
def unit_of_measurement(self):
"""Return the unit the value is expressed in."""
if "current_sleep" in self._sensor or "last_sleep" in self._sensor:
if (
"current_sleep" in self._sensor
or "last_sleep" in self._sensor
or "current_sleep_fitness" in self._sensor
):
return "Score"
if "bed_temp" in self._sensor:
if self._units == "si":
@ -169,8 +178,12 @@ class EightUserSensor(EightSleepUserEntity):
"""Retrieve latest state."""
_LOGGER.debug("Updating User sensor: %s", self._sensor)
if "current" in self._sensor:
self._state = self._usrobj.current_sleep_score
self._attr = self._usrobj.current_values
if "fitness" in self._sensor:
self._state = self._usrobj.current_sleep_fitness_score
self._attr = self._usrobj.current_fitness_values
else:
self._state = self._usrobj.current_sleep_score
self._attr = self._usrobj.current_values
elif "last" in self._sensor:
self._state = self._usrobj.last_sleep_score
self._attr = self._usrobj.last_values
@ -193,6 +206,16 @@ class EightUserSensor(EightSleepUserEntity):
# Skip attributes if sensor type doesn't support
return None
if "fitness" in self._sensor_root:
state_attr = {
ATTR_FIT_DATE: self._attr["date"],
ATTR_FIT_DURATION_SCORE: self._attr["duration"],
ATTR_FIT_ASLEEP_SCORE: self._attr["asleep"],
ATTR_FIT_OUT_SCORE: self._attr["out"],
ATTR_FIT_WAKEUP_SCORE: self._attr["wakeup"],
}
return state_attr
state_attr = {ATTR_SESSION_START: self._attr["date"]}
state_attr[ATTR_TNT] = self._attr["tnt"]
state_attr[ATTR_PROCESSING] = self._attr["processing"]

View file

@ -1,6 +1,6 @@
heat_set:
description: Set heating level for eight sleep.
description: Set heating/cooling level for eight sleep.
fields:
duration: {description: Duration to heat at the target level in seconds., example: 3600}
duration: {description: Duration to heat/cool at the target level in seconds., example: 3600}
entity_id: {description: Entity id of the bed state to adjust., example: sensor.eight_left_bed_state}
target: {description: Target heating level from 0-100., example: 35}
target: {description: Target cooling/heating level from -100 to 100., example: 35}

View file

@ -1226,7 +1226,7 @@ pyeconet==0.0.11
pyedimax==0.2.1
# homeassistant.components.eight_sleep
pyeight==0.1.2
pyeight==0.1.3
# homeassistant.components.emby
pyemby==1.6