[erledigt] brother netzwerk laser per httpmod abfragen

Begonnen von the ratman, 16 Februar 2019, 14:35:49

Vorheriges Thema - Nächstes Thema

the ratman

hiho,

wer mich kennt, weiß ja schon, daß regex und ich absolute totfeinde sind.
darum wie immer in solch ausweglosen situationen, meine bitte um schützenhilfe.

worum gehts? ich würd auch gern ein paar infos zu meinen druckern in fhem abbilden.
dazu mal ein brother drucker im lan und natürlich mein versagen, bei der ersten regex.

interessant für mich z.b. folgender teil aus der website meines druckers: <dt>Toner&nbsp;Cyan (C)**</dt><dd>(30.00%)</dd>
was ich will? eh klar - die 30.00%
→do↑p!dnʇs↓shit←

rudolfkoenig

Das ist je nach Modul unterschiedlich. Da Du nichts spezifiziert hast, habe ich freie Hand :).
Folgendes fischt aus einem String eine Zahl gefolgt von einem % raus.

Zitatfhem> { my $s = '<dt>Toner&nbsp;;Cyan (C)**</dt><dd>(30.00%)</dd>';; $s =~ m/([\d.]+%)/;; $1 }
30.00%

the ratman

hehe, du bist gemein.

httmod ist gefragt - was müsste ich da in z.b. ein reading01Regex reinwerfen
da ich sowieso auch von httpmod 0 bis -1 ahnung hab, am besten gleich mein schrägen gedankengänge dazu:

ich erstell mir eine httmpod mit der def: http://192.168.178.6/general/information.html?kind=item 300 (das wäre dann die website meines drucker, auf der so ziemlich alle statistiken stehen)
somit bau ich mir 2 attr für z.b. den füllstand der farbe cyan
reading01Name   cyanProzent
reading01Regex   <dt>Toner&nbsp;;Cyan (C)**</dt><dd>(m/([\d.]+%)/)</dd> <-- jetzt mal frei schnautze nach deinem perl (sicher falsch, denk ich)

so, jetzt darfst kurz über meine komischen gedankengänge lachen und mich dann bitte verbessern *g*
→do↑p!dnʇs↓shit←

rudolfkoenig

HTTPMOD kenne ich nicht, und dein Regexp schaut in der Tat komisch aus. Ich wuerde sowas wie:
Zitat
reading01Name   cyanProzent
reading01Regex   Cyan.*?([\d.]+%)
versuchen.

Maista

Httpmod kann jetzt auch Templates.
Da gibt's auch was zu HP und Epson Drucker.

Gruß Gerd

the ratman

#5
ah, jetzt hab ichs! ganz neue erkenntnis: lesen und gucken bildet tatsächlich *g* fehlen mir also nur mehr die regex ...

nehm ich z.b. das template für den hp drucker, schaut die ja z.b. so aus für cyan:
Ink_Y.*?='([\d]+)'
jetzt müsste man mir natürlich unter die arme greifen - eh schon wissen: regex und ich - und folgendes regexen:
<dt>Toner&nbsp;Cyan (C)**</dt><dd>(30.00%)</dd>
das müsste dann ja so in etwa gehen: Cyan.*?=[\d]+ oder irgendwie so? weiß jetzt ja nicht, ob ich die '' brauch oder ob die () bei der regex nötig sind.


nebenbei ne dumme frage - und gleich voraus: ich such keine dieser regextest-seiten oder 100-seiten abhandlungen, die ich eh ned versteh.
--> gibt es irgendwo im netz etwas, dass mir vermitteln kann, welche logik hinter regex steht - ich denke, wenn ich einmal ansatzweise die logik dahinter kapieren würde, dann hättets ihr sogar chancen, ruhe vor mir in dem bereich zu kriegen *g*.
→do↑p!dnʇs↓shit←

DeeSPe

Ich habe Regex mal damit gelernt und fand es nicht sonderlich schwer.
https://regexone.com/

Vorher stand ich auch mit Regex auf Kriegsfuß, seit dem ich es verstanden habe liebe ich es.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

the ratman

thx - mal am we reinlesen

ich würds ja auch gern super finden - seh ja, was man damit so alles vereinfachen kann oder was überhaupt erst möglich wird.
bis jetzt halt ist jeder erklärungsversuch an mich in die falsche richtung gegangen - die verwirrung wurd immer größer und ich somit immer frustrierter *g*
→do↑p!dnʇs↓shit←

the ratman

hmm, die seite ist ja mal als einsteiger für dummes nicht - bei mir wirfts allerdings dann mehr fragen auf, als es antworten gibt.

ich suche ja nach einem begriff im text "Cyan" und will dann die nächsten 2 bis 3 zahlen haben, die er findet. alles dazwischen kann ich ja mit .* abdecken, denk ich mal.
-> dann leg ich mit ?= fest, dass er folgendes als variable nehmen soll. gehören dann irgendwelche '' oder klammern um die variable rum?
-> als quasi anfang fürs zahlen suchen kommt denn wohl die ( von (30% gut hin. brauch ich dann wieder klammern oder '' für die klammer?
-> die zahl selber such ich mir dann wie zusammen? kann ja auch aus 3 zahlen bestehen \d\d\d ? was is dann, wenns nur 2 zahlen gibt? nehm ich \d\d\. ? aber dann hätt ich bei 2 zahlen ja wieder das % drinnen stehen.
→do↑p!dnʇs↓shit←

DeeSPe

Zitat von: the ratman am 19 Februar 2019, 11:39:16
hmm, die seite ist ja mal als einsteiger für dummes nicht - bei mir wirfts allerdings dann mehr fragen auf, als es antworten gibt.

ich suche ja nach einem begriff im text "Cyan" und will dann die nächsten 2 bis 3 zahlen haben, die er findet. alles dazwischen kann ich ja mit .* abdecken, denk ich mal.
-> dann leg ich mit ?= fest, dass er folgendes als variable nehmen soll. gehören dann irgendwelche '' oder klammern um die variable rum?
-> als quasi anfang fürs zahlen suchen kommt denn wohl die ( von (30% gut hin. brauch ich dann wieder klammern oder '' für die klammer?
-> die zahl selber such ich mir dann wie zusammen? kann ja auch aus 3 zahlen bestehen \d\d\d ? was is dann, wenns nur 2 zahlen gibt? nehm ich \d\d\. ? aber dann hätt ich bei 2 zahlen ja wieder das % drinnen stehen.

1. Wofür brauchst Du variablen Inhalt (?) bei der Aufgabenstellung?
2. Ja, Du kannst ( für den Anfang nehmen, diese kannst Du mit \ escapen.
3. Du kannst in geschweiften Klammern die Wiederholungen angeben, also z.B. von 1 bis 3 Zahlen \d{1,3}

Lösungvorschlag für Cyan:
Cyan.*\((\d{1,3}\.\d{1,2}%)\)
wenn das % Zeichen Teil des Ergebnisses sein soll, oder ohne % Zeichen:
Cyan.*\((\d{1,3}\.\d{1,2})%\)

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

the ratman

vielen vielen dank !!! funzt mal perfekt ...
was mich mehr freut, dass ich langsam so ein winizig kleines licht am ende seh. das ist die erste regex mit mehr als .* die ich zumindest ansatzweise versteh und auch nachvollziehen kann.
aber da ist halt noch viel, was mir fehlt *g*

o.k. - erstes, was mich verwirrt hatte "=". schon klar, dass war nur in der suche des original-templates mit drinnen. blöd bin ...

mal aufteilen ...
Cyan.*\(           \) ... danach such ich - klar

(\d{1,3}\.\d{1,2})%\  alles in der klammer will ich haben. stimmts? - aber dann steh ich schon wieder an.
d{1,3} müsste dann wohl ich will die nächsten 1 bis 3 zahlen heißen, oder?
\. d{1,2} ... ja, und schon weiß ich gar nix mehr.
→do↑p!dnʇs↓shit←

DeeSPe

Zitat von: the ratman am 19 Februar 2019, 15:21:15
vielen vielen dank !!! funzt mal perfekt ...
was mich mehr freut, dass ich langsam so ein winizig kleines licht am ende seh. das ist die erste regex mit mehr als .* die ich zumindest ansatzweise versteh und auch nachvollziehen kann.
aber da ist halt noch viel, was mir fehlt *g*

o.k. - erstes, was mich verwirrt hatte "=". schon klar, dass war nur in der suche des original-templates mit drinnen. blöd bin ...

mal aufteilen ...
Cyan.*\(           \) ... danach such ich - klar

(\d{1,3}\.\d{1,2})%\  alles in der klammer will ich haben. stimmts? - aber dann steh ich schon wieder an.
d{1,3} müsste dann wohl ich will die nächsten 1 bis 3 zahlen heißen, oder?
\. d{1,2} ... ja, und schon weiß ich gar nix mehr.

\d{1,3} - es müssen 1-3 Zahlen folgen (mindestens eine Zahl, maximal drei Zahlen)
\.\d{1,2} - es müssen ein Punkt und dann 1-2 Zahlen folgen (mindestens eine Zahl, maximal zwei Zahlen)

Schön wenn es langsam etwas "heller" wird bei Dir.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

the ratman

#12
ahhh, schurke - das wäre also ne blöde frage gewesen, aber da stimmt wohl no ned alles. darf ich dich weiter nerven?

der quelltext wäre (der lesbarkeit halber in mehreren zeilen):<dt>Toner&nbsp;Cyan (C)**</dt><dd>(30.00%)</dd>
<dt>Toner&nbsp;Magenta (M)**</dt><dd>(30.00%)</dd>
<dt>Toner&nbsp;Gelb (Y)**</dt><dd>(30.00%)</dd>
<dt>Toner&nbsp;Schwarz (BK)**</dt><dd>(10.00%)</dd>

ich krieg aber mit reading01Name  Cyan
reading01Regex Cyan.*\((\d{1,3}\.\d{1,2})%\)
reading02Name Magenta
reading02Regex Magenta.*\((\d{1,3}\.\d{1,2})%\)
reading03Name Gelb
reading03Regex Gelb.*\((\d{1,3}\.\d{1,2})%\)
reading04Name Schwarz
reading04Regex Schwarz.*\((\d{1,3}\.\d{1,2})%\)

als ergebnis nur Cyan 10.00 2019-02-19 15:27:45
Magenta 10.00 2019-02-19 15:27:45
also falsche zahlen, gelb und schwarz kommt gar nicht ...


o.k. - mal selber was gefunten:
der suchstring reicht ned - der findet auch blödsinn.
somit erhöhe ich um "Toner&nbsp;" also z.b. "Toner&nbsp;Cyan" und geh mal fest von aus, dass &nbsp; sicher wieder ein problem wird.
ginge da auch Toner.*Cyan?

und ja - kommt der eventuell mit \( durcheinander, weil die ja vorher auch schon kommt mit z.b. (C)?
→do↑p!dnʇs↓shit←

DeeSPe

#13
Probiere es mal bitte mit den genauen Such-Strings (also ohne ".*" dazwischen):
Cyan\s\(C\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
Magenta\s\(M\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
Gelb\s\(Y\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
Schwarz\s\(BK\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)


Sollte auch gehen:
Cyan...............\((\d{1,3}\.\d{1,2})%\)
Magenta...............\((\d{1,3}\.\d{1,2})%\)
Gelb...............\((\d{1,3}\.\d{1,2})%\)
Schwarz................\((\d{1,3}\.\d{1,2})%\)


Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

the ratman

vielleicht hät ich mir was einfacheres für meine ersten versuche suchen sollen *g*

der vollständigkeit halber mal ein aktuelles list - nicht, dass ich schon bei generellen einstellungen blödsinn gmacht hab:Internals:
   BUSY       0
   CHANGED   
   DEF        http://192.168.178.6/general/information.html 60
   FUUID      5c6a7ba7-f33f-0f9e-cfd0-7e63bbd2761e4026
   Interval   60
   LASTSEND   1550587785.09522
   MainURL    http://192.168.178.6/general/information.html
   ModuleVersion 3.5.8 - 12.1.2019
   NAME       httpmod_augenlaser
   NOTIFYDEV  global
   NR         267
   NTFY_ORDER 50-httpmod_augenlaser
   STATE      C: 10.00% M: 10.00% G: Gelb% S: Schwarz%
   TRIGGERTIME 1550587845.09379
   TRIGGERTIME_FMT 2019-02-19 15:50:45
   TYPE       HTTPMOD
   addr       http://192.168.178.6:80
   auth       0
   buf       
   code       200
   compress   1
   conn       
   data       
   displayurl http://192.168.178.6/general/information.html
   header     
   host       192.168.178.6
   httpheader HTTP/1.1 200 OK
Cache-Control: no-cache
X-Frame-Options: DENY
Content-Length: 9695
Content-Type: text/html
Content-Language: en-gb
Connection: close
Server: debut/1.30
Pragma: no-cache
   httpversion 1.1
   hu_blocking 0
   hu_filecount 79
   hu_port    80
   hu_portSfx
   ignoreredirects 0
   loglevel   4
   path       /general/information.html
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.6/general/information.html
   value      0
   QUEUE:
   READINGS:
     2019-02-19 15:47:45   Cyan            10.00
     2019-02-19 15:48:45   Magenta         10.00
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.178.6/general/information.html
     value      0
   defptr:
     readingBase:
       Cyan       reading
       Magenta    reading
     readingNum:
       Cyan       01
       Magenta    02
     readingOutdated:
     requestReadings:
       update:
         Cyan       reading 01
         Magenta    reading 02
   sslargs:
Attributes:
   alias      augenlaser infos
   group      updates
   httpVersion 1.1
   icon       it_printer
   model      B_01a_hp_printer_cartridge_status
   reading01Name Cyan
   reading01Regex Cyan\s\(C\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
   reading02Name Magenta
   reading02Regex Magenta\s\(M\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
   reading03Name Gelb
   reading03Regex Gelb\s\(Y\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
   reading04Name Schwarz
   reading04Regex Schwarz\s\(BK\)\*\*</dt><dd>\((\d{1,3}\.\d{1,2})%\)
   room       computer
   stateFormat C: Cyan% M: Magenta% G: Gelb% S: Schwarz%
   userattr   reading01Name reading01Regex reading01XPath-Strict reading02Name reading02Regex reading02XPath-Strict reading03Name reading03Regex reading03XPath-Strict reading04Name reading04Regex reading04XPath-Strict

der will uns ärgern, scheinbar ... braucht man vielleicht fürs html-zeugs < und /> jeweils noch \ davor?
→do↑p!dnʇs↓shit←