const moment = require("moment"); // Skript Einstellungen ************************************************************************************************************************************************* let dpList = '0_userdata.0.vis.Status.Thermostate.jsonList'; // Datenpunkt für IconList Widget (Typ: Zeichenkette (String)) let dpSortMode = '0_userdata.0.vis.Status.Thermostate.sortMode'; // Datenpunkt für Sortieren (Typ: Zeichenkette (String)) let dpFilterMode = '0_userdata.0.vis.Status.Thermostate.filterMode'; // Datenpunkt für Filter (Typ: Zeichenkette (String)) //let showTemp = getState('0_userdata.0.vis.Status.Thermostate.ShowTemperatur').val; //let showMode = getState('0_userdata.0.vis.Status.Thermostate.showMode').val; const checkInterval = 60; // Interval wie oft Status der Skripte aktualisiert werden soll (in Sekunden) let sprache = 'de'; // Sprache für formatierung letzte Änderung let formatierungLastChange = "ddd DD.MM - HH:mm"; // Formatierung letzte Änderung -> siehe momentjs library let farbeGeraetOnline = 'green'; // Status Bar Farbe wenn Geräte online ist let farbeGeraetOffline = 'FireBrick'; // Status Bar Farbe wenn Geräte offline ist let sortResetAfter = 120; // Sortierung nach X Sekunden auf sortReset zurücksetzen (0=deaktiviert) let sortReset = 'name' // Sortierung auf die zurückgesetzt werden soll let filterResetAfter = 120; // Filter nach X Sekunden zurücksetzen (0=deaktiviert) let ventilFarbe = 'grey'; // ist ventil > 1 red let thermostatAn = 0; let thermostateCount = 0; // Ein Array welches alle Geräte beinhaltet, unterteilt noch nach Etagen: let all_items = new Array (); var iconPfad = '/vis-icontwo/Devices/' let bshPfad = "bshb.0.roomClimateControl_hz_"; let dpThermostat = '0_userdata.0.vis.Batterien.Thermostate.' //EG let eg_schlafzimmer = [ bshPfad + '4.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A159.BatteryLevel.faults', // [1] Batterie bshPfad + '4.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '4.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '4.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '4.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '4.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '4.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '4.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A159.ValveTappet.position', // [9] Ventil Stellung 'EG', // [10] Etage 'Schlafzimmer', // [11] Raum 'Schlafzimmer', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let eg_flur = [ bshPfad + '8.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859893D.BatteryLevel.faults', // [1] Batterie bshPfad + '8.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '8.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '8.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '8.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '8.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '8.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '8.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859893D.ValveTappet.position', // [9] Ventil Stellung 'EG', // [10] Etage 'Flur unten', // [11] Raum 'Flur unten', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let eg_toilette = [ bshPfad + '1.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18586C70.BatteryLevel.faults', // [1] Batterie bshPfad + '1.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '1.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '1.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '1.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '1.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '1.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '1.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18586C70.ValveTappet.position', // [9] Ventil Stellung 'EG', // [10] Etage 'Toilette', // [11] Raum 'Toilette', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let eg_kueche = [ bshPfad + '5.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A271.BatteryLevel.faults', // [1] Batterie bshPfad + '5.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '5.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '5.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '5.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '5.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '5.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '5.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A271.ValveTappet.position', // [9] Ventil Stellung 'EG', // [10] Etage 'Küche', // [11] Raum 'Küche', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let eg_wohnzimmer = [ bshPfad + '6.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A1AC.BatteryLevel.faults', // [1] Batterie bshPfad + '6.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '6.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '6.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '6.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '6.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '6.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '6.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A1AC.ValveTappet.position', // [9] Ventil Stellung 'EG', // [10] Etage 'Wohnzimmer', // [11] Raum 'Wohnzimmer', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; all_items[0] = new Array( eg_schlafzimmer, eg_flur, eg_toilette, eg_kueche, eg_wohnzimmer ); //OG let og_kino_sitze = [ bshPfad + '7.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E4717.BatteryLevel.faults', // [1] Batterie bshPfad + '7.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '7.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '7.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '7.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '7.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '7.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '7.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E4717.ValveTappet.position', // [9] Ventil Stellung 'OG', // [10] Etage 'Kino Sitze', // [11] Raum 'Kino Sitze', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let og_kino_leinwand = [ bshPfad + '14.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E4691.BatteryLevel.faults', // [1] Batterie bshPfad + '14.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '14.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '14.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '14.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '14.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '14.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '14.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005BB85E4691.ValveTappet.position', // [9] Ventil Stellung 'OG', // [10] Etage 'Kino Leinwand', // [11] Raum 'Kino Leinwand', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let og_bad = [ bshPfad + '3.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A145.BatteryLevel.faults', // [1] Batterie bshPfad + '3.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '3.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '3.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '3.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '3.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '3.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '3.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A1859A145.ValveTappet.position', // [9] Ventil Stellung 'OG', // [10] Etage 'Badezimmer', // [11] Raum 'Badezimmer', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let og_flur = [ bshPfad + '10.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18598CD3.BatteryLevel.faults', // [1] Batterie bshPfad + '10.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '10.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '10.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '10.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '10.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '10.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '10.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18598CD3.ValveTappet.position', // [9] Ventil Stellung 'OG', // [10] Etage 'Flur oben', // [11] Raum 'Flur oben', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; let og_buero = [ bshPfad + '2.RoomClimateControl.boostMode', // [0] boost 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18586C94.BatteryLevel.faults', // [1] Batterie bshPfad + '2.RoomClimateControl.operationMode', // [2] Operations Mode MANUAL, AUTOMATIC, OFF, UNKNOWN bshPfad + '2.RoomClimateControl.roomControlMode', // [3] Control Mode OFF, HEATING bshPfad + '2.RoomClimateControl.setpointTemperature', // [4] Soll Temperatur bshPfad + '2.RoomClimateControl.setpointTemperatureForLevelComfort', // [5] Comfort Temperatur bshPfad + '2.RoomClimateControl.setpointTemperatureForLevelEco', // [6] Eco Temperatur bshPfad + '2.RoomClimateControl.summerMode', // [7] Sommer Modus bshPfad + '2.TemperatureLevel.temperature', // [8] Ist Temperatur 'bshb.0.hdm:HomeMaticIP:3014F711A000005A18586C94.ValveTappet.position', // [9] Ventil Stellung 'OG', // [10] Etage 'Büro', // [11] Raum 'Büro', // [12] Kurzname '/vis.0/Meine Icons/Sonstiges/bosch thermostat.png', // [13] VIS-Icon 'Thermostat' // [14] Verwendung ]; all_items[1] = new Array( og_kino_sitze, og_flur, og_kino_leinwand, og_bad, og_buero ); // ********************************************************************************************************************************************************************** // Fomate für moment Lib moment.locale(sprache); // auf Änderungen der Sortieung hören on({ id: dpSortMode, change: 'any' }, thermostatStatus); on({ id: dpSortMode, change: 'any' }, resetSort); // // auf Änderungen der Filter hören on({ id: dpFilterMode, change: 'any' }, thermostatStatus); on({ id: dpFilterMode, change: 'any' }, resetFilter); // Funktion adapterStatus alle x Sekunden ausführen //schedule('*/' + checkInterval + ' * * * * *', thermostatStatus); //Auf Änderung Thermostat on({id: 'bshb.0.roomClimateControl_hz_1.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_2.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_3.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_4.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_5.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_7.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_8.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_10.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); on({id: 'bshb.0.roomClimateControl_hz_14.RoomClimateControl.setpointTemperature'}, function (obj) {thermostatStatus();}); function istJsonDP() { if (!existsState('0_userdata.0.vis.Status.Thermostate.ThermostateAn')) { createState('0_userdata.0.vis.Status.Thermostate.ThermostateAn', {'name': 'Thermostat An', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def': 0}); createState('0_userdata.0.vis.Status.Thermostate.ThermostateCount', {'name': 'Anzahl Thermostate', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def': 0}); createState('0_userdata.0.vis.Status.Thermostate.ThermostatInfo', {'name': 'Info text', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def': 0}); createState('0_userdata.0.vis.Status.Thermostate.jsonList', {'name': 'Json List', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def': ''}); createState('0_userdata.0.vis.Status.Thermostate.sortMode', {'name': 'Sortierung', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def': ''}); createState('0_userdata.0.vis.Status.Thermostate.filterMode', {'name': 'Filterung', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def': ''}); }; }; function thermostatStatus() { istJsonDP(); thermostatAn = 0; thermostateCount = 0; try { let deviceList = []; for (var i = 0; i <= all_items.length - 1; i++) { var etageArray = all_items[i]; etageArray.forEach(function(element) { let buttonLink = ''; let onLine = true; let boost = false; if (element[0].length > 0) { boost = getState(element[0]).val; }; let batterie = "Fehler"; if (element[1].length > 0) { batterie = 'OK!'; }; let operationMode = ''; if (element[2].length > 0) { operationMode = getState(element[2]).val; }; let controlMode = "Fehler"; if (element[3].length > 0) { controlMode = getState(element[3]).val; }; let sollTemp = '0 °C'; if (element[4].length > 0) { sollTemp = getState(element[4]).val + " °C"; }; let comfortTemp = "Fehler"; if (element[5].length > 0) { comfortTemp = getState(element[5]).val + " °C"; }; let ecoTemp = "Fehler"; if (element[6].length > 0) { ecoTemp = getState(element[6]).val + " °C"; }; let sommer = false; if (element[7].length > 0) { sommer = getState(element[7]).val; }; let istTemp = "Fehler"; if (element[8].length > 0) { istTemp = getState(element[8]).val + " °C"; }; let ventil = ""; if (element[9].length > 0) { ventil = getState(element[9]).val + " %"; if (getState(element[9]).val > 0) { ventilFarbe = "red"; thermostatAn++; } else { ventilFarbe = "grey"; }; }; let dpName = element[11].replace(" ", "_"); setState('0_userdata.0.vis.Status.Thermostate.' + dpName, ventilFarbe, true); thermostateCount++; let image = element[13]; let listType = 'text'; let imageColor = 'black'; let statusBarColor = farbeGeraetOffline; let status = 2; if (onLine === true) { statusBarColor = farbeGeraetOnline; status = 1; }; statusBarColor = farbeGeraetOnline; let subText = `
Type:
${element[14]}
Etage:
${element[10]}
Raum:
${element[11]}
Batterie:
${batterie}
Ventil:
${ventil}
` deviceList.push({ text: element[12], subText: subText, statusBarColor: statusBarColor, image: image, imageColor: imageColor, listType: listType, buttonLink: buttonLink, showValueLabel: false, name: element[12], status: status, }); }) } let sortMode = myHelper().getStateValueIfExist(dpSortMode, 'name'); if (sortMode === 'name') { deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } else if (sortMode === 'etage') { deviceList.sort(function (a, b) { return a[sortMode] == b[sortMode] ? 0 : +(a[sortMode] < b[sortMode]) || -1; }); } else if (sortMode === 'raum') { deviceList.sort(function (a, b) { return a[sortMode] == b[sortMode] ? 0 : +(a[sortMode] < b[sortMode]) || -1; }); } else { // default: nach name sortieren sortMode = 'name' deviceList.sort(function (a, b) { return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1; }); } let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterMode && filterMode !== null && filterMode !== '') { if (filterMode === 'aus') { deviceList = deviceList.filter(function (item) { return item.status === 2; }); } else if (filterMode === 'an') { deviceList = deviceList.filter(function (item) { return item.status === 1; }); } } let result = JSON.stringify(deviceList); if (getState(dpList) !== result) { setState(dpList, result, true); } } catch (err) { console.error(`[GeraeteStatus] error: ${err.message}, stack: ${err.stack}`); }; setState("0_userdata.0.vis.Status.Thermostate.ThermostateOn", thermostatAn); setState("0_userdata.0.vis.Status.Thermostate.ThermostateCount", thermostateCount); let text = ''; if (thermostatAn == 0) { text = 'Kein Thermostat von '; } else if(thermostatAn == 1) { text = '1 Thermostat von '; } else if(thermostatAn > 1) { text = thermostatAn + ' Thermostate von '; }; setState("0_userdata.0.vis.Status.Thermostate.ThermostatInfo", text + thermostateCount + ' in Betrieb.'); }; function resetSort() { let sortMode = myHelper().getStateValueIfExist(dpSortMode, null); if (sortResetAfter > 0) { setTimeout(function () { if (sortMode !== null && sortMode === myHelper().getStateValueIfExist(dpSortMode, null)) { setState(dpSortMode, sortReset); } }, sortResetAfter * 1000); } } function resetFilter() { let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null); if (filterResetAfter > 0) { setTimeout(function () { if (filterMode !== null && filterMode === myHelper().getStateValueIfExist(dpFilterMode, null)) { setState(dpFilterMode, ''); } }, filterResetAfter * 1000); } } // Beim Staren des Skriptes Geraete Status abrufen thermostatStatus(); function myHelper() { return { getStateValueIfExist: function (id, nullValue = undefined, prepand = '', append = '') { if (existsState(id)) { return prepand + getState(id).val + append; } else { return nullValue; } }, getCommonPropertyIfExist: function (object, prop, nullValue = undefined, prepand = '', append = '') { if (myHelper().checkCommonPropertyExist(object, prop)) { return prepand + object.common[prop] + append; } else { return nullValue; } }, checkCommonPropertyExist: function (object, prop) { if (object && object.common && object.common[prop]) { return true; } else { return false; } } } }