NEWS
FF-Einsätze OÖ auswerten
-
in dieser zeile, gaanz am ende
schedule('*/30 * * * * *',main)
die sternchenlogik kannst du mit dem cron assistenten im modus simple erzeugen
den findest du im skript über das uhren icon oben rechts -
@oliverio sagte in FF-Einsätze OÖ auswerten:
in dieser zeile, gaanz am ende
schedule('*/30 * * * * *',main)
die sternchenlogik kannst du mit dem cron assistenten im modus simple erzeugen
den findest du im skript über das uhren icon oben rechtsDann habe ich ein altes:
var xml2js = require('xml2js'); var fetch = require('node-fetch'); const useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; async function getData() { const response = await fetch("https://cf-einsaetze.ooelfv.at/webext2/rss/webext2_laufend.xml", { "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7", "cache-control": "no-cache", "pragma": "no-cache", "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "User-Agent": useragent }, "referrerPolicy": "strict-origin-when-cross-origin", "body": null, "method": "GET" }); let text = await response.text(); return text; } async function xml2json(xml) { return new Promise(function (resolve, reject) { var parser = new xml2js.Parser( { explicitArray: false } ); parser.parseString(xml, function (err, result) { if (err) { reject(err); } else { resolve(result); } }) // xml2js.parseString(xml, function (err, result) { // }); }) // var parser = new xml2js.Parser(); // parser.parseString(xml, function (err, result) { // console.dir(result); // }); } function normalizeData(obj) { let a = 1; let einsaetze = []; for (let i = 0; i < obj.length; i++) { let einsatz = obj[i]; let einsatzNeu = { id: einsatz.$.id, startzeit: einsatz.startzeit, status: einsatz.status, alarmstufe: einsatz.alarmstufe, einsatzart: einsatz.einsatzart, einsatzorg: einsatz.einsatzorg, einsatztyp: einsatz.einsatztyp._, einsatzsubtyp: einsatz.einsatzsubtyp._, alarmtext: einsatz.alarmtext, earea: einsatz.adresse.earea, bezirk_name: einsatz.bezirk._, bezirk_id: einsatz.bezirk.$.id, lng: einsatz.lng, lat: einsatz.lat, einheiten: [] }; if (Array.isArray(einsatz.einheiten.einheit) == false) { einsatz.einheiten.einheit = [einsatz.einheiten.einheit]; } for (let j = 0; j < einsatz.einheiten.einheit.length; j++) { let einheit = einsatz.einheiten.einheit[j]; einsatzNeu.einheiten.push({ id: einheit.$.id, bezeichnung: einheit._ }) } einsaetze.push(einsatzNeu); } return einsaetze; } function filterEinheiten(einsaetze, einheiten) { return einsaetze.filter(einsatz => einheiten.some(id => einsatz.einheiten.some(einheit => einheit.id == id))); } function filterBezirk(einsaetze, bezirk) { return einsaetze.filter(einsatz => einsatz.bezirk_id == bezirk); } function toHtml(einsaetze) { let rows = ""; einsaetze.forEach(einsatz => { let einheiten = einsatz.einheiten.map(einheit => einheit.bezeichnung).join("<br>"); rows += ` <tr> <td>${einsatz.alarmstufe}</td> <td>${einsatz.alarmtext}</td> <td>${einheiten}</td> <td>${einsatz.earea}</td> <td>${einsatz.lat}</td> <td>${einsatz.lng}</td> </tr> ` }) let html = ` <table> <tr> <th>Alarmstufe</th> <th>Alarmtext</th> <th>Einheiten</th> <th>EAREA</th> <th>lat</th> <th>lng</th> </tr> ${rows} </table> `; return html; } async function main() { let xml = await getData() let json = await xml2json(xml); let einsaetze = normalizeData(json.webext2.einsaetze.einsatz); let einsaetze_einheiten = filterEinheiten(einsaetze, []); let einsaetze_bezirk = filterBezirk(einsaetze, 6); let html1 = toHtml(einsaetze_einheiten); let html2 = toHtml(einsaetze_bezirk); let html3 = toHtml(einsaetze); console.log(html1); console.log(html2); console.log(html3); setState("0_userdata.0.FF-Einsatz.Einsatz", html2); } main();
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
oder dem bezirk erzeugst
ah, jetzt check ich es.
Funktioniert
Das kann man noch formatieren?
Text (Telegram & Mail) und Sprache (Alexa)?? -
@sigi234 sagte in FF-Einsätze OÖ auswerten:
Dann habe ich ein altes:
aktuelles
var xml2js = require('xml2js'); var fetch = require('node-fetch'); const useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; let einsaetzeGesendet = []; async function getData() { const response = await fetch("https://cf-einsaetze.ooelfv.at/webext2/rss/webext2_laufend.xml", { "headers": { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7", "cache-control": "no-cache", "pragma": "no-cache", "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", "User-Agent": useragent }, "referrerPolicy": "strict-origin-when-cross-origin", "body": null, "method": "GET" }); let text = await response.text(); return text; } async function xml2json(xml) { return new Promise(function (resolve, reject) { var parser = new xml2js.Parser( { explicitArray: false } ); parser.parseString(xml, function (err, result) { if (err) { reject(err); } else { resolve(result); } }) // xml2js.parseString(xml, function (err, result) { // }); }) // var parser = new xml2js.Parser(); // parser.parseString(xml, function (err, result) { // console.dir(result); // }); } function normalizeData(obj) { let a = 1; let einsaetze = []; for (let i = 0; i < obj.length; i++) { let einsatz = obj[i]; let einsatzNeu = { id: einsatz.$.id, startzeit: einsatz.startzeit, status: einsatz.status, alarmstufe: einsatz.alarmstufe, einsatzart: einsatz.einsatzart, einsatzorg: einsatz.einsatzorg, einsatztyp: einsatz.einsatztyp._, einsatzsubtyp: einsatz.einsatzsubtyp._, alarmtext: einsatz.alarmtext, earea: einsatz.adresse.earea, bezirk_name: einsatz.bezirk._, bezirk_id: einsatz.bezirk.$.id, lng: einsatz.lng, lat: einsatz.lat, einheiten: [] }; if (Array.isArray(einsatz.einheiten.einheit) == false) { einsatz.einheiten.einheit = [einsatz.einheiten.einheit]; } for (let j = 0; j < einsatz.einheiten.einheit.length; j++) { let einheit = einsatz.einheiten.einheit[j]; einsatzNeu.einheiten.push({ id: einheit.$.id, bezeichnung: einheit._ }) } einsaetze.push(einsatzNeu); } return einsaetze; } function filterEinheiten(einsaetze, einheiten) { if (!einheiten) throw Error("Einheiten ids müssen angegeben werden"); return einsaetze.filter(einsatz => einheiten.some(id => einsatz.einheiten.some(einheit => einheit.id == id))); } function filterBezirk(einsaetze, bezirk) { if (!bezirk) throw Error("bezirkid muss angegeben werden"); return einsaetze.filter(einsatz => einsatz.bezirk_id == bezirk); } function toHtml(einsaetze) { let rows = ""; einsaetze.forEach(einsatz => { let einheiten = einsatz.einheiten.map(einheit => einheit.bezeichnung).join("<br>"); rows += ` <tr> <td>${einsatz.alarmstufe}</td> <td>${einsatz.alarmtext}</td> <td>${einheiten}</td> <td>${einsatz.earea}</td> <td>${einsatz.lat}</td> <td>${einsatz.lng}</td> </tr> ` }) let html = ` <table> <tr> <th>Alarmstufe</th> <th>Alarmtext</th> <th>Einheiten</th> <th>EAREA</th> <th>lat</th> <th>lng</th> </tr> ${rows} </table> `; return html; } function prepareMessages(einsaetze, kurz, alle) { let messages = []; einsaetze.map(einsatz => { if (!einsaetzeGesendet.includes(einsatz.id) || alle) { if (kurz) { messages.push(['Achtung; Feuerwehreinsatz in ', einsatz.earea, '; ', 'Alarmstufe ', einsatz.alarmstufe, '; ', einsatz.einsatzsubtyp, ';'].join('')); } else { messages.push(['Achtung; Feuerwehreinsatz in ', einsatz.earea, '; ', 'Alarmstufe ', einsatz.alarmstufe, '; ', einsatz.einsatzsubtyp, ';', einsatz.startzeit, ';', einsatz.bezirk_name, '; Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join('')); } einsaetzeGesendet.push(einsatz.id); } }) return messages.join("\n"); } function sendTelegram(text, user) { sendTo("telegram.0", "send", { text: text, user: user, }); } function sendEMail(text, to, subject) { sendTo("email.0", "send", { text: text, to: to, subject: subject }); } function sendAlexa(text, lautstaerke) { setState('alexa2.0.Echo-Devices.sss.Commands.speak-volume', lautstaerke); setState('alexa2.0.Echo-Devices.sss.Commands.speak', text); } async function main() { let xml = await getData() let json = await xml2json(xml); let einsaetze = normalizeData(json.webext2.einsaetze.einsatz); let einsaetze_einheiten = filterEinheiten(einsaetze, [410321, 410327]); let einsaetze_bezirk = filterBezirk(einsaetze, 10); let html1 = toHtml(einsaetze_einheiten); let html2 = toHtml(einsaetze_bezirk); let html3 = toHtml(einsaetze); let messages = prepareMessages(einsaetze_bezirk, false, false); //messages = prepareMessages(einsaetze, true, false); let nachtruhe=compareTime("01:00", "06:00","between"); if (!nachtruhe || messages) sendAlexa(messages, 60); if (messages) sendTelegram(messages, ""); if (messages) sendEMail(messages, "christian@xx.at", "Neuer Feuerwehreinsatz"); console.log(html1); console.log(html2); console.log(html3); //setState("0_userdata.0.testFolder.a", html3); setState("0_userdata.0.FF-Einsatz.Bezirk", html2); } schedule('*/60 * * * * *',main)
-
sieht erst mal gut aus
und nun beobachten ob alles richtig läuft.
dann kann man nachjustieren.du kannst dir auch mehrere emails zusenden mit den gefilterten mesages für bezirk und für einheiten.
let messages_einheiten= prepareMessages(einsaetze_einheiten, false, false); let messages_bezirk = prepareMessages(einsaetze_bezirk, false, false); if (messages_bezirk) sendEMail(messages_bezirk , "christian@xx.at", "Neuer Feuerwehreinsatz"); if (messages_einheiten) sendEMail(messages_einheiten, "christian@xx.at", "Neuer Feuerwehreinsatz");
am besten zuerst einheiten in prepareMessages aufbereiten lassen.
dann sind in messages_bezirk nur noch die restlichen, die vorher nicht gemeldet wurden.im endeffekt funktionieren diese funktionen wie die bausteine in blockly, die du dann sinnvoll aneinander reihen musst. du musst dir nur verdeutlichen was kommt wo rein und was davon du wo wieder reinstopfen möchtest
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
du kannst dir auch mehrere emails zusenden mit den gefilterten mesages für bezirk und für einheiten.
cool, Danke!
Oben hab ich noch was wegen Formatierung ergänzt.
-
@negalein sagte in FF-Einsätze OÖ auswerten:
Das kann man noch formatieren?
Text (Telegram & Mail) und Sprache (Alexa)??klar
was willst du wie formatiert/ausgegeben haben?
wie die letzten tage schonmal geschrieben ist die ausgabe alles sehr roh.
aber das kann man nun feinjustierenidealerweise sind die Texte von Sprache/Mail/Telegram gleich. dann vereinfacht sich das schreiben
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
idealerweise sind die Texte von Sprache/Mail/Telegram gleich. dann vereinfacht sich das schreiben
1 Format für alles reicht vollkommen.
Im Prinzip so ungefähr:
Roh:
Achtung; Feuerwehreinsatz in Dorf an der Pram; Alarmstufe 0; Einsatz od. Einsatzübung;Tue, 10 Sep 2024 20:29:56 +0200;Schärding; Anzahl Feuerwehren 1;Format:
Achtung
Feuerwehreinsatz in Dorf an der Pram
Alarmstufe 0
Einsatz od. Einsatzübung -
bitte diese funktionen ersetzen.
ich habe mir mal erlaubt die zeit auch zu optimierenfunction prepareMessages(einsaetze, kurz, alle) { let messages = []; einsaetze.map(einsatz => { if (!einsaetzeGesendet.includes(einsatz.id) || alle) { if (kurz) { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';'].join('')); } else { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';', `${new Date(einsatz.startzeit).toLocaleDateString("de")} ${new Date(einsatz.startzeit).toLocaleTimeString("de")}`, ';', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join('')); } einsaetzeGesendet.push(einsatz.id); } }) return messages.join(";"); } function sendTelegram(text, user) { sendTo("telegram.0", "send", { text: text.replace(/;/gm, "\n"), user: user, }); } function sendEMail(text, to, subject) { sendTo("email.0", "send", { text: text.replace(/;/gm, "\n"), to: to, subject: subject }); } function sendAlexa(text, lautstaerke) { setState('alexa2.0.Echo-Devices.xxxxxxxxxx.Commands.speak-volume', lautstaerke); setState('alexa2.0.Echo-Devices.xxxxxxx.Commands.speak', text.replace(/;/gm, "\n"),); }
mit allen sieht das jetzt so aus
Achtung Feuerwehreinsatz in Walding Alarmstufe 0 Brandverdacht 10.9.2024 20:46:32 Urfahr-Umgebung Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Scharten Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 20:39:03 Eferding Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Bad Zell Alarmstufe 0 Brand PKW im Freien 10.9.2024 20:34:47 Freistadt Anzahl Feuerwehren 3 Achtung Feuerwehreinsatz in Dorf an der Pram Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 20:29:56 Schärding Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Vorchdorf Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 19:35:22 Gmunden Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Vöcklamarkt Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 19:25:55 Vöcklabruck Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Neumarkt im Mühlkreis Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 19:15:50 Freistadt Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Timelkam Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 19:09:02 Vöcklabruck Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Berg bei Rohrbach Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 18:29:07 Rohrbach Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Kirchdorf am Inn Alarmstufe 0 Einsatz od. Einsatzübung 10.9.2024 16:46:26 Ried im Innkreis Anzahl Feuerwehren 1 Achtung Feuerwehreinsatz in Tiefgraben Alarmstufe 0 Einsatz od. Einsatzübung 9.9.2024 19:09:30 Vöcklabruck Anzahl Feuerwehren 1
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
mit allen sieht das jetzt so aus
Danke
kleine Änderungen bitte
Feuerwehreinsatz in Dorf an der Pram,
Alarmstufe 0,
Einsatz od. Einsatzübung,
10.9.2024 20:29:56
Schärding
Anzahl Feuerwehren 1bitte mit
,
, da die Quassel Alexandra sonst alles in einer Wurst plappert.Das durchgestrichene bitte raus.
-
wo soll das komma überall hin?
nach jeder Zeile? -
@oliverio sagte in FF-Einsätze OÖ auswerten:
nach jeder Zeile?
Ja, denke schon.
Bin mir nicht sicher,Ok, hab gerade getestet.
Ein
;
macht eine schönere PauseAlso
Achtung;
Feuerwehreinsatz in Dorf an der Pram;
Alarmstufe 0;
Einsatz od. Einsatzübung;
Anzahl Feuerwehren 1 -
dann das hier ersetzen
function sendAlexa(text, lautstaerke) { setState('alexa2.0.Echo-Devices.xxxxxxxxxx.Commands.speak-volume', lautstaerke); setState('alexa2.0.Echo-Devices.xxxxxxx.Commands.speak', text,); }
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
dann das hier ersetzen
Danke
Datum liest sie komisch vor
aus
10.9.2024
wird10 komma 9 komma 2024
Uhrzeit wird richtig vorgelesen.
-
ich hatte die beiden felder bereits entfernt, dir aber noch nicht gesendet.
dann ist das datum wegwie müsste es denn formatiert werden, das es gut vorgelesen wird?
das datum komplett ist wahrscheinlich langweiligfunction prepareMessages(einsaetze, kurz, alle) { let messages = []; einsaetze.map(einsatz => { if (!einsaetzeGesendet.includes(einsatz.id) || alle) { if (kurz) { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';'].join('')); } else { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';', 'Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join('')); } einsaetzeGesendet.push(einsatz.id); } }) return messages.join(";"); }
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
wie müsste es denn formatiert werden, das es gut vorgelesen wird?
ich forsche mal
das datum komplett ist wahrscheinlich langweilig
wie meinst du das?
-
@negalein sagte in FF-Einsätze OÖ auswerten:
wie müsste es denn formatiert werden, das es gut vorgelesen wird?
ich forsche mal
https://forum.iobroker.net/topic/74001/alexa-datum-sprachausgabe-speak?_=1726003267765
-
@negalein sagte in FF-Einsätze OÖ auswerten:
das datum komplett ist wahrscheinlich langweilig
wie meinst du das?
die einsätze sind ja eher aktuell und nicht von letzter woche.
daher ist das komplette datum nicht notwendig.
wahrscheinlich reicht der Wochentag alsoMontag, 10:45 Uhr oder
Dienstag, 13:32 Uhrhier mal als option noch mit modifizierter zeitausgabe
function prepareMessages(einsaetze, kurz, alle) { let messages = []; const dateOptions = { weekday: "long", }; const timeOptions = { hour: "2-digit", minute: "2-digit" }; einsaetze.map(einsatz => { if (!einsaetzeGesendet.includes(einsatz.id) || alle) { if (kurz) { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';'].join('')); } else { messages.push(['Achtung;Feuerwehreinsatz in ', einsatz.earea, ';', 'Alarmstufe ', einsatz.alarmstufe, ';', einsatz.einsatzsubtyp, ';', `${new Date(einsatz.startzeit).toLocaleDateString("de", dateOptions)}, ${new Date(einsatz.startzeit).toLocaleTimeString("de", timeOptions)} Uhr`, ';', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join('')); } einsaetzeGesendet.push(einsatz.id); } }) return messages.join(";"); }
-
@oliverio sagte in FF-Einsätze OÖ auswerten:
hier mal als option noch mit modifizierter zeitausgabe
Danke, test ich morgen
-
Gutn Morgen
gerade ist eine Meldung gekommen
Achtung
Feuerwehreinsatz in Taufkirchen an der Pram
Alarmstufe 0
Einsatz od. Einsatzübung
Mittwoch, 07:50 Uhr
Schärding
Anzahl Feuerwehren 1
Bitte noch Datum, Zeit entfernen & vor
einsatz.bezirk_name
bitte das WortBezirk
einfügen.Achtung
Feuerwehreinsatz in Taufkirchen an der Pram
Bezirk Schärding
Alarmstufe 0
Einsatz od. Einsatzübung
Anzahl Feuerwehren 1