Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. #Stauerkennung #DieAutobahn

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    876

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

#Stauerkennung #DieAutobahn

Geplant Angeheftet Gesperrt Verschoben JavaScript
54 Beiträge 9 Kommentatoren 1.1k Aufrufe 11 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    peterfido
    schrieb am zuletzt editiert von
    #6

    Dann ergänzen, welche Infos da rein sollen weiß ich nicht.

    Grundsätzlich zum Triggern per Datenpunkt:

    // Im Kopf vom Skript
    const idDatenpunkt="0_userdata.0.AlexaRoutineVerkehr";
    
    createState(idDatenpunkt, 0, false, { // Datenpunkt wird angelegt
      name: 'Verkehrsmeldung',
      desc: 'Alexa Morgenroutine',
      type: 'string',
      unit: '',
      role: 'value',
      def: "",
    });
    // Jetzt das Skript hier einfügen
    
    
    
    //Nach ganz unten zu den Triggern, damit die zum besser Auffinden zusammen sind
    on({id: idDatenpunkt, change:'any'}, function (dp) {
      console.log("Alexa Verkehrsroutine aufgerufen");
    //  mach was mit den Daten?
    
      checkTraffic();
    });
    
    

    Gruß

    Peterfido


    Proxmox auf Intel NUC12WSHi5
    ioBroker: Debian (VM)
    CCU: Debmatic (VM)
    Influx: Debian (VM)
    Grafana: Debian (VM)
    eBus: Debian (VM)
    Zigbee: Debian (VM) mit zigbee2mqtt

    P H 2 Antworten Letzte Antwort
    0
    • P peterfido

      Dann ergänzen, welche Infos da rein sollen weiß ich nicht.

      Grundsätzlich zum Triggern per Datenpunkt:

      // Im Kopf vom Skript
      const idDatenpunkt="0_userdata.0.AlexaRoutineVerkehr";
      
      createState(idDatenpunkt, 0, false, { // Datenpunkt wird angelegt
        name: 'Verkehrsmeldung',
        desc: 'Alexa Morgenroutine',
        type: 'string',
        unit: '',
        role: 'value',
        def: "",
      });
      // Jetzt das Skript hier einfügen
      
      
      
      //Nach ganz unten zu den Triggern, damit die zum besser Auffinden zusammen sind
      on({id: idDatenpunkt, change:'any'}, function (dp) {
        console.log("Alexa Verkehrsroutine aufgerufen");
      //  mach was mit den Daten?
      
        checkTraffic();
      });
      
      

      P Offline
      P Offline
      peterfido
      schrieb am zuletzt editiert von peterfido
      #7

      Doppelpost und finde den Löschen-Button nicht

      Gruß

      Peterfido


      Proxmox auf Intel NUC12WSHi5
      ioBroker: Debian (VM)
      CCU: Debmatic (VM)
      Influx: Debian (VM)
      Grafana: Debian (VM)
      eBus: Debian (VM)
      Zigbee: Debian (VM) mit zigbee2mqtt

      1 Antwort Letzte Antwort
      0
      • P peterfido

        Dann ergänzen, welche Infos da rein sollen weiß ich nicht.

        Grundsätzlich zum Triggern per Datenpunkt:

        // Im Kopf vom Skript
        const idDatenpunkt="0_userdata.0.AlexaRoutineVerkehr";
        
        createState(idDatenpunkt, 0, false, { // Datenpunkt wird angelegt
          name: 'Verkehrsmeldung',
          desc: 'Alexa Morgenroutine',
          type: 'string',
          unit: '',
          role: 'value',
          def: "",
        });
        // Jetzt das Skript hier einfügen
        
        
        
        //Nach ganz unten zu den Triggern, damit die zum besser Auffinden zusammen sind
        on({id: idDatenpunkt, change:'any'}, function (dp) {
          console.log("Alexa Verkehrsroutine aufgerufen");
        //  mach was mit den Daten?
        
          checkTraffic();
        });
        
        

        H Offline
        H Offline
        Hotze
        schrieb am zuletzt editiert von Hotze
        #8

        Das ist eine gute Idee! Ich habe das mal versucht umzusetzen und noch Schalter eingebaut falls einer einen teil des Scripts nicht benötigt:

        // =========================
        // Konfiguration
        // =========================
        
        const roadId = "A45";  
        
        // Bereichsdefinition
        const coordsArea = {
           minLat: 50.6181514,
           maxLat: 51.3742993,
           minLon: 7.2582769,
           maxLon: 8.3822071
        };
        
        // Schalter
        const telegramEnabled     = 1;   // 1 = Telegram senden, 0 = keine Nachrichten
        const alexaEnabled        = 1;   // 1 = Alexa-Routine Trigger aktiv, 0 = ignorieren
        const verkehrsstoerungDP  = 1;   // 1 = Datenpunkt "Verkehrsstörung" anlegen/befüllen, 0 = ignorieren
        
        // Telegram-Konfiguration
        const telegramInstance = "telegram.0";   // deine Telegram-Adapter-Instanz
        const telegramChatId   = 123456789;      // deine Chat-ID
        
        // Alexa-Routine Datenpunkt
        const idDatenpunkt = "0_userdata.0.AlexaRoutineVerkehr";
        
        // Datenpunkt nur anlegen, wenn Schalter aktiv ist
        if (verkehrsstoerungDP === 1) {
           createState(idDatenpunkt, "", false, {
             name: 'Verkehrsmeldung',
             desc: 'Alexa Morgenroutine',
             type: 'string',
             unit: '',
             role: 'value',
             def: ""
           });
        }
        
        // API-URL
        const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
        
        // =========================
        // Hilfsfunktionen
        // =========================
        
        function isInArea(lat, lon, area) {
           return (
               lat >= area.minLat &&
               lat <= area.maxLat &&
               lon >= area.minLon &&
               lon <= area.maxLon
           );
        }
        
        function warningHitsArea(warning, area) {
           if (warning.coordinate && typeof warning.coordinate.lat === "number" && typeof warning.coordinate.long === "number") {
               if (isInArea(warning.coordinate.lat, warning.coordinate.long, area)) {
                   return true;
               }
           }
           if (warning.geometry && Array.isArray(warning.geometry.coordinates)) {
               for (const coord of warning.geometry.coordinates) {
                   if (Array.isArray(coord) && coord.length >= 2) {
                       const lon = coord[0];
                       const lat = coord[1];
                       if (isInArea(lat, lon, area)) return true;
                   }
               }
           }
           return false;
        }
        
        function buildDescriptionText(descriptionField) {
           if (Array.isArray(descriptionField)) {
               return descriptionField
                   .filter(d => d && String(d).trim() !== "")
                   .join("\n");
           }
           return String(descriptionField || "").trim();
        }
        
        // =========================
        // Hauptlogik
        // =========================
        
        async function checkTraffic() {
           try {
               console.log("Hole Daten von:", url);
        
               const axios = require("axios");
               const response = await axios.get(url);
               const data = response.data;
        
               const warnings = data.warnings || data.warning;
        
               if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                   console.log(`Keine Warnungen auf ${roadId}`);
                   if (verkehrsstoerungDP === 1) setState(idDatenpunkt, "Keine Warnungen auf " + roadId);
                   return;
               }
        
               const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
        
               if (relevant.length === 0) {
                   console.log(`Keine Warnungen im definierten Bereich auf ${roadId}`);
                   if (verkehrsstoerungDP === 1) setState(idDatenpunkt, "Keine Warnungen im Bereich auf " + roadId);
                   return;
               }
        
               console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
        
               let summary = "";
               for (const warning of relevant) {
                   const descText = buildDescriptionText(warning.description);
                   const msg = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                   summary += msg + "\n\n";
        
                   if (telegramEnabled === 1) {
                       console.log("Sende Nachricht:", msg);
                       sendTo(telegramInstance, "send", {
                           chatId: telegramChatId,
                           text: msg
                       });
                   }
               }
        
               if (verkehrsstoerungDP === 1) {
                   setState(idDatenpunkt, summary.trim());
               }
        
           } catch (err) {
               console.error("Fehler beim Abruf:", err.message, err.stack);
               if (telegramEnabled === 1) {
                   sendTo(telegramInstance, "send", {
                       chatId: telegramChatId,
                       text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err.message}`
                   });
               }
               if (verkehrsstoerungDP === 1) {
                   setState(idDatenpunkt, "Fehler beim Abruf der Verkehrsdaten");
               }
           }
        }
        
        // =========================
        // Trigger
        // =========================
        
        // alle 15 Minuten prüfen
        schedule("*/15 * * * *", checkTraffic);
        
        // Trigger für Alexa-Routine nur wenn aktiviert
        if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
           on({id: idDatenpunkt, change:'any'}, function (dp) {
             console.log("Alexa Verkehrsroutine aufgerufen");
             checkTraffic();
           });
        }
        
        

        Da ich keine Alexa habe kann ich es nicht testen! Somit muss das von jemand anderem verfeinert werden ;-)
        Damit die Alexa direkt vorlesen kann ist es ein einfacher Text.
        Hier ein Beispieltext Mit zwei Meldungen in einem Bereich:


        ⚠️ Störung auf A45:
        A45 | Lüdenscheid - Lüdenscheid
        Beginn: 16.12.25 um 10:27 Uhr
        Im Stillstand
        Durchschnittsgeschwindigkeit: 3 km/h

        ⚠️ Störung auf A45:
        A45 | Schwerte-Ergste - Dortmund-Süd
        Beginn: 16.12.25 um 09:45 Uhr
        Langsamer Verkehr
        Reisezeitverlust: 2 Minuten
        Durchschnittsgeschwindigkeit: 40 km/h

        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          peterfido
          schrieb am zuletzt editiert von peterfido
          #9

          Ich habe noch nie ein if() vor ein on() gesetzt. Immer erst das on() und dann if(), wenn nötig. Den Datenpunkt legt man immer an, bzw. wird der einmalig angelegt, wenn es ihn noch nicht gibt. Ich sehe da noch mehr Optimierungsmöglichkeiten.

          Gruß

          Peterfido


          Proxmox auf Intel NUC12WSHi5
          ioBroker: Debian (VM)
          CCU: Debmatic (VM)
          Influx: Debian (VM)
          Grafana: Debian (VM)
          eBus: Debian (VM)
          Zigbee: Debian (VM) mit zigbee2mqtt

          H 1 Antwort Letzte Antwort
          0
          • P peterfido

            Ich habe noch nie ein if() vor ein on() gesetzt. Immer erst das on() und dann if(), wenn nötig. Den Datenpunkt legt man immer an, bzw. wird der einmalig angelegt, wenn es ihn noch nicht gibt. Ich sehe da noch mehr Optimierungsmöglichkeiten.

            H Offline
            H Offline
            Hotze
            schrieb am zuletzt editiert von
            #10

            Wenn es dir nichts aus macht dann poste den verbesserten Code einfach!
            Für mich reicht ja die Warnung! Ich finde toll dass du dir das so genau anschaust!

            Falls das Script, oder ein Teil davon, nur einem hilft haben wir alles richtig gemacht also:
            Immer her mit den "Optimierungsmöglichkeiten"!

            1 Antwort Letzte Antwort
            0
            • P Offline
              P Offline
              peterfido
              schrieb am zuletzt editiert von
              #11

              Coden macht am kleinen Mäusekino keinen Spaß. Für meinen Auszug oben habe ich mir heute morgen schon fast einen abgebrochen. ;)

              Gruß

              Peterfido


              Proxmox auf Intel NUC12WSHi5
              ioBroker: Debian (VM)
              CCU: Debmatic (VM)
              Influx: Debian (VM)
              Grafana: Debian (VM)
              eBus: Debian (VM)
              Zigbee: Debian (VM) mit zigbee2mqtt

              1 Antwort Letzte Antwort
              0
              • P Offline
                P Offline
                peterfido
                schrieb am zuletzt editiert von
                #12

                Ich habe mal ChatGPT und Gemini gebeten, den Code zu optimieren. Die haben zwar hier und da was verbessert, die beiden if() an der falschen Stelle jedoch auch nicht korrigiert.

                Somit warten, bis ich am größeren Rechner sitze, jemand anderes mir zuvorkommt, oder selbst noch mal kritisch drüberschauen und korrigieren.

                Gruß

                Peterfido


                Proxmox auf Intel NUC12WSHi5
                ioBroker: Debian (VM)
                CCU: Debmatic (VM)
                Influx: Debian (VM)
                Grafana: Debian (VM)
                eBus: Debian (VM)
                Zigbee: Debian (VM) mit zigbee2mqtt

                H 1 Antwort Letzte Antwort
                0
                • P peterfido

                  Ich habe mal ChatGPT und Gemini gebeten, den Code zu optimieren. Die haben zwar hier und da was verbessert, die beiden if() an der falschen Stelle jedoch auch nicht korrigiert.

                  Somit warten, bis ich am größeren Rechner sitze, jemand anderes mir zuvorkommt, oder selbst noch mal kritisch drüberschauen und korrigieren.

                  H Offline
                  H Offline
                  Hotze
                  schrieb am zuletzt editiert von Hotze
                  #13

                  Der Gedanke ist:
                  Der Listener "on()" wird nur angelegt, wenn die Bedingung erfüllt ist.
                  Das heißt: wenn alexaEnabled oder verkehrsstoerungDP auf 0 stehen, existiert der Trigger gar nicht.
                  Also keine unnötigen Listener im System.
                  Falls jemand später die Schalter im laufenden Betrieb ändert, wird der Trigger nicht automatisch neu angelegt, weil das if nur beim Start des Skripts ausgewertet wird. Das macht doch kaum einer, oder?

                  Andere Variante:

                  on({id: idDatenpunkt, change:'any'}, function (dp) {
                    if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
                      console.log("Alexa Verkehrsroutine aufgerufen");
                      checkTraffic();
                    }
                  });
                  
                  

                  Hier wird der Listener immer angelegt, aber er macht nur etwas, wenn die Schalter aktiv sind.
                  flexibler, weil man die Schalter auch zur Laufzeit ändern kann.
                  Aber es hängt immer ein Listener am Datenpunkt, auch wenn du ihn eigentlich gar nicht brauchst.

                  Meintest du das?

                  1 Antwort Letzte Antwort
                  0
                  • P Offline
                    P Offline
                    peterfido
                    schrieb am zuletzt editiert von
                    #14

                    Ja, genau. Und createState gehört nicht in ein if() Konstrukt.

                    Gruß

                    Peterfido


                    Proxmox auf Intel NUC12WSHi5
                    ioBroker: Debian (VM)
                    CCU: Debmatic (VM)
                    Influx: Debian (VM)
                    Grafana: Debian (VM)
                    eBus: Debian (VM)
                    Zigbee: Debian (VM) mit zigbee2mqtt

                    1 Antwort Letzte Antwort
                    0
                    • H Offline
                      H Offline
                      Hotze
                      schrieb am zuletzt editiert von
                      #15

                      Wenn der Datenpunkt nicht benötigt wird (const verkehrsstoerungDP = 0), wird er nicht angelegt. Ansonsten läge ein toter Datenpunkt herum.
                      Mir war nicht bewusst was es für Regeln gibt! Bisher war ich der Auffassung: Wer trifft hat recht!
                      Aber wie gesagt: einfach ändern und posten, dann kann jeder das für sich passende raus suchen und man hat eine Versionierung nach Datum.
                      Frei nach dem Motto: "Teste mal das script aus Antwort #8!"

                      1 Antwort Letzte Antwort
                      0
                      • P Offline
                        P Offline
                        peterfido
                        schrieb am zuletzt editiert von
                        #16

                        OK, verstehe. Du meinst, wenn ein Anwender ohne Datenpunkte arbeiten will, soll es Ressourcen sparen. Ob ein Eventlistener hinter einem if() läuft, habe ich nie probiert. Vielleicht können die Profis hier was dazu sagen.

                        Gruß

                        Peterfido


                        Proxmox auf Intel NUC12WSHi5
                        ioBroker: Debian (VM)
                        CCU: Debmatic (VM)
                        Influx: Debian (VM)
                        Grafana: Debian (VM)
                        eBus: Debian (VM)
                        Zigbee: Debian (VM) mit zigbee2mqtt

                        1 Antwort Letzte Antwort
                        0
                        • R Offline
                          R Offline
                          Rushmed
                          Most Active
                          schrieb am zuletzt editiert von
                          #17

                          @peterfido @hotze

                          Vielen Dank für die Ergänzugen.
                          Das mit Alexa war nur ein Besispiel. Der Datenpunkt und die Kommentare im Script sollen keinen Alexa Bezug haben. Ein selbst wählbarer DP der als Wert die Staumeldungen für meinen definierten Bereich enthält reich völlig. Damit kann ich dann umgehen und würde auch die Telegram Integration im JS Adapter erledigen.

                          Ich weiß nicht welche infos in den DP sollen. Seit Testbeginn hatte ich wohl noch keine Störung auf der gewählten AB im gewählten Bereich.
                          Logmeldungen erscheinen schonmal:

                          
                          javascript.0
                          2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Keine Warnungen im definierten Bereich auf A4
                          
                          javascript.0
                          2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Warnung: A4 | Görlitz - Görlitz | Koordinate: 51.19872170096459, 14.960901000619456 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Warnung: A4 | Kodersdorf - Ludwigsdorf | Koordinate: 51.19872170096459, 14.960901000619456 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.173	info	script.js.aaa_Staumelder: Warnung: A4 | Königshainer Berge - Königshainer Berge | Koordinate: 51.203233847771706, 14.759957057504197 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.173	info	script.js.aaa_Staumelder: Warnung: A4 | Nieder Seifersdorf - Königshainer Berge | Koordinate: 51.2032281716645, 14.760124784338583 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.172	info	script.js.aaa_Staumelder: Warnung: A4 | Willrodaer Forst - Erfurt-Vieselbach | Koordinate: 50.925375315043865, 11.136412592086435 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.170	info	script.js.aaa_Staumelder: Warnung: A4 | Bad Hersfeld - Friedewald | Koordinate: 50.85349478866353, 9.722682387354707 | HitsArea: false
                          
                          javascript.0
                          2025-12-18 21:00:00.028	info	script.js.aaa_Staumelder: Hole Daten von:
                          

                          Sieht plausiebel aus.

                          Sind die Logdaten alle die verfügbar sind? Interessant wäre die Verzögerung durch das jeweilige Ereignis und evtl. dass man die Richtung differenzieren kann. Hierfür wäre ein Zweiter DP oder generell die Ausgbe als JSON vorstellbar.

                          H 1 Antwort Letzte Antwort
                          0
                          • matze55M Offline
                            matze55M Offline
                            matze55
                            schrieb am zuletzt editiert von matze55
                            #18

                            Interesserhalber...zeig mal nen video..oder bilder (wenn verfügbar).....obwohl ich keine Rennbahn habe.
                            Was mit dem Iobroker möglich ist...staune

                            Homematic CCU3,-Synology NAS 4TB,- 2 Sonos One,- Gigabyte N4500 8GB DDR4 2TB
                            Tapo C210 Cam
                            WLED Steuerung über lcdwiki

                            1 Antwort Letzte Antwort
                            0
                            • R Offline
                              R Offline
                              Rushmed
                              Most Active
                              schrieb am zuletzt editiert von
                              #19

                              Bin ich gemeint?

                              1 Antwort Letzte Antwort
                              0
                              • H Hotze

                                Hallo Zusammen,

                                als ich heute morgen im Stau stand habe ich mich natürlich wieder geärgert!
                                Ich habe einige Adapter mit verschiedenen API-Keys getestet und manche laufen dann aus und geht wieder nichts mehr.
                                Dann habe ich mich selber daran gemacht ein Script zu entwickeln. Einen Adapter schreiben kann ich nicht, Respekt an alle die das können.
                                Aber ich kann mein Script zur Verfügung stellen!
                                Dabei nehme ich die von uns allen bezahlten und bereitgestellten Daten und vergleiche die Koordinaten der Verkehrsmeldungen mit einem angegeben Bereich.

                                Wenn Jemand daraus einen Adapter machen kann wäre das natürlich super!
                                Auch eine Erweiterung auf mehrere Bereiche ist leicht umzusetzen

                                Hier die Anleitung der Autobahn App API

                                In meinem Script müsst Ihr unter der Konfiguration:

                                • Eure Autobahn angeben (Im Beispiel A45)

                                • Eure Telegram instanz angeben (Im Beispiel telegram.0)

                                • Eure ChatID angeben (Platzhalter im Script 123456789)

                                • Ein Koordinatenrechteck als zu überwachten Bereich erstellen:
                                  ** minLat: 50.6181514, // unten
                                  ** maxLat: 51.3742993, // oben (bis Lüdenscheid)
                                  ** minLon: 7.2582769, // links (bis Hagen/Dortmund)
                                  ** maxLon: 8.3822071 // rechts

                                • Im Aktuellen noch die Zeitfenster definieren

                                Wenn es geht nutzt bitte die aktuelle Version!


                                ALTE VERSION!

                                // =========================
                                // Konfiguration
                                // =========================
                                
                                const roadId = "A45";  
                                
                                // Bereichsdefinition (Rechteck zwischen zwei Punkten)
                                // minLat = südlichster Punkt (untere Grenze Breitengrad)
                                // maxLat = nördlichster Punkt (obere Grenze Breitengrad)
                                // minLon = westlichster Punkt (linke Grenze Längengrad)
                                // maxLon = östlichster Punkt (rechte Grenze Längengrad)
                                const coordsArea = {
                                   minLat: 50.6181514,   // unten
                                   maxLat: 51.3742993,   // oben (bis Lüdenscheid)
                                   minLon: 7.2582769,    // links (bis Hagen/Dortmund)
                                   maxLon: 8.3822071     // rechts
                                };
                                
                                // Telegram-Konfiguration
                                const telegramInstance = "telegram.0";   // deine Telegram-Adapter-Instanz
                                const telegramChatId   = 123456789;      // deine Chat-ID
                                
                                // API-URL
                                const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
                                
                                // =========================
                                // Hilfsfunktionen
                                // =========================
                                
                                function isInArea(lat, lon, area) {
                                   return (
                                       lat >= area.minLat &&
                                       lat <= area.maxLat &&
                                       lon >= area.minLon &&
                                       lon <= area.maxLon
                                   );
                                }
                                
                                function warningHitsArea(warning, area) {
                                   // Einzelpunkt-Feld "coordinate"
                                   if (warning.coordinate && typeof warning.coordinate.lat === "number" && typeof warning.coordinate.long === "number") {
                                       if (isInArea(warning.coordinate.lat, warning.coordinate.long, area)) {
                                           return true;
                                       }
                                   }
                                   // GeoJSON-Feld "geometry.coordinates" (LineString: Array von [lon, lat])
                                   if (warning.geometry && Array.isArray(warning.geometry.coordinates)) {
                                       for (const coord of warning.geometry.coordinates) {
                                           if (Array.isArray(coord) && coord.length >= 2) {
                                               const lon = coord[0];
                                               const lat = coord[1];
                                               if (isInArea(lat, lon, area)) return true;
                                           }
                                       }
                                   }
                                   return false;
                                }
                                
                                function buildDescriptionText(descriptionField) {
                                   if (Array.isArray(descriptionField)) {
                                       return descriptionField
                                           .filter(d => d && String(d).trim() !== "")
                                           .join("\n");
                                   }
                                   return String(descriptionField || "").trim();
                                }
                                
                                // =========================
                                // Hauptlogik mit Debug-Log
                                // =========================
                                
                                async function checkTraffic() {
                                   try {
                                       console.log("Hole Daten von:", url);
                                
                                       const axios = require("axios");
                                       const response = await axios.get(url);
                                       const data = response.data;
                                
                                       if (!data || !Array.isArray(data.warning) || data.warning.length === 0) {
                                           console.log(`Keine Warnungen auf ${roadId}`);
                                           return;
                                       }
                                
                                       // Debug: jede Warnung mit Koordinaten und Bereichsprüfung ausgeben
                                       data.warning.forEach(w => {
                                           const coord = w.coordinate ? `${w.coordinate.lat}, ${w.coordinate.long}` : "keine Koordinate";
                                           console.log(`Warnung: ${w.title} | Koordinate: ${coord} | HitsArea: ${warningHitsArea(w, coordsArea)}`);
                                       });
                                
                                       // Nur nach Koordinatenbereich filtern
                                       const relevant = data.warning.filter(w => warningHitsArea(w, coordsArea));
                                
                                       if (relevant.length === 0) {
                                           console.log(`Keine Warnungen im definierten Bereich auf ${roadId}`);
                                           return;
                                       }
                                
                                       console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
                                
                                       for (const warning of relevant) {
                                           const descText = buildDescriptionText(warning.description);
                                           const msg = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                                
                                           console.log("Sende Nachricht:", msg);
                                           sendTo(telegramInstance, "send", {
                                               chatId: telegramChatId,
                                               text: msg
                                           });
                                       }
                                
                                   } catch (err) {
                                       console.error("Fehler beim Abruf:", err.message, err.stack);
                                       sendTo(telegramInstance, "send", {
                                           chatId: telegramChatId,
                                           text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err.message}`
                                       });
                                   }
                                }
                                
                                // alle 15 Minuten prüfen
                                schedule("*/15 * * * *", checkTraffic);
                                
                                
                                

                                Ein erster Test ging gut, nun zerreißt mein Script in der Luft oder Verbessert es!

                                Viel Spaß und danke an alle die das Projekt "IOBroker" am Leben halten!

                                Tante Edit:
                                Code eingefügt
                                Beispiellink eingefügt:
                                https://verkehr.autobahn.de/o/autobahn/A45/services/warning

                                Hier ist die aktuelle Version!

                                bahnuhrB Online
                                bahnuhrB Online
                                bahnuhr
                                Forum Testing Most Active
                                schrieb am zuletzt editiert von
                                #20

                                @Hotze sagte in #Stauerkennung #DieAutobahn:

                                In meinem Script

                                Wo ist das Script ?

                                Oder sehe ich es nur nicht. ;-)


                                Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                Danke.
                                gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                ScreenToGif :https://www.screentogif.com/downloads.html

                                AsgothianA 1 Antwort Letzte Antwort
                                0
                                • bahnuhrB bahnuhr

                                  @Hotze sagte in #Stauerkennung #DieAutobahn:

                                  In meinem Script

                                  Wo ist das Script ?

                                  Oder sehe ich es nur nicht. ;-)

                                  AsgothianA Offline
                                  AsgothianA Offline
                                  Asgothian
                                  Developer
                                  schrieb am zuletzt editiert von
                                  #21

                                  @bahnuhr sagte in #Stauerkennung #DieAutobahn:

                                  Wo ist das Script ?

                                  Oder sehe ich es nur nicht. ;-)

                                  Erster Post, hinter dem Spoiler Button

                                  ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                                  "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                                  bahnuhrB 1 Antwort Letzte Antwort
                                  1
                                  • R Rushmed

                                    @peterfido @hotze

                                    Vielen Dank für die Ergänzugen.
                                    Das mit Alexa war nur ein Besispiel. Der Datenpunkt und die Kommentare im Script sollen keinen Alexa Bezug haben. Ein selbst wählbarer DP der als Wert die Staumeldungen für meinen definierten Bereich enthält reich völlig. Damit kann ich dann umgehen und würde auch die Telegram Integration im JS Adapter erledigen.

                                    Ich weiß nicht welche infos in den DP sollen. Seit Testbeginn hatte ich wohl noch keine Störung auf der gewählten AB im gewählten Bereich.
                                    Logmeldungen erscheinen schonmal:

                                    
                                    javascript.0
                                    2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Keine Warnungen im definierten Bereich auf A4
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Warnung: A4 | Görlitz - Görlitz | Koordinate: 51.19872170096459, 14.960901000619456 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.174	info	script.js.aaa_Staumelder: Warnung: A4 | Kodersdorf - Ludwigsdorf | Koordinate: 51.19872170096459, 14.960901000619456 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.173	info	script.js.aaa_Staumelder: Warnung: A4 | Königshainer Berge - Königshainer Berge | Koordinate: 51.203233847771706, 14.759957057504197 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.173	info	script.js.aaa_Staumelder: Warnung: A4 | Nieder Seifersdorf - Königshainer Berge | Koordinate: 51.2032281716645, 14.760124784338583 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.172	info	script.js.aaa_Staumelder: Warnung: A4 | Willrodaer Forst - Erfurt-Vieselbach | Koordinate: 50.925375315043865, 11.136412592086435 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.170	info	script.js.aaa_Staumelder: Warnung: A4 | Bad Hersfeld - Friedewald | Koordinate: 50.85349478866353, 9.722682387354707 | HitsArea: false
                                    
                                    javascript.0
                                    2025-12-18 21:00:00.028	info	script.js.aaa_Staumelder: Hole Daten von:
                                    

                                    Sieht plausiebel aus.

                                    Sind die Logdaten alle die verfügbar sind? Interessant wäre die Verzögerung durch das jeweilige Ereignis und evtl. dass man die Richtung differenzieren kann. Hierfür wäre ein Zweiter DP oder generell die Ausgbe als JSON vorstellbar.

                                    H Offline
                                    H Offline
                                    Hotze
                                    schrieb am zuletzt editiert von Hotze
                                    #22

                                    @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                    Interessant wäre die Verzögerung durch das jeweilige Ereignis

                                    Die wird nicht immer geliefert.
                                    Wenn angegeben steht das im JSON unter dem Punkt "delayTimeValue".
                                    Klick mal hier! Das ist ein JSON der A1


                                    @bahnuhr sagte in #Stauerkennung #DieAutobahn:

                                    Oder sehe ich es nur nicht. ;-)

                                    Habe ich im Spoiler, die Version mit Alexa und Datenpunkt ist in Post #8 "versteckt".
                                    Unten an diesem Post ist noch eine Version im Spoiler.


                                    @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                    Der Datenpunkt und die Kommentare im Script sollen keinen Alexa Bezug haben.

                                    Wenn jemand Alexa nutzt muss sie etwas zum vorlesen haben (plainText), da kam der Datenpunkt her.
                                    Das ist aber gleich dem Text den man als Nachricht bekommen würde.
                                    Ein Beispieltext ist in Post #8.

                                    Ich habe noch einen Version unten der neue Datenpunkt sollte etwa so aussehen:

                                    [
                                     {
                                       "road": "A45",
                                       "title": "A45 | Lüdenscheid - Lüdenscheid",
                                       "description": "Im Stillstand\nDurchschnittsgeschwindigkeit: 3 km/h",
                                       "start": "2025-12-16T10:27:00Z",
                                       "type": "STATIONARY_TRAFFIC",
                                       "coordinate": {
                                         "lat": 51.219,
                                         "long": 7.629
                                       }
                                     },
                                     {
                                       "road": "A45",
                                       "title": "A45 | Schwerte-Ergste - Dortmund-Süd",
                                       "description": "Langsamer Verkehr\nReisezeitverlust: 2 Minuten\nDurchschnittsgeschwindigkeit: 40 km/h",
                                       "start": "2025-12-16T09:45:00Z",
                                       "type": "SLOW_TRAFFIC",
                                       "coordinate": {
                                         "lat": 51.45,
                                         "long": 7.52
                                       }
                                     },
                                     {
                                       "road": "A45",
                                       "title": "Baustelle",
                                       "description": "Im Stillstand\nReisezeitverlust: 1 Minute\nDurchschnittsgeschwindigkeit: 16 km/h",
                                       "start": "2025-12-16T09:45:00Z",
                                       "type": "STATIONARY_TRAFFIC",
                                       "coordinate": {
                                         "lat": 51.31,
                                         "long": 7.68
                                       }
                                     }
                                    ]
                                    
                                    


                                    Hier noch eine Version, mit einem weiterem Datenpunkt als JSON und kleiner einleitenden Erklärung:

                                    // Dieses Skript überwacht Verkehrswarnungen auf der A45 über die Autobahn-API.
                                    // Es filtert Meldungen nach einem definierten Koordinatenbereich.
                                    // Gefundene Warnungen können per Telegram gesendet werden (schaltbar über telegramEnabled).
                                    // Zusätzlich können zwei Datenpunkte angelegt werden:
                                    //   1) Klartext für Alexa (verkehrsstoerungDP)
                                    //   2) JSON für Auswertungen (verkehrsstoerungJSONDP)
                                    // Beide Datenpunkte sind unabhängig schaltbar.
                                    // Das Skript läuft automatisch alle 15 Minuten und kann über den Alexa-Datenpunkt manuell gestartet werden.
                                    // Ziel: Frühwarnsystem für Staus und Baustellen, flexibel nutzbar für Benachrichtigung und Smart-Home-Routinen.
                                    
                                    // =========================
                                    // Konfiguration
                                    // =========================
                                    
                                    const roadId = "A45";
                                    
                                    // Bereichsdefinition
                                    const coordsArea = {
                                       minLat: 50.6181514,
                                       maxLat: 51.3742993,
                                       minLon: 7.2582769,
                                       maxLon: 8.3822071
                                    };
                                    
                                    // Schalter
                                    const telegramEnabled        = 1;   // 1 = Telegram senden, 0 = keine Nachrichten
                                    const alexaEnabled           = 1;   // 1 = Alexa-Trigger aktiv
                                    const verkehrsstoerungDP     = 1;   // 1 = Klartext-Datenpunkt aktiv
                                    const verkehrsstoerungJSONDP = 1;   // 1 = JSON-Datenpunkt aktiv
                                    
                                    // Telegram-Konfiguration
                                    const telegramInstance = "telegram.0";
                                    const telegramChatId   = 123456789;
                                    
                                    // Datenpunkte
                                    const idDatenpunkt     = "0_userdata.0.AlexaRoutineVerkehr";
                                    const idDatenpunktJSON = "0_userdata.0.AlexaRoutineVerkehr_JSON";
                                    
                                    // Datenpunkte anlegen
                                    if (verkehrsstoerungDP === 1) {
                                       createState(idDatenpunkt, "", false, {
                                           name: 'Verkehrsmeldung',
                                           desc: 'Alexa Morgenroutine',
                                           type: 'string',
                                           role: 'value'
                                       });
                                    }
                                    
                                    if (verkehrsstoerungJSONDP === 1) {
                                       createState(idDatenpunktJSON, "[]", false, {
                                           name: 'Verkehrsmeldung JSON',
                                           desc: 'JSON für Auswertung',
                                           type: 'string',
                                           role: 'json'
                                       });
                                    }
                                    
                                    // API-URL
                                    const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
                                    
                                    // =========================
                                    // Hilfsfunktionen
                                    // =========================
                                    
                                    function isInArea(lat, lon, area) {
                                       return (
                                           lat >= area.minLat &&
                                           lat <= area.maxLat &&
                                           lon >= area.minLon &&
                                           lon <= area.maxLon
                                       );
                                    }
                                    
                                    function warningHitsArea(warning, area) {
                                       if (warning.coordinate && typeof warning.coordinate.lat === "number" && typeof warning.coordinate.long === "number") {
                                           if (isInArea(warning.coordinate.lat, warning.coordinate.long, area)) {
                                               return true;
                                           }
                                       }
                                       if (warning.geometry && Array.isArray(warning.geometry.coordinates)) {
                                           for (const coord of warning.geometry.coordinates) {
                                               if (Array.isArray(coord) && coord.length >= 2) {
                                                   const lon = coord[0];
                                                   const lat = coord[1];
                                                   if (isInArea(lat, lon, area)) return true;
                                               }
                                           }
                                       }
                                       return false;
                                    }
                                    
                                    function buildDescriptionText(descriptionField) {
                                       if (Array.isArray(descriptionField)) {
                                           return descriptionField
                                               .filter(d => d && String(d).trim() !== "")
                                               .join("\n");
                                       }
                                       return String(descriptionField || "").trim();
                                    }
                                    
                                    // =========================
                                    // Hauptlogik
                                    // =========================
                                    
                                    async function checkTraffic() {
                                       try {
                                           console.log("Hole Daten von:", url);
                                    
                                           const axios = require("axios");
                                           const response = await axios.get(url);
                                           const data = response.data;
                                    
                                           const warnings = data.warnings || data.warning;
                                    
                                           if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                                               console.log(`Keine Warnungen auf ${roadId}`);
                                    
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, "Keine Warnungen auf " + roadId);
                                    
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, "[]");
                                    
                                               return;
                                           }
                                    
                                           const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                                    
                                           if (relevant.length === 0) {
                                               console.log(`Keine Warnungen im definierten Bereich auf ${roadId}`);
                                    
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, "Keine Warnungen im Bereich auf " + roadId);
                                    
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, "[]");
                                    
                                               return;
                                           }
                                    
                                           console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
                                    
                                           let summary = "";
                                           let jsonArray = [];
                                    
                                           for (const warning of relevant) {
                                               const descText = buildDescriptionText(warning.description);
                                    
                                               const msg = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                                               summary += msg + "\n\n";
                                    
                                               jsonArray.push({
                                                   road: roadId,
                                                   title: warning.title,
                                                   description: descText,
                                                   start: warning.startTimestamp || null,
                                                   type: warning.abnormalTrafficType || null,
                                                   coordinate: warning.coordinate || null
                                               });
                                    
                                               if (telegramEnabled === 1) {
                                                   sendTo(telegramInstance, "send", {
                                                       chatId: telegramChatId,
                                                       text: msg
                                                   });
                                               }
                                           }
                                    
                                           if (verkehrsstoerungDP === 1)
                                               setState(idDatenpunkt, summary.trim());
                                    
                                           if (verkehrsstoerungJSONDP === 1)
                                               setState(idDatenpunktJSON, JSON.stringify(jsonArray, null, 2));
                                    
                                       } catch (err) {
                                           console.error("Fehler beim Abruf:", err.message);
                                    
                                           if (telegramEnabled === 1) {
                                               sendTo(telegramInstance, "send", {
                                                   chatId: telegramChatId,
                                                   text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err.message}`
                                               });
                                           }
                                    
                                           if (verkehrsstoerungDP === 1)
                                               setState(idDatenpunkt, "Fehler beim Abruf der Verkehrsdaten");
                                    
                                           if (verkehrsstoerungJSONDP === 1)
                                               setState(idDatenpunktJSON, "[]");
                                       }
                                    }
                                    
                                    // =========================
                                    // Trigger
                                    // =========================
                                    
                                    // alle 15 Minuten prüfen
                                    schedule("*/15 * * * *", checkTraffic);
                                    
                                    // Alexa-Trigger nur wenn beide Schalter aktiv sind
                                    if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
                                       on({id: idDatenpunkt, change:'any'}, function () {
                                           console.log("Alexa Verkehrsroutine aufgerufen");
                                           checkTraffic();
                                       });
                                    }
                                    
                                    

                                    Ich kann versuchen das als Link in die Nachricht einzubauen. Dann kann man auf einen Link drücken und landet in der GoogleMaps-App an der richtigen stelle.
                                    Was meint Ihr?

                                    1 Antwort Letzte Antwort
                                    0
                                    • AsgothianA Asgothian

                                      @bahnuhr sagte in #Stauerkennung #DieAutobahn:

                                      Wo ist das Script ?

                                      Oder sehe ich es nur nicht. ;-)

                                      Erster Post, hinter dem Spoiler Button

                                      bahnuhrB Online
                                      bahnuhrB Online
                                      bahnuhr
                                      Forum Testing Most Active
                                      schrieb am zuletzt editiert von
                                      #23

                                      @Asgothian sagte in #Stauerkennung #DieAutobahn:

                                      Erster Post, hinter dem Spoiler Button

                                      Ja, jetzt seh ichs auch.(doch blind gewesen)
                                      Danke.


                                      Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                      Danke.
                                      gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                      ScreenToGif :https://www.screentogif.com/downloads.html

                                      1 Antwort Letzte Antwort
                                      0
                                      • H Offline
                                        H Offline
                                        Hotze
                                        schrieb am zuletzt editiert von Hotze
                                        #24

                                        Ach! ich mach einfach!
                                        Nur Testen kann ich im Moment nicht!

                                        Also hoffe ich einfach mal das Beste:

                                        Ich glaube hier liest Alexa den Link mit, was ich nicht hören wollen würde, wenn ich eine hätte!
                                        Ich lasse das dennnoch stehen, für den fall das es jemandem gefällt!

                                        // Dieses Skript überwacht Verkehrswarnungen auf der A45 über die Autobahn-API.
                                        // Es filtert Meldungen nach einem definierten Koordinatenbereich (z. B. Aßlar bis Lüdenscheid).
                                        // Gefundene Warnungen können per Telegram gesendet werden (schaltbar über telegramEnabled).
                                        // Zusätzlich können zwei Datenpunkte angelegt werden:
                                        //   1) Klartext für Alexa (verkehrsstoerungDP)
                                        //   2) JSON für Auswertungen (verkehrsstoerungJSONDP)
                                        // Beide Datenpunkte sind unabhängig schaltbar.
                                        // Optional kann ein Google-Maps-Link erzeugt und per Telegram gesendet werden.
                                        // Das Skript läuft automatisch alle 15 Minuten und kann über den Alexa-Datenpunkt manuell gestartet werden.
                                        // Ziel: Frühwarnsystem für Staus und Baustellen, flexibel nutzbar für Benachrichtigung und Smart-Home-Routinen.
                                        
                                        // =========================
                                        // Konfiguration
                                        // =========================
                                        
                                        const roadId = "A45";
                                        
                                        // Bereichsdefinition
                                        const coordsArea = {
                                           minLat: 50.6181514,
                                           maxLat: 51.3742993,
                                           minLon: 7.2582769,
                                           maxLon: 8.3822071
                                        };
                                        
                                        // Schalter
                                        const telegramEnabled        = 1;   // 1 = Telegram senden
                                        const alexaEnabled           = 1;   // 1 = Alexa-Trigger aktiv
                                        const verkehrsstoerungDP     = 1;   // 1 = Klartext-Datenpunkt aktiv
                                        const verkehrsstoerungJSONDP = 1;   // 1 = JSON-Datenpunkt aktiv
                                        const sendMapLink            = 1;   // 1 = Google-Maps-Link mitsenden
                                        
                                        // Telegram-Konfiguration
                                        const telegramInstance = "telegram.0";
                                        const telegramChatId   = 123456789;
                                        
                                        // Datenpunkte
                                        const idDatenpunkt     = "0_userdata.0.AlexaRoutineVerkehr";
                                        const idDatenpunktJSON = "0_userdata.0.AlexaRoutineVerkehr_JSON";
                                        
                                        // Datenpunkte anlegen
                                        if (verkehrsstoerungDP === 1) {
                                           createState(idDatenpunkt, "", false, {
                                               name: 'Verkehrsmeldung',
                                               desc: 'Alexa Morgenroutine',
                                               type: 'string',
                                               role: 'value'
                                           });
                                        }
                                        
                                        if (verkehrsstoerungJSONDP === 1) {
                                           createState(idDatenpunktJSON, "[]", false, {
                                               name: 'Verkehrsmeldung JSON',
                                               desc: 'JSON für Auswertung',
                                               type: 'string',
                                               role: 'json'
                                           });
                                        }
                                        
                                        // API-URL
                                        const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
                                        
                                        // =========================
                                        // Hilfsfunktionen
                                        // =========================
                                        
                                        function isInArea(lat, lon, area) {
                                           return (
                                               lat >= area.minLat &&
                                               lat <= area.maxLat &&
                                               lon >= area.minLon &&
                                               lon <= area.maxLon
                                           );
                                        }
                                        
                                        function warningHitsArea(warning, area) {
                                           if (warning.coordinate && typeof warning.coordinate.lat === "number" && typeof warning.coordinate.long === "number") {
                                               if (isInArea(warning.coordinate.lat, warning.coordinate.long, area)) {
                                                   return true;
                                               }
                                           }
                                        
                                           if (warning.geometry && Array.isArray(warning.geometry.coordinates)) {
                                               for (const coord of warning.geometry.coordinates) {
                                                   if (Array.isArray(coord) && coord.length >= 2) {
                                                       const lon = coord[0];
                                                       const lat = coord[1];
                                                       if (isInArea(lat, lon, area)) return true;
                                                   }
                                               }
                                           }
                                        
                                           return false;
                                        }
                                        
                                        function buildDescriptionText(descriptionField) {
                                           if (Array.isArray(descriptionField)) {
                                               return descriptionField
                                                   .filter(d => d && String(d).trim() !== "")
                                                   .join("\n");
                                           }
                                           return String(descriptionField || "").trim();
                                        }
                                        
                                        // =========================
                                        // Hauptlogik
                                        // =========================
                                        
                                        async function checkTraffic() {
                                           try {
                                               console.log("Hole Daten von:", url);
                                        
                                               const axios = require("axios");
                                               const response = await axios.get(url);
                                               const data = response.data;
                                        
                                               const warnings = data.warnings || data.warning;
                                        
                                               if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                                                   console.log(`Keine Warnungen auf ${roadId}`);
                                        
                                                   if (verkehrsstoerungDP === 1)
                                                       setState(idDatenpunkt, "Keine Warnungen auf " + roadId);
                                        
                                                   if (verkehrsstoerungJSONDP === 1)
                                                       setState(idDatenpunktJSON, "[]");
                                        
                                                   return;
                                               }
                                        
                                               const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                                        
                                               if (relevant.length === 0) {
                                                   console.log(`Keine Warnungen im definierten Bereich auf ${roadId}`);
                                        
                                                   if (verkehrsstoerungDP === 1)
                                                       setState(idDatenpunkt, "Keine Warnungen im Bereich auf " + roadId);
                                        
                                                   if (verkehrsstoerungJSONDP === 1)
                                                       setState(idDatenpunktJSON, "[]");
                                        
                                                   return;
                                               }
                                        
                                               console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
                                        
                                               let summary = "";
                                               let jsonArray = [];
                                        
                                               for (const warning of relevant) {
                                                   const descText = buildDescriptionText(warning.description);
                                        
                                                   // Koordinaten extrahieren (volle Genauigkeit!)
                                                   let lat = null;
                                                   let lon = null;
                                        
                                                   if (warning.coordinate) {
                                                       lat = warning.coordinate.lat;
                                                       lon = warning.coordinate.long;
                                                   }
                                        
                                                   if (!lat && warning.point) {
                                                       const parts = warning.point.split(",");
                                                       if (parts.length === 2) {
                                                           lat = parts[0];
                                                           lon = parts[1];
                                                       }
                                                   }
                                        
                                                   // Maps-Link erzeugen
                                                   let mapLink = "";
                                                   if (sendMapLink === 1 && lat && lon) {
                                                       mapLink = `https://www.google.com/maps/@${lat},${lon},13.13z`;
                                                   }
                                        
                                                   // Nachricht für Telegram
                                                   let msg = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                                                   if (mapLink) msg += `\n\n📍 Position:\n${mapLink}`;
                                        
                                                   summary += msg + "\n\n";
                                        
                                                   // JSON-Objekt
                                                   jsonArray.push({
                                                       road: roadId,
                                                       title: warning.title,
                                                       description: descText,
                                                       start: warning.startTimestamp || null,
                                                       type: warning.abnormalTrafficType || null,
                                                       coordinate: { lat: lat, lon: lon },
                                                       mapLink: mapLink || null
                                                   });
                                        
                                                   // Telegram senden
                                                   if (telegramEnabled === 1) {
                                                       sendTo(telegramInstance, "send", {
                                                           chatId: telegramChatId,
                                                           text: msg
                                                       });
                                                   }
                                               }
                                        
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, summary.trim());
                                        
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, JSON.stringify(jsonArray, null, 2));
                                        
                                           } catch (err) {
                                               console.error("Fehler beim Abruf:", err.message);
                                        
                                               if (telegramEnabled === 1) {
                                                   sendTo(telegramInstance, "send", {
                                                       chatId: telegramChatId,
                                                       text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err.message}`
                                                   });
                                               }
                                        
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, "Fehler beim Abruf der Verkehrsdaten");
                                        
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, "[]");
                                           }
                                        }
                                        
                                        // =========================
                                        // Trigger
                                        // =========================
                                        
                                        // alle 15 Minuten prüfen
                                        schedule("*/15 * * * *", checkTraffic);
                                        
                                        // Alexa-Trigger nur wenn beide Schalter aktiv sind
                                        if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
                                           on({id: idDatenpunkt, change:'any'}, function () {
                                               console.log("Alexa Verkehrsroutine aufgerufen");
                                               checkTraffic();
                                           });
                                        }
                                        
                                        

                                        Hier sollte das nicht mehr passieren:

                                        // Dieses Skript überwacht Verkehrswarnungen auf der A45 über die Autobahn-API.
                                        // Es filtert Meldungen nach einem definierten Koordinatenbereich (z. B. Aßlar bis Lüdenscheid).
                                        // Gefundene Warnungen können per Telegram gesendet werden (telegramEnabled).
                                        // Zusätzlich können zwei Datenpunkte angelegt werden:
                                        //   1) Klartext für Alexa (verkehrsstoerungDP) – OHNE Maps-Link
                                        //   2) JSON für Auswertungen (verkehrsstoerungJSONDP) – MIT Maps-Link
                                        // Beide Datenpunkte sind unabhängig schaltbar.
                                        // Optional kann ein Google-Maps-Link erzeugt und per Telegram gesendet werden.
                                        // Das Skript läuft automatisch alle 15 Minuten und kann über den Alexa-Datenpunkt manuell gestartet werden.
                                        
                                        // =========================
                                        // Konfiguration
                                        // =========================
                                        
                                        const roadId = "A45";
                                        
                                        // Bereichsdefinition
                                        const coordsArea = {
                                           minLat: 50.6181514,
                                           maxLat: 51.3742993,
                                           minLon: 7.2582769,
                                           maxLon: 8.3822071
                                        };
                                        
                                        // Schalter
                                        const telegramEnabled        = 1;   // 1 = Telegram senden
                                        const alexaEnabled           = 1;   // 1 = Alexa-Trigger aktiv
                                        const verkehrsstoerungDP     = 1;   // 1 = Klartext-Datenpunkt aktiv
                                        const verkehrsstoerungJSONDP = 1;   // 1 = JSON-Datenpunkt aktiv
                                        const sendMapLink            = 1;   // 1 = Google-Maps-Link mitsenden
                                        
                                        // Telegram-Konfiguration
                                        const telegramInstance = "telegram.0";
                                        const telegramChatId   = 123456789;
                                        
                                        // Datenpunkte
                                        const idDatenpunkt     = "0_userdata.0.AlexaRoutineVerkehr";
                                        const idDatenpunktJSON = "0_userdata.0.AlexaRoutineVerkehr_JSON";
                                        
                                        // Datenpunkte anlegen
                                        if (verkehrsstoerungDP === 1) {
                                           createState(idDatenpunkt, "", false, {
                                               name: 'Verkehrsmeldung',
                                               desc: 'Alexa Morgenroutine',
                                               type: 'string',
                                               role: 'value'
                                           });
                                        }
                                        
                                        if (verkehrsstoerungJSONDP === 1) {
                                           createState(idDatenpunktJSON, "[]", false, {
                                               name: 'Verkehrsmeldung JSON',
                                               desc: 'JSON für Auswertung',
                                               type: 'string',
                                               role: 'json'
                                           });
                                        }
                                        
                                        // API-URL
                                        const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
                                        
                                        // =========================
                                        // Hilfsfunktionen
                                        // =========================
                                        
                                        function isInArea(lat, lon, area) {
                                           return (
                                               lat >= area.minLat &&
                                               lat <= area.maxLat &&
                                               lon >= area.minLon &&
                                               lon <= area.maxLon
                                           );
                                        }
                                        
                                        function warningHitsArea(warning, area) {
                                           if (warning.coordinate && typeof warning.coordinate.lat === "number" && typeof warning.coordinate.long === "number") {
                                               if (isInArea(warning.coordinate.lat, warning.coordinate.long, area)) {
                                                   return true;
                                               }
                                           }
                                        
                                           if (warning.geometry && Array.isArray(warning.geometry.coordinates)) {
                                               for (const coord of warning.geometry.coordinates) {
                                                   if (Array.isArray(coord) && coord.length >= 2) {
                                                       const lon = coord[0];
                                                       const lat = coord[1];
                                                       if (isInArea(lat, lon, area)) return true;
                                                   }
                                               }
                                           }
                                        
                                           return false;
                                        }
                                        
                                        function buildDescriptionText(descriptionField) {
                                           if (Array.isArray(descriptionField)) {
                                               return descriptionField
                                                   .filter(d => d && String(d).trim() !== "")
                                                   .join("\n");
                                           }
                                           return String(descriptionField || "").trim();
                                        }
                                        
                                        // =========================
                                        // Hauptlogik
                                        // =========================
                                        
                                        async function checkTraffic() {
                                           try {
                                               console.log("Hole Daten von:", url);
                                        
                                               const axios = require("axios");
                                               const response = await axios.get(url);
                                               const data = response.data;
                                        
                                               const warnings = data.warnings || data.warning;
                                        
                                               if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                                                   console.log(`Keine Warnungen auf ${roadId}`);
                                        
                                                   if (verkehrsstoerungDP === 1)
                                                       setState(idDatenpunkt, "Keine Warnungen auf " + roadId);
                                        
                                                   if (verkehrsstoerungJSONDP === 1)
                                                       setState(idDatenpunktJSON, "[]");
                                        
                                                   return;
                                               }
                                        
                                               const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                                        
                                               if (relevant.length === 0) {
                                                   console.log(`Keine Warnungen im definierten Bereich auf ${roadId}`);
                                        
                                                   if (verkehrsstoerungDP === 1)
                                                       setState(idDatenpunkt, "Keine Warnungen im Bereich auf " + roadId);
                                        
                                                   if (verkehrsstoerungJSONDP === 1)
                                                       setState(idDatenpunktJSON, "[]");
                                        
                                                   return;
                                               }
                                        
                                               console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
                                        
                                               let summaryAlexa = "";
                                               let jsonArray = [];
                                        
                                               for (const warning of relevant) {
                                                   const descText = buildDescriptionText(warning.description);
                                        
                                                   // Koordinaten extrahieren (volle Genauigkeit!)
                                                   let lat = null;
                                                   let lon = null;
                                        
                                                   if (warning.coordinate) {
                                                       lat = warning.coordinate.lat;
                                                       lon = warning.coordinate.long;
                                                   }
                                        
                                                   if (!lat && warning.point) {
                                                       const parts = warning.point.split(",");
                                                       if (parts.length === 2) {
                                                           lat = parts[0];
                                                           lon = parts[1];
                                                       }
                                                   }
                                        
                                                   // Maps-Link erzeugen
                                                   let mapLink = "";
                                                   if (sendMapLink === 1 && lat && lon) {
                                                       mapLink = `https://www.google.com/maps/@${lat},${lon},13.13z`;
                                                   }
                                        
                                                   // Nachricht für Telegram (MIT Link)
                                                   let msgTelegram = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                                                   if (mapLink) msgTelegram += `\n\n📍 Position:\n${mapLink}`;
                                        
                                                   // Nachricht für Alexa (OHNE Link)
                                                   let msgAlexa = `⚠️ Störung auf ${roadId}:\n${warning.title}\n${descText}`;
                                        
                                                   summaryAlexa += msgAlexa + "\n\n";
                                        
                                                   // JSON-Objekt
                                                   jsonArray.push({
                                                       road: roadId,
                                                       title: warning.title,
                                                       description: descText,
                                                       start: warning.startTimestamp || null,
                                                       type: warning.abnormalTrafficType || null,
                                                       coordinate: { lat: lat, lon: lon },
                                                       mapLink: mapLink || null
                                                   });
                                        
                                                   // Telegram senden
                                                   if (telegramEnabled === 1) {
                                                       sendTo(telegramInstance, "send", {
                                                           chatId: telegramChatId,
                                                           text: msgTelegram
                                                       });
                                                   }
                                               }
                                        
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, summaryAlexa.trim());
                                        
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, JSON.stringify(jsonArray, null, 2));
                                        
                                           } catch (err) {
                                               console.error("Fehler beim Abruf:", err.message);
                                        
                                               if (telegramEnabled === 1) {
                                                   sendTo(telegramInstance, "send", {
                                                       chatId: telegramChatId,
                                                       text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err.message}`
                                                   });
                                               }
                                        
                                               if (verkehrsstoerungDP === 1)
                                                   setState(idDatenpunkt, "Fehler beim Abruf der Verkehrsdaten");
                                        
                                               if (verkehrsstoerungJSONDP === 1)
                                                   setState(idDatenpunktJSON, "[]");
                                           }
                                        }
                                        
                                        // =========================
                                        // Trigger
                                        // =========================
                                        
                                        // alle 15 Minuten prüfen
                                        schedule("*/15 * * * *", checkTraffic);
                                        
                                        // Alexa-Trigger nur wenn beide Schalter aktiv sind
                                        if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
                                           on({id: idDatenpunkt, change:'any'}, function () {
                                               console.log("Alexa Verkehrsroutine aufgerufen");
                                               checkTraffic();
                                           });
                                        }
                                        
                                        

                                        Falls ich die Version mit dem Vorgelesenen Link raus nehmen soll einfach bescheid geben!

                                        1 Antwort Letzte Antwort
                                        0
                                        • P Offline
                                          P Offline
                                          peterfido
                                          schrieb am zuletzt editiert von peterfido
                                          #25

                                          Ich habe mir mal ein paar Gedanken gemacht. Das Skript an sich ist so für einen speziellen Fall nützlich.
                                          Für flexible Nutzung könnte man das Skript per Telegram fernsteuern.
                                          Z.B. man übergibt per Telegram die Startposition, die Zielposition, welche Autobahn es sein soll. Wie man an die location lat und lon kommt, weiß ich nicht. Evtl. weiß @haus-automatisierung da mehr.

                                          Dann sind die Autobahnen keine genau senkrechte oder waagerechte Linie, so müssten dann wohl die die Koordinaten bei z.B. der A2 nord- und südseitig vom Skript festgelegt werden, bei der A7 dann entsprechend ost- und westseitig.

                                          Dann sendet man per Telegram, wo man eigentlich den Standort sendet, zb. einmal Berlin und einmal Hannover. Das Skript nimmt, sobald man die Autobahn 2 sendet, die Ost- und Westkoordinate aus den Telegram-Nachrichten, Nord- und Südkoordinate aus internen Werten.

                                          Dann würde ich den Refresh nicht rund um die Uhr laufen lassen. Vielleicht vom Absenden der Autobahn für so- und soviel Stunden; oder bis man per Telegram ein Stopp sendet.

                                          Für die Morgenroutine kann man fixe Werte hinterlegen, oder, falls man eine Tour geplant hat, alles vorbereiten. Damit dürfte die Zielgruppe wachsen.

                                          @haus-automatisierung
                                          Die Location soll laut Google einfach abfragbar sein, die Datenpunkte gibt es bei mir aber nicht:
                                          74936409-e38c-45a6-bdf6-a2915d3283f5-image.png

                                          Edit: Als JSON wäre die Lokation Vorteilhafter, so braucht man nur einen Datenpunkt zu belauschen.

                                          Gruß

                                          Peterfido


                                          Proxmox auf Intel NUC12WSHi5
                                          ioBroker: Debian (VM)
                                          CCU: Debmatic (VM)
                                          Influx: Debian (VM)
                                          Grafana: Debian (VM)
                                          eBus: Debian (VM)
                                          Zigbee: Debian (VM) mit zigbee2mqtt

                                          haus-automatisierungH 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          790

                                          Online

                                          32.6k

                                          Benutzer

                                          82.1k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe