Seite 1 von 2
openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 10:39
von Johannes911
nachdem das Datenauslesen über das http-binding (siehe
viewtopic.php?f=15&t=3807&start=20) funktioniert und ich brauchbare Werte bekomme sehe ich aber auch das ich in Zukunft auf Probleme stoßen werde.
geliefert wird:
<div id="pos362">ANA3_1:> 25,2 °C </div>
eingelesen wird das Item mit:
String UVR1611_ANA3_1 "ANA3_1 [%s]" <temperature> (OO_UVR3) ["ANA3_1"] { http="<[blnet
REGEX(.*ANA3_1........([0-9]+,[0-9]).*)]" }
und liefer 25,2. soweit so gut.
Ich sehe aber auch an anderer Stelle das z. B.:
<div id="pos366">ANA3_5:>999,9 °C </div>
das REGEX Konstrukt scheitert. Ich könnte dies mit:
String UVR1611_ANA3_5 "ANA3_5 [%s]" <temperature> (OO_UVR3) ["ANA3_5"] { http="<[blnet
REGEX(.*ANA3_5..([0-9]+,[0-9]).*)]" }
natürlich einlesen, aber das hilft mir nicht wirklich weiter, denn beide Werte können abwechselnd an der gleichen Position auftauchen, wahrscheinlich sind diese Fälle zu erwarten:
ANA3_1:> 25,2 °C </div> Wert ist OK
ANA3_5:>999,9 °C </div> Kabelbruch
ANA3_C:> -----</div> nicht korrekt konfiguriert
ANA3_7:> 5,2 °C </div> mutmasslich wenn einstelliger Wert kommt
ANA3_8:> -2,8 °C </div> mutmasslich wenn einstelliger negativer Wert kommt
ANA3_8:> -12,3 °C </div> mutmasslich wenn zweistelliger negativer Wert kommt
Wie fange ich all diese unterschiedlichen Werte am Besten mit REGEX ab? Oder wie mache ich es sonst? Eine Idee war jeden Eingangswert 6 mal mit unterschiedlichem REGEX einlesen und anschließend das aussuchen was am besten passt, aber ist wirklich ideal?
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 11:30
von Johannes911
negative Werte konnte ich so schnell nicht "auftreiben" aber was die Ausgabe liefert ist schon irgendwie Mist. Was mich besonders stört ist dieses Leerzeichen (oder zwei) was dann auch noch in sechs Zeichen ( = non-breaking space) gewandelt ankommt, bei Temperaturen ab 100,0 °C aber ganz fehlt. Ich gehe jetzt mal davon aus das negative zweistellige Werte auch kein ¬nbsp; davor haben, einstellige aber doch
ausgelesen:
ANA1_D:> 25,8 °C
ANA1_F:> 9,2 °C
ANA3_C:> -----
ANA3_D:>999,9 °C
ANA3_E:> 27,3 °C
vermutet:
ANA3_G:>-27,3 °C
ANA3_E:> -7,3 °C
also müsste ich erst mal auf ANAn_s detektieren, zwei Stellen ignorieren, dann zuerst nachgucken ob ein oder zwei &nsb; stehen, danach gucken ob Minuszeichen vorhanden ist und merken, n,m einlesen und dann ggfls. das Minuszeichen wieder davor schreiben.
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 11:59
von violine21
Hallo,
das sieht aus wie UVR1611

.
Ich habe bei mir das Problem mit z.B. der erzeugten Leistung und anderen Werten so gelöst:
Code: Alles auswählen
rule "UVR1611"
when
Time cron "0 * * * * ?" // jede Minute
then
virtual_UVR_Solarpumpe.postUpdate((Float::parseFloat(UVR_Solarpumpe.state.toString.trim().replaceAll(" ",""))) / 0.3)
virtual_UVR_Leistung.postUpdate(UVR_1611_aktuell.state.toString.trim().replaceAll(" ",""))
virtual_UVR_MWh.postUpdate(UVR_1611_MWh.state.toString.trim().replaceAll(" ",""))
virtual_UVR_kWh.postUpdate(UVR_1611_kWh.state.toString.trim().replaceAll(" ","").replaceAll(" kWh",""))
if(virtual_UVR_kWh.state.toString.length.toString == "3")
virtual_UVR_Gesamtleistung.postUpdate(virtual_UVR_MWh.state + ".00" + virtual_UVR_kWh.state + " kWh")
if(virtual_UVR_kWh.state.toString.length.toString == "4")
virtual_UVR_Gesamtleistung.postUpdate(virtual_UVR_MWh.state + ".0" + virtual_UVR_kWh.state + " kWh")
if(virtual_UVR_kWh.state.toString.length.toString == "5")
virtual_UVR_Gesamtleistung.postUpdate(virtual_UVR_MWh.state + "." + virtual_UVR_kWh.state + " kWh")
virtual_UVR_Kollektortemperatur.postUpdate(UVR_1611_Kollektortemperatur.state.toString.trim().replaceAll(" ","") + " °C")
virtual_UVR_Viessmanntemperatur.postUpdate(UVR_1611_Viessmanntemperatur.state.toString.trim().replaceAll(" ","") + " °C")
virtual_UVR_Broetje_oben.postUpdate(UVR_1611_Broetje_oben.state.toString.trim().replaceAll(" ","") + " °C")
virtual_UVR_Broetje_unten.postUpdate(UVR_1611_Broetje_unten.state.toString.trim().replaceAll(" ","") + " °C")
end
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 13:45
von Johannes911
Hallo violine21,
ja genau UVR1611. Das sieht schon mal bei den letzten 4 Zeilen nicht schlecht aus, wie sehen dazu deine ITEMS aus, bei den Temperaturen?
Bei den zweistelligen Werten wandle ich schon nach Float, kann die Werte somit in die Datenbank schreiben und als tatsächliche Temperaturen weiter auswerten.
erst mal danke
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 13:48
von Tokamak
Es sieht so aus, als ob alle (bis auf -----) das ° gemeinsam haben.
Daher würde ich versuchen, in etwa so suchen:
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 14:16
von JuergenA
Hallo Johannes,
zuallererst wäre es vielleicht nicht schlecht der besseren Lesbarkeit deine Code schnipsel in den richtigen Felder mit Code zu markieren. Desweiteren ist mir persönlich immer noch nicht klar was Du derzeit an Problemen hast. Aber vielleicht könntest das nochmal genauer erklären.
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 14:39
von udo1toni
Also, mal so in den Raum geworfen: Wenn bestimmte Felder nur manchmal in der http Antwort enthalten sind, läufst Du totsicher in ein Problem, denn REGEX liefert den vollen String, falls das Muster nicht matcht (kleine Eigenheit in openHAB...)
Es ist in solchen Fällen sinnvoller, das anders zu lösen, beispielsweise mit einem python Script, welches die Seite selbst abruft und komplett parst, sowie anschließend alle gültigen Werte (z.B. per REST API) an openHAB überträgt.
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 16:32
von violine21
Johannes911 hat geschrieben: ↑19. Aug 2020 13:45wie sehen dazu deine ITEMS aus, bei den Temperaturen?
Code: Alles auswählen
String UVR_1611_MWh "MWh[%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos19.>(.*?)</div>(.*))]" }
String UVR_1611_kWh "kWh[%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos20.>(.*?)</div>(.*))]" }
String UVR_1611_aktuell "Leistung[%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos18.>(.*?)</div>(.*))]" }
String UVR_1611_Kollektortemperatur "Kollektortemperatur [%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos2.>(.*?) °C </div>(.*))]" }
String UVR_Solarpumpe "[%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos15.>(.*?)</div>(.*))]" }
String UVR_1611_Viessmanntemperatur "Viessmanntemperatur [%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos5.>(.*?) °C </div>(.*))]" }
String UVR_1611_Broetje_oben "Broetje_oben [%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos4.>(.*?) °C </div>(.*))]" }
String UVR_1611_Broetje_unten "Broetje_unten [%s]" { http="<[cacheUVR:60000:REGEX(.*?<div id=.pos3.>(.*?) °C </div>(.*))]" }
Am "ekligsten" fand ich die Solarleistung. Die sendet die UVR in MWh und kWh getrennt. Da habe ich beim Zusammensetzen einfach
den kWh-Wert bei Bedarf mit führenden Nullen aufgefüllt und an den MWh-Wert hinten dran gehängt. Ich wollte einen String haben:
Code: Alles auswählen
String virtual_UVR_Gesamtleistung "UVR Gesamtleistung[%s]"
Zum Speichern in eine Maria-DB:
Code: Alles auswählen
String UVR_Gesamtleistung "UVR Gesamtleistung MySQL[%s]"
Code: Alles auswählen
UVR_Gesamtleistung.postUpdate(UVR_1611_MWh.state.toString.trim().replaceAll(" ","") + UVR_1611_kWh.state.toString.trim().replaceAll(" ","").replaceAll("kWh","").replaceAll(",","."))
Ist alles etwas um die Ecke. Aber es war mein erstes per http/REGEX eingebundenes Gerät. Bis jetzt läufts und ich war zu faul, es zu verfeinern.
Die Problematik mit den nicht gesendeten Werten hab ich allerdings nicht so richtig verstanden
Edit:
<div id="pos362">ANA3_1:> 25,2 °C </div>
Auf den Bezeichner wie z.B. "ANA3_1; habe ich beim Anlegen der html-Seite im BL-Net verzichtet.
Die "pos"-Nr. ändert sich ja nicht und ich weiß selbst am Besten, welcher Wert sich an welcher "pos" versteckt.
Das macht alles nur noch komplizierter!
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 16:43
von violine21
Hier noch ein
Auszug aus der GRAFIK_1.html, wie sie auf dem BL-Net als Anlagenschema abgelegt ist:
Code: Alles auswählen
<!--########## Definitionen der Anzeigeparameter ##########-->
<div id="pos0">$c1t1</div>
<div id="pos1">$c1z1</div>
<div id="pos2">$X8D200101</div>
<div id="pos3">$X8D200201</div>
<div id="pos4">$X8D200701</div>
<div id="pos5">$X8D200301</div>
<div id="pos6">$X8D200501</div>
<div id="pos7">$X8D200801</div>
<div id="pos8">$X8D200601</div>
<div id="pos9">$X8D200401</div>
<div id="pos10">$X8D200901</div>
<div id="pos11">$X8D200A01</div>
<div id="pos12">$XAA200301</div>
<div id="pos13">$XAA200901</div>
<div id="pos14">$XAA200201</div>
<div id="pos15">$XAB200201</div>
<div id="pos16">$XAA200101</div>
<div id="pos17">$XAA200801</div>
<div id="pos18">$XA0350501</div>
<div id="pos19">$XA2350501</div>
<div id="pos20">$XA1350501</div>
<div id="pos21">$X8D200B01</div>
<div id="pos22">$X95361601</div>
<div id="pos23">$X81361601</div>
<div id="pos24">$X9A361601</div>
<div id="pos25">$XAA200C01</div>
<div id="pos26">$XAA200D01</div>
<div id="pos27">$X21201201</div>
<div id="pos28">$X31201201</div>
<div id="pos29">$X41201201</div>
<div id="pos30">$X32201201</div>
<div id="pos31">$X42201201</div>
<div id="pos32">$X33201201</div>
<div id="pos33">$X43201201</div>
<div id="pos34">$X22201201</div>
<div id="pos35">$X34201201</div>
<div id="pos36">$X44201201</div>
<div id="pos37">$X35201201</div>
<div id="pos38">$X45201201</div>
<div id="pos39">$X36201201</div>
<div id="pos40">$X46201201</div>
<div id="pos41">$X23201201</div>
<div id="pos42">$X37201201</div>
<div id="pos43">$X47201201</div>
<div id="pos44">$X38201201</div>
<div id="pos45">$X48201201</div>
<div id="pos46">$X39201201</div>
<div id="pos47">$X49201201</div>
<div id="pos48">$X24201201</div>
<div id="pos49">$X3A201201</div>
<div id="pos50">$X4A201201</div>
<div id="pos51">$X3B201201</div>
<div id="pos52">$X4B201201</div>
<div id="pos53">$X3C201201</div>
<div id="pos54">$X4C201201</div>
<div id="pos55">$X25201201</div>
<div id="pos56">$X3D201201</div>
<div id="pos57">$X4D201201</div>
<div id="pos58">$X3E201201</div>
<div id="pos59">$X4E201201</div>
<div id="pos60">$X3F201201</div>
<div id="pos61">$X4F201201</div>
<div id="pos62">$X12341701</div>
<div id="pos63">$X16341701</div>
<div id="pos64">$X17341701</div>
<div id="pos65">$X90361501</div>
<div id="pos66">$X95361501</div>
<div id="pos67">$X81361501</div>
<div id="pos68">$X9A361501</div>
<div id="pos69">$XA0361301</div>
<div id="pos70">$XA0361501</div>
<div id="pos71">$XA0361601</div>
<div id="pos72">$X16371401</div>
<div id="pos73">$X21201401</div>
<div id="pos74">$X31201401</div>
<div id="pos75">$X41201401</div>
<div id="pos76">$X95361601</div>
<div id="pos77">$X81361601</div>
<div id="pos78">$X9A361601</div>
<div id="pos79">$X94341801</div>
<div id="pos80">$X8D200C01</div>
<div id="pos81">$X12341101</div>
<div id="pos82">$X16341101</div>
<div id="pos83">$X83320101</div>
<div id="pos84">$X16341701</div>
Re: openhab, spezielle Fragen zu REGEX
Verfasst: 19. Aug 2020 18:13
von Johannes911
Dank an alle!
Das sind auf jeden Fall schon mal gute, und für mich alternative, Denkansätze.
@udo1toni: phyton kann ich gar nicht, bei den REGEXen kann ich mir halbwegs vorstellen was passiert kenne allerdings die mannigfachen Möglichkeiten noch nicht. Und nein, der Datenstrom liefert immer alle Werte aus
@Tokamak: da müsste ich davor noch die Position im Datenstrom herausfiltern
@violine21: da werden dann auch alle Werte von -32,1 °C, über -9.5 °C, über 2,7 °C, über 18,8 °C bis hin zu 123,4 °C herausgefiltert. OK der letzte Wert muss wahrscheinlich nicht sein, da ich so hohe Temperaturen in der Solaranlage eigentlich nicht möchte - aber man weiß ja nie
Ich hab' ja jetzt wieder was zum Testen, danke nochmal