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. Array wert entfernen welcher nicht vorkommt

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Array wert entfernen welcher nicht vorkommt

Geplant Angeheftet Gesperrt Verschoben JavaScript
29 Beiträge 8 Kommentatoren 1.8k Aufrufe 4 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.
  • D drapo

    @mickym ich hab mir nochmals gedanken gemacht. könnte das ein ansatz sein?

    let Arraylength.length;
    const newArray = [];
    
    for (let i=0; i<=Arraylength; i++) {
    
    	if (Array.includes(Vergleich)) {
     		newArray.push(Vergleich);
    	}
    }
    
    Array.splice(0, Array.length);
    
    for (let t=0; t<=(Arraylength-1); t++) {
    
    	Array.push(newArray[t]);
    	}
    
    
    

    Somit schreibe ich die Werte die ich in meinem Array finde in ein neues Array. Durch die Abfrage mit includes sollten nur noch die Werte im newArray sein welche auch abgefragt wurden.

    Danach setze ich das alte Array zurück und befülle es mit den neuen Werten.

    Hab ich einen Denkfehler oder würde das so gehen?

    mickymM Offline
    mickymM Offline
    mickym
    Most Active
    schrieb am zuletzt editiert von mickym
    #19

    @drapo Das Problem ist doch in meinen Augen nicht das Array - sondern dass Du doch nicht weißt welches Element veraltet oder nicht mehr abgefragt wurde. Mit Deiner Schleife verkürzt Du doch Dein Array nur um das letzte Element.

    Das geht auch mit der pop Methode - da brauchst keine Schleife für: https://www.w3schools.com/js/js_array_methods.asp

    Wie gesagt das Problem ist, wie findest Du raus, welches Element veraltet ist - Die Array Behandlung ist eine andere Sache.

    Du könntest höchstens meinen ursprünglichen Code nehmen und in der validierungsfunktion den Zeitstempel der letzten Aktualisierung nehmen und diesen mit der aktuellen Zeit verleichen.

    a,b,c,d sind dann Objekte (states mit dem Zeitstempel)

    //var a=1,b=3,d=3,c=4;
    
     
    //var array = [a,b,c,d];
    
    // Erstelle ein Array mit den Objekten und Werten, der auszuwertenden States.
    console.log(array);
     
    // c=undefined;
    // array = [a,b,c,d];
     
    array=array.filter((val) => {
    //Vergleich aktuelle Zeit mit Zeitstempel des Objektes, wenn Differenz größer als dann 
    // return false
    // sonst return true
    });
    console.log(array);
    
    

    Das vergleichen der Zeitstempel mit dem aktuellen Zeitpunkt überlasse ich aber hier gerne @paul53 oder @Codierknecht

    Wenn dann die veralteten Objekte ausgefiltert sind - empfehle ich entweder die map Funktion
    https://www.w3schools.com/js/js_array_iteration.asp#mark_map,
    die erstellt Dir auch ein neues Array mit nur den Werten oder Du nutzt wieder das geniale JSONATA. Muss leider weg - schau später oder von unterwegs nur rein, aber ohne Code. ;)

    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

    D 1 Antwort Letzte Antwort
    1
    • D drapo

      @mickym ich hab mir nochmals gedanken gemacht. könnte das ein ansatz sein?

      let Arraylength.length;
      const newArray = [];
      
      for (let i=0; i<=Arraylength; i++) {
      
      	if (Array.includes(Vergleich)) {
       		newArray.push(Vergleich);
      	}
      }
      
      Array.splice(0, Array.length);
      
      for (let t=0; t<=(Arraylength-1); t++) {
      
      	Array.push(newArray[t]);
      	}
      
      
      

      Somit schreibe ich die Werte die ich in meinem Array finde in ein neues Array. Durch die Abfrage mit includes sollten nur noch die Werte im newArray sein welche auch abgefragt wurden.

      Danach setze ich das alte Array zurück und befülle es mit den neuen Werten.

      Hab ich einen Denkfehler oder würde das so gehen?

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von
      #20

      @drapo
      Klingt alles immer noch ein bisschen nach "von hinten durch die Brust ins Auge".

      Wie gesagt: Wenn Du mal zeigen würdest, was da der tatsächliche Anwendungsfall ist, wäre Hilfe sicher zielführender.

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      D 2 Antworten Letzte Antwort
      0
      • mickymM mickym

        @drapo Das Problem ist doch in meinen Augen nicht das Array - sondern dass Du doch nicht weißt welches Element veraltet oder nicht mehr abgefragt wurde. Mit Deiner Schleife verkürzt Du doch Dein Array nur um das letzte Element.

        Das geht auch mit der pop Methode - da brauchst keine Schleife für: https://www.w3schools.com/js/js_array_methods.asp

        Wie gesagt das Problem ist, wie findest Du raus, welches Element veraltet ist - Die Array Behandlung ist eine andere Sache.

        Du könntest höchstens meinen ursprünglichen Code nehmen und in der validierungsfunktion den Zeitstempel der letzten Aktualisierung nehmen und diesen mit der aktuellen Zeit verleichen.

        a,b,c,d sind dann Objekte (states mit dem Zeitstempel)

        //var a=1,b=3,d=3,c=4;
        
         
        //var array = [a,b,c,d];
        
        // Erstelle ein Array mit den Objekten und Werten, der auszuwertenden States.
        console.log(array);
         
        // c=undefined;
        // array = [a,b,c,d];
         
        array=array.filter((val) => {
        //Vergleich aktuelle Zeit mit Zeitstempel des Objektes, wenn Differenz größer als dann 
        // return false
        // sonst return true
        });
        console.log(array);
        
        

        Das vergleichen der Zeitstempel mit dem aktuellen Zeitpunkt überlasse ich aber hier gerne @paul53 oder @Codierknecht

        Wenn dann die veralteten Objekte ausgefiltert sind - empfehle ich entweder die map Funktion
        https://www.w3schools.com/js/js_array_iteration.asp#mark_map,
        die erstellt Dir auch ein neues Array mit nur den Werten oder Du nutzt wieder das geniale JSONATA. Muss leider weg - schau später oder von unterwegs nur rein, aber ohne Code. ;)

        D Offline
        D Offline
        drapo
        schrieb am zuletzt editiert von
        #21

        @mickym ich dachte mit dieser if abfrage befülle ich doch nur werte wenn diese auch abgefragt werden:

        if (Array.includes(Vergleich)) {
        

        Somit ist das Array doch nur noch mit den Werten befüllt die es gibt.

        falls ich mich irre gerne melden. aber ich versuch das mal sobald ich wieder zu hause bin.

        1 Antwort Letzte Antwort
        0
        • CodierknechtC Codierknecht

          @drapo
          Klingt alles immer noch ein bisschen nach "von hinten durch die Brust ins Auge".

          Wie gesagt: Wenn Du mal zeigen würdest, was da der tatsächliche Anwendungsfall ist, wäre Hilfe sicher zielführender.

          D Offline
          D Offline
          drapo
          schrieb am zuletzt editiert von
          #22

          @codierknecht ja kann ich machen. aber auch erst wenn ich wieder zu Hause bin.

          Bin mir sicher dass es einfacher geht. Aber da sieht man halt auch schnell dass das nicht mein daily business ist und mich gerade etwas abmühe :-)

          Bin Euch dadurch auch extrem dankbar für die Unterstützung

          1 Antwort Letzte Antwort
          0
          • CodierknechtC Codierknecht

            @drapo
            Klingt alles immer noch ein bisschen nach "von hinten durch die Brust ins Auge".

            Wie gesagt: Wenn Du mal zeigen würdest, was da der tatsächliche Anwendungsfall ist, wäre Hilfe sicher zielführender.

            D Offline
            D Offline
            drapo
            schrieb am zuletzt editiert von drapo
            #23

            @codierknecht @mickym das ist der original Anwendungsfall

            const knownSpeedTraps = [];
            
            async function sendImage() {
            
                const speedTraps = getState('radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps').val;
              
                
                for (const speedTrap of speedTraps) {
            
                    const street = speedTrap.properties.street;
                    
                    const city = speedTrap.properties.city;
            
                    const country = speedTrap.properties.country; 
            
                    const cacheKey = `${street}-${city}-${country}`;
                
                    const coordinates = speedTrap.geometry.coordinates;
            
                    if (!knownSpeedTraps.includes(cacheKey)) {
            
                        knownSpeedTraps.push(cacheKey);
            
                        await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨' });
            
                        await sendToAsync('telegram.0', {
            
                            latitude: parseFloat(coordinates[1]),
            
                            longitude: parseFloat(coordinates[0]),
                            
            
            
                
                        });
             
            
                        await wait(1000);
            
             
                        
            
                    
            
                        console.log(cacheKey);
                        console.log(knownSpeedTraps);
            
                        await sendToAsync('telegram.0', {
            
                             text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                        
            
                        
            
                        });
            
                    } else {
                            //hier wird der Eintrag entfernt welcher nicht mehr da ist
            
                            var indexSpeedtraptoremove = knownSpeedTraps.indexOf(cacheKey);
                            if (indexSpeedtraptoremove !== -1) {
                            knownSpeedTraps.splice(indexSpeedtraptoremove, 1);
                            } 
            
                    await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨'});
            
                        await sendToAsync('telegram.0', {
            
                            latitude: parseFloat(coordinates[1]),
            
                            longitude: parseFloat(coordinates[0]),
                            
            
            
                
                        });
             
                            
            
                        await wait(1000);
            
             
                        
            
                    
            
                        console.log(cacheKey);
                        console.log(knownSpeedTraps);
            
                        await sendToAsync('telegram.0', {
            
                             text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
            
                        
            
                        });
            
                    }
            
                }
            
            }
            
             
            
            on({ id: [].concat(['radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTrapsCount']), change: 'any' }, async (obj) => {
            let value = obj.state.val;
              let oldValue = obj.oldState.val;
              if ((obj.state ? obj.state.val : "") == 0 && (obj.oldState ? obj.oldState.val : "") > 0) {
                sendTo("telegram", "send", {
                    text: 'Kein Autobahn Radar mehr in Deiner Region. Du hast sichere Fahrt!',
                });
            
                knownSpeedTraps.splice(0, knownSpeedTraps.length)
            
              } else {
             
                setTimeout(sendImage, 2000);
            
              }
            });
            
            

            Der Radar Trap Adapter wird genutzt um neue Radars per Telegram zu versenden. Ich möchte aber nur Nachrichten erhalten wenn entweder ein neuer Blitzer auftaucht oder ein bestehender Blitzer entfernt wurde. Der radar Trap Adapter aktualisiert sich jede Stunde immer um XX:10 Uhr.
            Das hinzufügen der Blitzer in den cache funktioniert. das kam ursprünglich von matthias kleine. was nun noch nicht geht ist das entfernen der blitzer wenn diese nicht mehr da sind. das jetzige beispiel dass ich gebaut habe funktioniert leider nicht.

            Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

            HomoranH OliverIOO CodierknechtC 3 Antworten Letzte Antwort
            0
            • D drapo

              @codierknecht @mickym das ist der original Anwendungsfall

              const knownSpeedTraps = [];
              
              async function sendImage() {
              
                  const speedTraps = getState('radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps').val;
                
                  
                  for (const speedTrap of speedTraps) {
              
                      const street = speedTrap.properties.street;
                      
                      const city = speedTrap.properties.city;
              
                      const country = speedTrap.properties.country; 
              
                      const cacheKey = `${street}-${city}-${country}`;
                  
                      const coordinates = speedTrap.geometry.coordinates;
              
                      if (!knownSpeedTraps.includes(cacheKey)) {
              
                          knownSpeedTraps.push(cacheKey);
              
                          await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨' });
              
                          await sendToAsync('telegram.0', {
              
                              latitude: parseFloat(coordinates[1]),
              
                              longitude: parseFloat(coordinates[0]),
                              
              
              
                  
                          });
               
              
                          await wait(1000);
              
               
                          
              
                      
              
                          console.log(cacheKey);
                          console.log(knownSpeedTraps);
              
                          await sendToAsync('telegram.0', {
              
                               text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                          
              
                          
              
                          });
              
                      } else {
                              //hier wird der Eintrag entfernt welcher nicht mehr da ist
              
                              var indexSpeedtraptoremove = knownSpeedTraps.indexOf(cacheKey);
                              if (indexSpeedtraptoremove !== -1) {
                              knownSpeedTraps.splice(indexSpeedtraptoremove, 1);
                              } 
              
                      await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨'});
              
                          await sendToAsync('telegram.0', {
              
                              latitude: parseFloat(coordinates[1]),
              
                              longitude: parseFloat(coordinates[0]),
                              
              
              
                  
                          });
               
                              
              
                          await wait(1000);
              
               
                          
              
                      
              
                          console.log(cacheKey);
                          console.log(knownSpeedTraps);
              
                          await sendToAsync('telegram.0', {
              
                               text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
              
                          
              
                          });
              
                      }
              
                  }
              
              }
              
               
              
              on({ id: [].concat(['radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTrapsCount']), change: 'any' }, async (obj) => {
              let value = obj.state.val;
                let oldValue = obj.oldState.val;
                if ((obj.state ? obj.state.val : "") == 0 && (obj.oldState ? obj.oldState.val : "") > 0) {
                  sendTo("telegram", "send", {
                      text: 'Kein Autobahn Radar mehr in Deiner Region. Du hast sichere Fahrt!',
                  });
              
                  knownSpeedTraps.splice(0, knownSpeedTraps.length)
              
                } else {
               
                  setTimeout(sendImage, 2000);
              
                }
              });
              
              

              Der Radar Trap Adapter wird genutzt um neue Radars per Telegram zu versenden. Ich möchte aber nur Nachrichten erhalten wenn entweder ein neuer Blitzer auftaucht oder ein bestehender Blitzer entfernt wurde. Der radar Trap Adapter aktualisiert sich jede Stunde immer um XX:10 Uhr.
              Das hinzufügen der Blitzer in den cache funktioniert. das kam ursprünglich von matthias kleine. was nun noch nicht geht ist das entfernen der blitzer wenn diese nicht mehr da sind. das jetzige beispiel dass ich gebaut habe funktioniert leider nicht.

              Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

              HomoranH Nicht stören
              HomoranH Nicht stören
              Homoran
              Global Moderator Administrators
              schrieb am zuletzt editiert von
              #24

              @drapo sagte in Array wert entfernen welcher nicht vorkommt:

              Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

              ...und du darüber such noch eine Nachricht via telegram bekommst?

              also nicht nur entfernen sondern auch noch eine zusätzliche Aktion?
              Davon war bisher keine Rede.
              Dazu brauchst du ja die zu entfernenden Daten noch.

              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

              D 1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                @drapo sagte in Array wert entfernen welcher nicht vorkommt:

                Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

                ...und du darüber such noch eine Nachricht via telegram bekommst?

                also nicht nur entfernen sondern auch noch eine zusätzliche Aktion?
                Davon war bisher keine Rede.
                Dazu brauchst du ja die zu entfernenden Daten noch.

                D Offline
                D Offline
                drapo
                schrieb am zuletzt editiert von drapo
                #25

                @homoran das senden mittels telegram funktioniert. das ist bereits im obigen code implementiert. es geht um das entfernen von blitzern aus dem array knownSpeedTraps. Das war die ursprüngliche Anfrage dieses Post. Ihr wolltet ja die ausführliche Variante haben :-)

                HomoranH 1 Antwort Letzte Antwort
                0
                • D drapo

                  @codierknecht @mickym das ist der original Anwendungsfall

                  const knownSpeedTraps = [];
                  
                  async function sendImage() {
                  
                      const speedTraps = getState('radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps').val;
                    
                      
                      for (const speedTrap of speedTraps) {
                  
                          const street = speedTrap.properties.street;
                          
                          const city = speedTrap.properties.city;
                  
                          const country = speedTrap.properties.country; 
                  
                          const cacheKey = `${street}-${city}-${country}`;
                      
                          const coordinates = speedTrap.geometry.coordinates;
                  
                          if (!knownSpeedTraps.includes(cacheKey)) {
                  
                              knownSpeedTraps.push(cacheKey);
                  
                              await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨' });
                  
                              await sendToAsync('telegram.0', {
                  
                                  latitude: parseFloat(coordinates[1]),
                  
                                  longitude: parseFloat(coordinates[0]),
                                  
                  
                  
                      
                              });
                   
                  
                              await wait(1000);
                  
                   
                              
                  
                          
                  
                              console.log(cacheKey);
                              console.log(knownSpeedTraps);
                  
                              await sendToAsync('telegram.0', {
                  
                                   text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                              
                  
                              
                  
                              });
                  
                          } else {
                                  //hier wird der Eintrag entfernt welcher nicht mehr da ist
                  
                                  var indexSpeedtraptoremove = knownSpeedTraps.indexOf(cacheKey);
                                  if (indexSpeedtraptoremove !== -1) {
                                  knownSpeedTraps.splice(indexSpeedtraptoremove, 1);
                                  } 
                  
                          await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨'});
                  
                              await sendToAsync('telegram.0', {
                  
                                  latitude: parseFloat(coordinates[1]),
                  
                                  longitude: parseFloat(coordinates[0]),
                                  
                  
                  
                      
                              });
                   
                                  
                  
                              await wait(1000);
                  
                   
                              
                  
                          
                  
                              console.log(cacheKey);
                              console.log(knownSpeedTraps);
                  
                              await sendToAsync('telegram.0', {
                  
                                   text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                  
                              
                  
                              });
                  
                          }
                  
                      }
                  
                  }
                  
                   
                  
                  on({ id: [].concat(['radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTrapsCount']), change: 'any' }, async (obj) => {
                  let value = obj.state.val;
                    let oldValue = obj.oldState.val;
                    if ((obj.state ? obj.state.val : "") == 0 && (obj.oldState ? obj.oldState.val : "") > 0) {
                      sendTo("telegram", "send", {
                          text: 'Kein Autobahn Radar mehr in Deiner Region. Du hast sichere Fahrt!',
                      });
                  
                      knownSpeedTraps.splice(0, knownSpeedTraps.length)
                  
                    } else {
                   
                      setTimeout(sendImage, 2000);
                  
                    }
                  });
                  
                  

                  Der Radar Trap Adapter wird genutzt um neue Radars per Telegram zu versenden. Ich möchte aber nur Nachrichten erhalten wenn entweder ein neuer Blitzer auftaucht oder ein bestehender Blitzer entfernt wurde. Der radar Trap Adapter aktualisiert sich jede Stunde immer um XX:10 Uhr.
                  Das hinzufügen der Blitzer in den cache funktioniert. das kam ursprünglich von matthias kleine. was nun noch nicht geht ist das entfernen der blitzer wenn diese nicht mehr da sind. das jetzige beispiel dass ich gebaut habe funktioniert leider nicht.

                  Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von
                  #26

                  @drapo

                  also du hast einmal ein array wo du alle gerade noch aktuellen radarfallen auflistest.
                  ich gehe davon aus, du rufst regelmäßig einen dienst ab, der dir ein ergebnis liefert.
                  warum nimmst du dieses ergebnis nicht direkt als deinen arbeitsstand? das ist doch der aktuelle stand?

                  falls nicht, würde ich mir ein array of objects aufbauen, also nicht nur ein einfaches array.
                  jedes dieser objekte in diesem array enthält zum einen den wert, zum anderen einen zeitstempel der letzten aktualisierung.

                  wenn nun die aktuellen daten kommen, dann suchst du jedes element aus deinen ergebnissen im array. aktualisierst den zeitstempel auf Jetzt. wenn du alle abgearbeitest hast, dann löscht du aus deinem array alle elemente, bei dem der zeitstempel älter wie x minuten,stunden,etc ist.

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  1 Antwort Letzte Antwort
                  0
                  • D drapo

                    @homoran das senden mittels telegram funktioniert. das ist bereits im obigen code implementiert. es geht um das entfernen von blitzern aus dem array knownSpeedTraps. Das war die ursprüngliche Anfrage dieses Post. Ihr wolltet ja die ausführliche Variante haben :-)

                    HomoranH Nicht stören
                    HomoranH Nicht stören
                    Homoran
                    Global Moderator Administrators
                    schrieb am zuletzt editiert von
                    #27

                    @drapo sagte in Array wert entfernen welcher nicht vorkommt:

                    es geht um das entfernen von blitzern aus dem array knownSpeedTraps.

                    das ist mir klar!

                    es geht hier drum:

                    @drapo sagte in Array wert entfernen welcher nicht vorkommt:

                    Ich möchte ... Nachrichten erhalten wenn ... ein bestehender Blitzer entfernt wurde.

                    kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                    1 Antwort Letzte Antwort
                    0
                    • D drapo

                      @codierknecht @mickym das ist der original Anwendungsfall

                      const knownSpeedTraps = [];
                      
                      async function sendImage() {
                      
                          const speedTraps = getState('radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps').val;
                        
                          
                          for (const speedTrap of speedTraps) {
                      
                              const street = speedTrap.properties.street;
                              
                              const city = speedTrap.properties.city;
                      
                              const country = speedTrap.properties.country; 
                      
                              const cacheKey = `${street}-${city}-${country}`;
                          
                              const coordinates = speedTrap.geometry.coordinates;
                      
                              if (!knownSpeedTraps.includes(cacheKey)) {
                      
                                  knownSpeedTraps.push(cacheKey);
                      
                                  await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨' });
                      
                                  await sendToAsync('telegram.0', {
                      
                                      latitude: parseFloat(coordinates[1]),
                      
                                      longitude: parseFloat(coordinates[0]),
                                      
                      
                      
                          
                                  });
                       
                      
                                  await wait(1000);
                      
                       
                                  
                      
                              
                      
                                  console.log(cacheKey);
                                  console.log(knownSpeedTraps);
                      
                                  await sendToAsync('telegram.0', {
                      
                                       text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                                  
                      
                                  
                      
                                  });
                      
                              } else {
                                      //hier wird der Eintrag entfernt welcher nicht mehr da ist
                      
                                      var indexSpeedtraptoremove = knownSpeedTraps.indexOf(cacheKey);
                                      if (indexSpeedtraptoremove !== -1) {
                                      knownSpeedTraps.splice(indexSpeedtraptoremove, 1);
                                      } 
                      
                              await sendToAsync('telegram.0', { text: 'Achtung neuer Radar in Deiner Region! 🚨'});
                      
                                  await sendToAsync('telegram.0', {
                      
                                      latitude: parseFloat(coordinates[1]),
                      
                                      longitude: parseFloat(coordinates[0]),
                                      
                      
                      
                          
                                  });
                       
                                      
                      
                                  await wait(1000);
                      
                       
                                  
                      
                              
                      
                                  console.log(cacheKey);
                                  console.log(knownSpeedTraps);
                      
                                  await sendToAsync('telegram.0', {
                      
                                       text: `Strasse: ${street}\nOrt: ${city}\nLand: ${country}`,
                      
                                  
                      
                                  });
                      
                              }
                      
                          }
                      
                      }
                      
                       
                      
                      on({ id: [].concat(['radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTrapsCount']), change: 'any' }, async (obj) => {
                      let value = obj.state.val;
                        let oldValue = obj.oldState.val;
                        if ((obj.state ? obj.state.val : "") == 0 && (obj.oldState ? obj.oldState.val : "") > 0) {
                          sendTo("telegram", "send", {
                              text: 'Kein Autobahn Radar mehr in Deiner Region. Du hast sichere Fahrt!',
                          });
                      
                          knownSpeedTraps.splice(0, knownSpeedTraps.length)
                      
                        } else {
                       
                          setTimeout(sendImage, 2000);
                      
                        }
                      });
                      
                      

                      Der Radar Trap Adapter wird genutzt um neue Radars per Telegram zu versenden. Ich möchte aber nur Nachrichten erhalten wenn entweder ein neuer Blitzer auftaucht oder ein bestehender Blitzer entfernt wurde. Der radar Trap Adapter aktualisiert sich jede Stunde immer um XX:10 Uhr.
                      Das hinzufügen der Blitzer in den cache funktioniert. das kam ursprünglich von matthias kleine. was nun noch nicht geht ist das entfernen der blitzer wenn diese nicht mehr da sind. das jetzige beispiel dass ich gebaut habe funktioniert leider nicht.

                      Wie würdet Ihr das lösen, dass der Blitzer der nicht mehr da ist aus dem Array knownSpeedTraps genommen wird?

                      CodierknechtC Online
                      CodierknechtC Online
                      Codierknecht
                      Developer Most Active
                      schrieb am zuletzt editiert von
                      #28

                      @drapo
                      1.) Kannst Du da mal die ganzen Leerzeilen entfernen? Das kann man so kaum lesen.
                      2.) Du triggerst auf die Anzahl mit "any". Ich würde auf radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps triggern. Mit "ne".

                      Ich würde das ähnlich machen wie @OliverIO.
                      Beim Start des Script den aktuellen Stand aus dem DP als "Arbeitsstand" merken.
                      Ändert sich der DP, würde ich einmal durch das gemerkte Array rauschen und prüfen, ob alle dort enthaltenen Radarfallen auch im neuen Wert des DP enthalten sind. Was nicht mehr da ist, ist rausgeflogen. Kann man sich dann für die Meldung wegschreiben und dann entfernen.
                      Danach einmal durch das "neue" Array - also den aktuellen Wert des Adapters - rauschen und alle für die Meldung rauspicken, die nicht im "gemerkten" Array enthalten sind. Das sind die neuen.
                      Die werden dann an den gemerkten Zustand angefügt.
                      Oder man merkt sich am Ende einfach den aktuellen Inhalt aus dem DP.

                      Kleiner Seitenhieb bzgl. Deiner Meldung:
                      Für eine "sichere Fahrt" ist wohl kaum das Nicht-Vorhandensein von Radarfallen in Deiner Region ausschlaggebend.
                      Einfach an die Geschwindigkeitsbegrenzung halten - zack! - Problem gelöst.
                      Aber jeder wie er mag - müssen wir hier nicht ausdiskutieren.

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi
                      Zabbix Certified Specialist
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      T 1 Antwort Letzte Antwort
                      0
                      • CodierknechtC Codierknecht

                        @drapo
                        1.) Kannst Du da mal die ganzen Leerzeilen entfernen? Das kann man so kaum lesen.
                        2.) Du triggerst auf die Anzahl mit "any". Ich würde auf radar-trap.0.2gbKhj9cvNU0aX0iQ_Mbc.area.speedTraps triggern. Mit "ne".

                        Ich würde das ähnlich machen wie @OliverIO.
                        Beim Start des Script den aktuellen Stand aus dem DP als "Arbeitsstand" merken.
                        Ändert sich der DP, würde ich einmal durch das gemerkte Array rauschen und prüfen, ob alle dort enthaltenen Radarfallen auch im neuen Wert des DP enthalten sind. Was nicht mehr da ist, ist rausgeflogen. Kann man sich dann für die Meldung wegschreiben und dann entfernen.
                        Danach einmal durch das "neue" Array - also den aktuellen Wert des Adapters - rauschen und alle für die Meldung rauspicken, die nicht im "gemerkten" Array enthalten sind. Das sind die neuen.
                        Die werden dann an den gemerkten Zustand angefügt.
                        Oder man merkt sich am Ende einfach den aktuellen Inhalt aus dem DP.

                        Kleiner Seitenhieb bzgl. Deiner Meldung:
                        Für eine "sichere Fahrt" ist wohl kaum das Nicht-Vorhandensein von Radarfallen in Deiner Region ausschlaggebend.
                        Einfach an die Geschwindigkeitsbegrenzung halten - zack! - Problem gelöst.
                        Aber jeder wie er mag - müssen wir hier nicht ausdiskutieren.

                        T Nicht stören
                        T Nicht stören
                        ticaki
                        schrieb am zuletzt editiert von
                        #29

                        @codierknecht sagte in Array wert entfernen welcher nicht vorkommt:

                        @drapo
                        Für eine "sichere Fahrt" ist wohl kaum das Nicht-Vorhandensein von Radarfallen in Deiner Region ausschlaggebend.

                        In der Regel schon - da Sicherheit recht wenig mit dem Geldbedürfnis einiger Gemeinden zu tun hat. Auch nicht mit dem wahllosen verteilen von Schildern.

                        Das muß man aber tatsächlich nicht ansprechen.

                        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                        Spenden

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


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        775

                        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