Merge branch 'main' of github.com:joBr99/nspanel-lovelace-ui

This commit is contained in:
joBr99
2023-12-02 14:11:25 +01:00

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
TypeScript v4.3.3.15 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @Sternmiere / @Britzelpuf / @ravenS0ne TypeScript v4.3.3.16 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar / @TT-Tom / @Sternmiere / @Britzelpuf / @ravenS0ne
- abgestimmt auf TFT 53 / v4.3.3 / BerryDriver 9 / Tasmota 13.2.0 - abgestimmt auf TFT 53 / v4.3.3 / BerryDriver 9 / Tasmota 13.2.0
@joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker @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 NsPanelTs.ts (dieses TypeScript in ioBroker) Stable: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts
@@ -68,6 +68,9 @@ ReleaseNotes:
- 25.11.2023 - v4.3.3.13 Fix Sonos Repeat/Shuffle - 25.11.2023 - v4.3.3.13 Fix Sonos Repeat/Shuffle
- 25.11.2023 - v4.3.3.14 Refactoring Sonos-Player (with Playlist, Tracklist, Favorites, Eqalizer (if no Favorites)) - 25.11.2023 - v4.3.3.14 Refactoring Sonos-Player (with Playlist, Tracklist, Favorites, Eqalizer (if no Favorites))
- 29.11.2023 - v4.3.3.15 Fix cardMedia Volume-Slider / Add Init Release to Startup - 29.11.2023 - v4.3.3.15 Fix cardMedia Volume-Slider / Add Init Release to Startup
- 30.11.2023 - v4.3.3.16 Beautification of the Sonos player Strings / Add Duration & Elapsed
- 01.12.2023 - v4.3.3.16 Fix Datapoints with Value null
- 02.12.2023 - v4.3.3.16 Request replaced by Axios
Todo: Todo:
- XX.XX.XXXX - v4.4.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined - XX.XX.XXXX - v4.4.0 Change the bottomScreensaverEntity (rolling) if more than 6 entries are defined
@@ -164,7 +167,6 @@ Upgrades in Konsole:
TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v4.3.3.tft TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v4.3.3.tft
--------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------
*/ */
/******************************* Begin CONFIG Parameter *******************************/ /******************************* Begin CONFIG Parameter *******************************/
// DE: liefert bei true detailliertere Meldundgen im Log. // DE: liefert bei true detailliertere Meldundgen im Log.
@@ -941,7 +943,7 @@ export const config = <Config> {
// _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________ // _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
// _________________________________ EN: No more configuration from here _____________________________________ // _________________________________ EN: No more configuration from here _____________________________________
const scriptVersion: string = 'v4.3.3.15'; const scriptVersion: string = 'v4.3.3.16';
const tft_version: string = 'v4.3.3'; const tft_version: string = 'v4.3.3';
const desired_display_firmware_version = 53; const desired_display_firmware_version = 53;
const berry_driver_version = 9; const berry_driver_version = 9;
@@ -955,7 +957,7 @@ let weatherForecast: boolean;
let pageCounter: number = 0; let pageCounter: number = 0;
let alwaysOn: boolean = false; let alwaysOn: boolean = false;
const request = require('request'); const axios = require('axios');
const dayjs = require('dayjs'); const dayjs = require('dayjs');
const moment = require('moment'); const moment = require('moment');
const parseFormat = require('moment-parseformat'); const parseFormat = require('moment-parseformat');
@@ -1481,17 +1483,25 @@ on({id: AliasPath + 'Config.rebootNSPanel.SET', change: "any"}, async function (
if (tasmota_web_admin_password != '') { if (tasmota_web_admin_password != '') {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Backlog Restart 1;`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Backlog Restart 1;`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker'
}
}, async function () {
SendToPanel({ payload: 'pageType~pageStartup' }); SendToPanel({ payload: 'pageType~pageStartup' });
console.log('Tasmota Reboot'); console.log('Tasmota Reboot');
setStateAsync(AliasPath + 'Config.rebootNSPanel.SET', false); setStateAsync(AliasPath + 'Config.rebootNSPanel.SET', false);
console.log("Name: " + name); console.log("Name: " + name);
console.log("Instanz: " + instance); console.log("Instanz: " + instance);
} else {
console.warn('Axios Status - Requesting locales: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
if (Debug) {
console.log('Reboot NSPanel... done');
}
}); });
} catch (err) { } catch (err) {
console.warn('error at Trigger Restart NSPanel: ' + err.message); console.warn('error at Trigger Restart NSPanel: ' + err.message);
@@ -1645,7 +1655,20 @@ on({id: [].concat(String(NSPanel_Path) + 'Config.Dateformat.Switch.weekday')
on({id: [].concat(String(NSPanel_Path) + 'Relay.1').concat(String(NSPanel_Path) + 'Relay.2'), change: "ne"}, async function (obj) { on({id: [].concat(String(NSPanel_Path) + 'Relay.1').concat(String(NSPanel_Path) + 'Relay.2'), change: "ne"}, async function (obj) {
try { try {
let Button = obj.id.split('.'); let Button = obj.id.split('.');
require("request")((['http://',get_current_tasmota_ip_address(),'/cm?cmnd=Power',Button[Button.length - 1],' ',(obj.state ? obj.state.val : "")].join(''))).on("error", function (err) {console.error(err.message);}); let urlString: string = ['http://',get_current_tasmota_ip_address(),'/cm?cmnd=Power',Button[Button.length - 1],' ',(obj.state ? obj.state.val : "")].join('');
axios.get(urlString)
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(response.data);
}
}
})
.catch(function (error) {
console.log(error);
})
} catch (err) { } catch (err) {
console.warn('error at Trigger Relay1/2: ' + err.message); console.warn('error at Trigger Relay1/2: ' + err.message);
} }
@@ -1830,7 +1853,6 @@ async function InitDimmode() {
await createAliasAsync(AliasPath + 'Dimmode.brightnessDay.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Dimmode.brightnessDay.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' });
await createAliasAsync(AliasPath + 'Dimmode.brightnessDay.SET', NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' }); await createAliasAsync(AliasPath + 'Dimmode.brightnessDay.SET', NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' });
} }
if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_hourDay')) { if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_hourDay')) {
await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourDay', <iobJS.StateCommon>{ type: 'number' }); await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourDay', <iobJS.StateCommon>{ type: 'number' });
await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourDay', <iobJS.State>{ val: 7, ack: true }); await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourDay', <iobJS.State>{ val: 7, ack: true });
@@ -1838,7 +1860,6 @@ async function InitDimmode() {
await createAliasAsync(AliasPath + 'Dimmode.hourDay.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_hourDay', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Dimmode.hourDay.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_hourDay', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' });
await createAliasAsync(AliasPath + 'Dimmode.hourDay.SET', NSPanel_Path + 'NSPanel_Dimmode_hourDay', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' }); await createAliasAsync(AliasPath + 'Dimmode.hourDay.SET', NSPanel_Path + 'NSPanel_Dimmode_hourDay', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' });
} }
if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight')) { if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight')) {
await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', <iobJS.StateCommon>{ type: 'number' }); await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', <iobJS.StateCommon>{ type: 'number' });
await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', <iobJS.State>{ val: 1, ack: true }); await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', <iobJS.State>{ val: 1, ack: true });
@@ -1846,7 +1867,6 @@ async function InitDimmode() {
await createAliasAsync(AliasPath + 'Dimmode.brightnessNight.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Dimmode.brightnessNight.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' });
await createAliasAsync(AliasPath + 'Dimmode.brightnessNight.SET', NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' }); await createAliasAsync(AliasPath + 'Dimmode.brightnessNight.SET', NSPanel_Path + 'NSPanel_Dimmode_brightnessNight', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' });
} }
if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_hourNight')) { if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_hourNight')) {
await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourNight', <iobJS.StateCommon>{ type: 'number' }); await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourNight', <iobJS.StateCommon>{ type: 'number' });
await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourNight', <iobJS.State>{ val: 22, ack: true }); await setStateAsync(NSPanel_Path + 'NSPanel_Dimmode_hourNight', <iobJS.State>{ val: 22, ack: true });
@@ -1854,10 +1874,8 @@ async function InitDimmode() {
await createAliasAsync(AliasPath + 'Dimmode.hourNight.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_hourNight', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Dimmode.hourNight.ACTUAL', NSPanel_Path + 'NSPanel_Dimmode_hourNight', true, <iobJS.StateCommon>{ type: 'number', role: 'value', name: 'ACTUAL' });
await createAliasAsync(AliasPath + 'Dimmode.hourNight.SET', NSPanel_Path + 'NSPanel_Dimmode_hourNight', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' }); await createAliasAsync(AliasPath + 'Dimmode.hourNight.SET', NSPanel_Path + 'NSPanel_Dimmode_hourNight', true, <iobJS.StateCommon>{ type: 'number', role: 'level', name: 'SET' });
} }
const vTimeDay = getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val; const vTimeDay = getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val;
const vTimeNight = getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val; const vTimeNight = getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val;
const timeDimMode = <DimMode>{ const timeDimMode = <DimMode>{
dimmodeOn: true, dimmodeOn: true,
brightnessDay: getState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay').val, brightnessDay: getState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay').val,
@@ -1865,12 +1883,10 @@ async function InitDimmode() {
timeDay: (vTimeDay < 10) ? `0${vTimeDay}:00` : `${vTimeDay}:00`, timeDay: (vTimeDay < 10) ? `0${vTimeDay}:00` : `${vTimeDay}:00`,
timeNight: (vTimeNight < 10) ? `0${vTimeNight}:00` : `${vTimeNight}:00` timeNight: (vTimeNight < 10) ? `0${vTimeNight}:00` : `${vTimeNight}:00`
}; };
// timeDimMode Day // timeDimMode Day
scheduleInitDimModeDay = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val, minute: 0 }, () => { scheduleInitDimModeDay = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourDay').val, minute: 0 }, () => {
ScreensaverDimmode(timeDimMode); ScreensaverDimmode(timeDimMode);
}); });
// timeDimMode Night // timeDimMode Night
scheduleInitDimModeNight = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val, minute: 0 }, () => { scheduleInitDimModeNight = schedule({ hour: getState(NSPanel_Path + 'NSPanel_Dimmode_hourNight').val, minute: 0 }, () => {
ScreensaverDimmode(timeDimMode); ScreensaverDimmode(timeDimMode);
@@ -1886,7 +1902,6 @@ async function InitDimmode() {
console.warn('error at function InitDimmode: ' + err.message); console.warn('error at function InitDimmode: ' + err.message);
} }
} }
InitDimmode(); InitDimmode();
//--------------------End Dimmode //--------------------End Dimmode
@@ -2116,54 +2131,57 @@ function getDayjsLocale(): String {
} }
} }
function get_locales() { async function get_locales() {
try { try {
if (Debug) { if (Debug) {
console.log('Requesting locales'); console.log('Requesting locales');
} }
request({ let urlString: string = 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/ioBroker_NSPanel_locales.json';
url: 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/ioBroker_NSPanel_locales.json',
headers: { axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
'User-Agent': 'ioBroker' .then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
} }
}, async (error, response, result) => {
try {
if (result) {
await createStateAsync(NSPanel_Path + 'NSPanel_locales_json', <iobJS.StateCommon>{ type: 'string', role: 'json' }); await createStateAsync(NSPanel_Path + 'NSPanel_locales_json', <iobJS.StateCommon>{ type: 'string', role: 'json' });
await setStateAsync(NSPanel_Path + 'NSPanel_locales_json', <iobJS.State>{ val: result, ack: true }); await setStateAsync(NSPanel_Path + 'NSPanel_locales_json', <iobJS.State>{ val: JSON.stringify(response.data), ack: true });
} } else {
} catch (err) { console.warn('Axios Status - Requesting locales: ' + response.state);
console.warn('error result in function get_locales: ' + err.message);
} }
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting locales in function get_locales: ' + err.message); console.warn('error requesting locales in function get_locales: ' + err.message);
} }
} }
function get_locales_servicemenu() { async function get_locales_servicemenu() {
try { try {
if (Debug) { if (Debug) {
console.log('Requesting locales Service Menu'); console.log('Requesting locales Service Menu');
} }
request({ let urlString: string = 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/ioBroker_NSPanel_locales_service.json';
url: 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/ioBroker_NSPanel_locales_service.json',
headers: { axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
'User-Agent': 'ioBroker' .then(async function (response) {
} if (response.status === 200) {
}, async (error, response, result) => {
try {
if (result) {
await createStateAsync(NSPanel_Path + 'NSPanel_locales_service_json', <iobJS.StateCommon>{ type: 'string', role: 'json' });
await setStateAsync(NSPanel_Path + 'NSPanel_locales_service_json', <iobJS.State>{ val: result, ack: true });
if (Debug) { if (Debug) {
console.log('Requesting locales Service Menu... done'); console.log(JSON.stringify(response.data));
} }
await createStateAsync(NSPanel_Path + 'NSPanel_locales_service_json', <iobJS.StateCommon>{ type: 'string', role: 'json' });
await setStateAsync(NSPanel_Path + 'NSPanel_locales_service_json', <iobJS.State>{ val: JSON.stringify(response.data), ack: true });
} else {
console.warn('Axios Status - Requesting locales Service Menu: ' + response.state);
} }
} catch (err) { })
console.warn('error result in function get_locales_servicemenu: ' + err.message); .catch(function (error) {
} console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting locales in function get_locales_servicemenu: ' + err.message); console.warn('error requesting locales in function get_locales_servicemenu: ' + err.message);
} }
@@ -2368,28 +2386,33 @@ function get_online_tasmota_firmware_version() {
if (Debug) { if (Debug) {
console.log('Requesting tasmota firmware version'); console.log('Requesting tasmota firmware version');
} }
request({
url: 'https://api.github.com/repositories/80286288/releases/latest', let urlString: string = 'https://api.github.com/repositories/80286288/releases/latest';
headers: {
'User-Agent': 'ioBroker' axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
} }
}, async (error, response, result) => {
try {
if (isSetOptionActive) { if (isSetOptionActive) {
const Tasmota_JSON = JSON.parse(result); // Write JSON result to variable const Tasmota_JSON = JSON.parse(JSON.stringify(response.data));// Write JSON result to variable
const TasmotaTagName = Tasmota_JSON.tag_name; // Filter JSON by "tag_name" and write to variable const TasmotaTagName = Tasmota_JSON.tag_name; // Filter JSON by "tag_name" and write to variable
const TasmotaVersionOnline = TasmotaTagName.replace(/v/i, ''); // Filter unnecessary "v" from variable and write to release variable const TasmotaVersionOnline = TasmotaTagName.replace(/v/i, ''); // Filter unnecessary "v" from variable and write to release variable
await createStateAsync(NSPanel_Path + 'Tasmota_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Tasmota_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
setObject(AliasPath + 'Tasmota_Firmware.onlineVersion', {type: 'channel', common: {role: 'info', name:'onlineVersion'}, native: {}}); setObject(AliasPath + 'Tasmota_Firmware.onlineVersion', {type: 'channel', common: {role: 'info', name:'onlineVersion'}, native: {}});
await createAliasAsync(AliasPath + 'Tasmota_Firmware.onlineVersion.ACTUAL', NSPanel_Path + 'Tasmota_Firmware.onlineVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Tasmota_Firmware.onlineVersion.ACTUAL', NSPanel_Path + 'Tasmota_Firmware.onlineVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' });
await setStateAsync(NSPanel_Path + 'Tasmota_Firmware.onlineVersion', <iobJS.State>{ val: TasmotaVersionOnline, ack: true }); await setStateAsync(NSPanel_Path + 'Tasmota_Firmware.onlineVersion', <iobJS.State>{ val: TasmotaVersionOnline, ack: true });
if (Debug) console.log('online tasmota firmware version => ' + TasmotaVersionOnline); if (Debug) console.log('online tasmota firmware version => ' + TasmotaVersionOnline);
} }
} catch (err) { } else {
console.warn('error result in function get_online_tasmota_firmware_version: ' + err.message); console.warn('Axios Status - online tasmota firmware version: ' + response.state);
} }
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function get_online_tasmota_firmware_version: ' + err.message); console.warn('error requesting firmware in function get_online_tasmota_firmware_version: ' + err.message);
} }
@@ -2406,28 +2429,30 @@ function get_current_berry_driver_version() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=GetDriverVersion`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=GetDriverVersion`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
url: `${urlString}`, if (response.status === 200) {
headers: { if (Debug) {
'User-Agent': 'ioBroker' console.log(JSON.stringify(response.data));
} }
}, async (error, response, result) => {
try {
if (isSetOptionActive) { if (isSetOptionActive) {
const BerryDriverVersionCurrent: string = JSON.parse(result).nlui_driver_version; const BerryDriverVersionCurrent: string = JSON.parse(JSON.stringify(response.data)).nlui_driver_version;
await createStateAsync(NSPanel_Path + 'Berry_Driver.currentVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Berry_Driver.currentVersion', <iobJS.StateCommon>{ type: 'string' });
await setStateAsync(NSPanel_Path + 'Berry_Driver.currentVersion', <iobJS.State>{ val: JSON.parse(result).nlui_driver_version, ack: true }); await setStateAsync(NSPanel_Path + 'Berry_Driver.currentVersion', <iobJS.State>{ val: JSON.parse(JSON.stringify(response.data)).nlui_driver_version, ack: true });
if (autoCreateAlias) { if (autoCreateAlias) {
setObject(AliasPath + 'Display.BerryDriver', {type: 'channel', common: {role: 'info', name: 'Berry Driver'}, native: {}}); setObject(AliasPath + 'Display.BerryDriver', {type: 'channel', common: {role: 'info', name: 'Berry Driver'}, native: {}});
await createAliasAsync(AliasPath + 'Display.BerryDriver.ACTUAL', NSPanel_Path + 'Berry_Driver.currentVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Display.BerryDriver.ACTUAL', NSPanel_Path + 'Berry_Driver.currentVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' });
} }
if (Debug) console.log('current berry driver version => ' + BerryDriverVersionCurrent); if (Debug) console.log('current berry driver version => ' + BerryDriverVersionCurrent);
} }
} catch (err) { } else {
console.warn('error result in function get_current_berry_driver_version: ' + err.message); console.warn('Axios Status - current berry driver version: ' + response.state);
} }
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function get_current_berry_driver_version: ' + err.message); console.warn('error requesting firmware in function get_current_berry_driver_version: ' + err.message);
} }
@@ -2444,12 +2469,12 @@ function get_tasmota_status0() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Status0`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Status0`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker' if (Debug) {
console.log(JSON.stringify(response.data));
} }
}, async (error, response, result) => {
if (isSetOptionActive) { if (isSetOptionActive) {
await createStateAsync(NSPanel_Path + 'Tasmota_Firmware.currentVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Tasmota_Firmware.currentVersion', <iobJS.StateCommon>{ type: 'string' });
await createStateAsync(NSPanel_Path + 'Tasmota.Uptime', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Tasmota.Uptime', <iobJS.StateCommon>{ type: 'string' });
@@ -2465,7 +2490,7 @@ function get_tasmota_status0() {
await createStateAsync(NSPanel_Path + 'Tasmota.Product', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Tasmota.Product', <iobJS.StateCommon>{ type: 'string' });
try { try {
const Tasmota_JSON = JSON.parse(result); const Tasmota_JSON = JSON.parse(JSON.stringify(response.data));
const tasmoVersion = Tasmota_JSON.StatusFWR.Version.indexOf('(') > -1 ? Tasmota_JSON.StatusFWR.Version.split('(')[0] : Tasmota_JSON.StatusFWR.Version; const tasmoVersion = Tasmota_JSON.StatusFWR.Version.indexOf('(') > -1 ? Tasmota_JSON.StatusFWR.Version.split('(')[0] : Tasmota_JSON.StatusFWR.Version;
await setStateAsync(NSPanel_Path + 'Tasmota_Firmware.currentVersion', <iobJS.State>{ val: tasmoVersion, ack: true }); await setStateAsync(NSPanel_Path + 'Tasmota_Firmware.currentVersion', <iobJS.State>{ val: tasmoVersion, ack: true });
@@ -2510,7 +2535,14 @@ function get_tasmota_status0() {
await createAliasAsync(AliasPath + 'Tasmota.Product.ACTUAL', NSPanel_Path + 'Tasmota.Product', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Tasmota.Product.ACTUAL', NSPanel_Path + 'Tasmota.Product', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' });
} }
} }
} else {
console.warn('Axios Status - get_tasmota_status0: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function get_tasmota_status0: ' + err.message); console.warn('error requesting firmware in function get_tasmota_status0: ' + err.message);
} }
@@ -2522,27 +2554,31 @@ function get_online_berry_driver_version() {
if (Debug) { if (Debug) {
console.log('Requesting online berry driver version'); console.log('Requesting online berry driver version');
} }
request({
url: 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be', let urlString = 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be';
headers: {
'User-Agent': 'ioBroker' axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(response.data);
} }
}, async (error, response, result) => {
if (result) {
try {
if (isSetOptionActive) { if (isSetOptionActive) {
const BerryDriverVersionOnline = result.substring((result.indexOf('version_of_this_script = ') + 24), result.indexOf('version_of_this_script = ') + 27).replace(/\s+/g, ''); const BerryDriverVersionOnline = response.data.substring((response.data.indexOf('version_of_this_script = ') + 24), response.data.indexOf('version_of_this_script = ') + 27).replace(/\s+/g, '');
await createStateAsync(NSPanel_Path + 'Berry_Driver.onlineVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Berry_Driver.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
setObject(AliasPath + 'Berry_Driver.onlineVersion', {type: 'channel', common: {role: 'info', name:'onlineVersion'}, native: {}}); setObject(AliasPath + 'Berry_Driver.onlineVersion', {type: 'channel', common: {role: 'info', name:'onlineVersion'}, native: {}});
await createAliasAsync(AliasPath + 'Berry_Driver.onlineVersion.ACTUAL', NSPanel_Path + 'Berry_Driver.onlineVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' }); await createAliasAsync(AliasPath + 'Berry_Driver.onlineVersion.ACTUAL', NSPanel_Path + 'Berry_Driver.onlineVersion', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'ACTUAL' });
await setStateAsync(NSPanel_Path + 'Berry_Driver.onlineVersion', <iobJS.State>{ val: BerryDriverVersionOnline, ack: true }); await setStateAsync(NSPanel_Path + 'Berry_Driver.onlineVersion', <iobJS.State>{ val: BerryDriverVersionOnline, ack: true });
if (Debug) console.log('online berry driver version => ' + BerryDriverVersionOnline); if (Debug) console.log('online berry driver version => ' + BerryDriverVersionOnline);
} }
} catch (err) { } else {
console.warn('error result in function get_online_berry_driver_version' + err.message); console.warn('Axios Status - get_online_berry_driver_version: ' + response.state);
}
} }
})
.catch(function (error) {
console.log(error);
}); });
} }
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function get_online_berry_driver_version: ' + err.message); console.warn('error requesting firmware in function get_online_berry_driver_version: ' + err.message);
@@ -2554,26 +2590,30 @@ function check_version_tft_firmware() {
if (Debug) { if (Debug) {
console.log('Requesting online TFT version'); console.log('Requesting online TFT version');
} }
request({
url: 'https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/latest', let urlString = 'https://api.github.com/repos/joBr99/nspanel-lovelace-ui/releases/latest';
headers: {
'User-Agent': 'ioBroker' axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
} }
}, async (error, response, result) => { let NSPanel_JSON = JSON.parse(JSON.stringify(response.data)); // Write JSON result to variable
if (result) {
try {
let NSPanel_JSON = JSON.parse(result); // Write JSON result to variable
let NSPanelTagName = NSPanel_JSON.tag_name; // created_at; published_at; name ; draft ; prerelease let NSPanelTagName = NSPanel_JSON.tag_name; // created_at; published_at; name ; draft ; prerelease
let NSPanelVersion = NSPanelTagName.replace(/v/i, ''); // Filter unnecessary "v" from variable and write to release variable let NSPanelVersion = NSPanelTagName.replace(/v/i, ''); // Filter unnecessary "v" from variable and write to release variable
await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: NSPanelVersion, ack: true }); await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: NSPanelVersion, ack: true });
if (Debug) console.log('online TFT firmware version => ' + NSPanelVersion); if (Debug) console.log('online TFT firmware version => ' + NSPanelVersion);
} catch (err) { } else {
console.warn('error result in function check_version_tft_firmware: ' + err.message); console.warn('Axios Status - check_version_tft_firmware: ' + response.state);
}
} }
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function check_version_tft_firmware: ' + err.message); console.warn('error requesting firmware in function check_version_tft_firmware: ' + err.message);
} }
@@ -2584,24 +2624,28 @@ function check_online_display_firmware() {
if (Debug) { if (Debug) {
console.log('Requesting online firmware version'); console.log('Requesting online firmware version');
} }
request({
url: 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/apps/nspanel-lovelace-ui/nspanel-lovelace-ui.py', let urlString = 'https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/apps/nspanel-lovelace-ui/nspanel-lovelace-ui.py';
headers: {
'User-Agent': 'ioBroker' axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(response.data);
} }
}, async (error, response, result) => { let desired_display_firmware_version = response.data.substring((response.data.indexOf('desired_display_firmware_version =') + 34), response.data.indexOf('desired_display_firmware_version =') + 38).replace(/\s+/g, '');
if (result) {
try {
let desired_display_firmware_version = result.substring((result.indexOf('desired_display_firmware_version =') + 34), result.indexOf('desired_display_firmware_version =') + 38).replace(/\s+/g, '');
await createStateAsync(NSPanel_Path + 'Display_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'Display_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
await setStateAsync(NSPanel_Path + 'Display_Firmware.onlineVersion', <iobJS.State>{ val: desired_display_firmware_version, ack: true }); await setStateAsync(NSPanel_Path + 'Display_Firmware.onlineVersion', <iobJS.State>{ val: desired_display_firmware_version, ack: true });
if (Debug) console.log('online display firmware version => ' + desired_display_firmware_version); if (Debug) console.log('online display firmware version => ' + desired_display_firmware_version);
} catch (err) { } else {
console.warn('error result in function check_online_display_firmware' + err.message); console.warn('Axios Status - check_online_display_firmware: ' + response.state);
}
} }
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error requesting firmware in function check_online_display_firmware: ' + err.message); console.warn('error requesting firmware in function check_online_display_firmware: ' + err.message);
} }
@@ -2642,14 +2686,20 @@ function update_berry_driver_version() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Backlog UpdateDriverVersion https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Backlog UpdateDriverVersion https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker' if (Debug) {
console.log(response.data);
} }
}, async function () { } else {
console.warn('Axios Status - update_berry_driver_version: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
console.warn('error at function update_berry_driver_version: ' + err.message); console.warn('error at function update_berry_driver_version: ' + err.message);
} }
@@ -2678,15 +2728,21 @@ function update_tft_firmware() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=FlashNextion ${desired_display_firmware_url}`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=FlashNextion ${desired_display_firmware_url}`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker' if (Debug) {
console.log(response.data);
} }
}, async function () {
await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' }); await createStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.StateCommon>{ type: 'string' });
await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: tft_version, ack: true }); await setStateAsync(NSPanel_Path + 'TFT_Firmware.onlineVersion', <iobJS.State>{ val: tft_version, ack: true });
Init_Release(); Init_Release();
} else {
console.warn('Axios Status - update_tft_firmware: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
}); });
} catch (err) { } catch (err) {
@@ -2703,11 +2759,18 @@ function update_tasmota_firmware() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=OtaUrl ${tasmotaOtaUrl}${tasmotaOtaVersion}`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=OtaUrl ${tasmotaOtaUrl}${tasmotaOtaVersion}`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker' if (Debug) {
console.log(response.data);
} }
} else {
console.warn('Axios Status - update_tasmota_firmware ==> set OTA: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
}); });
urlString = `http://${get_current_tasmota_ip_address()}/cm?cmnd=Upgrade 1`; urlString = `http://${get_current_tasmota_ip_address()}/cm?cmnd=Upgrade 1`;
@@ -2715,13 +2778,20 @@ function update_tasmota_firmware() {
urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Upgrade 1`; urlString = `http://${get_current_tasmota_ip_address()}/cm?user=${tasmota_web_admin_user}&password=${tasmota_web_admin_password}&cmnd=Upgrade 1`;
} }
request({ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
url: `${urlString}`, .then(async function (response) {
headers: { if (response.status === 200) {
'User-Agent': 'ioBroker' if (Debug) {
console.log(response.data);
} }
}, async function () { } else {
console.warn('Axios Status - update_tasmota_firmware: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
}); });
} }
} catch (err) { } catch (err) {
console.warn('error request in function update_tasmota_firmware: ' + err.message); console.warn('error request in function update_tasmota_firmware: ' + err.message);
@@ -4322,32 +4392,44 @@ function unsubscribeMediaSubscriptions(): void {
for (let i = 0; i < config.pages.length; i++) { for (let i = 0; i < config.pages.length; i++) {
if (config.pages[i].type == 'cardMedia') { if (config.pages[i].type == 'cardMedia') {
let mediaID = config.pages[i].items[0].id; let mediaID = config.pages[i].items[0].id;
unsubscribe(mediaID + '.STATE') unsubscribe(mediaID + '.STATE');
unsubscribe(mediaID + '.ARTIST') unsubscribe(mediaID + '.ARTIST');
unsubscribe(mediaID + '.TITLE') unsubscribe(mediaID + '.TITLE');
unsubscribe(mediaID + '.ALBUM') unsubscribe(mediaID + '.ALBUM');
unsubscribe(mediaID + '.VOLUME') unsubscribe(mediaID + '.VOLUME');
unsubscribe(mediaID + '.REPEAT') unsubscribe(mediaID + '.REPEAT');
unsubscribe(mediaID + '.SHUFFLE') unsubscribe(mediaID + '.SHUFFLE');
unsubscribe(mediaID + '.QUEUE');
unsubscribe(mediaID + '.DURATION');
unsubscribe(mediaID + '.ELAPSED');
} }
} }
for (let i = 0; i < config.subPages.length; i++) { for (let i = 0; i < config.subPages.length; i++) {
if (config.subPages[i].type == 'cardMedia') { if (config.subPages[i].type == 'cardMedia') {
let mediaID = config.subPages[i].items[0].id; let mediaID = config.subPages[i].items[0].id;
unsubscribe(mediaID + '.STATE') unsubscribe(mediaID + '.STATE');
unsubscribe(mediaID + '.ARTIST') unsubscribe(mediaID + '.ARTIST');
unsubscribe(mediaID + '.TITLE') unsubscribe(mediaID + '.TITLE');
unsubscribe(mediaID + '.ALBUM') unsubscribe(mediaID + '.ALBUM');
unsubscribe(mediaID + '.VOLUME') unsubscribe(mediaID + '.VOLUME');
unsubscribe(mediaID + '.REPEAT') unsubscribe(mediaID + '.REPEAT');
unsubscribe(mediaID + '.SHUFFLE') unsubscribe(mediaID + '.SHUFFLE');
unsubscribe(mediaID + '.QUEUE');
unsubscribe(mediaID + '.DURATION');
unsubscribe(mediaID + '.ELAPSED');
} }
} }
if (Debug) console.log('unsubscribeMediaSubscriptions gestartet'); if (Debug) console.log('unsubscribeMediaSubscriptions gestartet');
} }
function subscribeMediaSubscriptions(id: string): void { function subscribeMediaSubscriptions(id: string): void {
on({id: [].concat([id + '.STATE']).concat([id + '.VOLUME']).concat([id + '.ARTIST']).concat([id + '.ALBUM']).concat([id + '.TITLE']).concat([id + '.SHUFFLE']).concat([id + '.REPEAT']), change: "any"}, async function () { on({id: [].concat([id + '.STATE'])
.concat([id + '.VOLUME'])
.concat([id + '.ARTIST'])
.concat([id + '.ALBUM'])
.concat([id + '.TITLE'])
.concat([id + '.REPEAT'])
.concat([id + '.SHUFFLE']), change: "any"}, async function () {
(function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })(); (function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })();
timeoutMedia = setTimeout(async function () { timeoutMedia = setTimeout(async function () {
if (useMediaEvents) { if (useMediaEvents) {
@@ -4360,6 +4442,22 @@ function subscribeMediaSubscriptions(id: string): void {
}); });
} }
function subscribeMediaSubscriptionsSonosAdd(id: string): void {
on({id: [].concat([id + '.QUEUE'])
.concat([id + '.DURATION'])
.concat([id + '.ELAPSED']), change: "any"}, async function () {
(function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })();
timeoutMedia = setTimeout(async function () {
if (useMediaEvents) {
GeneratePage(activePage);
setTimeout(async function () {
GeneratePage(activePage);
}, 50);
}
},50)
});
}
async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlayerInstance: string) { async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlayerInstance: string) {
if (autoCreateAlias) { if (autoCreateAlias) {
if (isSetOptionActive) { if (isSetOptionActive) {
@@ -4442,6 +4540,13 @@ async function createAutoMediaAlias(id: string, mediaDevice: string, adapterPlay
console.warn('error at function createAutoMediaAlias Adapter sonos: ' + err.message); console.warn('error at function createAutoMediaAlias Adapter sonos: ' + err.message);
} }
} }
//Add Sonos Add Datapoints > v4.3.3.15
if (existsObject(id + '.QUEUE') == false) {
let dpPath: string = adapterPlayerInstance + 'root.' + mediaDevice;
await createAliasAsync(id + '.QUEUE', dpPath + '.queue', true, <iobJS.StateCommon>{ type: 'string', role: 'state', name: 'QUEUE' });
await createAliasAsync(id + '.DURATION', dpPath + '.current_duration_s', true, <iobJS.StateCommon>{ type: 'string', role: 'media.duration.text', name: 'DURATION' });
await createAliasAsync(id + '.ELAPSED', dpPath + '.current_elapsed_s', true, <iobJS.StateCommon>{ type: 'string', role: 'media.elapsed.text', name: 'ELAPSED' });
}
} }
if (adapterPlayerInstance.startsWith('volumio')) { if (adapterPlayerInstance.startsWith('volumio')) {
@@ -4543,21 +4648,51 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
alwaysOn = true; alwaysOn = true;
SendToPanel({ payload: 'timeout~0' }); SendToPanel({ payload: 'timeout~0' });
subscribeMediaSubscriptions(page.items[0].id); subscribeMediaSubscriptions(page.items[0].id);
if (v2Adapter == 'sonos') {
subscribeMediaSubscriptionsSonosAdd(page.items[0].id);
}
} }
} }
} }
} else if (page.type == 'cardMedia' && pageCounter == 1) { } else if (page.type == 'cardMedia' && pageCounter == 1) {
alwaysOn = true; alwaysOn = true;
subscribeMediaSubscriptions(page.items[0].id); subscribeMediaSubscriptions(page.items[0].id);
if (v2Adapter == 'sonos') {
subscribeMediaSubscriptionsSonosAdd(page.items[0].id);
}
} else if (page.type == 'cardMedia' && pageCounter == -1) {
//Do Nothing
} else { } else {
out_msgs.push({ payload: 'pageType~cardMedia' }); out_msgs.push({ payload: 'pageType~cardMedia' });
} }
if (existsObject(id)) { if (existsObject(id)) {
let name = getState(id + '.ALBUM').val; let name = getState(id + '.ALBUM').val;
let title = getState(id + '.TITLE').val; let title = getState(id + '.TITLE').val;
if (title.length > 27) {
title = title.slice(0, 27) + '...';
}
if (existsObject(id + '.DURATION') && existsObject(id + '.ELAPSED')) {
if (v2Adapter == 'sonos' && getState(page.items[0].adapterPlayerInstance + 'root.' + page.items[0].mediaDevice + '.current_type').val == 0) {
let vElapsed = getState(id + '.ELAPSED').val;
if (vElapsed.length == 5) {
if(parseInt(vElapsed.slice(0,2)) < 9) {
vElapsed = vElapsed.slice(1);
}
} else if (vElapsed.length == 8) {
vElapsed = vElapsed.slice(4);
}
let vDuration = getState(id + '.DURATION').val;
if (vDuration.length == 5) {
if(parseInt(vDuration.slice(0,2)) < 9) {
vDuration = vDuration.slice(1);
}
} else if (vDuration.length == 8) {
vDuration = vDuration.slice(4);
}
title = title + ' (' + vElapsed + '|' + vDuration + ')';
}
}
let author = getState(id + '.ARTIST').val; let author = getState(id + '.ARTIST').val;
let shuffle = getState(id + '.SHUFFLE').val; let shuffle = getState(id + '.SHUFFLE').val;
@@ -4595,9 +4730,14 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
let nameLenght = name.length; let nameLenght = name.length;
if (nameLenght == 0) { if (nameLenght == 0) {
name = 'Sonos Player'; name = 'Sonos Player';
} else if (nameLenght > 16) {
name = name.slice(0,16) + '...'
} }
if ((getState(id + '.ALBUM').val).length > 0) { if ((getState(id + '.ALBUM').val).length > 0) {
author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val; author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
if (author.length > 37) {
author = author.slice(0,37) + '...';
}
} else { } else {
author = getState(id + '.ARTIST').val; author = getState(id + '.ARTIST').val;
} }
@@ -4750,16 +4890,25 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
/* Volumio: get actual playlist if empty */ /* Volumio: get actual playlist if empty */
if (v2Adapter == 'volumio') { if (v2Adapter == 'volumio') {
if (page.items[0].playList.length == 0) { if (page.items[0].playList.length == 0) {
request({ url: `${getState(vInstance+'info.host').val}/api/listplaylists`, headers: {'User-Agent': 'ioBroker'} },
async (error, response, result) => { let urlString: string = `${getState(vInstance+'info.host').val}/api/listplaylists`;
try {
page.items[0].playList = JSON.parse(result); axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
}
page.items[0].playList = JSON.parse(JSON.stringify(response.data));
if (Debug) console.log('volumio-playlist: ' + page.items[0].playList); if (Debug) console.log('volumio-playlist: ' + page.items[0].playList);
} catch (err) { } else {
console.warn('get_volumio-playlist: ' + err.message); console.warn('Axios Status - get_volumio-playlist: ' + response.state);
} }
} })
); .catch(function (error) {
console.log(error);
});
} }
} }
playListIconCol = rgb_dec565(HMIOn); playListIconCol = rgb_dec565(HMIOn);
@@ -4777,17 +4926,26 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
let trackListIconCol = rgb_dec565(HMIOff); let trackListIconCol = rgb_dec565(HMIOff);
if (v2Adapter == 'volumio') { /* Volumio: get queue */ if (v2Adapter == 'volumio') { /* Volumio: get queue */
setTimeout(async function () { setTimeout(async function () {
request({ url: `${getState(vInstance+'info.host').val}/api/getQueue`, headers: {'User-Agent': 'ioBroker'} },
async (error, response, result) => { let urlString: string = `${getState(vInstance+'info.host').val}/api/getQueue`;
try {
const QUEUELIST = JSON.parse(result); axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
}
const QUEUELIST = JSON.parse(JSON.stringify(response.data));
page.items[0].globalTracklist = QUEUELIST.queue; page.items[0].globalTracklist = QUEUELIST.queue;
if (Debug) { for (let i_index in QUEUELIST.queue) console.log('volumio-queue: ' + QUEUELIST.queue[i_index]); } if (Debug) { for (let i_index in QUEUELIST.queue) console.log('volumio-queue: ' + QUEUELIST.queue[i_index]); }
} catch (err) { } else {
console.warn('get_volumio-queue: ' + err.message); console.warn('Axios Status - get_volumio-queue: ' + response.state);
} }
} })
); .catch(function (error) {
console.log(error);
});
}, 2000); }, 2000);
globalTracklist = page.items[0].globalTracklist; globalTracklist = page.items[0].globalTracklist;
} else if(v2Adapter == 'squeezeboxrpc' && existsObject(([page.items[0].adapterPlayerInstance, '.Players.', page.items[0].mediaDevice, '.Playlist'].join('')))) { } else if(v2Adapter == 'squeezeboxrpc' && existsObject(([page.items[0].adapterPlayerInstance, '.Players.', page.items[0].mediaDevice, '.Playlist'].join('')))) {
@@ -5739,7 +5897,10 @@ function HandleButtonEvent(words: any): void {
case 'hue': case 'hue':
toggleState(id + '.ON_ACTUAL'); toggleState(id + '.ON_ACTUAL');
case 'media': case 'media':
if (tempid[1] == 'repeat') { if (tempid[1] == undefined) {
console.log('Logo click');
GeneratePage(activePage);
} else if (tempid[1] == 'repeat') {
let pageItemRepeat = findPageItem(id); let pageItemRepeat = findPageItem(id);
let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance; let adapterInstanceRepeat = pageItemRepeat.adapterPlayerInstance;
let adapterRepeat = adapterInstanceRepeat.split('.'); let adapterRepeat = adapterInstanceRepeat.split('.');
@@ -5777,9 +5938,21 @@ function HandleButtonEvent(words: any): void {
GeneratePage(activePage); GeneratePage(activePage);
break; break;
case 'volumio': case 'volumio':
request({ url:`${getState(adapterInstanceRepeat+'info.host').val}/api/commands/?cmd=repeat`, headers: {'User-Agent': 'ioBroker'} }, let urlString: string = `${getState(adapterInstanceRepeat+'info.host').val}/api/commands/?cmd=repeat`;
async (error, response, result)=>{}); /* nothing todo @ error */ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(response.data);
}
GeneratePage(activePage); GeneratePage(activePage);
} else {
console.warn('Axios Status - adapterInstanceRepeat: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
});
break; break;
case 'squeezeboxrpc': case 'squeezeboxrpc':
try { try {
@@ -5998,6 +6171,7 @@ function HandleButtonEvent(words: any): void {
GeneratePage(activePage); GeneratePage(activePage);
break; break;
case 'volumeSlider': case 'volumeSlider':
pageCounter = -1;
(function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })(); (function () { if (timeoutSlider) { clearTimeout(timeoutSlider); timeoutSlider = null; } })();
timeoutSlider = setTimeout(async function () { timeoutSlider = setTimeout(async function () {
setIfExists(id + '.VOLUME', parseInt(words[4])); setIfExists(id + '.VOLUME', parseInt(words[4]));
@@ -6076,8 +6250,20 @@ function HandleButtonEvent(words: any): void {
break; break;
case 'volumio': case 'volumio':
let strDevicePL = pageItemPL.playList[words[4]]; let strDevicePL = pageItemPL.playList[words[4]];
request({ url:`${getState(adapterInstancePL+'info.host').val}/api/commands/?cmd=playplaylist&name=${strDevicePL}`, headers: {'User-Agent': 'ioBroker'} }, let urlString: string = `${getState(adapterInstancePL+'info.host').val}/api/commands/?cmd=playplaylist&name=${strDevicePL}`;
async (error, response, result)=>{}); /* nothing todo @ error */ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
}
} else {
console.warn('Axios Status - mode-playlist: ' + response.state);
}
})
.catch(function (error) {
console.log(error);
});
break; break;
case 'squeezeboxrpc': case 'squeezeboxrpc':
setState([pageItemPL.adapterPlayerInstance, 'Players', pageItemPL.mediaDevice, 'cmdPlayFavorite'].join('.'), words[4]); setState([pageItemPL.adapterPlayerInstance, 'Players', pageItemPL.mediaDevice, 'cmdPlayFavorite'].join('.'), words[4]);
@@ -6107,8 +6293,20 @@ function HandleButtonEvent(words: any): void {
if (Debug) console.log('Aktuell hat alexa2 keine Tracklist'); if (Debug) console.log('Aktuell hat alexa2 keine Tracklist');
break; break;
case 'volumio': case 'volumio':
request({ url:`${getState(adapterInstanceTL+'info.host').val}/api/commands/?cmd=play&N=${words[4]}`, headers: {'User-Agent': 'ioBroker'} }, let urlString: string = `${getState(adapterInstanceTL+'info.host').val}/api/commands/?cmd=play&N=${words[4]}`;
async (error, response, result)=>{}); /* nothing todo @ error */ axios.get(urlString, { headers: { 'User-Agent': 'ioBroker' } })
.then(async function (response) {
if (response.status === 200) {
if (Debug) {
console.log(JSON.stringify(response.data));
}
} else {
console.warn('Axios Status - mode-tracklist: ' + response.state);
}
})
.catch(function (error: any) {
console.log(error);
});
break; break;
case 'squeezeboxrpc': case 'squeezeboxrpc':
setState([pageItemPL.adapterPlayerInstance, 'Players', pageItemPL.mediaDevice, 'PlaylistCurrentIndex'].join('.'), words[4]); setState([pageItemPL.adapterPlayerInstance, 'Players', pageItemPL.mediaDevice, 'PlaylistCurrentIndex'].join('.'), words[4]);
@@ -8742,6 +8940,10 @@ type PageItem = {
popupThermoMode2: (string[] | undefined), popupThermoMode2: (string[] | undefined),
popupThermoMode3: (string[] | undefined), popupThermoMode3: (string[] | undefined),
popUpThermoName: (string[] | undefined), popUpThermoName: (string[] | undefined),
popupMediaMode1: (string[] | undefined),
popupMediaMode2: (string[] | undefined),
popupMediaMode3: (string[] | undefined),
popUpMediaName: (string[] | undefined),
setThermoAlias: (string[] | undefined), setThermoAlias: (string[] | undefined),
setThermoDestTemp2: (string | undefined), setThermoDestTemp2: (string | undefined),
yAxis: (string | undefined), yAxis: (string | undefined),