// verschiedene Vorgaben var arrType = new Array("gewitter_","wind_","regen_","schnee_","nebel_","frost_","eis_","tau_","hitze","uv"); var arrFarben = new Array("#C5E566","#FFFF00","#FA9600","#E53935","#AF0064","#FE68FE"); var stationAltitude = 103; // States anlegen createState("javascript.0.DwdExp", 0, false, {read: true, write: false, name: "DWD Expand Message 1 - 10", type: "number", def: 0, role: "info"}); for (var No = 1; No < 11; No++) { createState("javascript.0.DwdExp.Message" + No, "", false, {type: "channel", name: "Daten Meldung Nr. " + No, role: "forecast"}); createState("javascript.0.DwdExp.Message" + No + ".start", "", false, {read: true, write: false, name: "Warnzeitraum Beginn", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".end", "", false, {read: true, write: false, name: "Warnzeitraum Ende", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".type", NaN, false, {read: true, write: true, name: "Art der Warnung", type: "number", def: NaN, role: "value", min: 0, max: 9, states: "0:Gewitter; 1:Wind/Sturm; 2:Regen; 3:Schnee; 4:Nebel; 5:Frost; 6:Eis; 7:Tauwetter; 8:Hitzebelastung; 9:UV-Belastung"}); createState("javascript.0.DwdExp.Message" + No + ".level", NaN, false, {read: true, write: true, name: "Warnstufe", type: "number", def: NaN, role: "value", min: 0, max: 5, states: "1:Vorabinformation Unwetter; 2:Amtliche Wetterwarnung; 3:Amtliche Warnung vor markantem Wetter; 4:Amtliche Unwetterwarnung; 5:Amtliche Warnung vor extremem Unwetter"}); createState("javascript.0.DwdExp.Message" + No + ".severity", "0", false, {read: true, write: false, name: "Schwere der Warnstufe", type: "number", def: "0", role: "value", min: 0, max: 4, states: "0:None; 1:Minor; 2:Moderate; 3:Severe; 4:Extreme"}); createState("javascript.0.DwdExp.Message" + No + ".headline", "0", false, {read: true, write: false, name: "Warntyp Überschrift", type: "string", def: "undefined", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".description", "", false, {read: true, write: false, name: "Warntyp Beschreibung", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".event", "", false, {read: true, write: false, name: "Warntyp Stichwort", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".instruction", "", false, {read: true, write: false, name: "Warntyp Handlungsratschläge", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".period", "", false, {read: true, write: false, name: "Warnzeitraum", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".colour", "C5E566", false, {read: true, write: false, name: "Level Farbe", type: "string", def: "C5E566", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".icon", "", false, {read: true, write: false, name: "Level Icon", type: "string", def: "", role: "text"}); createState("javascript.0.DwdExp.Message" + No + ".visible", false, false, {read: true, write: false, name: "Sichtbarkeit des Icon", type: "boolean", def: false, role: "indicator.state"}); createState("javascript.0.DwdExp.Message" + No + ".origin", "", false, {read: true, write: false, name: "Original Message", type: "string", def: "", role: "text"}); } // Prüfen ob ein JSON-Objekt gültig ist. function isValidObject(obj) { var retVal = false; var count = Object.keys(obj).length; if (count > 2) { retVal = true; } log("isValidObj = " + retVal); return retVal; } function isValidAltitude(obj) { var retVal = false; if ((obj.altitudeStart === null) || ((stationAltitude > obj.altitudeStart) && ((stationAltitude < obj.altitudeEnd) || (obj.altitudeEnd === null)))) { retVal = true; } log("isValidAltitude = " + retVal + ", Höhen => Station " + stationAltitude + " Start " + obj.altitudeStart + " Ende " + obj.altitudeEnd); return retVal; } // Prüfen wieviel Meldungen aktiv sind function getActiveMessageCount() { var activeCount = 0; for (var a = 0; a < 10; a++){ if (a === 0) { getState("dwd.0.warning.severity").val > 0 ? activeCount++ : null; } else { getState("dwd.0.warning" + a + ".severity").val > 0 ? activeCount++ : null; } } log("getActiveMessageCount = " + activeCount); return activeCount; } function getSeverity(lev) { if (lev === 0) { return 0; } else if (lev === 1) { return 1; } else { return lev - 1; } } // aktuelle Zeit liegt zwischen der Anfangs- und Endzeit der Warnung. Das Ereignis ist eingetreten. function isActive(start, end) { var retVal = compareTime(start, end, "between"); log("isActive = " + retVal + " input Start: " + start + " End: " + end); return retVal; } // Aus einer Zeit einen formatierten String mit heute, morgen, übermorgen oder einem Datum mit Uhrzeit zurückgeben function getTimeString(toConvert) { var retVal = ""; // Heute var Tag0 = new Date(); Tag0.setHours(23, 59, 59); // Morgen var Tag1 = new Date(Tag0); Tag1.setDate(Tag1.getDate() + 1); // Übermorgen var Tag2 = new Date(Tag0); Tag2.setDate(Tag2.getDate()+2); if (toConvert < Tag0) { retVal = "heute " + formatDate(toConvert, "hh:mm") + " Uhr"; } else if ((toConvert > Tag0) && (toConvert < Tag1)) { retVal = "morgen " + formatDate(toConvert, "hh:mm") + " Uhr"; } else if ((toConvert > Tag1) && (toConvert < Tag2)) { retVal = "übermorgen " + formatDate(toConvert, "hh:mm") + " Uhr"; } else { retVal = formatDate(toConvert, "DD.MM.YYYY, hh:mm"); } log("getTimeString = " + retVal + " input = " + toConvert); return retVal; } // String zur Beschreibung des Warnzeitraumes erstellt: z. B. AKTIV bis heute 18:30 Uhr oder heute 23:00 bis morgen 09:00 Uhr function createTimeString(start, end) { var retVal = ""; if (isActive(start, end)) { retVal = "AKTIV bis " + getTimeString(end); } else { retVal = getTimeString(start) + " bis " + getTimeString(end); } log("createTimeString = " + retVal + " input = Start: " + start + " End: " + end); return retVal; } // entsprechenden String mit dem Pfad zum Icon und der entsprechenden Bezeichnung des Bildes erstellen function createIconString(type, level) { var retVal = ""; if (level === 1) { retVal ="/vis/img/dwd/vorab.png"; } else { retVal = "/vis/img/dwd/warn_icons_" + arrType[type]; if ((type >= 0) && (type <= 7)) { retVal += level - 1; } retVal += ".png"; } log("createIconString = " + retVal + " input = Type: " + type + " Level: " + level); return retVal; } function sortMessageArr(objA, objB) { var retVal; if (objA.level < objB.level) { log("Objekt A Level => " + objA.level + " ist kleiner als B Level => " + objB.level + " = B vor A"); retVal = 1; } else if (objA.level > objB.level) { log("Objekt A Level => " + objA.Level + " ist größer als B Level => " + objB.level + " = A vor B"); retVal = -1; } else { if (objA.start < objB.start) { log("Objekt A Start => " + objA.start + " ist kleiner als B Start => " + objB.start + " = A vor B"); retVal = -1; } else if (objA.start > objB.start) { log("Objekt A Start => " + objA.start + " ist größer als B Start => " + objB.start + " = B vor A"); retVal = 1; } else { if (objA.end < objB.end) { log("Objekt A Ende => " + objA.end + " ist kleiner als B Ende => " + objB.end + " = A vor B"); retVal = -1; } else if (objA.end > objB.end) { log("Objekt A Ende => " + objA.end + " ist größer als B Ende => " + objB.end + " = B vor A"); retVal = 1; } else { if (objA.type < objB.type) { log("Objekt A Typ => " + objA.type + " ist kleiner als B Typ => " + objB.typ + " = A vor B"); retVal = -1; } else if (objA.type > objB.type) { log("Objekt A Typ => " + objA.type + " ist größer als B Typ => " + objB.typ + " = B vor a"); retVal = 1; } else { log("Es gibt keinen Unterschied daher Sortierung egal."); retVal = 0; } } } } return retVal; } function getColour(lev, typ) { var retVal; if ((typ >= 8)) { retVal = arrFarben[5]; } else { retVal = arrFarben[lev - 1]; } log("getColour => " + retVal); return retVal; } function getMessages() { var count = getActiveMessageCount(); var validCount = 0; var object = null; var objDwd = []; for (var b = 0; b < count; b++) { if (b === 0) { object = JSON.parse(getState("dwd.0.warning.object").val); } else { object = JSON.parse(getState("dwd.0.warning" + b + ".object").val); } if (isValidObject(object) && isValidAltitude(object)) { objDwd[validCount] = new Object({ start: formatDate(object.start, "DD.MM.YYYY, hh:mm"), end: formatDate(object.end, "DD.MM.YYYY, hh:mm"), type: object.type, level: object.level, severity: getSeverity(object.level), headline: object.headline, description: object.description, event: object.event, instruction: object.instruction, period: createTimeString(object.start, object.end), icon: createIconString(object.type, object.level), colour: getColour(object.level, object.type), origin: b === 0 ? "dwd.0.warning" : "dwd.0.warning" + b, visible: true }); validCount++; } } log("getMessage => Valid Counts: " + validCount); setState("javascript.0.DwdExp", validCount); objDwd.sort(sortMessageArr); for (var c = 0; c < 10; c++) { log("Counter c = " + c + " validCount = " + validCount); var d = c + 1; var strState = "javascript.0.DwdExp.Message" + d; if (c < validCount) { log("ObjectIsValid"); setState(strState + ".start", objDwd[c].start); setState(strState + ".end", objDwd[c].end); setState(strState + ".type", objDwd[c].type); setState(strState + ".level", objDwd[c].level); setState(strState + ".severity", objDwd[c].severity); setState(strState + ".headline", objDwd[c].headline); setState(strState + ".description", objDwd[c].description); setState(strState + ".event", objDwd[c].event); setState(strState + ".instruction", objDwd[c].instruction); setState(strState + ".period", objDwd[c].period); setState(strState + ".icon", objDwd[c].icon); setState(strState + ".colour", objDwd[c].colour); setState(strState + ".origin", objDwd[c].origin); setState(strState + ".visible", objDwd[c].visible); } else { setState(strState + ".start", ""); setState(strState + ".end", ""); setState(strState + ".type", NaN); setState(strState + ".level", NaN); setState(strState + ".severity", 0); setState(strState + ".headline", ""); setState(strState + ".description", ""); setState(strState + ".event", ""); setState(strState + ".instruction", ""); setState(strState + ".period", ""); setState(strState + ".icon", ""); setState(strState + ".colour", arrFarben[0]); setState(strState + ".origin", ""); setState(strState + ".visible", false); } } } getMessages(); on("dwd.0.warning.object",function() {getMessages()}, "ne"); on("dwd.0.warning1.object",function() {getMessages()}, "ne"); on("dwd.0.warning2.object",function() {getMessages()}, "ne"); on("dwd.0.warning3.object",function() {getMessages()}, "ne"); on("dwd.0.warning4.object",function() {getMessages()}, "ne"); on("dwd.0.warning5.object",function() {getMessages()}, "ne"); on("dwd.0.warning6.object",function() {getMessages()}, "ne"); on("dwd.0.warning7.object",function() {getMessages()}, "ne"); on("dwd.0.warning8.object",function() {getMessages()}, "ne"); on("dwd.0.warning9.object",function() {getMessages()}, "ne");