v3.4.0.6 - Update

- Add 5 Entities in US Panel Version to cardEntities
- Fix screenSaverDoubleClick
- Add cardPower (experimental)
- Add sueezeboxrpc to cardMedia
- Time-configurable change for screensaver icons
This commit is contained in:
Armilar
2022-10-07 11:41:41 +02:00
committed by GitHub
parent 51c25100f6
commit f18546a036

View File

@@ -1,5 +1,5 @@
/*-----------------------------------------------------------------------
TypeScript v3.4.0.5 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar/@Britzelpuf
TypeScript v3.4.0.6 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar/@Britzelpuf
- abgestimmt auf TFT 42 / v3.4.0 / BerryDriver 4 / Tasmota 12.1.1
@joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker
@@ -8,36 +8,37 @@ icon_mapping.ts: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroke
ioBroker-Unterstützung: https://forum.iobroker.net/topic/50888/sonoff-nspanel
WIKI zu diesem Projekt unter: https://github.com/joBr99/nspanel-lovelace-ui/wiki (siehe Sidebar)
Icons unter: https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html
ReleaseNotes:
Bugfixes und Erweiterungen:
- cardQR (für Gäste WLAN)
- cardThermo (Neues Design für Alias Thermostat und zusätzlich für Alias Klimaanlage)
- 08.05.2022 - V2.9.0 - Menüpfeile bei HardwareButtons (button1Page; button2Page) mit Navigation auf Page 0
- 08.05.2022 - V2.9.0 - Standard-Brightness über neuen Parameter active einstellbar (Test mit 2.9.3)
- 08.05.2022 - V2.9.0 - Schalter (Licht, Dimmer, Hue, etc) in cardGrid lassen sich wieder schalten
- 14.06.2022 - V2.9.0 - Aktion auf Submenüs schaltet unmittelbar auf vorheriges Mainmenu (Many thanks to Grrzzz)
- 14.06.2022 - V2.9.0 - Menü-Pfeile in Subpages (z.B. card QR, cardMedia, etc) (Many thanks to Grrzzz)
- 15.06.2022 - V3.0.0 - Date/Time im Screensaver auf Basis localString (de-DE/en-EN/nl-NL/etc.)
- 16.06.2022 - V3.0.0 - Multilingual - config.locale (en-EN, de-DE, nl-NL, da-DK, es-ES, fr-FR, it-IT, ru-RU, etc.)
- 16.06.2022 - V3.0.0 - Bugfix by Grrzzz - Subpages
- 18.06.2022 - V3.1.0 - Längere Textfelder in cardEntities
- 08.05.2022 - v2.9.0 - Menüpfeile bei HardwareButtons (button1Page; button2Page) mit Navigation auf Page 0
- 08.05.2022 - v2.9.0 - Standard-Brightness über neuen Parameter active einstellbar (Test mit 2.9.3)
- 08.05.2022 - v2.9.0 - Schalter (Licht, Dimmer, Hue, etc) in cardGrid lassen sich wieder schalten
- 14.06.2022 - v2.9.0 - Aktion auf Submenüs schaltet unmittelbar auf vorheriges Mainmenu (Many thanks to Grrzzz)
- 14.06.2022 - v2.9.0 - Menü-Pfeile in Subpages (z.B. card QR, cardMedia, etc) (Many thanks to Grrzzz)
- 15.06.2022 - v3.0.0 - Date/Time im Screensaver auf Basis localString (de-DE/en-EN/nl-NL/etc.)
- 16.06.2022 - v3.0.0 - Multilingual - config.locale (en-EN, de-DE, nl-NL, da-DK, es-ES, fr-FR, it-IT, ru-RU, etc.)
- 16.06.2022 - v3.0.0 - Bugfix by Grrzzz - Subpages
- 18.06.2022 - v3.1.0 - Längere Textfelder in cardEntities
- 18.06.2022 - V3.1.0 - Detail-Page Lights/Shutter hat neuen Parameter "id"
- 19.06.2022 - V3.1.0 - Bugfix toLocalTimeString in en-EN/en-US
- 19.06.2022 - V3.1.0 - Fehler in findLocale abgefangen
- 19.06.2022 - V3.1.0 - Umstellung auf "Home Assistant" Sprachfile
- 19.06.2022 - V3.1.0 - Alias "light" und "socket" haben optionalen Parameter icon2 für negative Zustände
- 29.06.2022 - V3.1.1 - Bugfix Github #286 (Active Page) + Bugfix pageThermo, pageMedia, pageAlarm as first Page
- 25.08.2022 - V3.1.0 - Code-Verbesserungen (klein0r)
- 26.08.2022 - V3.2.0 - pageItem mit CIE (XY) Parameter für ColorWheel (Steuerung für z.B Deconz-Farben bei denen Hue nicht greift)
- 28.08.2022 - V3.2.0 - Wechsel zwischen Weather-Forecast und eigenen Datenpunkten im Screensaver (minütlich)
- 28.08.2022 - V3.2.0 - Bugfix für 3.2.0 in GenerateDetailPage: Color-Language nicht über findLocales, da nicht in Sprachfile enthalten
- 29.08.2022 - V3.3.0 - Upgrade TFT 40
- 29.08.2022 - V3.3.1 - Upgrade TFT 41
- 04.09.2022 - V3.3.1 - Überarbeitung und BugFix für cardAlarm
- 13.09.2022 - V3.3.1.3 BugFix Screensaver Toggle
- 13.09.2022 - V3.3.1.3 Überarbeitung und BugFix und Refresh Features für cardMedia (Breaking Changes)
- 13.09.2022 - V3.3.1.3 Hinzufügen von SpotifyPremium, Sonos und Chromecast (Google home) zur cardMedia-Logik
- 19.06.2022 - v3.1.0 - Bugfix toLocalTimeString in en-EN/en-US
- 19.06.2022 - v3.1.0 - Fehler in findLocale abgefangen
- 19.06.2022 - v3.1.0 - Umstellung auf "Home Assistant" Sprachfile
- 19.06.2022 - v3.1.0 - Alias "light" und "socket" haben optionalen Parameter icon2 für negative Zustände
- 29.06.2022 - v3.1.1 - Bugfix Github #286 (Active Page) + Bugfix pageThermo, pageMedia, pageAlarm as first Page
- 25.08.2022 - v3.1.0 - Code-Verbesserungen (klein0r)
- 26.08.2022 - v3.2.0 - pageItem mit CIE (XY) Parameter für ColorWheel (Steuerung für z.B Deconz-Farben bei denen Hue nicht greift)
- 28.08.2022 - v3.2.0 - Wechsel zwischen Weather-Forecast und eigenen Datenpunkten im Screensaver (minütlich)
- 28.08.2022 - v3.2.0 - Bugfix für 3.2.0 in GenerateDetailPage: Color-Language nicht über findLocales, da nicht in Sprachfile enthalten
- 29.08.2022 - v3.3.0 - Upgrade TFT 40
- 29.08.2022 - v3.3.1 - Upgrade TFT 41
- 04.09.2022 - v3.3.1 - Überarbeitung und BugFix für cardAlarm
- 13.09.2022 - v3.3.1.3 BugFix Screensaver Toggle
- 13.09.2022 - v3.3.1.3 Überarbeitung und BugFix und Refresh Features für cardMedia (Breaking Changes)
- 13.09.2022 - v3.3.1.3 Hinzufügen von SpotifyPremium, Sonos und Chromecast (Google home) zur cardMedia-Logik
- 15.09.2022 - V3.4.0 - BugFix Dimmode
- 15.09.2022 - V3.4.0 - Colormode für Screensaver + AutoColor WeatherForecast
- 16.09.2022 - v3.4.0.1 Visualisierung der Relay Zustände (MRIcons) im Screensaver + Bugfix Screensaver MRIcon2
@@ -45,6 +46,11 @@ ReleaseNotes:
- 17.09.2022 - v3.4.0.3 Bugfix bNext / bPrev by joBr99
- 18.09.2022 - v3.4.0.4 Add On/Off Colors in config.mrIcon1ScreensaverEntity and config.mrIcon2ScreensaverEntity
- 19.09.2022 - v3.4.0.5 Add Mode to cardThermo (Alias Thermostat)
- 03.10.2022 - v3.4.0.6 Add 5 Entities in US Panel Version to cardEntities
- 03.10.2022 - v3.4.0.6 Fix screenSaverDoubleClick
- 03.10.2022 - v3.4.0.6 Add cardPower (experimental)
- 05.10.2022 - v3.4.0.6 Add sueezeboxrpc to cardMedia
- 07.10.2022 - v3.4.0.6 Time-configurable change for screensaver icons
Wenn Rule definiert, dann können die Hardware-Tasten ebenfalls für Seitensteuerung (dann nicht mehr als Releais) genutzt werden
Tasmota Konsole:
@@ -123,7 +129,7 @@ const Debug = false;
// Variablen zur Steuerung der Wettericons auf dem Screensaver (Steuerung in 0_userdata.0.XPANELX.ScreensaverInfo)
// Wenn weatherForecastTimer auf true, dann Wechsel zwischen Datenpunkten und Wettervorhersage (30 Sekunden nach Minute (Zeit))
// Wenn weatherForecastTimer auf false, dann Möglichkeit über weatherForecast, ob Datenpunkte oder Wettervorhersage (true = WeatherForecast/false = Datenpunkte)
var weatherForecast;
var weatherForecast: boolean; //Änderung zum Video --> Einstellung siehe Wiki
const HMIOff: RGB = { red: 68, green: 115, blue: 158 }; // Blau-Off - Original
const Off: RGB = { red: 253, green: 128, blue: 0 }; // Orange-Off - schönere Farbübergänge
@@ -145,6 +151,19 @@ const colorRadio: RGB = { red: 255, green: 127, blue: 0 };
const BatteryFull: RGB = { red: 96, green: 176, blue: 62 };
const BatteryEmpty: RGB = { red: 179, green: 45, blue: 25 };
//Dynamische Indikatoren
const colorScale0: RGB = { red: 99, green: 190, blue: 123 };
const colorScale1: RGB = { red: 129, green: 199, blue: 126 };
const colorScale2: RGB = { red: 161, green: 208, blue: 127 };
const colorScale3: RGB = { red: 129, green: 217, blue: 126 };
const colorScale4: RGB = { red: 222, green: 226, blue: 131 };
const colorScale5: RGB = { red: 254, green: 235, blue: 132 };
const colorScale6: RGB = { red: 255, green: 210, blue: 129 };
const colorScale7: RGB = { red: 251, green: 185, blue: 124 };
const colorScale8: RGB = { red: 251, green: 158, blue: 117 };
const colorScale9: RGB = { red: 248, green: 131, blue: 111 };
const colorScale10: RGB = { red: 248, green: 105, blue: 107 };
//Screensaver Default Theme Colors
const scbackground: RGB = { red: 0, green: 0, blue: 0};
const sctime: RGB = { red: 255, green: 255, blue: 255};
@@ -574,6 +593,7 @@ const request = require('request');
//----------------------Begin Dimmode
function ScreensaverDimmode(timeDimMode: DimMode) {
try {
if (Debug) console.log('Dimmode='+ timeDimMode.dimmodeOn)
if (timeDimMode.dimmodeOn != undefined ? timeDimMode.dimmodeOn : false) {
if (compareTime(timeDimMode.timeNight != undefined ? timeDimMode.timeNight : '22:00', timeDimMode.timeDay != undefined ? timeDimMode.timeDay : '07:00', 'not between', undefined)) {
@@ -586,20 +606,30 @@ function ScreensaverDimmode(timeDimMode: DimMode) {
} else {
SendToPanel({ payload: 'dimmode~' + config.dimmode + '~' + config.active });
}
} catch (err) {
console.warn('function ScreensaverDimmode: ' + err.message);
}
}
async function InitWeatherForecast() {
try {
//----Möglichkeit, im Screensaver zwischen Accu-Weather Forecast oder selbstdefinierten Werten zu wählen---------------------------------
if (existsState(NSPanel_Path + "ScreensaverInfo.weatherForecast") == false || existsState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer") == false) {
if (existsState(NSPanel_Path + "ScreensaverInfo.weatherForecast") == false ||
existsState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer") == false ||
existsState(NSPanel_Path + "ScreensaverInfo.entiiesChangeTime") == false) {
await createStateAsync(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, { type: 'boolean' });
await createStateAsync(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer", true, { type: 'boolean' });
await createStateAsync(NSPanel_Path + "ScreensaverInfo.entiiesChangeTime", 60, { type: 'number' });
};
} catch (err) {
console.warn('function InitWeatherForecast: ' + err.message);
}
}
InitWeatherForecast();
async function InitDimmode() {
try {
// Screensaver nachts auf dunkel ("brightnessNight: z.B. 2") oder aus ("brightnessNight:0")
if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay')) {
await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', <iobJS.StateCommon>{ type: 'number' });
@@ -643,6 +673,9 @@ async function InitDimmode() {
});
ScreensaverDimmode(timeDimMode);
} catch (err) {
console.warn('function InitDimmode: ' + err.message);
}
}
InitDimmode();
@@ -663,6 +696,7 @@ const popupNotifySleepTimeout = NSPanel_Path + 'popupNotify.popupNotifySleepTime
const popupNotifyAction = NSPanel_Path + 'popupNotify.popupNotifyAction'; // Antwort aus dem Panel true/false
async function InitPopupNotify() {
try {
if (!existsState(screensaverNotifyHeading)) {
await createStateAsync(screensaverNotifyHeading, <iobJS.StateCommon>{ type: 'string' });
await setStateAsync(screensaverNotifyHeading, <iobJS.State>{ val: '', ack: true });
@@ -710,6 +744,9 @@ async function InitPopupNotify() {
setIfExists(config.panelSendTopic, 'pageType~popupNotify');
setIfExists(config.panelSendTopic, notification);
});
} catch (err) {
console.warn('function InitPopupNotify: ' + err.message);
}
}
InitPopupNotify();
@@ -721,31 +758,52 @@ let pageId = 0;
// Neu für Subpages
let activePage = undefined;
//Uhrzeit an NSPanel senden
schedule('* * * * *', () => {
try {
SendTime();
//WeatherForcast true/false Umschaltung halbe Minute verzögert
} catch (err) {
console.warn('schedule: ' + err.message);
}
});
//Wechsel zwischen Screensaver Enities und WeatherForecast
schedule('*/' + getState(NSPanel_Path + 'ScreensaverInfo.entiiesChangeTime').val + ' * * * * *', () => {
try {
//WeatherForcast true/false Umschaltung verzögert
if (getState(NSPanel_Path + "ScreensaverInfo.popupNotifyHeading").val == '' && getState(NSPanel_Path + "ScreensaverInfo.popupNotifyText").val == '' && getState(NSPanel_Path + "ScreensaverInfo.weatherForecast").val == true && getState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer").val == true) {
setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", false, 30000, false);
setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", false, (getState(NSPanel_Path + 'ScreensaverInfo.entiiesChangeTime').val / 2 * 1000), false);
} else if (getState(NSPanel_Path + "ScreensaverInfo.popupNotifyHeading").val == '' && getState(NSPanel_Path + "ScreensaverInfo.popupNotifyText").val == '' && getState(NSPanel_Path + "ScreensaverInfo.weatherForecast").val == false && getState(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer").val == true) {
setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, 30000, false);
setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, (getState(NSPanel_Path + 'ScreensaverInfo.entiiesChangeTime').val / 2 * 1000), false);
}
} catch (err) {
console.warn('schedule: ' + err.message);
}
});
function InitHWButton1Color() {
try {
if (config.mrIcon1ScreensaverEntity.ScreensaverEntity != null || config.mrIcon1ScreensaverEntity.ScreensaverEntity != undefined) {
on({id: config.mrIcon1ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) {
HandleScreensaverUpdate();
});
}
} catch (err) {
console.warn('function InitHWButton1Color: ' + err.message);
}
}
InitHWButton1Color();
function InitHWButton2Color() {
try {
if (config.mrIcon2ScreensaverEntity.ScreensaverEntity != null || config.mrIcon2ScreensaverEntity.ScreensaverEntity != undefined) {
on({id: config.mrIcon2ScreensaverEntity.ScreensaverEntity, change: "ne"}, async function (obj) {
HandleScreensaverUpdate();
});
}
} catch (err) {
console.warn('function InitHWButton2Color: ' + err.message);
}
}
InitHWButton2Color();
@@ -764,8 +822,8 @@ schedule({ hour: 3, minute: 30 }, async () => {
await setStateAsync(config.panelSendTopic, 'pageType~pageStartup');
});
// Updates vergleichen aktuell alle 30 Minuten
schedule('*/30 * * * *', () => {
// Updates vergleichen aktuell alle 12 Stunden
schedule('{"time":{"start":"00:00","end":"23:59","mode":"hours","interval":12},"period":{"days":1}}', () => {
get_tasmota_status0();
get_panel_update_data();
check_updates();
@@ -804,6 +862,7 @@ function get_locales() {
}
async function check_updates() {
try {
const desired_display_firmware_version = 42;
const berry_driver_version = 4;
@@ -912,9 +971,13 @@ async function check_updates() {
if (Debug) console.log('Display_Firmware auf NSPanel aktuell');
}
}
} catch (err) {
console.warn('function check_updates: ' + err.message);
}
}
on({ id: NSPanel_Path + 'popupNotify.popupNotifyAction', change: 'any' }, async function (obj) {
try {
const val = obj.state ? obj.state.val : false;
if (!val) {
@@ -935,9 +998,13 @@ on({ id: NSPanel_Path + 'popupNotify.popupNotifyAction', change: 'any' }, async
if (Debug) console.log('Es wurde Button2 gedrückt');
}
} catch (err) {
console.warn('Trigger popupNotifyAction: ' + err.message);
}
});
async function get_panel_update_data() {
try {
await createStateAsync(NSPanel_Path + 'NSPanel_autoUpdate', false, <iobJS.StateCommon>{ read: true, write: true, name: 'Auto-Update', type: 'boolean', def: false });
await createStateAsync(NSPanel_Path + 'NSPanel_ipAddress', <iobJS.StateCommon>{ type: 'string' });
@@ -948,15 +1015,22 @@ async function get_panel_update_data() {
get_online_berry_driver_version();
check_version_tft_firmware();
check_online_display_firmware();
} catch (err) {
console.warn('function get_panel_update_data: ' + err.message);
}
}
function get_current_tasmota_ip_address() {
try {
const infoObjId = config.panelRecvTopic.substring(0, config.panelRecvTopic.length - 'RESULT'.length) + 'INFO2';
const infoObj = JSON.parse(getState(infoObjId).val);
if (Debug) console.log(`get_current_tasmota_ip_address: ${infoObj.Info2.IPAddress}`);
return infoObj.Info2.IPAddress;
} catch (err) {
console.warn('function get_current_tasmota_ip_address: ' + err.message);
}
}
function get_online_tasmota_firmware_version() {
@@ -1222,15 +1296,16 @@ on({ id: config.panelRecvTopic }, function (obj) {
var split = json.CustomRecv.split(',');
HandleMessage(split[0], split[1], parseInt(split[2]), split);
} catch (err) {
console.error(err);
console.warn(err.message);
}
}
} catch (err) {
console.log(err);
console.warn('Trigger panelRecTopic: ' + err.message);
}
});
function SendToPanel(val: Payload | Payload[]): void {
try {
if (Array.isArray(val)) {
val.forEach(function (id, i) {
setState(config.panelSendTopic, id.payload);
@@ -1239,18 +1314,26 @@ function SendToPanel(val: Payload | Payload[]): void {
} else {
setState(config.panelSendTopic, val.payload);
}
} catch (err) {
console.warn('function SendToPanel: ' + err.message);
}
}
on({ id: NSPanel_Alarm_Path + 'Alarm.AlarmState', change: 'ne' }, async (obj) => {
try {
if ((obj.state ? obj.state.val : '') == 'armed' || (obj.state ? obj.state.val : '') == 'disarmed' || (obj.state ? obj.state.val : '') == 'triggered') {
if (Debug) console.log(activePage);
if (NSPanel_Path == getState(NSPanel_Alarm_Path + 'Alarm.PANEL').val) {
GeneratePage(activePage);
}
}
} catch (err) {
console.warn('Trigger AlarmState: ' + err.message);
}
});
function HandleMessage(typ: string, method: string, page: number, words: Array<string>): void {
try {
if (typ == 'event') {
switch (method) {
case 'startup':
@@ -1285,9 +1368,14 @@ function HandleMessage(typ: string, method: string, page: number, words: Array<s
break;
}
}
} catch (err) {
console.warn('function HandleMessage: ' + err.message);
}
}
function findPageItem(searching: String): PageItem {
try {
let pageItem = activePage.items.find(e => e.id === searching);
if (pageItem !== undefined) {
@@ -1303,9 +1391,13 @@ function findPageItem(searching: String): PageItem {
});
return pageItem;
} catch (err) {
console.warn('function findPageItem: ' + err.message);
}
}
function GeneratePage(page: Page): void {
try {
activePage = page;
switch (page.type) {
case 'cardEntities':
@@ -1330,9 +1422,13 @@ function GeneratePage(page: Page): void {
SendToPanel(GeneratePowerPage(<PagePower>page));
break;
}
} catch (err) {
console.warn('function GeneratePage: ' + err.message);
}
}
function HandleHardwareButton(method: string): void {
try {
let page: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid | PageQR | PagePower);
if (config.button1Page !== null && method == 'button1') {
page = config.button1Page;
@@ -1345,46 +1441,65 @@ function HandleHardwareButton(method: string): void {
}
GeneratePage(page);
} catch (err) {
console.warn('function HandleHardwareButton: ' + err.message);
}
}
function HandleStartupProcess(): void {
SendDate();
SendTime();
SendToPanel({ payload: 'timeout~' + config.timeoutScreensaver });
//SendToPanel({ payload: 'dimmode~' + config.dimmode + '~' + config.active });
}
function SendDate(): void {
try {
const date = new Date();
const options: any = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
const _SendDate = date.toLocaleDateString(config.locale, options);
SendToPanel(<Payload>{ payload: 'date~' + _SendDate });
} catch (err) {
console.warn('function SendDate: ' + err.message);
}
}
function SendTime(): void {
try {
const d = new Date();
const hr = (d.getHours() < 10 ? '0' : '') + d.getHours();
const min = (d.getMinutes() < 10 ? '0' : '') + d.getMinutes();
SendToPanel(<Payload>{ payload: 'time~' + hr + ':' + min });
} catch (err) {
console.warn('function SendTime: ' + err.message);
}
}
function GenerateEntitiesPage(page: PageEntities): Payload[] {
try {
var out_msgs: Array<Payload> = [];
out_msgs = [{ payload: 'pageType~cardEntities' }]
out_msgs.push({ payload: GeneratePageElements(page) });
return out_msgs
} catch (err) {
console.warn('function GenerateEntitiesPage: ' + err.message);
}
}
function GenerateGridPage(page: PageGrid): Payload[] {
try {
var out_msgs: Array<Payload> = [];
out_msgs = [{ payload: 'pageType~cardGrid' }]
out_msgs.push({ payload: GeneratePageElements(page) });
return out_msgs
} catch (err) {
console.warn('function GenerateGridPage: ' + err.message);
}
}
function GeneratePageElements(page: Page): string {
try {
activePage = page;
let maxItems = 0;
switch (page.type) {
@@ -1401,7 +1516,11 @@ function GeneratePageElements(page: Page): string {
maxItems = 1;
break;
case 'cardEntities':
if (getState(NSPanel_Path + 'NSPanel_Version').val == 'eu') {
maxItems = 4;
} else {
maxItems = 5;
}
break;
case 'cardGrid':
maxItems = 6;
@@ -1416,9 +1535,13 @@ function GeneratePageElements(page: Page): string {
}
}
return pageData;
} catch (err) {
console.warn('function GeneratePageElements: ' + err.message);
}
}
function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean = false): string {
try {
var iconId = '0';
if (pageItem.id == 'delete') {
return '~delete~~~~~';
@@ -1490,6 +1613,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
iconColor = GetIconColor(pageItem, existsState(pageItem.id + '.DIMMER') ? 100 - getState(pageItem.id + '.DIMMER').val : true, useColors);
}
if (pageItem.interpolateColor != undefined && pageItem.interpolateColor == true) {
if (existsState(pageItem.id + '.HUE')) {
if (getState(pageItem.id + '.HUE').val != null) {
let huecolor = hsv2rgb(getState(pageItem.id + '.HUE').val, 1, 1);
@@ -1498,6 +1622,7 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
// RegisterDetailEntityWatcher(id + '.HUE');
}
}
}
return '~' + type + '~' + pageItem.id + '~' + iconId + '~' + iconColor + '~' + name + '~' + optVal;
@@ -1751,6 +1876,9 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
}
}
return '~delete~~~~~';
} catch (err) {
console.warn('function CreateEntity: ' + err.message);
}
}
function findLocale(controlsObject: string, controlsState: string): string {
@@ -1766,13 +1894,15 @@ function findLocale(controlsObject: string, controlsState: string): string {
} else {
return controlsState;
}
} catch (err) {
console.error(err);
console.warn('function findLocale: ' + err.message);
return controlsState;
}
}
function GetIconColor(pageItem: PageItem, value: (boolean | number), useColors: boolean): number {
try {
// dimmer
if ((pageItem.useColor || useColors) && pageItem.interpolateColor && typeof (value) === 'number') {
let maxValue = pageItem.maxValueBrightness !== undefined ? pageItem.maxValueBrightness : 100;
@@ -1796,10 +1926,13 @@ function GetIconColor(pageItem: PageItem, value: (boolean | number), useColors:
}
return rgb_dec565(pageItem.offColor !== undefined ? pageItem.offColor : config.defaultOffColor);
} catch (err) {
console.warn('function GetIconColor: ' + err.message);
}
}
function RegisterEntityWatcher(id: string): void {
try {
if (subscriptions.hasOwnProperty(id)) {
return;
}
@@ -1815,9 +1948,13 @@ function RegisterEntityWatcher(id: string): void {
SendToPanel({ payload: GeneratePageElements(activePage) });
}
}));
} catch (err) {
console.warn('function RegisterEntityWatcher: ' + err.message);
}
}
function RegisterDetailEntityWatcher(id: string, pageItem: PageItem, type: string): void {
try {
if (subscriptions.hasOwnProperty(id)) {
return;
}
@@ -1825,9 +1962,13 @@ function RegisterDetailEntityWatcher(id: string, pageItem: PageItem, type: strin
subscriptions[id] = (on({ id: id, change: 'any' }, () => {
SendToPanel(GenerateDetailPage(type, pageItem));
}))
} catch (err) {
console.warn('function RegisterDetailEntityWatcher: ' + err.message);
}
}
function GetUnitOfMeasurement(id: string): string {
try {
if (!existsObject(id))
return '';
@@ -1841,9 +1982,13 @@ function GetUnitOfMeasurement(id: string): string {
}
return '';
} catch (err) {
console.warn('function GetUnitOfMeasurement: ' + err.message);
}
}
function GenerateThermoPage(page: PageThermo): Payload[] {
try {
var id = page.items[0].id
var out_msgs: Array<Payload> = [];
out_msgs.push({ payload: 'pageType~cardThermo' });
@@ -1956,9 +2101,9 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
case 'MAINTAIN':
if (existsState(id + '.MAINTAIN') && getState(id + '.MAINTAIN').val != null) {
if (getState(id + '.MAINTAIN').val >> .1) {
bt[i - 1] = Icons.GetIcon('fire') + '~60897~1~' + 'MAIN' + '~';
bt[i - 1] = Icons.GetIcon('account-wrench') + '~60897~1~' + 'MAIN' + '~';
} else {
bt[i - 1] = Icons.GetIcon('fire') + '~33840~0~' + 'MAIN' + '~';
bt[i - 1] = Icons.GetIcon('account-wrench') + '~33840~1~' + 'MAIN' + '~';
}
} else i--;
break;
@@ -2093,16 +2238,19 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
}
console.log(out_msgs);
if (Debug) console.log(out_msgs);
return out_msgs
} catch (err) {
console.warn('function GenerateThermoPage: ' + err.message);
}
}
function GenerateMediaPage(page: PageMedia): Payload[] {
try {
var id = page.items[0].id
var out_msgs: Array<Payload> = [];
try {
out_msgs.push({ payload: 'pageType~cardMedia' });
if (existsObject(id)) {
let name = getState(id + '.ALBUM').val;
@@ -2113,8 +2261,9 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
let v1Adapter = vInstance.split('.');
let v2Adapter = v1Adapter[0];
//Alexa
//Alexa + neue Adpter/Player
let media_icon = Icons.GetIcon('playlist-music');
//Spotify-Premium
if (v2Adapter == 'spotify-premium') {
media_icon = Icons.GetIcon('spotify');
@@ -2132,8 +2281,16 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
if (nameLenght == 0) {
name = 'Spotify-Premium';
}
author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
if (author.length > 30) {
author = getState(id + '.ARTIST').val;
}
//Spotify-Premium
if ((getState(id + '.ARTIST').val).length == 0) {
author = 'no music to control';
}
}
//Sonos
if (v2Adapter == 'sonos') {
media_icon = Icons.GetIcon('music');
name = getState(id + '.CONTEXT_DESCRIPTION').val;
@@ -2141,6 +2298,20 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
if (nameLenght == 0) {
name = 'Sonos Player';
}
author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
if ((getState(id + '.ARTIST').val).length == 0) {
author = 'no music to control';
}
}
//Logitech Squeezebox RPC
if (v2Adapter == 'squeezeboxrpc') {
media_icon = Icons.GetIcon('dlna');
let nameLenght = name.length;
if (nameLenght == 0) {
name = 'Squeezebox RPC';
author = 'no music to control';
}
}
//Alexa2
@@ -2153,26 +2324,11 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
}
}
if (v2Adapter == 'spotify-premium') {
author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
if (author.length > 30) {
author = getState(id + '.ARTIST').val;
}
if ((getState(id + '.ARTIST').val).length == 0) {
author = 'no music to control';
}
}
if (v2Adapter == 'sonos') {
author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
if ((getState(id + '.ARTIST').val).length == 0) {
author = 'no music to control';
}
}
let volume = getState(id + '.VOLUME').val;
var iconplaypause = Icons.GetIcon('pause'); //pause
var onoffbutton = 1374;
//Für alle Player
if (getState(id + '.STATE').val) {
onoffbutton = 65535;
iconplaypause = Icons.GetIcon('pause'); //pause
@@ -2180,6 +2336,14 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
iconplaypause = Icons.GetIcon('play'); //play
}
//Ausnahme für squeezebox, da State = Power
if (getState(id + '.PAUSE').val === false && v2Adapter == 'squeezeboxrpc') {
onoffbutton = 65535;
iconplaypause = Icons.GetIcon('pause'); //pause
} else {
iconplaypause = Icons.GetIcon('play'); //play
}
if (Debug) console.log(v2Adapter);
let currentSpeaker = 'kein Speaker gefunden';
@@ -2190,6 +2354,10 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'player.device.name'].join(''))).val;
} else if (v2Adapter == 'sonos') {
currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.members'].join(''))).val;
} else if (v2Adapter == 'squeezeboxrpc') {
if(existsObject(([page.items[0].adapterPlayerInstance, 'Playername'].join('')))) {
currentSpeaker = getState(([page.items[0].adapterPlayerInstance, 'Playername'].join(''))).val;
}
}
//-------------------------------------------------------------------------------------------------------------
// nachfolgend alle Alexa-Devices (ist Online / Player- und Commands-Verzeichnis vorhanden) auflisten und verketten
@@ -2238,6 +2406,7 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
}
function GenerateAlarmPage(page: PageAlarm): Payload[] {
try {
activePage = page;
var id = page.items[0].id
@@ -2334,9 +2503,13 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] {
if (Debug) console.log(out_msgs);
return out_msgs
}
} catch (err) {
console.warn('function GenerateAlarmPage: ' + err.message);
}
}
function GenerateQRPage(page: PageQR): Payload[] {
try {
activePage = page;
var id = page.items[0].id
@@ -2388,21 +2561,84 @@ function GenerateQRPage(page: PageQR): Payload[] {
//entityUpd,heading,navigation,textQR[,type,internalName,iconId,displayName,optionalValue]x2
return out_msgs
} catch (err) {
console.warn('function GenerateQRPage: ' + err.message);
}
}
// Check by Armilar
function GeneratePowerPage(page: PagePower): Payload[] {
try {
activePage = page;
var out_msgs: Array<Payload> = [];
//out_msgs.push({ payload: 'pageType~cardPower' });
if (Debug) console.log(page.items[0].id);
//out_msgs.push({payload: 'entityUpd~test~1|1~6666~A~8888~B~1~t0o~t0u~9999~C~2~t1o~t1u~1111~D~3~t2o~t2u~33333~E~-1~t3o~t3u~3333~F~-2~t4o~t4u~4444~G~-3~t5o~t5u'});
var demoMode = false;
try {
var id = page.items[0].id
} catch (err) {
console.log("Kein PageItem definiert - cardPower Demo-Modus aktiv");
demoMode = true;
}
let heading = 'cardPower Example';
if (demoMode != true) {
let o = getObject(id)
heading = page.heading !== undefined ? page.heading : o.common.name.de
}
const obj = JSON.parse((getState(page.items[0].id + '.ACTUAL').val));
var out_msgs: Array<Payload> = [];
out_msgs.push({ payload: 'pageType~cardPower' });
//Demo Data if no pageItem present
let array_icon_color = [HMIOff, MSGreen, MSYellow, MSGreen, MSYellow, MSGreen, MSRed];
let array_icon = ['home', 'battery-charging-60', 'solar-power-variant', 'wind-turbine', 'shape', 'transmission-tower', 'car'];
let array_powerspeed = ['', '-1', '2', '4', '1', '1', '5'];
let array_powerstate = ['', '0,5 kW', '0,9 kW', '2,8 kW', '0,2 kW', '0,1 kW', '4,6 kW'];
let arrayColorScale = [colorScale0, colorScale1, colorScale2, colorScale3, colorScale4, colorScale5, colorScale6, colorScale7, colorScale8, colorScale9, colorScale10]
if (!demoMode) {
for (let obji = 0; obji < 6; obji++) {
array_icon_color[obji + 1] = arrayColorScale[obj[obji].iconColor];
array_icon[obji + 1] = obj[obji].icon;
array_powerspeed[obji + 1] = obj[obji].speed;
array_powerstate[obji + 1] = obj[obji].value + ' ' + obj[obji].unit ;
}
}
let power_string : any = '';
for (let i = 1; i < 7; i++ ) {
power_string = power_string + rgb_dec565(array_icon_color[i]) + '~'; // icon_color~
power_string = power_string + Icons.GetIcon(array_icon[i]) + '~'; // icon~
power_string = power_string + array_powerspeed[i] + '~'; // speed~
power_string = power_string + array_powerstate[i] + '~'; // entity.state~
}
power_string = power_string.substring(0, power_string.length - 1);
out_msgs.push({
payload: 'entityUpd~' + //entityUpd~*
heading + '~' + //internalNameEntity*~*
GetNavigationString(pageId) + '~' + //navigation*~*
rgb_dec565(array_icon_color[0]) + '~' + // icon_color~ Mitte
Icons.GetIcon(array_icon[0]) + '~' + // icon~ Mitte
array_powerspeed[0] + '~' + // entity.state~ Mitte
power_string
});
return out_msgs
} catch (err) {
console.warn('function GeneratePowerPage: ' + err.message);
}
}
function setIfExists(id: string, value: any, type: string | null = null): boolean {
try {
if (type === null) {
if (existsState(id)) {
setState(id, value);
@@ -2417,18 +2653,26 @@ function setIfExists(id: string, value: any, type: string | null = null): boolea
}
return false;
} catch (err) {
console.warn('function setIfExists: ' + err.message);
}
}
function toggleState(id: string): boolean {
try {
const obj = getObject(id);
if (existsState(id) && obj.common.type !== undefined && obj.common.type === 'boolean') {
setIfExists(id, !getState(id).val);
return true;
}
return false;
} catch (err) {
console.warn('function toggleState: ' + err.message);
}
}
function HandleButtonEvent(words): void {
try {
var id = words[2]
var buttonAction = words[3];
@@ -2478,8 +2722,10 @@ function HandleButtonEvent(words): void {
}
break;
case 'bExit':
if (config.screenSaverDoubleClick) {
if (config.screenSaverDoubleClick && words[2] == 'screensaver') {
if (words[4] == 2) {
setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyHeading', '');
setIfExists(NSPanel_Path + 'ScreensaverInfo.popupNotifyText', '');
GeneratePage(config.pages[pageId]);
}
} else {
@@ -2653,11 +2899,24 @@ function HandleButtonEvent(words): void {
},3000)
break;
case 'media-pause':
let pageItemTemp = findPageItem(id);
let adaInstanceSplit = pageItemTemp.adapterPlayerInstance.split('.');
if (adaInstanceSplit[0] == 'squeezeboxrpc') {
let stateVal = getState(pageItemTemp.adapterPlayerInstance + 'state').val
if (stateVal == 0) {
setState(pageItemTemp.adapterPlayerInstance + 'state', 1)
} else if (stateVal == 1) {
setState(pageItemTemp.adapterPlayerInstance + 'state', 0)
} else if (stateVal == null) {
setState(pageItemTemp.adapterPlayerInstance + 'state', 1)
}
} else {
if (getState(id + '.STATE').val === true) {
setIfExists(id + '.PAUSE', true);
} else {
setIfExists(id + '.PLAY', true);
}
}
setTimeout(function(){
GeneratePage(activePage);
},3000)
@@ -2701,7 +2960,22 @@ function HandleButtonEvent(words): void {
}
break;
case 'media-OnOff':
let pageItemTem = findPageItem(id);
let adaInstanceSpli = pageItemTem.adapterPlayerInstance.split('.');
if (adaInstanceSpli[0] == 'squeezeboxrpc') {
let stateVal = getState(pageItemTem.adapterPlayerInstance + 'Power').val
if (stateVal === 0) {
setState(pageItemTem.adapterPlayerInstance + 'Power', 1)
setIfExists(id + '.STOP', false)
setIfExists(id + '.STATE', 1)
} else {
setState(pageItemTem.adapterPlayerInstance + 'Power', 0)
setIfExists(id + '.STOP', true)
setIfExists(id + '.STATE', 0)
}
} else {
setIfExists(id + '.STOP', true)
}
break;
case 'hvac_action':
if (words[4] == 'BOOT' || words[4] == 'PART' || words[4] == 'AUTT' || words[4] == 'MANT' || words[4] == 'VACT') {
@@ -2842,9 +3116,14 @@ function HandleButtonEvent(words): void {
default:
break;
}
} catch (err) {
console.log('function HandleButtonEvent: ' + err.message);
}
}
function GetNavigationString(pageId: number): string {
try {
if (Debug) console.log(pageId);
if (activePage.subPage)
@@ -2862,10 +3141,13 @@ function GetNavigationString(pageId: number): string {
default:
return '1|1';
}
} catch (err) {
console.log('function GetNavigationString: ' + err.message);
}
}
function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
try {
var out_msgs: Array<Payload> = [];
let id = pageItem.id
@@ -3241,17 +3523,29 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
}
return out_msgs;
} catch (err) {
console.log('function GenerateDetailPage: ' + err.message);
}
}
function scale(number: number, inMin: number, inMax: number, outMin: number, outMax: number): number {
try {
return (outMax + outMin) - ((number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin);
} catch (err) {
console.log('function scale: ' + err.message);
}
}
function UnsubscribeWatcher(): void {
try {
for (const [key, value] of Object.entries(subscriptions)) {
unsubscribe(value);
delete subscriptions[key];
}
} catch (err) {
console.log('function UnsubscribeWatcher: ' + err.message);
}
}
function HandleScreensaver(): void {
@@ -3639,12 +3933,12 @@ function HandleScreensaverUpdate(): void {
}
} catch (err) {
console.log('HandleScreensaverUpdate' + err.message);
console.log('HandleScreensaverUpdate: ' + err.message);
}
}
function HandleScreensaverColors(): void {
try {
let vwIcon = [];
if (config.autoWeatherColorScreensaverLayout) {
vwIcon[0] = vwIconColor[0];
@@ -3694,9 +3988,13 @@ function HandleScreensaverColors(): void {
//true;
SendToPanel(<Payload>{ payload: payloadString });
} catch (err) {
console.warn('HandleScreensaverColors: '+ err.message);
}
}
function GetScreenSaverEntityString(configElement: ScreenSaverElement | null): string {
try {
if (configElement != null && configElement.ScreensaverEntity != null && existsState(configElement.ScreensaverEntity)) {
let u1 = getState(configElement.ScreensaverEntity).val;
@@ -3705,9 +4003,13 @@ function GetScreenSaverEntityString(configElement: ScreenSaverElement | null): s
else {
return '~~~';
}
} catch (err) {
console.warn('GetScreenSaverEntityString: '+ err.message);
}
}
function GetAccuWeatherIcon(icon: number): string {
try {
switch (icon) {
case 24: // Ice
case 30: // Hot
@@ -3780,10 +4082,13 @@ function GetAccuWeatherIcon(icon: number): string {
default:
return 'alert-circle-outline';
}
} catch (err) {
console.warn('GetAccuWeatherIcon: '+ err.message);
}
}
function GetAccuWeatherIconColor(icon: number): number {
try{
switch (icon) {
case 24: // Ice
case 30: // Hot
@@ -3856,6 +4161,9 @@ function GetAccuWeatherIconColor(icon: number): number {
default:
return rgb_dec565(White);
}
} catch (err) {
console.warn('GetAccuWeatherIconColor: '+ err.message);
}
}
//------------------Begin Read Internal Sensor Data