From 7133062f6b2e4138cec4097fd44b8d1faed0f17c Mon Sep 17 00:00:00 2001 From: Armilar <102996011+Armilar@users.noreply.github.com> Date: Tue, 1 Nov 2022 12:25:38 +0100 Subject: [PATCH] v3.5.0.4 Reengineering Media Subscriptions --- ioBroker/NsPanelTs.ts | 73 +++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/ioBroker/NsPanelTs.ts b/ioBroker/NsPanelTs.ts index a205d0fd..7f1dbf73 100644 --- a/ioBroker/NsPanelTs.ts +++ b/ioBroker/NsPanelTs.ts @@ -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 @joBr99 Projekt: https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker - NsPanelTs.ts (dieses TypeScript in ioBroker) Stable: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts icon_mapping.ts: https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts (TypeScript muss in global liegen) - 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 - ******************************************************************************* Achtung Änderung des Sonoff ESP-Temperatursensors !!! Bitte "SetOption146 1" in der Tasmota-Console ausführen !!! ******************************************************************************* - ReleaseNotes: Bugfixes und Erweiterungen: - 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 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 Upgrade TFT 42 - 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 - 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) - 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.5.0 Upgrade TFT 43 - 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 - 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) - 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.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 + 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 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 !!! ggf. Offset einplanen oder besser einen externen Sensor über Zigbee etc. verwenden) Timestamp - wird in 0_userdata.0. Zeitpunkt der letzten Sensorübertragung - 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 Erforderliche Adapter: + AccuWeather: - Bei Nutzung der Wetterfunktionen (und zur Icon-Konvertierung) im Screensaver Alexa2: - Bei Nutzung der dynamischen SpeakerList in der cardMedia Geräte verwalten - Für Erstellung der Aliase @@ -653,6 +653,9 @@ export const config: Config = { const request = require('request'); +let useMediaEvents: boolean = false; +let timeoutMedia: any; + //---------------------Begin PageNavi async function InitPageNavi() { try { @@ -1520,6 +1523,7 @@ function HandleMessage(typ: string, method: string, page: number, words: Arraypage)); break; case 'cardMedia': + useMediaEvents = true; SendToPanel(GenerateMediaPage(page)); break; 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[] { try { let id = page.items[0].id let out_msgs: Array = []; + unsubscribeMediaSubscriptions(); + + subscribeMediaSubscriptions(id); + out_msgs.push({ payload: 'pageType~cardMedia' }); if (existsObject(id)) { let name = getState(id + '.ALBUM').val; @@ -2494,11 +2527,9 @@ function GenerateMediaPage(page: PageMedia): Payload[] { name = getState(id + '.CONTEXT_DESCRIPTION').val; let nameLength = name.length; if (name.substring(0,9) == 'Playlist:') { - let nameLength = name.length; - name = name.slice(10, nameLength); + name = name.slice(10, 26) + '...'; } else if (name.substring(0,6) == 'Album:') { - let nameLength = name.length; - name = name.slice(10, nameLength); + name = name.slice(7, 23) + '...'; } else if (name.substring(0,6) == 'Track') { name = 'Spotify-Premium'; } @@ -3171,11 +3202,6 @@ function HandleButtonEvent(words): void { break; case 'media-back': setIfExists(id + '.PREV', true); - on({id: id + '.TITLE', change: "ne"}, async function () { - setTimeout(function(){ - GeneratePage(activePage); - },25) - }); break; case 'media-pause': let pageItemTemp = findPageItem(id); @@ -3196,24 +3222,9 @@ function HandleButtonEvent(words): void { 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; case 'media-next': setIfExists(id + '.NEXT', true); - on({id: id + '.TITLE', change: "ne"}, async function () { - setTimeout(function(){ - GeneratePage(activePage); - },25) - }); break; case 'volumeSlider': setIfExists(id + '.VOLUME', parseInt(words[4]))