FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: accessburn am 03 Februar 2018, 15:59:23

Titel: [gelöst] Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 03 Februar 2018, 15:59:23
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
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 03 Februar 2018, 22:58:20
Okay, ich frag mal anders. Wie wähle ich aus welche Antwort ich nehme wenn das regex mehrere Matches hat?
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: amenomade am 04 Februar 2018, 20:23:39
Warum nicht direkt mit reading1JSON?
Ansonsten etwas wie:
toner_black.*?remaining: ([\d\.]+)
toner_cyan.*?remaining: ([\d\.]+)
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 04 Februar 2018, 20:53:11
Ich hab es versucht. Bekam json aber nicht zum laufen.
Ich setzte extractAllJSON auf 1, aber es wurden keine Readings angelegt.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 04 Februar 2018, 22:09:24
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.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 05 Februar 2018, 10:36:26
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  :-[
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: frank am 05 Februar 2018, 13:16:35
für solche modifier gibt es die attribute ....RegOpt
um weiter als zeilenende zu kommen, sollte eigentlich (?s) am anfang einer regex funktionieren.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 05 Februar 2018, 13:37:28
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
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: frank am 05 Februar 2018, 13:41:37
testreading hat doch gerade 25 gemeldet.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 05 Februar 2018, 13:53:50
Richtig, das funktioniert weil es das erste Match ist, die weiteren liegen bei 50 und 70, davon keine Spur.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: frank am 05 Februar 2018, 13:59:36
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.
Titel: Antw:Regex bei Druckstatus auslesen per json
Beitrag von: accessburn am 05 Februar 2018, 14:07:48
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!