Benzinpreise mit Tankerkönig Binding

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert?

Moderator: seppy

Antworten
Benutzeravatar
alkaline
Beiträge: 113
Registriert: 20. Apr 2017 13:25

Benzinpreise mit Tankerkönig Binding

Beitrag von alkaline » 16. Aug 2017 07:40

Ich lasse mir die Benzinpreise für E 10 für zwei Tankstellen in der zeit zwischen 15 Uhr bis 17 Uhr berechnen und sende bei Unterschreitung eines bestimmten Preises die günstigste Tankstelle als Info via OH Cloud auf das Handy zu.
tankerkoenig.Items:

Code: Alles auswählen

/* Gruppen */
Group gSprit		  	"Spritpreise"					(Whg)  
Group gAral				"Sprit Aral"	<aral>				(gSprit)
Group gShell			"Sprit Shell"	<shell>		  		(gSprit)
Group gTotal			"Sprit Total"	<total>		  	  	(gSprit)

Number 	NewInfoMsg_Aral 		"Neuer Preis [%s]" <neu> (gAral)
Number 	OldInfoMsg_Aral 		"Alter Preis [%s]" <alt> (gAral)
Number 	NewInfoMsg_Shell 		"Neuer Preis [%s]" <neu> (gShell)
Number 	OldInfoMsg_Shell 		"Alter Preis [%s]" <alt> (gShell)
Number 	NewInfoMsg_Total 		"Neuer Preis [%s]" <neu> (gTotal)
Number 	OldInfoMsg_Total 		"Alter Preis [%s]" <alt> (gTotal)

Number E10_Shell "E10 Shell [%.3f ]" <e10>(gShell)	{ channel="tankerkoenig:station:WebserviceName:StationName1:e10" }
Number E5_Shell "E5 Shell [%.3f ]" <e5> (gShell)	{ channel="tankerkoenig:station:WebserviceName:StationName1:e5" }

Number E10_Aral "E10 Aral [%.3f ]" <e10> (gAral)	{ channel="tankerkoenig:station:WebserviceName:StationName2:e10"}
Number E5_Aral "E5 Aral [%.3f ]" <e5> (gAral)	{ channel="tankerkoenig:station:WebserviceName:StationName2:e5"}

Number E10_Total "E10 Total [%.3f ]" <e10> (gTotal)	{ channel="tankerkoenig:station:WebserviceName:StationName3:e10"}
Number E5_Total "E5 Total [%.3f ]" <e5> (gTotal)	{ channel="tankerkoenig:station:WebserviceName:StationName3:e5"}
benzinpreise.rules:

Code: Alles auswählen

import org.joda.time.LocalTime

rule "Benzinpreise Info"
when
	Item E10_Aral received update or
	Item E10_Shell received update
then
	postUpdate(OldInfoMsg_Shell, E10_Shell.state)
    postUpdate(OldInfoMsg_Aral, E10_Aral.state)
    postUpdate(OldInfoMsg_Total, E10_Total.state)
	val LocalTime afternoon = new LocalTime(15, 0)  // 15pm every day
  	val LocalTime evening = new LocalTime(17, 0)  // 17pm every day


	if (now.toLocalTime().isAfter(afternoon) && now.toLocalTime().isBefore(evening)){ //zwischen 15 und 17 Uhr
    var double ShellNewPrice = (NewInfoMsg_Shell.state as DecimalType).doubleValue
    var double AralNewPrice = (NewInfoMsg_Aral.state as DecimalType).doubleValue
    var double ShellOldPrice = (OldInfoMsg_Shell.state as DecimalType).doubleValue
    var double AralOldPrice = (OldInfoMsg_Aral.state as DecimalType).doubleValue
   		if ((ShellOldPrice == ShellNewPrice )||(AralOldPrice == AralNewPrice )){ // Der Preis der gleiche ist
   			// do nothing
    		}
    	else if ((ShellNewPrice < 1.30) && (ShellNewPrice < AralNewPrice)){     
    	sendBroadcastNotification("Tanken? Shell: " + ShellNewPrice)
    		}
    	else if ((AralNewPrice < 1.30) && (AralNewPrice < ShellNewPrice)){     
    	sendBroadcastNotification("Tanken? Aral: " + AralNewPrice)
    		}
    	}
  end
Sitemap:
Da ich zwei Sitemaps nutze (eine für Admin Zwecke, eine für Anzeige der wichtigsten Info's) und auch, weil ich sehr stark Gruppen nutze (siehe items) zeige ich lediglich die Sprit-Hauptgruppe "gSprit" in meiner Hauptgruppe Whg an:

Code: Alles auswählen

Group item=Whg label="Alle Elemente" icon="house"
Sieht dann auf dem Handy so aus: (Neuer Preis ist noch leer, da noch nicht 15 Uhr)
sprit_1.png
sprit_2.png
Icons:
icons.zip
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
alkaline
Beiträge: 113
Registriert: 20. Apr 2017 13:25

Re: Benzinpreise mit Tankerkönig Binding

Beitrag von alkaline » 21. Aug 2017 07:57

Habe das Scripting nochmals etwas umgebaut, die Tankstellen werden jetzt nach der günstigsten sortiert.
items:

Code: Alles auswählen

/* Gruppen */
Group gSprit		  	"Spritpreise"					(Whg)  
Group gAral				"Sprit Aral"	<aral>				(gSprit)
Group gShell			"Sprit Shell"	<shell>		  		(gSprit)

Number E10_Shell "E10 Shell [%.2f ]" <e10>(gShell)	{ channel="tankerkoenig:station:WebserviceName:StationName1:e10" }
Number E5_Shell "E5 Shell [%.2f ]" <e5> (gShell)	{ channel="tankerkoenig:station:WebserviceName:StationName1:e5" }

Number E10_Aral "E10 Aral [%.2f ]" <e10> (gAral)	{ channel="tankerkoenig:station:WebserviceName:StationName2:e10"}
Number E5_Aral "E5 Aral [%.2f ]" <e5> (gAral)	{ channel="tankerkoenig:station:WebserviceName:StationName2:e5"}

String    FuelStation1    "Billigste Tankstelle [%s]" <tankstelle>	(gSprit)
String    FuelStation2    "Zweitbeste [%s]" 	<tankstelle> 

String OldBest_Station	"Alte beste Tankstelle [%s]" <alt> (gSprit)
String NewBest_Station	"Neue beste Tankstelle [%s]" <neu> (gSprit)
rules:

Code: Alles auswählen

import org.joda.time.LocalTime
import java.util.ArrayList
import java.util.Map
import java.util.HashMap
import java.util.concurrent.locks.ReentrantLock
import java.util.concurrent.locks.Lock

var Map <String, Double> FuelPricesMap = new HashMap<String, Double>()    // Stationsnamen und Preise für den Kraftstoff
var ArrayList<StringItem> FuelPriceItems =  new ArrayList<StringItem>()

val String filename = "benzin.rules"

rule "Benzinpreise Info"
when
	Item FuelPricesMap received update
then
	val LocalTime afternoon = new LocalTime(15, 0)  // 15pm every day
  	val LocalTime evening = new LocalTime(19, 0)  // 19pm every day
  	
	if (now.toLocalTime().isAfter(afternoon) && now.toLocalTime().isBefore(evening)){ //zwischen 15 und 19 Uhr
		if (FuelStation1.state.toString.contains ("1,29")) {
			sendTelegram("Marcus", "Günstiger Sprit: " + FuelStation1)
			postUpdate(OldBest_Station, FuelStation1.state)
			}
			else if (FuelStation1.state.toString.contains ("1,28")) {
    		sendTelegram("Marcus", "Günstiger Sprit: " + FuelStation1) // Erste Tankstelle im Array = günstigste Tankstelle
	   		postUpdate(OldBest_Station, FuelStation1.state)
	   		}
	   		else if (FuelStation1.state.toString.contains ("1,27")) {
    		sendTelegram("Marcus", "Günstiger Sprit: " + FuelStation1) // Erste Tankstelle im Array = günstigste Tankstelle
	   		postUpdate(OldBest_Station, FuelStation1.state)
	   		}
	   		else if (FuelStation1.state.toString.contains ("0,00")) {
    		postUpdate(FuelStation1, "Geschlossen")
	   		}
	   		else if (FuelStation2.state.toString.contains ("0,00")) {
    		postUpdate(FuelStation1, "Geschlossen")
	   		}
	  }
  end

  
rule "Benzinpreise Update"
when
	Item E10_Aral received update or
	Item E10_Shell received update
then
    
        var Lock lock = new ReentrantLock()
       
        var i = 0
    
        lock.lock()
        
         logInfo(filename,"Benzinpreise -> Update der Werte")
        
        // Zuweisung der Display Items in das Array
        FuelPriceItems.add(0, FuelStation1)
        FuelPriceItems.add(1, FuelStation2)


        // aktuelle Preise aus den Items in die Map übernehmen    
        FuelPricesMap.put("Shell",    (E10_Shell.state as DecimalType).doubleValue())
        FuelPricesMap.put("Aral",    (E10_Aral.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 - %.2f €", PriceEntry.getKey(), PriceEntry.getValue()))
             i = i+1
        }
	        lock.unlock()
			postUpdate(NewBest_Station, FuelStation1.state)
end


Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast