Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
faefd0b18b | ||
|
|
1192b833ca | ||
|
|
d440fed621 | ||
|
|
50fe1a8765 | ||
|
|
1cfff537d7 | ||
|
|
3acf847352 | ||
|
|
c0bf404f6a | ||
|
|
0a7f703100 |
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,7 +1,27 @@
|
||||
# Changelog
|
||||
|
||||
<!--next-version-placeholder-->
|
||||
## 2023.08.1 (2023-08-21)
|
||||
##2023.11.2 (2023-11-23)
|
||||
### Feature
|
||||
* Support added for V2 sock ([`50fe1a8`](https://github.com/ryanbdclark/owlet/commit/50fe1a87656b7d6413d06f06f3650fd0bfb48e02))
|
||||
* Added tests for binary sensors ([`50fe1a8`](https://github.com/ryanbdclark/owlet/commit/50fe1a87656b7d6413d06f06f3650fd0bfb48e02))
|
||||
### Fix
|
||||
* Bumping pyowletapi to 2023.11.4 to allow V2 support ([`50fe1a8`](https://github.com/ryanbdclark/owlet/commit/50fe1a87656b7d6413d06f06f3650fd0bfb48e02))
|
||||
* Refactoring ([`50fe1a8`](https://github.com/ryanbdclark/owlet/commit/50fe1a87656b7d6413d06f06f3650fd0bfb48e02))
|
||||
* Corrected spelling of sock disconnected sensor ([`50fe1a8`](https://github.com/ryanbdclark/owlet/commit/50fe1a87656b7d6413d06f06f3650fd0bfb48e02))
|
||||
|
||||
## 2023.11.1 (2023-11-16)
|
||||
### Fix
|
||||
* Bumping pyowletapi to 2023.11.1 ([`3acf847`](https://github.com/ryanbdclark/owlet/commit/3acf8473526665382b44ef6325d708a6c62fff45))
|
||||
* Sensors and binary sensors are now only created where the sock contains that property, this stops errors where different sock versions have different properties ([`3acf847`](https://github.com/ryanbdclark/owlet/commit/3acf8473526665382b44ef6325d708a6c62fff45))
|
||||
|
||||
## 2023.9.1 (2023-09-20)
|
||||
### Fix
|
||||
* Bumping pyowletapi to 2023.9.1 to allow for revisions ([`0a7f703`](https://github.com/ryanbdclark/owlet/commit/0a7f70310080a129c988e9607331baa2f6c691e0))
|
||||
* New revision of sock, revision 5 doesn't report all vitals as before, this would cause the integration to fail to update. Have adjusted the integration to detect the revision and ignore the vitals that are no longer reported ([`0a7f703`](https://github.com/ryanbdclark/owlet/commit/0a7f70310080a129c988e9607331baa2f6c691e0))
|
||||
|
||||
|
||||
## 2023.8.1 (2023-08-21)
|
||||
### Feature
|
||||
* 2 new sensors, movement and movement bucket disabled by default, thanks [`@seanford`](https://github.com/seanford) ([`575b213`](https://github.com/ryanbdclark/owlet/commit/575b213ddd732779cd7938e575fc87c8881a69b0))
|
||||
|
||||
@@ -17,11 +37,11 @@
|
||||
### Fix
|
||||
* Bumping pyowletapi to 2023.7.1 ([`c693fef`](https://github.com/ryanbdclark/owlet/commit/c693fefbf3dba8f35802b87d064401dadbb211b5))
|
||||
|
||||
## 2023.05.7 (2023-05-30)
|
||||
## 2023.5.7 (2023-05-30)
|
||||
### Fix
|
||||
* Fixed issue with binary sensors not loading, caused by change to way the coordinators are stored ([`8d17317`](https://github.com/ryanbdclark/owlet/commit/8d173174e286b0451cbb2c0d4ae3087028d1ea23))
|
||||
|
||||
## 2023.05.6 (2023-05-30)
|
||||
## 2023.5.6 (2023-05-30)
|
||||
### Fix
|
||||
* In light of submitting this as a pull request to the core of HA there have been some refactoring changes to comply with HA's style requirements
|
||||
* Sensor names now moved to strings file to allow for translations
|
||||
@@ -31,25 +51,25 @@
|
||||
### Feature
|
||||
* Tests added
|
||||
|
||||
## 2023.05.5 (2023-05-19)
|
||||
## 2023.5.5 (2023-05-19)
|
||||
#### Fix
|
||||
* Owlet refresh token becomes invalid after 24 hours. Meant that after 1 day the integration would stop working. Moved to pyowletapi v2023.5.28 which uses different refresh token, should no longer need reconfiguring after 24 hours ([`dc58b19`](https://github.com/ryanbdclark/owlet/commit/0141f7d01a9ac9b3e1dcc74cabb896e19bd4a821))
|
||||
|
||||
## 2023.05.4 (2023-05-17)
|
||||
## 2023.5.4 (2023-05-17)
|
||||
#### Fix
|
||||
* Bumping to pyowletapi 2023.5.25
|
||||
|
||||
## 2023.05.3 (2023-05-17)
|
||||
## 2023.5.3 (2023-05-17)
|
||||
#### Fix
|
||||
* Bumping to pyowletapi 2023.5.24
|
||||
* Reauthing now no longer re adds users' password to config entry
|
||||
|
||||
## 2023.05.2 (2023-05-16)
|
||||
## 2023.5.2 (2023-05-16)
|
||||
#### Feature
|
||||
* Integration now makes use of refresh token from pyowletapi to reauthenticate, user password in no longer stored by integration ([`dc710a1`](https://github.com/ryanbdclark/owlet/commit/dc710a1783a4cad9d6cf355240fe12ac779a87ef))
|
||||
* New sensors create for baby sleep state ([`9b3392b`](https://github.com/ryanbdclark/owlet/commit/9b3392bdbcd82015ed31d3a50a517e4e22905684))
|
||||
|
||||
## 2023.05.1 (2023-05-15)
|
||||
## 2023.5.1 (2023-05-15)
|
||||
#### Feature
|
||||
* Changed versioning to date based
|
||||
### Fix
|
||||
|
||||
@@ -8,13 +8,11 @@
|
||||
[![hacs][hacsbadge]][hacs]
|
||||
[![Project Maintenance][maintenance-shield]][user_profile]
|
||||
|
||||
A custom component for the Owlet smart sock, currently this only supports the owlet smart sock 3.
|
||||
|
||||
If you have a smart sock 2 and would like to contribute then please do so.
|
||||
A custom component for the Owlet smart sock
|
||||
|
||||
## Installation
|
||||
|
||||
1. Use [HACS](https://hacs.xyz/docs/setup/download), in `HACS > Integrations > Explore & Add Repositories` search for "Owlet". After adding this `https://github.com/ryanbdclark/owlet` as a custom repository.
|
||||
1. Use [HACS](https://hacs.xyz/docs/setup/download), in `HACS > Integrations > Explore & Add Repositories` search for "Owlet".
|
||||
2. Restart Home Assistant.
|
||||
3. [![Add Integration][add-integration-badge]][add-integration] or in the HA UI go to "Settings" -> "Devices & Services" then click "+" and search for "Owlet Smart Sock".
|
||||
|
||||
|
||||
@@ -42,18 +42,27 @@ SENSORS: tuple[OwletBinarySensorEntityDescription, ...] = (
|
||||
key="high_oxygen_alert",
|
||||
translation_key="high_ox_alrt",
|
||||
device_class=BinarySensorDeviceClass.SOUND,
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
OwletBinarySensorEntityDescription(
|
||||
key="low_oxygen_alert",
|
||||
translation_key="low_ox_alrt",
|
||||
device_class=BinarySensorDeviceClass.SOUND,
|
||||
),
|
||||
OwletBinarySensorEntityDescription(
|
||||
key="critical_oxygen_alert",
|
||||
translation_key="crit_ox_alrt",
|
||||
device_class=BinarySensorDeviceClass.SOUND,
|
||||
),
|
||||
OwletBinarySensorEntityDescription(
|
||||
key="low_battery_alert",
|
||||
translation_key="low_batt_alrt",
|
||||
device_class=BinarySensorDeviceClass.SOUND,
|
||||
),
|
||||
OwletBinarySensorEntityDescription(
|
||||
key="critical_battery_alert",
|
||||
translation_key="crit_batt_alrt",
|
||||
device_class=BinarySensorDeviceClass.SOUND,
|
||||
),
|
||||
OwletBinarySensorEntityDescription(
|
||||
key="lost_power_alert",
|
||||
translation_key="lost_pwr_alrt",
|
||||
@@ -86,11 +95,14 @@ async def async_setup_entry(
|
||||
|
||||
coordinators: OwletCoordinator = hass.data[DOMAIN][config_entry.entry_id].values()
|
||||
|
||||
async_add_entities(
|
||||
OwletBinarySensor(coordinator, sensor)
|
||||
for coordinator in coordinators
|
||||
for sensor in SENSORS
|
||||
)
|
||||
sensors = []
|
||||
for coordinator in coordinators:
|
||||
print(coordinator.sock.properties)
|
||||
for sensor in SENSORS:
|
||||
if sensor.key in coordinator.sock.properties:
|
||||
sensors.append(OwletBinarySensor(coordinator, sensor))
|
||||
|
||||
async_add_entities(sensors)
|
||||
|
||||
|
||||
class OwletBinarySensor(OwletBaseEntity, BinarySensorEntity):
|
||||
@@ -111,12 +123,9 @@ class OwletBinarySensor(OwletBaseEntity, BinarySensorEntity):
|
||||
"""Return true if the binary sensor is on."""
|
||||
state = self.sock.properties[self.entity_description.key]
|
||||
|
||||
entity = self.entity_description.key
|
||||
|
||||
if self.sock.properties["charging"] and entity in ["sleep_state"]:
|
||||
if self.entity_description.key == "sleep_state":
|
||||
if self.sock.properties["charging"]:
|
||||
return None
|
||||
|
||||
if entity == "sleep_state":
|
||||
if state in [8, 15]:
|
||||
state = False
|
||||
else:
|
||||
|
||||
@@ -12,7 +12,6 @@ from pyowletapi.exceptions import (
|
||||
OwletEmailError,
|
||||
OwletPasswordError,
|
||||
)
|
||||
from pyowletapi.sock import Sock
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant import config_entries, exceptions
|
||||
@@ -86,10 +85,8 @@ class OwletConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||
title=user_input[CONF_USERNAME],
|
||||
data={
|
||||
CONF_REGION: user_input[CONF_REGION],
|
||||
CONF_USERNAME: user_input[CONF_PASSWORD],
|
||||
CONF_API_TOKEN: token[CONF_API_TOKEN],
|
||||
CONF_OWLET_EXPIRY: token[CONF_OWLET_EXPIRY],
|
||||
CONF_OWLET_REFRESH: token[CONF_OWLET_REFRESH],
|
||||
CONF_USERNAME: user_input[CONF_USERNAME],
|
||||
**token,
|
||||
},
|
||||
options={CONF_SCAN_INTERVAL: POLLING_INTERVAL},
|
||||
)
|
||||
|
||||
@@ -5,7 +5,7 @@ DOMAIN = "owlet"
|
||||
CONF_OWLET_EXPIRY = "expiry"
|
||||
CONF_OWLET_REFRESH = "refresh"
|
||||
|
||||
SUPPORTED_VERSIONS = [3]
|
||||
SUPPORTED_VERSIONS = [2, 3]
|
||||
POLLING_INTERVAL = 5
|
||||
MANUFACTURER = "Owlet Baby Care"
|
||||
SLEEP_STATES = {0: "unknown", 1: "awake", 8: "light_sleep", 15: "deep_sleep"}
|
||||
|
||||
@@ -36,7 +36,7 @@ class OwletCoordinator(DataUpdateCoordinator):
|
||||
update_interval=timedelta(seconds=interval),
|
||||
)
|
||||
self.sock = sock
|
||||
self.config_entry = entry
|
||||
self.config_entry: ConfigEntry = entry
|
||||
|
||||
async def _async_update_data(self) -> None:
|
||||
"""Fetch the data from the device."""
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
from homeassistant.helpers.entity import DeviceInfo
|
||||
from homeassistant.helpers.device_registry import DeviceInfo
|
||||
|
||||
from .coordinator import OwletCoordinator
|
||||
from .const import DOMAIN, MANUFACTURER
|
||||
@@ -23,12 +23,12 @@ class OwletBaseEntity(CoordinatorEntity[OwletCoordinator], Entity):
|
||||
|
||||
@property
|
||||
def device_info(self) -> DeviceInfo:
|
||||
"""Return the device info of the device"""
|
||||
"""Return the device info of the device."""
|
||||
return DeviceInfo(
|
||||
identifiers={(DOMAIN, self.sock.serial)},
|
||||
name="Owlet Baby Care Sock",
|
||||
manufacturer=MANUFACTURER,
|
||||
model=self.sock.model,
|
||||
sw_version=self.sock.sw_version,
|
||||
hw_version=self.sock.version,
|
||||
hw_version=f"{self.sock.version}r{self.sock.revision}",
|
||||
)
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
{
|
||||
"domain": "owlet",
|
||||
"name": "Owlet Smart Sock",
|
||||
"codeowners": ["@ryanbdclark"],
|
||||
"codeowners": [
|
||||
"@ryanbdclark"
|
||||
],
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/owlet",
|
||||
"iot_class": "cloud_polling",
|
||||
"issue_tracker": "https://github.com/ryanbdclark/owlet/issues",
|
||||
"requirements": ["pyowletapi==2023.7.2"],
|
||||
"version":"2023.8.1"
|
||||
"requirements": [
|
||||
"pyowletapi==2023.11.4"
|
||||
],
|
||||
"version": "2023.11.2"
|
||||
}
|
||||
@@ -45,13 +45,6 @@ SENSORS: tuple[OwletSensorEntityDescription, ...] = (
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
icon="mdi:leaf",
|
||||
),
|
||||
OwletSensorEntityDescription(
|
||||
key="oxygen_10_av",
|
||||
translation_key="o2saturation10a",
|
||||
native_unit_of_measurement=PERCENTAGE,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
icon="mdi:leaf",
|
||||
),
|
||||
OwletSensorEntityDescription(
|
||||
key="heart_rate",
|
||||
translation_key="heartrate",
|
||||
@@ -92,6 +85,13 @@ SENSORS: tuple[OwletSensorEntityDescription, ...] = (
|
||||
icon="mdi:cursor-move",
|
||||
entity_registry_enabled_default=False,
|
||||
),
|
||||
OwletSensorEntityDescription(
|
||||
key="oxygen_10_av",
|
||||
translation_key="o2saturation10a",
|
||||
native_unit_of_measurement=PERCENTAGE,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
icon="mdi:leaf",
|
||||
),
|
||||
OwletSensorEntityDescription(
|
||||
key="movement_bucket",
|
||||
translation_key="movementbucket",
|
||||
@@ -113,11 +113,14 @@ async def async_setup_entry(
|
||||
hass.data[DOMAIN][config_entry.entry_id].values()
|
||||
)
|
||||
|
||||
async_add_entities(
|
||||
OwletSensor(coordinator, sensor)
|
||||
for coordinator in coordinators
|
||||
for sensor in SENSORS
|
||||
)
|
||||
sensors = []
|
||||
|
||||
for coordinator in coordinators:
|
||||
for sensor in SENSORS:
|
||||
if sensor.key in coordinator.sock.properties:
|
||||
sensors.append(OwletSensor(coordinator, sensor))
|
||||
|
||||
async_add_entities(sensors)
|
||||
|
||||
|
||||
class OwletSensor(OwletBaseEntity, SensorEntity):
|
||||
@@ -157,7 +160,7 @@ class OwletSensor(OwletBaseEntity, SensorEntity):
|
||||
return self.sock.properties[self.entity_description.key]
|
||||
|
||||
@property
|
||||
def options(self) -> list[str]:
|
||||
def options(self) -> list[str] | None:
|
||||
"""Set options for sleep state."""
|
||||
if self.entity_description.key != "sleep_state":
|
||||
return None
|
||||
|
||||
@@ -54,14 +54,20 @@
|
||||
"low_ox_alrt": {
|
||||
"name": "Low oxygen alert"
|
||||
},
|
||||
"crit_ox_alrt": {
|
||||
"name": "Critical oxygen alert"
|
||||
},
|
||||
"low_batt_alrt": {
|
||||
"name": "Low battery alert"
|
||||
},
|
||||
"crit_batt_alrt": {
|
||||
"name": "Critical battery alert"
|
||||
},
|
||||
"lost_pwr_alrt": {
|
||||
"name": "Lost power alert"
|
||||
},
|
||||
"sock_discon_alrt": {
|
||||
"name": "Sock diconnected alert"
|
||||
"name": "Sock disconnected alert"
|
||||
},
|
||||
"sock_off": {
|
||||
"name": "Sock off"
|
||||
|
||||
@@ -54,14 +54,20 @@
|
||||
"low_ox_alrt": {
|
||||
"name": "Low oxygen alert"
|
||||
},
|
||||
"crit_ox_alrt": {
|
||||
"name": "Critical oxygen alert"
|
||||
},
|
||||
"low_batt_alrt": {
|
||||
"name": "Low battery alert"
|
||||
},
|
||||
"crit_batt_alrt": {
|
||||
"name": "Critical battery alert"
|
||||
},
|
||||
"lost_pwr_alrt": {
|
||||
"name": "Lost power alert"
|
||||
},
|
||||
"sock_discon_alrt": {
|
||||
"name": "Sock diconnected alert"
|
||||
"name": "Sock disconnected alert"
|
||||
},
|
||||
"sock_off": {
|
||||
"name": "Sock off"
|
||||
|
||||
@@ -54,14 +54,20 @@
|
||||
"low_ox_alrt": {
|
||||
"name": "Low oxygen alert"
|
||||
},
|
||||
"crit_ox_alrt": {
|
||||
"name": "Critical oxygen alert"
|
||||
},
|
||||
"low_batt_alrt": {
|
||||
"name": "Low battery alert"
|
||||
},
|
||||
"crit_batt_alrt": {
|
||||
"name": "Critical battery alert"
|
||||
},
|
||||
"lost_pwr_alrt": {
|
||||
"name": "Lost power alert"
|
||||
},
|
||||
"sock_discon_alrt": {
|
||||
"name": "Sock diconnected alert"
|
||||
"name": "Sock disconnected alert"
|
||||
},
|
||||
"sock_off": {
|
||||
"name": "Sock off"
|
||||
|
||||
4
info.md
4
info.md
@@ -8,9 +8,7 @@
|
||||
[![hacs][hacsbadge]][hacs]
|
||||
[![Project Maintenance][maintenance-shield]][user_profile]
|
||||
|
||||
A custom component for the Owlet smart sock, currently this only supports the owlet smart sock 3.
|
||||
|
||||
If you have a smart sock 2 and would like to contribute then please do so.
|
||||
A custom component for the Owlet smart sock
|
||||
|
||||
## Installation
|
||||
|
||||
|
||||
1211
tests/fixtures/update_properties_v2.json
vendored
Normal file
1211
tests/fixtures/update_properties_v2.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
188
tests/test_binary_sensor.py
Normal file
188
tests/test_binary_sensor.py
Normal file
@@ -0,0 +1,188 @@
|
||||
"""Test Owlet Sensor."""
|
||||
from __future__ import annotations
|
||||
|
||||
from homeassistant.core import HomeAssistant
|
||||
|
||||
from . import async_init_integration
|
||||
|
||||
|
||||
async def test_sensors_asleep(hass: HomeAssistant) -> None:
|
||||
"""Test sensor values."""
|
||||
await async_init_integration(
|
||||
hass, properties_fixture="update_properties_asleep.json"
|
||||
)
|
||||
|
||||
assert len(hass.states.async_all("binary_sensor")) == 10
|
||||
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_charging").state == "off"
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_high_heart_rate_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_heart_rate_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_high_oxygen_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_oxygen_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_battery_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_lost_power_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_sock_disconnected_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_sock_off").state == "off"
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_awake").state == "off"
|
||||
|
||||
|
||||
async def test_sensors_awake(hass: HomeAssistant) -> None:
|
||||
"""Test sensor values."""
|
||||
await async_init_integration(
|
||||
hass, properties_fixture="update_properties_awake.json"
|
||||
)
|
||||
|
||||
assert len(hass.states.async_all("binary_sensor")) == 10
|
||||
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_charging").state == "off"
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_high_heart_rate_alert"
|
||||
).state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_heart_rate_alert").state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_high_oxygen_alert").state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_oxygen_alert").state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_battery_alert").state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_lost_power_alert").state
|
||||
== "on"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_sock_disconnected_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_sock_off").state == "off"
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_awake").state == "on"
|
||||
|
||||
|
||||
async def test_sensors_charging(hass: HomeAssistant) -> None:
|
||||
"""Test sensor values."""
|
||||
await async_init_integration(
|
||||
hass, properties_fixture="update_properties_charging.json"
|
||||
)
|
||||
|
||||
assert len(hass.states.async_all("binary_sensor")) == 10
|
||||
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_charging").state == "on"
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_high_heart_rate_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_heart_rate_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_high_oxygen_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_oxygen_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_battery_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_lost_power_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_sock_disconnected_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_sock_off").state == "off"
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_awake").state == "unknown"
|
||||
)
|
||||
|
||||
|
||||
async def test_sensors_v2(hass: HomeAssistant) -> None:
|
||||
"""Test sensor values."""
|
||||
await async_init_integration(hass, properties_fixture="update_properties_v2.json")
|
||||
assert len(hass.states.async_all("binary_sensor")) == 9
|
||||
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_charging").state == "off"
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_high_heart_rate_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_heart_rate_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_oxygen_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("binary_sensor.owlet_baby_care_sock_low_battery_alert").state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_critical_battery_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_critical_oxygen_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert (
|
||||
hass.states.get(
|
||||
"binary_sensor.owlet_baby_care_sock_sock_disconnected_alert"
|
||||
).state
|
||||
== "off"
|
||||
)
|
||||
assert hass.states.get("binary_sensor.owlet_baby_care_sock_sock_off").state == "off"
|
||||
@@ -70,7 +70,7 @@ async def test_flow_wrong_password(hass: HomeAssistant) -> None:
|
||||
user_input=CONF_INPUT,
|
||||
)
|
||||
assert result["type"] == FlowResultType.FORM
|
||||
assert result["errors"] == {"base": "invalid_password"}
|
||||
assert result["errors"] == {"password": "invalid_password"}
|
||||
|
||||
|
||||
async def test_flow_wrong_email(hass: HomeAssistant) -> None:
|
||||
@@ -88,7 +88,7 @@ async def test_flow_wrong_email(hass: HomeAssistant) -> None:
|
||||
user_input=CONF_INPUT,
|
||||
)
|
||||
assert result["type"] == FlowResultType.FORM
|
||||
assert result["errors"] == {"base": "invalid_email"}
|
||||
assert result["errors"] == {"username": "invalid_email"}
|
||||
|
||||
|
||||
async def test_flow_credentials_error(hass: HomeAssistant) -> None:
|
||||
@@ -193,7 +193,7 @@ async def test_reauth_invalid_password(hass: HomeAssistant) -> None:
|
||||
|
||||
assert result["type"] == FlowResultType.FORM
|
||||
assert result["step_id"] == "reauth_confirm"
|
||||
assert result["errors"] == {"base": "invalid_password"}
|
||||
assert result["errors"] == {"password": "invalid_password"}
|
||||
|
||||
|
||||
async def test_reauth_unknown_error(hass: HomeAssistant) -> None:
|
||||
|
||||
@@ -43,7 +43,7 @@ async def test_async_setup_entry(hass: HomeAssistant) -> None:
|
||||
|
||||
entities = er.async_entries_for_device(entity_registry, device_entry.id)
|
||||
|
||||
assert len(entities) == 8
|
||||
assert len(entities) == 18
|
||||
|
||||
await entry.async_unload(hass)
|
||||
|
||||
|
||||
@@ -107,3 +107,20 @@ async def test_sensors_charging(hass: HomeAssistant) -> None:
|
||||
== "unknown"
|
||||
)
|
||||
assert hass.states.get("sensor.owlet_baby_care_sock_sleep_state").state == "unknown"
|
||||
|
||||
|
||||
async def test_sensors_v2(hass: HomeAssistant) -> None:
|
||||
"""Test sensor values."""
|
||||
await async_init_integration(hass, properties_fixture="update_properties_v2.json")
|
||||
assert len(hass.states.async_all("sensor")) == 4
|
||||
|
||||
assert (
|
||||
hass.states.get("sensor.owlet_baby_care_sock_battery_percentage").state == "29"
|
||||
)
|
||||
assert hass.states.get("sensor.owlet_baby_care_sock_heart_rate").state == "145"
|
||||
assert hass.states.get("sensor.owlet_baby_care_sock_o2_saturation").state == "99"
|
||||
|
||||
assert (
|
||||
hass.states.get("sensor.owlet_baby_care_sock_signal_strength").state == "98.0"
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user