mirror of
https://github.com/joBr99/nspanel-lovelace-ui.git
synced 2025-12-21 23:14:25 +01:00
Update NsPanelTs.ts
This commit is contained in:
@@ -1,21 +1,14 @@
|
|||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
TypeScript zur Steuerung des SONOFF NSPanel mit dem ioBroker
|
TypeScript zur Steuerung des SONOFF NSPanel mit dem ioBroker
|
||||||
- abgestimmt auf TFT 34 / v2.8.1 (LATEST) / BerryDriver 4 / Tasmota 11.1.0
|
- abgestimmt auf TFT 36 / v2.9.0 / BerryDriver 4 / Tasmota 11.1.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
|
||||||
|
|
||||||
ReleaseNotes:
|
ReleaseNotes:
|
||||||
Bugfixes und Erweiterungen seit letzter Verion:
|
Bugfixes und Erweiterungen seit letzter Verion:
|
||||||
- Automatischer Dimmode versetzt NSPanel im Normalbetrieb in Dimmodus ohne Screensaver
|
- cardQR (für Gäste WLAN)
|
||||||
- Auto-Update in definiertem Zustand
|
- cardThermo (Neues Design für Alias Thermostat und zusätzlich für Alias Klimaanlage)
|
||||||
- manuelle Updates aktiv
|
|
||||||
- cardAlarm aktiv
|
|
||||||
- popupNotify aktiv
|
|
||||||
|
|
||||||
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:
|
||||||
@@ -57,6 +50,7 @@ Mögliche Aliase: (Vorzugsweise mit ioBroker-Adapter "Geräte verwalten" konfigu
|
|||||||
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.
|
||||||
|
Klimaanlage - Buttons zur Steuerung der Klimaanlage im unteren Bereich
|
||||||
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)
|
||||||
@@ -75,10 +69,14 @@ Tasmota-Status0 - (zyklische Ausführung)
|
|||||||
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
|
||||||
|
Geräte verwalten - Für Erstellung der Aliase
|
||||||
|
Alias-Manager - !!! ausschießlich für MEDIA-Alias
|
||||||
|
MQTT-Adapter - Für Kommunikation zwischen Skript und Tasmota
|
||||||
|
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-v2.8.1.tft
|
TFT EU STABLE Version : FlashNextion http://nspanel.pky.eu/lovelace-ui/github/nspanel-v2.9.0.tft
|
||||||
---------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
var Icons = new IconsSelector();
|
var Icons = new IconsSelector();
|
||||||
@@ -142,8 +140,8 @@ var alexaDevice = "G0XXXXXXXXXXXXXX"; //Primär zu steuerndes Device oder Gruppe
|
|||||||
|
|
||||||
// Wenn alexaSpeakerList definiert, dann werden Einträge verwendet, sonst alle relevanten Devices aus Alexa-Instanz
|
// Wenn alexaSpeakerList definiert, dann werden Einträge verwendet, sonst alle relevanten Devices aus Alexa-Instanz
|
||||||
// Speakerwechsel funktioniert nicht bei Radio/TuneIn sonden bei Playlists
|
// Speakerwechsel funktioniert nicht bei Radio/TuneIn sonden bei Playlists
|
||||||
//const alexaSpeakerList = []; //Beispiel ["Echo Spot Buero","Überall","Gartenhaus","Esszimmer","Heimkino"];
|
const alexaSpeakerList = []; //Beispiel ["Echo Spot Buero","Überall","Gartenhaus","Esszimmer","Heimkino"];
|
||||||
const alexaSpeakerList = ["Echo Spot Buero","Überall","Gartenhaus","Esszimmer","Heimkino","Echo Dot Küche"];
|
//const alexaSpeakerList = ["Echo Spot Buero","Überall","Gartenhaus","Esszimmer","Heimkino","Echo Dot Küche"];
|
||||||
|
|
||||||
//Datenpunkte für Nachricht an Screensaver
|
//Datenpunkte für Nachricht an Screensaver
|
||||||
var screensaverNotifyHeading = NSPanel_Path + "ScreensaverInfo.popupNotifyHeading";
|
var screensaverNotifyHeading = NSPanel_Path + "ScreensaverInfo.popupNotifyHeading";
|
||||||
@@ -292,10 +290,28 @@ var Alexa: PageMedia =
|
|||||||
var Buero_Themostat: PageThermo =
|
var Buero_Themostat: PageThermo =
|
||||||
{
|
{
|
||||||
"type": "cardThermo",
|
"type": "cardThermo",
|
||||||
"heading": "Thermostat",
|
"heading": "Test Thermostat",
|
||||||
"useColor": true,
|
"useColor": true,
|
||||||
"subPage": false,
|
"subPage": false,
|
||||||
"items": [<PageItem>{ id: "alias.0.NSPanel_1.Thermostat_Büro" }]
|
"items": [<PageItem>{ id: "alias.0.NSPanel_1.Thermostat_Büro", minValue: 50, maxValue: 300 }]
|
||||||
|
};
|
||||||
|
|
||||||
|
var Buero_Klimaanlage: PageThermo =
|
||||||
|
{
|
||||||
|
"type": "cardThermo",
|
||||||
|
"heading": "Test Klimaanlage",
|
||||||
|
"useColor": true,
|
||||||
|
"subPage": false,
|
||||||
|
"items": [<PageItem>{ id: "alias.0.NSPanel_1.TestKlimaanlage", minValue: 170, maxValue: 250}]
|
||||||
|
};
|
||||||
|
|
||||||
|
var WLAN: PageQR =
|
||||||
|
{
|
||||||
|
"type": "cardQR",
|
||||||
|
"heading": "Gäste WLAN",
|
||||||
|
"useColor": true,
|
||||||
|
"subPage": false,
|
||||||
|
"items": [<PageItem>{ id: "alias.0.NSPanel_1.Guest_Wifi" }]
|
||||||
};
|
};
|
||||||
|
|
||||||
var Buero_Alarm: PageAlarm =
|
var Buero_Alarm: PageAlarm =
|
||||||
@@ -413,6 +429,8 @@ export const config: Config = {
|
|||||||
temperatureUnit: "°C",
|
temperatureUnit: "°C",
|
||||||
pages: [
|
pages: [
|
||||||
Buero_Seite_1,
|
Buero_Seite_1,
|
||||||
|
Buero_Klimaanlage,
|
||||||
|
WLAN,
|
||||||
Button_1,
|
Button_1,
|
||||||
Test_Licht,
|
Test_Licht,
|
||||||
Test_Funktionen,
|
Test_Funktionen,
|
||||||
@@ -431,7 +449,7 @@ export const config: Config = {
|
|||||||
|
|
||||||
//Notification an Screensaver
|
//Notification an Screensaver
|
||||||
on({id: [screensaverNotifyHeading, screensaverNotifyText], change: "ne"}, async function (obj) {
|
on({id: [screensaverNotifyHeading, screensaverNotifyText], change: "ne"}, async function (obj) {
|
||||||
setState(config.panelSendTopic,(['notify~',getState(popupNotifyHeading).val,'~',getState(popupNotifyText).val].join('')));
|
setState(config.panelSendTopic,(['notify~',getState(screensaverNotifyHeading).val,'~',getState(screensaverNotifyText).val].join('')));
|
||||||
});
|
});
|
||||||
|
|
||||||
//popupNotify - Notification an separate Seite
|
//popupNotify - Notification an separate Seite
|
||||||
@@ -443,7 +461,7 @@ on({id: [popupNotifyInternalName, popupNotifyHeading, popupNotifyText, popupNoti
|
|||||||
+ getState(popupNotifyButton1Text).val + "~"
|
+ getState(popupNotifyButton1Text).val + "~"
|
||||||
+ "63488" + "~" //Farbe Button1 - rot
|
+ "63488" + "~" //Farbe Button1 - rot
|
||||||
+ getState(popupNotifyButton2Text).val + "~"
|
+ getState(popupNotifyButton2Text).val + "~"
|
||||||
+ "2016" + "~" //Farbe Button2 - grün
|
+ "2016" + "~" //Farbe Button2 - grün
|
||||||
+ getState(popupNotifyText).val + "~"
|
+ getState(popupNotifyText).val + "~"
|
||||||
+ "65535" + "~" //Farbe Text - weiß
|
+ "65535" + "~" //Farbe Text - weiß
|
||||||
+ getState(popupNotifySleepTimeout).val;
|
+ getState(popupNotifySleepTimeout).val;
|
||||||
@@ -499,7 +517,7 @@ check_updates();
|
|||||||
//------------------Begin Update Functions
|
//------------------Begin Update Functions
|
||||||
function check_updates() {
|
function check_updates() {
|
||||||
|
|
||||||
const desired_display_firmware_version = 34;
|
const desired_display_firmware_version = 36;
|
||||||
const berry_driver_version = 4;
|
const berry_driver_version = 4;
|
||||||
|
|
||||||
if (Debug) console.log("Check-Updates");
|
if (Debug) console.log("Check-Updates");
|
||||||
@@ -733,7 +751,7 @@ function update_berry_driver_version() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function update_tft_firmware() {
|
function update_tft_firmware() {
|
||||||
const tft_version : string = "v2.8.1";
|
const tft_version : string = "v2.9.0";
|
||||||
var desired_display_firmware_url = "http://nspanel.pky.eu/lovelace-ui/github/nspanel-" + tft_version + ".tft"
|
var desired_display_firmware_url = "http://nspanel.pky.eu/lovelace-ui/github/nspanel-" + tft_version + ".tft"
|
||||||
require("request")((['http://',get_current_tasmota_ip_address(),'/cm?cmnd=FlashNextion ', desired_display_firmware_url].join('')), async function (error, response, result) {
|
require("request")((['http://',get_current_tasmota_ip_address(),'/cm?cmnd=FlashNextion ', desired_display_firmware_url].join('')), async function (error, response, result) {
|
||||||
createState(NSPanel_Path + "TFT_Firmware.onlineVersion");
|
createState(NSPanel_Path + "TFT_Firmware.onlineVersion");
|
||||||
@@ -849,11 +867,14 @@ function GeneratePage(page: Page): void {
|
|||||||
case "cardAlarm":
|
case "cardAlarm":
|
||||||
SendToPanel(GenerateAlarmPage(<PageAlarm>page));
|
SendToPanel(GenerateAlarmPage(<PageAlarm>page));
|
||||||
break;
|
break;
|
||||||
|
case "cardQR":
|
||||||
|
SendToPanel(GenerateQRPage(<PageQR>page));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function HandleHardwareButton(method: string): void {
|
function HandleHardwareButton(method: string): void {
|
||||||
let page: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid);
|
let page: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid | PageQR);
|
||||||
if (config.button1Page !== null && method == "button1") {
|
if (config.button1Page !== null && method == "button1") {
|
||||||
page = config.button1Page;
|
page = config.button1Page;
|
||||||
pageId = -1;
|
pageId = -1;
|
||||||
@@ -937,6 +958,9 @@ function GeneratePageElements(page: Page): string {
|
|||||||
case "cardMedia":
|
case "cardMedia":
|
||||||
maxItems = 1;
|
maxItems = 1;
|
||||||
break;
|
break;
|
||||||
|
case "cardQR":
|
||||||
|
maxItems = 1;
|
||||||
|
break;
|
||||||
case "cardEntities":
|
case "cardEntities":
|
||||||
maxItems = 4;
|
maxItems = 4;
|
||||||
break;
|
break;
|
||||||
@@ -961,7 +985,6 @@ function GeneratePageElements(page: Page): string {
|
|||||||
else {
|
else {
|
||||||
pageData += CreateEntity(<PageItem>{ id: "delete" }, index + 1);
|
pageData += CreateEntity(<PageItem>{ id: "delete" }, index + 1);
|
||||||
//muss das wirklich? Wo erforderlich wird es mitgegeben!
|
//muss das wirklich? Wo erforderlich wird es mitgegeben!
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
@@ -1362,163 +1385,225 @@ function GenerateThermoPage(page: PageThermo): Payload[] {
|
|||||||
// ioBroker
|
// ioBroker
|
||||||
if (existsObject(id)) {
|
if (existsObject(id)) {
|
||||||
let o = getObject(id)
|
let o = getObject(id)
|
||||||
let name = page.items[0].name !== undefined ? page.items[0].name : o.common.name.de
|
let name = page.heading !== undefined ? page.heading : o.common.name.de
|
||||||
let currentTemp = 0;
|
let currentTemp = 0;
|
||||||
if (existsState(id + ".ACTUAL"))
|
if (existsState(id + ".ACTUAL"))
|
||||||
currentTemp = (Math.round(parseFloat(getState(id + ".ACTUAL").val) * 10)/10)*10;
|
currentTemp = (Math.round(parseFloat(getState(id + ".ACTUAL").val) * 10)/10);
|
||||||
|
|
||||||
let destTemp = 0;
|
let destTemp = 0;
|
||||||
if (existsState(id + ".SET")) {
|
if (existsState(id + ".SET")) {
|
||||||
destTemp = getState(id + ".SET").val.toFixed(2) * 10;
|
destTemp = getState(id + ".SET").val.toFixed(2) * 10;
|
||||||
}
|
}
|
||||||
|
let statusStr : String = "MANU"
|
||||||
let status = ""
|
let status = ""
|
||||||
if (existsState(id + ".MODE"))
|
if (existsState(id + ".MODE"))
|
||||||
status = getState(id + ".MODE").val;
|
status = getState(id + ".MODE").val;
|
||||||
let minTemp = 50 //Min Temp 5°C
|
|
||||||
let maxTemp = 300 //Max Temp 30°C
|
let minTemp = page.items[0].minValue !== undefined ? page.items[0].minValue : 50; //Min Temp 5°C
|
||||||
|
let maxTemp = page.items[0].maxValue !== undefined ? page.items[0].maxValue : 300; //Max Temp 30°C
|
||||||
let stepTemp = 5
|
let stepTemp = 5
|
||||||
|
|
||||||
//Attribute hinzufügen, wenn im Alias definiert
|
//Attribute hinzufügen, wenn im Alias definiert
|
||||||
var thermButton = 0;
|
|
||||||
let i_list = Array.prototype.slice.apply($('[state.id="' + id + '.*"]'));
|
let i_list = Array.prototype.slice.apply($('[state.id="' + id + '.*"]'));
|
||||||
if ((i_list.length - 3) != 0) {
|
if ((i_list.length - 3) != 0) {
|
||||||
if (Debug) console.log(i_list.length -3);
|
|
||||||
if ((i_list.length -3)%2 == 0) {
|
|
||||||
if ((i_list.length - 3) == 2) {
|
|
||||||
thermButton = 6;
|
|
||||||
} else {
|
|
||||||
thermButton = 5;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((i_list.length - 3) == 1) {
|
|
||||||
thermButton = 2;
|
|
||||||
} else if ((i_list.length - 3) == 3) {
|
|
||||||
thermButton = 1;
|
|
||||||
} else {
|
|
||||||
thermButton = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
var bt = ["","","","","","","","",""];
|
var bt = ["~~~~","~~~~","~~~~","~~~~","~~~~","~~~~","~~~~","~~~~","~~~~"];
|
||||||
for (i = 0; i < thermButton; i++) {
|
|
||||||
bt[i] = "~~~~";
|
|
||||||
}
|
|
||||||
for (let i_index in i_list) {
|
|
||||||
let thermostatState = i_list[i_index].split('.');
|
|
||||||
if (thermostatState[thermostatState.length-1] != "SET" &&
|
|
||||||
thermostatState[thermostatState.length-1] != "ACTUAL" &&
|
|
||||||
thermostatState[thermostatState.length-1] != "MODE") {
|
|
||||||
i++;
|
|
||||||
|
|
||||||
switch (thermostatState[thermostatState.length-1]) {
|
if (o.common.role == "thermostat") {
|
||||||
case "HUMIDITY":
|
for (let i_index in i_list) {
|
||||||
if (existsState(id + ".HUMIDITY") && getState(id + ".HUMIDITY").val != null) {
|
let thermostatState = i_list[i_index].split('.');
|
||||||
if (parseInt(getState(id + ".HUMIDITY").val) < 40) {
|
if (thermostatState[thermostatState.length-1] != "SET" &&
|
||||||
bt[i-1] = Icons.GetIcon("water-percent") + "~65504~1~" + "HUMIDITY" + "~";
|
thermostatState[thermostatState.length-1] != "ACTUAL" &&
|
||||||
} else if (parseInt(getState(id + ".HUMIDITY").val) < 30) {
|
thermostatState[thermostatState.length-1] != "MODE") {
|
||||||
bt[i-1] = Icons.GetIcon("water-percent") + "~63488~1~" + "HUMIDITY" + "~";
|
i++;
|
||||||
} else if (parseInt(getState(id + ".HUMIDITY").val) > 65) {
|
|
||||||
bt[i-1] = Icons.GetIcon("water-percent") + "~65504~1~" + "HUMIDITY" + "~";
|
switch (thermostatState[thermostatState.length-1]) {
|
||||||
} else if (parseInt(getState(id + ".HUMIDITY").val) > 75) {
|
case "HUMIDITY":
|
||||||
bt[i-1] = Icons.GetIcon("water-percent") + "~63488~1~" + "HUMIDITY" + "~";
|
if (existsState(id + ".HUMIDITY") && getState(id + ".HUMIDITY").val != null) {
|
||||||
}
|
if (parseInt(getState(id + ".HUMIDITY").val) < 40) {
|
||||||
} else i--;
|
bt[i-1] = Icons.GetIcon("water-percent") + "~65504~1~" + "HUMIDITY" + "~";
|
||||||
break;
|
} else if (parseInt(getState(id + ".HUMIDITY").val) < 30) {
|
||||||
case "LOWBAT":
|
bt[i-1] = Icons.GetIcon("water-percent") + "~63488~1~" + "HUMIDITY" + "~";
|
||||||
if (existsState(id + ".LOWBAT") && getState(id + ".LOWBAT").val != null) {
|
} else if (parseInt(getState(id + ".HUMIDITY").val) >= 40) {
|
||||||
if (getState(id + ".LOWBAT").val) {
|
bt[i-1] = Icons.GetIcon("water-percent") + "~2016~1~" + "HUMIDITY" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("battery-low") + "~63488~1~" + "LOWBAT" + "~";
|
} else if (parseInt(getState(id + ".HUMIDITY").val) > 65) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("water-percent") + "~65504~1~" + "HUMIDITY" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("battery-high") + "~2016~1~" + "LOWBAT" + "~";
|
} else if (parseInt(getState(id + ".HUMIDITY").val) > 75) {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("water-percent") + "~63488~1~" + "HUMIDITY" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "MAINTAIN":
|
break;
|
||||||
if (existsState(id + ".MAINTAIN") && getState(id + ".MAINTAIN").val != null) {
|
case "LOWBAT":
|
||||||
if (getState(id + ".MAINTAIN").val >> .1) {
|
if (existsState(id + ".LOWBAT") && getState(id + ".LOWBAT").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("fire") + "~60897~1~" + "MAINTAIN" + "~";
|
if (getState(id + ".LOWBAT").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("battery-low") + "~63488~1~" + "LOWBAT" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("fire") + "~33840~0~" + "MAINTAIN" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("battery-high") + "~2016~1~" + "LOWBAT" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "UNREACH":
|
break;
|
||||||
if (existsState(id + ".UNREACH") && getState(id + ".UNREACH").val != null) {
|
case "MAINTAIN":
|
||||||
if (getState(id + ".UNREACH").val) {
|
if (existsState(id + ".MAINTAIN") && getState(id + ".MAINTAIN").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("wifi-off") + "~63488~1~" + "UNREACH" + "~";
|
if (getState(id + ".MAINTAIN").val >> .1) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("fire") + "~60897~1~" + "MAINTAIN" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("wifi") + "~2016~1~" + "UNREACH" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("fire") + "~33840~0~" + "MAINTAIN" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "POWER":
|
break;
|
||||||
if (existsState(id + ".POWER") && getState(id + ".POWER").val != null) {
|
case "UNREACH":
|
||||||
if (getState(id + ".POWER").val) {
|
if (existsState(id + ".UNREACH") && getState(id + ".UNREACH").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("power-standby") + "~2016~1~" + "POWER" + "~";
|
if (getState(id + ".UNREACH").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("wifi-off") + "~63488~1~" + "UNREACH" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("power-standby") + "~33840~1~" + "POWER" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("wifi") + "~2016~1~" + "UNREACH" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "ERROR":
|
break;
|
||||||
if (existsState(id + ".ERROR") && getState(id + ".ERROR").val != null) {
|
case "POWER":
|
||||||
if (getState(id + ".ERROR").val) {
|
if (existsState(id + ".POWER") && getState(id + ".POWER").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("alert-circle") + "~63488~1~" + "ERROR" + "~";
|
if (getState(id + ".POWER").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("power-standby") + "~2016~1~" + "POWER" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("alert-circle") + "~33840~1~" + "ERROR" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("power-standby") + "~33840~1~" + "POWER" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "WORKING":
|
break;
|
||||||
if (existsState(id + ".WORKING") && getState(id + ".WORKING").val != null) {
|
case "ERROR":
|
||||||
if (getState(id + ".WORKING").val) {
|
if (existsState(id + ".ERROR") && getState(id + ".ERROR").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("briefcase-check") + "~2016~1~" + "WORKING" + "~";
|
if (getState(id + ".ERROR").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("alert-circle") + "~63488~1~" + "ERROR" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("briefcase-check") + "~33840~1~" + "WORKING" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("alert-circle") + "~33840~1~" + "ERROR" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "BOOST":
|
break;
|
||||||
if (existsState(id + ".BOOST") && getState(id + ".BOOST").val != null) {
|
case "WORKING":
|
||||||
if (getState(id + ".BOOST").val) {
|
if (existsState(id + ".WORKING") && getState(id + ".WORKING").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("fast-forward-60") + "~2016~1~" + "BOOST" + "~";
|
if (getState(id + ".WORKING").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("briefcase-check") + "~2016~1~" + "WORKING" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("fast-forward-60") + "~33840~1~" + "BOOST" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("briefcase-check") + "~33840~1~" + "WORKING" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
case "PARTY":
|
break;
|
||||||
if (existsState(id + ".PARTY") && getState(id + ".PARTY").val != null) {
|
case "BOOST":
|
||||||
if (getState(id + ".PARTY").val) {
|
if (existsState(id + ".BOOST") && getState(id + ".BOOST").val != null) {
|
||||||
bt[i-1] = Icons.GetIcon("party-popper") + "~2016~1~" + "PARTY" + "~";
|
if (getState(id + ".BOOST").val) {
|
||||||
} else {
|
bt[i-1] = Icons.GetIcon("fast-forward-60") + "~2016~1~" + "BOOST" + "~";
|
||||||
bt[i-1] = Icons.GetIcon("party-popper") + "~33840~1~" + "PARTY" + "~";
|
} else {
|
||||||
}
|
bt[i-1] = Icons.GetIcon("fast-forward-60") + "~33840~1~" + "BOOST" + "~";
|
||||||
} else i--;
|
}
|
||||||
break;
|
} else i--;
|
||||||
default:
|
break;
|
||||||
i--;
|
case "PARTY":
|
||||||
break;
|
if (existsState(id + ".PARTY") && getState(id + ".PARTY").val != null) {
|
||||||
|
if (getState(id + ".PARTY").val) {
|
||||||
|
bt[i-1] = Icons.GetIcon("party-popper") + "~2016~1~" + "PARTY" + "~";
|
||||||
|
} else {
|
||||||
|
bt[i-1] = Icons.GetIcon("party-popper") + "~33840~1~" + "PARTY" + "~";
|
||||||
|
}
|
||||||
|
} else i--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
i--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let j = i; j < 9; j++) {
|
||||||
|
bt[j] = "~~~~";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o.common.role == "airCondition") {
|
||||||
|
if (existsState(id + ".MODE") && getState(id + ".MODE").val != null) {
|
||||||
|
let Mode = getState(id + ".MODE").val
|
||||||
|
if (existsState(id + ".POWER") && getState(id + ".POWER").val != null) {
|
||||||
|
if (Mode != 0 || getState(id + ".POWER").val) { //0=ON oder .POWER = true
|
||||||
|
bt[0] = Icons.GetIcon("power-standby") + "~2016~1~" + "POWER" + "~";
|
||||||
|
statusStr = "ON";
|
||||||
|
} else {
|
||||||
|
bt[0] = Icons.GetIcon("power-standby") + "~35921~0~" + "POWER" + "~";
|
||||||
|
statusStr = "OFF";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Mode == 1) { //1=AUTO
|
||||||
|
bt[1] = Icons.GetIcon("air-conditioner") + "~1024~1~" + "AUTO" + "~";
|
||||||
|
statusStr = "AUTO";
|
||||||
|
} else {
|
||||||
|
bt[1] = Icons.GetIcon("air-conditioner") + "~35921~0~" + "AUTO" + "~";
|
||||||
|
}
|
||||||
|
if (Mode == 2) { //2=COOL
|
||||||
|
bt[2] = Icons.GetIcon("snowflake") + "~11487~1~" + "COOL" + "~";
|
||||||
|
statusStr = "COOL";
|
||||||
|
} else {
|
||||||
|
bt[2] = Icons.GetIcon("snowflake") + "~35921~0~" + "COOL" + "~";
|
||||||
|
}
|
||||||
|
if (Mode == 3) { //3=HEAT
|
||||||
|
bt[3] = Icons.GetIcon("fire") + "~64512~1~" + "HEAT" + "~";
|
||||||
|
statusStr = "HEAT";
|
||||||
|
} else {
|
||||||
|
bt[3] = Icons.GetIcon("fire") + "~35921~0~" + "HEAT" + "~";
|
||||||
|
}
|
||||||
|
if (Mode == 4) { //4=ECO
|
||||||
|
bt[4] = Icons.GetIcon("alpha-e-circle-outline") + "~2016~1~" + "ECO" + "~";
|
||||||
|
statusStr = "ECO";
|
||||||
|
} else {
|
||||||
|
bt[4] = Icons.GetIcon("alpha-e-circle-outline") + "~35921~0~" + "ECO" + "~";
|
||||||
|
}
|
||||||
|
if (Mode == 5) { //5=FANONLY
|
||||||
|
bt[5] = Icons.GetIcon("fan") + "~11487~1~" + "FAN" + "~";
|
||||||
|
statusStr = "FAN ONLY";
|
||||||
|
} else {
|
||||||
|
bt[5] = Icons.GetIcon("fan") + "~35921~0~" + "FAN" + "~";
|
||||||
|
}
|
||||||
|
if (Mode == 6) { //6=DRY
|
||||||
|
bt[6] = Icons.GetIcon("water-percent") + "~60897~1~" + "DRY" + "~";
|
||||||
|
statusStr = "DRY";
|
||||||
|
} else {
|
||||||
|
bt[6] = Icons.GetIcon("water-percent") + "~35921~0~" + "DRY" + "~";
|
||||||
|
}
|
||||||
|
if (existsState(id + ".SWING") && getState(id + ".SWING").val != null) {
|
||||||
|
if (getState(id + ".POWER").val && getState(id + ".SWING").val == 1) { //0=ON oder .SWING = true
|
||||||
|
bt[7] = Icons.GetIcon("swap-vertical-bold") + "~2016~1~" + "SWING" + "~";
|
||||||
|
} else {
|
||||||
|
bt[7] = Icons.GetIcon("swap-vertical-bold") + "~35921~0~" + "SWING" + "~";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let j = i; j < 9; j++) {
|
|
||||||
bt[j] = "~~~~";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let icon_res = bt[0] + bt[1] + bt[2] + bt[3] + bt[4] + bt[5] + bt[6] + bt[7] + bt[8];
|
let icon_res = bt[0] + bt[1] + bt[2] + bt[3] + bt[4] + bt[5] + bt[6] + bt[7];
|
||||||
|
|
||||||
|
|
||||||
out_msgs.push({ payload: "entityUpd~" + name + "~" + GetNavigationString(pageId) + "~" + id + "~" + currentTemp + "~" + destTemp + "~" + status + "~" + minTemp + "~" + maxTemp + "~" + stepTemp + "~" +icon_res})
|
|
||||||
|
out_msgs.push({ payload: "entityUpd~"
|
||||||
|
+ name + "~" //Heading
|
||||||
|
+ GetNavigationString(pageId) + "~" //Page Navigation
|
||||||
|
+ id + "~" //internalNameEntiy
|
||||||
|
+ currentTemp + "°C" + "~" //Ist-Temperatur (String)
|
||||||
|
+ destTemp + "~" //Soll-Temperatur (numerisch ohne Komma)
|
||||||
|
+ statusStr + "~" //Mode
|
||||||
|
+ minTemp + "~" //Thermostat Min-Temperatur
|
||||||
|
+ maxTemp + "~" //Thermostat Max-Temperatur
|
||||||
|
+ stepTemp + "~" //Schritte für Soll (5°C)
|
||||||
|
+ icon_res //Icons Status
|
||||||
|
+ "Aktuell" + "~" //Bezeicher vor Aktueller Raumtemperatur
|
||||||
|
+ "Status" + "~" //Bezeicner vor
|
||||||
|
+ "HVAC" + "~" //Bezeichner vor HVAC
|
||||||
|
+ "°C"}) //Bezeichner Hinter Solltemp
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Debug) console.log(out_msgs);
|
if (Debug) console.log(out_msgs);
|
||||||
return out_msgs
|
return out_msgs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function GenerateMediaPage(page: PageMedia): Payload[] {
|
function GenerateMediaPage(page: PageMedia): Payload[] {
|
||||||
var id = page.items[0].id
|
var id = page.items[0].id
|
||||||
var out_msgs: Array<Payload> = [];
|
var out_msgs: Array<Payload> = [];
|
||||||
@@ -1604,7 +1689,7 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] {
|
|||||||
var numpadStatus = "disable";
|
var numpadStatus = "disable";
|
||||||
var flashing = "disable";
|
var flashing = "disable";
|
||||||
|
|
||||||
console.log(id);
|
if (Debug) console.log(id);
|
||||||
|
|
||||||
if (entityState == "armed" || entityState == "triggered") {
|
if (entityState == "armed" || entityState == "triggered") {
|
||||||
arm1 = "Deaktivieren"; //arm1*~*
|
arm1 = "Deaktivieren"; //arm1*~*
|
||||||
@@ -1673,6 +1758,57 @@ function GenerateAlarmPage(page: PageAlarm): Payload[] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function GenerateQRPage(page: PageQR): Payload[] {
|
||||||
|
var id = page.items[0].id
|
||||||
|
var out_msgs: Array<Payload> = [];
|
||||||
|
out_msgs.push({ payload: "pageType~cardQR" });
|
||||||
|
|
||||||
|
let o = getObject(id)
|
||||||
|
|
||||||
|
var heading = page.heading !== undefined ? page.heading : o.common.name.de
|
||||||
|
let minTemp = page.items[0].minValue !== undefined ? page.items[0].minValue : 50;
|
||||||
|
var textQR = page.items[0].id + ".ACTUAL" !== undefined ? getState(page.items[0].id + ".ACTUAL").val : "WIFI:T:undefined;S:undefined;P:undefined;H:undefined;"
|
||||||
|
|
||||||
|
const tempstr = textQR.split(";");
|
||||||
|
for (let w = 0; w < tempstr.length - 1; w++) {
|
||||||
|
if (tempstr[w].substring(0,1) == "S") {
|
||||||
|
var optionalValue1 = tempstr[w].slice(2);
|
||||||
|
}
|
||||||
|
if (tempstr[w].substring(0,1) == "P") {
|
||||||
|
var optionalValue2 = tempstr[w].slice(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var type1 = "text"
|
||||||
|
var internalName1 = "SSID"
|
||||||
|
var iconId1 = Icons.GetIcon("wifi");
|
||||||
|
var displayName1 = "SSID"
|
||||||
|
var type2 = "text"
|
||||||
|
var internalName2 = "Passwort"
|
||||||
|
var iconId2 = Icons.GetIcon("key");
|
||||||
|
var displayName2 = "Passwort"
|
||||||
|
|
||||||
|
out_msgs.push({ payload: "entityUpd~" + //entityUpd
|
||||||
|
heading + "~" + //heading
|
||||||
|
GetNavigationString(pageId) + "~" + //navigation
|
||||||
|
textQR + "~" + //textQR
|
||||||
|
type1 + "~" + //type
|
||||||
|
internalName1 + "~" + //internalName
|
||||||
|
iconId1 + "~" + //iconId
|
||||||
|
65535 + "~" + //iconColor
|
||||||
|
displayName1 + "~" + //displayName
|
||||||
|
optionalValue1 + "~" + //optionalValue
|
||||||
|
type2 + "~" + //type
|
||||||
|
internalName2 + "~" + //internalName
|
||||||
|
iconId2 + "~" + //iconId
|
||||||
|
65535 + "~" + //iconColor
|
||||||
|
displayName2 + "~" + //displayName
|
||||||
|
optionalValue2}); //optionalValue
|
||||||
|
|
||||||
|
//entityUpd,heading,navigation,textQR[,type,internalName,iconId,displayName,optionalValue]x2
|
||||||
|
return out_msgs
|
||||||
|
}
|
||||||
|
|
||||||
function setIfExists(id: string, value: any, type: string | null = null): boolean {
|
function setIfExists(id: string, value: any, type: string | null = null): boolean {
|
||||||
if (type === null) {
|
if (type === null) {
|
||||||
if (existsState(id)) {
|
if (existsState(id)) {
|
||||||
@@ -1898,9 +2034,50 @@ function HandleButtonEvent(words): void {
|
|||||||
setIfExists(id + ".STOP", true)
|
setIfExists(id + ".STOP", true)
|
||||||
break;
|
break;
|
||||||
case "hvac_action":
|
case "hvac_action":
|
||||||
if (words[4] == "POWER" || words[4] == "BOOST" || words[4] == "PARTY") {
|
if (words[4] == "BOOST" || words[4] == "PARTY") {
|
||||||
setIfExists(words[2] + "." + words[4], !getState(words[2] + "." + words[4]).val)
|
setIfExists(words[2] + "." + words[4], !getState(words[2] + "." + words[4]).val)
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
var HVACMode = 0;
|
||||||
|
switch (words[4]) {
|
||||||
|
case "POWER":
|
||||||
|
HVACMode = 0;
|
||||||
|
setIfExists(words[2] + "." + words[4], !getState(words[2] + "." + words[4]).val)
|
||||||
|
if (getState(words[2] + "." + words[4]).val) {
|
||||||
|
HVACMode = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "AUTO":
|
||||||
|
HVACMode = 1;
|
||||||
|
break;
|
||||||
|
case "COOL":
|
||||||
|
HVACMode = 2;
|
||||||
|
break;
|
||||||
|
case "HEAT":
|
||||||
|
HVACMode = 3;
|
||||||
|
break;
|
||||||
|
case "ECO":
|
||||||
|
HVACMode = 4;
|
||||||
|
break;
|
||||||
|
case "FAN":
|
||||||
|
HVACMode = 5;
|
||||||
|
break;
|
||||||
|
case "DRY":
|
||||||
|
HVACMode = 6;
|
||||||
|
break;
|
||||||
|
case "SWING":
|
||||||
|
HVACMode = getState(words[2] + "." + "MODE").val;
|
||||||
|
if (getState(words[2] + "." + "SWING").val == 0) {
|
||||||
|
setIfExists(words[2] + "." + "SWING", 1)
|
||||||
|
} else {
|
||||||
|
setIfExists(words[2] + "." + "SWING", 0)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
setIfExists(words[2] + "." + "MODE", HVACMode)
|
||||||
|
GeneratePage(config.pages[pageId]);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "number-set":
|
case "number-set":
|
||||||
setIfExists(id + ".SET", parseInt(words[4])) ? true : setIfExists(id + ".ACTUAL", parseInt(words[4]));
|
setIfExists(id + ".SET", parseInt(words[4])) ? true : setIfExists(id + ".ACTUAL", parseInt(words[4]));
|
||||||
@@ -2630,6 +2807,11 @@ interface PageAlarm extends Page {
|
|||||||
items: PageItem[],
|
items: PageItem[],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface PageQR extends Page {
|
||||||
|
type: "cardQR",
|
||||||
|
items: PageItem[],
|
||||||
|
};
|
||||||
|
|
||||||
type PageItem = {
|
type PageItem = {
|
||||||
id: string,
|
id: string,
|
||||||
icon: (string | undefined),
|
icon: (string | undefined),
|
||||||
@@ -2676,9 +2858,9 @@ type Config = {
|
|||||||
defaultColor: RGB,
|
defaultColor: RGB,
|
||||||
defaultOnColor: RGB,
|
defaultOnColor: RGB,
|
||||||
defaultOffColor: RGB,
|
defaultOffColor: RGB,
|
||||||
pages: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid)[],
|
pages: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid)[],
|
||||||
button1Page: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid | null),
|
button1Page: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid | null),
|
||||||
button2Page: (PageThermo | PageMedia | PageAlarm | PageEntities | PageGrid | null),
|
button2Page: (PageThermo | PageMedia | PageAlarm | PageQR | PageEntities | PageGrid | null),
|
||||||
};
|
};
|
||||||
|
|
||||||
type ScreenSaverElement = {
|
type ScreenSaverElement = {
|
||||||
|
|||||||
Reference in New Issue
Block a user