Hauptmenü

nicht ausgeführte DOIF-Readings

Begonnen von Superposchi, 26 Juli 2022, 11:05:38

Vorheriges Thema - Nächstes Thema

Superposchi

Hallo,

ich habe ja versucht mir eine Tankstellenüberwachung/-benachrichtigung aufzubauen.
Dazu habe ich aktuell 4 Tankstellen ausgelesen und mit dem statistic-Modul auch entsprechende min/Avg/Max-Werte erzeugt.

Um jetzt den niedrigsten Preis aller Tankstellen zu finden wurden mir an anderer Stelle die DOIF-Readings empfohlen, was auch soweit funktioniert hat.
Doch leider erfolgte die automatische Neuberechnung nur kurze Zeit.

Vielleicht kann mir jemand Helfen den Fehler zu finden. Da steht zwar irgendwas mit "Wrong Timespec", doch sagt mir diese Meldung nichts.

Hier das List des DOIF's:
Internals:
   DEF        ([Spritbenachrichtigung_SuperE5:SuperE5_Preis] < [[Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Avg])
{my $Name=ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Name","Tankstelle"); my $Preis=ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis",""); fhem("set Pushmsg msg title=\"Tankbenachrichtigung\" device=\"Marko_S21Ultra\" message=\"SuperE5 kostet an der $Name $Preis€.\"")}
DOELSEIF ([Spritbenachrichtigung_SuperE5:SuperE5_Preis] = [[Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Min])
{my $Name=ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Name","Tankstelle"); my $Preis=ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis",""); fhem("set Pushmsg msg title=\"Tankbenachrichtigung\" device=\"Marko_S21Ultra\" message=\"Neuer Tiefpreis für SuperE5 an der $Name \($Preis€\).\"")}
   FUUID      62c7f318-f33f-6c14-b543-cce4965f7e87c601
   FVERSION   98_DOIF.pm:0.261590/2022-06-19
   MODEL      FHEM
   NAME       Spritbenachrichtigung_SuperE5
   NOTIFYDEV  .*(^Tankstelle_HS_.*).*,global,Spritbenachrichtigung_SuperE5
   NR         344
   NTFY_ORDER 50-Spritbenachrichtigung
   STATE      initialized
   TYPE       DOIF
   VERSION    26159 2022-06-19 16:10:29
   eventCount 223
   DOIF_Readings:
     SuperE5_Device ::AggregateDoIf($hash,'@min:','^Tankstelle_HS_.*','SuperE5')
     SuperE5_Name ::AggregateDoIf($hash,'@min:a:','^Tankstelle_HS_.*','SuperE5')
     SuperE5_Preis ::AggregateDoIf($hash,'#min:','^Tankstelle_HS_.*','SuperE5')
   OLDREADINGS:
   READINGS:
     2022-07-26 10:59:55   SuperE5_Device  Tankstelle_HS_Bachhaus
     2022-07-26 10:59:55   SuperE5_Name    TAP Bachhaus
     2022-07-26 10:22:02   SuperE5_Preis   1.889
     2022-07-14 19:02:28   cmd             0
     2022-07-26 10:22:02   e_Spritbenachrichtigung_SuperE5_SuperE5_Preis 1.889
     2022-07-26 10:22:02   error           condition c02: Can't modify non-lvalue subroutine call of &main::ReadingValDoIf in scalar assignment, line 1, at EOF

     2022-07-14 19:02:28   mode            enabled
     2022-07-14 19:02:28   state           initialized
     2022-07-26 10:59:55   timer_01_c01    error: Wrong timespec Tankstelle_HS_Bachhaus: either HH:MM:SS or {perlcode}
     2022-07-26 10:59:55   timer_02_c02    error: Wrong timespec Tankstelle_HS_Bachhaus: either HH:MM:SS or {perlcode}
   Regex:
     DOIF_Readings:
       :
         SuperE5_Device:
           "^Tankstelle_HS_.*" ^Tankstelle_HS_.*
         SuperE5_Name:
           "^Tankstelle_HS_.*" ^Tankstelle_HS_.*
         SuperE5_Preis:
           "^Tankstelle_HS_.*" ^Tankstelle_HS_.*
     accu:
     collect:
     cond:
       Spritbenachrichtigung_SuperE5:
         0:
           SuperE5_Preis ^Spritbenachrichtigung_SuperE5$:^SuperE5_Preis:
         1:
           SuperE5_Preis ^Spritbenachrichtigung_SuperE5$:^SuperE5_Preis:
     itimer:
       Spritbenachrichtigung_SuperE5:
         itimer:
           SuperE5_Device ^Spritbenachrichtigung_SuperE5$:^SuperE5_Device:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Spritbenachrichtigung_SuperE5','SuperE5_Preis') < ::DOIF_time_once($hash,0,$wday)
     1          ::ReadingValDoIf($hash,'Spritbenachrichtigung_SuperE5','SuperE5_Preis') = ::DOIF_time_once($hash,1,$wday)
   do:
     0:
       0          {my $Name=ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Name","Tankstelle"); my $Preis=ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis",""); fhem("set Pushmsg msg title=\"Tankbenachrichtigung\" device=\"Marko_S21Ultra\" message=\"SuperE5 kostet an der $Name $Preis€.\"")}
     1:
       0          {my $Name=ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Name","Tankstelle"); my $Preis=ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis",""); fhem("set Pushmsg msg title=\"Tankbenachrichtigung\" device=\"Marko_S21Ultra\" message=\"Neuer Tiefpreis für SuperE5 an der $Name \($Preis€\).\"")}
     2:
   helper:
     NOTIFYDEV  .*(^Tankstelle_HS_.*).*,global,Spritbenachrichtigung_SuperE5
     event      statSuperE10HourLast: Min: 1.829 Avg: 1.860 Max: 1.879,statSuperE5HourLast: Min: 1.889 Avg: 1.920 Max: 1.939,statSuperPlusHourLast: Min: 1.969 Avg: 2.000 Max: 2.019,statDieselHourLast: Min: 1.869 Avg: 1.900 Max: 1.919
     globalinit 1
     last_timer 2
     sleeptimer -1
     triggerDev Tankstelle_HS_Kuttenkeuler
     triggerEvents:
       statSuperE10HourLast: Min: 1.829 Avg: 1.860 Max: 1.879
       statSuperE5HourLast: Min: 1.889 Avg: 1.920 Max: 1.939
       statSuperPlusHourLast: Min: 1.969 Avg: 2.000 Max: 2.019
       statDieselHourLast: Min: 1.869 Avg: 1.900 Max: 1.919
     triggerEventsState:
       statSuperE10HourLast: Min: 1.829 Avg: 1.860 Max: 1.879
       statSuperE5HourLast: Min: 1.889 Avg: 1.920 Max: 1.939
       statSuperPlusHourLast: Min: 1.969 Avg: 2.000 Max: 2.019
       statDieselHourLast: Min: 1.869 Avg: 1.900 Max: 1.919
   internals:
   intervaltimer:
   localtime:
   readings:
     all         Spritbenachrichtigung_SuperE5:SuperE5_Preis
   time:
     0          [Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Avg
     1          [Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Min
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings SuperE5_Name:[@min:a:"^Tankstelle_HS_.*":SuperE5],
SuperE5_Device:[@min:"^Tankstelle_HS_.*":SuperE5],
SuperE5_Preis:[#min:"^Tankstelle_HS_.*":SuperE5],
   do         always
   group      Benachrichtigen
   icon       speach_control
   room       Benachrichtigungen,Information->Tankstellen,Test

Gisbert

Hallo Superposchi,

du benutzt Konstruktionen, die ich so noch nicht gesehen habe:
[[Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Avg]
ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis","")

Ich identifiziere die günstigste Tankstelle in meinem Dunstkreis, indem die Spritpreise logge und ein Diagramm erstelle. Damit sieht man auf einen Blick, wie die tägliche Entwicklung ist, und wer am günstigsten ist. Vielleicht hilft dir dieser Ansatz weiter.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Superposchi

[[Spritbenachrichtigung_SuperE5:SuperE5_Device]:SuperE5_Preis_Avg]Keine Ahnung ob das funktioniert, es war nur ein Versuch der mir logisch erschien.

ReadingsVal(ReadingsVal("Spritbenachrichtigung_SuperE5","SuperE5_Device",""),"SuperE5_Preis","")Das innere ReadingsVal soll das Device für das äußere ReadingsVal definieren - genau wie oben, keine Ahnung ob es funktioniert. Habe mich da ein bisschen an einer geschachtelte Formel wie in Excel orientiert.

ZitatIch identifiziere die günstigste Tankstelle in meinem Dunstkreis, indem die Spritpreise logge und ein Diagramm erstelle. Damit sieht man auf einen Blick, wie die tägliche Entwicklung ist, und wer am günstigsten ist. Vielleicht hilft dir dieser Ansatz weiter.
Zum einen stehe ich mit Diagrammen irgendwie auf Kriegsfuß und bekomme die nicht hin, zum Anderen muss man ja dann immer noch immer manuell danach schauen. Ziel ist es ja, sich über Ansage oder PushOver bei einem Niedrigpreis automatisch benachrichtigen zu lassen.

Gisbert

ZitatDas innere ReadingsVal soll das Device für das äußere ReadingsVal definieren - genau wie oben, keine Ahnung ob es funktioniert. Habe mich da ein bisschen an einer geschachtelte Formel wie in Excel orientiert.
Ich gehe stark davon aus, dass Damian nicht hauptberuflich Excel entwickelt. Falls dem so ist, wäre es purer Zufall dass DOIF und Excel gleich funktionieren. Ich rate dir die deutsche commandref zu DOIF durchzulesen und die dortigen Beispiele als Basis für dein Device zu nehmen.

Auf dieser Basis können wir dann weiterschauen, was fehlt. Du solltest dir auch noch überlegen, wann und wie oft du Benachrichtigungen haben willst. Dann wäre ja auch noch zu berücksichtigen, wie schnell du an deiner Wunsch-Tankstelle sein kannst. Es macht ja keinen Sinn, Nachrichten zu erhalten, falls dein Tank nicht den Weg zur Tankstelle antreten kann.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Superposchi

Die CommandRef habe ich zig mal gelesen, dort steht lediglich definiert [<Device>:<Reading>].
Da mein Device aber ja relativ ist habe ich einfach das Device selbst durch die gleiche Schreibweise ersetzt: [[<Device>:<Reading>]:<Reading>].
Wie gesagt, es war ein Versuch. Wie würdest du denn die variable Device abholen und in das DOIF einbauen?

ZitatAuf dieser Basis können wir dann weiterschauen, was fehlt. Du solltest dir auch noch überlegen, wann und wie oft du Benachrichtigungen haben willst. Dann wäre ja auch noch zu berücksichtigen, wie schnell du an deiner Wunsch-Tankstelle sein kannst. Es macht ja keinen Sinn, Nachrichten zu erhalten, falls dein Tank nicht den Weg zur Tankstelle antreten kann.
Alle überwachten Tankstellen sind im Umkreis von 5 km, der Tank dürfte also das kleinste Problem sein.
Ich hatte mir vorgestellt grundsätzlich eine Benachrichtigung zu bekommen wenn der aktuell billigste Preis unter den Durchschnitt der überwachten Tanken fällt und eine zweite wenn der aktuelle Preis gleich dem Min-Wert der Tankstellen ist (also neuer Tiefstwert)

Die Benachrichtigungen sollen auch nicht zwingend als Aufforderung zum Tanken dienen, sondern hauptsächlich zur Information.

Falls möglich würde ich die Option mit dem Diagramm zur optischen Anzeige auch gerne einbauen um die Entwicklung im Blick zu haben.

Gisbert

#5
Hallo Superposchi,

ich hab nur ein einziges Tankstellen-Device, welches die Readings für die einzelnen Tankstellen enthält.

Anbei meine Defintionen:
defmod Premiumdiesel HTTPMOD https://www.clever-tanken.de/tankstelle_details/9456 600
attr Premiumdiesel userattr stateFormat timeout
attr Premiumdiesel alias <b>Premium</b>
attr Premiumdiesel alignTime 00:07:07
attr Premiumdiesel comment Spritpreis mit Zehntel Centwerten:\
https://forum.fhem.de/index.php/topic,99939.msg933890.html#msg933890
attr Premiumdiesel enableControlSet 1
attr Premiumdiesel get02Name Aral_Leverkusen_Willy_Brandt_20
attr Premiumdiesel get02OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get02Poll 1
attr Premiumdiesel get02Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get02URL https://www.clever-tanken.de/tankstelle_details/1320
attr Premiumdiesel get03Name Aral_Leverkusen_Willy_Brandt_101
attr Premiumdiesel get03OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get03Poll 1
attr Premiumdiesel get03Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get03URL https://www.clever-tanken.de/tankstelle_details/27643
attr Premiumdiesel get04Name Aral_Koeln_Oskar_Schindlerstr
attr Premiumdiesel get04OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get04Poll 1
attr Premiumdiesel get04Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get04URL https://www.clever-tanken.de/tankstelle_details/45766
attr Premiumdiesel get05Name Aral_Koeln_Bergisch_Gladbacher_Str
attr Premiumdiesel get05OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get05Poll 1
attr Premiumdiesel get05Regex "price-type-name">ARAL Ultimate Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get05URL https://www.clever-tanken.de/tankstelle_details/3363
attr Premiumdiesel get06Name Total_Leverkusen_Berliner_Str
attr Premiumdiesel get06OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel get06Poll 1
attr Premiumdiesel get06Regex "price-type-name">Excellium Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel get06URL https://www.clever-tanken.de/tankstelle_details/4969
attr Premiumdiesel group Dieselpreise
attr Premiumdiesel icon fuel
attr Premiumdiesel reading01Name Shell_Leverkusen
attr Premiumdiesel reading01OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel reading01Regex "price-type-name">Shell V-Power Diesel</div>[\d\D]{700,900}"current-price-.">([0-9\.]+[^0-9]+suffix-price-.">[0-9])
attr Premiumdiesel reading02Name Aral_Leverkusen_Willy_Brandt
attr Premiumdiesel reading02OExpr $val =~ s/<[\d\D]+>//;;;;$val
attr Premiumdiesel room Strassenverkehr
attr Premiumdiesel sortby 1
attr Premiumdiesel stateFormat {'<div style="font-size: 92%;;">Aral Willy-Brandt-Ring 20: '.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_20',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_20',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Willy-Brandt-Ring 101: '.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_101',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Leverkusen_Willy_Brandt_101',''),4,1).'</span> €/L'.'<br/>'.\
'Shell Willy-Brandt-Ring: '.substr(ReadingsVal($name,'Shell_Leverkusen',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Shell_Leverkusen',''),4,1).'</span> €/L'.'<br/>'.\
'Total Berliner Str. 25: '.substr(ReadingsVal($name,'Total_Leverkusen_Berliner_Str',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Total_Leverkusen_Berliner_Str',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Köln Oskar-Schindlerstr.: '.substr(ReadingsVal($name,'Aral_Koeln_Oskar_Schindlerstr',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Koeln_Oskar_Schindlerstr',''),4,1).'</span> €/L'.'<br/>'.\
'Aral Köln Berg.-Gladbacher-Str.: '.substr(ReadingsVal($name,'Aral_Koeln_Bergisch_Gladbacher_Str',''),0,4).'<span style="vertical-align: +6px;; font-size: 75%;;">'.substr(ReadingsVal($name,'Aral_Koeln_Bergisch_Gladbacher_Str',''),4,1).'</span> €/L</div>'}
attr Premiumdiesel timeout 15
attr Premiumdiesel userReadings Zeitstempel {substr(ReadingsTimestamp($name,'STATE',''),0,16)}
attr Premiumdiesel verbose 2


Wenn ich zuhause bin, fahre ich nicht raus, nur um zu tanken; dann mache ich seltener Abfragen. In der Nacht benötige ich gar keine Preisinformationen:
defmod Update.Dieselpreise DOIF ([05:15]) (set Premiumdiesel start) \
DOELSEIF ([?05:16-22:14] and [myUniFi:G6] eq "connected") (set Premiumdiesel interval 1200) \
DOELSEIF ([?05:16-22:14] and [myUniFi:G6] eq "disconnected") (set Premiumdiesel interval 600) \
DOELSEIF ([22:15]) (set Premiumdiesel stop)
attr Update.Dieselpreise devStateIcon .*:fts_shutter_1w_0
attr Update.Dieselpreise icon car
attr Update.Dieselpreise room Strassenverkehr


Das log-Device:
defmod FileLog_Premiumdiesel FileLog ./log/Premiumdiesel-%Y-%m.log Premiumdiesel.(Aral_Koeln_Oskar_Schindlerstr|Aral_Leverkusen_Willy_Brandt_101|Aral_Leverkusen_Willy_Brandt_20|Aral_Koeln_Bergisch_Gladbacher_Str|Total_Leverkusen_Berliner_Str|Shell_Leverkusen):.*
attr FileLog_Premiumdiesel archivedir /media/USBBackup/Fhemlogbackup/logbackup/
attr FileLog_Premiumdiesel createGluedFile 1
attr FileLog_Premiumdiesel logtype text
attr FileLog_Premiumdiesel nrarchive 1


Die Grafik:
defmod SVG_FileLog_Premiumdiesel_1 SVG FileLog_Premiumdiesel:SVG_FileLog_Premiumdiesel_1:CURRENT
attr SVG_FileLog_Premiumdiesel_1 alias Aktuelle Preise Premiumdiesel
attr SVG_FileLog_Premiumdiesel_1 captionPos auto
attr SVG_FileLog_Premiumdiesel_1 room Strassenverkehr


Die gplot-Datei SVG_FileLog_Premiumdiesel_1.gplot (die wird aber nicht durch copy und paste erstellt !!):
# Created by FHEM/98_SVG.pm, 2022-06-02 09:36:45
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Preise Premiumdiesel'
set ytics
set y2tics ""
set grid ytics
set ylabel "Dieselpreis [€]"
set y2label ""

#FileLog_Premiumdiesel 4:Premiumdiesel.Aral_Leverkusen_Willy_Brandt_20\x3a::
#FileLog_Premiumdiesel 4:Premiumdiesel.Aral_Leverkusen_Willy_Brandt_101\x3a::
#FileLog_Premiumdiesel 4:Premiumdiesel.Shell_Leverkusen\x3a::
#FileLog_Premiumdiesel 4:Premiumdiesel.Total_Leverkusen_Berliner_Str\x3a::
#FileLog_Premiumdiesel 4:Premiumdiesel.Aral_Koeln_Oskar_Schindlerstr\x3a::
#FileLog_Premiumdiesel 4:Premiumdiesel.Aral_Koeln_Bergisch_Gladbacher_Str\x3a::

plot "<IN>" using 1:2 axes x1y1 title 'Aral Ultimate Willy-Brandt-Ring 20' ls l0 lw 2 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Aral Ulitimate Willy-Brandt-Ring 101' ls l4 lw 0.5 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Shell V-Power Willy-Brandt-Ring' ls l2 lw 0.5 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Total Berliner Str. 25' ls l1 lw 2 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Aral Ultimate Köln Oskar-Schindlerstr.' ls l3 lw 0.5 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Aral Ultimate Köln Bergisch-Gladbacher-Str. 417' ls l7 lw 0.5 with steps


Das alles hat ja jetzt nichts mit einem DOIF-Device zu tun.
Es sind aber gute Voraussetzungen, um ein DOIF-Device in deinem Sinn zu definieren.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Superposchi

Zitatich hab nur ein einziges Tankstellen-Device, welches die Readings für die einzelnen Tankstellen enthält.
Verstehe ich noch nicht ganz. Dann sind alle Tankstellen jeweils ein Reading oder wie sehe ich das? Aber immer nur eine Spritsorte pro Tankstelle, richtig?

Werde mir die Codezeilen für den Plot mal genauer ansehen müssen. Das Log klappt alles noch, nur das Grafikelement bekomme ich nicht hin.

Aber bei der Benachrichtigungsfunktion bringt mich das alles nicht weiter, da geht es ja darum, dass das Device eben nicht feststeht, sondern selbst aus einem zweiten Reading ausgelesen wird ehe es in einer Bedingung des DOIF's verwendet wird.

Gisbert

Hallo Superposchi,

du siehst doch, dass ich nach verschiedenen "Spritsorten" suche:
Shell V-Power Diesel
ARAL Ultimate Diesel
usw.
Es ist zwar inhaltlich jeweils das gleiche, aber der Name ist doch verschieden. Wenn die Tankstelle "Benzin", "E10", "Superraketenstoff" oder sonst was auf der abgefragten Internetseite bereithält, dann kannst du ihn abfragen.

Es sollte also möglich sein, durch copy&paste alle anderen "Spritsorten" in verschiedenen Readings in einem Device zu erhalten.

Auf diese Readings kannst du ja deine min-max-Durchschnitts-Abfrage in deinem DOIF loslassen. Hierbei muss dir aber jemand anderes helfen.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Superposchi

Du hast mich falsch verstanden.
Du suchst ausschließlich Diesel - das dieser bei den verschiedenen Tankstellen anders benannt ist, ändert ja nicht die Spritart.
Ich vergleiche immer sowohl Super (tankt meine Freundin) als auch SuperPlus (tanke ich selbst) pro Tankstelle. Es wären also immer zwei Readings pro Tankstelle nötig.

Außerdem ist das ja nicht das Problem. Das Auslesen und die statistics mit Min/Max/Avg funktionieren ja alle samt. Auch die Berechnung innerhalb des DOIF's für den niedrigsten Preis.
Somit habe ich zwei DOIF's mit Readings für jeweils dem niedrigsten Preis, dem Alias der Tankstelle und dem Namen des zugehörigen Device.

Mein Problem ist, dass ich es nicht hinbekomme die Daten zu verarbeiten, da ich offensichtlich nicht im DOIF-Bedingungsteil ein referenziertes Reading als Device angeben kann.
Ich muss ja ausgehend von den beiden DOIF's jeweils auf Basis des angegeben Device für die billigste Tankstelle zugreifen, das ich vorher nicht kenne und durch die Berechnung ermittelt wird.

Per

"nicht hinbekomme, die Daten zu verarbeiten"...
Versuche doch mal, diesen Satz uns so rüber zu bringen, dass wir wissen, was du machen willst.
Du bekommst über min den günstigsten Preis und suchst die passende Tankstelle? Kann man über eine Schleife abfragen, welche diesen Preis hat. Und über die Reihenfolge kannst du auch bei gleichen Preisen die dir liebere raussuchen.

Gisbert

ZitatDu hast mich falsch verstanden.
Du suchst ausschließlich Diesel - das dieser bei den verschiedenen Tankstellen anders benannt ist, ändert ja nicht die Spritart.
Ich vergleiche immer sowohl Super (tankt meine Freundin) als auch SuperPlus (tanke ich selbst) pro Tankstelle. Es wären also immer zwei Readings pro Tankstelle nötig.

Hallo Superposchi,

bitte eine Aufstellung deiner Tankstellen-Devices im raw-Format.
Ich bin immer noch der Meinung, dass alle Abfragen, egal welche Spritsorte und Anzahl der Abfragen, in einem Device erledigt werden können.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

Superposchi

Nach dem Urlaub  ist das Problem leider weiterhin aktuell.

@Per
Ich ermittele den niedrigsten Preis meiner Devices für jede Spritsorte (weiterverarbeitet wird aber nur Super und SuperPlus). Über diese Funktion lässt sich ja auch der Name des entsprechende Device ausgeben.
Also ist mein Gedankengang ein Vergleich zwischen dem niedrigsten Preis und dem Durchschnittspreis des Device, das über den Preis ermittelt wurde. Somit würde festgestellt ob sich der niedrigste Preis unter dem Durchschnittspreis befindet und somit (aus meiner Sicht) als Billig einzustufen ist. Dazu ein weiterer Vergleich ob der ermittelte niedrigste Preis gleich dem niedrigsten Preis der letzten Tage ist (somit einem neuen Tiefststand entspricht).

Diese beiden Vergleiche bekomme ich aber nicht hin, da ich im DOIF nicht auf einen variablen Device-Namen verweisen kann. Dieser ergibt sich ja erst aus der Berechnung des niedrigsten Preises pro Spritsorte.

@Gisbert
Meinst du ein List?
Andernfalls erkläre bitte was du mit "im RAW-Format" genau meinst und wie das erzeugt werden kann.
Wahrscheinlich kann alles in einem Device abgefragt werden, habe ja auch nie behauptet, dass es nicht ginge.
Ich bin nur der Meinung wenn ich 4 oder Mehr Mal Super, SuperPlus etc. in einem Device habe es sehr unübersichtlich werden würde.

Damian

Ich würde das mit Templates realisieren. Die gibt es allerdings nur im DOIF-Perlmodus. Mit einem Template definiere ich abstrakt, was ich mit einem Reading (hier eine Spritsorte) tun will. Dann muss ich das Template jeweils für jedes Reading (hier jede Spritsorte) aufrufen. Damit entstehen in einem DOIF-Device intern mehrere eigenständige DOIF´s, die getrennt voneinander für jedes Reading (hier jede Spritsorte) die notwendigen Berechnung vornehmen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Superposchi am 06 September 2022, 09:26:15
Dieser ergibt sich ja erst aus der Berechnung des niedrigsten Preises pro Spritsorte.
Du kannst doch ein min direkt mit dem Durchschnitt vergleichen. Denn Beides ist das Ergebnis einer Formel und damit unabhängig vom Device. Natürlich für jede Spritsorte getrennt.
Was auch immer du damit bezwecken willst, denn min kann ja nur kleiner oder gleich dem Durchschnitt sein, in beiden Fällen würdest du dort tanken. Und ohne Vergleich zu den Vortagen kann das "billig" auch nur das an wenigsten teure sein...

Mein Tipp: lass dir die Preise graphisch auswerten  dann siehst du schon mal, welche Zeit und Wochentage optimal sind. Den Trend an sich wirst du nicht nutzen können, das ist wie an der Börse.

Superposchi

@Damian
Templates in DOIF's sagt mir rein gar nichts und ich meine es auch nicht in der CommandRef gelesen zu haben. Hast du vielleicht eine Quelle oder besser noch ein Beispiel an dem ich das Prozedere ansehen und lernen kann?

@Per
Das Problem ist, dass der aktuell niedrigste Preis ja nicht von der gleichen Tankstelle kommen muss wie der niedriegste/durchschnittlichste Preis der statistics Auswertung.
Rein theoretisch kann es ja möglich sein, dass Tankstelle A heute den niedriegsten Preis hat, aber gestern im Durchschnitt eine andere Tankstelle (z.B. Tankstelle C) den niedrigsten Wert hatte.
Kann sein, dass ich falsch liege aber für mich ist das so als wenn ich Äpfel und Birnen vergleiche
Die grafische Auswertung nutzt mir nichts, weil ich sie ja nur von zu Hause aus betrachten kann. Ich tanke aber am häufigsten wenn ich auf dem nach Hauseweg bin, also von Auswärts komme.
Außerdem stehe ich mit der grafischen Darstellung nach wie vor auf Kriegsfuß. Irgendwie verstehe ich das Konzept nicht was wo eingestellt werden muss.