Guten Abend liebe Forengemeinde,
ich habe die Heizölpreisermittlung aus diesem Thead https://forum.fhem.de/index.php/topic,107189.0.html (https://forum.fhem.de/index.php/topic,107189.0.html) in FHEM eingebaut.
Soweit klappt alles. Ich würde das gerne erweitern und meine Liter dynamisch aus einem userReadings befüllen.
Dazu habe ich ein userReading angelegt
Nachtanken{4500-(split " ", (ReadingsVal("HeizoelReading","Heizoel","")))[10]}
Das funktioniert und es wird ein ein Zahlenwert in dem neuen Reading gespeichert.
Meine Frage, wie bekomme ich diesen Zahlenwert nun dynamisch in das attr replacement02Value vom Heizölpreis
Versucht habe ich
attr Heizoelpreis replacement02Value .ReadingsVal("Heizoelpreis", "Nachtanken","0")
Dann wird leider .ReadingsVal("Heizoelpreis", "Nachtanken","0") im attr gespeichert....
Was kann ich machen?
Daniel
Mit
replacement02Mode reading
replacement02Value Nachtanken
Aber replacement02Value ohne Punkt sollte auch funktionieren:attr Heizoelpreis replacement02Value ReadingsVal("Heizoelpreis", "Nachtanken","0")
Guten Morgen amenomade,
Danke für deine Antwort. Leider habe ich wohl noch was falsch gemacht. In der modifizierten URL wird die Variable %%MENGE%% jetzt zwar nicht mehr mit dem ReadingsVal befüllt, aber auch der Inhalt des userReadings wird nicht eingetragen. Kann es sein, dass dieses einen falschen Datentype hat?
Viele Grüße
Daniel
Poste bitte ein "list" von deinem HTTPMOD
Zitat von: amenomade am 18 Januar 2020, 19:46:33
Mit
replacement02Mode reading
replacement02Value Nachtanken
Aber replacement02Value ohne Punkt sollte auch funktionieren:attr Heizoelpreis replacement02Value ReadingsVal("Heizoelpreis", "Nachtanken","0")
Kann FHEM so ohne Weiteres im Attribut Daten aus einem anderen Reading dynamisch übernehmen? Ich dachte, das würde nur über ein notify oä und perl code gehen?
HTTPMOD kann aus seinen eigenen Readings Daten übernehmen, wenn er die Request baut. Dafür ist replacementXXmode "reading" da. Lies mal in CommandRef oder in Wiki
Jetzt weiss ich nicht genau, was er machen möchtet. Deswegen die Bitte an ein "list" vom HTTPMOD Device
Zitat von: amenomade am 19 Januar 2020, 10:17:52
Poste bitte ein "list" von deinem HTTPMOD
Öhm und wie mache ich das?
Du gibst "list Heizoelpreis" in der Kommandozeile von Fhem ein, und poste das Ergebnis davon
Hier das "list"
Internals:
BUSY 0
CFGFN /opt/fhem/FHEM/Heizoel.cfg
DEF https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit= 1800
FUUID 5e221c85-f33f-bfbc-af88-71e39709031ceebf
Interval 1800
LASTSEND 1579464542.16824
MainURL https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit=
ModuleVersion 3.5.21 - 27.12.2019
NAME Heizoelpreis
NOTIFYDEV global
NR 1385
NTFY_ORDER 50-Heizoelpreis
ReplacementEnabled 1
STATE <div>2020-01-19 21:09:03
<b>61.96€</b>/100l</div>
TRIGGERTIME 1579465447.97966
TRIGGERTIME_FMT 2020-01-19 21:24:07
TYPE HTTPMOD
addr https://www.esyoil.com:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=58454&pr-amount=3500&submit=
header
host www.esyoil.com
httpheader HTTP/1.1 200 OK
Date: Sun, 19 Jan 2020 20:09:02 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Security-Policy: style-src 'unsafe-inline' 'self' https://stackpath.bootstrapcdn.com https://use.fontawesome.com https://fonts.googleapis.com https://cdnjs.cloudflare.com blob:; font-src 'self' https://fonts.googleapis.com https://fonts.gstatic.com https://use.fontawesome.com data:; report-uri /api.php?sid=570
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: calc_arguments=58454%3B3500%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%244tLw%2FDC6Woigj9ddoguwJOFbsbjQrr0zC9rLuAorFjxMY8PYWgLvu; expires=Sun, 02-Feb-2020 20:09:02 GMT; Max-Age=1209600; path=/; secure
Set-Cookie: esyoil_com=hhev6jvtvbjqqapo2e95du81mj; expires=Sun, 19-Jan-2020 20:19:02 GMT; Max-Age=600; path=/; secure; HttpOnly
Set-Cookie: calc_arguments=58454%3B3500%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%24sJdv9Lr6zrw9IdNHBsFJEegDzAH3khcGOXLfkUZA3rnuCDP2mf6tO; expires=Sun, 02-Feb-2020 20:09:02 GMT; Max-Age=1209600; path=/; secure
Set-Cookie: calc_arguments=58454%3B3500%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%24ZJV7ysXUveWQRj0%2FTbTSB.E7oiH3tsiaNRp7Zmvzx94LKt.yYrOBS; expires=Sun, 02-Feb-2020 20:09:02 GMT; Max-Age=1209600; path=/; secure
Set-Cookie: calc_arguments=58454%3B3500%3B1%3B8%3B2%3B0%3B%3B%3B%3B%242y%2410%242m5mRfutZWbIiLGhnFHj5.lcM3vsA5ELpjc7qcWRFMo8ygdVvtJne; expires=Sun, 02-Feb-2020 20:09:02 GMT; Max-Age=1209600; path=/; secure
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Upgrade: h2
Connection: Upgrade, close
Vary: Accept-Encoding
Content-Encoding: gzip
Cache-Control: public
Content-Language: de
Content-Length: 38181
Content-Type: text/html; charset="utf-8"
httpversion 1.0
hu_blocking 0
hu_filecount 91
hu_port 443
hu_portSfx
ignoreredirects 0
loglevel 4
path /preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=58454&pr-amount=3500&submit=
protocol https
redirects 0
timeout 2
url https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=58454&pr-amount=3500&submit=
value 0
CompiledRegexes:
OLDREADINGS:
QUEUE:
READINGS:
2020-01-19 21:09:03 Heizoelpreis 61.96
2020-01-18 09:16:51 Nachtanken 1749
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%PLZ%%&pr-amount=%%MENGE%%&submit=
value 0
defptr:
readingBase:
Heizoelpreis reading
readingNum:
Heizoelpreis 010
readingOutdated:
requestReadings:
update:
Heizoelpreis reading 010
sslargs:
Attributes:
enableControlSet 1
reading010Name Heizoelpreis
reading010OExpr $val =~ s/,/\./; $val;
reading010Regex <span class="fw_b ">([\d\,]+)
replacement01Mode text
replacement01Regex %%PLZ%%
replacement01Value 58454
replacement02Mode text
replacement02Regex %%MENGE%%
replacement02Value 3500
room Heizung
stateFormat {"<div>".ReadingsTimestamp($name,"Heizoelpreis","-")."
<b>".ReadingsVal($name,"Heizoelpreis","-")."€</b>/100l</div>"}
userReadings Nachtanken{4500-(split " ", (ReadingsVal("HeizoelReading","Heizoel","")))[10]}
userattr reading010Name reading010OExpr reading010Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value
webCmd reread
Kannst du mir auch noch zufällig sagen, warum sich mein userRedings nicht aktualisiert?
Ich habe es jetzt nach langem hin und her geschafft...
Hier die Lösung:
Das replacement02Mode ist jetzt expression und das userRedings
Nachtanken {sprintf("%.0f",4500-(split " ",(ReadingsVal("HeizoelReading","Heizoel","")))[10],0)}
Jetzt geht es. Danke an alle fürs helfen :)
Ich hab das so gelöst (general.utilities.heating.oil.tank.meter ist ein Proteus Ölstands-Sensor):
defmod general.utilities.heating.oil.price.esyoil HTTPMOD https://www.esyoil.com/preisausgabe.php?pr-unloading-points=1&pr-product=8&pr-payment-type=2&pr-truck-type=&pr-hose-length=&pr-app=1&pr-zip=%%zip%%&pr-amount=%%needed_ltrs%%&submit= 1800
attr general.utilities.heating.oil.price.esyoil userattr reading01Expr reading01Name reading01Regex reading02Name reading02Regex replacement01Mode:reading,internal,text,expression,key replacement01Regex replacement01Value replacement02Mode:reading,internal,text,expression,key replacement02Regex replacement02Value replacement03Value
attr general.utilities.heating.oil.price.esyoil alias Ölpreis Esyoil
attr general.utilities.heating.oil.price.esyoil enableControlSet 1
attr general.utilities.heating.oil.price.esyoil eventMap reread:Aktualisieren reread:update
attr general.utilities.heating.oil.price.esyoil group Heizöl
attr general.utilities.heating.oil.price.esyoil icon measure_water_meter@black
attr general.utilities.heating.oil.price.esyoil reading01Expr $val =~ s/,/\./;; $val;;
attr general.utilities.heating.oil.price.esyoil reading01Name price
attr general.utilities.heating.oil.price.esyoil reading01Regex <span class="fw_b ">([\d\,]+)
attr general.utilities.heating.oil.price.esyoil reading02Name price_hr
attr general.utilities.heating.oil.price.esyoil reading02Regex <span class="fw_b ">([\d\,]+)
attr general.utilities.heating.oil.price.esyoil replacement01Mode text
attr general.utilities.heating.oil.price.esyoil replacement01Regex %%zip%%
attr general.utilities.heating.oil.price.esyoil replacement01Value 33330
attr general.utilities.heating.oil.price.esyoil replacement02Mode reading
attr general.utilities.heating.oil.price.esyoil replacement02Regex %%needed_ltrs%%
attr general.utilities.heating.oil.price.esyoil replacement02Value general.utilities.heating.oil.tank.meter:UsedLiters
attr general.utilities.heating.oil.price.esyoil room Allgemein->Energie
attr general.utilities.heating.oil.price.esyoil stateFormat price_hr € / ℓ, price_calculated_hr € gesamt
attr general.utilities.heating.oil.price.esyoil userReadings price_calculated:price:.* {\
my $price = ReadingsNum("$name", "price", 0);;\
my $needed = ReadingsNum("general.utilities.heating.oil.tank.meter", "UsedLiters", 0) / 100;;\
return sprintf("%.2f", $price * $needed);;\
},\
price_calculated_hr:price_calculated:.* {\
my $price = ReadingsNum("$name", "price_calculated", 0);;\
$price =~ s/\./\,/;;\
return $price;;\
}
attr general.utilities.heating.oil.price.esyoil webCmd Aktualisieren