mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-21 15:04:24 +01:00
v3.5.0.4 Reengineering Media Subscriptions
This commit is contained in:
@@ -1,20 +1,16 @@
|
|||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
TypeScript v3.5.0.2 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar/@Britzelpuf
|
TypeScript v3.5.0.4 zur Steuerung des SONOFF NSPanel mit dem ioBroker by @Armilar/@Sternmiere/@Britzelpuf
|
||||||
- abgestimmt auf TFT 43 / v3.5.0 / BerryDriver 4 / Tasmota 12.2.0
|
- abgestimmt auf TFT 43 / v3.5.0 / BerryDriver 4 / Tasmota 12.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
|
||||||
icon_mapping.ts: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts (TypeScript muss in global liegen)
|
icon_mapping.ts: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts (TypeScript muss in global liegen)
|
||||||
|
|
||||||
ioBroker-Unterstützung: https://forum.iobroker.net/topic/50888/sonoff-nspanel
|
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)
|
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
|
Icons unter: https://htmlpreview.github.io/?https://github.com/jobr99/Generate-HASP-Fonts/blob/master/cheatsheet.html
|
||||||
|
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
Achtung Änderung des Sonoff ESP-Temperatursensors
|
Achtung Änderung des Sonoff ESP-Temperatursensors
|
||||||
!!! Bitte "SetOption146 1" in der Tasmota-Console ausführen !!!
|
!!! Bitte "SetOption146 1" in der Tasmota-Console ausführen !!!
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
ReleaseNotes:
|
ReleaseNotes:
|
||||||
Bugfixes und Erweiterungen:
|
Bugfixes und Erweiterungen:
|
||||||
- cardQR (für Gäste WLAN)
|
- cardQR (für Gäste WLAN)
|
||||||
@@ -45,6 +41,7 @@ ReleaseNotes:
|
|||||||
- 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 Ü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
|
- 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 - BugFix Dimmode
|
||||||
|
- 15.09.2022 - v3.4.0 Upgrade TFT 42
|
||||||
- 15.09.2022 - V3.4.0 - Colormode für Screensaver + AutoColor WeatherForecast
|
- 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
|
- 16.09.2022 - v3.4.0.1 Visualisierung der Relay Zustände (MRIcons) im Screensaver + Bugfix Screensaver MRIcon2
|
||||||
- 17.09.2022 - v3.4.0.2 Bugfix for screensaver icons with scaled colors
|
- 17.09.2022 - v3.4.0.2 Bugfix for screensaver icons with scaled colors
|
||||||
@@ -56,6 +53,7 @@ ReleaseNotes:
|
|||||||
- 03.10.2022 - v3.4.0.6 Add cardPower (experimental)
|
- 03.10.2022 - v3.4.0.6 Add cardPower (experimental)
|
||||||
- 05.10.2022 - v3.4.0.6 Add sueezeboxrpc to cardMedia
|
- 05.10.2022 - v3.4.0.6 Add sueezeboxrpc to cardMedia
|
||||||
- 07.10.2022 - v3.4.0.6 Time-configurable change for screensaver icons
|
- 07.10.2022 - v3.4.0.6 Time-configurable change for screensaver icons
|
||||||
|
- 07.10.2022 - v3.5.0 Upgrade TFT 43
|
||||||
- 07.10.2022 - v3.5.0 Add Backgroundcolor to Pages
|
- 07.10.2022 - v3.5.0 Add Backgroundcolor to Pages
|
||||||
- 08.10.2022 - v3.5.0 Add Tilt-Slider and TILT_Fucntions (Open/Stop/Close) to Blinds/Cover/Shutter popUp
|
- 08.10.2022 - v3.5.0 Add Tilt-Slider and TILT_Fucntions (Open/Stop/Close) to Blinds/Cover/Shutter popUp
|
||||||
- 12.10.2022 - v3.5.0 Add PageNavigation via Datapoint
|
- 12.10.2022 - v3.5.0 Add PageNavigation via Datapoint
|
||||||
@@ -63,9 +61,11 @@ ReleaseNotes:
|
|||||||
- 26.10.2022 - v3.5.0.1 Fix Thermostat for tado Support (by Sternmiere)
|
- 26.10.2022 - v3.5.0.1 Fix Thermostat for tado Support (by Sternmiere)
|
||||||
- 27.10.2022 - v3.5.0.1 Add VirtualDevice Gate
|
- 27.10.2022 - v3.5.0.1 Add VirtualDevice Gate
|
||||||
- 27.10.2022 - v3.5.0.2 Applied Boy Scout Rule (Fixed some typos, changed var to let, fixed min/max colorTemp Bug)
|
- 27.10.2022 - v3.5.0.2 Applied Boy Scout Rule (Fixed some typos, changed var to let, fixed min/max colorTemp Bug)
|
||||||
- 27.10.2022 - v3.5.0.3 Fixed Media Play/Pause icon for alexa (and others) devices
|
- 30.10.2022 - v3.5.0.3 Fixed Media Play/Pause icon for alexa (and others) devices
|
||||||
|
- 31.10.2022 - v3.5.0.4 Reengineering Media Subscriptions
|
||||||
|
|
||||||
Wenn Rule definiert, dann können die Hardware-Tasten ebenfalls für Seitensteuerung (dann nicht mehr als Relais) genutzt werden
|
Wenn Rule definiert, dann können die Hardware-Tasten ebenfalls für Seitensteuerung (dann nicht mehr als Relais) genutzt werden
|
||||||
|
|
||||||
Tasmota Konsole:
|
Tasmota Konsole:
|
||||||
Rule2 on Button1#state do Publish %topic%/%prefix%/RESULT {"CustomRecv":"event,button1"} endon on Button2#state do Publish %topic%/%prefix%/RESULT {"CustomRecv":"event,button2"} endon
|
Rule2 on Button1#state do Publish %topic%/%prefix%/RESULT {"CustomRecv":"event,button1"} endon on Button2#state do Publish %topic%/%prefix%/RESULT {"CustomRecv":"event,button2"} endon
|
||||||
Rule2 1 (Rule aktivieren)
|
Rule2 1 (Rule aktivieren)
|
||||||
@@ -118,11 +118,11 @@ Interne Sonoff-Sensoren (über Tasmota):
|
|||||||
(!!! Achtung: der interne Sonoff-Sensor liefert keine exakten Daten, da das NSPanel-Board und der ESP selbst Hitze produzieren !!!
|
(!!! Achtung: der interne Sonoff-Sensor liefert keine exakten Daten, da das NSPanel-Board und der ESP selbst Hitze produzieren !!!
|
||||||
ggf. Offset einplanen oder besser einen externen Sensor über Zigbee etc. verwenden)
|
ggf. Offset einplanen oder besser einen externen Sensor über Zigbee etc. verwenden)
|
||||||
Timestamp - wird in 0_userdata.0. Zeitpunkt der letzten Sensorübertragung
|
Timestamp - wird in 0_userdata.0. Zeitpunkt der letzten Sensorübertragung
|
||||||
|
|
||||||
Tasmota-Status0 - (zyklische Ausführung)
|
Tasmota-Status0 - (zyklische Ausführung)
|
||||||
liefert relevanten Tasmota-Informationen und kann bei Bedarf in "function get_tasmota_status0()" erweitert werden. Daten werden in 0_userdata.0. abgelegt
|
liefert relevanten Tasmota-Informationen und kann bei Bedarf in "function get_tasmota_status0()" erweitert werden. Daten werden in 0_userdata.0. abgelegt
|
||||||
|
|
||||||
Erforderliche Adapter:
|
Erforderliche Adapter:
|
||||||
|
|
||||||
AccuWeather: - Bei Nutzung der Wetterfunktionen (und zur Icon-Konvertierung) im Screensaver
|
AccuWeather: - Bei Nutzung der Wetterfunktionen (und zur Icon-Konvertierung) im Screensaver
|
||||||
Alexa2: - Bei Nutzung der dynamischen SpeakerList in der cardMedia
|
Alexa2: - Bei Nutzung der dynamischen SpeakerList in der cardMedia
|
||||||
Geräte verwalten - Für Erstellung der Aliase
|
Geräte verwalten - Für Erstellung der Aliase
|
||||||
@@ -653,6 +653,9 @@ export const config: Config = {
|
|||||||
|
|
||||||
const request = require('request');
|
const request = require('request');
|
||||||
|
|
||||||
|
let useMediaEvents: boolean = false;
|
||||||
|
let timeoutMedia: any;
|
||||||
|
|
||||||
//---------------------Begin PageNavi
|
//---------------------Begin PageNavi
|
||||||
async function InitPageNavi() {
|
async function InitPageNavi() {
|
||||||
try {
|
try {
|
||||||
@@ -1520,6 +1523,7 @@ function HandleMessage(typ: string, method: string, page: number, words: Array<s
|
|||||||
GeneratePage(config.pages[0]);
|
GeneratePage(config.pages[0]);
|
||||||
break;
|
break;
|
||||||
case 'sleepReached':
|
case 'sleepReached':
|
||||||
|
useMediaEvents = false;
|
||||||
screensaverEnabled = true;
|
screensaverEnabled = true;
|
||||||
if (pageId < 0)
|
if (pageId < 0)
|
||||||
pageId = 0;
|
pageId = 0;
|
||||||
@@ -1589,6 +1593,7 @@ function GeneratePage(page: Page): void {
|
|||||||
SendToPanel(GenerateGridPage(<PageGrid>page));
|
SendToPanel(GenerateGridPage(<PageGrid>page));
|
||||||
break;
|
break;
|
||||||
case 'cardMedia':
|
case 'cardMedia':
|
||||||
|
useMediaEvents = true;
|
||||||
SendToPanel(GenerateMediaPage(<PageMedia>page));
|
SendToPanel(GenerateMediaPage(<PageMedia>page));
|
||||||
break;
|
break;
|
||||||
case 'cardAlarm':
|
case 'cardAlarm':
|
||||||
@@ -2469,12 +2474,40 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function unsubscribeMediaSubscriptions(): void {
|
||||||
|
for (let i = 0; i < config.pages.length; i++) {
|
||||||
|
if (config.pages[i].type == 'cardMedia') {
|
||||||
|
let mediaID = config.pages[i].items[0].id;
|
||||||
|
unsubscribe(mediaID + '.STATE')
|
||||||
|
unsubscribe(mediaID + '.ARTIST')
|
||||||
|
unsubscribe(mediaID + '.TITLE')
|
||||||
|
unsubscribe(mediaID + '.ALBUM')
|
||||||
|
unsubscribe(mediaID + '.VOLUME')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function subscribeMediaSubscriptions(id: string): void {
|
||||||
|
on({id: [].concat([id + '.STATE']).concat([id + '.VOLUME']).concat([id + '.ARTIST']).concat([id + '.ALBUM']).concat([id + '.TITLE']), change: "ne"}, async function () {
|
||||||
|
(function () { if (timeoutMedia) { clearTimeout(timeoutMedia); timeoutMedia = null; } })();
|
||||||
|
timeoutMedia = setTimeout(async function () {
|
||||||
|
if (useMediaEvents) {
|
||||||
|
GeneratePage(activePage);
|
||||||
|
}
|
||||||
|
},25)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function GenerateMediaPage(page: PageMedia): Payload[] {
|
function GenerateMediaPage(page: PageMedia): Payload[] {
|
||||||
try {
|
try {
|
||||||
let id = page.items[0].id
|
let id = page.items[0].id
|
||||||
|
|
||||||
let out_msgs: Array<Payload> = [];
|
let out_msgs: Array<Payload> = [];
|
||||||
|
|
||||||
|
unsubscribeMediaSubscriptions();
|
||||||
|
|
||||||
|
subscribeMediaSubscriptions(id);
|
||||||
|
|
||||||
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;
|
||||||
@@ -2494,11 +2527,9 @@ function GenerateMediaPage(page: PageMedia): Payload[] {
|
|||||||
name = getState(id + '.CONTEXT_DESCRIPTION').val;
|
name = getState(id + '.CONTEXT_DESCRIPTION').val;
|
||||||
let nameLength = name.length;
|
let nameLength = name.length;
|
||||||
if (name.substring(0,9) == 'Playlist:') {
|
if (name.substring(0,9) == 'Playlist:') {
|
||||||
let nameLength = name.length;
|
name = name.slice(10, 26) + '...';
|
||||||
name = name.slice(10, nameLength);
|
|
||||||
} else if (name.substring(0,6) == 'Album:') {
|
} else if (name.substring(0,6) == 'Album:') {
|
||||||
let nameLength = name.length;
|
name = name.slice(7, 23) + '...';
|
||||||
name = name.slice(10, nameLength);
|
|
||||||
} else if (name.substring(0,6) == 'Track') {
|
} else if (name.substring(0,6) == 'Track') {
|
||||||
name = 'Spotify-Premium';
|
name = 'Spotify-Premium';
|
||||||
}
|
}
|
||||||
@@ -3171,11 +3202,6 @@ function HandleButtonEvent(words): void {
|
|||||||
break;
|
break;
|
||||||
case 'media-back':
|
case 'media-back':
|
||||||
setIfExists(id + '.PREV', true);
|
setIfExists(id + '.PREV', true);
|
||||||
on({id: id + '.TITLE', change: "ne"}, async function () {
|
|
||||||
setTimeout(function(){
|
|
||||||
GeneratePage(activePage);
|
|
||||||
},25)
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case 'media-pause':
|
case 'media-pause':
|
||||||
let pageItemTemp = findPageItem(id);
|
let pageItemTemp = findPageItem(id);
|
||||||
@@ -3196,24 +3222,9 @@ function HandleButtonEvent(words): void {
|
|||||||
setIfExists(id + '.PLAY', true);
|
setIfExists(id + '.PLAY', true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
on({id: id + '.STATE', val: true}, async function () {
|
|
||||||
on({id: [].concat([id + '.ARTIST']).concat([id + '.ALBUM']).concat([id + '.TITLE']), change: "ne"}, async function () {
|
|
||||||
setTimeout(function(){
|
|
||||||
GeneratePage(activePage);
|
|
||||||
},25)
|
|
||||||
});
|
|
||||||
});
|
|
||||||
on({id: id + '.STATE', val: false}, async function () {
|
|
||||||
GeneratePage(activePage);
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case 'media-next':
|
case 'media-next':
|
||||||
setIfExists(id + '.NEXT', true);
|
setIfExists(id + '.NEXT', true);
|
||||||
on({id: id + '.TITLE', change: "ne"}, async function () {
|
|
||||||
setTimeout(function(){
|
|
||||||
GeneratePage(activePage);
|
|
||||||
},25)
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case 'volumeSlider':
|
case 'volumeSlider':
|
||||||
setIfExists(id + '.VOLUME', parseInt(words[4]))
|
setIfExists(id + '.VOLUME', parseInt(words[4]))
|
||||||
|
|||||||
Reference in New Issue
Block a user