Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Telegram Reihenfolge Ausgabe falsch

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Telegram Reihenfolge Ausgabe falsch

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      drapo last edited by drapo

      Hallo zusammen

      Ich gebe mir mittels dem folgenden Skript und dem Radar-Trap Adapter neue Radar Meldungen über Telegram aus. Dabei erhalte ich die GPS Daten als Karte und ich möchte natürlich direkt unter der Karte auch den Ort und die Strasse haben. Leider bekomme ich es häufig wie auf dem Bild völlig nach Zufall. So ist es nicht lesbar. Wie kann ich das verbessern dass das alles in der richtigen Reihenfolge erscheint?

      
      function sendImage() {
      
          var Liste, telegram, i, obj, koordinaten, lon, lat, Stadt, Strasse;
      
      
      Liste = getState('radar-trap.0.mi7-x6GA0Bg75EzychceA.direction-0.speedTraps').val;
      telegram = '';
      var i_end = Liste.length;
      var i_inc = 1;
      if (1 > i_end) {
        i_inc = -i_inc;
      }
      for (i = 1; i_inc >= 0 ? i <= i_end : i >= i_end; i += i_inc) { 
        obj = Liste[(i - 1)];
        koordinaten = getAttr(obj, 'geometry.coordinates');
        lon = parseFloat((koordinaten[0]));
        lat = parseFloat((koordinaten[1]));
        Stadt = getAttr(obj, 'properties.city');
        Strasse = getAttr(obj, 'properties.street');
        telegram = [Strasse,'\n',Stadt].join('');
        setTimeout(3000);             
              sendTo('telegram.0', {
      
                  text: telegram
      
              });
          setTimeout(3000); 
              sendTo('telegram.0', {
      
                  latitude: lat,
                  longitude: lon,
      
              });
          }
       };
      
      on("javascript.0.Test", function (obj) {
      
              sendTo('telegram.0', {text: 'Achtung neuer Radar!''});
              setTimeout(sendImage, 2000);
      
          
       });
      
      

      und so sieht es dann in Telegram aus. Vor allem wenn es viele Meldungen sind total unbrauchbar.

      b090ef77-54a6-46af-a227-55d8a2a57bf8-grafik.png

      haus-automatisierung 1 Reply Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @drapo last edited by haus-automatisierung

        @drapo setTimeout funktioniert so nicht. Damit kannst Du keine Ausführung auf die Art verzögern.

        Du kannst wait nutzen. Das liefert ein Promise zurück, wodurch Du mit await die Ausführung pausieren kannst:

        https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#wait

        Dafür muss deine Funktion aber als asynchron definiert werden. Ist nix ioBroker spezifisches. Javascript Promises anschauen.

        D 1 Reply Last reply Reply Quote 0
        • D
          drapo @haus-automatisierung last edited by

          @haus-automatisierung und wie kann ich mein problem lösen? am liebsten wäre mir natürlich wenn die Strasse und der Ort direkt in der GPS Nachricht verbaut ist. Wenn das nicht geht lebe ich natürlich auch mit 2 Nachrichten resp. 1x GPS und 1x Strasse und Ort. Nur in der richtigen Reihenfolge muss es kommen.

          Wie löse ich so etwas?

          haus-automatisierung 1 Reply Last reply Reply Quote 0
          • haus-automatisierung
            haus-automatisierung Developer Most Active @drapo last edited by haus-automatisierung

            @drapo Erstmal solltest Du deinen Code richtig einrücken und alles überflüssige entfernen. Sieht ja schrecklich aus 🙂

            So z.B. (nur im Browser programmiert, also keine Garantie auf Vollständigkeit):

            async function sendImage() {
                const speedTraps = getState('radar-trap.0.mi7-x6GA0Bg75EzychceA.direction-0.speedTraps').val;
            
                for (const speedTrap of speedTraps) {
                    await sendToAsync('telegram.0', {
                        text: `${speedTrap.properties.city}\n${speedTrap.properties.street}`
                    });
            
                    await wait(1000);
            
                    const coordinates = speedTrap.geometry.coordinates;
            
                    await sendToAsync('telegram.0', {
                        latitude: parseFloat(coordinates[1]),
                        longitude: parseFloat(coordinates[0]),
                    });
                }
            }
            
            on('javascript.0.Test', async (obj) => {
                await sendToAsync('telegram.0', { text: 'Achtung neuer Radar!' });
                setTimeout(sendImage, 2000);
            });
            
            
            D 2 Replies Last reply Reply Quote 0
            • D
              drapo @haus-automatisierung last edited by

              @haus-automatisierung wenn man weiss wie es geht scheint es am Ende immer sehr einfach. Muss ehrlich sagen denke das hätte ich alleine nicht geschafft. Danke Dir vielmals. Ausserdem bin ich doch recht stolz dass mir DER Matthias Kleine geholfen hat 🙂

              1 Reply Last reply Reply Quote 1
              • D
                drapo @haus-automatisierung last edited by drapo

                @haus-automatisierung das skript läuft soweit und macht das was es soll. Ich habe allerdings eine Herausforderung bei der ich Dich nochmals um Hilfe bitten möchte.

                Es kann nun sein, dass ich Informationen zu bestehenden Blitzern erneut kriege. Da ich einen Blitzer aber nur einmal als neu angezeigt haben möchte, müsste man die json mit den inhalten vergleichen. Am besten nur city und street vergleichen da die anderen inhalte nicht relevant sind. Wenn ein Eintrag neu dazu gekommen ist, soll die Info kommen. Wenn jedoch alles gleich ist, dann keine neue Info.

                Könntest Du mir nochmals behilflich sein? Dank Dir

                haus-automatisierung 1 Reply Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @drapo last edited by

                  @drapo sagte in [gelöst] Telegram Reihenfolge Ausgabe falsch:

                  Könntest Du mir nochmals behilflich sein? Dank Dir

                  Ich hoffe Du bist Teilnehmer im ioBroker-Master-Kurs wenn Du mir hier schon Programmieraufträge verteilst 🙂

                  So z.B. Offene Themen:

                  • Cache knownSpeedTraps irgendwann zurücksetzen (Schedule?)
                  • Cache geht bei Neustart des Scripts oder des Adapters verloren (halb so wild?)
                  const knownSpeedTraps = [];
                  
                  async function sendImage() {
                      const speedTraps = getState('radar-trap.0.mi7-x6GA0Bg75EzychceA.direction-0.speedTraps').val;
                  
                      for (const speedTrap of speedTraps) {
                          const city = speedTrap.properties.city;
                          const street = speedTrap.properties.street;
                  
                          const cacheKey = `${city}-${street}`;
                          if (!knownSpeedTraps.includes(cacheKey)) {
                              knownSpeedTraps.push(cacheKey);
                  
                              await sendToAsync('telegram.0', {
                                  text: `${city}\n${street}`
                              });
                  
                              await wait(1000);
                  
                              const coordinates = speedTrap.geometry.coordinates;
                  
                              await sendToAsync('telegram.0', {
                                  latitude: parseFloat(coordinates[1]),
                                  longitude: parseFloat(coordinates[0]),
                              });
                          }
                      }
                  }
                  
                  on('javascript.0.Test', async (obj) => {
                      await sendToAsync('telegram.0', { text: 'Achtung neuer Radar!' });
                      setTimeout(sendImage, 2000);
                  });
                  
                  D 2 Replies Last reply Reply Quote 1
                  • D
                    drapo @haus-automatisierung last edited by

                    @haus-automatisierung wenn Du mir versichern kannst dass du solch komplexe themen wie cache ebenfalls in deinem master kurs abhandelst hast du sofort einen neuen kunden gewonnen 🙂

                    Vielen Dank für die erneute Unterstützung. Hätte ich wieder nicht hingekriegt. Um den Cache zu löschen denke ich dass ich das Skript 1x pro Woche per scheduler neu starte. ich denke das ist für mich das einfachste da ich keine ahnung habe ich ich das sonst lösen soll

                    1 Reply Last reply Reply Quote 0
                    • D
                      drapo @haus-automatisierung last edited by

                      @haus-automatisierung hab mir dein script nochmals studiert. Würde denn die Definition von knownSpeedTraps als var anstatt const das Problem des Cache zurücksetzen nicht automatisch lösen?

                      haus-automatisierung 1 Reply Last reply Reply Quote 0
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active @drapo last edited by

                        @drapo nein. Das ändert nur den scope (in diesem fall auch nicht). Var einfach nie benutzten (nur let und const).

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        700
                        Online

                        31.9k
                        Users

                        80.1k
                        Topics

                        1.3m
                        Posts

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