Use localString for time, date and multilingualism

- Date/time in the screensaver based on localString (de-DE/en-EN/nl-NL/etc.)
- Multilingual - config.locale (en-EN, de-DE, nl-NL, da-DK, es-ES, fr-FR, it-IT, ru-RU)
This commit is contained in:
Armilar
2022-06-16 22:18:37 +02:00
committed by GitHub
parent 4e57b15206
commit c0521bac9e

View File

@@ -15,6 +15,8 @@ ReleaseNotes:
- 08.05.2022 - Schalter (Licht, Dimmer, Hue, etc) in cardGrid lassen sich wieder schalten - 08.05.2022 - Schalter (Licht, Dimmer, Hue, etc) in cardGrid lassen sich wieder schalten
- 14.06.2022 - Aktion auf Submenüs schaltet unmittelbar auf vorheriges Mainmenu (Many thanks to Grrzzz) - 14.06.2022 - Aktion auf Submenüs schaltet unmittelbar auf vorheriges Mainmenu (Many thanks to Grrzzz)
- 14.06.2022 - Menü-Pfeile in Subpages (z.B. card QR, cardMedia, etc) (Many thanks to Grrzzz) - 14.06.2022 - Menü-Pfeile in Subpages (z.B. card QR, cardMedia, etc) (Many thanks to Grrzzz)
- 15.06.2022 - Date/Time im Screensaver auf Basis localString (de-DE/en-EN/nl-NL/etc.)
- 16.06.2022 - Multilingual - config.locale (en-EN, de-DE, nl-NL, da-DK, es-ES, fr-FR, it-IT, ru-RU)
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:
@@ -68,10 +70,8 @@ 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:
Accu-Wheater: - Bei Nutzung der Wetterfunktionen (und zur Icon-Konvertierung) im Screensaver Accu-Wheater: - 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
@@ -79,7 +79,6 @@ Erforderliche Adapter:
Alias-Manager - !!! ausschießlich für MEDIA-Alias Alias-Manager - !!! ausschießlich für MEDIA-Alias
MQTT-Adapter - Für Kommunikation zwischen Skript und Tasmota MQTT-Adapter - Für Kommunikation zwischen Skript und Tasmota
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.0.0.tft TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v3.0.0.tft
@@ -91,8 +90,9 @@ const NSPanel_Path = "0_userdata.0.NSPanel.1."
const Debug = false; const Debug = false;
var manually_Update = true; var manually_Update = true;
const Months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]; //const Months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const Days = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; //const Days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
//const Off: RGB = { red: 68, green: 115, blue: 158 }; //Blau-Off //const Off: RGB = { red: 68, green: 115, blue: 158 }; //Blau-Off
const Off: RGB = { red: 253, green: 128, blue: 0 }; //Orange-Off - schönere Farbübergänge const Off: RGB = { red: 253, green: 128, blue: 0 }; //Orange-Off - schönere Farbübergänge
const On: RGB = { red: 253, green: 216, blue: 53 }; const On: RGB = { red: 253, green: 216, blue: 53 };
@@ -379,7 +379,7 @@ var Service: PageEntities =
"heading": "NSPanel Service", "heading": "NSPanel Service",
"useColor": true, "useColor": true,
"subPage": false, "subPage": false,
"parent": Service, "parent": Service,
"items": [ "items": [
<PageItem>{ id: "alias.0.NSPanel_1.NSPanel_AutoUpdate", name: "Auto-Updates" ,icon: "update", offColor: MSRed, onColor: MSGreen}, <PageItem>{ id: "alias.0.NSPanel_1.NSPanel_AutoUpdate", name: "Auto-Updates" ,icon: "update", offColor: MSRed, onColor: MSGreen},
<PageItem>{ navigate: true, id: "NSPanel_Infos", icon: "information-outline", onColor: White, name: "NSPanel Infos"}, <PageItem>{ navigate: true, id: "NSPanel_Infos", icon: "information-outline", onColor: White, name: "NSPanel Infos"},
@@ -445,9 +445,9 @@ export const config: Config = {
dimmode: 8, dimmode: 8,
active: 100, //Standard-Brightness TFT active: 100, //Standard-Brightness TFT
screenSaverDoubleClick: false, screenSaverDoubleClick: false,
locale: "de_DE", locale: "en-EN", //en-EN, de-DE, nl-NL, da-DK, es-ES, fr-FR, it-IT, ru-RU
timeFormat: "%H:%M", timeFormat: "%H:%M", //currently not used
dateFormat: "%A, %d. %B %Y", dateFormat: "%A, %d. %B %Y", //currently not used
weatherEntity: "alias.0.Wetter", weatherEntity: "alias.0.Wetter",
defaultOffColor: Off, defaultOffColor: Off,
defaultOnColor: On, defaultOnColor: On,
@@ -542,12 +542,26 @@ schedule("*/30 * * * *", function () {
}); });
//Mit Start auf Updates checken //Mit Start auf Updates checken
get_locales();
setState(config.panelSendTopic, 'pageType~pageStartup'); setState(config.panelSendTopic, 'pageType~pageStartup');
get_tasmota_status0() get_tasmota_status0();
get_panel_update_data(); get_panel_update_data();
check_updates(); check_updates();
//------------------Begin Update Functions //------------------Begin Update Functions
function get_locales() {
exec('curl https://raw.githubusercontent.com/joBr99/nspanel-lovelace-ui/main/ioBroker/ioBroker_NSPanel_locales.json', function (error, result, stderr){
if (result) {
let BerryDriverVersionOnline = result.substring((result.indexOf("version_of_this_script = ") + 24), result.indexOf("version_of_this_script = ") + 27).replace(/\s+/g, '');
createState(NSPanel_Path + "NSPanel_locales_json");
var timer = setTimeout(function() {
setIfExists(NSPanel_Path + 'NSPanel_locales_json', result);
}, 2000);
}
});
}
function check_updates() { function check_updates() {
const desired_display_firmware_version = 37; const desired_display_firmware_version = 37;
@@ -947,27 +961,32 @@ function HandleStartupProcess(): void {
} }
function SendDate(): void { function SendDate(): void {
var d = new Date(); var d = new Date();
var day = Days[d.getDay()];
var date = d.getDate();
var month = Months[d.getMonth()];
var year = d.getFullYear(); var year = d.getFullYear();
var _sendDate = "date~" + day + " " + date + " " + month + " " + year; var month = d.getMonth();
SendToPanel(<Payload>{ payload: _sendDate }); var day = d.getDate();
const date = new Date(year,month,day,1,1,1);
const options : any = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
var _SendDate = date.toLocaleDateString(config.locale, options);
SendToPanel(<Payload>{ payload: "date~" + _SendDate });
} }
function SendTime(): void { function SendTime(): void {
var d = new Date();
var hr = d.getHours().toString();
var min = d.getMinutes().toString();
if (d.getHours() < 10) { var d = new Date();
hr = "0" + d.getHours().toString(); var year = d.getFullYear();
} var month = d.getMonth();
if (d.getMinutes() < 10) { var day = d.getDate();
min = "0" + d.getMinutes().toString(); var hr = d.getHours();
} var min = d.getMinutes();
SendToPanel(<Payload>{ payload: "time~" + hr + ":" + min }); const date = new Date(year, month, day, hr, min, 1);
var _SendTime = date.toLocaleTimeString(config.locale, { hour: '2-digit', minute: '2-digit', hour12: false});
SendToPanel(<Payload>{ payload: "time~" + _SendTime });
} }
function ScreensaverDimmode() { function ScreensaverDimmode() {
@@ -1216,12 +1235,12 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
if (getState(pageItem.id + ".ACTUAL").val) { if (getState(pageItem.id + ".ACTUAL").val) {
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : o.common.role == "door" ? Icons.GetIcon("door-open") : Icons.GetIcon("window-open-variant"); iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : o.common.role == "door" ? Icons.GetIcon("door-open") : Icons.GetIcon("window-open-variant");
iconColor = GetIconColor(pageItem, false, useColors); iconColor = GetIconColor(pageItem, false, useColors);
var windowState = "opened" var windowState = findLocale("window","opened");
} else { } else {
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : o.common.role == "door" ? Icons.GetIcon("door-closed") : Icons.GetIcon("window-closed-variant"); iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : o.common.role == "door" ? Icons.GetIcon("door-closed") : Icons.GetIcon("window-closed-variant");
//iconId = Icons.GetIcon("window-closed-variant"); //iconId = Icons.GetIcon("window-closed-variant");
iconColor = GetIconColor(pageItem, true, useColors); iconColor = GetIconColor(pageItem, true, useColors);
var windowState = "closed" var windowState = findLocale("window","closed");
} }
RegisterEntityWatcher(pageItem.id + ".ACTUAL"); RegisterEntityWatcher(pageItem.id + ".ACTUAL");
} }
@@ -1282,11 +1301,11 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
if (getState(pageItem.id + ".ACTUAL").val) { if (getState(pageItem.id + ".ACTUAL").val) {
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon("lock"); iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon("lock");
iconColor = GetIconColor(pageItem, true, useColors); iconColor = GetIconColor(pageItem, true, useColors);
var lockState = "UNLOCK" var lockState = findLocale("lock","UNLOCK")
} else { } else {
iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon("lock-open-variant"); iconId = pageItem.icon !== undefined ? Icons.GetIcon(pageItem.icon) : Icons.GetIcon("lock-open-variant");
iconColor = GetIconColor(pageItem, false, useColors); iconColor = GetIconColor(pageItem, false, useColors);
var lockState = "LOCK" var lockState = findLocale("lock","LOCK")
} }
lockState = pageItem.buttonText !== undefined ? pageItem.buttonText : lockState; lockState = pageItem.buttonText !== undefined ? pageItem.buttonText : lockState;
RegisterEntityWatcher(pageItem.id + ".ACTUAL"); RegisterEntityWatcher(pageItem.id + ".ACTUAL");
@@ -1355,6 +1374,20 @@ function CreateEntity(pageItem: PageItem, placeId: number, useColors: boolean =
return "~delete~~~~~" return "~delete~~~~~"
} }
function findLocale(controlsObject: string, controlsState: string) : string {
var locale = config.locale;
var strJson = getState(NSPanel_Path + 'NSPanel_locales_json').val;
var obj = JSON.parse(strJson);
var strLocale = obj[controlsObject][controlsState][locale];
if (strLocale != undefined) {
return strLocale;
} else {
return controlsState;
}
}
function GetIconColor(pageItem: PageItem, value: (boolean | number), useColors: boolean): number { function GetIconColor(pageItem: PageItem, value: (boolean | number), useColors: boolean): number {
// dimmer // dimmer
if ((pageItem.useColor || useColors) && pageItem.interpolateColor && typeof (value) === "number") { if ((pageItem.useColor || useColors) && pageItem.interpolateColor && typeof (value) === "number") {
@@ -1621,25 +1654,45 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
out_msgs.push({ payload: "entityUpd~" out_msgs.push({ payload: "entityUpd~"
+ name + "~" //Heading + name + "~" //Heading
+ GetNavigationString(pageId) + "~" //Page Navigation + GetNavigationString(pageId) + "~" //Page Navigation
+ id + "~" //internalNameEntiy + id + "~" //internalNameEntiy
+ currentTemp + "°C" + "~" //Ist-Temperatur (String) + currentTemp + config.temperatureUnit + "~" //Ist-Temperatur (String)
+ destTemp + "~" //Soll-Temperatur (numerisch ohne Komma) + destTemp + "~" //Soll-Temperatur (numerisch ohne Komma)
+ statusStr + "~" //Mode + statusStr + "~" //Mode
+ minTemp + "~" //Thermostat Min-Temperatur + minTemp + "~" //Thermostat Min-Temperatur
+ maxTemp + "~" //Thermostat Max-Temperatur + maxTemp + "~" //Thermostat Max-Temperatur
+ stepTemp + "~" //Schritte für Soll (5°C) + stepTemp + "~" //Schritte für Soll (5°C)
+ icon_res //Icons Status + icon_res //Icons Status
+ "Aktuell" + "~" //Bezeicher vor Aktueller Raumtemperatur + findLocale("thermostat","Currently") + "~" //Bezeicher vor Aktueller Raumtemperatur
+ "Status" + "~" //Bezeicner vor + findLocale("thermostat","State") + "~" //Bezeicner vor
+ "HVAC" + "~" //Bezeichner vor HVAC + findLocale("thermostat","Action") + "~" //Bezeichner vor HVAC
+ "°C"}) //Bezeichner Hinter Solltemp + config.temperatureUnit + "~" //Bezeichner hinter Solltemp
+ "" + "~"
+ ""
});
} }
/*thermometer
entityUpd~
heading~
navigation~
internalNameEntiy
currentTempcdestTemp
status
minTemp
maxTemp
stepTemp
[[~*iconId*~*activeColor*~*state*~*hvac_action*]]
tCurTempLbl
tStateLbl
tALbl
iconTemperature
dstTempTwoTempMode
*/
//if (Debug)
if (Debug) console.log(out_msgs); console.log(out_msgs);
return out_msgs return out_msgs
} }
@@ -2276,9 +2329,9 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ "disable" + "~" //sliderBrightnessPos + "disable" + "~" //sliderBrightnessPos
+ "disable" + "~" //sliderColorTempPos + "disable" + "~" //sliderColorTempPos
+ "disable" + "~" //colorMode + "disable" + "~" //colorMode
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
//Dimmer //Dimmer
@@ -2323,9 +2376,9 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
+ brightness + "~" //sliderBrightnessPos + brightness + "~" //sliderBrightnessPos
+ "disable" + "~" //sliderColorTempPos + "disable" + "~" //sliderColorTempPos
+ "disable" + "~" //colorMod + "disable" + "~" //colorMod
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
@@ -2387,9 +2440,9 @@ 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)
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
//RGB-Licht //RGB-Licht
@@ -2449,9 +2502,9 @@ 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)
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
//RGB-Licht-einzeln (HEX) //RGB-Licht-einzeln (HEX)
@@ -2515,9 +2568,9 @@ 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)
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung) + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
//Farbtemperatur //Farbtemperatur
@@ -2562,16 +2615,16 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
console.warn("Alias-Datenpunkt: " + id + ".TEMPERATURE could not be read"); console.warn("Alias-Datenpunkt: " + id + ".TEMPERATURE could not be read");
} }
out_msgs.push({ payload: "entityUpdateDetail" + "~" //entityUpdateDetail out_msgs.push({ payload: "entityUpdateDetail" + "~" //entityUpdateDetail
+ icon + "~" //iconId + icon + "~" //iconId
+ iconColor + "~" //iconColor + iconColor + "~" //iconColor
+ switchVal + "~" //buttonState + switchVal + "~" //buttonState
+ 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)
+ "Color" + "~" //Color-Bezeichnung + findLocale("lights","Color") + "~" //Color-Bezeichnung
+ "Temperature" + "~" //Temperature-Bezeichnung + findLocale("lights","Temperature") + "~" //Temperature-Bezeichnung
+ "Brightness" }) //Brightness-Bezeichnung + findLocale("lights","Brightness")}); //Brightness-Bezeichnung
} }
} }
@@ -2585,10 +2638,10 @@ function GenerateDetailPage(type: string, pageItem: PageItem): Payload[] {
val = getState(id + ".SET").val; val = getState(id + ".SET").val;
RegisterDetailEntityWatcher(id + ".SET", pageItem, type); RegisterDetailEntityWatcher(id + ".SET", pageItem, type);
} }
out_msgs.push({ payload: "entityUpdateDetail" + "~" //entityUpdateDetail out_msgs.push({ payload: "entityUpdateDetail" + "~" //entityUpdateDetail
+ val + "~" //Shutterposition + val + "~" //Shutterposition
+ "" + "~" + "" + "~"
+ "Position"}) //Position-Bezeichnung + findLocale("blinds","Position")}); //Position-Bezeichnung
} }
} }
return out_msgs return out_msgs
@@ -2630,7 +2683,7 @@ function HandleScreensaverUpdate(): void {
let TempMax = getState("accuweather.0.Summary.TempMax_d" + i).val; let TempMax = getState("accuweather.0.Summary.TempMax_d" + i).val;
let DayOfWeek = getState("accuweather.0.Summary.DayOfWeek_d" + i).val; let DayOfWeek = getState("accuweather.0.Summary.DayOfWeek_d" + i).val;
let WeatherIcon = GetAccuWeatherIcon(getState("accuweather.0.Summary.WeatherIcon_d" + i).val); let WeatherIcon = GetAccuWeatherIcon(getState("accuweather.0.Summary.WeatherIcon_d" + i).val);
payloadString += DayOfWeek + "~" + Icons.GetIcon(WeatherIcon) + "~" + TempMax + " °C~"; payloadString += DayOfWeek + "~" + Icons.GetIcon(WeatherIcon) + "~" + TempMax + " " + config.temperatureUnit + "~";
} }
} }
else { else {