[gelöst] Regex bei Druckstatus auslesen per json

Begonnen von accessburn, 03 Februar 2018, 15:59:23

Vorheriges Thema - Nächstes Thema

accessburn

Hallo,
ich kämpfe mit der Anpassung des neuen Beitrag von haus-automatisierung an meine Bedürfnisse.
Ich möchte den Tonerstatus aus meinem Drucker auslesen, er gibt json zurück und ich flippe beim Regex gleich aus.

Hier die letzte laufende Version, die mir aber (natürlich) nur den ersten Toner im json zurückliefert:

defmod Drucker HTTPMOD http://192.168.178.23/sws/app/information/supplies/supplies.json 600
attr Drucker userattr reading04Name reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex reading4Name reading4Regex
attr Drucker enableControlSet 1
attr Drucker group Drucker
attr Drucker icon it_printer
attr Drucker reading1Name toner_black
attr Drucker reading1Regex remaining: ([\d\.]+),
attr Drucker reading2Name toner_cyan
attr Drucker reading2Regex remaining: ([\d\.]+),
attr Drucker reading3Name toner_magenta
attr Drucker reading3Regex remaining: ([\d\.]+)
attr Drucker reading4Name toner_yellow
attr Drucker reading4Regex remaining: ([\d\.]+)
attr Drucker room Wohnzimmer
attr Drucker stateFormat Schwarz: toner_black%<br>Cyan: toner_cyan%<br>Magenta: toner_magenta%<br>Gelb: toner_yellow%


Das json zum anschauen sieht exakt so aus:


{
toner_black: {
opt: 1,
status: 0,
remaining: 25,
cnt: 456,
capa: 700,
id: "CLT-K406S",
serial: "CRUM-15021658549"
},
toner_cyan: {
opt: 1,
status: 0,
remaining: 54,
cnt: 283,
capa: 500,
id: "CLT-C406S",
serial: "CRUM-15021658717"
},
toner_magenta: {
opt: 1,
status: 0,
remaining: 53,
cnt: 283,
capa: 500,
id: "CLT-M406S",
serial: "CRUM-15021663352"
},
toner_yellow: {
opt: 1,
status: 0,
remaining: 35,
cnt: 284,
capa: 500,
id: "CLT-Y406S",
serial: "CRUM-15021663424"
},
drum_black: {
opt: 0,
status: 1024,
remaining: 100,
id: ""
},
drum_cyan: {
opt: 0,
status: 1024,
remaining: 100,
id: ""
},
drum_magenta: {
opt: 0,
status: 1024,
remaining: 100,
id: ""
},
drum_yellow: {
opt: 0,
status: 1024,
remaining: 100,
id: ""
},
itb_catridge: {
opt: 0,
remaining: 100,
id: "Unidentified"
},
consume: {
fuser_kit : 1285,
transfer_roller: 452,
transfer_belt: 1290,
pick_roller: 452,
adf_roller: 0,
adf_rubber_pad: 0,
white_roller: 0,
retard_roller: 0,
friction_pad: 0,
forward_roller: 0,
feed_roller: 0,
casette_holder_pad: 0,
waste_toner: 452,
imaging_unit: 1290,

roller_tray1: 452,
roller_tray2: 0,
roller_tray3: 0,
roller_tray4: 0,
roller_tray5: 0,
roller_mp: 0
},
consume_opt: {
fuser_kit_max : 20000,
transfer_roller_max: 20000,
transfer_belt_max: 20000,
pick_roller_max: 20000,
adf_roller_max: 0,
adf_rubber_pad_max: 0,
white_roller_max: 0,
retard_roller_max: 0,
friction_pad_max: 0,
forward_roller_max: 0,
feed_roller_max: 0,
casette_holder_pad_max: 0,
waste_toner_max: 0,
imaging_unit_max: 16000,

mp_opt: 0,
tray1_opt: 0,
tray2_opt: 0,
tray3_opt: 0,
tray4_opt: 0,
tray5_opt: 0,
roller_tray1_max: 0,
roller_tray2_max: 0,
roller_tray3_max: 0,
roller_tray4_max: 0,
roller_tray5_max: 0,
roller_mp_max: 0
},
GXI_SUPPORT_COLOR: 1,
k_toner_vaild : 1,
c_toner_vaild : 1,
m_toner_vaild : 1,
y_toner_vaild : 1
}


Die Ausgabe ist immer "25" des schwarzen Toners. Wie erweitere ich das Regex damit ich die vier verschiedenen Toner einzeln auslesen kann?
Grüße,
Toby
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

accessburn

Okay, ich frag mal anders. Wie wähle ich aus welche Antwort ich nehme wenn das regex mehrere Matches hat?
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

amenomade

Warum nicht direkt mit reading1JSON?
Ansonsten etwas wie:
toner_black.*?remaining: ([\d\.]+)
toner_cyan.*?remaining: ([\d\.]+)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

accessburn

Ich hab es versucht. Bekam json aber nicht zum laufen.
Ich setzte extractAllJSON auf 1, aber es wurden keine Readings angelegt.
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

accessburn

Nach hunderten probierereien ist es wohl das "multiline" was stört.

Hab hier ( http://chris.photobooks.com/regex/ ) das regex in verschiedenen Varianten versucht, ich komme aber nicht über das Zeilenende hinaus. Vielleicht hat ja jemand noch eine idee. Es liegt aber offensichtlich am Zeilenumbruch.
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

accessburn

So,
wieder ein Schritt weiter, wenn er mir auch zeigt wie es nicht geht!

Der regex-tester sagt /remaining: ([\d\.]+)/g wenn ich das aber so in reading01Regex eingebe wird gar nichts mehr geparst.
Es liegt wohl an dem /g für Global.

Mir gehen so langsam die eigenen und die ergoogelten Ideen aus  :-[
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

frank

für solche modifier gibt es die attribute ....RegOpt
um weiter als zeilenende zu kommen, sollte eigentlich (?s) am anfang einer regex funktionieren.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

accessburn

Danke für die Hilfe, aber ich hab echt einen Knoten im Hirn von dem Scheiss... Seit 2 Tagen sitze ich daran. Schaut mal drüber, warscheinlich total verwurschtelt mitlerweile!

defmod Drucker_test HTTPMOD http://192.168.178.23/sws/app/information/supplies/supplies.json 300
attr Drucker_test userattr get01RegOpt get01Regex reading01Name reading01Regex
attr Drucker_test enableControlSet 1
attr Drucker_test get01RegOpt g
attr Drucker_test get01Regex (?s)remaining: ([\d\.]+)
attr Drucker_test group Drucker
attr Drucker_test icon it_printer
attr Drucker_test reading01Name Testreading
attr Drucker_test reading01Regex (?s)remaining: ([\d\.]+),
attr Drucker_test room Wohnzimmer
attr Drucker_test showError 1
attr Drucker_test showMatched 1

setstate Drucker_test Farbe  25
setstate Drucker_test 2018-02-03 15:38:16 Farbe 25
setstate Drucker_test 2018-02-05 13:30:12 LAST_ERROR read from http://192.168.178.23:80 timed out
setstate Drucker_test 2018-02-05 13:35:41 LAST_REQUEST update
setstate Drucker_test 2018-02-05 13:35:41 MATCHED_READINGS Testreading
setstate Drucker_test 2018-02-05 13:35:41 Testreading 25
setstate Drucker_test 2018-02-05 13:35:41 UNMATCHED_READINGS
setstate Drucker_test 2018-02-03 15:28:16 toner_black 25
setstate Drucker_test 2018-02-03 15:28:16 toner_cyan 25
setstate Drucker_test 2018-02-03 15:28:16 toner_magenta 25
setstate Drucker_test 2018-02-03 15:28:16 toner_yellow 25
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

frank

#8
testreading hat doch gerade 25 gemeldet.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

accessburn

Richtig, das funktioniert weil es das erste Match ist, die weiteren liegen bei 50 und 70, davon keine Spur.
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

frank

regOpt=g ist für dieses reading nicht gesetzt, nur für get01. bei get fehlt noch ein get01Name.
es reicht auch nur reading oder nur get.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

accessburn

ahhhh... ich hab das RegOpt auf "get" und alle anderen "reading" gehabt.
Das war der entscheidene Hinweis. Jetzt sind wohl alle da!

Zitat2018-02-05 14:04:09   Testreading-1   25
     2018-02-05 14:04:09   Testreading-2   54
     2018-02-05 14:04:09   Testreading-3   53
     2018-02-05 14:04:09   Testreading-4   35
     2018-02-05 14:04:09   Testreading-5   100
     2018-02-05 14:04:09   Testreading-6   100
     2018-02-05 14:04:09   Testreading-7   100
     2018-02-05 14:04:09   Testreading-8   100
     2018-02-05 14:04:09   Testreading-9   100

Mensch was eine schwere Geburt. Regex alleine ist ja schon schwer, aber das (Wissen|Nichtwissen) an FHEM anzupassen der Hammer find ich  ;)

Danke für deine Geduld frank. Anhand von diesem laufenden Beispiel kann ich jetzt weiter machen. Danke dafür!
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole