mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-28 02:14:26 +01:00
Compare commits
122 Commits
Armilar-pa
...
Armilar-pa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54422eccaa | ||
|
|
02004f4b6d | ||
|
|
58278c5388 | ||
|
|
ff7d2020f7 | ||
|
|
160420fe82 | ||
|
|
56703ec458 | ||
|
|
9947664ae8 | ||
|
|
4d3f54439e | ||
|
|
6254f369f4 | ||
|
|
9b98cac4c8 | ||
|
|
71f3b75ab2 | ||
|
|
1a5cf8a2f7 | ||
|
|
33712b198d | ||
|
|
1fd5784a54 | ||
|
|
3904ca2343 | ||
|
|
8ebd0f5193 | ||
|
|
8c9bca3f25 | ||
|
|
6908744669 | ||
|
|
d0e463de98 | ||
|
|
f4c7287dfd | ||
|
|
a33df14761 | ||
|
|
3afc41269c | ||
|
|
11add2bfcc | ||
|
|
dd84fa16e5 | ||
|
|
e823c0f1ec | ||
|
|
56c104a5bc | ||
|
|
bfb2c2eaab | ||
|
|
7d57205ac2 | ||
|
|
4b81b1794d | ||
|
|
f5019b494f | ||
|
|
5102b8b955 | ||
|
|
089e553944 | ||
|
|
dfc07a6d76 | ||
|
|
b7687e006c | ||
|
|
10cf15bebd | ||
|
|
fc3d4adc72 | ||
|
|
bc330d5aaf | ||
|
|
c8a8feace2 | ||
|
|
9afdaa4cbc | ||
|
|
18c7f2eb9c | ||
|
|
de237171ef | ||
|
|
a4b90944e8 | ||
|
|
cb44fcc8c9 | ||
|
|
03bae9e9bd | ||
|
|
1ec463f6c7 | ||
|
|
5420abcfaa | ||
|
|
e2530cdf62 | ||
|
|
b14687cb30 | ||
|
|
360fb881f1 | ||
|
|
90d35a8574 | ||
|
|
73a0ba468e | ||
|
|
4e7119768b | ||
|
|
8bfa6deb76 | ||
|
|
e87febc54a | ||
|
|
43df10e823 | ||
|
|
e2acb70a1c | ||
|
|
f8774af675 | ||
|
|
9ddb6c7834 | ||
|
|
330e5fecdf | ||
|
|
6cc41bf510 | ||
|
|
956bd23a56 | ||
|
|
f1ce806ded | ||
|
|
7748c22292 | ||
|
|
131aa491b9 | ||
|
|
dbc5ff7ccd | ||
|
|
5c3f366e53 | ||
|
|
b1b679701e | ||
|
|
c489f07c0a | ||
|
|
14bc7dedec | ||
|
|
d4067c5ddb | ||
|
|
50209418d7 | ||
|
|
8f3c74165d | ||
|
|
b7b8f389eb | ||
|
|
9082ed20f3 | ||
|
|
f807406a97 | ||
|
|
93aafe259b | ||
|
|
b96fc6e6bd | ||
|
|
1996b29c60 | ||
|
|
c8eb476ca8 | ||
|
|
aeaa995a0a | ||
|
|
b35122868f | ||
|
|
1cb974494f | ||
|
|
723ecde4cd | ||
|
|
f29e5c4978 | ||
|
|
46ffff7eea | ||
|
|
774c920591 | ||
|
|
f27eb07827 | ||
|
|
da8362d81d | ||
|
|
6e38d4f38d | ||
|
|
2344c9a9ed | ||
|
|
5180f0f869 | ||
|
|
b4f2789834 | ||
|
|
78c6029200 | ||
|
|
dca112e42b | ||
|
|
5ad16dd735 | ||
|
|
723be0735e | ||
|
|
a5bfb9388f | ||
|
|
9c6f24f984 | ||
|
|
59843ffea5 | ||
|
|
4de9c4a12f | ||
|
|
3eb05e5a84 | ||
|
|
5d7a7ed1a4 | ||
|
|
7124a22c38 | ||
|
|
fa4d65a383 | ||
|
|
d26306f892 | ||
|
|
9c0bb037fb | ||
|
|
4b73e20b9b | ||
|
|
3940a0c2e9 | ||
|
|
8f57d4a642 | ||
|
|
3979fdf6a0 | ||
|
|
4cd47126eb | ||
|
|
eb0dd79c80 | ||
|
|
3a39a8ca0e | ||
|
|
b5c4a2128b | ||
|
|
41f43fe5d0 | ||
|
|
f3f93b7136 | ||
|
|
2fb1855842 | ||
|
|
9a3627427f | ||
|
|
94fbf0a5f7 | ||
|
|
caddec1190 | ||
|
|
03367ea27d | ||
|
|
8e792ae8fc |
2
.github/workflows/builder.yaml
vendored
2
.github/workflows/builder.yaml
vendored
@@ -100,7 +100,7 @@ jobs:
|
||||
|
||||
- name: Build ${{ matrix.addon }} add-on
|
||||
if: steps.check.outputs.build_arch == 'true'
|
||||
uses: home-assistant/builder@2023.09.0
|
||||
uses: home-assistant/builder@2024.01.0
|
||||
with:
|
||||
args: |
|
||||
${{ env.BUILD_ARGS }} \
|
||||
|
||||
2
.github/workflows/docs-dev.yml
vendored
2
.github/workflows/docs-dev.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: pip install mkdocs-material mkdocs-video markdown-include mike
|
||||
|
||||
2
.github/workflows/docs-release.yml
vendored
2
.github/workflows/docs-release.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-python@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: 3.x
|
||||
- run: pip install mkdocs-material mkdocs-video markdown-include mike
|
||||
|
||||
1732
ioBroker/.iobroker/types/javascript.d.ts
vendored
Normal file
1732
ioBroker/.iobroker/types/javascript.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -971,12 +971,37 @@
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
<value name="VALUE">
|
||||
<shadow type="logic_boolean" id="I4PsJQb;6k+70^g*Xt/}">
|
||||
<field name="BOOL">TRUE</field>
|
||||
</shadow>
|
||||
<block type="math_random_float" id="C5/h)jq=yPM?,9J=(w65"></block>
|
||||
</value>
|
||||
<value name="VALUE">
|
||||
<shadow type="logic_boolean" id="I4PsJQb;6k+70^g*Xt/}">
|
||||
<field name="BOOL">TRUE</field>
|
||||
</shadow>
|
||||
<block type="text_join" id="XdhGC7#MxGw|KhC1x#MY">
|
||||
<mutation items="2"></mutation>
|
||||
<value name="ADD0">
|
||||
<block type="text" id="[(_1;{xE-xfzeB4]$uk;">
|
||||
<field name="TEXT">ID</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="ADD1">
|
||||
<block type="convert_tostring" id="g{jZOA*6Clhc5`9::h.S">
|
||||
<value name="VALUE">
|
||||
<block type="math_random_int" id="SXG?j1]Jza!2fg[(cl!i">
|
||||
<value name="FROM">
|
||||
<shadow type="math_number" id="#/-;$~`{=}8wYY$kbvA9">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="TO">
|
||||
<shadow type="math_number" id="0x8~a;asHsiJ2Its%!VJ">
|
||||
<field name="NUM">100</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
<value name="DELAY_MS">
|
||||
<shadow type="math_number" id="+6#n%fO}e4h%;FhKPV0c">
|
||||
<field name="NUM">0</field>
|
||||
|
||||
44
ioBroker/Blockly/Alarm_clock.ts
Normal file
44
ioBroker/Blockly/Alarm_clock.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
const dp_userdata: string = '0_userdata.0.NSPanel';
|
||||
const dp_alias: string = 'alias.0.NSPanel';
|
||||
|
||||
// dpAction wird wenn der Wecker gestellt wird auf false geschaltet
|
||||
// dpAction wird wenn die Weckzeit erreicht ist auf true geschaltet
|
||||
// Der nachfolgende Datenpunkt muss manuell erstellt werden...
|
||||
const dpAction: string = '0_userdata.0.example_boolean';
|
||||
|
||||
const Debug = true;
|
||||
|
||||
let time: number;
|
||||
let scheduleAlarmTime: any = null;
|
||||
on({ id: dp_userdata + '.AlarmTime.State', change: 'ne' }, async (obj) => {
|
||||
|
||||
time = getState(dp_userdata + '.AlarmTime.Time').val;
|
||||
if (Debug) log('Uhrzeit: ' + time, 'info');
|
||||
if ('paused' == obj.state.val) {
|
||||
(function () { if (scheduleAlarmTime) {
|
||||
clearSchedule(scheduleAlarmTime);
|
||||
scheduleAlarmTime = null;
|
||||
}
|
||||
});
|
||||
} else if ('active' == obj.state.val) {
|
||||
let stunde: number = Math.floor(time / 60);
|
||||
let minute: number = time % 60;
|
||||
if (Debug) log('Weckzeit: ' + ('0' + stunde).slice(-2) + ':' + ('0' + minute).slice(-2), 'info');
|
||||
scheduleAlarmTime = schedule(minute + ' ' + stunde + ' * * *', async () => {
|
||||
await setStateAsync(dpAction, <iobJS.State>{ val: true, ack: true });
|
||||
await setStateAsync(dp_userdata + '.AlarmTime.State', <iobJS.State>{ val: 'paused', ack: true });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
async function Init_Datenpunkte() {
|
||||
if (existsState(dp_alias + '.AlarmTime.ACTUAL') == false) {
|
||||
await createStateAsync(dp_userdata + '.AlarmTime.Time', '0', { type: 'number' });
|
||||
await createStateAsync(dp_userdata + '.AlarmTime.State', 'paused', { type: 'string' });
|
||||
setObject(dp_alias + '.AlarmTime', { type: 'channel', common: { role: 'value.alarmtime', name: 'Alarmtime' }, native: {} });
|
||||
await createAliasAsync(dp_alias + '.AlarmTime.ACTUAL', dp_userdata + '.AlarmTime.Time', true, <iobJS.StateCommon>{ type: 'number', role: 'state', name: 'ACTUAL' });
|
||||
await createAliasAsync(dp_alias + '.AlarmTime.STATE', dp_userdata + '.AlarmTime.State', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'STATE' });
|
||||
log("<PageItem>{id: '"+ dp_alias + ".AlarmTime', name: 'Wecker', onColor: Red, offColor: Green, useColor: true}", 'info');
|
||||
}
|
||||
}
|
||||
Init_Datenpunkte();
|
||||
46
ioBroker/Blockly/Countdown_Timer.ts
Normal file
46
ioBroker/Blockly/Countdown_Timer.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
const dp_userdata: string = '0_userdata.0.NSPanel';
|
||||
const dp_alias: string = 'alias.0.NSPanel';
|
||||
|
||||
// Der nachfolgende Datenpunkt muss manuell angelegt werden
|
||||
const dpAction: string = '0_userdata.0.example_boolean'; // anpassen
|
||||
|
||||
const Debug = false;
|
||||
|
||||
let intervallCounter: any;
|
||||
|
||||
let sec_timer = getState(dp_userdata + '.Countdown.Time').val;
|
||||
on({ id: dp_userdata + '.Countdown.State', change: 'ne' }, async (obj) => {
|
||||
|
||||
switch (obj.state.val) {
|
||||
case 'active':
|
||||
if (intervallCounter) { clearInterval(intervallCounter); intervallCounter = null; };
|
||||
intervallCounter = setInterval(async () => {
|
||||
if (getState(dp_userdata + '.Countdown.Time').val > 0) {
|
||||
sec_timer = getState(dp_userdata + '.Countdown.Time').val;
|
||||
setState(dp_userdata + '.Countdown.Time', (sec_timer - 1), false);
|
||||
} else {
|
||||
setState(dp_userdata + '.Countdown.Time', 0, false);
|
||||
setState(dp_userdata + '.Countdown.State', 'idle', false);
|
||||
// An dieser Stelle kann auch noch eine Meldung an Alexa oder Telegram, etc. erfolgen
|
||||
}
|
||||
}, 1000);
|
||||
|
||||
break;
|
||||
default:
|
||||
if (intervallCounter) { clearInterval(intervallCounter); intervallCounter = null; };
|
||||
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
async function Init_Datenpunkte() {
|
||||
if (existsState(dp_alias + '.Countdown.ACTUAL') == false) {
|
||||
await createStateAsync(dp_userdata + '.Countdown.Time', '0', { type: 'number'});
|
||||
await createStateAsync(dp_userdata + '.Countdown.State', 'paused', { type: 'string' });
|
||||
setObject(dp_alias + '.Countdown', { type: 'channel', common: { role: 'level.timer', name: 'Countdown' }, native: {} });
|
||||
await createAliasAsync(dp_alias + '.Countdown.ACTUAL', dp_userdata + '.Countdown.Time', true, <iobJS.StateCommon>{ type: 'number', role: 'state', name: 'ACTUAL' });
|
||||
await createAliasAsync(dp_alias + '.Countdown.STATE', dp_userdata + '.Countdown.State', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'STATE' });
|
||||
log("<PageItem>{id: '"+ dp_alias + ".Countdown', name: 'Timer'}", 'info');
|
||||
}
|
||||
}
|
||||
Init_Datenpunkte();
|
||||
9979
ioBroker/DEV/NSPanelTs.ts
Normal file
9979
ioBroker/DEV/NSPanelTs.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1047,6 +1047,14 @@
|
||||
"zh-CN":"空闲",
|
||||
"zh-TW":"暫停"
|
||||
},
|
||||
"on":{
|
||||
"en-US":"On",
|
||||
"de-DE":"Ein"
|
||||
},
|
||||
"off":{
|
||||
"en-US":"Off",
|
||||
"de-DE":"Aus"
|
||||
},
|
||||
"paused":{
|
||||
"en-US":"Paused",
|
||||
"de-DE":"pausiert",
|
||||
@@ -2489,6 +2497,14 @@
|
||||
"vi-VN":"Mật khẩu",
|
||||
"zh-CN":"密码",
|
||||
"zh-TW":"密碼"
|
||||
},
|
||||
"Wlan enabled":{
|
||||
"en-US":"Wlan enabled",
|
||||
"de-DE":"Wlan aktiviert"
|
||||
},
|
||||
"Wlan disabled":{
|
||||
"en-US":"Wlan disabled",
|
||||
"de-DE":"Wlan deaktiviert"
|
||||
}
|
||||
},
|
||||
"media":{
|
||||
|
||||
@@ -2693,5 +2693,9 @@
|
||||
"update_nextion_tft":{
|
||||
"en-US":"Update Nextion TFT",
|
||||
"de-DE":"Nextion TFT Update"
|
||||
},
|
||||
"update_message":{
|
||||
"en-US":"Update Notifications",
|
||||
"de-DE":"Update Mitteilungen"
|
||||
}
|
||||
}
|
||||
|
||||
28
ioBroker/tsconfig.json
Normal file
28
ioBroker/tsconfig.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"noEmit": true,
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"esModuleInterop": true,
|
||||
"resolveJsonModule": true,
|
||||
"strict": true,
|
||||
"noImplicitReturns": true,
|
||||
"noImplicitAny": false,
|
||||
"target": "ES2022",
|
||||
"typeRoots": [
|
||||
".iobroker/types",
|
||||
"node_modules/@types"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"**/*.js",
|
||||
"**/*.ts",
|
||||
"./.iobroker/types/javascript.d.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules/**"
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
# https://developers.home-assistant.io/docs/add-ons/configuration#add-on-config
|
||||
name: NSPanel Lovelace UI Addon
|
||||
version: "4.7.72"
|
||||
version: "4.7.74"
|
||||
slug: nspanel-lovelace-ui
|
||||
description: NSPanel Lovelace UI Addon
|
||||
services:
|
||||
|
||||
@@ -52,6 +52,8 @@ class HAEntity(panel_cards.Entity):
|
||||
self.state = data.get("state")
|
||||
self.attributes = data.get("attributes", [])
|
||||
else:
|
||||
self.state = "not found"
|
||||
self.attributes = []
|
||||
return "~text~iid.404~X~6666~not found~"
|
||||
|
||||
# HA Entities
|
||||
@@ -188,7 +190,7 @@ class HAEntity(panel_cards.Entity):
|
||||
icon_char = value
|
||||
case 'binary_sensor':
|
||||
device_class = self.attributes.get("device_class", "")
|
||||
value = get_translation(self.locale, f"backend.component.binary_sensor.state.{device_class}.{entity.state}")
|
||||
value = get_translation(self.locale, f"backend.component.binary_sensor.state.{device_class}.{self.state}")
|
||||
case 'weather':
|
||||
attr = self.config.get("attribute", "temperature")
|
||||
value = str(self.attributes.get(attr, self.state))
|
||||
@@ -304,8 +306,6 @@ class QRCard(HACard):
|
||||
super().__init__(locale, config, panel)
|
||||
self.qrcode = config.get("qrCode", "https://www.youtube.com/watch?v=dQw4w9WgXcQ")
|
||||
def render(self):
|
||||
# TODO: Render QRCode as HomeAssistant Template
|
||||
#qrcode = apis.ha_api.render_template(qrcode)
|
||||
if self.qrcode.startswith("ha:"):
|
||||
self.qrcode = libs.home_assistant.get_template(self.qrcode)[3:]
|
||||
result = f"{self.title}~{self.gen_nav()}~{self.qrcode}"
|
||||
@@ -475,6 +475,8 @@ class AlarmCard(HACard):
|
||||
main_entity = self.entities[0]
|
||||
main_entity.render()
|
||||
|
||||
print(main_entity.state)
|
||||
|
||||
icon = get_icon_char("shield-off")
|
||||
color = rgb_dec565([255,255,255])
|
||||
supported_modes = []
|
||||
|
||||
@@ -8,6 +8,7 @@ def wait_for_ha_cache():
|
||||
while time.time() < mustend:
|
||||
if len(libs.home_assistant.home_assistant_entity_state_cache) == 0:
|
||||
time.sleep(0.1)
|
||||
time.sleep(1)
|
||||
|
||||
def calculate_dim_values(sleepTracking, sleepTrackingZones, sleepBrightness, screenBrightness, sleepOverride, return_involved_entities=False):
|
||||
dimmode = 10
|
||||
@@ -17,6 +18,12 @@ def calculate_dim_values(sleepTracking, sleepTrackingZones, sleepBrightness, scr
|
||||
if sleepBrightness:
|
||||
if isinstance(sleepBrightness, int):
|
||||
dimmode = sleepBrightness
|
||||
elif isinstance(sleepBrightness, list):
|
||||
logging.error("list style config for sleepBrightness no longer supported")
|
||||
elif sleepBrightness.startswith("ha:"):
|
||||
time.sleep(1)
|
||||
dimmode = int(float(libs.home_assistant.get_template(sleepBrightness)[3:]))
|
||||
involved_entities.extend(libs.home_assistant.get_template_listener_entities(sleepBrightness))
|
||||
elif libs.home_assistant.is_existent(sleepBrightness):
|
||||
involved_entities.append(sleepBrightness)
|
||||
dimmode = int(float(libs.home_assistant.get_entity_data(sleepBrightness).get('state', 10)))
|
||||
@@ -24,6 +31,12 @@ def calculate_dim_values(sleepTracking, sleepTrackingZones, sleepBrightness, scr
|
||||
if screenBrightness:
|
||||
if isinstance(screenBrightness, int):
|
||||
dimValueNormal = screenBrightness
|
||||
elif isinstance(screenBrightness, list):
|
||||
logging.error("list style config for screenBrightness no longer supported")
|
||||
elif screenBrightness.startswith("ha:"):
|
||||
time.sleep(1)
|
||||
dimValueNormal = int(float(libs.home_assistant.get_template(screenBrightness)[3:]))
|
||||
involved_entities.extend(libs.home_assistant.get_template_listener_entities(screenBrightness))
|
||||
elif libs.home_assistant.is_existent(screenBrightness):
|
||||
involved_entities.append(screenBrightness)
|
||||
dimValueNormal = int(float(libs.home_assistant.get_entity_data(screenBrightness).get('state', 100)))
|
||||
@@ -60,7 +73,7 @@ def handle_buttons(entity_id, btype, value, entity_config=None):
|
||||
case 'number-set':
|
||||
if entity_id.startswith('fan'):
|
||||
attr = libs.home_assistant.get_entity_data(entity_id).get('attributes', [])
|
||||
value = float(value) * float(attr.get(percentage_step, 0))
|
||||
value = float(value) * float(attr.get('percentage_step', 0))
|
||||
service_data = {
|
||||
"value": int(value)
|
||||
}
|
||||
@@ -217,30 +230,6 @@ def handle_buttons(entity_id, btype, value, entity_config=None):
|
||||
case _:
|
||||
logging.error("Not implemented: %s", btype)
|
||||
|
||||
|
||||
# # for cardUnlock
|
||||
# if button_type == "cardUnlock-unlock":
|
||||
# curCard = self._config.get_card_by_uuid(
|
||||
# entity_id.replace('navigate.', ''))
|
||||
# if curCard is not None:
|
||||
# if int(curCard.raw_config.get("pin")) == int(value):
|
||||
# dstCard = self._config.search_card(
|
||||
# curCard.raw_config.get("destination"))
|
||||
# if dstCard is not None:
|
||||
# if dstCard.hidden:
|
||||
# self._previous_cards.append(self._current_card)
|
||||
# self._current_card = dstCard
|
||||
# self._pages_gen.render_card(self._current_card)
|
||||
|
||||
# if button_type == "opnSensorNotify":
|
||||
# msg = ""
|
||||
# entity = apis.ha_api.get_entity(entity_id)
|
||||
# if "open_sensors" in entity.attributes and entity.attributes.open_sensors is not None:
|
||||
# for e in entity.attributes.open_sensors:
|
||||
# msg += f"- {apis.ha_api.get_entity(e).attributes.friendly_name}\r\n"
|
||||
# self._pages_gen.send_message_page(
|
||||
# "opnSensorNotifyRes", "", msg, "", "")
|
||||
|
||||
def call_ha_service(entity_id, service, service_data = {}):
|
||||
etype = entity_id.split(".")[0]
|
||||
libs.home_assistant.call_service(
|
||||
|
||||
@@ -232,7 +232,7 @@ def execute_script(entity_name: str, domain: str, service: str, service_data: di
|
||||
]
|
||||
}
|
||||
send_message(json.dumps(msg))
|
||||
# busy waiting for response with a timeout of 0.2 seconds - maybe there's a better way of doing this
|
||||
# busy waiting for response with a timeout of 0.4 seconds- maybe there's a better way of doing this
|
||||
mustend = time.time() + 0.4
|
||||
while time.time() < mustend:
|
||||
if response_buffer[call_id] == True:
|
||||
@@ -246,6 +246,8 @@ def execute_script(entity_name: str, domain: str, service: str, service_data: di
|
||||
return {}
|
||||
|
||||
def cache_template(template):
|
||||
if not template:
|
||||
raise Exception("Invalid template")
|
||||
global next_id, response_buffer
|
||||
try:
|
||||
call_id = next_id
|
||||
@@ -273,6 +275,18 @@ def get_template(template):
|
||||
else:
|
||||
return template_cache.get(template, []).get("result", "404")
|
||||
|
||||
def get_template_listener_entities(template):
|
||||
global template_cache
|
||||
if template in template_cache:
|
||||
return template_cache[template].get("listener-entities")
|
||||
else:
|
||||
mustend = time.time() + 0.5
|
||||
while time.time() < mustend:
|
||||
if template not in template_cache:
|
||||
time.sleep(0.0001)
|
||||
else:
|
||||
return template_cache.get(template, []).get("listener-entities", "404")
|
||||
|
||||
def get_entity_data(entity_id: str):
|
||||
if entity_id in home_assistant_entity_state_cache:
|
||||
return home_assistant_entity_state_cache[entity_id]
|
||||
|
||||
@@ -41,3 +41,7 @@ def entityUpdateDetail2(msg_out_queue, topic, data):
|
||||
|
||||
def statusUpdate(msg_out_queue, topic, data):
|
||||
custom_send(msg_out_queue, topic, f"statusUpdate~{data}")
|
||||
|
||||
def send_message_page(msg_out_queue, topic, ident, heading, msg, b1, b2):
|
||||
page_type(msg_out_queue, topic, "popupNotify")
|
||||
custom_send(msg_out_queue, topic, f"entityUpdateDetail~{ident}~{heading}~65535~{b1}~65535~{b2}~65535~{msg}~65535~0")
|
||||
@@ -7,7 +7,7 @@ from scheduler import Scheduler
|
||||
import scheduler.trigger as trigger
|
||||
import time
|
||||
import babel.dates
|
||||
from ha_cards import Screensaver, EntitiesCard, card_factory, detail_open
|
||||
from ha_cards import Screensaver, card_factory, detail_open
|
||||
import ha_control
|
||||
|
||||
class LovelaceUIPanel:
|
||||
@@ -67,7 +67,7 @@ class LovelaceUIPanel:
|
||||
self.schedule = Scheduler()
|
||||
self.schedule.minutely(datetime.time(second=0), self.update_time)
|
||||
self.schedule.hourly(datetime.time(
|
||||
minute=0, second=0), self.update_time)
|
||||
minute=0, second=0), self.update_date)
|
||||
schedule_thread = threading.Thread(target=self.schedule_thread_target)
|
||||
schedule_thread.daemon = True
|
||||
schedule_thread.start()
|
||||
@@ -76,6 +76,10 @@ class LovelaceUIPanel:
|
||||
ha_control.wait_for_ha_cache()
|
||||
|
||||
#request templates on cards
|
||||
if isinstance(self.settings.get("sleepBrightness",""), str) and self.settings.get("sleepBrightness", "").startswith("ha:"):
|
||||
libs.home_assistant.cache_template(self.settings.get("sleepBrightness"))
|
||||
if isinstance(self.settings.get("sleepBrightness",""), str) and self.settings.get("screenBrightness", "").startswith("ha:"):
|
||||
libs.home_assistant.cache_template(self.settings.get("screenBrightness"))
|
||||
for c in self.cards.values():
|
||||
if hasattr(c, "qrcode"):
|
||||
if c.qrcode.startswith("ha:"):
|
||||
@@ -242,12 +246,6 @@ class LovelaceUIPanel:
|
||||
self.render_current_page(switchPages=True)
|
||||
return
|
||||
|
||||
# replace iid with real entity id
|
||||
#if entity_id.startswith("iid."):
|
||||
# iid = entity_id.split(".")[1]
|
||||
# if iid in self.entity_iids:
|
||||
# entity_id = self.entity_iids[iid]
|
||||
|
||||
# replace iid with real entity id
|
||||
if entity_id.startswith("iid."):
|
||||
iid = entity_id.split(".")[1]
|
||||
|
||||
Reference in New Issue
Block a user