Ankündigung

Einklappen
Keine Ankündigung bisher.

Sortieren von Werten innerhalb einer Rule

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Sortieren von Werten innerhalb einer Rule

    Moin Zusammen,

    ich habe mir gerade die Spritpreise über Tankerkoenig eingebaut, was auch prima funktioniert. Toll wäre es jetzt noch, wenn man die günstigste Tanke ganz oben anzeigen lassen könnte. Das funktioniert meiner Meinung nach mit entsprechenden Proxy Items, die entsprechend gefüllt werden müssen. Hierzu ist es aber notwendig, dass die Preise zunächst mal sortiert werden. Und hier stehe ich komplett auf dem Schlauch. Wie sortiere ich innerhalb einer Rule?

    Ich habe das Paar Preis und Tanke und müsste dieses Paar nach Preis sortieren, aber im Augenblick gehen ArrayLists usw. wild durcheinander. Kann das einer helfen?

    Danke und Gruß
    Thomas

    #2
    Lohnt sich der Aufwand? Man kennt doch sowieso die Tankstellen, die immer an günstigsten sind. Diese setzt du in der Sitemap einfach oben hin. Gruß!

    Kommentar


      #3
      Das sind bei uns leider verschiedene und es soll die aktuell günstigste angezeigt werden. Hängt auch ein bisschen vom Standort ab.

      Und aj ich finde der Aufwand lohnt sich, kann man sicher noch für was anderes brauchen :-)

      Thomas

      Kommentar


        #4
        Ich habe es relativ analog gelöst, mehrere Rules, jeder Wert wird mit jedem Verglichen, der niedrigste wird abgelegt.
        Dann markiere ich die niedrigsten / höchsten werte (der aktuell geöffneten Tankstellen mit gültigen Werten) in der Sitemap in grüner/roter Schrift.

        Das Funktioniert ganz gut, war aber ziemlich viel Tipperei (40k Zeichen für die Rule)
        Bin aber gespannt, wenn du das anders lösen kannst, baue ich gff nochmal um

        Kommentar


          #5
          Moin Zusammen,

          ich hab das Thema jetzt für mich wie folgt gelöst. ergebnis ist eine nach Preis sortierte Anzeige der Spritpreise, die für mich relevant sind.

          Aktuell interessieren mich die Preise von 5 Tankstellen in der Nähe. Für jede Tankstelle habe ich einen Number Item für den Preis angelegt. Diese Preise werden alle 5 Minuten aktualisiert. Weiterhin sind die Items in einer Gruppe. Für jede Tankstelle habe ich zusätzlich einen String Item eingerichtet, der angezeigt wird und den ich über eine Rule fülle.

          Items:
          Code:
          Group    gTankerkoenig (gAll)
          Group    gFuelPrices (gTankerkoenig)
          
          // Hier die Anzeige Items
          String    SvDp_FuelStation1    "Tankstelle [%s]" <fts_garage> (gTankerkoenig) 
          String    SvDp_FuelStation2    "Tankstelle [%s]" <fts_garage> (gTankerkoenig)
          String    SvDp_FuelStation3    "Tankstelle [%s]" <fts_garage> (gTankerkoenig)
          String    SvDp_FuelStation4    "Tankstelle [%s]" <fts_garage> (gTankerkoenig)
          String    SvDp_FuelStation5    "Tankstelle [%s]" <fts_garage> (gTankerkoenig)
          
          // Hier die Preise
          Number    SvNb_DieselPrice1    (gFuelPrices) { http="<[https://creativecommons.tankerkoenig.de/json/detail.php?id=...:300000:JS(diesel.js)]" }
          Number    SvNb_DieselPrice2    (gFuelPrices) { http="<[https://creativecommons.tankerkoenig.de/json/detail.php?id=...:300000:JS(diesel.js)]" }
          Number    SvNb_DieselPrice3    (gFuelPrices) { http="<[https://creativecommons.tankerkoenig.de/json/detail.php?id=...:300000:JS(diesel.js)]" }
          Number    SvNb_DieselPrice4    (gFuelPrices) { http="<[https://creativecommons.tankerkoenig.de/json/detail.php?id=...300000:JS(diesel.js)]" }
          Dazu gehört die folgende Sitemap, die die Günstigste und dann im Nachgang jeweils den Namen, Ort und Preis je Tankstelle darstellt
          Code:
                  // Günstigste Tankstelle
                  Text item=SvDp_FuelStation1 label="Günstigste Tankstelle [%s]" icon="fts_garage" {
                      Text item=SvDp_FuelStation1 label="Tankstelle [%s]" icon="fts_garage" 
                      Text item=SvDp_FuelStation2 label="Tankstelle [%s]" icon="fts_garage" 
                      Text item=SvDp_FuelStation3 label="Tankstelle [%s]" icon="fts_garage" 
                      Text item=SvDp_FuelStation4 label="Tankstelle [%s]" icon="fts_garage" 
                      Text item=SvDp_FuelStation5 label="Tankstelle [%s]" icon="fts_garage" 
                  }
          Last but not least kommt hier die Rule, die die Anzeige Items refreshed. Wenn es ein Update für die Gruppe gibt, wird eine Map alle Preise mit den Stationen und den Preisen aufgebaut, die dann sortiert und den Display Items im Array zugewiesen wird.
          Code:
          rule "Kraftstoffpreisanzeige"
          when
              Item gFuelPrices received update
          then
              
                  var Lock lock = new ReentrantLock()
                  var Map <String, Double> FuelPricesMap = new HashMap<String, Double>()    // Stationsnamen und Preise für den Kraftstoff
                  var ArrayList<StringItem> FuelPriceItems =  new ArrayList<StringItem>()
                  var i = 0
              
                  lock.lock()
                  
                   logInfo("rule.internet","Kraftstoffpreisanzeige -> Update der Werte")
                  
                  // Zuweisung der Display Items in das Array
                  FuelPriceItems.add(0, SvDp_FuelStation1)
                  FuelPriceItems.add(1, SvDp_FuelStation2)
                  FuelPriceItems.add(2, SvDp_FuelStation3)
                  FuelPriceItems.add(3, SvDp_FuelStation4)
                  FuelPriceItems.add(4, SvDp_FuelStation5)
          
                  // aktuelle Preise aus den Items in die Map übernehmen    
                  FuelPricesMap.put("Nordoel (Uetersen)",    (SvNb_DieselPrice1.state as DecimalType).doubleValue())
                  FuelPricesMap.put("Nordoel (Elmshorn)",    (SvNb_DieselPrice2.state as DecimalType).doubleValue())
                  FuelPricesMap.put("HEM (Elmshorn)",        (SvNb_DieselPrice3.state as DecimalType).doubleValue())
                  FuelPricesMap.put("Star (Elmshorn)",    (SvNb_DieselPrice4.state as DecimalType).doubleValue())
                  FuelPricesMap.put("HEM (Wedel)",        (SvNb_DieselPrice5.state as DecimalType).doubleValue())
                  
                  // Map nach Preisen sortieren und die Werte dann dem Anzeigearray zuweisen
                  for (PriceEntry : FuelPricesMap.entrySet.sortBy[value]) {
                      FuelPriceItems.get(i).postUpdate(String::format("%s - %.3f €", PriceEntry.getKey(), PriceEntry.getValue()))
                       i = i+1
                  }
                  
                  lock.unlock()
                  
          end
          So das war es jetzt. wer noch schöne Optimierungen hat, möge diese gerne beisteuern. Ansonsten danke an alle für die Vorbereitung dieser netten Funktion.

          Gruß
          Thomas

          Kommentar

          Lädt...
          X