//Version 11.2
//nachbearbeitet von ticaki
/* ************************************************************************* */
/* Script zum Übertragen der DWD-Wetterwarnungen über */
/* Telegram, Pushover, Home24-Mediaplayer oder SayIt */
/* mit freundlicher Unterstützung von Paul53 (Tausend Dank nochmals) */
/* Stand: 130022017 PrinzEisenherz1 */
/* */
/* */
/* - Fehlerbehebung z.B. 5 gültig bis 5 */
/* */
/* */
/* */
/* */
/* Variante für 5-warnings */
/* */
/* ************************************************************************* */
/* Nachrichten-Dienst festlegen */
/* Konstanten nicht verändern */
var konstanten = [{"name":'telegram',"value":1},{"name":'pushover',"value":2},{"name":'email',"value":4},{"name":'sayit',"value":8},{"name":'home24',"value":16},{"name":'alexa',"value":32}];
const TELEGRAM = konstanten[0].value;
const PUSHOVER = konstanten[1].value;
const EMAIL = konstanten[2].value;
const SAYIT = konstanten[3].value;
const HOMETWO = konstanten[4].value;
const ALEXA = konstanten[5].value;
var pushdienst=0;
/* Konstanten Ende */
/* Konfiguration der zu nutzenden Ausgabe um //pushdienst+= PUSHOVER; zu aktivieren, bitte die // enfernen, also pushdienst+= PUSHOVER; */
//pushdienst+= TELEGRAM; // Auskommentieren zum aktivieren
//pushdienst+= PUSHOVER; // Auskommentieren zum aktivieren
//pushdienst+= EMAIL; // Auskommentieren zum aktivieren. Einstellungen nicht vergessen
//pushdienst+= SAYIT; // Auskommentieren zum aktivieren. Einstellungen nicht vergessen
//pushdienst+= HOMETWO; // Auskommentieren zum aktivieren. Einstellungen nicht vergessen
//pushdienst+= ALEXA; // Auskommentieren zum aktivieren. Einstellungen nicht vergessen
//StatePfad um Mitteilungen auszulösen darunter werden jeweils Punkte für jede Ausgabemöglichkeit erstellt.
var onClickMessageState = 'javascript.0.DWD_Script.Commands.'; // abschließender Punkt . nicht vergessen
// Filtereinstellungen
const minlevel = 0 // Warnungen gleich oder unterhalb dieses Levels nicht senden;
const maxhoehe = 410 // Warnung für eine Höhe oberhalb dieses Wertes nicht senden
//Formatierungsstring für Datum/Zeit Alternative "TT.MM.YYYY SS:mm" KEINE Anpassung nötig
const formatierungString = "TT.MM.YYYY SS:mm";
/* Einstellungen zur Emailbenachrichtigung*/
var senderEmailID = ""; // mit Sender Emailadresse füllen. email Adapter muß installiert sein
var empfaengerEmailID = "";// mit Empfänger Emailadresse füllen.
/* Konfiguration Sprachausgabe über Home24-Mediaplayer */
var idMediaplayer = "192.168.178.68:50000"; // Eingabe IP-Adresse incl. Port für Home24-Mediaplayer
/* Konfiguration Sprachausgabe über SayIt */
var idSayIt = "sayit.0.tts.text";
var lautstaerke = 60;
//Konfiguration Sprachausgabe über Alexa
var idAlexaSerial =''; // die reine Seriennummer des Echos
var alexaVolumen = 40; // Lautstärke 0-100 (denke ich :) )
// Sprachausgabe Zeiten
const startTimeSpeak = '6:45';// Zeiten mo-fr ab der Sprachausgaben ok sind.
const startTimeSpeakWeekend = '9:00';// sa + so
// Automatikmodus auschalten
var autoMode = true;
/* Keine Anpassungen ab hier, außer du weißt was du tuest */
var idAlexa = 'alexa2.0.Echo-Devices.'+idAlexaSerial+'.Commands.announcement';
var idAlexaVolumen = 'alexa2.0.Echo-Devices.'+idAlexaSerial+'.Commands.speak-volume';
/* Arrays festlegen */
var newDescriptions = [9];
var oldDescriptions = [9];
var newHeadlines = [9];
var oldHeadlines = [9];
var newBegins = [9];
var oldBegins = [9];
var newEnds = [9];
var oldEnds = [9];
var newInstruction = [9];
var timer = null;
/* erstmaliges Befüllen der arrays */
for (let a=0;a<newDescriptions.length;a++) {
var id = "dwd.0.warning";
if (a!=0) id+=a.toString();
id+='.object';
var warn = {};
if (existsState(id)) warn = getState(id).val;
warn = convertJsonDWD(warn);
newDescriptions[a] = warn.description;
oldDescriptions[a] = warn.description;
newHeadlines[a] = warn.headline;;
oldHeadlines[a] = warn.headline;
newBegins[a] = warn.start;
oldBegins[a] = warn.start;
newEnds[a] = warn.end;
oldEnds[a] = warn.end;
}
// Nachrichtenversand per Click States erzeugen und subscript
for (var a=0;a<konstanten.length;a++){
if (!existsState(onClickMessageState+konstanten[a].name)) {
createState(onClickMessageState+konstanten[a].name,false, {
read: true,
write: true,
desc: "Beschreibung",
type: "boolean",
def: false
});
}
if (existsState(onClickMessageState+konstanten[a].name)){
subscribe({id: onClickMessageState+konstanten[a].name},function(obj){
if (!obj.state.val) return;
setState(obj.id,false,true);
let b = obj.id.split('.');
let d = konstanten.findIndex(function(c){return (c.name===b[b.length-1]);})
if (d == -1) {log('Fehler. State nicht in Konstanten enthalten','error'); return;}
if ((pushdienst & konstanten[d].value) == 0) return;
let oldPushdienst = pushdienst;
pushdienst = konstanten[d].value*1;
let tempHeadlines = oldHeadlines.slice();
let tempDescriptions = oldDescriptions.slice();
let tempBegins = oldBegins.slice();
let tempEnds = oldEnds.slice();
for (let i=0;i<oldDescriptions.length;i++) {
oldHeadlines[i] = '';
oldDescriptions[i] = '';
oldBegins[i] = '';
oldEnds[i] = '';
}
check();
pushdienst = oldPushdienst
oldHeadlines = tempHeadlines.slice();
oldDescriptions = tempDescriptions.slice();
oldBegins = tempBegins.slice();
oldEnds = tempEnds.slice();
})
}
}
// Zeitsteuerung für SayIt & Alexa
var START = '9:00';
setWeekend()
schedule("0 6 * * *", setWeekend); //ausgelöst jeden Tag um 6h morgens; prüft, ob Wochenende ist
function setWeekend()
{
let date = new Date();
let n = date.getDay();
let weekend = 0;
weekend = (n === 0 || n == 6) ? 1 : 0;
if(weekend == 1){ // wenn Wochenende, dann setze Start auf 9h, sonst 6:45h
START = startTimeSpeakWeekend;
}
else{
START = startTimeSpeak;
}
}
function check() {
/* Bereich für 'Alle Wetterwarnungen wurden aufgehoben' */
if(newDescriptions.findIndex(function(a){return (Boolean(a));})==-1) {
MeldungSpracheDWD = 'Achtung' + ' . ' + 'Alle Warnmeldungen des DWD wurden aufgehoben';
/* Bereich für Sprachausgabe über Home24-Mediaplayer */
if((pushdienst & HOMETWO)!=0 ){
var Url = "http://" + idMediaplayer + "/track=4fachgong.mp3|tts=" + MeldungSpracheDWD;
request(Url);
}
/* Bereich für Sprachausgabe SayIt & ALexa im Zeitraum */
var ENDE= '22:30'; // Ende immer 22:30h
/* Bereich für Sprachausgabe über SayIt & Alexa */
if (compareTime(START, ENDE, 'between')){ // Ansage über Sayit nur im definierten Zeitbereich
if ((pushdienst & SAYIT)!=0) setState(idSayIt, lautstaerke + ";" + MeldungSpracheDWD);
if ((pushdienst & ALEXA)!=0) {
setState(idAlexaVolumen, alexaVolumen);
setState(idAlexa, MeldungSpracheDWD);
}
}
if ((pushdienst & TELEGRAM)!=0 ) {
sendTo ("telegram.0", 'Alle Warnmeldungen des DWD wurden aufgehoben');
}
if ((pushdienst & PUSHOVER)!=0 ) {
sendTo("pushover.0", 'Alle Warnmeldungen des DWD wurden aufgehoben');
}
if ((pushdienst & EMAIL)!=0 && senderEmailID != '' && empfaengerEmailID !='') {
sendEmail('Wetterentwarnung des DWD(iobroker)','Alle Warnmeldungen des DWD wurden aufgehoben');
}
/* alle Sicherungen Wetterwarnung löschen */
oldHeadlines = newHeadlines.slice();
oldDescriptions = newDescriptions.slice();
oldBegins = newBegins.slice();
oldEnds = newEnds.slice();
return;
}
/* Variablen für Meldungen Text */
var MeldungOld = '';
var MeldungNew = '';
/* Variablen für Meldungen Sprache */
var MeldungSpracheDWD = '';
var MeldungNewSprache = '';
var MeldungOldSprache = '';
var AllEmailMsg = '';
var headline;
var description;
var begin;
var end;
var i;
var warn;
/* Bereich für 'Wetterwarnung gültig bis wurde aufgehoben' */
for(i = 0; i < newDescriptions.length; i++) {
warn = 'dwd.0.warning';
if(i) warn = warn + i;
headline = oldHeadlines[i];
description = oldDescriptions[i];
begin = oldBegins[i];
end = oldEnds[i];
if(newDescriptions.indexOf(description) == -1 && description !== '' && description !== undefined) {
MeldungOld = oldHeadlines[i] + ' gültig bis ' + oldEnds[i] + ' Uhr wurde aufgehoben';
MeldungOldSprache = oldHeadlines[i] + ' gültig bis ' + getFormatDateSpeak(oldEnds[i]) + ' Uhr wurde aufgehoben' + ' . ';
if ((pushdienst & TELEGRAM)!=0) {
sendTo ("telegram.0", "Die Wetterwarnung " +"'"+ oldHeadlines[i] + " gültig bis " + oldEnds[i] + "'" + " des DWD wurde aufgehoben");
}
if ((pushdienst & PUSHOVER)!=0) {
sendTo("pushover.0", "Die Wetterwarnung " +"'"+ oldHeadlines[i] + " gültig bis " + oldEnds[i] + "'" + " des DWD wurde aufgehoben");
}
if ((pushdienst & EMAIL)!=0 && senderEmailID!= '' && empfaengerEmailID!='') {
AllEmailMsg+="Die Wetterwarnung " +"'"+ oldHeadlines[i] + " gültig bis " + oldEnds[i] + "'" + " des DWD wurde aufgehoben"+'\n';
}
/* Verknüpfen aller aufgehobenen Wetterwarnungen */
if(MeldungOldSprache !== "" && MeldungOldSprache !== undefined){
MeldungSpracheDWD = MeldungSpracheDWD + MeldungOldSprache;
}
}
}
/* Bereich für 'Neue Amtliche Wetterwarnung' */
for(i = 0; i < newDescriptions.length; i++) {
warn = 'dwd.0.warning';
if(i) warn = warn + i;
headline = newHeadlines[i];
description = newDescriptions[i];
begin = newBegins[i];
end = newEnds[i];
var instruction = newInstruction[i];
if(oldDescriptions.indexOf(description) == -1 && description !== "" && description !== undefined) {
MeldungNew = headline + "\ngültig vom " + begin + " Uhr bis " + end + " Uhr\n" + description;
if (instruction!='') MeldungNew+='\nHandlungsanweisungen: '+instruction;
/* Entfernen °C für Sprachausgabe */
var replaceDescription0 = entferneDatenpunkt(description);
MeldungNewSprache = headline + " gültig vom " + getFormatDateSpeak(begin) + " Uhr, bis " + getFormatDateSpeak(end) + " Uhr. " + replaceDescription0 + ' . ';
if (instruction!='') MeldungNewSprache+='Handlungsanweisungen: '+instruction;
if ((pushdienst & TELEGRAM)!=0) {
sendTo ("telegram.0", MeldungNew);
}
if ((pushdienst & PUSHOVER)!=0) {
sendTo("pushover.0", MeldungNew);
}
if ((pushdienst & EMAIL)!=0 && senderEmailID!= '' && empfaengerEmailID!='') {
AllEmailMsg+=MeldungNew+'\n\n';
}
/* Verknüpfen aller neuen Warnmeldungen */
if(MeldungNewSprache !== "" && MeldungNewSprache !== undefined){
MeldungSpracheDWD = MeldungSpracheDWD + MeldungNewSprache;
}
}
}
/* Verknüpfen aller neuen und abgelaufenen Warnmeldungen */
MeldungSpracheDWD = 'Achtung . ' + MeldungSpracheDWD;
/* Bereich für Sprachausgabe über Home24-Mediaplayer */
if((pushdienst & HOMETWO)!=0 && (MeldungSpracheDWD !== "")){
var Url2 = "http://" + idMediaplayer + "/track=4fachgong.mp3|tts=" + MeldungSpracheDWD;
log('Url2 :' + Url2);
request(Url2);
}
/* Bereich für Sprachausgabe über SayIt */
if ((MeldungSpracheDWD !== "")){
if ((pushdienst & SAYIT)!=0) setState(idSayIt, lautstaerke + ";" + MeldungSpracheDWD);
if ((pushdienst & ALEXA)!=0) {
setState(idAlexaVolumen, alexaVolumen);
setState(idAlexa, MeldungSpracheDWD);
}
}
if ((pushdienst & EMAIL)!=0 && senderEmailID != '' && empfaengerEmailID != '' && AllEmailMsg != '') {
sendEmail("Wetterwarnungen des DWD(iobroker)",AllEmailMsg);
}
/* Neue Werte sichern */
oldHeadlines = newHeadlines.slice();
oldDescriptions = newDescriptions.slice();
oldBegins = newBegins.slice();
oldEnds = newEnds.slice();
}
/* Entfernt "°C" aus Sprachmeldung und ersetzt es durch "Grad" */
function entferneDatenpunkt(beschreibung) {
var rueckgabe;
rueckgabe = beschreibung;
try {
rueckgabe = rueckgabe.replace(/\°C/g, "Grad");
rueckgabe = rueckgabe.replace(/\km\/h/g, "Kilometer pro Stunde");
}
catch(e) {}
return rueckgabe;
}
on(/^dwd\.0\..*\.object$/, function(dp) {
let i = getIdIndex(dp.id);
var warn = null;
if (dp.state.val != '') warn = JSON.parse(dp.state.val);
warn = convertJsonDWD(warn);
newDescriptions[i] = warn.description ;
newHeadlines[i] = warn.headline;
newBegins[i] = warn.start;
newEnds[i] = warn.end;
newInstruction[i] = warn.instruction;
if(timer) clearTimeout(timer);
if (autoMode) timer = setTimeout(check, 7000);
});
function convertJsonDWD(warn) {
warn = (!warn || warn === ''? {} : warn);
if (warn != {} && (warn.altitudeStart>maxhoehe || warn.level <= minlevel)) warn = {};
var a = warn.description === undefined ? '' : warn.description;
var b = warn.headline === undefined ? '' : warn.headline;
var c = warn.start === undefined ? '' : getFormatDate(new Date(warn.start));
var d = warn.end === undefined ? '' : getFormatDate(new Date(warn.end));
var e = warn.instruction === undefined ? '' : warn.instruction;
return {"description":a,"headline":b,"start":c,"end":d,"instruction":e};
}
function getIdIndex(a) {
a = a.split('.');
if (a[2].length == 7) return 0
return a[2][7];
}
function getFormatDate(a) {
if (!a || a === '') return '';
return formatDate(a.getTime(), formatierungString);
}
// @PARAM Rückgabe von getFormatDate
function getFormatDateSpeak(a) {
if (!a || a === '') return '';
var b = a.split('.');
var m = '';
switch (b[1]) {
case '01': m='Januar';break;
case '02': m='Februar';break;
case '03': m='März';break;
case '04': m='April';break;
case '05': m='Mai';break;
case '06': m='Juni';break;
case '07': m='Juli';break;
case '08': m='August';break;
case '09': m='September';break;
case '10': m='Oktober';break;
case '11': m='November';break;
case '12': m='Dezember';break;
default: m='';
}
b[1]=m; // setze Monatsname
// entferne Jahr
var c = b[2].split(' ');
c[0]='';
b[2] = c.join(' ');
return b.join(' ');
}
function sendEmail(topic, msg) {
if (senderEmailID=='') {
log('senderEmailID ist nicht definiert!','warn');
return;
}
if (empfaengerEmailID=='') {
log('empfaengerEmailID ist nicht definiert!','warn');
return;
}
sendTo("email", {
from: senderEmailID,
to: empfaengerEmailID,
subject: topic,
text: msg
});
}