Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. FF-Einsätze OÖ auswerten

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    FF-Einsätze OÖ auswerten

    This topic has been deleted. Only users with topic management privileges can see it.
    • Meister Mopper
      Meister Mopper @Negalein last edited by

      @negalein sagte in FF-Einsätze OÖ auswerten:

      dann dürfte auch keine Sirene, usw. losgehn. Ein Einsatz ist normal weiträumig zu hören.
      Zumindest bei uns.

      Ja, das mag sein, aber bei geplanten Anschlägen von außen hilft die Sirene nüscht 🤷‍♂️ .

      Ich zumindest würde die Thematik mal oben einwerfen.

      Negalein 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @Negalein last edited by

        @negalein sagte in FF-Einsätze OÖ auswerten:

        Bitte noch Datum, Zeit entfernen & vor einsatz.bezirk_name bitte das Wort Bezirk einfügen

        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, ';', 'Bezirk ', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join(''));
                    }
                    einsaetzeGesendet.push(einsatz.id);
                }
            })
            return messages.join(";");
        }
        
        1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @sigi234 last edited by

          @sigi234 sagte in FF-Einsätze OÖ auswerten:

          EDIT2
          Doch nicht

          wie weiter oben schon mal gesagt merkt sich das skript
          die meldungen nur innerhalb eines starts.
          nach dem nächsten start ist das wieder vergessen.
          man könnte das gedächtnis in einen datenpunkt verlagern. dann überlebt dies auch den neustart eines skripts

          sigi234 Negalein 2 Replies Last reply Reply Quote 0
          • Negalein
            Negalein Global Moderator @Meister Mopper last edited by

            @meister-mopper sagte in FF-Einsätze OÖ auswerten:

            Ja, das mag sein, aber bei geplanten Anschlägen von außen hilft die Sirene nüscht .

            das würde jetzt hier zu OT werden.

            Aber noch 1x OT 😉
            Was meinst du mit "bei geplanten Anschlägen von außen hilft die Sirene nüscht"?
            Gerne auch per PN weiter.

            1 Reply Last reply Reply Quote 0
            • sigi234
              sigi234 Forum Testing Most Active @OliverIO last edited by

              @oliverio

              Ich kann mich noch erinnern als ein Sturm war da kamen Einsätze (300) im Minuten Takt rein.
              Da stürzte das Blockly dann ab. Kann man das irgendwie abfangen?

              OliverIO 1 Reply Last reply Reply Quote 0
              • Negalein
                Negalein Global Moderator @OliverIO last edited by

                @oliverio sagte in FF-Einsätze OÖ auswerten:

                man könnte das gedächtnis in einen datenpunkt verlagern. dann überlebt dies auch den neustart eines skripts

                Das wäre sicher eine Überlegung wert. 🙂

                OliverIO 1 Reply Last reply Reply Quote 1
                • OliverIO
                  OliverIO @sigi234 last edited by

                  @sigi234 sagte in FF-Einsätze OÖ auswerten:

                  Ich kann mich noch erinnern als ein Sturm war da kamen Einsätze (300) im Minuten Takt rein.
                  Da stürzte das Blockly dann ab. Kann man das irgendwie abfangen?

                  du fragst ja eigentlich nur alle 30 sekunden oder größer ab.
                  auch wenn es 1000 gemeldete einsätze gibt, dürfte es kein problem mit absturz oder speicher geben.
                  wenn, dann irgendeine code-konstellation, die nicht vorgesehen ist. aber wir haben da gar nicht soviel drin. evtl mal, das sich im quelldatenformat was ändert

                  einen fehler findest du dann im iobroker log

                  1 Reply Last reply Reply Quote 1
                  • OliverIO
                    OliverIO @Negalein last edited by OliverIO

                    @negalein sagte in FF-Einsätze OÖ auswerten:

                    speichern der bereits gemeldeten einsätze in einem datenpunkt
                    Das wäre sicher eine Überlegung wert

                    ziemlich am anfang (zeile 3) folgendes einfügen

                    let savedEinsaetzeDP = "0_userdata.a";
                    

                    die folgende zeile, auch am anfang, bitte löschen

                    let einsaetzeGesendet ....
                    

                    folgende funktion bitte tauschen

                    async function prepareMessages(einsaetze, kurz, alle) {
                        let messages = [];
                        const dateOptions = {
                            weekday: "long",
                        };
                        const timeOptions = { hour: "2-digit", minute: "2-digit" };
                        let data = await getStateAsync(savedEinsaetzeDP);
                        let einsaetzeGesendet = JSON.parse(data.val || "[]");
                        einsaetze.map(einsatz => {
                            if (!einsaetzeGesendet.some(el => el.id == einsatz.id) || alle) {
                                //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, ';', 'Bezirk ', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join(''));
                                }
                                einsaetzeGesendet.push({ id: einsatz.id, time: new Date() });
                            }
                        })
                        await setStateAsync(savedEinsaetzeDP, JSON.stringify(einsaetzeGesendet));
                        return messages.join(";");
                    }
                    
                    

                    da prepareMessage nun eine async funktion ist, muss an jeder stelle wo diese aufgerufen wird nun await hinzugefügt werden. also so wie folgt
                    vorher

                    let messages = prepareMessages(einsaetze, false, false);
                    

                    nachher

                    let messages = await prepareMessages(einsaetze, false, false);
                    

                    falls irgendwas nicht funktioniert, bitte dann nochmal deinen kompletten code posten

                    Negalein 1 Reply Last reply Reply Quote 0
                    • Negalein
                      Negalein Global Moderator @OliverIO last edited by

                      @oliverio sagte in FF-Einsätze OÖ auswerten:

                      nachher

                      bei mir 1x

                      so richtig, denke ich

                      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 = await prepareMessages(einsaetze_bezirk, false, false);
                          //messages = await 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@nega.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);	
                      

                      let savedEinsaetzeDP = "0_userdata.a"; --> String?

                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @Negalein last edited by OliverIO

                        @negalein

                        ich habe gerade nochmal aktualisiert, bitte den code nochmal von oben kopieren

                        let savedEinsaetzeDP = "0_userdata.a"; --> String?

                        ja

                        bei mir 1x
                        so richtig, denke ich

                        ja

                        Negalein 1 Reply Last reply Reply Quote 0
                        • Negalein
                          Negalein Global Moderator @OliverIO last edited by

                          @oliverio sagte in FF-Einsätze OÖ auswerten:

                          ich habe gerade nochmal aktualisiert, bitte den code nochmal von oben kopieren

                          Danke, funktioniert.

                          Der neue DP wird beschrieben. 🙂

                          sigi234 1 Reply Last reply Reply Quote 0
                          • sigi234
                            sigi234 Forum Testing Most Active @Negalein last edited by

                            @negalein sagte in FF-Einsätze OÖ auswerten:

                            @oliverio sagte in FF-Einsätze OÖ auswerten:

                            ich habe gerade nochmal aktualisiert, bitte den code nochmal von oben kopieren

                            Danke, funktioniert.

                            Der neue DP wird beschrieben. 🙂

                            Kannst du den aktuellen Code mal raufladen?

                            Negalein 1 Reply Last reply Reply Quote 0
                            • sigi234
                              sigi234 Forum Testing Most Active @OliverIO last edited by sigi234

                              @oliverio sagte in FF-Einsätze OÖ auswerten:

                              Aktuell wird nur eine rohe html Tabelle ausgegeben.

                              Kann man es auch als JSON-Table ausgeben?

                              Edit:

                              So wie bei Lebensmittelwarnung

                              1 Reply Last reply Reply Quote 0
                              • Negalein
                                Negalein Global Moderator @sigi234 last edited by

                                @sigi234 sagte in FF-Einsätze OÖ auswerten:

                                Kannst du den aktuellen Code mal raufladen?

                                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 savedEinsaetzeDP = "0_userdata.0.FF-Einsatz.Await";
                                 
                                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;
                                }
                                async function prepareMessages(einsaetze, kurz, alle) {
                                    let messages = [];
                                    const dateOptions = {
                                        weekday: "long",
                                    };
                                    const timeOptions = { hour: "2-digit", minute: "2-digit" };
                                    let data = await getStateAsync(savedEinsaetzeDP);
                                    let einsaetzeGesendet = JSON.parse(data.val || "[]");
                                    einsaetze.map(einsatz => {
                                        if (!einsaetzeGesendet.some(el => el.id == einsatz.id) || alle) {
                                            //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, ';', 'Bezirk ', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join(''));
                                            }
                                            einsaetzeGesendet.push({ id: einsatz.id, time: new Date() });
                                        }
                                    })
                                    await setStateAsync(savedEinsaetzeDP, JSON.stringify(einsaetzeGesendet));
                                    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.xxxxxxxxxx.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 = await prepareMessages(einsaetze_bezirk, false, false);
                                    //messages = await 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@xxxxxxxxx.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('*/30 * * * * *',main)
                                
                                

                                Ausgabe schaut so aus:

                                Achtung
                                Feuerwehreinsatz in xxxxxx
                                Alarmstufe 0
                                Verkehrsunfall Aufräumarbeiten
                                Bezirk xxxxxx
                                Anzahl Feuerwehren 2

                                1 Reply Last reply Reply Quote 1
                                • Negalein
                                  Negalein Global Moderator last edited by

                                  @OliverIO

                                  kann man den Log abschalten?
                                  Wird sonst immer so 40 MB/Tag groß.

                                  Also, dass nicht immer zB so ins Log geschrieben wird.

                                  javascript.0 2024-09-17 19:46:00.316	info	script.js.Feuerwehr.FF-Alarm: <table> <tr> <th>Alarmstufe</th> <th>Alarmtext</th> <th>Einheiten</th> <th>EAREA</th> <th>lat</th> <th>lng</th> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Aurach am Hongar (50405)</td> <td>Aurach am Hongar</td> <td>47.9502</td> <td>13.6698</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Perwang am Grabensee (33215)</td> <td>Perwang am Grabensee</td> <td>48.009</td> <td>13.0879</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Hackenbuch (SD) (45306)</td> <td>St. Marienkirchen bei Schärding</td> <td>48.3879</td> <td>13.4698</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Neukirchen (36214)</td> <td>Altmünster</td> <td>47.8738</td> <td>13.7073</td> </tr> <tr> <td>0</td> <td>Sirenenprogramm FEUER von FW ausgelöst</td> <td>Feuerwehr/Florian Saxen (42110)</td> <td>Saxen</td> <td>48.2057</td> <td>14.793</td> </tr> <tr> <td>0</td> <td>Verkehrsunfall Aufräumarbeiten</td> <td>Feuerwehr/Florian Baumgartenberg (42304)</td> <td>Baumgartenberg</td> <td>48.2152</td> <td>14.7436</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Vöcklamarkt (50142)</td> <td>Vöcklamarkt</td> <td>48.0032</td> <td>13.4918</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Palting (33214)</td> <td>Palting</td> <td>48.0149</td> <td>13.1281</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Sankt Wolfgang im Salzkammergut (36118)</td> <td>St. Wolfgang im Salzkammergut</td> <td>47.7391</td> <td>13.4478</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Pupping (34116)</td> <td>Pupping</td> <td>48.3155</td> <td>14.0454</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Grieskirchen (37104)</td> <td>Grieskirchen</td> <td>48.2362</td> <td>13.8166</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Neukirchen bei Lambach (51112)</td> <td>Neukirchen bei Lambach</td> <td>48.1026</td> <td>13.8145</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Tal (37321)</td> <td>Natternbach</td> <td>48.4331</td> <td>13.7216</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Luftenberg an der Donau (42208)</td> <td>Luftenberg an der Donau</td> <td>48.2735</td> <td>14.429</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Lasberg (35112)</td> <td>Lasberg</td> <td>48.4737</td> <td>14.5302</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Dimbach (42102)</td> <td>Dimbach</td> <td>48.3037</td> <td>14.905</td> </tr> <tr> <td>0</td> <td>Keller überflutet</td> <td>Feuerwehr/Florian Pfaffstätt (33216)</td> <td>Pfaffstätt</td> <td>48.0756</td> <td>13.142</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Teichstätt (33223)</td> <td>Lengau</td> <td>48.0253</td> <td>13.2157</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Wiesen (36227)</td> <td>Pinsdorf</td> <td>47.9477</td> <td>13.7515</td> </tr> <tr> <td>0</td> <td>Keller überflutet</td> <td>Feuerwehr/Florian Eggelsberg (33402)</td> <td>Eggelsberg</td> <td>48.0736</td> <td>12.9897</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Alkersdorf (50502)</td> <td>St. Georgen im Attergau</td> <td>47.9346</td> <td>13.5124</td> </tr> <tr> <td>0</td> <td>Keller überflutet</td> <td>Feuerwehr/Florian Perg (42312)</td> <td>Perg</td> <td>48.2449</td> <td>14.6356</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Treffling (49315)</td> <td>Engerwitzdorf</td> <td>48.3353</td> <td>14.385</td> </tr> <tr> <td>0</td> <td>Ölaustritt Gewässer</td> <td>Feuerwehr/Florian Offenhausen (51113)</td> <td>Offenhausen</td> <td>48.1546</td> <td>13.8355</td> </tr> <tr> <td>0</td> <td>Ölspur/Ölaustritt</td> <td>Feuerwehr/Florian Reindlmühl (36219)</td> <td>Altmünster</td> <td>47.8962</td> <td>13.7141</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Wirling (36120)</td> <td>St. Wolfgang im Salzkammergut</td> <td>47.7251</td> <td>13.5529</td> </tr> <tr> <td>0</td> <td>Gebäude überflutet</td> <td>Feuerwehr/Florian Kefermarkt (35109)</td> <td>Kefermarkt</td> <td>48.4391</td> <td>14.5384</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Moosbach (33310)</td> <td>Moosbach</td> <td>48.2068</td> <td>13.1639</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Dietrichschlag (49105)</td> <td>Bad Leonfelden</td> <td>48.4954</td> <td>14.2803</td> </tr> <tr> <td>0</td> <td>Überflutete Fahrbahn</td> <td>Feuerwehr/Florian Pichl bei Wels (51217)</td> <td>Pichl bei Wels</td> <td>48.186</td> <td>13.9001</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Steegen (37319)</td> <td>Steegen</td> <td>48.3413</td> <td>13.7654</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Steyr Zug 2 Steyrdorf (47102)</td> <td>Steyr</td> <td>48.044</td> <td>14.4147</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Holzleiten im Machland (42305)</td> <td>Naarn im Machlande</td> <td>48.1965</td> <td>14.6528</td> </tr> <tr> <td>0</td> <td>Einsatz od. Einsatzübung</td> <td>Feuerwehr/Florian Attnang (50404)</td> <td>Attnang-Puchheim</td> <td>48.0164</td> <td>13.7192</td> </tr> </table>
                                  

                                  PS: Kaffee ist nicht vergessen 😉

                                  OliverIO 1 Reply Last reply Reply Quote 0
                                  • OliverIO
                                    OliverIO @Negalein last edited by

                                    @negalein

                                    ja, alle zeilen mit console.log einfach auskommentieren

                                    vorher

                                    console.log(....
                                    

                                    nachher

                                    //console.log(....
                                    
                                    Negalein 1 Reply Last reply Reply Quote 0
                                    • Negalein
                                      Negalein Global Moderator @OliverIO last edited by

                                      @oliverio

                                      Danke

                                      1 Reply Last reply Reply Quote 0
                                      • Negalein
                                        Negalein Global Moderator last edited by

                                        Hallo Oliver!

                                        Ist es möglich, dies noch zu implementieren (in Alexa, Telegram und Email).

                                        <einheiten>
                                        <einheit id="410314">Feuerwehr/Florian Maasbach (45314)</einheit>
                                        </einheiten>

                                        Aber nur den Namen davon.
                                        Im Beispiel also Feuerwehr/Florian Maasbach

                                        OliverIO 1 Reply Last reply Reply Quote 0
                                        • OliverIO
                                          OliverIO @Negalein last edited by

                                          @negalein
                                          Klar
                                          Poste bitte mal deinen letzten skriptstand
                                          Dann kann ich morgen/übermorgen mal schauen
                                          Ist nix großes

                                          Negalein 1 Reply Last reply Reply Quote 0
                                          • Negalein
                                            Negalein Global Moderator @OliverIO last edited by

                                            @oliverio sagte in FF-Einsätze OÖ auswerten:

                                            Poste bitte mal deinen letzten skriptstand

                                            Danke

                                            Ah und noch was.

                                            wie hier zu sehn, werde Eggerding mit den Abschnitten `Maasbach, Hof, ...) alarmiert.
                                            Sind dann 4 Meldungen hintereinander.
                                            Kann man in so einem Fall dies auf 1 Zusammenfassen?

                                            zB so:

                                            Achtung
                                            Feuerwehreinsatz in Eggerding
                                            Alarmstufe 0
                                            Einsatz od. Einsatzübung
                                            Einheit Hof, Maasbach, Vollmannsdorf, Eggerding
                                            Bezirk Schärding
                                            Anzahl Feuerwehren 1

                                            86e22dab-8c8d-4845-8aea-4de18ef821e9-image.png

                                            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 savedEinsaetzeDP = "0_userdata.0.FF-Einsatz.Await";
                                             
                                            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;
                                            }
                                            async function prepareMessages(einsaetze, kurz, alle) {
                                                let messages = [];
                                                const dateOptions = {
                                                    weekday: "long",
                                                };
                                                const timeOptions = { hour: "2-digit", minute: "2-digit" };
                                                let data = await getStateAsync(savedEinsaetzeDP);
                                                let einsaetzeGesendet = JSON.parse(data.val || "[]");
                                                einsaetze.map(einsatz => {
                                                    if (!einsaetzeGesendet.some(el => el.id == einsatz.id) || alle) {
                                                        //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, ';', 'Bezirk ', einsatz.bezirk_name, ';Anzahl Feuerwehren ', einsatz.einheiten.length, ';'].join(''));
                                                        }
                                                        einsaetzeGesendet.push({ id: einsatz.id, time: new Date() });
                                                    }
                                                })
                                                await setStateAsync(savedEinsaetzeDP, JSON.stringify(einsaetzeGesendet));
                                                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.xxxxxxxxxxx.Commands.speak-volume', lautstaerke);
                                                setState('alexa2.0.Echo-Devices.xxxxxxxxxxx.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, [xxxxx, xxxxxx]);
                                                let einsaetze_bezirk = filterBezirk(einsaetze,xx);
                                                let html1 = toHtml(einsaetze_einheiten);
                                                let html2 = toHtml(einsaetze_bezirk);
                                                let html3 = toHtml(einsaetze);
                                                let messages = await prepareMessages(einsaetze_bezirk, false, false);
                                                //messages = await 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, "xxxxxxx@xxxxxx.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('*/30 * * * * *',main)
                                            

                                            OliverIO Negalein 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            904
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            115
                                            6405
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo