hilfe für httpmod gesucht

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

Vorheriges Thema - Nächstes Thema

the ratman

(zur vereinfachung erstes posting gelöscht)

worum geht's?
ich hatte einen alten 3d-drucker, den ich per http-mod in die hausautomatisation bringen konnte. der neue kann das wohl auch, ich habe (dank fremder hilfe) auch schon den curl-aufruf funktionierend bereit, aber bei httpmod versag ich wieder mal total ...


PS C:\Users\xxx> curl.exe --http0.9 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
CMD M105 Received.
T0:21.8/0.0 T1:0.0/0.0 B:21.9/0.0
ok

jetzt fehlt eigentlich nur noch eine info, wie ich das in httpmod einzupflegen hätte?

derzeit schaut das modul so aus, und leider tut sich gar nix:
define adv5mpro HTTPMOD http://192.168.178.9:8899/command 5
attr adv5mpro alias die fabrik - daten
attr adv5mpro disable 0
attr adv5mpro group 3d druck
attr adv5mpro httpVersion 0.9
attr adv5mpro icon 3d_printer
attr adv5mpro requestData ~M105
attr adv5mpro room computer
attr adv5mpro stateFormat status

setstate adv5mpro status

hilfe sehr erbeten!
→do↑p!dnʇs↓shit←

the ratman

ich hab's jetzt auch noch mal mit 'nem userattr probiert

requestHeader     Content-Type: application/x-www-form-urlencoded
bringt leider auch nichts. was mach' ich nur falsch?
→do↑p!dnʇs↓shit←

Aurel_B

Was kommt denn überhaupt zurück auf deine Anfrage (attr adv5mpro showBody 1)?

the ratman

#3
sollte das bei den internals dann stehen?
weil da hab ich mit "showBody 1" dann ein neues und leeres feld "httpbody"


ich hab jetzt zur sicherheit nochmal direkt vom debian linux, auf dem fhem rennt abgefragt:
ratman@ratOhaus:~$ curl --http0.9 --location --request POST 'http://192.168.178.9:8899/command' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
CMD M105 Received.
T0:58.4/0.0 T1:0.0/0.0 B:50.5/0.0
ok
→do↑p!dnʇs↓shit←

Aurel_B

#4
Hmmm, und was passiert bei "attr showError 1"? Ein leeres Internal "httpbody" zeigt schonmal, das keine - verwertbare - Antwort vom Server kommt. Die Fehlermeldung sollte dann im Reading "LAST_ERROR" stehen.

Edit: bin deine Def durchgegangen, so auf die Schnelle sieht sie deckungsgleich mit deiner curl Definition aus...

the ratman

#5
jetzt wirds gespenstisch *g*

LAST_ERROR
   
read from http://192.168.178.9:8899 timed out
   
2024-03-10 20:28:53

ganz dumme frage - also bitte nicht lachen: müsste nicht, wenn ich
{curl --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'} in die befehlszeile von fhem eingebe, das ganze auch gehen?
da kommt nämlich:
Unknown command {curl, try help.
Unknown command --header, try help.

gut, nächster versuch - ein doif


([$SELF:an] eq "ja")

( "curl --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'" )
( setreading $SELF an nein )

DOELSE

fehler im eventmonitor:
2024-03-10 21:00:49 DOIF doif_ffadv5mpro cmd_event: doif_ffadv5mpro
2024-03-10 21:00:49 DOIF doif_ffadv5mpro error:  "curl --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'" : Unknown command "curl, try help. Unknown command --header, try help.
→do↑p!dnʇs↓shit←

betateilchen

#6
Zitat von: the ratman am 06 März 2024, 09:57:07derzeit schaut das modul so aus,

  • Ist das kein modul, sondern ein device.
  • Verstehe ich nicht, warum Du eine "5" schickst, wenn der Befehl doch "~105" heißt? sorry - Denkfehler von mir
  • Für mich passt http 0.9 und ein POST request nicht zusammen, weil 0.9 keine POST requests kennt und auch keine http Header unterstützt. HTTP 0.9 ist Stand von 1991 - ich glaube nicht, dass ein 3D-Drucker im Jahr 2024 wirklich damit arbeitet.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

#7
ich weiß es nicht - aber ohne http 0.9 geht nirgends irgendwas. mit 0.9 kommt zumindest in der powershell und im telnet von linux was zurück ... sogar das richtige *g*
falls du da ideen hast ... ich probier alles, was meinen neuen drucker nicht sprengt.

und ja, flashforge kann damit arbeiten.
als anderes beispiel, was die können ... hier mal der streamserver für die webcam:

MJPG-Streamer Demo Pages
a resource-friendly streaming application

Control
Version info:

v0.1 (Okt 22, 2007)
du musst rechnen: der drucker ist jetzt schon ein paar wochen auf n markt ... *totlach*


aber es geht auf jeden fall - das sind die 4 m-befehle mit antworten, die mir bisher bekannt sind:

PS C:\Users\xxx> curl.exe --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
CMD M105 Received.
T0:78.7/0.0 T1:0.0/0.0 B:73.1/80.0
ok

PS C:\Users\xxx> curl.exe --http0.9 --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M601 S1'
CMD M601 Received.
Control Success V2.1.
ok

PS C:\Users\xxx> curl.exe --http0.9 --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

PS C:\Users\xxx> curl.exe --http0.9 --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

curl hat ein viel längeres Timeout, wie lange dauert es denn (geschätzt), bis in etwa die Antwort von deinem Drucker zurückkommt? Eventuell den timeout Parameter von httpmod hochsetzen? Und "{curl etc etc.}" wird so nicht funktionieren, wenn du curl direkt aus FHEM aufrufen möchtest, so kannst du z.B. "{system("curl ....")}" verwenden. Würde ich nicht -> FHEM blockiert dann!

Aurel_B

#9
Ah und vielleicht klappt es mit --http-version0.9 deshalb weil gemäss Manpage von curl damit die Header optional sind (und dein Drucker keine Header sendet) (siehe https://everything.curl.dev/http/versions/http09)?

Was wird denn so an Header rumgesandt? Was sagt ein "curl" mit "-v" ?

Edit: HTTPMOD verwendet HttpUtils im Hintergrund (wenn ich das richtig verstanden habe), keine Ahnung, ob "HTTP/0.9" unterstützt wird oder ob ein gültiger Header verlangt wird.

the ratman

#10
gefühlt dauert 'ne antwort unter 1 sekunde. mehr als 3 sekunden dauert's aber auf keinen fall.
habs timeout jetzt mal auf 5 sek. gesetzt.

Zitatkannst du z.B. "{system("curl ....")}"
shit, ich wusste, dass das anders ging.
und du hast recht: wenn, dann nonblocking. ich dachte halt: zum testen wirds schon passen.


ZitatAh und vielleicht klappt es mit --http-version0.9 deshalb weil gemäss Manpage von curl damit die Header optional sind (und dein Drucker keine Header sendet) (siehe https://everything.curl.dev/http/versions/http09)?
uije ...
kann ich irgendwie rauskriegen, welche http-version auf dem drucker läuft? hab aber keinen zugang zum drucker, der über curl raus geht.


nachtrag:
timemout mit 5 und 10 probiert, mit httpversion 0.9, 1, 1.1, 2 und 3 - gab jedes mal nen timeout
fehlt also nur mehr: "http2-prior-knowledge" aber darf ich das auch eintragen?
→do↑p!dnʇs↓shit←

betateilchen

Zitat von: Aurel_B am 10 März 2024, 21:51:56Edit: HTTPMOD verwendet HttpUtils im Hintergrund (wenn ich das richtig verstanden habe)

Korrekt.

Zitat von: Aurel_B am 10 März 2024, 21:51:56keine Ahnung, ob "HTTP/0.9" unterstützt wird oder ob ein gültiger Header verlangt wird.

Das wird einfach ungeprüft durchgereicht.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

the ratman

ach, ganz übersehen
mit -v krieg' ich 'ne fehlermeldung von curl, die wohl weniger mit dem drucker zu tun hat, oder?

PS C:\Users\the-r>  curl.exe -v --location --request POST 'http://192.168.178.9:8899/command'; --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode '~M105'
In Zeile:1 Zeichen:79
+ ... cation --request POST 'http://192.168.178.9:8899/command'; --header ' ...
+                                                                  ~
Ausdruck fehlt nach dem unären Operator "--".
In Zeile:1 Zeichen:79
+ ...  --request POST 'http://192.168.178.9:8899/command'; --header 'Conten ...
+                                                            ~~~~~~
Unerwartetes Token "header" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator
→do↑p!dnʇs↓shit←

Aurel_B

#13
Da ist ein ";" zuviel in deinem curl Aufruf....

Und dann das übliche: was passiert in deinem Log bei verbose 5 in deinem httpmod? Meine Interpretation: FHEM resp. httpmod kann deinen Drucker erreichen und bekommt auch eine Antwort, die ist aber nicht so wie httpmod das erwartet und die ganze Geschichte läuft in einen Timeout rein?

the ratman

#14
so, und reden wir mal tacheles:

1) der curl-befehl bringt korrekte antworten, sogar auf dem fhem-debian. es müsste also alles am server vorhanden sein, was benötigt wird, oder?
2) httpmod verweigert mit einem timeout. wo ist also der unterschied zum curl in der console?

3) und im notfall: wie kann ich die daten ohne httpmod in fhem reinkriegen? muss ja kein httmod sein. da gibts ja sicher wieder 1000 weitere wege, von denen ich wieder nix weiß und die ich eh wieder nicht kapieren werde *g*?


ZitatDa ist ein ";" zuviel in deinem curl Aufruf....
o.k. - ich wieder ...

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
so, nu weiß ichs auch gleich: 1.1 is es *g*

* the ratman geht jetzt mal ins bettchen und wünscht 'ne gute nacht.
und vielen dank mal für die hilfe von euch 2!
→do↑p!dnʇs↓shit←

Aurel_B

#15
Ha! Da kommt nix an Headern zurück von deinem Drucker. Ich kenne mich da viel zuwenig aus: könnte es sein, dass HttpUtils sich verschluckt wenn gar nix an Headern zurückkommt?

Was willst du denn am Schluss bewerkstelligen mit deiner Einbindung des Druckers? Wenn du nur selten Daten von ihm abfragen möchtest, so würde ich wohl mit dem blockierenden "system" arbeiten. Falls du regelmässig Daten holst wäre ich eher Richtung Shellscript gegangen welches via crontab läuft und seine Ausgabe in eine Datei umleitet. FHEM wiederum liest diese Datei ein und verarbeitet sie weiter. Oder du schickst die Ausgabe dann via telnet an FHEM etc. etc. Es gibt wirklich 1001 Möglichkeiten.

Edit: was mir gerade eingefallen ist: eventuell könntest du auch ECMD verwenden (ist etwas komplex), dort kannst du ein "Anfrage/Antwort" Schema erstellen. Deine Anfrage würde dann den Headern entsprechen so wie curl sie aussendet und ECMD hat keine Ahnung von HTTP und erwartet daher auch nur die Antwort so, wie du sie gemäss Schema möchtest. Ist wie gesagt etwas komplex...

the ratman

#16
was ich will ...
fehler/probleme beseitigen und statistiken machen.

beispiele aus der praxis:
o) ich bin unterwegs, die temperaturen sind zu hoch, der drucker ist fertig, es gibt 'nen fehler = automatische trennung vom strom mit einer steuerbaren steckdose.
o) unerklärliche temperatur-schwankungen in einem plot erkennen. so erkennt man dann die lügen der hersteller. z.b.: 5 grad weniger möglich, als versprochen. aufheizen funzt zwar, aber dann fällt der gesamte strom aus und der drucker muss 5° hoch heizen. wie das objekt dann ausschaut, kann man sich vorstellen *g*. finde den fehler mal mit "neben stehen"
o) pause, start, stop sollte auch gehen ... angenehme funktionen.
o) verfahren des druckkopfes über x, y oder bett über z. abschaltung, weil das bei 'nem internen fehler dem drucker an sich wurscht ist und der überall im bauraum gegen kracht, wo er kann ...
o) ansagen in der hausautomatisation, dass ein druck beginnt, endet, usw.
o) bauraum entlüftung auf den hepafilter schalten, weils der holden zu sehr stinkt *g* (ich betreib' meine drucker im wohnzimmer)
o) immer noch die hoffnung (derzeit nur theorie), über die webcam losgelöste objekte oder spagetti zu erkennen und entsprechend zu reagieren.

d.h. - im normalfall reichen mir abfragen alle 10 sec. notfalls auch langsamer.
beim fehler suchen ist natürlich "je schneller, desto besser" angesagt.
wie du sicher schon bemerkt hast, bin ich jetzt nicht grade der profi für internes computer-zeugs, schon gar ned unter linux. was natürlich nix anderes heißt: egal was, ich brauch' wahrscheinlich grundlegende hilfe dafür.

ECMD bedeutet lt. wiki "Ethersex Command" aha, fern-sm-beziehungen, oder wie? *g*

übrigens: die dumme idee, mit der ich euch jetzt die zeit stehle, kommt eigentlich von da: https://github.com/kruzhkov/hass-flashforge-adventurer-5
ob man da abschreiben könnte, wenn man von python ahnung hätte?
→do↑p!dnʇs↓shit←

rudolfkoenig

Zitatkönnte es sein, dass HttpUtils sich verschluckt wenn gar nix an Headern zurückkommt?
Ist nicht der Fall, gerade getestet.

Probier mal in der FHEM Eingabezeile Folgendes aus:
{ HttpUtils_BlockingGet({ url=>"http://192.168.178.9:8899/command",data=>"-M105"}) }

the ratman

#18
eingabezeile: { HttpUtils_BlockingGet({ url=>"http://192.168.178.9:8899/command",data=>"-M105"}) }

passt das mit ungefähr 5 sek. block bei dem abruf? zumindest ist der browser ungefähr so lange beschäftigt.
keine weiteren infos, nix im log mit verbose 3
→do↑p!dnʇs↓shit←

rudolfkoenig

Wenn keine Ausgabe kommt, dann stoert sich die Gegenseite an irgendwelchen HTTP Header-Angaben.
Die Ursache ueber eine Forumsdiskussion rauszukriegen ist muehselig.
Ich wuerde mit dem extrernen Aufruf probieren.

Etwas off-topic: warum verwendet man {system(PROGRAMM)} statt "PROGRAMM"?

the ratman

#20
ich dank auf jeden fall für die hilfe!

steh halt jetzt wirklich wieder an, weil ... eh schon wissen *g*
ich schau' auf jeden fall mal, ob ich da nicht ein tool für win finde, mit dem ich die daten dann nach fhem schießen kann.

mag noch einer von euch eventuell noch?
frage1: wie müsste eigentlich so ein script aussehen? am besten natürlich eines, dass mir gleich readings in einen dummy oder so schreibt?
frage2: wie könnte ich das script von fhem aus stoppen und starten? muss ja nicht permanent was ins nirwana abfragen machen, denk' ich mal.
→do↑p!dnʇs↓shit←

betateilchen

Zitat von: the ratman am 11 März 2024, 08:42:46beispiele aus der praxis:
o) ich bin unterwegs, die temperaturen sind zu hoch, der drucker ist fertig, es gibt 'nen fehler = automatische trennung vom strom mit einer steuerbaren steckdose.

Du lässt Deinen 3D-Drucker unbeaufsichtigt arbeiten?
Laß das mal nicht Deine Hausratversicherung hören...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

#1 ich habe in meinem Beispiel - und ~ verwechselt.
Kannst Du es bitte nochmal mit korrigierten Zeichen versuchen?

#2 wenn curl sein soll, und(!) der obige curl.exe Befehl terminiert hat (musste nicht explizit abgebrochen werden), dann wuerde ich eine Funktion in 99_myUtils.pm anlegen:
sub
parsePrinter($$$)
{
  my ($dev, $reading, $cmd) = @_;
  my $d = `curl -s --http0.9 --location 'http://192.168.178.9:8899/command' --data-urlencode '$cmd'`;
  my $t0 = $1 if($d =~ m/T0:(\d+\.\d+)/);
  readingsSingleUpdate($defs{$dev}, $reading, $t0, 1);
  return undef;
}
und ein at definieren:
define printerTemp at +*00:00:10 { parsePrinter("printerTemp", "temp0", "~M105") }

the ratman

#23
*autsch* da zerlegt's fhem

fehler im log find' ich dazu nicht.
er hat nur alle subroutinen redifined, deine wollte er dann nicht mehr machen. da endet das log.
sub rausgelöscht, damit ich wieder hoch komm, at gibts noch disabled

aber die lösung im at die parmameter vorzugeben find' ich genial! jaja, ich weiß, wusste sicher schon jeder dödel im universum, aber ich halt nicht *g*
heißt das, ich könnte mit mehreren at's dann immer diese subroutine bemühen?
→do↑p!dnʇs↓shit←

rudolfkoenig

Zitat*autsch* da zerlegt's fhem
Bemerkenswert.
Ich habe den Text aus dem Forum bei mir wieder reinkopiert, und sehe keine Probleme.

Zitatheißt das, ich könnte mit mehreren at's dann immer diese subroutine bemühen?
Das waer mein Plan gewesen.

the ratman

hatte ganz vergessen, sorry. du wolltest ja
{ HttpUtils_BlockingGet({ url=>"http://192.168.178.9:8899/command",data=>"~M105"}) }
das arbeitet er auch brav, ohne jegliches ergbnis ab. also gleich wie mit "-". und auch da stellts ihn nicht auf.
→do↑p!dnʇs↓shit←

the ratman

ich probiers nochmal - vielleicht hab ich ja 'nen fehler gemacht ...

1) ich trage sub
parsePrinter($$$)
{
  my ($dev, $reading, $cmd) = @_;
  my $d = `curl -s --http0.9 --location 'http://192.168.178.9:8899/command' --data-urlencode '$cmd'`;
  my $t0 = $1 if($d =~ m/T0:(\d+\.\d+)/);
  readingsSingleUpdate($defs{$dev}, $reading, $t0, 1);
  return undef;
}
in myutlis am ende vor dem ";" ein

2) restart von fhem
3) ich aktiviere das at
4) verstorben
→do↑p!dnʇs↓shit←

rudolfkoenig

Zitatin myutlis am ende vor dem ";" ein

Am Ende vor dem 1;
Alle Module enden mit 1;, Doku mit =pod kann folgen.

Zitathatte ganz vergessen, sorry. du wolltest ja
Danke.
Und ich wollte noch wissen, ob curl.exe beendet werden musste.

the ratman

#28
ja, stimmt, hab ich auch richtig gemacht, also "1;" als abschluss der mytuils. irgendwann sollte ich auch mal schreiben, was ich meine ... nochmal sorry!

curl.exe muss nicht beendet werden. https://curl.se/windows/
die powershell hätte auch ein "eigenes" curl (also ohne .exe).
da die leute, die sich scheints besser als ich auskennen, aber immer noch drüber streiten, was den nun das "echtere" curl ist, bleib' ich bei der .exe *g*
→do↑p!dnʇs↓shit←

rudolfkoenig

Zitatcurl.exe muss nicht beendet werden. https://curl.se/windows/
Jein. Wenn die andere Seite die Verbindung nicht zuklappt, und auch per HTTP-Header nicht sagt, wieviele Daten kommen, dann haengt curl erstmal.

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.

the ratman

#45
die 2 regex scheinen zu funzen - genau muss ichs probieren, wenn ich mal einen druck am laufen habe, derzeit sinds 2 mal 0.0 und kein fehler im log *g*

für manche ist es leicht, für andere ... ich weiß nicht, wie oft ich schon mit regex gespielt hab - aber mehr als abschreibübungen krieg' ich scheints nie wirklich hin ...
somit: vielen dank an dich!


zu "noshutdown" ...
war bis jetzt auf 0
bei 1: leider dasselbe, sobald ichs timeout 'runtersetze, gibts wieder "read from http://192.168.178.9:8899 timed out"

(wenn das dein Drucker verkraftet!)
das ist ja die frage. werd' ich wohl morgen mal probieren. setze grade ein test-fhem in meiner wsl2 auf. dann überlebt das wenigstens meine echte hausautomatisation, wenn wieder alles blockiert *g*
→do↑p!dnʇs↓shit←

the ratman

#46
so, die hoffnung steigt *g*
hab sogar die regex richtig für den rest hinbekommen und mir das mal (recht hässlich noch) in eine readingsgroup geschmissen.
das ist also nun die zusammenfassung von 3 httpmod modulen, die mehr oder weniger gleich (weil noch händisch) gestartet sind.

düse: 23.2 von 220.0 °c
bett: 47.1 von 65.0 °c
layer: 0 von 237
name: box_PLA_1h25m.gcode
endstopp: X-max: 110 Y-max: 110 Z-min: 0

die pflicht hab ich also mal erledigt.
bliebe die kür: warum kann ich im win und linux per curl trotz des timeouts abrufen, wie ich lustig bin, aber in fhem nicht?
besser gesagt: wie krieg' ich das in fhem auch hin? <-- für idioten, weil sonst wird das die nächste fragerunde hier *lach*

NACHTRAG:

und natürlich gleich die nächste dumme frage, wie sollt's anders sein? irgendwie such' ich wahrscheinlich falsch, aber zum folgenden find' ich nix bei tante google:
wenn ich mir meine zahl mit (\d+) hole, kriegt ich dann auch eventuelle vorzeichen mit? also nicht nur "000", sondern auch "-000"?
und wenn ich das "-" mit kriege, wie könnte ich dem guten endergebnis auch noch ein "+" verbassen, falls kein "-" da steht?
→do↑p!dnʇs↓shit←