hilfe für httpmod gesucht

Begonnen von the ratman, 06 März 2024, 09:57:07

Vorheriges Thema - Nächstes Thema

the ratman

#30
wenn dir das hilft - siehe beitrag #3 - ich habe es auch vom debian probiert. curl liefert also eindeutig auch auf linux brauchbares ... rein gefühlt sogar extrem flott.

das ists ja, was mich hier so verwirrt - alles geht von überall, nur fhem nicht. das kenn' ich normal andersrum.
→do↑p!dnʇs↓shit←

Aurel_B

Huiii, da wurde einiges gepostet, darf ich kurz zusammenfassen? curl geht, aus Post #14 wissen wir auch, welche Header curl verwendet und das dein Drucker gar keine Header zurücksendet:

PS C:\Users\xxx> curl.exe -v --http0.9 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 192.168.178.9:8899...
* Connected to 192.168.178.9 (192.168.178.9) port 8899
> POST /command HTTP/1.1
> Host: 192.168.178.9:8899
> User-Agent: curl/8.4.0
> Accept: */*
> Content-Type: application/x-www-form-urlencoded
> Content-Length: 5
>
CMD M105 Received.
T0:23.3/0.0 T1:0.0/0.0 B:22.8/0.0
ok

Wir wissen auch - dank Rudolf - dass die nicht vorhandenen Header für FHEM kein Problem sind. Also interpretiere ich das so: httpmod sendet (noch) nicht alle benötigten Header mit, der Drucker macht auf beleidigt und antwortet gar nicht, httpmod läuft dann in einen Timeout rein. Könnte das so passen? Vielleicht wäre es daher sinnvoll, zuerst in deinem httpmod Verbose auf 5 hochzusetzen und dann zu schauen, was httpmod an Headern an den Drucker sendet und was genau fehl/zuviel/anders ist gegenüber dem curl Aufruf?

the ratman

#32
vielleicht hilfts ja:

per telnet auf dem "fhem-debian" mit -s:
curl -s --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
die daten kommen sehr flott und korrekt. danach locker 15 sek., bis ich wieder ein prompt kriege.

mal ohne -s und ohne --http0.9:
curl --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
genau dasselbe verhalten: daten quasi sofort da, anschließend lange keine prompt
wenigstens braucht man kein protokoll angeben. zumindest bei linux. meine powershell beschwert sich da sofort (curl: (1) Received HTTP/0.9 when not allowed).

kann es an diesen elends langen zeiten hinterher liegen, dass fhem dann spinnt? ist das überhaupt normal? wobei auf win dauert's auch so lange.
ich hatte blöderweise immer nur gewartet, bis die daten kommen, nie aufs prompt geachtet ...
→do↑p!dnʇs↓shit←

Aurel_B

Hmmmm spannend, was passiert denn, wenn du das Timeout bei httpmod mal so richtig raufsetzt? 60s oder so?

rudolfkoenig

FHEM liefert beim Timeout einen Fehler zurueck, auch wenn im Puffer bereits Daten sind.
BlockingGet verwirft die Daten, mit NonblockingGet kann man sie hervorkramen:

fhem> { HttpUtils_NonblockingGet({ url=>"http://localhost:8899/command",keepalive=>1, data=>"-M105", callback=>sub { Log 1, $_[1];; Log 1, $_[0]{buf} } }) }Im FHEM-Log steht dann(*):
Zitat2024.03.12 11:09:15 1: read from http://localhost:8899 timed out
2024.03.12 11:09:15 1: CMD M105 Received.
T0:23.3/0.0 T1:0.0/0.0 B:22.8/0.0
ok
Die Loesung ist dem Drucker ein "Beende die Verbindung" Kommando zu schicken, alles Andere ist ein Hack.

(*): Hab keinen Drucker, der Test ist mit einem selbstgebauten Simulator gemacht.

the ratman

timeout auf 60 sec.

es wird, es wird, es wird!!!! im httpbody steht ein wunderbares:
CMD M105 Received.
T0:20.9/0.0 T1:0.0/0.0 B:21.1/0.0
ok

schaut jetzt so aus:
defmod adv5mpro HTTPMOD http://192.168.178.9:8899/command 5
attr adv5mpro alias die fabrik - daten
attr adv5mpro disable 1
attr adv5mpro group 3d druck
attr adv5mpro httpVersion 1.1
attr adv5mpro icon 3d_printer
attr adv5mpro requestData ~M105
attr adv5mpro room computer
attr adv5mpro showBody 1
attr adv5mpro showError 1
attr adv5mpro stateFormat status
attr adv5mpro timeout 60

unter 60 sek. gibts das übliche timeout
da frag ich mich eigentlich nur mehr: warum und wie könnt man's verkürzen? so ist eine 5 sec. abfrage ja irgendwie sinnlos *g*
→do↑p!dnʇs↓shit←

the ratman

#36
@RudolfKönig
kriegt man das auch in mein httpmodd rein?

dein abruf bringt im log:
2024.03.12 11:27:46 1: logfile wurde gelöscht
2024.03.12 11:29:03 1: read from http://192.168.178.9:8899 timed out
2024.03.12 11:29:03 1:
→do↑p!dnʇs↓shit←

rudolfkoenig

Zitatkriegt man das auch in mein httpmodd rein?
Wenn mit "das" mein "Beende die Verbindung" Vorschlag gemeint ist: klar, man muss nur rauskriegen, ob dein Drucker so einen Befehl hat, und wenn ja, wie der heisst.

Zitatdein abruf bringt im log:
Du hast keinen Simulator auf deinem FHEM-Rechner, sondern einen Drucker sonstwo.
Die IP musst Du anpassen, wenn ich vergessen habe die Programmstuecke "mundgerecht" zu servieren.

the ratman

#38
Zitat von: rudolfkoenig am 12 März 2024, 11:30:54Die IP musst Du anpassen, wenn ich vergessen habe die Programmstuecke "mundgerecht" zu servieren.
habs zum glück gemerkt - natürlich erst nach dem 1. aufruf und dem posten hier. du bist einfach zu schnell beim lesen *g*

was den abbruch-befehl angeht ... ich weiß es nicht.
ich hab nur noch die infos für den alten drucker hier herumliegen: https://docs.google.com/document/d/1Of4ZUU13UWfF1-2vZIfyzsz1yCOvCj9v9FT0aroKhuU/edit
was davon nun wirklich noch funzt. keine ahnung.

hab eben die alten json abfragen aus dem bereich "curl commands" des dokuments probiert. die liefern leider nur leere antworten lt. httpmod.
das wären übrigens die funktionierenden abfragen am alten drucker gewesen.

könnte es so einfach sein?
All commands start with'~', end with '\r\n'The printer receives a commandok, ein ~M105\r\n bringt mal nix neues. weder in fhem, noch in der console.

und weil ichs grade gefunden habe: https://github.com/IgorZyktin/FlashForgeAdventurer5MAPI
der nächste, der's wohl geschafft hat ...
interessant auch: https://github.com/IgorZyktin/FlashForgeAdventurer5MAPI/blob/main/doc/en.md man kann hoffen, dass die stimmen.
→do↑p!dnʇs↓shit←

Aurel_B

Hmmm, ich glaube, der verwendet einen völlig anderen Zugang (siehe https://github.com/IgorZyktin/FlashForgeAdventurer5MAPI/blob/main/adventurer5m/api/transport.py, dort wird Port 8899 verwendet). Ich glaube, dein Drucker hält die HTTP Verbindung offen in der Hoffnung, "da kommen noch weitere Daten". Und beendet erst nach einem Druckerinternen Timeout die Übertragung? Dummerweise wartet httpmod (logischerweise) so lange mit der Verarbeitung. Bei curl passiert das scheinbar nicht da die Ausgabe sofort erfolgt, curl selber hängt ja dann allerdings auch einige Zeit bis der Drucker die Verbindung beendet.

Ich denke, du hast mehrer Möglichkeiten:

  • Entweder, du lebst mit dem Timeout
  • Oder du findest heraus, wie du dem Drucker mitteilen kannst, dass die Übertragung jetzt fertig ist
  • Oder du verwendest doch curl mit einem erzwungenen, kurzen Timeout und verwendest die vorher ausgegeben Daten in FHEM. Doof weil Gebastel und eventuell blockierend... ich würde das vielleicht via Shellscript/Cronjob machen welches die Ausgabe in eine Datei umleitet. FHEM wiederum liest diese Datei regelmässig ein? Auch nicht der Weisheit letzer Schluss.

the ratman

die möglichkeit gäb's noch:
rooten des druckers und https://github.com/xblax/flashforge_adm5_klipper_mod klipper d'rauf werfen.
das wäre aber das letzte, was ich wollen würde. ich mag bei problemen dann nicht wegen garantie/gewährleistung streiten. vor allem, weil ich das riesen ding an klipper gar nicht brauche. der drucker rennt an sich ja wie 'ne 1 und macht seinen job mehr als gut. bin extrem begeistert von dem, was aus dem bauraum kommt *g* und ich war mit dem alten drucker schon verwöhnt ...

oder - ich hoffe, dass jemand aus der fhem community mit mehr wissen den drucker auch kauft. dann kann ich wenigstens sagen, dass wir hier schon mal vorgearbeitet haben. aber da hoff' ich wahrscheinlich umsonst. der typische fhem'ler ist je kein so fauler sack wie ich und eher der bastel-typ. da ist der drucker genau das falsche.

fazit: warten ma mal ab. vielleicht kommt ja mal ein fw-update am drucker und es stellt sich raus, dass ff was falsch gemacht hatte.
vielleicht hat ja einer von euch im traum noch 'ne neue erkenntnis und teilt sie mir mit, wenn nicht, sag' ich auf jeden fall vielen dank für euere bemühungen!
→do↑p!dnʇs↓shit←

the ratman

#41
neuigkeiten von der front:

35 sek. ist das timeout derzeit, darunter gibts 'nen fehler.
deshalb hab ich mal mein httpmod aufgemotzt. das sieht jetzt mal so aus:

define adv5mpro HTTPMOD http://192.168.178.9:8899/command 35
attr adv5mpro alias die fabrik - daten
attr adv5mpro disable 1
attr adv5mpro enableControlSet 1
attr adv5mpro group 3d druck
attr adv5mpro httpVersion 1.1
attr adv5mpro icon 3d_printer
attr adv5mpro reading01Name nozzleIst
attr adv5mpro reading01Regex T0:(\d+\.\d+)
attr adv5mpro reading02Name nozzleSoll
attr adv5mpro reading03Name bedIst
attr adv5mpro reading03Regex B:(\d+\.\d+)
attr adv5mpro reading04Name bedSoll
attr adv5mpro requestData ~M105
attr adv5mpro room computer
attr adv5mpro showBody 1
attr adv5mpro showError 1
attr adv5mpro stateFormat <table>\
<tr>\
<td align="left">düse: </td><td align="left">nozzleIst°C</td><td>&nbsp;;von&nbsp;;</td><td align="left">nozzleSoll°C</td>\
</tr><tr>\
<td align="left">bett: </td><td align="left">bedIst°C</td><td>&nbsp;;von&nbsp;;</td><td align="left">bedSoll°C</td>\
</tr>\
</table>
attr adv5mpro timeout 35
#   BUSY       0
#   DEF        http://192.168.178.9:8899/command 35
#   FUUID      65f56f9b-f33f-3e5d-394c-8444b513e0e01b00
#   Interval   35
#   MainURL    http://192.168.178.9:8899/command
#   ModuleVersion 4.2.0 - 11.8.2023
#   NAME       adv5mpro
#   NOTIFYDEV  global
#   NR         96
#   NTFY_ORDER 50-adv5mpro
#   STATE      <table>
#<tr>
#<td align="left">düse: </td><td align="left">23.9°C</td><td>&nbsp;von&nbsp;</td><td align="left">nozzleSoll°C</td>
#</tr><tr>
#<td align="left">bett: </td><td align="left">23.5°C</td><td>&nbsp;von&nbsp;</td><td align="left">bedSoll°C</td>
#</tr>
#</table>
#   TYPE       HTTPMOD
#   eventCount 39
#   httpbody   CMD M105 Received.
#T0:23.9/0.0 T1:0.0/0.0 B:23.5/0.0
#ok
#
#   value     
#   CompiledRegexes:
#   HttpUtils:
#     NAME      
#     addr       http://192.168.178.9:8899
#     auth       0
#     compress   1
#     conn      
#     data       ~M105
#     displayurl http://192.168.178.9:8899/command
#     header    
#     host       192.168.178.9
#     httpversion 1.1
#     hu_blocking 0
#     hu_filecount 1
#     hu_port    8899
#     hu_portSfx :8899
#     ignoreredirects 1
#     loglevel   4
#     path       /command
#     protocol   http
#     redirects  0
#     timeout    35
#     url        http://192.168.178.9:8899/command
#     sslargs:
#   QUEUE:
#   READINGS:
#     2024-03-16 11:58:53   LAST_ERROR      read from http://192.168.178.9:8899 timed out
#     2024-03-16 12:12:06   bedIst          23.5
#     2024-03-16 12:12:06   nozzleIst       23.9
#   REQUEST:
#     context    reading
#     data       ~M105
#     header    
#     ignoreredirects 0
#     num        unknown
#     retryCount 0
#     type       update
#     url        http://192.168.178.9:8899/command
#   defptr:
#     readingBase:
#       bedIst     reading
#       nozzleIst  reading
#     readingNum:
#       bedIst     03
#       nozzleIst  01
#     readingOutdated:
#     requestReadings:
#       update:
#         bedIst     reading 03
#         nozzleIst  reading 01
#
setstate adv5mpro <table>\
<tr>\
<td align="left">düse: </td><td align="left">23.9°C</td><td>&nbsp;;von&nbsp;;</td><td align="left">nozzleSoll°C</td>\
</tr><tr>\
<td align="left">bett: </td><td align="left">23.5°C</td><td>&nbsp;;von&nbsp;;</td><td align="left">bedSoll°C</td>\
</tr>\
</table>
setstate adv5mpro 2024-03-16 11:58:53 LAST_ERROR read from http://192.168.178.9:8899 timed out
setstate adv5mpro 2024-03-16 12:12:06 bedIst 23.5
setstate adv5mpro 2024-03-16 12:12:06 nozzleIst 23.9


natürlich versag' ich wieder total beim regex - eventuell kann man mir da unter die arme greifen?
wie man sieht, hab ichs wieder erwarten geschafft, die ist-temps aus dem body zu holen. die beiden soll-temps sind mir ein rätsel

und noch eine frage hätte ich:
ich hab' ja mehrere aufrufe. nicht nur den m105. ich muss also wohl noch 1 oder 2 weitere httmod-module erstellen. wie ist das dann normalerweise? muss ich de abrufe in folge machen, oder sollte der drucker die gleichzeitig vertragen?

und ja: falls ich weiteren blödsinn angerichtet hab, bitte um verbesserung ...
→do↑p!dnʇs↓shit←

Aurel_B

Erstmal: Gratulationen ;D, langsam bekommen wir das Ding doch noch zum laufen! Regex ist "einfach" mit
http://www.weitz.de/regex-coach/. Wo stecken denn überhaupt in deiner Antwort vom Drucker die Soll-Werte? Also bei:

CMD M105 Received.
T0:20.9/0.0 T1:0.0/0.0 B:21.1/0.0
ok

is was das Soll?

Und nope, du musst (und solltest) nicht mehrere httpmods definieren, das macht die Sache glaub ich viel unmständlicher. Ich kenne mich da nur theoretisch aus: im Prinzip wandert das "requestData" in einzelne "attr set01Data" Attribute. Also ein

attr adv5mpro set01Name Befehl
attr adv5mpro set01Data $val

sollte schon reichen damit du mit "set adv5mpro Befehl ~M105" deinen M105 Befehl absetzen kannst (alles ungetestet). Kannst du natürlich auch noch eleganter auf viele einzelne setX Befehle verteilen.

the ratman

#43
der erste befehlt funzt ja, ich komm' nur den 2 weiteren regex nicht klar, die ich für die 2 soll-temperaturen aus dem aufruf noch brauche.

t0: ist die temp. der nozzle. der erste wert ist der ist-wert (den hab ich), der nach dem "/" der soll-wert (den brauch' ich noch).
t1: können wir beide werte ignorieren. ist wohl für 'nen anderen drucker mal geschrieben worden.
b:  ist die temperatur des bettes. wieder ist wert eins der ist-wert (den ich auch schon hab') und der wert nach dem "/" der soll-wert (den ich noch bräuchte).

ums genau zu sagen: grün hab ich, rot brauch ich --> T0:20.9/0.0 T1:0.0/0.0 B:21.1/0.0

und zum 2. problem:
ich will dann irgendwann mal eine readingsgroup basteln, in der ich die temperaturwerte aus "~m105" sehen kann, und auch noch aus 2 anderen m-abfragen mehrere werte haben will.
das sind also 3 eigenständige aufrufe zum drucker. und das alles mit diesen blöden timeout, weil ja sonst nix geht.

die 3 abrufe hintereinander wäre nämlich blöd: dann würden ja die temperaturen zeitlich nicht mehr zur z.b. layerhöhe passen, die mir angezeigt wird. als fehlersuch-hilfe also vollkommen unbrauchbar.

die abfragen wären dann folgende (nur der vollständigkeit halber):
curl --http1.1 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M27'
CMD M27 Received.
SD printing byte 1/100 Layer: 3/18
ok

curl --http1.1 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M119\r\n'
CMD M119 Received.
Endstop: X-max: 110 Y-max: 110 Z-min: 0
MachineStatus: BUILDING_FROM_SD
MoveMode: MOVING
Status: S:1 L:0 J:0 F:0 LED: 1
CurrentFile: test_TPU_29m44s.gcode
ok
→do↑p!dnʇs↓shit←

Aurel_B

Also regex ist einfach:

T0:\d+\.\d+/(\d+\.\d+)
resp.

B:\d+\.\d+/(\d+\.\d+)
für die Sollwerte.

Andere Frage: hast du mal mit dem "noShutdown" Paramter experimentiert? Was passiert, wenn du ihn auf 0 setzt? (oder 1, ich glaube, 1 ist Default).

Wenn wir das mit dem Timeout nicht hinbekommen sind 3 separate httpmod Devices für deine 3 Abfragen vermutlich sinnvoller: dann kannst du alle 3 Abfragen gleichzeitig starten (wenn das dein Drucker verkraftet!) und bekommst dann hoffentlich die Werte zeitlich passend zueinander.