bin gerade dabei meine UVR1611 Sensorwerte in FHEM darzustellen.
HTTPMOD aufruf füllt mir brav meinen buffer, aber ich bekomme es irgendwie nicht hin das die readings korrekt funktionieren.
folgendes befindet sich im buf:
HTTP/1.1 200 OK Server: Keil-EWEB/2.1 Content-Type: text/html Cache-Control: no-cache Connection: close <div id="pos0" > Oskar oben 62,1 °C</div> <div id="pos1" > Oskar mitte 1 60,1 °C</div> <div id="pos2" > Oskar mitte 2 59,7 °C</div> <div id="pos3" > Oskar unten 53,8 °C</div> <div id="pos4" > Boiler Altbau 59,0 °C</div> <div id="pos5" > Warmwasser 24,4 °C</div> <div id="pos6" > Stokerschnecke 45,4 °C</div> <div id="pos7" > Sonneneinstrahlung 60 W/m²</div> <div id="pos8" > FBH Vorlauf Neubau 27,5 °C</div> <div id="pos9" > Solar WT VL 40,9 °C</div> <div id="pos10" > Kollektortemperatur 25,7 °C</div> <div id="pos11" > Solar WT RL 37,7 °C</div> <div id="pos12" > Aussentemperatur 5,8 °C</div> <div id="pos13" > Raumtemperatur Neubau 22,5 °C</div> <div id="pos14" > Solar Leistung momentan 0,00 kW</div> <div id="pos15" > Solar Leistung kWh gesamt 833,4 kWh</div> <div id="pos16" > Solar Leistung MWh gesamt 7</div>
das reading für den ersten wert
Oskar oben 62,1 °C
ist wie folgt definiert:
attr Temperaturen userattr reading01Name reading01Regex
attr Temperaturen enableControlSet 1
attr Temperaturen reading01Name OskarOben
attr Temperaturen reading01Regex Oskar oben ([\d\,]+)
leider liefert die syntax oben keinen gültigen wert ins reading, was ist falsch? danke für einen stups in die richtige richtung, bin noch neu ;)
Was steht denn in dem Reading als Wert? Generell ist der RegExp jetzt mal nicht wirklich falsch, nur das Komma müsste meines Wissens nach nicht escaped werden im regexp (also kein backslash davor)
Johannes
Also als RegExp wäre (\d{2},\d) richtig für zwei Ziffern vor dem komma und eine danach.
Allerdings nutze ich HTTPMOD (noch) nicht, so dass ich nicht genau weiss, wofür die eckigen Klammern stehen... mit den eckigen Klammern wird's im RegExpSimulator falsch ....
http://www.regexpal.com/ (http://www.regexpal.com/)
Grüße
Stephan
Zitat von: viegener am 23 November 2016, 17:28:21
Was steht denn in dem Reading als Wert? Generell ist der RegExp jetzt mal nicht wirklich falsch, nur das Komma müsste meines Wissens nach nicht escaped werden im regexp (also kein backslash davor)
Johannes
fhem erzeugt das reading garnicht, deshalb kann ich auch nicht erraten was ich falsch mache.
laut regexp simulator funktioniert der ausdruck jedenfalls...
edit: auch der ausdruck von abc2006 erzeugt mir kein reading... :(
attr Temperaturen reading01Regex (.*)
erzeugt das ein Reading? bin mir nicht sicher, ob "Oskar" und "oben" nicht auch versucht wird, als Regexp zu werten...
Ich nehme an, Events werden erzeugt, in den Event Monitor hast du schon geschaut und verbose 4 hast du auch schon probiert?
Grüße
Stephan
Vielleicht gehen wir das dann mal systematisch an:
- Mache doch mal ein list des HTTPMOD devices
- Setze verbose mal auf 5 für den device
- und füge den log file aus dem nächsten Aufruf mit an
Vielleicht lässt sich dann erkennen warum gar nichts passiert
RAW definition
BUSY
0
CHANGED
DEF
http://xxx:yyy@10.0.0.249/schematic_files/1.CGI 60
Interval
60
LASTSEND
1479964238.55771
MainURL
http://xxx:yyy@10.0.0.249/schematic_files/1.CGI
ModuleVersion
3.3.5 - 29.9.2016
NAME
Temperaturen
NR
116
STATE
???
TRIGGERTIME
1479964298.55754
TRIGGERTIME_FMT
2016-11-24 06:11:38
TYPE
HTTPMOD
addr
http://10.0.0.249:80
auth
xxx:yyy
buf
HTTP/1.1 200 OK Server: Keil-EWEB/2.1 Content-Type: text/html Cache-Control: no-cache Connection: close <div id="pos0" > Oskar oben 63,3 °C</div> <div id="pos1" > Oskar mitte 1 59,2 °C</div> <div id="pos2" > Oskar mitte 2 56,1 °C</div> <div id="pos3" > Oskar unten 30,5 °C</div> <div id="pos4" > Boiler Altbau 56,0 °C</div> <div id="pos5" > Warmwasser 48,4 °C</div> <div id="pos6" > Stokerschnecke 26,8 °C</div> <div id="pos7" > Sonneneinstrahlung 0 W/m²</div> <div id="pos8" > FBH Vorlauf Neubau 28,7 °C</div> <div id="pos9" > Solar WT VL 17,9 °C</div> <div id="pos10" > Kollektortemperatur 6,2 °C</div> <div id="pos11" > Solar WT RL 17,7 °C</div> <div id="pos12" > Aussentemperatur 4,1 °C</div> <div id="pos13" > Raumtemperatur Neubau 22,6 °C</div> <div id="pos14" > Solar Leistung momentan 0,00 kW</div> <div id="pos15" > Solar Leistung kWh gesamt 833,4 kWh</div> <div id="pos16" > Solar Leistung MWh gesamt 7</div>
code
200
conn
data
displayurl
http://xxx:yyy@10.0.0.249/schematic_files/1.CGI
header
host
10.0.0.249
httpheader
HTTP/1.1 200 OK Server: Keil-EWEB/2.1 Content-Type: text/html Cache-Control: no-cache Connection: close
httpversion
1.0
hu_blocking
0
hu_filecount
4
ignoreredirects
0
loglevel
4
path
/schematic_files/1.CGI
protocol
http
redirects
0
timeout
5
url
http://xxx:yyy@10.0.0.249/schematic_files/1.CGI
value
0
Listing in fhem.cfg
#UVR1611 auslesen
define Temperaturen HTTPMOD http://xxx:yyy@10.0.0.249/schematic_files/1.CGI 60
attr Temperaturen userattr reading01Name reading01Regex
attr Temperaturen enableControlSet 1
attr Temperaturen reading01Name OskarOben
attr Temperaturen reading01Regex Oskar oben (.*)
attr Temperaturen room Heizung
attr Temperaturen timeout 5
fhem.log im anhang
mein LS110 der per JSONmeter ausgelesen wird hat auch ein problem, es aktualisiert sich nicht mehr von selber seit dem fhem update...
vielleicht noch ein paar beobachtungen meinerseits am rande: fhem läuft auf einer windowskiste als service mit activeperl als interpreter (aktuellste version)
- fhem5.7 archiv unupgedatet läuft, JSONMETER funkioniert einwandfrei, HTTPMOD aufruf von Heizungssteuerung liefert allerdings nichts in den buffer zurück
- mit update all fhem auf den neuesten stand gebracht: JSONMETER aktualisiert sich nicht mehr automatisch dafür funktioniert jetzt der HTTPMOD aufruf inkl. füllen des buffers, aber ich kann kein funktionierendes reading erzeugen
der betrieb unter windows ist doch auch uneingeschränkt möglich, oder?
ich danke euch schonmal für eure hilfe!
Zu dem JSONMeter kann ich erstmal nichts sagen, aber der log-Auszug hilft:
Die Daten die zurückkommen sehen so aus:
Body: <div id="pos0" >
Oskar oben
63,3 °C</div>
Da ist also mehr als ein Leerzeichen dazwischen?
Konsequenterweise kommt:
2016.11.24 06:07:38 5: Temperaturen: ExtractReading OskarOben with regex /Oskar oben (.*)/...
2016.11.24 06:07:38 5: Temperaturen: ExtractReading OskarOben did not match
Also würde ich vorschlagen, Du machst den regexp mal passend/flexibler (und erlaubst auch die Zeilenumbrüche im Regexp):
attr Temperaturen reading01Regex Oskar\s+oben\s+([\d\,]+)
attr Temperaturen reading01RegOpt s
Nicht verwirren lassen, die eckigen Klammern waren und sind passend um eine Gruppe von Zeichen die matchen zu definieren.
Mit \s+ matche ich auch 1 oder mehrere Trennzeichen und mit der Option s wird die gesamte HTTP-Antwort als ein langer String behandelt und nicht Zeile für Zeile angewendet.
danke!
that did the trick!
dann packen wir die gewonnen daten mal schön in diagramme :)
Super! Schön, dass ich helfen konnte
ein kleines problemchen hätte ich noch mit einem userreading.
die leistungswerte der solaranlage werden getrennt ausgegeben in MWh und kWh
ich hätte zur weiterverarbeitung gerne einen kombinierten wert in kWh, den ich mit folgendem userreading erzeugen möchte, aber leider haperts auch da:
attr Temperaturen userReadings SolarLeistungGesamt:SolarLeistungkWhgesamt { ((ReadingsVal("Temperaturen", "SolarLeistungkWhgesamt", 0))+(ReadingsVal("Temperaturen", "SolarLeistungMWhgesamt", 0)*1000));; }
noch ein kleine frage am rande dazu: die werte von der UVR1611 kommen mit komma als dezimaltrennzeichen - die werte müssen vor berechnungen in FHEM aber mit dezimalpunkt vorliegen oder?
ist jetzt für das obenstehende problem nicht relevant, da ich die nachkommastelle der beiden zu addierenden werte eh momentan nicht auslese, aber für die zukunft...
edith: gelöst...
attr Temperaturen userReadings SolarLeistungGesamt:Oskar.* { ReadingsVal("$name", "SolarLeistungkWhgesamt", 0)+(ReadingsVal("$name", "SolarLeistungMWhgesamt", 0)*1000) }
und die punkt komma thematik auch
attr Temperaturen reading17OExpr $val =~ s/,/\./;; $val;;
Hatte überlegt, ob ichs als edit reinschreibe, wollte mich aber auch nochmal für den Anschub bedanken:
klar... [\d\,]+ bedeutet mindestens eine oder mehrere Zahlen oder Kommata. Matcht aber auch auf ,,, oder auf 1,2,3.
rein Interessehalber, wäre nicht folgendes genauer?
attr Temperaturen reading01Regex Oskar\s+oben\s+(\d+\,\d+)
beliebig viele Zahlen, ein komma, wieder beliebig viele Zahlen (was man auch noch einschränken könnte):
attr Temperaturen reading01Regex Oskar\s+oben\s+(\d{1,3}\,\d)
1-3 Ziffern, dann ein Komma, dann eine Ziffer..
Grüße
Stephan
Hallo Stephan,
genauer wäre das schon für den Testwert, allerdings auch relativ restrktiv, denn die Annahme wäre, dass bei glatten Gradzahlen auch so etwas wie 55,0 kommt und nicht einfach nur 55.
Generell erscheint es mir aber nicht so wichtig, dass der Regexp für den Inhalt des Readings restriktiv ist, sondern dass
a) der Abschnitt in der Rückgabe eindeutig identifiziert wird und nicht etwa zufällig andere Teile (in diesem Fall Oskar oben)
b) der Readingwert komplett aber eben auch nur der Wert gematcht wird (in diesem Fall, folgt ein Leerzeichen auf den Wert), also wäre es eigentlich besser (vielleicht aber schon paranoid) folgenden Ausdruck zu verwenden:
attr Temperaturen reading01Regex Oskar\s+oben\s+([\d\,]+)\s
So ist sicher, dass der komplette Wert genommen wird (Stichwort gieriges matchen/greedy matching). Allerdings ist das auch der Standard (gierig).
so, nachdems jetzt mal ausnahmsweise minustemperaturen draussen hat gibts noch ein kleines problemchen, negative werte :p
<div id="pos10" >
Kollektortemperatur
- 2,5 °C</div>
die steuerung gibt mir minustemperaturen leider mit "-" gefolgt von einem leerzeichen aus, was mit folgendem regexp
Kollektortemperatur\s+([-\s\d\,]+)\s
zwar wieder ein reading ergibt, aber das leerzeichen zwischen vorzeichen und wert ist natürlich für den plot ein problem...
wie muss ich das regex das mir aus dem komma einen punkt macht erweitern um das leerzeichen rauszuwerfen?
Das Leerzeichen rauswerfen geht nicht über den regexp, denn hier gibt es keine Möglichkeit Ersetzungen zu machen oder Teilausdrücke zusammenzuführen, so weit ich das erkennen kann. Mehrere Klammerasudrücke würden zu mehreren getrennten Readings führen.
Eine Möglichkeit wäre ein userreading zu machen, das den Wert von Leerzeichen befreit.
ich hätte eigentlich gehofft das über den
attr Temperaturen reading17OExpr $val =~ s/,/\./;; $val;;
mitverheiraten zu können, sprich komma durch punkt ersetzen und, wenn im reading ein minus enthalten ist, das leerzeichen dazwischen automatisch zu killen.
Du hast Recht über Expr könntest Du das machen, ich bin da kein HTTPMod-Experte.
Am einfachsten wäre das vermutlich in dem Du zwei Berechnungen in reading..OExpr als separate statements einfügst, also so etwas wie
attr Temperaturen reading17OExpr $val =~ s/,/\./;; $val =~ s/ //g;; $val;;
wiederum ungetestet.
mit zwei berechnungen spiel ich schon den ganzen vormittag rum :P
mit deinem ausdruck funktionierts wunderbar ;)
danke!
Na das ist schön zu hören.
Ich denke es würde Dir helfen, wenn Du über die perl Regexps nachliest (ich mag die Referenz in selfHTML) und auch ein bisschen rumprobierst z.B. über perlconsole oder eine der Regexp-Seiten im Web, die perl unterstützen. Es ist immer sehr aufwändig solche Tests im laufenden System zu machen, manchlam ist einfache eine Möglichkeit das interaktiv auszuprobieren besser.
ja, ich bin schon dran mich da einzulesen :) is zwar phasenweise etwas wirr, aber ich krieg das hin :D
seit heute funzt mein JSONMETER stromzähler auch wieder, so einfach mirnixdirnix...