mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-19 22:24:15 +01:00
v4.8.0 - Update NsPanelTs.ts
* Add popupShutter2 * Add popupLight2 * Add popupSlider (cardMedia EQ) * Fix Demomodus cardPower * Small Fixes
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
TypeScript v4.7.1.2 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne
|
||||
- abgestimmt auf TFT 56 / v4.7.1 / BerryDriver 9 / Tasmota 14.5.0
|
||||
TypeScript v4.8.0.1 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @ticaki / @Britzelpuf / @Sternmiere / @ravenS0ne
|
||||
- abgestimmt auf TFT 57 / v4.8.0 / BerryDriver 9 / Tasmota 15.0.1
|
||||
@joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker
|
||||
NsPanelTs.ts (dieses TypeScript in ioBroker) Stable: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts
|
||||
icon_mapping.ts: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts (TypeScript muss in global liegen)
|
||||
@@ -59,10 +59,19 @@ ReleaseNotes:
|
||||
- 10.04.2025 - v4.7.1 TFT 56 / 4.7.1 - Add Player Icon-Logos logo-alexa, logo-spotify, logo-dlna, logo-sonos, logo-mpd, logo-volumios, logo-bose
|
||||
- 10.04.2025 - v4.7.1.1 Add parameter playerMediaIcon to cardMedia
|
||||
- 12.04.2025 - v4.7.1.2 Fix Play/Pause in MediaPlayers
|
||||
- 13.04.2025 - v4.7.1.2 TFT 56 / 4.7.1 (US-P and US-L)
|
||||
|
||||
Todo:
|
||||
- XX.12.2024 - v5.0.0 ioBroker Adapter
|
||||
- 13.04.2025 - v4.7.1.2 TFT 56 / 4.7.1 (US-P and US-L)
|
||||
- 14.04.2025 - v4.7.1.3 MrIcons also allow other mqtt states
|
||||
- 24.04.2025 - v4.7.2.1 Add popupSlider to cardMedia (alexa)
|
||||
- 12.06.2025 - v4.7.2.2 States only respond to any if ack = false
|
||||
- 20.06.2025 - v4.7.2.3 IconSelect left- and indicatorScreensaverEntity added
|
||||
- 21.06.2025 - v4.7.2.4 Fix Demomodus Powerpage
|
||||
- 22.06.2025 - v4.7.3 TFT 56 / 4.7.3 - Change Direction Pictures ColorTemperature (warmwhite left/coldwhite right)
|
||||
- 23.06.2025 - v4.7.4 TFT 56 / 4.7.4 - Refactoring popupShutter (shutter/shutter2)
|
||||
- 24.06.2025 - v4.7.4.1 Refactoring popupShutter (split into shutter/shutter2)
|
||||
- 25.06.2025 - v4.7.5 TFT 56 / 4.7.5 - Refactoring popupLight2 (light/light2) --> EU + US-P
|
||||
- 25.06.2025 - v4.7.5.1 Add popupLight2 (split into light/light2)
|
||||
- 26.06.2025 - v4.7.5 TFT 56 / 4.7.5 - Refactoring popupLight2 (light/light2) --> US-L
|
||||
- 30.06.2025 - v4.8.0 TFT 57 / 4.8.0 - Stable - Fix popupShutter2 (eu/us-l/us-p)
|
||||
|
||||
***************************************************************************************************************
|
||||
* DE: Für die Erstellung der Aliase durch das Skript, muss in der JavaScript Instanz "setObject" gesetzt sein! *
|
||||
@@ -104,6 +113,7 @@ Popup-Pages:
|
||||
popupNotify Page - Info - Seite mit Headline Text und Buttons - Intern für manuelle Updates / Extern zur Befüllung von Datenpunkten unter 0_userdata
|
||||
screensaver Notify - Über zwei externe Datenpunkte in 0_userdata können "Headline" und "Text" an den Screensaver zur Info gesendet werden
|
||||
popupInSel Page - Auswahlliste (InputSelect)
|
||||
popupSlider Page - 3 vertikal ausgerichtete Slider. Abweichender 0 Punkt möglich
|
||||
|
||||
Mögliche Aliase: (Vorzugsweise mit ioBroker-Adapter "Geräte verwalten" konfigurieren, da SET, GET, ACTUAL, etc. verwendet werden)
|
||||
Info - Werte aus Datenpunkt
|
||||
@@ -162,10 +172,10 @@ Install/Upgrades in Konsole:
|
||||
|
||||
Tasmota BerryDriver Install: Backlog UrlFetch https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1
|
||||
Tasmota BerryDriver Update: Backlog UpdateDriverVersion https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1
|
||||
TFT EU STABLE Version: FlashNextion http://nspanel.de/nspanel-v4.7.1.tft
|
||||
TFT EU STABLE Version: FlashNextion http://nspanel.de/nspanel-v4.8.0.tft
|
||||
|
||||
TFT US-L STABLE Version: FlashNextion http://nspanel.de/nspanel-us-l-v4.7.1.tft
|
||||
TFT US-P STABLE Version: FlashNextion http://nspanel.de/nspanel-us-p-v4.7.1.tft
|
||||
TFT US-L STABLE Version: FlashNextion http://nspanel.de/nspanel-us-l-v4.8.0.tft
|
||||
TFT US-P STABLE Version: FlashNextion http://nspanel.de/nspanel-us-p-v4.8.0.tft
|
||||
---------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -948,9 +958,9 @@ export const config: Config = {
|
||||
// _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
|
||||
// _________________________________ EN: No more configuration from here _____________________________________
|
||||
|
||||
const scriptVersion: string = 'v4.7.1.2';
|
||||
const tft_version: string = 'v4.7.1';
|
||||
const desired_display_firmware_version = 56;
|
||||
const scriptVersion: string = 'v4.8.0.1';
|
||||
const tft_version: string = 'v4.8.0';
|
||||
const desired_display_firmware_version = 57;
|
||||
const berry_driver_version = 9;
|
||||
|
||||
const tasmotaOtaUrl: string = 'http://ota.tasmota.com/tasmota32/release/';
|
||||
@@ -2360,7 +2370,7 @@ async function SubscribeMRIcons () {
|
||||
}
|
||||
if (arr.length > 0) {
|
||||
on({id: arr, change: 'ne'}, async function (obj) {
|
||||
if (obj.id && obj.id.substring(0, 4) == 'mqtt') {
|
||||
if (obj.id && obj.id.substring(0, 4) == 'mqtt' &&(obj.id.endsWith('.stat.POWER1') || obj.id.endsWith('.stat.Power2'))) {
|
||||
let Button = obj.id.split('.');
|
||||
if (getState(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5, 6)).val != obj.state.val) {
|
||||
await setStateAsync(NSPanel_Path + 'Relay.' + Button[Button.length - 1].substring(5, 6), obj.state.val == 'ON' ? true : false);
|
||||
@@ -5119,6 +5129,8 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'temperature':
|
||||
|
||||
case 'illuminance':
|
||||
|
||||
case 'value.temperature':
|
||||
|
||||
case 'value.humidity':
|
||||
@@ -5227,6 +5239,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
case 'socket':
|
||||
case 'light':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2) {
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : role == 'socket' ? Icons.GetIcon('power-socket-de') : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : role == 'socket' ? Icons.GetIcon('power-socket-de') : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5246,6 +5265,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'hue':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5282,6 +5308,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'ct':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5315,6 +5348,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'rgb':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5362,6 +5402,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'cie':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5408,6 +5455,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'rgbSingle':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5456,6 +5510,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'dimmer':
|
||||
type = 'light';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'light';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'light2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('lightbulb');
|
||||
iconId2 = pageItem.icon2 !== undefined ? Icons.GetIcon(pageItem.icon2) : Icons.GetIcon('lightbulb-outline');
|
||||
optVal = '0';
|
||||
@@ -5475,6 +5536,13 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'blind':
|
||||
type = 'shutter';
|
||||
if (pageItem.popupVersion !== undefined) {
|
||||
if (pageItem.popupVersion == 1) {
|
||||
type = 'shutter';
|
||||
} else if (pageItem.popupVersion == 2){
|
||||
type = 'shutter2';
|
||||
}
|
||||
}
|
||||
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('window-open');
|
||||
iconColor = GetIconColor(pageItem, existsState(pageItem.id + '.ACTUAL') ? getState(pageItem.id + '.ACTUAL').val : true, useColors);
|
||||
// only if icon3 is set go into 3 icons
|
||||
@@ -5576,6 +5644,8 @@ function CreateEntity (pageItem: PageItem, placeId: number, useColors: boolean =
|
||||
|
||||
case 'humidity':
|
||||
|
||||
case 'illuminance':
|
||||
|
||||
case 'temperature':
|
||||
|
||||
case 'value.temperature':
|
||||
@@ -6031,7 +6101,10 @@ function RegisterEntityWatcher (id: string): void {
|
||||
return;
|
||||
}
|
||||
|
||||
subscriptions[id] = on({id: id, change: 'any'}, () => {
|
||||
subscriptions[id] = on({id: id, change: 'any'}, (obj) => {
|
||||
if (obj.oldState && obj.oldState.val === obj.state.val && obj.state.ack) {
|
||||
return;
|
||||
}
|
||||
if (pageId == -1 && config.button1.page) {
|
||||
SendToPanel({payload: GeneratePageElements(config.button1.page)});
|
||||
}
|
||||
@@ -6067,7 +6140,10 @@ function RegisterDetailEntityWatcher (id: string, pageItem: PageItem, type: NSPa
|
||||
|
||||
if (Debug) log('id: ' + id + ' - pageItem: ' + JSON.stringify(pageItem) + ' - type: ' + type + ' - placeId: ' + placeId, 'info');
|
||||
|
||||
subscriptions[id] = on({id: id, change: 'any'}, () => {
|
||||
subscriptions[id] = on({id: id, change: 'any'}, (obj) => {
|
||||
if (obj.oldState && obj.oldState.val === obj.state.val && obj.state.ack) {
|
||||
return;
|
||||
}
|
||||
SendToPanel(GenerateDetailPage(type, undefined, pageItem, placeId));
|
||||
});
|
||||
} catch (err: any) {
|
||||
@@ -7060,8 +7136,8 @@ function GenerateMediaPage (page: NSPanel.PageMedia): NSPanel.Payload[] {
|
||||
if (existsObject(id)) {
|
||||
let name = getState(id + '.ALBUM').val;
|
||||
let title = getState(id + '.TITLE').val;
|
||||
if (title.length > 26) {
|
||||
title = title.slice(0, 26) + '...';
|
||||
if (title.length > 24) {
|
||||
title = title.slice(0, 24) + '...';
|
||||
}
|
||||
if (existsObject(id + '.DURATION') && existsObject(id + '.ELAPSED')) {
|
||||
if (v2Adapter == 'alexa2') {
|
||||
@@ -7315,7 +7391,7 @@ function GenerateMediaPage (page: NSPanel.PageMedia): NSPanel.Payload[] {
|
||||
author = findLocale('media', 'no_music_to_control');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Volumio
|
||||
if (v2Adapter == 'volumio') {
|
||||
media_icon = Icons.GetIcon('clock-time-twelve-outline');
|
||||
@@ -7607,13 +7683,18 @@ function GenerateMediaPage (page: NSPanel.PageMedia): NSPanel.Payload[] {
|
||||
'input_sel' + '~' + tid + '?tracklist' + '~' + Icons.GetIcon('animation-play-outline') + '~' + trackListIconCol + '~' + findLocale('media', 'tracklist') + '~' + 'media2~';
|
||||
}
|
||||
|
||||
//InSel EQ
|
||||
// InSel/Slider EQ
|
||||
let equalizerListString: string = '~~~~~~';
|
||||
let equalizerListIconCol = rgb_dec565(HMIOff);
|
||||
|
||||
if (page.items[0].equalizerList != undefined) {
|
||||
equalizerListIconCol = rgb_dec565(HMIOn);
|
||||
equalizerListString =
|
||||
'input_sel' + '~' + tid + '?equalizer' + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~';
|
||||
} else if (page.items[0].equalizerSlider != undefined && v2Adapter == 'alexa2') {
|
||||
equalizerListIconCol = rgb_dec565(HMIOn);
|
||||
equalizerListString =
|
||||
'slider' + '~' + tid + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~';
|
||||
} else if (page.items[0].equalizerList == undefined && v2Adapter == 'sonos') {
|
||||
let equalizerListIconCol = rgb_dec565(HMIOn);
|
||||
//equalizerListString is used for favariteList
|
||||
@@ -8294,7 +8375,7 @@ function GeneratePowerPage (page: NSPanel.PagePower): NSPanel.Payload[] {
|
||||
try {
|
||||
let obj: object = {};
|
||||
let demoMode = false;
|
||||
if (page.items[0].id == undefined) {
|
||||
if (page.items[0].id === 'DEMO') {
|
||||
log('No PageItem defined - cardPower demo mode active', 'info');
|
||||
demoMode = true;
|
||||
}
|
||||
@@ -8791,6 +8872,18 @@ function HandleButtonEvent (words: any): void {
|
||||
pageCounter = 0;
|
||||
GeneratePage(activePage!);
|
||||
}
|
||||
if (words[2] == 'popupSlider' && activePage!.type == 'cardMedia') {
|
||||
if (Debug) log('Leave popupSlider without any action', 'info');
|
||||
pageCounter = 0;
|
||||
GeneratePage(activePage!);
|
||||
setTimeout(async function () {
|
||||
pageCounter = 1;
|
||||
GeneratePage(activePage!);
|
||||
}, 3000);
|
||||
} else {
|
||||
pageCounter = 0;
|
||||
GeneratePage(activePage!);
|
||||
}
|
||||
break;
|
||||
case 'bHome':
|
||||
if (Debug) {
|
||||
@@ -9035,6 +9128,39 @@ function HandleButtonEvent (words: any): void {
|
||||
setIfExists(id + '.CLOSE', true);
|
||||
checkBlindActive = true;
|
||||
break;
|
||||
case 'button1Press':
|
||||
let pageItemShutterButton1 = findPageItem(id);
|
||||
if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined && pageItemShutterButton1.shutterIcons[0].buttonType == 'toggle') {
|
||||
toggleState(pageItemShutterButton1.shutterIcons[0].id);
|
||||
} else if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined && pageItemShutterButton1.shutterIcons[0].buttonType == 'press') {
|
||||
setIfExists(pageItemShutterButton1.shutterIcons[0].id, true);
|
||||
} else {
|
||||
//do nothing
|
||||
}
|
||||
if (Debug) log("Shutter2 - Button1 Touch Press Event", 'info');
|
||||
break;
|
||||
case 'button2Press':
|
||||
let pageItemShutterButton2 = findPageItem(id);
|
||||
if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined && pageItemShutterButton2.shutterIcons[1].buttonType == 'toggle') {
|
||||
toggleState(pageItemShutterButton2.shutterIcons[1].id);
|
||||
} else if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined && pageItemShutterButton2.shutterIcons[1].buttonType == 'press') {
|
||||
setIfExists(pageItemShutterButton2.shutterIcons[1].id, true);
|
||||
} else {
|
||||
//do nothing
|
||||
}
|
||||
if (Debug) log("Shutter2 - Button2 Touch Press Event", 'info');
|
||||
break;
|
||||
case 'button3Press':
|
||||
let pageItemShutterButton3 = findPageItem(id);
|
||||
if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined && pageItemShutterButton3.shutterIcons[2].buttonType == 'toggle') {
|
||||
toggleState(pageItemShutterButton3.shutterIcons[2].id);
|
||||
} else if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined && pageItemShutterButton3.shutterIcons[2].buttonType == 'press') {
|
||||
setIfExists(pageItemShutterButton3.shutterIcons[2].id, true);
|
||||
} else {
|
||||
//do nothing
|
||||
}
|
||||
if (Debug) log("Shutter2 - Button3 Touch Press Event", 'info');
|
||||
break;
|
||||
case 'positionSlider':
|
||||
(function () {
|
||||
if (timeoutSlider) {
|
||||
@@ -9528,6 +9654,37 @@ function HandleButtonEvent (words: any): void {
|
||||
GeneratePage(activePage!);
|
||||
}, 3000);
|
||||
break;
|
||||
case 'positionSlider1':
|
||||
case 'positionSlider2':
|
||||
case 'positionSlider3':
|
||||
let newSliderVal: number = 0
|
||||
let pageItemSlider = findPageItem(id);
|
||||
if (isPageMediaItem(pageItemSlider)) {
|
||||
let adaInstanceSplit = pageItemSlider.adapterPlayerInstance!.split('.');
|
||||
if (adaInstanceSplit[0] == 'alexa2') {
|
||||
if (words[4] > 6) {
|
||||
newSliderVal = words[4] - 6;
|
||||
} else if (words[4] < 6) {
|
||||
newSliderVal = (6 - words[4]) * -1;
|
||||
}
|
||||
if (Debug) log(words[3] + ': ' + newSliderVal);
|
||||
switch (words[3]) {
|
||||
case 'positionSlider1':
|
||||
if (Debug) log(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerBass');
|
||||
setState(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerBass', newSliderVal);
|
||||
break;
|
||||
case 'positionSlider2':
|
||||
if (Debug) log(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerMidRange');
|
||||
setState(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerMidRange', newSliderVal);
|
||||
break;
|
||||
case 'positionSlider3':
|
||||
if (Debug) log(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerTreble');
|
||||
setState(pageItemSlider.adapterPlayerInstance + 'Echo-Devices.' + pageItemSlider.mediaDevice + '.Preferences.equalizerTreble', newSliderVal);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'mode-seek':
|
||||
let pageItemSeek = findPageItem(id);
|
||||
if (!isPageMediaItem(pageItemSeek)) break;
|
||||
@@ -10655,6 +10812,114 @@ function GenerateDetailPage (type: NSPanel.PopupType, optional: NSPanel.mediaOpt
|
||||
}
|
||||
}
|
||||
|
||||
if (type == 'popupSlider') {
|
||||
|
||||
let tempId = placeId != undefined ? placeId : id;
|
||||
|
||||
if (isPageMediaItem(pageItem)) {
|
||||
|
||||
const vTempAdapter = pageItem.adapterPlayerInstance!.split('.');
|
||||
const vAdapter: NSPanel.PlayerType = vTempAdapter[0] as NSPanel.PlayerType;
|
||||
|
||||
if (vAdapter == 'alexa2') {
|
||||
|
||||
let tSlider1: string = pageItem.equalizerSlider[0].Slider1.heading ?? "Bass";
|
||||
let tIconS1M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider1.icon1 ?? "minus-box");
|
||||
let tIconS1P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider1.icon2 ?? "plus-box");
|
||||
let hSlider1MinVal: number = pageItem.equalizerSlider[0].Slider1.minValue ?? 0;
|
||||
let hSlider1MaxVal: number = pageItem.equalizerSlider[0].Slider1.maxValue ?? 12;
|
||||
let hSlider1ZeroVal: number = pageItem.equalizerSlider[0].Slider1.zeroValue ?? 6;
|
||||
let hSlider1CurVal: number = getState(pageItem.adapterPlayerInstance! + 'Echo-Devices.' + pageItem.mediaDevice! + '.Preferences.equalizerBass').val + hSlider1ZeroVal;
|
||||
let hSlider1Step: number = pageItem.equalizerSlider[0].Slider1.stepValue ?? 1;
|
||||
let hSlider1Visibility: string = "enable";
|
||||
|
||||
let tSlider2: string = pageItem.equalizerSlider[0].Slider2.heading ?? "MidRange";
|
||||
let tIconS2M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider2.icon1 ?? "minus-box");
|
||||
let tIconS2P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider2.icon2 ?? "plus-box");
|
||||
let hSlider2MinVal: number = pageItem.equalizerSlider[0].Slider2.minValue ?? 0;
|
||||
let hSlider2MaxVal: number = pageItem.equalizerSlider[0].Slider2.maxValue ?? 12;
|
||||
let hSlider2ZeroVal: number = pageItem.equalizerSlider[0].Slider2.zeroValue ?? 6;
|
||||
let hSlider2CurVal: number = getState(pageItem.adapterPlayerInstance! + 'Echo-Devices.' + pageItem.mediaDevice! + '.Preferences.equalizerMidRange').val + hSlider2ZeroVal;
|
||||
let hSlider2Step: number = pageItem.equalizerSlider[0].Slider2.stepValue ?? 1;
|
||||
let hSlider2Visibility: string = "enable";
|
||||
|
||||
let tSlider3: string = pageItem.equalizerSlider[0].Slider3.heading ?? "Treble";
|
||||
let tIconS3M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider3.icon1 ?? "minus-box");
|
||||
let tIconS3P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider3.icon2 ?? "plus-box");
|
||||
let hSlider3MinVal: number = pageItem.equalizerSlider[0].Slider3.minValue ?? 0;
|
||||
let hSlider3MaxVal: number = pageItem.equalizerSlider[0].Slider3.maxValue ?? 12;
|
||||
let hSlider3ZeroVal: number = pageItem.equalizerSlider[0].Slider3.zeroValue ?? 6;
|
||||
let hSlider3CurVal: number = getState(pageItem.adapterPlayerInstance! + 'Echo-Devices.' + pageItem.mediaDevice! + '.Preferences.equalizerTreble').val + hSlider3ZeroVal;
|
||||
let hSlider3Step: number = pageItem.equalizerSlider[0].Slider3.stepValue ?? 1;
|
||||
let hSlider3Visibility: string = "enable";
|
||||
|
||||
out_msgs.push({
|
||||
payload:
|
||||
'entityUpdateDetail' +
|
||||
'~' + //entityUpdateDetail
|
||||
tempId +
|
||||
'~' +
|
||||
// Slider1
|
||||
tSlider1 + // Slider1 Headline --> tmSerial 2
|
||||
'~' +
|
||||
tIconS1M + // Slider1 Left Icon --> tmSerial 3
|
||||
'~' +
|
||||
tIconS1P + // Slider1 Right Icon --> tmSerial 4
|
||||
'~' +
|
||||
hSlider1CurVal + // Slider1 Current Slider Value --> tmSerial 5
|
||||
'~' +
|
||||
hSlider1MinVal + // Slider1 Minimal Slider Value --> tmSerial 6
|
||||
'~' +
|
||||
hSlider1MaxVal + // Slider1 Maximal Slider Value --> tmSerial 7
|
||||
'~' +
|
||||
hSlider1ZeroVal + // If Slider 0 is betweeb Min and Max --> tmSerial 8
|
||||
'~' +
|
||||
hSlider1Step + // If Slider Tap > --> tmSerial 9
|
||||
'~' +
|
||||
hSlider1Visibility // If Slider Tap > --> tmSerial 10
|
||||
// Slider2
|
||||
+ '~' +
|
||||
tSlider2 + // Slider2 Headline --> tmSerial 11
|
||||
'~' +
|
||||
tIconS2M + // Slider2 Left Icon --> tmSerial 12
|
||||
'~' +
|
||||
tIconS2P + // Slider2 Right Icon --> tmSerial 13
|
||||
'~' +
|
||||
hSlider2CurVal + // Slider2 Current Slider Value --> tmSerial 14
|
||||
'~' +
|
||||
hSlider2MinVal + // Slider2 Minimal Slider Value --> tmSerial 15
|
||||
'~' +
|
||||
hSlider2MaxVal + // Slider2 Maximal Slider Value --> tmSerial 16
|
||||
'~' +
|
||||
hSlider2ZeroVal + // If Slider2 0 is betweeb Min and Max --> tmSerial 17
|
||||
'~' +
|
||||
hSlider2Step + // If Slider2 Tap > 1 --> tmSerial 18
|
||||
'~' +
|
||||
hSlider2Visibility // If Slider Tap > --> tmSerial 19
|
||||
// Slider3
|
||||
+ '~' +
|
||||
tSlider3 + // Slider3 Headline --> tmSerial 20
|
||||
'~' +
|
||||
tIconS3M + // Slider3 Left Icon --> tmSerial 21
|
||||
'~' +
|
||||
tIconS3P + // Slider3 Right Icon --> tmSerial 22
|
||||
'~' +
|
||||
hSlider3CurVal + // Slider3 Current Slider Value --> tmSerial 23
|
||||
'~' +
|
||||
hSlider3MinVal + // Slider2 Minimal Slider Value --> tmSerial 24
|
||||
'~' +
|
||||
hSlider3MaxVal + // Slider2 Maximal Slider Value --> tmSerial 25
|
||||
'~' +
|
||||
hSlider3ZeroVal + // If Slider3 0 is betweeb Min and Max --> tmSerial 26
|
||||
'~' +
|
||||
hSlider3Step + // If Slider3 Tap > 1 --> tmSerial 27
|
||||
'~' +
|
||||
hSlider3Visibility // If Slider Tap > --> tmSerial 28
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (type == 'popupShutter') {
|
||||
icon = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('window-open');
|
||||
if (existsState(id + '.ACTUAL')) {
|
||||
@@ -10778,6 +11043,166 @@ function GenerateDetailPage (type: NSPanel.PopupType, optional: NSPanel.mediaOpt
|
||||
});
|
||||
}
|
||||
|
||||
if (type == 'popupShutter2') {
|
||||
icon = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon('window-open');
|
||||
if (existsState(id + '.ACTUAL')) {
|
||||
val = getState(id + '.ACTUAL').val;
|
||||
RegisterDetailEntityWatcher(id + '.ACTUAL', pageItem, type, placeId);
|
||||
} else if (existsState(id + '.SET')) {
|
||||
val = getState(id + '.SET').val;
|
||||
}
|
||||
|
||||
let min_Level: number = 0;
|
||||
let max_Level: number = 100;
|
||||
|
||||
if (pageItem.minValueLevel !== undefined && pageItem.maxValueLevel !== undefined) {
|
||||
min_Level = pageItem.minValueLevel;
|
||||
max_Level = pageItem.maxValueLevel;
|
||||
val = Math.trunc(scale(getState(id + '.ACTUAL').val, pageItem.minValueLevel, pageItem.maxValueLevel, 100, 0));
|
||||
}
|
||||
|
||||
if (Debug) log('minLevel ' + min_Level + ' maxLevel ' + max_Level + ' Level ' + val, 'info');
|
||||
|
||||
let textSecondRow = '';
|
||||
let icon_id = icon;
|
||||
let icon_up = Icons.GetIcon('arrow-up');
|
||||
let icon_stop = Icons.GetIcon('stop');
|
||||
let icon_down = Icons.GetIcon('arrow-down');
|
||||
let tempVal: number = getState(pageItem.id + '.ACTUAL').val;
|
||||
|
||||
//Disabled Status while bug in updating origin adapter data points of lift values
|
||||
let icon_up_status = 'enable';
|
||||
//let icon_up_status = tempVal === min_Level ? 'disable' : 'enable';
|
||||
let icon_stop_status = 'enable';
|
||||
if (tempVal === min_Level || tempVal === max_Level || checkBlindActive === false) {
|
||||
//icon_stop_status = 'disable';
|
||||
}
|
||||
let icon_down_status = 'enable';
|
||||
//let icon_down_status = tempVal === max_Level ? 'disable' : 'enable';
|
||||
|
||||
if (pageItem.secondRow != undefined) {
|
||||
textSecondRow = pageItem.secondRow;
|
||||
}
|
||||
|
||||
let tempId = placeId != undefined ? placeId : id;
|
||||
|
||||
//shutterIcons - Button1
|
||||
let bEntity1State : boolean = false;
|
||||
let bEntity1Icon : string = 'power';
|
||||
let bEntity1Color : number = rgb_dec565(White);
|
||||
let bEntity1Visibility : string = 'disable';
|
||||
if (pageItem.shutterIcons && pageItem.shutterIcons[0] != undefined) {
|
||||
if (pageItem.shutterIcons[0].id != undefined) {
|
||||
bEntity1Visibility = 'enable';
|
||||
RegisterDetailEntityWatcher(pageItem.shutterIcons[0].id, pageItem, type, placeId);
|
||||
bEntity1State = getState(pageItem.shutterIcons[0].id).val;
|
||||
if (bEntity1State) {
|
||||
bEntity1Icon = Icons.GetIcon(pageItem.shutterIcons[0].icon) ?? bEntity1Icon;
|
||||
bEntity1Color = rgb_dec565(pageItem.shutterIcons[0].iconOnColor) ?? bEntity1Color;
|
||||
} else {
|
||||
bEntity1Icon = Icons.GetIcon(pageItem.shutterIcons[0].icon2) ?? bEntity1Icon;
|
||||
bEntity1Color = rgb_dec565(pageItem.shutterIcons[0].iconOffColor) ?? bEntity1Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//shutterIcons - Button2
|
||||
let bEntity2State : boolean = false;
|
||||
let bEntity2Icon : string = 'power';
|
||||
let bEntity2Color : number = rgb_dec565(White);
|
||||
let bEntity2Visibility : string = 'disable';
|
||||
if (pageItem.shutterIcons && pageItem.shutterIcons[1] != undefined) {
|
||||
if (pageItem.shutterIcons[1].id != undefined) {
|
||||
bEntity2Visibility = 'enable';
|
||||
RegisterDetailEntityWatcher(pageItem.shutterIcons[1].id, pageItem, type, placeId);
|
||||
bEntity2State = getState(pageItem.shutterIcons[1].id).val;
|
||||
if (bEntity2State) {
|
||||
bEntity2Icon = Icons.GetIcon(pageItem.shutterIcons[1].icon) ?? bEntity2Icon;
|
||||
bEntity2Color = rgb_dec565(pageItem.shutterIcons[1].iconOnColor) ?? bEntity2Color;
|
||||
} else {
|
||||
bEntity2Icon = Icons.GetIcon(pageItem.shutterIcons[1].icon2) ?? bEntity2Icon;
|
||||
bEntity2Color = rgb_dec565(pageItem.shutterIcons[1].iconOffColor) ?? bEntity2Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//shutterIcons - Button3
|
||||
let bEntity3State : boolean = false;
|
||||
let bEntity3Icon : string = 'power';
|
||||
let bEntity3Color : number = rgb_dec565(White);
|
||||
let bEntity3Visibility : string = 'disable';
|
||||
if (pageItem.shutterIcons && pageItem.shutterIcons[2] != undefined) {
|
||||
if (pageItem.shutterIcons[2].id != undefined) {
|
||||
bEntity3Visibility = 'enable';
|
||||
RegisterDetailEntityWatcher(pageItem.shutterIcons[2].id, pageItem, type, placeId);
|
||||
bEntity3State = getState(pageItem.shutterIcons[2].id).val;
|
||||
if (bEntity3State) {
|
||||
bEntity3Icon = Icons.GetIcon(pageItem.shutterIcons[2].icon) ?? bEntity3Icon;
|
||||
bEntity3Color = rgb_dec565(pageItem.shutterIcons[2].iconOnColor) ?? bEntity3Color;
|
||||
} else {
|
||||
bEntity3Icon = Icons.GetIcon(pageItem.shutterIcons[2].icon2) ?? bEntity3Icon;
|
||||
bEntity3Color = rgb_dec565(pageItem.shutterIcons[2].iconOffColor) ?? bEntity3Color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let shutterTyp = 'shutter';
|
||||
if (pageItem.shutterType != undefined) {
|
||||
shutterTyp = pageItem.shutterType;
|
||||
}
|
||||
|
||||
out_msgs.push({
|
||||
payload:
|
||||
'entityUpdateDetail' +
|
||||
'~' + //entityUpdateDetail
|
||||
tempId +
|
||||
'~' + //entity_id
|
||||
val +
|
||||
'~' + //Shutterposition
|
||||
textSecondRow +
|
||||
'~' + //pos_status 2.line
|
||||
findLocale('blinds', 'Position') +
|
||||
'~' + //pos_translation
|
||||
icon_id +
|
||||
'~' + //{icon_id}~
|
||||
icon_up +
|
||||
'~' + //{icon_up}~
|
||||
icon_stop +
|
||||
'~' + //{icon_stop}~
|
||||
icon_down +
|
||||
'~' + //{icon_down}~
|
||||
icon_up_status +
|
||||
'~' + //{icon_up_status}~
|
||||
icon_stop_status +
|
||||
'~' + //{icon_stop_status}~
|
||||
icon_down_status +
|
||||
//shutterIcons
|
||||
//bEntity1
|
||||
'~' +
|
||||
bEntity1Icon + //12
|
||||
'~' +
|
||||
bEntity1Color + //13
|
||||
'~' +
|
||||
bEntity1Visibility + //14
|
||||
//bEntity2
|
||||
'~' +
|
||||
bEntity2Icon + //15
|
||||
'~' +
|
||||
bEntity2Color + //16
|
||||
'~' +
|
||||
bEntity2Visibility + //17
|
||||
//bEntity3
|
||||
'~' +
|
||||
bEntity3Icon + //18
|
||||
'~' +
|
||||
bEntity3Color + //19
|
||||
'~' +
|
||||
bEntity3Visibility + //20
|
||||
'~' +
|
||||
shutterTyp //21 for Future
|
||||
});
|
||||
}
|
||||
|
||||
if (type == 'popupThermo') {
|
||||
let vIcon = pageItem.icon != undefined ? pageItem.icon : 'fan';
|
||||
let mode1 = isPageThermoItem(pageItem) && pageItem.popupThermoMode1 != undefined ? pageItem.popupThermoMode1.join('?') : '';
|
||||
@@ -11489,8 +11914,9 @@ function HandleScreensaverUpdate (): void {
|
||||
}
|
||||
|
||||
if (typeof val == 'number') {
|
||||
val =
|
||||
(val * (leftScreensaverEntity.ScreensaverEntityFactor ? leftScreensaverEntity.ScreensaverEntityFactor! : 0)).toFixed(
|
||||
val = val * (leftScreensaverEntity.ScreensaverEntityFactor ? leftScreensaverEntity.ScreensaverEntityFactor! : 0)
|
||||
icon = determineScreensaverStatusIcon(leftScreensaverEntity,val,icon)
|
||||
val = val.toFixed(
|
||||
leftScreensaverEntity.ScreensaverEntityDecimalPlaces
|
||||
) + leftScreensaverEntity.ScreensaverEntityUnitText;
|
||||
iconColor = GetScreenSaverEntityColor(leftScreensaverEntity);
|
||||
@@ -11774,8 +12200,9 @@ function HandleScreensaverUpdate (): void {
|
||||
}
|
||||
|
||||
if (typeof val == 'number') {
|
||||
val =
|
||||
(val * (indicatorScreensaverEntity.ScreensaverEntityFactor ? indicatorScreensaverEntity.ScreensaverEntityFactor! : 0)).toFixed(
|
||||
val = val * (indicatorScreensaverEntity.ScreensaverEntityFactor ? indicatorScreensaverEntity.ScreensaverEntityFactor! : 0)
|
||||
icon = determineScreensaverStatusIcon(indicatorScreensaverEntity,val,icon)
|
||||
val = val.toFixed(
|
||||
indicatorScreensaverEntity.ScreensaverEntityDecimalPlaces
|
||||
) + indicatorScreensaverEntity.ScreensaverEntityUnitText;
|
||||
iconColor = GetScreenSaverEntityColor(indicatorScreensaverEntity);
|
||||
@@ -13192,11 +13619,13 @@ function isPopupType (F: NSPanel.PopupType | string): F is NSPanel.PopupType {
|
||||
case 'popupFan':
|
||||
case 'popupInSel':
|
||||
case 'popupLight':
|
||||
case 'popupLightNew':
|
||||
case 'popupNotify':
|
||||
case 'popupShutter':
|
||||
case 'popupShutter2':
|
||||
case 'popupThermo':
|
||||
case 'popupTimer':
|
||||
case 'popupSlider':
|
||||
case 'popupColor':
|
||||
return true;
|
||||
default:
|
||||
log(`Please report to developer: Unknown NSPanel.PopupType: ${F} `, 'warn');
|
||||
@@ -13223,7 +13652,7 @@ function isPagePower (F: NSPanel.PageType | NSPanel.PagePower): F is NSPanel.Pag
|
||||
}
|
||||
|
||||
namespace NSPanel {
|
||||
export type PopupType = 'popupFan' | 'popupInSel' | 'popupLight' | 'popupLightNew' | 'popupNotify' | 'popupShutter' | 'popupThermo' | 'popupTimer';
|
||||
export type PopupType = 'popupFan' | 'popupInSel' | 'popupLight' | 'popupNotify' | 'popupShutter' | 'popupShutter2' | 'popupSlider' | 'popupThermo' | 'popupTimer' | 'popupColor';
|
||||
|
||||
export type EventMethod = 'startup' | 'sleepReached' | 'pageOpenDetail' | 'buttonPress2' | 'renderCurrentPage' | 'button1' | 'button2';
|
||||
export type panelRecvType = {
|
||||
@@ -13231,7 +13660,7 @@ namespace NSPanel {
|
||||
method: EventMethod;
|
||||
};
|
||||
|
||||
export type SerialType = 'button' | 'light' | 'shutter' | 'text' | 'input_sel' | 'timer' | 'number' | 'fan';
|
||||
export type SerialType = 'button' | 'light' | 'light2' | 'shutter' | 'shutter2' | 'text' | 'input_sel' | 'timer' | 'number' | 'fan' | 'slider';
|
||||
|
||||
/**
|
||||
* Defines the possible roles for entities in the NSPanel.
|
||||
@@ -13276,7 +13705,8 @@ namespace NSPanel {
|
||||
| 'switch.mode.wlan'
|
||||
| 'media'
|
||||
| 'timeTable'
|
||||
| 'airCondition';
|
||||
| 'airCondition'
|
||||
| 'illuminance';
|
||||
|
||||
export type ButtonActionType =
|
||||
| 'bExit'
|
||||
@@ -13292,7 +13722,13 @@ namespace NSPanel {
|
||||
| 'up'
|
||||
| 'stop'
|
||||
| 'down'
|
||||
| 'button1Press'
|
||||
| 'button2Press'
|
||||
| 'button3Press'
|
||||
| 'positionSlider'
|
||||
| 'positionSlider1'
|
||||
| 'positionSlider2'
|
||||
| 'positionSlider3'
|
||||
| 'tiltOpen'
|
||||
| 'tiltStop'
|
||||
| 'tiltSlider'
|
||||
@@ -13448,6 +13884,7 @@ namespace NSPanel {
|
||||
speakerList?: string[];
|
||||
playList?: string[];
|
||||
equalizerList?: string[];
|
||||
equalizerSlider?: any[];
|
||||
repeatList?: string[];
|
||||
globalTracklist?: string[];
|
||||
crossfade?: boolean;
|
||||
@@ -13540,9 +13977,21 @@ namespace NSPanel {
|
||||
inSel_ChoiceState?: boolean;
|
||||
iconArray?: string[];
|
||||
customIcons?: any[];
|
||||
shutterIcons?: [ shutterIcons?, shutterIcons?, shutterIcons?] | null;
|
||||
fontSize?: number;
|
||||
actionStringArray?: string[];
|
||||
alwaysOnDisplay?: boolean;
|
||||
popupVersion?: number;
|
||||
shutterType?: string;
|
||||
};
|
||||
|
||||
type shutterIcons = {
|
||||
id: string;
|
||||
icon: string;
|
||||
icon2?: string;
|
||||
iconOnColor?: RGB;
|
||||
iconOffColor?: RGB;
|
||||
buttonType: string;
|
||||
};
|
||||
|
||||
export type DimMode = {
|
||||
|
||||
Reference in New Issue
Block a user