Hauptmenü

BenzinpreisMonitor

Begonnen von Phil__, 16 April 2014, 18:52:21

Vorheriges Thema - Nächstes Thema

infokalypse

#465
Hallo zusammen, da ich das Modul schon sehr lange nutze und schon viel aus diesem Forum profitiert habe möchte ich gerne etwas zurückgeben. In meinem Fall lasse ich mich per Push benachrichtigen, wenn der Spritpreis unter einen bestimmten Wert gefallen ist und auch, wenn er danach wieder über diesen Wert steigt - um nicht umsonst zur Tanke zu fahren nachdem bereits wieder angepasst wurde. Vielleicht hilft es dem ein oder anderen hier, auch wenn der Thread ziemlich verwaist ist:

Dummy zur Eingabe des Wertes, unter dem eine Push-Meldung erfolgen soll: (per Weboberfläche oder iOS via Homebridge)

define Benzinpreis_Eingabe dummy
attr Benzinpreis_Eingabe alias Push-Nachricht
attr Benzinpreis_Eingabe genericDeviceType light
attr Benzinpreis_Eingabe homebridgeMapping clear Brightness=homebridge,cmd=state,delay=750 On=homebridge,valueOff=0,cmdOff=0
attr Benzinpreis_Eingabe icon gasoline
attr Benzinpreis_Eingabe room Homekit,Verkehr
attr Benzinpreis_Eingabe setList state:textField
attr Benzinpreis_Eingabe siriName Benzinpreis
attr Benzinpreis_Eingabe stateFormat ...
attr Benzinpreis_Eingabe userReadings state {if(ReadingsNum($NAME,"state","") >= 2 and ReadingsNum($NAME,"state","") < 80) {(ReadingsNum($NAME,"state","")/100)+1} else {if(ReadingsNum($NAME,"state","") >= 80) {(ReadingsNum($NAME,"state","")/100)+0} else {ReadingsNum($NAME,"state","")}}},\
homebridge {if(ReadingsNum($NAME,"state","") >= 1) {round((ReadingsNum($NAME,"state","")-1)*100,0)} else {if(ReadingsNum($NAME,"state","") <= 1 and ReadingsNum($NAME,"state","") > 0.8) {round(ReadingsNum($NAME,"state","")*100,0)} else {"0"}}}
attr Benzinpreis_Eingabe webCmd wenn Benzinpreis weniger oder gleich:state:€


Abfrage, ob aktuell getankt werden muss (per Weboberfläche oder iOS via Homebridge)

define Muss_Tanken dummy
attr Muss_Tanken alias Tank fast leer?
attr Muss_Tanken devStateIcon Ja:ios-on-green:Nein Nein:ios-off:Ja
attr Muss_Tanken eventMap on:Ja off:Nein
attr Muss_Tanken genericDeviceType switch
attr Muss_Tanken homebridgeMapping clear On=state,valueOn=on,valueOff=off,cmdOn=on,cmdOff=off
attr Muss_Tanken icon gasoline
attr Muss_Tanken room Homekit,Verkehr
attr Muss_Tanken siriName Tanken?
attr Muss_Tanken webCmd Ja:Nein


DOIF für die Push-Benachrichtigung (Push erfolgt via Push_M mit PushNotifier) bei Unterschreiten des Preises in Benzinpreis_Eingabe:

define Benzinpreis_Push_Diesel DOIF ((["Tankstelle:^Diesel",0] <= [?Benzinpreis_Eingabe:state]) and [?Muss_Tanken] eq "Ja")\
(set Push_M message 〽 $EVENT⁹ €/l bei {(AttrVal("$DEVICE","alias","$DEVICE"))} um {(strftime("%H:%M",localtime))} Uhr)\
DOELSEIF (["Tankstelle:Push",0] =~ "aus" and [?Muss_Tanken] eq "Ja")\
(set Push_M message 🛑 Preiserhöhung bei {(AttrVal("$DEVICE","alias","$DEVICE"))} _Neuer Preis für Diesel: {(ReadingsVal("$DEVICE","Diesel",""))}⁹ €/l)
attr Benzinpreis_Push_Diesel cmdState Benzinpreis unter [Benzinpreis_Eingabe:state] €/l um {(strftime("%H:%M",localtime))} Uhr|Benzinpreis wieder über [Benzinpreis_Eingabe:state] €/l um {(strftime("%H:%M",localtime))} Uhr
attr Benzinpreis_Push_Diesel do always
attr Benzinpreis_Push_Diesel event-on-change-reading state


Beispiel einer Tankstelle in FHEM:

define ARAL_Tankstelle HTTPMOD https://188.68.35.147/json/prices.php?ids=944c37e1-1c46-4fd4-95d5-0aa3e30b2f7d&apikey=1173c0e1-012a-3d9f-a2a5-9c63128632ad 300
attr ARAL_Tankstelle alias ARAL
attr ARAL_Tankstelle event-on-change-reading Diesel,SuperE10,Push_Diesel,Push_SuperE10,Status
attr ARAL_Tankstelle event-on-update-reading SVG_Diesel,SVG_SuperE10,Status
attr ARAL_Tankstelle reading01Name SVG_Diesel
attr ARAL_Tankstelle reading01Regex "diesel":(\d.\d\d)
attr ARAL_Tankstelle reading02Name SVG_SuperE10
attr ARAL_Tankstelle reading02Regex "e10":(\d.\d\d)
attr ARAL_Tankstelle reading03Name Status
attr ARAL_Tankstelle reading03Regex "status":"([^"]+)"
attr ARAL_Tankstelle requestHeader Content-Type: application/json
attr ARAL_Tankstelle room Verkehr
attr ARAL_Tankstelle stateFormat Auto 1: Diesel⁹ €/l  (Ø Stat_DieselMonthAvg⁹ €/l) | Auto 2: SuperE10⁹ €/l (Ø Stat_SuperE10MonthAvg⁹ €/l)
attr ARAL_Tankstelle timeout 5
attr ARAL_Tankstelle userReadings Diesel:SVG_Diesel.* {ReadingsVal($name,"SVG_Diesel","")},\
SuperE10:SVG_SuperE10.* {ReadingsVal($name,"SVG_SuperE10","")},\
Push_Diesel:SVG_Diesel.* {if(ReadingsVal($name,"SVG_Diesel","") <= ReadingsVal("Benzinpreis_Eingabe","state","")) {"an"} else {"aus"}},\
Push_SuperE10:SVG_SuperE10.* {if(ReadingsVal($name,"SVG_SuperE10","") <= (minNum(ReadingsVal("ARAL_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsVal("OMV_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsVal("Selgros_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsVal("Shell_Tankstelle","Stat_SuperE10MonthAvg",0)))) {"an"} else {"aus"}}


Bei Fragen, Wünschen oder Anregung lasst es mich gerne wissen. Bei mir läuft alles soweit stabil und problemlos, bin aber auch für Ideen und Verbesserungen zu haben.

infokalypse

#466
Alternativ dazu DOIF für die Push-Benachrichtigung (Push erfolgt via Push_M mit PushNotifier) bei Unterschreiten des günstigsten Monatsdurchschnittswertes aller in FHEM eingepflegten Tankstellen:

define Benzinpreis_Push_SuperE10 DOIF ((["Tankstelle:^SuperE10",0] <= [?#min:"Tankstelle:^Stat_SuperE10MonthAvg":d]) and [?Muss_Tanken] eq "Ja")\
(set Push_M message 〽 $EVENT⁹ €/l bei {(AttrVal("$DEVICE","alias","$DEVICE"))} um {(strftime("%H:%M",localtime))} Uhr)\
DOELSEIF (["Tankstelle:Push_SuperE10",0] =~ "aus" and [?Muss_Tanken] eq "Ja")\
(set Push_M message 🛑 Preiserhöhung bei {(AttrVal("$DEVICE","alias","$DEVICE"))} _Neuer Preis für Super E10: {(ReadingsVal("$DEVICE","SuperE10",""))}⁹ €/l)
attr Benzinpreis_Push_SuperE10 cmdState Benzinpreis unter {(minNum(ReadingsNum("ARAL_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("OMV_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("Selgros_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("Shell_Tankstelle","Stat_SuperE10MonthAvg",0)))} €/l um {(strftime("%H:%M",localtime))} Uhr|Benzinpreis wieder über {(minNum(ReadingsNum("ARAL_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("OMV_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("Selgros_Tankstelle","Stat_SuperE10MonthAvg",0),ReadingsNum("Shell_Tankstelle","Stat_SuperE10MonthAvg",0)))} €/l um {(strftime("%H:%M",localtime))} Uhr
attr Benzinpreis_Push_SuperE10 do always
attr Benzinpreis_Push_SuperE10 event-on-change-reading state


Und zur Visualisierung der Werte noch ein Filelog

define FileLog_Benzinpreise FileLog ./log/Benzinpreise-%Y-%m.log .*_Tankstelle:SVG_.*
attr FileLog_Benzinpreise logtype text
attr FileLog_Benzinpreise nrarchive 1


Und die passenden SVG Graphen dazu, einmal für Benzin und einmal Diesel

define SVG_FileLog_Benzinpreise_1 SVG FileLog_Benzinpreise:SVG_FileLog_Benzinpreise_1:CURRENT
attr SVG_FileLog_Benzinpreise_1 group 3) Benzinpreisvergleich
attr SVG_FileLog_Benzinpreise_1 room Verkehr

define SVG_FileLog_Benzinpreise_2 SVG FileLog_Benzinpreise:SVG_FileLog_Benzinpreise_2:CURRENT
attr SVG_FileLog_Benzinpreise_2 group 3) Benzinpreisvergleich
attr SVG_FileLog_Benzinpreise_2 room Verkehr


Bei den SVG ist folgendes wichtig: (am Beispiel für Super E10 bei Preisen zwischen 1,55 und 1,80 EUR/l
Y-Axis label: Super E10 in €/l
Range as [min:max]: [1.55:1.80]

Label: Name der Tankstelle
Source: FileLog_Benzinpreise
Column: 4
Regexp: ARAL_Tankstelle.SVG_SuperE10:
Rest ist Geschmacksache...