mirror of
https://github.com/sudoxnym/sleepd.git
synced 2026-04-14 11:37:11 +00:00
575 lines
No EOL
20 KiB
Python
575 lines
No EOL
20 KiB
Python
import logging
|
|
from homeassistant.components.button import ButtonEntity
|
|
from homeassistant.helpers import device_registry as dr
|
|
from .const import DOMAIN, INTEGRATION_NAME, MODEL, CONF_NAME
|
|
import asyncio
|
|
|
|
# Set up logging
|
|
# _LOGGER = logging.getLogger(__name__)
|
|
|
|
class SAASSleepTrackingStart(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Sleep Tracking Start button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target # Store notify_target as an instance variable
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_sleep_tracking_start_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Sleep Tracking Start"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.alarmclock.START_SLEEP_TRACK",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASSleepTrackingStop(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Sleep Tracking Stop button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_sleep_tracking_stop_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Sleep Tracking Stop"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.alarmclock.STOP_SLEEP_TRACK",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASSleepTrackingPause(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Sleep Tracking Pause button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_sleep_tracking_pause_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Sleep Tracking Pause"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.ACTION_PAUSE_TRACKING",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASSleepTrackingResume(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Sleep Tracking Pause button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_sleep_tracking_resume_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Sleep Tracking Resume"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.ACTION_RESUME_TRACKING",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASAlarmClockSnooze(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Alarm Clock Snooze button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_alarm_clock_snooze_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Alarm Clock Snooze"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.alarmclock.ALARM_SNOOZE",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASAlarmClockDisable(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Alarm Clock Disable button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_alarm_clock_disable_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Alarm Clock Disable"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.alarmclock.ALARM_DISMISS_CAPTCHA",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASSleepTrackingStartWithAlarm(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Sleep Tracking Start with Alarm button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_sleep_tracking_start_with_alarm_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Sleep Tracking Start with Alarm"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.alarmclock.START_SLEEP_TRACK_WITH_IDEAL_ALARM_ACTION",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
class SAASLullabyStop(ButtonEntity):
|
|
def __init__(self, hass, name, notify_target):
|
|
"""Initialize the button."""
|
|
# _LOGGER.debug("Initializing SAAS Lullaby Stop button with name: %s", name)
|
|
self._hass = hass
|
|
self._name = name
|
|
self._notify_target = notify_target
|
|
self._state = "off"
|
|
# _LOGGER.debug("Button initialized with state: %s", self._state)
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Return a unique ID."""
|
|
unique_id = f"saas_lullaby_stop_{self._name}"
|
|
# _LOGGER.debug("Getting unique ID for the button: %s", unique_id)
|
|
return unique_id
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the button."""
|
|
name = f"SAAS {self._name} Lullaby Stop"
|
|
# _LOGGER.debug("Getting name of the button: %s", name)
|
|
return name
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the button is on."""
|
|
# _LOGGER.debug("Checking if the button is on. Current state: %s", self._state)
|
|
return self._state == "on"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return information about the device."""
|
|
device_info = {
|
|
"identifiers": {(DOMAIN, self._name)},
|
|
"name": self._name,
|
|
"manufacturer": INTEGRATION_NAME,
|
|
"model": MODEL,
|
|
}
|
|
# _LOGGER.debug("Getting device information: %s", device_info)
|
|
return device_info
|
|
|
|
def press(self):
|
|
"""Press the button."""
|
|
service_name = self._notify_target # Remove the "notify." prefix
|
|
|
|
service_data = {
|
|
"message": "command_broadcast_intent",
|
|
"data": {
|
|
"intent_package_name": "com.urbandroid.sleep",
|
|
"intent_action": "com.urbandroid.sleep.ACTION_LULLABY_STOP_PLAYBACK",
|
|
},
|
|
}
|
|
# _LOGGER.debug("Pressing the button with service call:\n"
|
|
# "service: %s\n"
|
|
# "data:\n"
|
|
# "%s", service_name, service_data)
|
|
self._hass.services.call(
|
|
"notify",
|
|
service_name,
|
|
service_data,
|
|
blocking=True,
|
|
)
|
|
self._state = "on"
|
|
self.schedule_update_ha_state()
|
|
# _LOGGER.debug("Button pressed. Current state: %s", self._state)
|
|
|
|
|
|
|
|
async def async_setup_entry(hass, config_entry, async_add_entities):
|
|
"""Set up the SAAS Sleep Tracking Start, Stop and Pause buttons from a config entry."""
|
|
# _LOGGER.debug("Setting up SAAS Sleep Tracking buttons from a config entry with data: %s", config_entry.data)
|
|
|
|
# Extract the necessary data from config_entry.data
|
|
name = config_entry.data[CONF_NAME]
|
|
notify_target = config_entry.data['notify_target']
|
|
|
|
# Create instances of SAASSleepTrackingStart, SAASSleepTrackingStop and SAASSleepTrackingPause
|
|
entities = [
|
|
SAASSleepTrackingStart(hass, name, notify_target),
|
|
SAASSleepTrackingStop(hass, name, notify_target),
|
|
SAASSleepTrackingPause(hass, name, notify_target),
|
|
SAASSleepTrackingResume(hass, name, notify_target),
|
|
SAASAlarmClockSnooze(hass, name, notify_target),
|
|
SAASAlarmClockDisable(hass, name, notify_target),
|
|
SAASSleepTrackingStartWithAlarm(hass, name, notify_target),
|
|
SAASLullabyStop(hass, name, notify_target),
|
|
]
|
|
|
|
# Call async_setup on each entity if it has that method
|
|
for entity in entities:
|
|
if hasattr(entity, "async_setup"):
|
|
await entity.async_setup()
|
|
|
|
# Add the entities
|
|
async_add_entities(entities)
|
|
return True |