-
-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #218 from philippwaller/feat/template-support
Add support for Jinja templates
- Loading branch information
Showing
9 changed files
with
277 additions
and
135 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
/** | ||
* Abstract base class for actions. It serves as a foundation for all specific action types and is not | ||
* intended for direct instantiation. | ||
*/ | ||
export class Action { | ||
/** | ||
* Constructs an Action instance. Blocks direct instantiation of this abstract class. | ||
* @throws {TypeError} If directly instantiated. | ||
*/ | ||
constructor() { | ||
if (new.target === Action) { | ||
throw new TypeError('Cannot instantiate abstract class Action directly') | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import { Action } from '@/modules/homeassistant/actions/action' | ||
|
||
/** | ||
* ServiceAction, extending Action, facilitates interactions with HomeAssistant services. | ||
*/ | ||
export class ServiceAction extends Action { | ||
/** | ||
* Constructs a ServiceAction instance. | ||
* @param {string} domain - Service domain, must be a non-empty string. | ||
* @param {string} service - Service name, must be a non-empty string. | ||
* @param {Array} [entity_id=[]] - Target entity IDs array. | ||
* @param {Object} [serviceData={}] - Additional service data. | ||
* @throws {Error} if 'domain' or 'service' are empty or not strings. | ||
* @throws {TypeError} if 'entity_id' is not an array or 'serviceData' is not an object. | ||
*/ | ||
constructor(domain, service, entity_id, serviceData) { | ||
super() | ||
|
||
if (typeof domain !== 'string' || !domain.trim()) { | ||
throw new Error('Domain must be a non-empty string') | ||
} | ||
if (typeof service !== 'string' || !service.trim()) { | ||
throw new Error('Service must be a non-empty string') | ||
} | ||
if (!Array.isArray(entity_id)) { | ||
throw new TypeError('entity_id must be an array') | ||
} | ||
if (typeof serviceData !== 'object' || serviceData === null) { | ||
throw new TypeError('serviceData must be an object') | ||
} | ||
|
||
this.service = `${domain}.${service}` | ||
this.data = serviceData | ||
this.target = { entity_id: entity_id } | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
/** | ||
* The Command class acts as an abstract base class for creating commands | ||
* that can be used to interact with the HomeAssistant WebSocket API. | ||
*/ | ||
export class Command { | ||
/** | ||
* Constructs a Command instance. | ||
* @param {number} requestId - The unique identifier for the command request. | ||
* @param {string} type - The type of the command. Must be a non-empty string. | ||
* @throws {TypeError} If an attempt is made to instantiate Command directly. | ||
* @throws {Error} If the requestId is not a non-negative number. | ||
* @throws {Error} If the type is not a non-empty string. | ||
*/ | ||
constructor(requestId, type) { | ||
// Prevent direct instantiation of this abstract class. | ||
if (new.target === Command) { | ||
throw new TypeError('Cannot instantiate abstract class Command directly') | ||
} | ||
|
||
if (typeof requestId !== 'number' || requestId < 0) { | ||
throw new Error('requestId must be a non-negative number') | ||
} | ||
|
||
if (typeof type !== 'string' || !type.trim()) { | ||
throw new Error('type must be a non-empty string') | ||
} | ||
|
||
this.id = requestId | ||
this.type = type | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
src/modules/homeassistant/commands/execute-script-command.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import { Command } from '@/modules/homeassistant/commands/command' | ||
import { Action } from '@/modules/homeassistant/actions/action' | ||
|
||
/** | ||
* CallExecuteScriptCommand | ||
* | ||
* Facilitates the execution of multiple actions, including service calls, in a single command. This command | ||
* is a substantial improvement over the "call_service" command, as it incorporates and evaluates Jinja templates. | ||
* This enhancement enables more dynamic and context-sensitive operations within HomeAssistant. | ||
*/ | ||
export class ExecuteScriptCommand extends Command { | ||
/** | ||
* Constructs a CallExecuteScriptCommand instance. | ||
* | ||
* @param {number} requestId - Number of iterations for execution. Must be non-negative. | ||
* @param {Action[]} [actions=[]] - Array of ScriptCommand instances. Optional, defaults to empty. | ||
* @throws {TypeError} if actions is not an array or has non-Action elements. | ||
*/ | ||
constructor(requestId, actions = []) { | ||
super(requestId, 'execute_script') | ||
|
||
if (!Array.isArray(actions)) { | ||
throw new TypeError('Actions must be an array') | ||
} | ||
|
||
if (actions.some((action) => !(action instanceof Action))) { | ||
throw new TypeError('Elements in actions must be Action instances or subclasses') | ||
} | ||
|
||
this.sequence = actions | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
src/modules/homeassistant/commands/get-services-command.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import { Command } from '@/modules/homeassistant/commands/command' | ||
|
||
/** | ||
* The GetServicesCommand class, a subclass of Command, is used for requesting | ||
* service information from HomeAssistant. | ||
*/ | ||
export class GetServicesCommand extends Command { | ||
/** | ||
* Constructs a GetServicesCommand instance.* | ||
* @param {number} requestId - The unique identifier for the command request. | ||
*/ | ||
constructor(requestId) { | ||
super(requestId, 'get_services') | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import { Command } from '@/modules/homeassistant/commands/command' | ||
|
||
/** | ||
* The GetStatesCommand class, a subclass of Command, handles the retrieval of | ||
* state information from HomeAssistant. | ||
*/ | ||
export class GetStatesCommand extends Command { | ||
/** | ||
* Constructs a GetStatesCommand instance. | ||
* @param {number} requestId - The unique identifier for the command request. | ||
*/ | ||
constructor(requestId) { | ||
super(requestId, 'get_states') | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
src/modules/homeassistant/commands/subscribe-events-command.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import { Command } from '@/modules/homeassistant/commands/command' | ||
|
||
/** | ||
* The SubscribeEventCommand class, a subclass of Command, specifically handles | ||
* subscription to event types in HomeAssistant. | ||
*/ | ||
export class SubscribeEventsCommand extends Command { | ||
/** | ||
* Constructs a SubscribeEventCommand instance. | ||
* @param {number} requestId - The unique identifier for the command request. | ||
*/ | ||
constructor(requestId) { | ||
super(requestId, 'subscribe_events') | ||
this.event_type = 'state_changed' | ||
} | ||
} |
Oops, something went wrong.