v3.2.0: New Feature based on Code-Refactoring (ioBroker TypeScript) by klein0r

- minute change (with 30 seconds delay) between data points and WeatherForecast in the screensaver
- Bug fix : TFT v:3.2.0 in GenerateDetailPage: Color-Language not via findLocales, because not included in language file
This commit is contained in:
Armilar
2022-08-28 15:47:22 +02:00
committed by GitHub
parent 44f7924107
commit 7c82edfe9e

View File

@@ -1,6 +1,6 @@
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
TypeScript zur Steuerung des SONOFF NSPanel mit dem ioBroker TypeScript zur Steuerung des SONOFF NSPanel mit dem ioBroker
- abgestimmt auf TFT 38 / v3.1.0.1 / BerryDriver 4 / Tasmota 12.1.0 - abgestimmt auf TFT 39 / v3.2.0 / BerryDriver 4 / Tasmota 12.1.1
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)
@@ -24,10 +24,11 @@ ReleaseNotes:
- 19.06.2022 - V3.1.0 - Fehler in findLocale abgefangen - 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 - Umstellung auf "Home Assistant" Sprachfile
- 19.06.2022 - V3.1.0 - Alias "light" und "socket" haben optionalen Parameter icon2 für negative Zustände - 19.06.2022 - V3.1.0 - Alias "light" und "socket" haben optionalen Parameter icon2 für negative Zustände
- 27.08.2022 - V3.1.0 - Code-Refactoring (klein0r) - 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)
Known Bug - 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)
- Github Issue #286 - 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
Wenn Rule definiert, dann können die Hardware-Tasten ebenfalls für Seitensteuerung (dann nicht mehr als Releais) genutzt werden Wenn Rule definiert, dann können die Hardware-Tasten ebenfalls für Seitensteuerung (dann nicht mehr als Releais) genutzt werden
Tasmota Konsole: Tasmota Konsole:
@@ -38,7 +39,7 @@ Tasmota Konsole:
Mögliche Seiten-Ansichten: Mögliche Seiten-Ansichten:
screensaver Page - wird nach definiertem Zeitraum (config) mit Dimm-Modus aktiv (Uhrzeit, Datum, Aktuelle Temperatur mit Symbol) screensaver Page - wird nach definiertem Zeitraum (config) mit Dimm-Modus aktiv (Uhrzeit, Datum, Aktuelle Temperatur mit Symbol)
(die 4 kleineren Icons können als Wetter-Vorschau + 4Tage (Symbol + Höschsttemperatur) oder zur Anzeige definierter Infos konfiguriert werden) (die 4 kleineren Icons können als Wetter-Vorschau + 4Tage (Symbol + Höschsttemperatur) oder zur Anzeige definierter Infos konfiguriert werden)
cardEtities Page - 4 vertikale angeordnete Steuerelemente - auch als Subpage cardEntities Page - 4 vertikale angeordnete Steuerelemente - auch als Subpage
cardGrid Page - 6 horizontal angeordnete Steuerelemente in 2 Reihen a 3 Steuerelemente - auch als Subpage cardGrid Page - 6 horizontal angeordnete Steuerelemente in 2 Reihen a 3 Steuerelemente - auch als Subpage
cardThermo Page - Thermostat mit Solltemperatur, Isttemperatur, Mode - Weitere Eigenschaften können im Alias definiert werden cardThermo Page - Thermostat mit Solltemperatur, Isttemperatur, Mode - Weitere Eigenschaften können im Alias definiert werden
cardMedia Page - Mediaplayer - Ausnahme: Alias sollte mit Alias-Manager automatisch über Alexa-Verzeichnes Player angelegt werden cardMedia Page - Mediaplayer - Ausnahme: Alias sollte mit Alias-Manager automatisch über Alexa-Verzeichnes Player angelegt werden
@@ -59,13 +60,13 @@ Mögliche Aliase: (Vorzugsweise mit ioBroker-Adapter "Geräte verwalten" konfigu
Steckdose - An/Aus (Schalter) Steckdose - An/Aus (Schalter)
Dimmer - An/Aus, Brightness Dimmer - An/Aus, Brightness
Farbtemperatur - An/Aus, Farbtemperatur und Brightness Farbtemperatur - An/Aus, Farbtemperatur und Brightness
HUE-Licht - Zum Schalten von Color-Leuchtmitteln über HUE-Wert, Brightness, Farbtemperatur, An/Aus (ON_ACTUAL/DIMMER/HUE/TEMPERATURE) HUE-Licht - Zum Schalten von Color-Leuchtmitteln über HUE-Wert, Brightness, Farbtemperatur, An/Aus (HUE kann auch fehlen)
RGB-Licht - RGB-Leuchtmitteln/Stripes welche Rot/Grün/ und Blau separat benötigen (Tasmota, WifiLight, etc.) + Brightness, Farbtemperatur RGB-Licht - RGB-Leuchtmitteln/Stripes welche Rot/Grün/ und Blau separat benötigen (Tasmota, WifiLight, etc.) + Brightness, Farbtemperatur
RGB-Licht-einzeln - RGB-Leuchtmitteln/Stripes welche HEX-Farbwerte benötigen (Tasmota, WifiLight, etc.) + Brightness, Farbtemperatur RGB-Licht-einzeln - RGB-Leuchtmitteln/Stripes welche HEX-Farbwerte benötigen (Tasmota, WifiLight, etc.) + Brightness, Farbtemperatur
Jalousien - Up, Stop, Down, Position Jalousien - Up, Stop, Down, Position
Fenster - Sensor open Fenster - Sensor open
Tür - Sensor open Tür - Sensor open
Verschluss - Türschloss (SET/ACTUAL/OPEN) Verschluss - Türschloss SET/ACTUAL/OPEN
Taste - Für Szenen oder Radiosender, etc. --> Nur Funktionsaufruf - Kein Taster wie MonoButton - True/False Taste - Für Szenen oder Radiosender, etc. --> Nur Funktionsaufruf - Kein Taster wie MonoButton - True/False
Tastensensor - analog Taste Tastensensor - analog Taste
Thermostat - Aktuelle Raumtemperatur, Setpoint, etc. Thermostat - Aktuelle Raumtemperatur, Setpoint, etc.
@@ -73,7 +74,7 @@ Mögliche Aliase: (Vorzugsweise mit ioBroker-Adapter "Geräte verwalten" konfigu
Temperatur - Anzeige von Temperture - Datenpunkten, ananlog Info Temperatur - Anzeige von Temperture - Datenpunkten, ananlog Info
Feuchtigkeit - Anzeige von Humidity - Datenpunkten, ananlog Info Feuchtigkeit - Anzeige von Humidity - Datenpunkten, ananlog Info
Medien - Steuerung von Alexa - Über Alias-Manager im Verzeichnis Player automatisch anlegen (Geräte-Manager funktioniert nicht) Medien - Steuerung von Alexa - Über Alias-Manager im Verzeichnis Player automatisch anlegen (Geräte-Manager funktioniert nicht)
Wettervorhersage - Aktuelle Außen-Temperatur und aktuelles Accu-Wheather-Icon für Screensaver (ICON/ACTUAL/TEMP) Wettervorhersage - Aktuelle Außen-Temperatur (Temp) und aktuelles Accu-Wheather-Icon (Icon) für Screensaver
Interne Sonoff-Sensoren (über Tasmota): Interne Sonoff-Sensoren (über Tasmota):
ESP-Temperatur - wird in 0_userdata.0. abgelegt, kann als Alias importieert werden ESP-Temperatur - wird in 0_userdata.0. abgelegt, kann als Alias importieert werden
@@ -92,7 +93,7 @@ Erforderliche Adapter:
JavaScript-Adapter JavaScript-Adapter
Upgrades in Konsole: Upgrades in Konsole:
Tasmota BerryDriver : Backlog UpdateDriverVersion https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1 Tasmota BerryDriver : Backlog UpdateDriverVersion https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/tasmota/autoexec.be; Restart 1
TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v3.1.0.tft TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v3.2.0.tft
--------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------
*/ */
var Icons = new IconsSelector(); var Icons = new IconsSelector();
@@ -120,10 +121,10 @@ const colorRadio: RGB = { red: 255, green: 127, blue: 0 };
const BatteryFull: RGB = { red: 96, green: 176, blue: 62 }; const BatteryFull: RGB = { red: 96, green: 176, blue: 62 };
const BatteryEmpty: RGB = { red: 179, green: 45, blue: 25 }; const BatteryEmpty: RGB = { red: 179, green: 45, blue: 25 };
// Möglichkeit, im Screensaver zwischen Accu-Weather Forecast oder selbstdefinierten Werten zu wählen // Variablen zur Steuerung der Wettericons auf dem Screensaver (Steuerung in 0_userdata.0.XPANELX.ScreensaverInfo)
// true = WeatherForecast 5 Days // Wenn weatherForecastTimer auf true, dann Wechsel zwischen Datenpunkten und Wettervorhersage (30 Sekunden nach Minute (Zeit))
// false = Config --> firstScreensaverEntity - fourthScreensaverEntity ... // Wenn weatherForecastTimer auf false, dann Möglichkeit über weatherForecast, ob Datenpunkte oder Wettervorhersage (true = WeatherForecast/false = Datenpunkte)
const weatherForecast = false; var weatherForecast = getState(NSPanel_Path + "ScreensaverInfo.weatherForecast").val
// Alexa-Instanz // Alexa-Instanz
var alexaInstanz = 'alexa2.0'; var alexaInstanz = 'alexa2.0';
@@ -466,7 +467,16 @@ function ScreensaverDimmode(timeDimMode: DimMode) {
} }
} }
async function InitWeatherForecast() {
//----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) {
await createStateAsync(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, { type: 'boolean' });
await createStateAsync(NSPanel_Path + "ScreensaverInfo.weatherForecastTimer", true, { type: 'boolean' });
};
}
async function InitDimmode() { async function InitDimmode() {
// Screensaver nachts auf dunkel ("brightnessNight: z.B. 2") oder aus ("brightnessNight:0") // Screensaver nachts auf dunkel ("brightnessNight: z.B. 2") oder aus ("brightnessNight:0")
if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay')) { if (!existsState(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay')) {
await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', <iobJS.StateCommon>{ type: 'number' }); await createStateAsync(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay', <iobJS.StateCommon>{ type: 'number' });
@@ -510,6 +520,7 @@ async function InitDimmode() {
}); });
} }
InitWeatherForecast();
InitDimmode(); InitDimmode();
//--------------------End Dimmode //--------------------End Dimmode
@@ -588,6 +599,18 @@ let activePage = undefined;
schedule('* * * * *', () => { schedule('* * * * *', () => {
SendTime(); SendTime();
//WeatherForcast true/false Umschaltung halbe Minute 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);
} else {
setStateDelayed(NSPanel_Path + "ScreensaverInfo.weatherForecast", true, 30000, false);
}
});
//Wechsel zwischen Datenpunkten und Weather-Forecast im Screensaver
on({id: [].concat([NSPanel_Path + "ScreensaverInfo.weatherForecast"]), change: "ne"}, async function (obj) {
weatherForecast = obj.state.val;
HandleScreensaverUpdate();
}); });
schedule('0 * * * *', () => { schedule('0 * * * *', () => {
@@ -631,7 +654,7 @@ function get_locales() {
} }
async function check_updates() { async function check_updates() {
const desired_display_firmware_version = 38; const desired_display_firmware_version = 39;
const berry_driver_version = 4; const berry_driver_version = 4;
if (Debug) console.log('Check-Updates'); if (Debug) console.log('Check-Updates');
@@ -951,7 +974,7 @@ function update_berry_driver_version() {
} }
function update_tft_firmware() { function update_tft_firmware() {
const tft_version: string = 'v3.1.0'; const tft_version: string = 'v3.2.0';
const desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-${tft_version}.tft`; const desired_display_firmware_url = `http://nspanel.pky.eu/lovelace-ui/github/nspanel-${tft_version}.tft`;
request({ request({
@@ -2154,7 +2177,7 @@ function HandleButtonEvent(words): void {
setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true }); setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true });
setState(popupNotifyAction, <iobJS.State>{ val: true, ack: true }); setState(popupNotifyAction, <iobJS.State>{ val: true, ack: true });
} else if (words[4] == 'no') { } else if (words[4] == 'no') {
setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true }); setState(popupNotifyInternalName, <iobJS.State>{ val: words[2], ack: true });
setState(popupNotifyAction, <iobJS.State>{ val: false, ack: true }); setState(popupNotifyAction, <iobJS.State>{ val: false, ack: true });
} }
@@ -2290,7 +2313,17 @@ function HandleButtonEvent(words): void {
setIfExists(id + '.BLUE', rgb.blue); setIfExists(id + '.BLUE', rgb.blue);
break; break;
case 'rgbSingle': case 'rgbSingle':
setIfExists(id + '.RGB', ConvertRGBtoHex(rgb.red, rgb.green, rgb.blue)); let pageItem = findPageItem(id);
if (pageItem.colormode == "xy") {
//Für z.B. Deconz XY
setIfExists(id + ".RGB", rgb_to_cie(rgb.red, rgb.green, rgb.blue));
if (Debug) console.log(rgb_to_cie(rgb.red, rgb.green, rgb.blue));
}
else {
//Für RGB
setIfExists(id + ".RGB", ConvertRGBtoHex(rgb.red, rgb.green, rgb.blue));
}
break;
} }
break; break;
case 'tempUpd': case 'tempUpd':
@@ -2494,7 +2527,7 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ 'disable' + '~' // sliderBrightnessPos + 'disable' + '~' // sliderBrightnessPos
+ 'disable' + '~' // sliderColorTempPos + 'disable' + '~' // sliderColorTempPos
+ 'disable' + '~' // colorMode + 'disable' + '~' // colorMode
+ findLocale('lights', 'Color') + '~' // Color-Bezeichnung + '' + '~' // Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' // Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' // Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); // Brightness-Bezeichnung }); // Brightness-Bezeichnung
@@ -2537,13 +2570,13 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
out_msgs.push({ out_msgs.push({
payload: 'entityUpdateDetail' + '~' //entityUpdateDetail payload: 'entityUpdateDetail' + '~' //entityUpdateDetail
+ id + '~' + id + '~'
+ icon + '~' //iconId + icon + '~' //iconId
+ iconColor + '~' //iconColor + iconColor + '~' //iconColor
+ switchVal + '~' //buttonState + switchVal + '~' //buttonState
+ brightness + '~' //sliderBrightnessPos + brightness + '~' //sliderBrightnessPos
+ 'disable' + '~' //sliderColorTempPos + 'disable' + '~' //sliderColorTempPos
+ 'disable' + '~' //colorMod + 'disable' + '~' //colorMod
+ findLocale('lights', 'Color') + '~' //Color-Bezeichnung + '' + '~' //Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); //Brightness-Bezeichnung }); //Brightness-Bezeichnung
@@ -2612,7 +2645,7 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ brightness + '~' //sliderBrightnessPos + brightness + '~' //sliderBrightnessPos
+ colorTemp + '~' //sliderColorTempPos + colorTemp + '~' //sliderColorTempPos
+ colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable)
+ findLocale('lights', 'Color') + '~' //Color-Bezeichnung + 'Color' + '~' //Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); //Brightness-Bezeichnung }); //Brightness-Bezeichnung
@@ -2677,7 +2710,7 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ brightness + '~' //sliderBrightnessPos + brightness + '~' //sliderBrightnessPos
+ colorTemp + '~' //sliderColorTempPos + colorTemp + '~' //sliderColorTempPos
+ colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable)
+ findLocale('lights', 'Color') + '~' //Color-Bezeichnung + 'Color' + '~' //Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); //Brightness-Bezeichnung }); //Brightness-Bezeichnung
@@ -2746,7 +2779,7 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ brightness + '~' //sliderBrightnessPos + brightness + '~' //sliderBrightnessPos
+ colorTemp + '~' //sliderColorTempPos + colorTemp + '~' //sliderColorTempPos
+ colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable)
+ findLocale('lights', 'Color') + '~' //Color-Bezeichnung + 'Color' + '~' //Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); //Brightness-Bezeichnung }); //Brightness-Bezeichnung
@@ -2802,7 +2835,7 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ brightness + '~' //sliderBrightnessPos + brightness + '~' //sliderBrightnessPos
+ colorTemp + '~' //sliderColorTempPos + colorTemp + '~' //sliderColorTempPos
+ colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable) + colorMode + '~' //colorMode (if hue-alias without hue-datapoint, then disable)
+ findLocale('lights', 'Color') + '~' //Color-Bezeichnung + 'Color' + '~' //Color-Bezeichnung
+ findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung + findLocale('lights', 'Temperature') + '~' //Temperature-Bezeichnung
+ findLocale('lights', 'Brightness') + findLocale('lights', 'Brightness')
}); //Brightness-Bezeichnung }); //Brightness-Bezeichnung
@@ -3090,6 +3123,26 @@ function pos_to_color(x: number, y: number): RGB {
return <RGB>{ red: Math.round(rgb[0]), green: Math.round(rgb[1]), blue: Math.round(rgb[2]) }; return <RGB>{ red: Math.round(rgb[0]), green: Math.round(rgb[1]), blue: Math.round(rgb[2]) };
} }
function rgb_to_cie(red, green, blue)
{
//Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device
var vred = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
var vgreen = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
var vblue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
//RGB values to XYZ using the Wide RGB D65 conversion formula
var X = vred * 0.664511 + vgreen * 0.154324 + vblue * 0.162028;
var Y = vred * 0.283881 + vgreen * 0.668433 + vblue * 0.047685;
var Z = vred * 0.000088 + vgreen * 0.072310 + vblue * 0.986039;
//Calculate the xy values from the XYZ values
var ciex = (X / (X + Y + Z)).toFixed(4);
var ciey = (Y / (X + Y + Z)).toFixed(4);
var cie = "[" + ciex + "," + ciey + "]"
return cie;
}
type RGB = { type RGB = {
red: number, red: number,
green: number, green: number,
@@ -3157,6 +3210,7 @@ type PageItem = {
buttonText: (string | undefined), buttonText: (string | undefined),
unit: (string | undefined), unit: (string | undefined),
navigate: (boolean | undefined), navigate: (boolean | undefined),
colormode: (string | undefined)
} }
type DimMode = { type DimMode = {