Index
ACTIVE_STATUSES: frozenset[ResourceStatus] = frozenset({ResourceStatus.NOT_STARTED, ResourceStatus.STARTING, ResourceStatus.RUNNING})
module-attribute
Resource is in normal lifecycle progression (not failed, stopped, or exhausted).
TERMINAL_STATUSES: frozenset[ResourceStatus] = frozenset({ResourceStatus.STOPPED, ResourceStatus.EXHAUSTED_DEAD})
module-attribute
Resource has reached an end state — shutdown can skip the STOPPING transition.
FRAMEWORK_APP_KEY = '__hassette__'
module-attribute
Reserved app_key for framework-internal listeners and jobs.
Referenced in SQL constraints and in Python guards throughout the codebase.
All non-SQL usages should reference this constant or use is_framework_key().
FRAMEWORK_APP_KEY_PREFIX = '__hassette__.'
module-attribute
Prefix for component-specific framework keys (e.g. '__hassette__.service_watcher').
The trailing dot distinguishes the prefix from the bare sentinel so that
'__hassette__other' is never mistakenly treated as a framework key.
Use is_framework_key() rather than comparing against this constant directly.
AppConfigT = TypeVar('AppConfigT', bound='AppConfig')
module-attribute
Type variable for app configuration classes.
BusErrorHandlerType: TypeAlias = Callable[['BusErrorContext'], Awaitable[None]] | Callable[['BusErrorContext'], None]
module-attribute
Type alias for bus error handler callables.
A bus error handler is either an async callable or a sync callable that accepts a
:class:~hassette.bus.error_context.BusErrorContext and returns None.
ChangeType = TypeAliasType('ChangeType', 'None | FalseySentinel | V | Condition[V | FalseySentinel] | ComparisonCondition[V | FalseySentinel]', type_params=(V,))
module-attribute
Type representing a value that can be used to specify changes in predicates.
EventT = TypeVar('EventT', bound='Event[Any]', contravariant=True)
module-attribute
Represents an event type.
HandlerType = SyncHandler | AsyncHandlerType
module-attribute
Type representing all valid handler types (sync or async).
JobCallable: TypeAlias = Callable[..., Awaitable[None]] | Callable[..., Any]
module-attribute
Type representing a callable that can be scheduled as a job.
PayloadT = TypeVar('PayloadT', bound='EventPayload[Any]', covariant=True)
module-attribute
Represents the payload type of an event.
QuerySourceTier = Literal['app', 'framework', 'all']
module-attribute
Valid source_tier values for query-side filtering. 'all' disables the filter.
SchedulerErrorHandlerType: TypeAlias = Callable[['SchedulerErrorContext'], Awaitable[None]] | Callable[['SchedulerErrorContext'], None]
module-attribute
Type alias for scheduler error handler callables.
A scheduler error handler is either an async callable or a sync callable that accepts a
:class:~hassette.scheduler.error_context.SchedulerErrorContext and returns None.
ScheduleStartType: TypeAlias = ZonedDateTime | Time | time | TimeDelta | int | float | None
module-attribute
Type representing a value that can be used to specify a start time.
SourceTier = Literal['app', 'framework']
module-attribute
Identifies whether a telemetry record originates from a user app or the framework itself.
StateT = TypeVar('StateT', bound='BaseState', covariant=True)
module-attribute
Represents a specific state type, e.g., LightState, CoverState, etc.
StateValueT = TypeVar('StateValueT', covariant=True)
module-attribute
Represents the type of the state attribute in a State model, e.g. bool for BinarySensorState.
BackpressurePolicy
Bases: StrEnum
What a listener does when the global dispatch semaphore is saturated.
The semaphore is shared by all listeners across all apps — saturation means
the whole bus is at capacity, not that this listener alone is busy. This is
distinct from per-listener rate controls (debounce, throttle, mode),
which operate inside the handler invoker after a dispatch slot is acquired.
Source code in src/hassette/types/enums.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |
BLOCK = auto()
class-attribute
instance-attribute
Wait for a dispatch slot — the default for all listeners.
When the global semaphore is saturated, the dispatch loop blocks until a slot
opens, then runs the handler. No events are lost; the cost is added latency.
Omitting backpressure= on a subscription is identical to passing BLOCK.
DROP_NEWEST = auto()
class-attribute
instance-attribute
Skip this event when the global semaphore is saturated; never waits.
The dispatch loop checks the semaphore without acquiring it. If saturated, no
task is spawned, one drop is recorded on the listener, and the loop moves on.
Under normal load (semaphore not locked), dispatches identically to BLOCK.
A DROP_NEWEST listener may not run at all during a sustained saturation
period — every event it receives while the bus is full is dropped. Use BLOCK
for handlers that must run at least once, even under load.
ConnectionState
Bases: StrEnum
Enumeration for WebSocket connection states.
Source code in src/hassette/types/enums.py
234 235 236 237 238 239 240 241 242 243 244 | |
DISCONNECTED = auto()
class-attribute
instance-attribute
The WebSocket connection is not established.
CONNECTING = auto()
class-attribute
instance-attribute
The WebSocket connection is being established.
CONNECTED = auto()
class-attribute
instance-attribute
The WebSocket connection is established and active.
ExecutionMode
Bases: StrEnum
Overlap behavior for a listener when a trigger fires while a prior invocation still runs.
Source code in src/hassette/types/enums.py
58 59 60 61 62 63 64 65 66 67 68 69 70 71 | |
SINGLE = auto()
class-attribute
instance-attribute
Drop the re-fire while a prior invocation is still running.
RESTART = auto()
class-attribute
instance-attribute
Cancel the running invocation and start a new one.
QUEUED = auto()
class-attribute
instance-attribute
Serialize triggers, running them one at a time in arrival order.
PARALLEL = auto()
class-attribute
instance-attribute
Run invocations concurrently with no overlap guard (today's behavior).
Outcome
Bases: StrEnum
The result of handing a trigger to an ExecutionModeGuard.
Source code in src/hassette/types/enums.py
112 113 114 115 116 117 118 119 120 121 122 123 124 125 | |
RAN = auto()
class-attribute
instance-attribute
The invocation was started immediately.
QUEUED_ACCEPTED = auto()
class-attribute
instance-attribute
A queued trigger was accepted into the pending queue; it will run later.
SUPPRESSED = auto()
class-attribute
instance-attribute
A single re-fire was dropped because a prior invocation is still running.
DROPPED = auto()
class-attribute
instance-attribute
A queued trigger was dropped because the pending queue is at its cap.
ResourceRole
Bases: StrEnum
Enumeration for resource roles.
Source code in src/hassette/types/enums.py
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | |
CORE = auto()
class-attribute
instance-attribute
Only used by Hassette directly, as it does not inherit from Resource.
BASE = auto()
class-attribute
instance-attribute
The base role for all resources.
SERVICE = auto()
class-attribute
instance-attribute
A service resource.
RESOURCE = auto()
class-attribute
instance-attribute
A generic resource.
APP = auto()
class-attribute
instance-attribute
An application resource.
UNKNOWN = auto()
class-attribute
instance-attribute
An unknown or unclassified resource.
ResourceStatus
Bases: StrEnum
Enumeration for resource status.
Source code in src/hassette/types/enums.py
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | |
NOT_STARTED = auto()
class-attribute
instance-attribute
The resource has not been started yet.
STARTING = auto()
class-attribute
instance-attribute
The resource is in the process of starting.
RUNNING = auto()
class-attribute
instance-attribute
The resource is currently running.
STOPPING = auto()
class-attribute
instance-attribute
The resource is in the process of stopping.
STOPPED = auto()
class-attribute
instance-attribute
The resource has been stopped without errors.
FAILED = auto()
class-attribute
instance-attribute
The resource has failed with a recoverable error.
CRASHED = auto()
class-attribute
instance-attribute
The resource has crashed unexpectedly and cannot recover.
EXHAUSTED_DEAD = auto()
class-attribute
instance-attribute
The service's restart budget is exhausted with no further restarts (permanent end state).
EXHAUSTED_COOLING = auto()
class-attribute
instance-attribute
The service's restart budget is exhausted and a long cooldown is in progress.
Topic
Bases: StrEnum
Event topic identifiers for the internal pub/sub bus.
Source code in src/hassette/types/enums.py
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | |
HASSETTE_EVENT_SERVICE_STATUS = 'hassette.event.service_status'
class-attribute
instance-attribute
Service status updates
HASSETTE_EVENT_WEBSOCKET_CONNECTED = 'hassette.event.websocket_connected'
class-attribute
instance-attribute
WebSocket connection established
HASSETTE_EVENT_WEBSOCKET_DISCONNECTED = 'hassette.event.websocket_disconnected'
class-attribute
instance-attribute
WebSocket connection lost
HASSETTE_EVENT_FILE_WATCHER = 'hassette.event.file_watcher'
class-attribute
instance-attribute
File watcher events
HASSETTE_EVENT_APP_LOAD_COMPLETED = 'hassette.event.app_load_completed'
class-attribute
instance-attribute
Application load completion events
HASSETTE_EVENT_APP_STATE_CHANGED = 'hassette.event.app_state_changed'
class-attribute
instance-attribute
App instance state change events
HASSETTE_EVENT_EXECUTION_COMPLETED = 'hassette.event.execution_completed'
class-attribute
instance-attribute
Handler or job execution persisted to the telemetry database
HASS_EVENT_STATE_CHANGED = 'hass.event.state_changed'
class-attribute
instance-attribute
State change events
HASS_EVENT_CALL_SERVICE = 'hass.event.call_service'
class-attribute
instance-attribute
Service call events
HASS_EVENT_COMPONENT_LOADED = 'hass.event.component_loaded'
class-attribute
instance-attribute
Component loaded events
HASS_EVENT_SERVICE_REGISTERED = 'hass.event.service_registered'
class-attribute
instance-attribute
Service registered events
HASS_EVENT_SERVICE_REMOVED = 'hass.event.service_removed'
class-attribute
instance-attribute
Service removed events
HASS_EVENT_LOGBOOK_ENTRY = 'hass.event.logbook_entry'
class-attribute
instance-attribute
Logbook entry events
HASS_EVENT_USER_ADDED = 'hass.event.user_added'
class-attribute
instance-attribute
User added events
HASS_EVENT_USER_REMOVED = 'hass.event.user_removed'
class-attribute
instance-attribute
User removed events
HASS_EVENT_AUTOMATION_TRIGGERED = 'hass.event.automation_triggered'
class-attribute
instance-attribute
Automation triggered events
HASS_EVENT_SCRIPT_STARTED = 'hass.event.script_started'
class-attribute
instance-attribute
Script started events
AsyncHandlerType
Bases: Protocol
Protocol for async handlers.
Source code in src/hassette/types/types.py
270 271 272 273 | |
ComparisonCondition
Bases: Protocol[V_contra]
Protocol for a comparison condition callable that takes two values and returns a bool.
Source code in src/hassette/types/types.py
171 172 173 174 | |
Predicate
SchedulerServiceProtocol
Bases: Protocol
Protocol for the scheduler-service surface consumed by Scheduler.
Describes the surface Scheduler calls on its scheduler_service: the
task_bucket attribute plus six async/sync methods. SchedulerService
satisfies this protocol structurally — no changes to the concrete class
are required.
Source code in src/hassette/types/types.py
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 | |
StateReader
Bases: Protocol
Read-only protocol for the state-proxy surface consumed by StateManager and DomainStates.
Describes the four members state-manager consumers call on the state proxy. StateProxy satisfies this protocol structurally — no changes to the concrete class are required.
Source code in src/hassette/types/types.py
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 | |
SyncHandler
Bases: Protocol
Protocol for sync handlers.
Source code in src/hassette/types/types.py
264 265 266 267 | |
TriggerProtocol
Bases: Protocol
Protocol for defining triggers.
Six methods make up the contract: - first_run_time: returns the first scheduled run time given the current time - next_run_time: returns the next run time after a previous run, or None for one-shot triggers - trigger_label: short stable label for telemetry / UI display - trigger_detail: optional human-readable detail string - trigger_db_type: canonical type string for database storage - trigger_id: stable string identifier used for deduplication
Source code in src/hassette/types/types.py
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | |
first_run_time(current_time: ZonedDateTime) -> ZonedDateTime
Return the first scheduled run time at or after current_time.
Source code in src/hassette/types/types.py
190 191 192 | |
next_run_time(previous_run: ZonedDateTime, current_time: ZonedDateTime) -> ZonedDateTime | None
Return the next run time after previous_run, or None for one-shot triggers.
Source code in src/hassette/types/types.py
194 195 196 | |
trigger_label() -> str
Human-readable display label for the UI.
Custom triggers (those returning "custom" from trigger_db_type())
MUST NOT return one of the built-in reserved names ("after",
"once", "every", "daily", "cron") from this method.
Doing so creates misleading telemetry and UI rows where the
trigger_type column is "custom" but the label implies a
built-in trigger kind.
Source code in src/hassette/types/types.py
198 199 200 201 202 203 204 205 206 207 208 | |
trigger_detail() -> str | None
Optional human-readable detail string.
Source code in src/hassette/types/types.py
210 211 212 | |
trigger_db_type() -> Literal['interval', 'cron', 'once', 'after', 'custom']
Canonical type string for database storage.
Source code in src/hassette/types/types.py
214 215 216 | |
trigger_id() -> str
Stable string identifier used for deduplication.
Source code in src/hassette/types/types.py
218 219 220 | |
framework_display_name(app_key: str) -> str
Return a human-readable display name for a framework app key.
For prefixed keys (e.g. '__hassette__.service_watcher') returns the
component slug ('service_watcher'). For the bare legacy key
'__hassette__' returns 'framework'.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
app_key
|
str
|
A framework app key. Behaviour is undefined for non-framework keys. |
required |
Source code in src/hassette/types/types.py
106 107 108 109 110 111 112 113 114 115 116 117 118 | |
is_framework_key(app_key: str | None) -> bool
Return True if app_key is a framework-reserved key.
Matches both the legacy bare key '__hassette__' and any key with the
component prefix '__hassette__.'.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
app_key
|
str | None
|
The app key to test. |
required |
Source code in src/hassette/types/types.py
92 93 94 95 96 97 98 99 100 101 102 103 | |