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.
  • H Offline
    H Offline
    Hotze
    schrieb am zuletzt editiert von
    #30

    Ja, wie gesagt, das würde ich ganz anders an gehen. Da müsste man sich die Datenlagen ganz genau ansehen.
    Bei mir würde es ja auch "nur" um Toiletten gehen. Und die stehen sehr zuverlässig in der liste der Rastplätze!
    Wenn ich mit einem Elektroauto eine weitere Strecke fahren müsste, würe ich mich eher auf entsprechende Apps verlassen!

    Das script soll ja kein Navi ersetzen!

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

      Wo finde ich jetzt hier ein Testferiges Script das auf dem neusten Stand ist?

      H 1 Antwort Letzte Antwort
      0
      • R Rushmed

        Wo finde ich jetzt hier ein Testferiges Script das auf dem neusten Stand ist?

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

        @Rushmed
        In meinen Beiträgen im "Spoiler-Button"!

        • Post #1: Das Läuft bei mir fehlerfrei

        • Post #8: Von mir nicht gestestet! Mit Schaltern zum Konfigurieren.

        • Post #22: Von mir nicht gestestet! Mit Schaltern zum Konfigurieren und Datenpunkten.

        • Post #24: Von mir nicht gestestet! Mit Schaltern zum Konfigurieren, Datenpunkten und einer Extranachricht mit einem Link zu GoogleMaps

        Ihr könnt ja gerne mal schreiben ob die dinge für Alexa und die Datenpunkte fehlerfrei laufen.
        Dann kann ich die als getestet abhaken!

        Ihr könnt aber gerne selber daran herumoptimieren und hier posten!
        Baut eure Änderungen gerne in den Code ein und postet den KOMPLETT! Nur dann kann jemand der kaum Ahnung hat etwas mit den änderungen anfangen!

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

          @hotze Bei den Scripten aus #22 und #24 gibt es bei mir rote Stellen Javascriptfenster.

          ce27ad54-9f2d-46d5-beb3-0912338d8686-grafik.png

          und

          3207d5c1-4513-4837-8646-489a107cf000-grafik.png

          Log vom ersten Start:

          
          javascript.0
          2025-12-22 17:33:32.304	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.625	info	script.js.aaa_Staumelder_251219_0916: Stopping script
          
          javascript.0
          2025-12-22 17:33:31.564	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.564	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.551	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.513	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.513	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.500	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.459	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.459	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.449	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.413	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.412	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.358	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.318	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.318	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.268	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.231	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.231	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.224	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.182	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.182	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.174	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.139	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.139	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.126	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.089	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.088	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.071	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:31.035	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:31.035	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:31.008	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.968	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.968	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.961	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.921	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.921	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.910	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.866	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.865	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.858	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.823	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.823	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.817	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.777	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.777	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.770	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.731	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.731	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.722	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.688	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.687	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.662	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.627	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.627	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.621	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.585	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.585	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.579	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.542	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.541	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.534	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.495	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.494	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.488	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.452	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.451	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.445	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.411	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.410	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.404	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.364	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.364	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.357	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.321	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.320	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.311	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.271	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.270	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.264	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.224	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.223	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.218	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.178	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.178	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.165	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.123	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.123	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.090	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:30.043	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:30.043	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:30.029	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.992	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.992	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.979	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.942	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.941	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.928	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.887	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.886	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.874	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.835	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.835	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.824	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.785	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.785	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.775	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.736	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.735	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.727	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.691	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.691	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.679	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.642	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.642	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.636	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.596	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.596	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.590	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.550	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.550	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.539	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.500	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.500	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.489	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.450	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.450	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.438	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.397	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.397	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.388	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.352	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.352	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.333	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.293	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.293	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.254	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.214	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.214	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.176	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.136	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.135	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.125	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.086	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.085	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.078	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:29.040	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:29.040	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:29.026	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:28.989	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:28.989	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:28.981	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:28.941	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          
          javascript.0
          2025-12-22 17:33:28.940	info	script.js.aaa_Staumelder_251219_0916: Alexa Verkehrsroutine aufgerufen
          
          javascript.0
          2025-12-22 17:33:28.929	info	script.js.aaa_Staumelder_251219_0916: Keine Warnungen im definierten Bereich auf A45
          
          javascript.0
          2025-12-22 17:33:28.894	info	script.js.aaa_Staumelder_251219_0916: Hole Daten von:
          

          Die Datenpunkte werden erstellt. Meldungen hab ich bisher keine.

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

            Die roten Stellen bedeuten nur das der editor die Funktion nicht kennt. Ich habe das auch, da es funktioniert mache ich mir keine sorgen darüber.

            Ok! Alexa hat einen Datenpunklt geändert und dann immer wieder abgefragt!
            Das war also Käse!

            Versuche bitte den nochmal:

            // 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 soll NICHT checkTraffic() auslösen.
            // Sie soll nur den Datenpunkt lesen können.
            // Daher: Trigger nur für externe (ack:false) Änderungen,
            // aber OHNE checkTraffic() aufzurufen.
            
            if (alexaEnabled === 1 && verkehrsstoerungDP === 1) {
               on({ id: idDatenpunkt, change: 'ne', ack: false }, () => {
                   console.log("Alexa Verkehrsroutine wurde von außen aufgerufen – keine API-Abfrage.");
                   // KEIN checkTraffic() hier!
               });
            }
            
            
            

            Ansonsten lassen wir die alexa rraus und machen "nur" die Datenpunkte. Einmal als plainText und einmal als JSON.
            Dann kann sich jeder selber seine Alexaroutine basteln.

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

              Ich habe den Chronjob und Alexa raus genommen!
              Bitte schaut euch die Äderung an und passt zumindest den Teil mit dem Chronjob an!
              Das script startet nun nicht zur vollen Viertelstunde sondern einmal beim start und dann alle 15 Minuten.

              Ich hoffe damit die Abfragen auf die API https://verkehr.autobahn.de zeitmäßig zu verteilen!

              Getestet, funktioniert:

              /*
              Beschreibung
              Dieses Skript überwacht Verkehrswarnungen über die Autobahn‑API für die in der Variable `roadId` konfigurierte Autobahn.
              Es filtert Meldungen nach dem definierten Koordinatenbereich (coordsArea).
              
              Wichtig: Vor dem ersten Start unbedingt die Variable `roadId` auf die gewünschte Autobahn setzen (z. B. "A45", "A3" etc.).
              
              Ausgaben (einzeln schaltbar):
              - telegramBasicEnabled    : Telegram‑Nachricht ohne Link
              - telegramWithLinkEnabled : Telegram‑Nachricht mit Google‑Maps‑Link
              - dpAlexaEnabled          : Klartext‑Datenpunkt (z. B. idAlexa) für Alexa, OHNE Maps‑Link
              - dpJsonEnabled           : JSON‑Datenpunkt (z. B. idJSON) für Auswertungen, MIT Maps‑Link
              
              Verhalten:
              - Datenpunkte werden nur angelegt, wenn der jeweilige Schalter aktiviert ist.
              - Beim Start führt das Skript einmal checkTraffic() aus und wiederholt dann alle 15 Minuten (relativ zur Startzeit).
              - Maps‑Link wird nur erzeugt, wenn Koordinaten vorhanden sind.
              
              Hinweise:
              - Stelle diese Variablen korrekt ein:
                 - roadId
                 - coordsArea
                 - telegramInstance (normalerweise ist es telegram.0)
                 - telegramChatId
                 - idAlexa 
                 - idJSON
              
              - Passe die Schalter an
              */
              
              // =========================
              // Konfiguration
              // =========================
              const roadId = "A45";
              const coordsArea = {
                 minLat: 50.6181514,
                 maxLat: 52.2742993,
                 minLon: 7.2582769,
                 maxLon: 8.3822071
              };
              
              // Schalter (0 = aus, 1 = an)
              const telegramBasicEnabled    = 1; // Telegram: Nachricht ohne Link
              const telegramWithLinkEnabled = 1; // Telegram: Nachricht mit Maps-Link
              const dpAlexaEnabled          = 1; // Klartext-Datenpunkt (Alexa) ohne Link
              const dpJsonEnabled           = 1; // JSON-Datenpunkt (mit Link)
              
              // Telegram-Konfiguration
              const telegramInstance = "telegram.0";
              const telegramChatId   = 123456789;
              
              // Datenpunkte (nur anlegen, wenn aktiviert)
              const idAlexa = "0_userdata.0.Verkehr_Alexa";
              const idJSON  = "0_userdata.0.Verkehr_JSON";
              
              if (dpAlexaEnabled === 1) {
                 createState(idAlexa, "", false, {
                     name: "Verkehrsmeldung Klartext",
                     type: "string",
                     role: "value"
                 });
              }
              if (dpJsonEnabled === 1) {
                 createState(idJSON, "[]", false, {
                     name: "Verkehrsmeldung JSON",
                     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(w, area) {
                 if (w.coordinate && typeof w.coordinate.lat === "number" && typeof w.coordinate.long === "number") {
                     if (isInArea(w.coordinate.lat, w.coordinate.long, area)) return true;
                 }
                 if (w.geometry && Array.isArray(w.geometry.coordinates)) {
                     for (const c of w.geometry.coordinates) {
                         if (Array.isArray(c) && c.length >= 2) {
                             const lon = c[0], lat = c[1];
                             if (isInArea(lat, lon, area)) return true;
                         }
                     }
                 }
                 return false;
              }
              
              function buildDescriptionText(desc) {
                 if (Array.isArray(desc)) return desc.filter(d => d && String(d).trim() !== "").join("\n");
                 return String(desc || "").trim();
              }
              
              // =========================
              // Hauptlogik
              // =========================
              async function checkTraffic() {
                 try {
                     console.log("Hole Daten von:", url);
                     const axios = require("axios");
                     const res = await axios.get(url);
                     const data = res.data;
                     const warnings = data.warnings || data.warning;
              
                     if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                         console.log("Keine Warnungen gefunden.");
                         if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen auf " + roadId);
                         if (dpJsonEnabled === 1) setState(idJSON, "[]");
                         return;
                     }
              
                     const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                     if (!relevant || relevant.length === 0) {
                         console.log("Keine Warnungen im Bereich.");
                         if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen im Bereich auf " + roadId);
                         if (dpJsonEnabled === 1) setState(idJSON, "[]");
                         return;
                     }
              
                     let alexaText = "";
                     const jsonOut = [];
              
                     for (const w of relevant) {
                         const desc = buildDescriptionText(w.description);
                         // Koordinaten extrahieren (verschiedene Felder)
                         let lat = null, lon = null;
                         if (w.coordinate) { lat = w.coordinate.lat; lon = w.coordinate.long; }
                         if ((!lat || !lon) && w.point) {
                             const p = String(w.point).split(",");
                             if (p.length === 2) { lat = p[0]; lon = p[1]; }
                         }
              
                         const mapLink = (lat && lon) ? `https://www.google.com/maps/@${lat},${lon},13.13z` : "";
              
                         // Telegram: Basic (ohne Link)
                         if (telegramBasicEnabled === 1) {
                             const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}`;
                             sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                         }
              
                         // Telegram: With Link
                         if (telegramWithLinkEnabled === 1 && mapLink) {
                             const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}\n\n📍 ${mapLink}`;
                             sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                         }
              
                         // Alexa-Klartext (ohne Link)
                         if (dpAlexaEnabled === 1) {
                             alexaText += `Störung auf ${roadId}: ${w.title}. ${desc}\n\n`;
                         }
              
                         // JSON-Ausgabe (mit Link wenn vorhanden)
                         if (dpJsonEnabled === 1) {
                             jsonOut.push({
                                 road: roadId,
                                 title: w.title,
                                 description: desc,
                                 start: w.startTimestamp || null,
                                 coordinate: lat && lon ? { lat: lat, lon: lon } : null,
                                 mapLink: mapLink || null
                             });
                         }
                     }
              
                     if (dpAlexaEnabled === 1) setState(idAlexa, alexaText.trim());
                     if (dpJsonEnabled === 1) setState(idJSON, JSON.stringify(jsonOut, null, 2));
              
                 } catch (err) {
                     console.error("Fehler beim Abruf:", err && err.message ? err.message : err);
                     if (telegramBasicEnabled === 1 || telegramWithLinkEnabled === 1) {
                         sendTo(telegramInstance, "send", {
                             chatId: telegramChatId,
                             text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err && err.message ? err.message : err}`
                         });
                     }
                     if (dpAlexaEnabled === 1) setState(idAlexa, "Fehler beim Abruf der Verkehrsdaten");
                     if (dpJsonEnabled === 1) setState(idJSON, "[]");
                 }
              }
              
              // =========================
              // Start sofort und Intervall alle 15 Minuten (relativ zur Startzeit)
              // =========================
              
              // sofort einmal ausführen
              checkTraffic();
              
              // danach alle 15 Minuten relativ zur Startzeit wiederholen
              const intervalMs = 15 * 60 * 1000;
              setInterval(checkTraffic, intervalMs);
              
              

              Edit: Beschreibung in das Script geschrieben.

              R 1 Antwort Letzte Antwort
              0
              • H Hotze

                Ich habe den Chronjob und Alexa raus genommen!
                Bitte schaut euch die Äderung an und passt zumindest den Teil mit dem Chronjob an!
                Das script startet nun nicht zur vollen Viertelstunde sondern einmal beim start und dann alle 15 Minuten.

                Ich hoffe damit die Abfragen auf die API https://verkehr.autobahn.de zeitmäßig zu verteilen!

                Getestet, funktioniert:

                /*
                Beschreibung
                Dieses Skript überwacht Verkehrswarnungen über die Autobahn‑API für die in der Variable `roadId` konfigurierte Autobahn.
                Es filtert Meldungen nach dem definierten Koordinatenbereich (coordsArea).
                
                Wichtig: Vor dem ersten Start unbedingt die Variable `roadId` auf die gewünschte Autobahn setzen (z. B. "A45", "A3" etc.).
                
                Ausgaben (einzeln schaltbar):
                - telegramBasicEnabled    : Telegram‑Nachricht ohne Link
                - telegramWithLinkEnabled : Telegram‑Nachricht mit Google‑Maps‑Link
                - dpAlexaEnabled          : Klartext‑Datenpunkt (z. B. idAlexa) für Alexa, OHNE Maps‑Link
                - dpJsonEnabled           : JSON‑Datenpunkt (z. B. idJSON) für Auswertungen, MIT Maps‑Link
                
                Verhalten:
                - Datenpunkte werden nur angelegt, wenn der jeweilige Schalter aktiviert ist.
                - Beim Start führt das Skript einmal checkTraffic() aus und wiederholt dann alle 15 Minuten (relativ zur Startzeit).
                - Maps‑Link wird nur erzeugt, wenn Koordinaten vorhanden sind.
                
                Hinweise:
                - Stelle diese Variablen korrekt ein:
                   - roadId
                   - coordsArea
                   - telegramInstance (normalerweise ist es telegram.0)
                   - telegramChatId
                   - idAlexa 
                   - idJSON
                
                - Passe die Schalter an
                */
                
                // =========================
                // Konfiguration
                // =========================
                const roadId = "A45";
                const coordsArea = {
                   minLat: 50.6181514,
                   maxLat: 52.2742993,
                   minLon: 7.2582769,
                   maxLon: 8.3822071
                };
                
                // Schalter (0 = aus, 1 = an)
                const telegramBasicEnabled    = 1; // Telegram: Nachricht ohne Link
                const telegramWithLinkEnabled = 1; // Telegram: Nachricht mit Maps-Link
                const dpAlexaEnabled          = 1; // Klartext-Datenpunkt (Alexa) ohne Link
                const dpJsonEnabled           = 1; // JSON-Datenpunkt (mit Link)
                
                // Telegram-Konfiguration
                const telegramInstance = "telegram.0";
                const telegramChatId   = 123456789;
                
                // Datenpunkte (nur anlegen, wenn aktiviert)
                const idAlexa = "0_userdata.0.Verkehr_Alexa";
                const idJSON  = "0_userdata.0.Verkehr_JSON";
                
                if (dpAlexaEnabled === 1) {
                   createState(idAlexa, "", false, {
                       name: "Verkehrsmeldung Klartext",
                       type: "string",
                       role: "value"
                   });
                }
                if (dpJsonEnabled === 1) {
                   createState(idJSON, "[]", false, {
                       name: "Verkehrsmeldung JSON",
                       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(w, area) {
                   if (w.coordinate && typeof w.coordinate.lat === "number" && typeof w.coordinate.long === "number") {
                       if (isInArea(w.coordinate.lat, w.coordinate.long, area)) return true;
                   }
                   if (w.geometry && Array.isArray(w.geometry.coordinates)) {
                       for (const c of w.geometry.coordinates) {
                           if (Array.isArray(c) && c.length >= 2) {
                               const lon = c[0], lat = c[1];
                               if (isInArea(lat, lon, area)) return true;
                           }
                       }
                   }
                   return false;
                }
                
                function buildDescriptionText(desc) {
                   if (Array.isArray(desc)) return desc.filter(d => d && String(d).trim() !== "").join("\n");
                   return String(desc || "").trim();
                }
                
                // =========================
                // Hauptlogik
                // =========================
                async function checkTraffic() {
                   try {
                       console.log("Hole Daten von:", url);
                       const axios = require("axios");
                       const res = await axios.get(url);
                       const data = res.data;
                       const warnings = data.warnings || data.warning;
                
                       if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                           console.log("Keine Warnungen gefunden.");
                           if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen auf " + roadId);
                           if (dpJsonEnabled === 1) setState(idJSON, "[]");
                           return;
                       }
                
                       const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                       if (!relevant || relevant.length === 0) {
                           console.log("Keine Warnungen im Bereich.");
                           if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen im Bereich auf " + roadId);
                           if (dpJsonEnabled === 1) setState(idJSON, "[]");
                           return;
                       }
                
                       let alexaText = "";
                       const jsonOut = [];
                
                       for (const w of relevant) {
                           const desc = buildDescriptionText(w.description);
                           // Koordinaten extrahieren (verschiedene Felder)
                           let lat = null, lon = null;
                           if (w.coordinate) { lat = w.coordinate.lat; lon = w.coordinate.long; }
                           if ((!lat || !lon) && w.point) {
                               const p = String(w.point).split(",");
                               if (p.length === 2) { lat = p[0]; lon = p[1]; }
                           }
                
                           const mapLink = (lat && lon) ? `https://www.google.com/maps/@${lat},${lon},13.13z` : "";
                
                           // Telegram: Basic (ohne Link)
                           if (telegramBasicEnabled === 1) {
                               const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}`;
                               sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                           }
                
                           // Telegram: With Link
                           if (telegramWithLinkEnabled === 1 && mapLink) {
                               const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}\n\n📍 ${mapLink}`;
                               sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                           }
                
                           // Alexa-Klartext (ohne Link)
                           if (dpAlexaEnabled === 1) {
                               alexaText += `Störung auf ${roadId}: ${w.title}. ${desc}\n\n`;
                           }
                
                           // JSON-Ausgabe (mit Link wenn vorhanden)
                           if (dpJsonEnabled === 1) {
                               jsonOut.push({
                                   road: roadId,
                                   title: w.title,
                                   description: desc,
                                   start: w.startTimestamp || null,
                                   coordinate: lat && lon ? { lat: lat, lon: lon } : null,
                                   mapLink: mapLink || null
                               });
                           }
                       }
                
                       if (dpAlexaEnabled === 1) setState(idAlexa, alexaText.trim());
                       if (dpJsonEnabled === 1) setState(idJSON, JSON.stringify(jsonOut, null, 2));
                
                   } catch (err) {
                       console.error("Fehler beim Abruf:", err && err.message ? err.message : err);
                       if (telegramBasicEnabled === 1 || telegramWithLinkEnabled === 1) {
                           sendTo(telegramInstance, "send", {
                               chatId: telegramChatId,
                               text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err && err.message ? err.message : err}`
                           });
                       }
                       if (dpAlexaEnabled === 1) setState(idAlexa, "Fehler beim Abruf der Verkehrsdaten");
                       if (dpJsonEnabled === 1) setState(idJSON, "[]");
                   }
                }
                
                // =========================
                // Start sofort und Intervall alle 15 Minuten (relativ zur Startzeit)
                // =========================
                
                // sofort einmal ausführen
                checkTraffic();
                
                // danach alle 15 Minuten relativ zur Startzeit wiederholen
                const intervalMs = 15 * 60 * 1000;
                setInterval(checkTraffic, intervalMs);
                
                

                Edit: Beschreibung in das Script geschrieben.

                R Offline
                R Offline
                Rushmed
                Most Active
                schrieb am zuletzt editiert von
                #36

                @Hotze Danke, Test läuft.

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

                  @Hotze sagte in #Stauerkennung #DieAutobahn:

                  Getestet, funktioniert:

                  /*
                  Beschreibung
                  Dieses Skript überwacht Verkehrswarnungen über die Autobahn‑API für die in der Variable `roadId` konfigurierte Autobahn.
                  Es filtert Meldungen nach dem definierten Koordinatenbereich (coordsArea).
                  
                  Wichtig: Vor dem ersten Start unbedingt die Variable `roadId` auf die gewünschte Autobahn setzen (z. B. "A45", "A3" etc.).
                  
                  Ausgaben (einzeln schaltbar):
                  - telegramBasicEnabled    : Telegram‑Nachricht ohne Link
                  - telegramWithLinkEnabled : Telegram‑Nachricht mit Google‑Maps‑Link
                  - dpAlexaEnabled          : Klartext‑Datenpunkt (z. B. idAlexa) für Alexa, OHNE Maps‑Link
                  - dpJsonEnabled           : JSON‑Datenpunkt (z. B. idJSON) für Auswertungen, MIT Maps‑Link
                  
                  Verhalten:
                  - Datenpunkte werden nur angelegt, wenn der jeweilige Schalter aktiviert ist.
                  - Beim Start führt das Skript einmal checkTraffic() aus und wiederholt dann alle 15 Minuten (relativ zur Startzeit).
                  - Maps‑Link wird nur erzeugt, wenn Koordinaten vorhanden sind.
                  
                  Hinweise:
                  - Stelle diese Variablen korrekt ein:
                     - roadId
                     - coordsArea
                     - telegramInstance (normalerweise ist es telegram.0)
                     - telegramChatId
                     - idAlexa 
                     - idJSON
                  
                  - Passe die Schalter an
                  */
                  
                  // =========================
                  // Konfiguration
                  // =========================
                  const roadId = "A45";
                  const coordsArea = {
                     minLat: 50.6181514,
                     maxLat: 52.2742993,
                     minLon: 7.2582769,
                     maxLon: 8.3822071
                  };
                  
                  // Schalter (0 = aus, 1 = an)
                  const telegramBasicEnabled    = 1; // Telegram: Nachricht ohne Link
                  const telegramWithLinkEnabled = 1; // Telegram: Nachricht mit Maps-Link
                  const dpAlexaEnabled          = 1; // Klartext-Datenpunkt (Alexa) ohne Link
                  const dpJsonEnabled           = 1; // JSON-Datenpunkt (mit Link)
                  
                  // Telegram-Konfiguration
                  const telegramInstance = "telegram.0";
                  const telegramChatId   = 123456789;
                  
                  // Datenpunkte (nur anlegen, wenn aktiviert)
                  const idAlexa = "0_userdata.0.Verkehr_Alexa";
                  const idJSON  = "0_userdata.0.Verkehr_JSON";
                  
                  if (dpAlexaEnabled === 1) {
                     createState(idAlexa, "", false, {
                         name: "Verkehrsmeldung Klartext",
                         type: "string",
                         role: "value"
                     });
                  }
                  if (dpJsonEnabled === 1) {
                     createState(idJSON, "[]", false, {
                         name: "Verkehrsmeldung JSON",
                         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(w, area) {
                     if (w.coordinate && typeof w.coordinate.lat === "number" && typeof w.coordinate.long === "number") {
                         if (isInArea(w.coordinate.lat, w.coordinate.long, area)) return true;
                     }
                     if (w.geometry && Array.isArray(w.geometry.coordinates)) {
                         for (const c of w.geometry.coordinates) {
                             if (Array.isArray(c) && c.length >= 2) {
                                 const lon = c[0], lat = c[1];
                                 if (isInArea(lat, lon, area)) return true;
                             }
                         }
                     }
                     return false;
                  }
                  
                  function buildDescriptionText(desc) {
                     if (Array.isArray(desc)) return desc.filter(d => d && String(d).trim() !== "").join("\n");
                     return String(desc || "").trim();
                  }
                  
                  // =========================
                  // Hauptlogik
                  // =========================
                  async function checkTraffic() {
                     try {
                         console.log("Hole Daten von:", url);
                         const axios = require("axios");
                         const res = await axios.get(url);
                         const data = res.data;
                         const warnings = data.warnings || data.warning;
                  
                         if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                             console.log("Keine Warnungen gefunden.");
                             if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen auf " + roadId);
                             if (dpJsonEnabled === 1) setState(idJSON, "[]");
                             return;
                         }
                  
                         const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                         if (!relevant || relevant.length === 0) {
                             console.log("Keine Warnungen im Bereich.");
                             if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen im Bereich auf " + roadId);
                             if (dpJsonEnabled === 1) setState(idJSON, "[]");
                             return;
                         }
                  
                         let alexaText = "";
                         const jsonOut = [];
                  
                         for (const w of relevant) {
                             const desc = buildDescriptionText(w.description);
                             // Koordinaten extrahieren (verschiedene Felder)
                             let lat = null, lon = null;
                             if (w.coordinate) { lat = w.coordinate.lat; lon = w.coordinate.long; }
                             if ((!lat || !lon) && w.point) {
                                 const p = String(w.point).split(",");
                                 if (p.length === 2) { lat = p[0]; lon = p[1]; }
                             }
                  
                             const mapLink = (lat && lon) ? `https://www.google.com/maps/@${lat},${lon},13.13z` : "";
                  
                             // Telegram: Basic (ohne Link)
                             if (telegramBasicEnabled === 1) {
                                 const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}`;
                                 sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                             }
                  
                             // Telegram: With Link
                             if (telegramWithLinkEnabled === 1 && mapLink) {
                                 const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}\n\n📍 ${mapLink}`;
                                 sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                             }
                  
                             // Alexa-Klartext (ohne Link)
                             if (dpAlexaEnabled === 1) {
                                 alexaText += `Störung auf ${roadId}: ${w.title}. ${desc}\n\n`;
                             }
                  
                             // JSON-Ausgabe (mit Link wenn vorhanden)
                             if (dpJsonEnabled === 1) {
                                 jsonOut.push({
                                     road: roadId,
                                     title: w.title,
                                     description: desc,
                                     start: w.startTimestamp || null,
                                     coordinate: lat && lon ? { lat: lat, lon: lon } : null,
                                     mapLink: mapLink || null
                                 });
                             }
                         }
                  
                         if (dpAlexaEnabled === 1) setState(idAlexa, alexaText.trim());
                         if (dpJsonEnabled === 1) setState(idJSON, JSON.stringify(jsonOut, null, 2));
                  
                     } catch (err) {
                         console.error("Fehler beim Abruf:", err && err.message ? err.message : err);
                         if (telegramBasicEnabled === 1 || telegramWithLinkEnabled === 1) {
                             sendTo(telegramInstance, "send", {
                                 chatId: telegramChatId,
                                 text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err && err.message ? err.message : err}`
                             });
                         }
                         if (dpAlexaEnabled === 1) setState(idAlexa, "Fehler beim Abruf der Verkehrsdaten");
                         if (dpJsonEnabled === 1) setState(idJSON, "[]");
                     }
                  }
                  
                  // =========================
                  // Start sofort und Intervall alle 15 Minuten (relativ zur Startzeit)
                  // =========================
                  
                  // sofort einmal ausführen
                  checkTraffic();
                  
                  // danach alle 15 Minuten relativ zur Startzeit wiederholen
                  const intervalMs = 15 * 60 * 1000;
                  setInterval(checkTraffic, intervalMs);
                  
                  

                  Edit: Beschreibung in das Script geschrieben.

                  Bisher läuft alles. Die ersten Meldungen kamen an.
                  Wenn eine Meldung verfügbar ist wird diese im Abfrageintervall immer wieder per Telegramm gesendet.

                  H 1 Antwort Letzte Antwort
                  0
                  • R Rushmed

                    @Hotze sagte in #Stauerkennung #DieAutobahn:

                    Getestet, funktioniert:

                    /*
                    Beschreibung
                    Dieses Skript überwacht Verkehrswarnungen über die Autobahn‑API für die in der Variable `roadId` konfigurierte Autobahn.
                    Es filtert Meldungen nach dem definierten Koordinatenbereich (coordsArea).
                    
                    Wichtig: Vor dem ersten Start unbedingt die Variable `roadId` auf die gewünschte Autobahn setzen (z. B. "A45", "A3" etc.).
                    
                    Ausgaben (einzeln schaltbar):
                    - telegramBasicEnabled    : Telegram‑Nachricht ohne Link
                    - telegramWithLinkEnabled : Telegram‑Nachricht mit Google‑Maps‑Link
                    - dpAlexaEnabled          : Klartext‑Datenpunkt (z. B. idAlexa) für Alexa, OHNE Maps‑Link
                    - dpJsonEnabled           : JSON‑Datenpunkt (z. B. idJSON) für Auswertungen, MIT Maps‑Link
                    
                    Verhalten:
                    - Datenpunkte werden nur angelegt, wenn der jeweilige Schalter aktiviert ist.
                    - Beim Start führt das Skript einmal checkTraffic() aus und wiederholt dann alle 15 Minuten (relativ zur Startzeit).
                    - Maps‑Link wird nur erzeugt, wenn Koordinaten vorhanden sind.
                    
                    Hinweise:
                    - Stelle diese Variablen korrekt ein:
                       - roadId
                       - coordsArea
                       - telegramInstance (normalerweise ist es telegram.0)
                       - telegramChatId
                       - idAlexa 
                       - idJSON
                    
                    - Passe die Schalter an
                    */
                    
                    // =========================
                    // Konfiguration
                    // =========================
                    const roadId = "A45";
                    const coordsArea = {
                       minLat: 50.6181514,
                       maxLat: 52.2742993,
                       minLon: 7.2582769,
                       maxLon: 8.3822071
                    };
                    
                    // Schalter (0 = aus, 1 = an)
                    const telegramBasicEnabled    = 1; // Telegram: Nachricht ohne Link
                    const telegramWithLinkEnabled = 1; // Telegram: Nachricht mit Maps-Link
                    const dpAlexaEnabled          = 1; // Klartext-Datenpunkt (Alexa) ohne Link
                    const dpJsonEnabled           = 1; // JSON-Datenpunkt (mit Link)
                    
                    // Telegram-Konfiguration
                    const telegramInstance = "telegram.0";
                    const telegramChatId   = 123456789;
                    
                    // Datenpunkte (nur anlegen, wenn aktiviert)
                    const idAlexa = "0_userdata.0.Verkehr_Alexa";
                    const idJSON  = "0_userdata.0.Verkehr_JSON";
                    
                    if (dpAlexaEnabled === 1) {
                       createState(idAlexa, "", false, {
                           name: "Verkehrsmeldung Klartext",
                           type: "string",
                           role: "value"
                       });
                    }
                    if (dpJsonEnabled === 1) {
                       createState(idJSON, "[]", false, {
                           name: "Verkehrsmeldung JSON",
                           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(w, area) {
                       if (w.coordinate && typeof w.coordinate.lat === "number" && typeof w.coordinate.long === "number") {
                           if (isInArea(w.coordinate.lat, w.coordinate.long, area)) return true;
                       }
                       if (w.geometry && Array.isArray(w.geometry.coordinates)) {
                           for (const c of w.geometry.coordinates) {
                               if (Array.isArray(c) && c.length >= 2) {
                                   const lon = c[0], lat = c[1];
                                   if (isInArea(lat, lon, area)) return true;
                               }
                           }
                       }
                       return false;
                    }
                    
                    function buildDescriptionText(desc) {
                       if (Array.isArray(desc)) return desc.filter(d => d && String(d).trim() !== "").join("\n");
                       return String(desc || "").trim();
                    }
                    
                    // =========================
                    // Hauptlogik
                    // =========================
                    async function checkTraffic() {
                       try {
                           console.log("Hole Daten von:", url);
                           const axios = require("axios");
                           const res = await axios.get(url);
                           const data = res.data;
                           const warnings = data.warnings || data.warning;
                    
                           if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                               console.log("Keine Warnungen gefunden.");
                               if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen auf " + roadId);
                               if (dpJsonEnabled === 1) setState(idJSON, "[]");
                               return;
                           }
                    
                           const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                           if (!relevant || relevant.length === 0) {
                               console.log("Keine Warnungen im Bereich.");
                               if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen im Bereich auf " + roadId);
                               if (dpJsonEnabled === 1) setState(idJSON, "[]");
                               return;
                           }
                    
                           let alexaText = "";
                           const jsonOut = [];
                    
                           for (const w of relevant) {
                               const desc = buildDescriptionText(w.description);
                               // Koordinaten extrahieren (verschiedene Felder)
                               let lat = null, lon = null;
                               if (w.coordinate) { lat = w.coordinate.lat; lon = w.coordinate.long; }
                               if ((!lat || !lon) && w.point) {
                                   const p = String(w.point).split(",");
                                   if (p.length === 2) { lat = p[0]; lon = p[1]; }
                               }
                    
                               const mapLink = (lat && lon) ? `https://www.google.com/maps/@${lat},${lon},13.13z` : "";
                    
                               // Telegram: Basic (ohne Link)
                               if (telegramBasicEnabled === 1) {
                                   const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}`;
                                   sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                               }
                    
                               // Telegram: With Link
                               if (telegramWithLinkEnabled === 1 && mapLink) {
                                   const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}\n\n📍 ${mapLink}`;
                                   sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                               }
                    
                               // Alexa-Klartext (ohne Link)
                               if (dpAlexaEnabled === 1) {
                                   alexaText += `Störung auf ${roadId}: ${w.title}. ${desc}\n\n`;
                               }
                    
                               // JSON-Ausgabe (mit Link wenn vorhanden)
                               if (dpJsonEnabled === 1) {
                                   jsonOut.push({
                                       road: roadId,
                                       title: w.title,
                                       description: desc,
                                       start: w.startTimestamp || null,
                                       coordinate: lat && lon ? { lat: lat, lon: lon } : null,
                                       mapLink: mapLink || null
                                   });
                               }
                           }
                    
                           if (dpAlexaEnabled === 1) setState(idAlexa, alexaText.trim());
                           if (dpJsonEnabled === 1) setState(idJSON, JSON.stringify(jsonOut, null, 2));
                    
                       } catch (err) {
                           console.error("Fehler beim Abruf:", err && err.message ? err.message : err);
                           if (telegramBasicEnabled === 1 || telegramWithLinkEnabled === 1) {
                               sendTo(telegramInstance, "send", {
                                   chatId: telegramChatId,
                                   text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err && err.message ? err.message : err}`
                               });
                           }
                           if (dpAlexaEnabled === 1) setState(idAlexa, "Fehler beim Abruf der Verkehrsdaten");
                           if (dpJsonEnabled === 1) setState(idJSON, "[]");
                       }
                    }
                    
                    // =========================
                    // Start sofort und Intervall alle 15 Minuten (relativ zur Startzeit)
                    // =========================
                    
                    // sofort einmal ausführen
                    checkTraffic();
                    
                    // danach alle 15 Minuten relativ zur Startzeit wiederholen
                    const intervalMs = 15 * 60 * 1000;
                    setInterval(checkTraffic, intervalMs);
                    
                    

                    Edit: Beschreibung in das Script geschrieben.

                    Bisher läuft alles. Die ersten Meldungen kamen an.
                    Wenn eine Meldung verfügbar ist wird diese im Abfrageintervall immer wieder per Telegramm gesendet.

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

                    @Rushmed
                    Danke für die Rückmeldug!

                    Ja, das ist beabsichtigt. Dann ärgere ich mich nicht weil ich vor einigen Stunden eine Meldung bekam, diese aber vergaß und dann doch wieder im Stau stecke!

                    Eventuell baue ich noch einen schalter ein um Mehrfachsendungen optional zu vermeiden.

                    Ich teste gerade noch an einer anderen Version in der man zwei startzeiten eintragen kann. Um die startzeiten wird dann zufällig +-2 Minuten gestartet. un der Intervall variert um +-0,5 Minuten.

                    carsten04C 1 Antwort Letzte Antwort
                    0
                    • H Hotze

                      @Rushmed
                      Danke für die Rückmeldug!

                      Ja, das ist beabsichtigt. Dann ärgere ich mich nicht weil ich vor einigen Stunden eine Meldung bekam, diese aber vergaß und dann doch wieder im Stau stecke!

                      Eventuell baue ich noch einen schalter ein um Mehrfachsendungen optional zu vermeiden.

                      Ich teste gerade noch an einer anderen Version in der man zwei startzeiten eintragen kann. Um die startzeiten wird dann zufällig +-2 Minuten gestartet. un der Intervall variert um +-0,5 Minuten.

                      carsten04C Offline
                      carsten04C Offline
                      carsten04
                      Developer
                      schrieb am zuletzt editiert von
                      #39

                      Bin gerade durch Zufall über diesen Thread gestolpert. Ich habe mal einen Adapter radar-trap geschrieben, der für beliebige Strecken und Gebiete alle möglichen Infos zur Verfügung stellt. Vielleicht geht das ja in die Richtung was ihr braucht.

                      H 1 Antwort Letzte Antwort
                      1
                      • carsten04C carsten04

                        Bin gerade durch Zufall über diesen Thread gestolpert. Ich habe mal einen Adapter radar-trap geschrieben, der für beliebige Strecken und Gebiete alle möglichen Infos zur Verfügung stellt. Vielleicht geht das ja in die Richtung was ihr braucht.

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

                        @carsten04
                        Schönes Teil, leider habe ich den Adapter nicht mit Stauwarnungen in Verbindung gebracht!
                        Naja, den werde ich auch testen!
                        Darf ich fragen woher die daten Stammen? Warnt der auch vor Sperrung und langsamem Verkehr?

                        carsten04C 1 Antwort Letzte Antwort
                        0
                        • H Hotze

                          @carsten04
                          Schönes Teil, leider habe ich den Adapter nicht mit Stauwarnungen in Verbindung gebracht!
                          Naja, den werde ich auch testen!
                          Darf ich fragen woher die daten Stammen? Warnt der auch vor Sperrung und langsamem Verkehr?

                          carsten04C Offline
                          carsten04C Offline
                          carsten04
                          Developer
                          schrieb am zuletzt editiert von carsten04
                          #41

                          @Hotze Daten kommen von `https://cdn2.atudo.net/api/4.0/pois.php und Mapbox. Die atudo.net-Daten werden z.B. auch von blitzer.de genutzt. Mapbox brauche ich für die Routen.

                          H 1 Antwort Letzte Antwort
                          0
                          • carsten04C carsten04

                            @Hotze Daten kommen von `https://cdn2.atudo.net/api/4.0/pois.php und Mapbox. Die atudo.net-Daten werden z.B. auch von blitzer.de genutzt. Mapbox brauche ich für die Routen.

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

                            @carsten04
                            Vielen Dank!
                            Das Ist echt an mir vorbei gegangen. Die Scheinen aber fast genau so vorzugehen wie ich (box= lat1,lon1,lat2,lon2; rechteckiger Kartenausschnitt)
                            Da kann ich mir was basteln!
                            Vermutlich nutze ich einfach deinen adapter.

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

                              @hotze
                              Wenn ich versuche die JSON per Blockly zu zerlegen.
                              Etwa so:
                              c71f926e-b1bd-480b-989f-e6b6b47270e6-grafik.png

                              Kommt immer:

                              javascript.0	19:15:20.474	error	
                              Cannot parse "0_userdata.0.Verkehr_JSON": SyntaxError: Unexpected non-whitespace character after JSON at position 1 (line 1 column 2)
                              

                              Können die Infomeldungen im LOG auch auf Debug umgestellt werden?

                              Wenn ichs so probiere kommt immer "undefined":
                              befc2179-e8a6-4f61-94ba-30e26c4ef858-grafik.png

                              H haus-automatisierungH 2 Antworten Letzte Antwort
                              0
                              • R Rushmed

                                @hotze
                                Wenn ich versuche die JSON per Blockly zu zerlegen.
                                Etwa so:
                                c71f926e-b1bd-480b-989f-e6b6b47270e6-grafik.png

                                Kommt immer:

                                javascript.0	19:15:20.474	error	
                                Cannot parse "0_userdata.0.Verkehr_JSON": SyntaxError: Unexpected non-whitespace character after JSON at position 1 (line 1 column 2)
                                

                                Können die Infomeldungen im LOG auch auf Debug umgestellt werden?

                                Wenn ichs so probiere kommt immer "undefined":
                                befc2179-e8a6-4f61-94ba-30e26c4ef858-grafik.png

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

                                @Rushmed
                                Also mit Blockly sind JSON ausgaben etwas tricky, du musst das erst "parsen"!
                                Ich konnte dein Problem auch mit anderen JSON Datenpunkten nachstellen!

                                Funktioniert hatte es dann so:
                                d6ba9c34-0dbe-43c9-8aa3-b29cbc975eb9-grafik.png

                                Dass heißt du MUSST aktiv triggern!

                                Es geht aber auch anders, das ist aber ein wenig umständlich. Du musst erst zu einem String konvertieren und kannst diesen dann auswerten!

                                Weil ein Bild mehr als Worte sagt, hier (du benötigst NUR den letzten Debug-Block, der rest ist Erklärung):
                                19eccc3c-d587-4a35-894b-9a5db4e889d1-grafik.png

                                • Die ersten beiden blöcken geben eine Zahl zurück (Infozeile 2 und 3).
                                • Wenn du dir den Text dazwischen ausgeben lassen willst geht das mit dem dritten Debug-Block. Unter Umständen kommt dann aber zuviel aus dem String (Infozeile 4)!
                                • Im vierten Block ist dann auch das trimming drin!

                                Hier die Erklärung was der Block macht:
                                Im Text Konvertiert nach String bekommt jedes Zeichen eine Positionsnummer (aufsteigend).
                                Ausgegeben werden Positionsnummern mit denen man auch rechnen kann.
                                Damit kann die genaue Positionsnummer zwischen zwei wiederkehrenden begriffen bestimmt werden. Wenn das Ergebnis nicht ganz passt kann man noch positionen nach rechts (+) und links (-) gerückt werden.

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

                                  Ok, danke das funktioniert.
                                  In anderen JSON kann ich aber einfach über den Baustein:

                                  grafik.png

                                  die Informationen extrahieren.

                                  Bspw diese JSON aus dem Alexa Adapter:

                                  {"name":"Küche Studio","serialNumber":"G2A0XX47103500JT","summary":"licht aus","creationTime":1767132098880,"domainApplicationId":"","domainApplicationName":"","cardContent":"","card":"","answerText":"","utteranceType":"DEVICE_ARBITRATION","domain":"","intent":"Unknown"}
                                  

                                  f7f126c9-ff74-42b9-adba-3fcca5df0f74-grafik.png

                                  Das ist doch bestimmt so ein Object/String/JSO-was weiß ich was Ding.

                                  Ich bin begeistert von deinem Script weil es einfach ist!
                                  Der Radar-Trap Adapter bietet sauviele (für mich zuviele) Informationen die sicher mit einer VIS toll habdlebar sind.
                                  Ich bekomme dort mit zwei Routen und einem Gebiet 782 DPs und der rüsslt mir 150 MB RAM weg. Das ist Overkill für meine Anwendung.
                                  Das brauche ich alles nicht.
                                  Ich möchte hauptsächlich Infos zu Verkehrsproblemen für mein Strecke zuhause --> Arbeit und andersrum haben. Da passt das was dein Script leistet schon gut.

                                  Was ich brauche ist eine per Blockly gut handlebare JSON.
                                  Damit kann ich meine Alexa Morgenroutine genauso gut füttern wie eine Telegram Meldung zum Feierabend.

                                  Wie gesagt, es wäre toll wenn man Richtungen unterscheiden könnte, keine Ahnung ob das geht.

                                  Die Zeilenumbrüche (\n) brauche ich in der JSON nicht. Gerne können dafür weitere Atrribute dazu kommen, wie im Original mit "description 1....x".

                                  Die Blitzer Interessieren mich sowiesonicht und meine Strecke besteht zu 90% aus Autobahn.

                                  Danke vorab und einen guten Rutsch!

                                  1 Antwort Letzte Antwort
                                  0
                                  • R Rushmed

                                    @hotze
                                    Wenn ich versuche die JSON per Blockly zu zerlegen.
                                    Etwa so:
                                    c71f926e-b1bd-480b-989f-e6b6b47270e6-grafik.png

                                    Kommt immer:

                                    javascript.0	19:15:20.474	error	
                                    Cannot parse "0_userdata.0.Verkehr_JSON": SyntaxError: Unexpected non-whitespace character after JSON at position 1 (line 1 column 2)
                                    

                                    Können die Infomeldungen im LOG auch auf Debug umgestellt werden?

                                    Wenn ichs so probiere kommt immer "undefined":
                                    befc2179-e8a6-4f61-94ba-30e26c4ef858-grafik.png

                                    haus-automatisierungH Online
                                    haus-automatisierungH Online
                                    haus-automatisierung
                                    Developer Most Active
                                    schrieb am zuletzt editiert von
                                    #46

                                    @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                    @hotze
                                    Wenn ich versuche die JSON per Blockly zu zerlegen.
                                    Etwa so:
                                    c71f926e-b1bd-480b-989f-e6b6b47270e6-grafik.png

                                    Die Objekt ID ist ja ein String (daher ist der Baustein ja auch grün, wie alle Strings). Das ist also kein gültiges JSON. Der state.val wird ja JSON sein. Also "Wert von Objekt ...". So wie Du es unten zeigst.

                                    @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                    Ok, danke das funktioniert.
                                    In anderen JSON kann ich aber einfach über den Baustein:

                                    grafik.png

                                    die Informationen extrahieren.

                                    So ist es richtig. Bitte kein komischen Teilstrings suchen und extrahieren. So arbeitet man nicht mit JSON. Zeig am besten mal das JSON und was Du haben möchtest. Dann kann man auch helfen die Eigenschaften zu extrahieren. Du hast ja nur die Objekt-Definition aus der Objekt-Datenbank geteilt. Nicht den State.

                                    🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                    🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                    📚 Meine inoffizielle ioBroker Dokumentation

                                    H 1 Antwort Letzte Antwort
                                    0
                                    • haus-automatisierungH haus-automatisierung

                                      @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                      @hotze
                                      Wenn ich versuche die JSON per Blockly zu zerlegen.
                                      Etwa so:
                                      c71f926e-b1bd-480b-989f-e6b6b47270e6-grafik.png

                                      Die Objekt ID ist ja ein String (daher ist der Baustein ja auch grün, wie alle Strings). Das ist also kein gültiges JSON. Der state.val wird ja JSON sein. Also "Wert von Objekt ...". So wie Du es unten zeigst.

                                      @Rushmed sagte in #Stauerkennung #DieAutobahn:

                                      Ok, danke das funktioniert.
                                      In anderen JSON kann ich aber einfach über den Baustein:

                                      grafik.png

                                      die Informationen extrahieren.

                                      So ist es richtig. Bitte kein komischen Teilstrings suchen und extrahieren. So arbeitet man nicht mit JSON. Zeig am besten mal das JSON und was Du haben möchtest. Dann kann man auch helfen die Eigenschaften zu extrahieren. Du hast ja nur die Objekt-Definition aus der Objekt-Datenbank geteilt. Nicht den State.

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

                                      @haus-automatisierung @rushmed

                                      Das JSON sieht so aus:

                                      [
                                       {
                                         "road": "A1",
                                         "title": "A1 | Wuppertal-Langerfeld - Wuppertal-Nord",
                                         "description": "Beginn: 31.12.25 um 13:40 Uhr\nAngespannte Verkehrslage, seit 31.12.2025, 13:40\nA1: Köln -> Dortmund, zwischen 0.6 km hinter AS Wuppertal-Langerfeld und 3.1 km vor AK Wuppertal-Nord\nIm Stillstand\nDurchschnittsgeschwindigkeit: 43 km/h",
                                         "start": "2025-12-31T13:40:00+01:00",
                                         "coordinate": {
                                           "lat": 51.28829864653024,
                                           "lon": 7.257013201816567
                                         },
                                         "mapLink": "https://www.google.com/maps/@51.28829864653024,7.257013201816567,13.13z"
                                       },
                                       {
                                         "road": "A1",
                                         "title": "A1 | Münster-Süd - Münsterland",
                                         "description": "Beginn: 31.12.25 um 11:36 Uhr\nFahrzeug-Hindernis, seit 31.12.2025, 11:36\nA1: Dortmund -> Osnabrück, zwischen 2.7 km hinter AK Münster-Süd und 0.3 km vor Münsterland\nGefahr durch ein defektes Fahrzeug auf der Fahrbahn",
                                         "start": "2025-12-31T11:36:00+01:00",
                                         "coordinate": {
                                           "lat": 51.93859014791594,
                                           "lon": 7.551148744931167
                                         },
                                         "mapLink": "https://www.google.com/maps/@51.93859014791594,7.551148744931167,13.13z"
                                       }
                                      ]
                                      

                                      Ich habe einen Abschnitt mit zwei meldungen erstellt, denn das kann ja mal vorkommen!
                                      Was Blocklys an geht bin ich aber auch kein Held!

                                      Man könnte im Script einstellen für jede meldung einen Datenpunkt zu erzeugen. Oder auch ein Verzeichnis pro Meldung und dort für jeden Punkt im JSON einen Datenpunkt.
                                      Das würde aber wiederum nicht so sparsam sein wie ich es gerne hätte.

                                      haus-automatisierungH 1 Antwort Letzte Antwort
                                      0
                                      • H Hotze

                                        @haus-automatisierung @rushmed

                                        Das JSON sieht so aus:

                                        [
                                         {
                                           "road": "A1",
                                           "title": "A1 | Wuppertal-Langerfeld - Wuppertal-Nord",
                                           "description": "Beginn: 31.12.25 um 13:40 Uhr\nAngespannte Verkehrslage, seit 31.12.2025, 13:40\nA1: Köln -> Dortmund, zwischen 0.6 km hinter AS Wuppertal-Langerfeld und 3.1 km vor AK Wuppertal-Nord\nIm Stillstand\nDurchschnittsgeschwindigkeit: 43 km/h",
                                           "start": "2025-12-31T13:40:00+01:00",
                                           "coordinate": {
                                             "lat": 51.28829864653024,
                                             "lon": 7.257013201816567
                                           },
                                           "mapLink": "https://www.google.com/maps/@51.28829864653024,7.257013201816567,13.13z"
                                         },
                                         {
                                           "road": "A1",
                                           "title": "A1 | Münster-Süd - Münsterland",
                                           "description": "Beginn: 31.12.25 um 11:36 Uhr\nFahrzeug-Hindernis, seit 31.12.2025, 11:36\nA1: Dortmund -> Osnabrück, zwischen 2.7 km hinter AK Münster-Süd und 0.3 km vor Münsterland\nGefahr durch ein defektes Fahrzeug auf der Fahrbahn",
                                           "start": "2025-12-31T11:36:00+01:00",
                                           "coordinate": {
                                             "lat": 51.93859014791594,
                                             "lon": 7.551148744931167
                                           },
                                           "mapLink": "https://www.google.com/maps/@51.93859014791594,7.551148744931167,13.13z"
                                         }
                                        ]
                                        

                                        Ich habe einen Abschnitt mit zwei meldungen erstellt, denn das kann ja mal vorkommen!
                                        Was Blocklys an geht bin ich aber auch kein Held!

                                        Man könnte im Script einstellen für jede meldung einen Datenpunkt zu erzeugen. Oder auch ein Verzeichnis pro Meldung und dort für jeden Punkt im JSON einen Datenpunkt.
                                        Das würde aber wiederum nicht so sparsam sein wie ich es gerne hätte.

                                        haus-automatisierungH Online
                                        haus-automatisierungH Online
                                        haus-automatisierung
                                        Developer Most Active
                                        schrieb am zuletzt editiert von haus-automatisierung
                                        #48

                                        @Hotze sagte in #Stauerkennung #DieAutobahn:

                                        Was Blocklys an geht bin ich aber auch kein Held!

                                        Das kann man ja lernen. Soll ja ganz ausführlicher Lerninhalte geben ;)

                                        Das ist ein Array aus Objekten. Also erstmal über den Index zugreifen: 0.road bzw. 1.road. Alternativ mit einer Schleife über alle Objekte gehen:

                                        Screenshot 2025-12-31 at 12.55.32.png

                                        🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                        🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                        📚 Meine inoffizielle ioBroker Dokumentation

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

                                          So!
                                          Nun hatte ich einige Zeit und habe mal ein echtes Durcheinander veranstaltet, so dass nur der Kern des Eigendlichen Scriptes übrig blieb!

                                          Ich habe es ordentlich erweitert:

                                          • Zeitfenster (Uhrzeiten):
                                            • Startzeitfenster zwischen zwei Uhrzeiten Vormittags und nachmittags, bzw. Fenster 1 und 2
                                            • Fester Stop für Vormittags und Nachmittags
                                          • "Jitter" der im gewählten Startzeitsfenster variiert
                                          • "Jitter" der das Intervall (15min) um +- 30 Sekunden variiert
                                          • Richtung in der Meldung und den Datenpunkten (im JSON unter subtitel)

                                          Zumindest lief dieses Script bei mir fehlerfrei durch:

                                          /* =========================
                                            Staumelder Skript mit Zeitfenstern und Jitter
                                            - Startet zufällig im Startfenster (z.B. 04:58..05:02)
                                            - Stoppt zu festen Zeiten (z.B. 07:30 / 17:00)
                                            - Intervall: 15 Minuten +/- 30 Sekunden (bei jedem Lauf neu)
                                            ========================= */
                                          
                                          /*
                                          
                                          Beschreibung
                                          
                                          Dieses Skript überwacht Verkehrswarnungen über die Autobahn‑API für die in der Variable `roadId` konfigurierte Autobahn.
                                          Es filtert Meldungen nach dem definierten Koordinatenbereich (coordsArea). 
                                          
                                          Wichtig: Vor dem ersten Start unbedingt die Variable `roadId` auf die gewünschte Autobahn setzen (z. B. "A45", "A3" etc.).
                                          
                                          
                                          Ausgaben (einzeln schaltbar):
                                          
                                          - telegramBasicEnabled    : Telegram‑Nachricht ohne Link
                                          - telegramWithLinkEnabled : Telegram‑Nachricht mit Google‑Maps‑Link
                                          - dpAlexaEnabled          : Klartext‑Datenpunkt (z. B. idAlexa) für Alexa, OHNE Maps‑Link
                                          - dpJsonEnabled           : JSON‑Datenpunkt (z. B. idJSON) für Auswertungen, MIT Maps‑Link 
                                          
                                          Verhalten:
                                          - Datenpunkte werden nur angelegt, wenn der jeweilige Schalter aktiviert ist.
                                          - Beim Start führt das Skript einmal checkTraffic() aus und wiederholt dann alle 15 Minuten (relativ zur Startzeit).
                                          - Maps‑Link wird nur erzeugt, wenn Koordinaten vorhanden sind.
                                          
                                          Hinweise:
                                          - Stelle diese Variablen korrekt ein:
                                            - roadId
                                            - coordsArea
                                            - telegramInstance (normalerweise ist es telegram.0)
                                            - telegramChatId
                                            - idAlexa 
                                            - idJSON
                                          
                                          - Passe die Schalter an
                                          */
                                          
                                          /* =========================
                                            Konfiguration
                                            ========================= */
                                          
                                          // Autobahn / Bereich
                                          const roadId = "A1";
                                          const coordsArea = {
                                             minLat: 49.0,   // untere Grenze Breite
                                             maxLat: 51.2742993,   // obere Grenze Breite
                                             minLon: 6,    // linke Grenze Länge
                                             maxLon: 8.3822071     // rechte Grenze Länge
                                          };
                                          
                                          // Ausgabeschalter (0 = aus, 1 = an)
                                          const telegramBasicEnabled    = 1; // Telegram: Nachricht ohne Link
                                          const telegramWithLinkEnabled = 1; // Telegram: Nachricht mit Maps-Link
                                          const dpAlexaEnabled          = 0; // Alexa Klartext-DP
                                          const dpJsonEnabled           = 1; // JSON-DP
                                          
                                          // Telegram-Konfiguration
                                          const telegramInstance = "telegram.0";
                                          const telegramChatId   = 123456789;
                                          
                                          // Datenpunkt-IDs (falls dpAlexaEnabled / dpJsonEnabled = 1)
                                          const idAlexa = "0_userdata.0.Verkehr_Alexa";
                                          const idJSON  = "0_userdata.0.Verkehr_JSON";
                                          
                                          /* =========================
                                            Zeitfenster Konfiguration
                                            =========================
                                            Format: "HH:MM" (24h)
                                          
                                            - morningStart..morningStartWindowEnd: Startfenster morgens (zufälliger Start)
                                            - morningStop: feste Stoppzeit morgens
                                            - afternoonStart..afternoonStartWindowEnd: Startfenster nachmittags (zufälliger Start)
                                            - afternoonStop: feste Stoppzeit nachmittags
                                          */
                                          const morningStart            = "04:58"; // frühester Startzeitpunkt morgens (Startfenster beginnt)
                                          const morningStartWindowEnd   = "05:02"; // spätester Startzeitpunkt morgens (Startfenster endet)
                                          const morningStop             = "07:30"; // feste Stoppzeit morgens
                                          
                                          const afternoonStart          = "12:58"; // frühester Startzeitpunkt nachmittags (Startfenster beginnt)
                                          const afternoonStartWindowEnd = "13:02"; // spätester Startzeitpunkt nachmittags (Startfenster endet)
                                          const afternoonStop           = "16:00"; // feste Stoppzeit nachmittags
                                          
                                          /* =========================
                                            Intervall und Jitter
                                            =========================
                                            baseIntervalMs   = 15 Minuten in Millisekunden
                                            perRunJitterMs   = +/- 30 Sekunden (wird bei jedem Intervall neu berechnet)
                                          */
                                          const baseIntervalMs = 15 * 60 * 1000; // 15 Minuten
                                          const perRunJitterMs = 30 * 1000;      // +/- 30 Sekunden
                                          
                                          /* =========================
                                            Initiale Datenpunkt-Anlage (falls aktiviert)
                                            ========================= */
                                          if (dpAlexaEnabled === 1) {
                                             createState(idAlexa, "", false, {
                                                 name: "Verkehrsmeldung Klartext",
                                                 type: "string",
                                                 role: "value"
                                             });
                                          }
                                          if (dpJsonEnabled === 1) {
                                             createState(idJSON, "[]", false, {
                                                 name: "Verkehrsmeldung JSON",
                                                 type: "string",
                                                 role: "json"
                                             });
                                          }
                                          
                                          /* =========================
                                            API-URL und optionaler axios-Fallback
                                            ========================= */
                                          const url = `https://verkehr.autobahn.de/o/autobahn/${roadId}/services/warning`;
                                          
                                          let axiosClient = null;
                                          try {
                                             axiosClient = require("axios");
                                          } catch (e) {
                                             console.warn("axios nicht verfügbar. Falls nötig: npm install axios oder require() im JS-Adapter aktivieren.");
                                             axiosClient = null;
                                          }
                                          
                                          /* =========================
                                            Hilfsfunktionen Zeit
                                            ========================= */
                                          function parseTimeToMinutes(hhmm) {
                                             const [h, m] = String(hhmm).split(":").map(Number);
                                             return (h || 0) * 60 + (m || 0);
                                          }
                                          
                                          function nowInMinutes() {
                                             const d = new Date();
                                             return d.getHours() * 60 + d.getMinutes();
                                          }
                                          
                                          // prüft, ob 'now' in [start, stop) liegt; unterstützt stop < start (Über Mitternacht)
                                          function isNowInWindow(startHHMM, stopHHMM) {
                                             const start = parseTimeToMinutes(startHHMM);
                                             const stop  = parseTimeToMinutes(stopHHMM);
                                             const now   = nowInMinutes();
                                             if (start <= stop) {
                                                 return now >= start && now < stop;
                                             } else {
                                                 // Fenster über Mitternacht, z.B. 23:00 - 02:00
                                                 return now >= start || now < stop;
                                             }
                                          }
                                          
                                          // ms bis zum nächsten Start eines der Fenster (ohne Random-Startoffset)
                                          function msUntilNextWindowStartSimple(windows) {
                                             const now = new Date();
                                             const nowMs = now.getTime();
                                             const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
                                             let best = Infinity;
                                          
                                             for (const [startHHMM] of windows) {
                                                 const [sh, sm] = startHHMM.split(":").map(Number);
                                                 let startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), sh, sm, 0, 0);
                                                 if (startDate.getTime() <= nowMs) {
                                                     startDate = new Date(startDate.getTime() + 24 * 3600 * 1000);
                                                 }
                                                 const diff = startDate.getTime() - nowMs;
                                                 if (diff < best) best = diff;
                                             }
                                             return best === Infinity ? 0 : best;
                                          }
                                          
                                          // ms bis zum nächsten Start eines der Fenster inklusive zufälligem Startoffset
                                          // startWindowEnds: Array mit passenden Endzeiten für die Startfenster (z.B. morningStartWindowEnd)
                                          function msUntilNextWindowStartWithRandomOffset(windows, startWindowEnds) {
                                             const now = new Date();
                                             const nowMs = now.getTime();
                                             const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
                                             let best = { diff: Infinity, idx: -1, startDate: null };
                                          
                                             for (let i = 0; i < windows.length; i++) {
                                                 const startHHMM = windows[i][0];
                                                 const [sh, sm] = startHHMM.split(":").map(Number);
                                                 let startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate(), sh, sm, 0, 0);
                                                 if (startDate.getTime() <= nowMs) {
                                                     // Wenn Start heute bereits vorbei, prüfe ob wir aktuell im Fenster sind
                                                     const startMin = parseTimeToMinutes(windows[i][0]);
                                                     const stopMin  = parseTimeToMinutes(windows[i][1]);
                                                     const nowMin   = nowInMinutes();
                                                     const inWindow = (startMin <= stopMin) ? (nowMin >= startMin && nowMin < stopMin) : (nowMin >= startMin || nowMin < stopMin);
                                                     if (inWindow) {
                                                         return { ms: 0, idx: i, offsetMs: 0 };
                                                     }
                                                     // sonst Start morgen
                                                     startDate = new Date(startDate.getTime() + 24 * 3600 * 1000);
                                                 }
                                                 const diff = startDate.getTime() - nowMs;
                                                 if (diff < best.diff) {
                                                     best = { diff, idx: i, startDate };
                                                 }
                                             }
                                          
                                             if (best.idx === -1) return { ms: 0, idx: -1, offsetMs: 0 };
                                          
                                             // berechne zufälligen Offset innerhalb des Startfensters für die gewählte Window-Start
                                             const startHHMM = windows[best.idx][0];
                                             const endHHMM   = startWindowEnds[best.idx];
                                             const startMin = parseTimeToMinutes(startHHMM);
                                             const endMin   = parseTimeToMinutes(endHHMM);
                                             // Falls end < start (über Mitternacht) behandeln wir das nicht für Startfenster; erwartet end >= start
                                             const rangeMs = Math.max(0, (endMin - startMin) * 60 * 1000);
                                             const offsetMs = rangeMs > 0 ? Math.floor(Math.random() * (rangeMs + 1)) : 0;
                                          
                                             return { ms: best.diff + offsetMs, idx: best.idx, offsetMs };
                                          }
                                          
                                          /* =========================
                                            HTTP Helper und checkTraffic
                                            ========================= */
                                          async function fetchJson(url) {
                                             if (axiosClient) {
                                                 const res = await axiosClient.get(url);
                                                 return res.data;
                                             }
                                             if (typeof fetch === "function") {
                                                 const res = await fetch(url);
                                                 return await res.json();
                                             }
                                             throw new Error("Kein HTTP-Client verfügbar. Bitte axios installieren oder require() im JS-Adapter aktivieren.");
                                          }
                                          
                                          function isInArea(lat, lon, area) {
                                             return lat >= area.minLat && lat <= area.maxLat && lon >= area.minLon && lon <= area.maxLon;
                                          }
                                          
                                          function warningHitsArea(w, area) {
                                             if (w.coordinate && typeof w.coordinate.lat === "number" && typeof w.coordinate.long === "number") {
                                                 if (isInArea(w.coordinate.lat, w.coordinate.long, area)) return true;
                                             }
                                             if (w.geometry && Array.isArray(w.geometry.coordinates)) {
                                                 for (const c of w.geometry.coordinates) {
                                                     if (Array.isArray(c) && c.length >= 2) {
                                                         const lon = c[0], lat = c[1];
                                                         if (isInArea(lat, lon, area)) return true;
                                                     }
                                                 }
                                             }
                                             return false;
                                          }
                                          
                                          function buildDescriptionText(desc) {
                                             if (Array.isArray(desc)) return desc.filter(d => d && String(d).trim() !== "").join("\n");
                                             return String(desc || "").trim();
                                          }
                                          
                                          async function checkTraffic() {
                                             try {
                                                 console.log("Hole Daten von:", url, "Zeit:", new Date().toLocaleString());
                                                 const data = await fetchJson(url);
                                                 const warnings = data.warnings || data.warning;
                                          
                                                 if (!warnings || !Array.isArray(warnings) || warnings.length === 0) {
                                                     console.log("Keine Warnungen gefunden.");
                                                     if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen auf " + roadId);
                                                     if (dpJsonEnabled === 1) setState(idJSON, "[]");
                                                     return;
                                                 }
                                          
                                                 const relevant = warnings.filter(w => warningHitsArea(w, coordsArea));
                                                 if (!relevant || relevant.length === 0) {
                                                     console.log("Keine Warnungen im Bereich.");
                                                     if (dpAlexaEnabled === 1) setState(idAlexa, "Keine Warnungen im Bereich auf " + roadId);
                                                     if (dpJsonEnabled === 1) setState(idJSON, "[]");
                                                     return;
                                                 }
                                          
                                                 console.log(`${relevant.length} Warnung(en) im Bereich gefunden.`);
                                          
                                                 let alexaText = "";
                                                 const jsonOut = [];
                                          
                                                 for (const w of relevant) {
                                                     const desc = buildDescriptionText(w.description);
                                                     let lat = null, lon = null;
                                                     if (w.coordinate) { lat = w.coordinate.lat; lon = w.coordinate.long; }
                                                     if ((!lat || !lon) && w.point) {
                                                         const p = String(w.point).split(",");
                                                         if (p.length === 2) { lat = p[0]; lon = p[1]; }
                                                     }
                                          
                                                     const mapLink = (lat && lon) ? `https://www.google.com/maps/@${lat},${lon},13.13z` : "";
                                          
                                                     if (telegramBasicEnabled === 1) {
                                                         const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}`;
                                                         sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                                                     }
                                          
                                                     if (telegramWithLinkEnabled === 1 && mapLink) {
                                                         const msg = `⚠️ Störung auf ${roadId}:\n${w.title}\n${desc}\n\n📍 ${mapLink}`;
                                                         sendTo(telegramInstance, "send", { chatId: telegramChatId, text: msg });
                                                     }
                                          
                                                     if (dpAlexaEnabled === 1) {
                                                         alexaText += `Störung auf ${roadId}: ${w.title}. ${desc}\n\n`;
                                                     }
                                          
                                                     if (dpJsonEnabled === 1) {
                                                         jsonOut.push({
                                                             road: roadId,
                                                             title: w.title,
                                                             description: desc,
                                             				subtitle: w.subtitle || null,
                                                             start: w.startTimestamp || null,
                                                             coordinate: lat && lon ? { lat: lat, lon: lon } : null,
                                                             mapLink: mapLink || null
                                                         });
                                                     }
                                                 }
                                          
                                                 if (dpAlexaEnabled === 1) setState(idAlexa, alexaText.trim());
                                                 if (dpJsonEnabled === 1) setState(idJSON, JSON.stringify(jsonOut, null, 2));
                                          
                                             } catch (err) {
                                                 console.error("Fehler beim Abruf:", err && err.message ? err.message : err);
                                                 if (telegramBasicEnabled === 1 || telegramWithLinkEnabled === 1) {
                                                     sendTo(telegramInstance, "send", {
                                                         chatId: telegramChatId,
                                                         text: `❌ Fehler beim Abruf der Verkehrsdaten: ${err && err.message ? err.message : err}`
                                                     });
                                                 }
                                                 if (dpAlexaEnabled === 1) setState(idAlexa, "Fehler beim Abruf der Verkehrsdaten");
                                                 if (dpJsonEnabled === 1) setState(idJSON, "[]");
                                             }
                                          }
                                          
                                          /* =========================
                                            Scheduler Loop
                                            ========================= */
                                          
                                          // Definiere die aktiven Fenster als Array [start, stop]
                                          const activeWindows = [
                                             [morningStart, morningStop],
                                             [afternoonStart, afternoonStop]
                                          ];
                                          // Startfenster-Endzeiten (parallel zu activeWindows, für zufälligen Startoffset)
                                          const startWindowEnds = [
                                             morningStartWindowEnd,
                                             afternoonStartWindowEnd
                                          ];
                                          
                                          async function schedulerLoop() {
                                             try {
                                                 const active = activeWindows.some(w => isNowInWindow(w[0], w[1]));
                                                 if (active) {
                                                     // innerhalb eines aktiven Fensters: check ausführen
                                                     await checkTraffic();
                                                 } else {
                                                     console.log("Nicht im aktiven Fenster — checkTraffic übersprungen:", new Date().toLocaleString());
                                                 }
                                             } catch (e) {
                                                 console.error("Fehler im SchedulerLoop:", e && e.message ? e.message : e);
                                             } finally {
                                                 // nächsten Delay berechnen: baseInterval +/- jitter
                                                 const jitter = Math.floor(Math.random() * (2 * perRunJitterMs + 1)) - perRunJitterMs; // -perRunJitterMs .. +perRunJitterMs
                                                 const nextDelay = Math.max(0, baseIntervalMs + jitter);
                                          
                                                 // Wenn wir aktuell außerhalb aller Fenster sind, prüfen wir, ob ein Sprung zum nächsten Fenster sinnvoll ist
                                                 const activeNow = activeWindows.some(w => isNowInWindow(w[0], w[1]));
                                                 if (!activeNow) {
                                                     const next = msUntilNextWindowStartWithRandomOffset(activeWindows, startWindowEnds);
                                                     const msToNextWindowWithOffset = next.ms;
                                                     if (msToNextWindowWithOffset > 0 && msToNextWindowWithOffset < nextDelay) {
                                                         console.log(`Außerhalb Fenster. Springe in ${Math.round(msToNextWindowWithOffset/1000)}s zum nächsten Fensterstart (inkl. zufälligem Startoffset ${Math.round(next.offsetMs/1000)}s).`);
                                                         setTimeout(schedulerLoop, msToNextWindowWithOffset);
                                                         return;
                                                     }
                                                 }
                                          
                                                 console.log(`Nächster Scheduler-Lauf in ${Math.round(nextDelay/1000)}s (Jitter ${jitter} ms).`);
                                                 setTimeout(schedulerLoop, nextDelay);
                                             }
                                          }
                                          
                                          /* =========================
                                            Start beim Laden
                                            ========================= */
                                          (async () => {
                                             // Beim Start: wenn aktuell aktiv, sofort check ausführen
                                             if (activeWindows.some(w => isNowInWindow(w[0], w[1]))) {
                                                 await checkTraffic();
                                             } else {
                                                 const next = msUntilNextWindowStartWithRandomOffset(activeWindows, startWindowEnds);
                                                 console.log("Beim Start nicht im aktiven Fenster. Nächster Fensterstart in", Math.round(next.ms/1000), "Sekunden (inkl. zufälligem Startoffset).");
                                             }
                                             // Loop starten
                                             schedulerLoop();
                                          })();
                                          
                                          

                                          Mit der Variation sollten die Abfragen auf die API gut verteilt sein!

                                          So und nun wird gefeiert! Guten rutsch wünsche ich Euch!

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          734

                                          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