per HTTPMOD Samsung Druckerstatus abfragen

Begonnen von Jump2016, 13 April 2019, 08:38:21

Vorheriges Thema - Nächstes Thema

Jump2016

Hallo zusammen,

ich habe einen Samsung CLP-680ND Drucker mit Netzwerkanschluss.
Bei diesem würde ich gerne den Verbrauch des Toners in FHEM darstellen.

Nun habe ich das Problem dass die Informationsseite unter der URL http://192.168.x.x/sws/index.html
erst mal eine Startseite anzeigt und ich dort dann auf "Information" (Bild 1) und anschließend auf "Verbrauchsmaterial" (Bild 2)
klicken muss.

Leider ändert sich die URL dann nicht. Es ist also immer noch die http://192.168.x.x/sws/index.html.

Kann mir jemand sagen wie ich da weitermachen muss. Sieht irgendwie nach Javascript aus, dass da im Hintergrund läuft
wenn ich auf z.B. Information klicke.

Vielen Dank.

Gruß

Jonas


SirUli

Hi Jonas,

oft ists nur ein iFrame, also würde ich als allererstes mal die Developer Tools des Browsers (F11) aufmachen und nachsehen wohin die Requests gehen - meist gibt es dafür einen Button der sich "Netzwerk" oder ähnlich nennt. Dann einmal neu laden (F5) und die Requests beim Klick ansehen.

Cheers,
Uli

Jump2016

#2
Hallo zusammen,

habe nun einen json-Datei gefunden die folgenden Inhalt liefert:

{

toner_black: {
opt: 1,
remaining: 51,
cnt: 959,
capa: 2000,
id: "CLT-K506S",
serial: "CRUM-1",
newError: ""
},
toner_cyan: {
opt: 1,
remaining: 4,
cnt: 434,
capa: 1500,
id: "CLT-C506",
serial: "CRUM-14102234859",
newError: "C2-4110"
},
toner_magenta: {
opt: 1,
remaining: 4,
cnt: 434,
capa: 1500,
id: "CLT-M506",
serial: "CRUM-1",
newError: "C2-3110"
},
toner_yellow: {
opt: 1,
remaining: 4,
cnt: 434,
capa: 1500,
id: "CLT-Y506",
serial: "CRUM-1",
newError: "C2-2110"
},

drum_black: {
opt: 0,
remaining: 0,
cnt: 0,
capa: 0,
id: "",
serial: "Unidentified",
newError: ""
},
drum_cyan: {
opt: 0,
remaining: 0,
cnt: 0,
capa: 0,
id: "",
serial: "Unidentified",
newError: ""
},
drum_magenta: {
opt: 0,
remaining: 0,
cnt: 0,
capa: 0,
id: "",
serial: "Unidentified",
newError: ""
},
drum_yellow: {
opt: 0,
remaining: 0,
cnt: 0,
capa: 0,
id: "",
serial: "Unidentified",
newError: ""
},
itb_catridge: {
opt: 1,
remaining: 98,
cnt: 2582,
capa: 100000,
id: "",   
serial: "CRUM-1",
newError: ""
},
consume: {
fuser_kit : 2582,
btr_kit: 2582,
roller_tray1: 2490,
roller_tray2: 0,
roller_tray3: 0,
roller_tray4: 0,
roller_tray5: 0,
roller_bypass: 92,
transfer_belt: 0,

forward_roller_tray1: 2490,
forward_roller_tray2: 0,
forward_roller_tray3: 0,
forward_roller_tray4: 0,
forward_roller_tray5: 0,
forward_roller_mp: 92,

torque_limiter_tray1: 2490,
retard_roller_tray2: 0,
retard_roller_tray3: 0,
retard_roller_tray4: 0,
retard_roller_tray5: 0,
retard_roller_mp: 92,

cleaning_pad: 0,

mp_rubber_pad_life : 0,
adf_roller_life : 0,
adf_rubber_pad_life : 0,
ozone_filter_life_status : 0,
finisher_stapler_cartridge_status : 0,
waste_toner_containier_status : 4


},
consume_opt: {
tray2_opt: 2,
tray3_opt: 0,
tray4_opt: 0,
tray5_opt: 0,
hcf_opt: 0,

fuser_kit_max : 100000,
btr_kit_max: 100000,
roller_tray1_max: 0,
roller_tray2_max: 0,
roller_tray3_max: 0,
roller_tray4_max: 0,
roller_tray5_max: 0,
roller_bypass_max: 0,

forward_roller_tray1_max: 0,
forward_roller_tray2_max: 0,
forward_roller_tray3_max: 0,
forward_roller_tray4_max: 0,
forward_roller_tray5_max: 0,
forward_roller_mp_max: 0,

torque_limiter_tray1_max: 100000,
retard_roller_tray2_max: 0,
retard_roller_tray3_max: 0,
retard_roller_tray4_max: 0,
retard_roller_tray5_max: 0,
retard_roller_mp_max: 0,

cleaning_pad_max: 0,

mp_rubber_pad_life_max : 0,
adf_roller_life_max : 0,
adf_rubber_pad_life_max : 0,
ozone_filter_life_support_option : 0,
finisher_stapler_cartridge_support_option : 0,
waste_toner_containier_support_option : 1
},
GXI_SUPPORT_COLOR: 1,
GXI_INTRAY_MANUALFEEDING_TRAY_SUPPORT: 0,
GXI_DRUM_DEVELOPER_UNIT_LIFE_CNT: 0,
GXI_DRUM_DEVELOPER_LIFE_CNT: 0,
GXI_DRUM_DEVELOPER_UNIT_LIFE_CNT_SUPPORT: 0
}


Wie kann ich nun aus dem Block:

toner_black: {
opt: 1,
remaining: 51,
cnt: 959,
capa: 2000,
id: "CLT-K506S",
serial: "CRUM-1",
newError: ""
},


Readings für

Verbleibend: --> remaining
gedruckt: -->cnt

erstellen?

Mir ist bekannt, dass ich ein userattr z.B. reading01Name und reading01Name reading01Regex erstelle.
In reading01Name steht dann z.B. Verbleibend.

So uns nun häng ich an dem Regex um aus dem oben abgebildeten Code dann für den jeweiligen Toner die Werte abzufragen.
Kann da jemand helfen?

Vielen Dank.

Gruß

Jonas

amenomade

Ist diese JSON String durch eine URL direkt abrufbar? Dann nutze lieber reading01JSON usw, statt reading01Regex.

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Jump2016

Hallo amenomade,

ja der gezeigte Code ist über die Seite http://x.x.x.x/sws/app/information/supplies/supplies.json direkt aufrufbar.

Was meinst du genau mit: "Dann nutze lieber reading01JSON usw?"

accessburn

Hilft das?

defmod Drucker HTTPMOD http://192.168.178.23/sws/app/information/supplies/supplies.json 300
attr Drucker userattr reading01Name reading01RegOpt reading01Regex
attr Drucker alias Tonerstand
attr Drucker enableControlSet 1
attr Drucker group Drucker
attr Drucker icon it_printer
attr Drucker reading01Name Tonerstatus
attr Drucker reading01RegOpt g
attr Drucker reading01Regex (?s)remaining: ([\d\.]+),
attr Drucker room Büro
attr Drucker stateFormat Schwarz Tonerstatus-1% | Cyan Tonerstatus-2%<br>Magenta Tonerstatus-3% | Gelb Tonerstatus-4%

setstate Drucker Schwarz 97% | Cyan 38%<br>Magenta 38% | Gelb 14%
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-1 97
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-2 38
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-3 38
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-4 14
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-5 100
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-6 100
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-7 100
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-8 100
setstate Drucker 2019-05-02 08:46:41 Tonerstatus-9 100

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

#6
Zitat von: Jump2016 am 28 Mai 2019, 17:53:24
Hallo amenomade,

ja der gezeigte Code ist über die Seite http://x.x.x.x/sws/app/information/supplies/supplies.json direkt aufrufbar.

Was meinst du genau mit: "Dann nutze lieber reading01JSON usw?"
reading01Name VerbleibendSchwarz
reading01JSON toner_black_remaining
reading02Name GedrucktSchwarz
reading02JSON toner_black_cnt

Siehe https://wiki.fhem.de/wiki/HTTPMOD#Parsing_JSON
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Jump2016

@accessburn:
Danke, ja das hat geholfen und funktioniert auch :-)

@amenomade:
nun würd ich gern deinen Ansatz noch verstehen...

habe nun attr mod_drucker_test reading02JSON toner_black_cnt
attr mod_drucker_test reading02Name GedrucktSchwarz


definiert.
Im Log kommt dann die Meldung:

2019.05.28 18:36:04 3 : mod_drucker_test: error while parsing JSON data: '"' expected, at character offset 7 (before "toner_black: {\r\n\t...") at (eval 26076) line 1.
2019.05.28 18:36:04 3 : mod_drucker_test: Read response to update didn't match any Reading

amenomade

Die Fehlermeldung kommt wahrscheinlich daraus, dass es keine richtig-formatierte JSON-String ist.

Für die Erklärung, einfach auf dem Link klicken, den ich schon zur Verfügung gestellt habe. HTTPMOD ist in der Lage direkt JSON zu interpretieren

{a: {b:"val"}} wird man einfach a_b in readingxxJSON schreiben.
Aber natürlich nur wenn richtiges JSON... Da es anscheinend nicht der Fall ist, dann bleibt nur Regex
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#9
Probier mal mit attr <device> extractAllJSON 1, ob er etwas schafft.
EDIT: nein, tatsächlich ist es kein richtiges Json.
Wenn es so aussehen würde:

{"toner_black": {"opt": 1,
"remaining": 51,
"cnt": 959,
"capa": 2000,
"id": "CLT-K506S",
"serial": "CRUM-1",
"newError": ""
....
}}

dann würde er das schaffen.
READINGS:
     2019-05-28 19:42:13   toner_black_capa 2000
     2019-05-28 19:42:13   toner_black_cnt 959
     2019-05-28 19:42:13   toner_black_id  CLT-K506S
     2019-05-28 19:42:13   toner_black_newError
     2019-05-28 19:42:13   toner_black_opt 1
     2019-05-28 19:42:13   toner_black_remaining 51
     2019-05-28 19:42:13   toner_black_serial CRUM-1


Dir bleibt nur Regex
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Jump2016

Vielen Dank für Eure Untestützung.

Habe es mit dem Ansatz von accessburn nun umgesetzt.

Zusätzlich erfasse ich noch die Anzahl gedruckter Seiten und fasse das ganze in einer ReadingGroup zusammen.

Code für httpmod (Abfrage Drucker):

defmod mod_drucker HTTPMOD http://x.x.x.x/sws/app/information/supplies/supplies.json 240
attr mod_drucker userattr reading01Name reading01RegOpt reading01Regex reading02Name reading02RegOpt reading02Regex
attr mod_drucker alias Druckerstatus
attr mod_drucker devStateIcon on:it_printer off:it_printer@red
attr mod_drucker disable 1
attr mod_drucker enableControlSet 1
attr mod_drucker event-on-change-reading Tonerstatus-1,Tonerstatus-2,Tonerstatus-3,Tonerstatus-4,Tonerstatus-5,Tonerstatus-6,Tonerstatus-7,Tonerstatus-8,Tonerstatus-9,gedruckt-1,gedruckt-2,gedruckt-3,gedruckt-4,gedruckt-5,gedruckt-6,gedruckt-7,gedruckt-8,gedruckt-9
attr mod_drucker group Büro
attr mod_drucker reading01Name Tonerstatus
attr mod_drucker reading01RegOpt g
attr mod_drucker reading01Regex (?s)remaining: ([\d\.]+),
attr mod_drucker reading02Name gedruckt
attr mod_drucker reading02RegOpt g
attr mod_drucker reading02Regex (?s)cnt: ([\d\.]+)


setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-1 45
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-2 2
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-3 2
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-4 2
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-5 0
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-6 0
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-7 0
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-8 0
setstate mod_drucker 2019-06-09 12:41:50 Tonerstatus-9 98
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-1 1042
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-2 435
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-3 435
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-4 435
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-5 0
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-6 0
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-7 0
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-8 0
setstate mod_drucker 2019-06-09 12:41:50 gedruckt-9 2665


Code für das Reading:

defmod rg_drucker_verbrauch readingsGroup <Farbe>,<Ausdrucke>,<verbleibend>\
mod_drucker:<Schwarz>,gedruckt-1,Tonerstatus-1\
mod_drucker:<cyan>,gedruckt-2,Tonerstatus-2\
mod_drucker:<magenta>,gedruckt-3,Tonerstatus-3\
mod_drucker:<yellow>,gedruckt-4,Tonerstatus-4\
mod_drucker:<Ü-Einheit>,gedruckt-9,Tonerstatus-9
attr rg_drucker_verbrauch alias Druckerübersicht
attr rg_drucker_verbrauch group Büro
attr rg_drucker_verbrauch nonames 1
attr rg_drucker_verbrauch notime 1
attr rg_drucker_verbrauch room Jonas
attr rg_drucker_verbrauch valueFormat { 'Tonerstatus-1' => '%1.f %%', 'Tonerstatus-2' => '%1.f %%', 'Tonerstatus-3' => '%1.f %%', \
'Tonerstatus-4' => '%1.f %%', 'Tonerstatus-9' => '%1.f %%', 'gedruckt-9' => '%02d' }
attr rg_drucker_verbrauch valueStyle style="text-align:right"


Ü-Einheit ist hier die Abkürzung für Übertragungseinheit die bei dem Drucker eine "Lebensdauer" von ca. 100.000 Seiten hat.

Jump2016

@amenomade und accessburn
wie habt Ihr es umgesetzt, dass wenn der Drucker nicht eingeschaltet ist im Logfile bei jeder Abfrage:

2019.06.09 13:09:52 3: mod_drucker: Read callback: Error: connect to http://x.x.x.x:80 timed out

erscheint?

amenomade

Verbose < 3

Allerdings stört es mich nicht, solange sowas nicht in den Readings kommt.

Wenn Du unbedingt verbose 3 oder grösser haben möchtest, und wenn dann diese Meldungen dich doch stören, setze das Interval auf 0, und mach explizit ein get wenn der Drucker anpingbar ist (Modul ping, und DOIF oder notify oder at, k.A.)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DasQ

#13
Bei mein Samsung ist das ausschalten teuere als wenn der rund um die Uhr im Standby hängt.
Durch das ein und ausschalten verschleißen Toner und Bildtrommel der Art viel mehr als, wenn die Gurke durchläuft. Rechne ich dann nach, ist der Strom billiger als halbvolle tonnerkartuschen wegwerfen. Is beides für die Ökobilanz ein Armutszeugnis, aber irgendein tot muss man sterben.


Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org