v3.5.0.4 Reengineering Media Subscriptions

This commit is contained in:
Armilar
2022-11-01 12:25:38 +01:00
committed by GitHub
parent fa18cbdc3f
commit 7133062f6b

View File

@@ -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]))