|
| 1 | +import fs from 'fs' |
| 2 | + |
1 | 3 | import streamDeck, { type FeedbackPayload } from '@elgato/streamdeck' |
2 | 4 | import axios from 'axios' |
3 | 5 | import type { HassEntity } from 'home-assistant-js-websocket' |
@@ -27,12 +29,20 @@ export class EntityConfigFactory { |
27 | 29 | } |
28 | 30 |
|
29 | 31 | async setDisplayConfigurationUrl(url: Nullable<string>) { |
30 | | - if (!url) return |
| 32 | + if (!url) { |
| 33 | + this.displayConfiguration = defaultDisplayConfiguration as DisplayConfig |
| 34 | + return |
| 35 | + } |
31 | 36 |
|
32 | 37 | streamDeck.logger.info(`Loading display configuration from ${url}`) |
33 | 38 | try { |
34 | | - const response = await axios.get<string>(url) |
35 | | - this.displayConfiguration = yaml.load(response.data) as DisplayConfig |
| 39 | + let response: string |
| 40 | + if (url.startsWith('file://')) { |
| 41 | + response = fs.readFileSync(url.replace('file://', ''), 'utf8') |
| 42 | + } else { |
| 43 | + response = (await axios.get<string>(url)).data |
| 44 | + } |
| 45 | + this.displayConfiguration = yaml.load(response) as DisplayConfig |
36 | 46 | } catch (error) { |
37 | 47 | streamDeck.logger.error(`Failed to download display configuration from ${url}`, error) |
38 | 48 | } |
@@ -96,7 +106,12 @@ export class EntityConfigFactory { |
96 | 106 |
|
97 | 107 | const feedbackLayout = this.render(feedbackLayoutString, stateObject) |
98 | 108 | const renderedFeedback = this.render(feedbackValueString, stateObject) |
99 | | - const feedback = renderedFeedback ? (JSON.parse(renderedFeedback) as FeedbackPayload) : {} |
| 109 | + let feedback: FeedbackPayload = {} |
| 110 | + try { |
| 111 | + feedback = renderedFeedback ? (JSON.parse(renderedFeedback) as FeedbackPayload) : {} |
| 112 | + } catch (error) { |
| 113 | + streamDeck.logger.error('Failed to parse feedback template', error) |
| 114 | + } |
100 | 115 |
|
101 | 116 | const icon = this.render(iconString, stateObject) |
102 | 117 | const color = this.render(colorString, stateObject) |
|
0 commit comments