FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Esjay am 09 September 2020, 21:22:53

Titel: (Gelöst) JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 21:22:53
Guten Abend zusammen,
ich sitze mal wieder an einem Problem, bei dem ich nicht weiter komme.
Ich würde gerne den im Anhang zu sehenden Request in Fhem umsetzen.

Ich dachte an etwas wie
defmod MyDevice HTTPMOD none 0
attr MyDevice userattr set01Data set01Name set01TextArg:0,1 set01URL setHeader1
attr MyDevice DbLogExclude .*
attr MyDevice set01Data {"set" :{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}}
attr MyDevice set01Name LEDDevice
attr MyDevice set01TextArg 1
attr MyDevice set01URL http://192.168.178.76:8090/json-rpc
attr MyDevice setHeader1 Content-Type: application/json
attr MyDevice showBody 1
attr MyDevice showError 1
attr MyDevice verbose 5


Log
2020.09.09 21:16:53 5:  MyDevice: set called with LEDDevice false
2020.09.09 21:16:53 5:  MyDevice: set found option LEDDevice in attribute set01Name
2020.09.09 21:16:53 4:  MyDevice: set will now set LEDDevice -> false
2020.09.09 21:16:53 5:  MyDevice: AddToQueue adds type set01 to URL http://192.168.178.76:8090/json-rpc, data {"set" :{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}}, header Content-Type: application/json, retry 0, initial queue len: 0
2020.09.09 21:16:53 5:  MyDevice: HandleSendQueue called, qlen = 1
2020.09.09 21:16:53 4:  MyDevice: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.76:8090/json-rpc,
data: {"set" :{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}},
header: Content-Type: application/json
2020.09.09 21:16:53 5:  HttpUtils url=http://192.168.178.76:8090/json-rpc
2020.09.09 21:16:53 4:  IP: 192.168.178.76 -> 192.168.178.76
2020.09.09 21:16:53 5:  HttpUtils request header:
POST /json-rpc HTTP/1.0
Host: 192.168.178.76:8090
User-Agent: fhem
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 94

2020.09.09 21:16:55 3:  MyDevice: Read callback: Error: read from http://192.168.178.76:8090 timed out
2020.09.09 21:16:55 4:  MyDevice: Read callback: request type was set01 retry 0, no headers, no body
2020.09.09 21:16:55 5:  MyDevice: Read callback: body empty
2020.09.09 21:16:55 4:  MyDevice: Read found no charset header (bodyDecode was set to auto)
2020.09.09 21:16:55 5:  MyDevice: GetCookies is looking for Cookies
2020.09.09 21:16:55 5:  MyDevice: ExtractSid called, context set, num 01
2020.09.09 21:16:55 4:  MyDevice: no header to look for redirects
2020.09.09 21:16:55 5:  MyDevice: CheckAuth decided no authentication required


Abgeleitet von hier
https://wiki.fhem.de/wiki/HTTPMOD#Advanced_configuration_to_define_a_set_command_and_send_data_to_a_device

Ursprung des Ganzen ist der Versuch mein Hyperion Ng über fhem zu steuern.
Siehe hier:
https://docs.hyperion-project.org/en/json/#what-is-json

Wäre für jeden Tipp dankbar.

Grüße


Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 09 September 2020, 21:41:18
Hi,

ich habe keine Ahnung davon, aber ich lese Wiki und was Du senden sollst/willst anders:
attr MyDevice set01Data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}

Ein set MyDevice LEDDevice false würde dann $val durch false ersetzen und diesen String senden {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}

Gruß Otto
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 21:51:21
Hallo Otto

ich möchte ja keine "10" sondern ein "true" oder "false" senden. Daher auch das Attribut "set01TextArg"

Hab gerade gesehen das du nochmal editiert hast :-).

Wegen dem set war ich mir auch unsicher, aber ich dachte ich übernehme das aus dem Wiki.

Aber auch mit deinem Aufruf, welchen ich vorher bereits getestet habe, erhalte ich das gleiche in grün im Log.

2020.09.09 21:49:45 1:  Logfile gelöscht
2020.09.09 21:49:55 5:  MyDevice: set called with LEDDevice true
2020.09.09 21:49:55 5:  MyDevice: set found option LEDDevice in attribute set01Name
2020.09.09 21:49:55 4:  MyDevice: set will now set LEDDevice -> true
2020.09.09 21:49:55 5:  MyDevice: AddToQueue adds type set01 to URL http://192.168.178.76:8090/json-rpc, data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}, header Content-Type: application/json, retry 0, initial queue len: 0
2020.09.09 21:49:55 5:  MyDevice: HandleSendQueue called, qlen = 1
2020.09.09 21:49:55 4:  MyDevice: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.76:8090/json-rpc,
data: {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":true}},
header: Content-Type: application/json
2020.09.09 21:49:55 5:  HttpUtils url=http://192.168.178.76:8090/json-rpc
2020.09.09 21:49:55 4:  IP: 192.168.178.76 -> 192.168.178.76
2020.09.09 21:49:55 5:  HttpUtils request header:
POST /json-rpc HTTP/1.0
Host: 192.168.178.76:8090
User-Agent: fhem
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 84

2020.09.09 21:49:57 3:  MyDevice: Read callback: Error: read from http://192.168.178.76:8090 timed out
2020.09.09 21:49:57 4:  MyDevice: Read callback: request type was set01 retry 0, no headers, no body
2020.09.09 21:49:57 5:  MyDevice: Read callback: body empty
2020.09.09 21:49:57 4:  MyDevice: Read found no charset header (bodyDecode was set to auto)
2020.09.09 21:49:57 5:  MyDevice: GetCookies is looking for Cookies
2020.09.09 21:49:57 5:  MyDevice: ExtractSid called, context set, num 01
2020.09.09 21:49:57 4:  MyDevice: no header to look for redirects
2020.09.09 21:49:57 5:  MyDevice: CheckAuth decided no authentication required


Grüße
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 22:30:27
Geht das mit curl auf dem Fhem Rechner?

curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}'  http://192.168.178.76:8090/json-rpc
Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 09 September 2020, 22:40:22
@amenomade da wird doch aber $val nicht aufgelöst!? wegen ' $variable'
entweder so ?
curl --data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}  http://192.168.178.76:8090/json-rpcoder so testen:
curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}'  http://192.168.178.76:8090/json-rpc
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 22:41:10
Zitat von: amenomade am 09 September 2020, 22:30:27
Geht das mit curl auf dem Fhem Rechner?

curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}'  http://192.168.178.76:8090/json-rpc

Nabend:
fhem@FHEM:~$ curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}'  http://192.168.178.76:8090/json-rpc

{
    "command": "",
    "error": "Errors during message parsing, please consult the Hyperion Log.",
    "success": false,
    "tan": 0
}
fhem@FHEM:~$
fhem@FHEM:~$ curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":true}}'  http://192.168.178.76:8090/json-rpc
{
    "command": "componentstate",
    "success": true,
    "tan": 0
}
fhem@FHEM:~$


Bin erst auf das $val hereingefallen, aber wenn ich true nehme bekomme ich eine positive Rückmeldung.

Grüße
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 22:47:47
Zitat von: Otto123 am 09 September 2020, 22:40:22
@amenomade da wird doch aber $val nicht aufgelöst!? wegen ' $variable'
entweder so ?
curl --data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}  http://192.168.178.76:8090/json-rpcoder so testen:
curl --data '{"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}'  http://192.168.178.76:8090/json-rpc

Oops ja sorry wegen $val.
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 22:50:44
Also... seeeeehr ähnlich wie das andere Problem, wo ich auch versuche zu helfen.
https://forum.fhem.de/index.php/topic,45176.msg1083919.html#msg1083919

Ich kann mir im Moment das nicht erklären. Ich habe dort einen Test vorgeschlagen:
ZitatEDIT: eine andere Idee wäre, ein PRESENCE Device zu definieren, nur um zu sehen, ob der Sonoff aus Fhem erreichbar ist:

define sonoffpres PRESENCE lan-ping 192.168.178.93 10

Meldet er "present"?
Also bei dir die IP anpassen

Läuft fhem in einem Container?
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 23:00:11
Hier das Ergebnis :
Internals:
   ADDRESS    192.168.178.76
   CFGFN     
   DEF        lan-ping 192.168.178.76
   FUUID      5f5940e2-f33f-a126-8539-fe366cdb6cb72e29
   INTERVAL_NORMAL 30
   INTERVAL_PRESENT 30
   MODE       lan-ping
   NAME       Hyperiontest
   NOTIFYDEV  global
   NR         54512
   NTFY_ORDER 50-Hyperiontest
   STATE      present
   TYPE       PRESENCE
   READINGS:
     2020-09-09 22:53:54   model           lan-ping
     2020-09-09 22:56:20   presence        present
     2020-09-09 22:56:20   state           present
   helper:
     CURRENT_STATE present
Attributes:
   DbLogExclude .*


Nochmal ein List vom Device
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      5f591f94-f33f-a126-b74b-06ed878acd21a42e
   Interval   0
   LASTSEND   1599680995.05848
   MainURL   
   ModuleVersion 3.5.22 - 7.2.2020
   NAME       MyDevice
   NOTIFYDEV  global
   NR         53979
   NTFY_ORDER 50-MyDevice
   STATE      ???
   TRIGGERTIME 0
   TRIGGERTIME_FMT
   TYPE       HTTPMOD
   addr       http://192.168.178.76:8090
   auth       0
   buf       
   data       {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":true}}
   displayurl http://192.168.178.76:8090/json-rpc
   header     Content-Type: application/json
   host       192.168.178.76
   httpbody   
   httpversion 1.0
   ignoreredirects 1
   loglevel   4
   path       /json-rpc
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.76:8090/json-rpc
   value      true
   QUEUE:
   READINGS:
     2020-09-09 21:49:57   LAST_ERROR      read from http://192.168.178.76:8090 timed out
   REQUEST:
     data       {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}
     header     Content-Type: application/json
     ignoreredirects 0
     retryCount 0
     type       set01
     url        http://192.168.178.76:8090/json-rpc
     value      true
   sslargs:
Attributes:
   DbLogExclude .*
   set01Data  {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}
   set01Name  LEDDevice
   set01TextArg 1
   set01URL   http://192.168.178.76:8090/json-rpc
   set03NoArg 1
   setHeader1 Content-Type: application/json
   showBody   1
   showError  1
   userattr   set01Data set01Name set01TextArg:0,1 set01URL set03NoArg:0,1 setHeader1
   verbose    5


Ehem läuft auf einem LXC unter Proxmox.
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 23:01:58
Und das "curl" hast Du IM Container gemacht? (sorry, wenn das nicht möglich ist, und die Frage blöd ist, ich kenne mich nicht so gut mit Container aus)
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 23:08:48
Alles gut.. Jap den habe ich in dem Container gemacht.
Habe jetzt nochmal einen anderen curl abgesetzt:
Response siehe unten.


fhem@FHEM:~$ curl -X POST -i 'http://192.168.178.76:8090/json-rpc' --data '{
comm>  "command":"componentstate",         
>  "componentstate":{
>    "component":"LEDDEVICE",
>    "state":false
> }
>   }'
HTTP/1.1 200 OK.
Date: Wed, 09 Sep 2020 21:06:51 UTC
Content-Type: application/json
Server: Hyperion Webserver
Content-Length: 71

{
    "command": "componentstate",
    "success": true,
    "tan": 0
}


Kannst du daraus etwas erkennen?
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 23:14:17
Zitat von: Esjay am 09 September 2020, 23:08:48


Kannst du daraus etwas erkennen?
Ja, dass es geht! ;)
Kannst Du noch mit Option -v das curl machen?
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 23:21:09
fhem@FHEM:~$ curl -X  POST -v -i 'http://192.168.178.76:8090/json-rpc' --data '{
"command":"componentstate",         
"componentstate":{
   "component":"LEDDEVICE",
   "state":false
}
  }'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Expire in 0 ms for 6 (transfer 0x563b7b532e90)
*   Trying 192.168.178.76...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x563b7b532e90)
* Connected to 192.168.178.76 (192.168.178.76) port 8090 (#0)
> POST /json-rpc HTTP/1.1
> Host: 192.168.178.76:8090
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Length: 111
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 111 out of 111 bytes
< HTTP/1.1 200 OK.
HTTP/1.1 200 OK.
< Content-Type: application/json
Content-Type: application/json
< Server: Hyperion Webserver
Server: Hyperion Webserver
< Date: Wed, 09 Sep 2020 21:19:56 UTC
Date: Wed, 09 Sep 2020 21:19:56 UTC
< Content-Length: 71
Content-Length: 71

<
{
    "command": "componentstate",
    "success": true,
    "tan": 0
}
* Connection #0 to host 192.168.178.76 left intact
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 23:24:45
Dann versuch mal noch die gleiche Headers im HTTPMOD zu setzen:
setHeader2 User-Agent: curl/7.64.0
setHeader3 Accept: */*

Length wird nw vom HTTPMOD automatisch kalkuliert, und ContentType auch hast Du schon.
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 23:28:51
Leider auch keine Änderung

2020.09.09 23:28:06 5:  MyDevice: set called with LEDDevice false
2020.09.09 23:28:06 5:  MyDevice: set found option LEDDevice in attribute set01Name
2020.09.09 23:28:06 4:  MyDevice: set will now set LEDDevice -> false
2020.09.09 23:28:06 5:  MyDevice: AddToQueue adds type set01 to URL http://192.168.178.76:8090/json-rpc, data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}, header Content-Type: application/json
User-Agent: curl/7.64.0
Accept: */*, retry 0, initial queue len: 0
2020.09.09 23:28:06 5:  MyDevice: HandleSendQueue called, qlen = 1
2020.09.09 23:28:06 5:  MyDevice: HandleSendQueue - call with HTTP METHOD: POST
2020.09.09 23:28:06 4:  MyDevice: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.76:8090/json-rpc,
data: {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}},
header: Content-Type: application/json
User-Agent: curl/7.64.0
Accept: */*
2020.09.09 23:28:06 5:  HttpUtils url=http://192.168.178.76:8090/json-rpc
2020.09.09 23:28:06 4:  IP: 192.168.178.76 -> 192.168.178.76
2020.09.09 23:28:06 5:  HttpUtils request header:
POST /json-rpc HTTP/1.0
Host: 192.168.178.76:8090
Accept-Encoding: gzip,deflate
Content-Type: application/json
User-Agent: curl/7.64.0
Accept: */*
Content-Length: 85

2020.09.09 23:28:08 3:  MyDevice: Read callback: Error: read from http://192.168.178.76:8090 timed out
2020.09.09 23:28:08 4:  MyDevice: Read callback: request type was set01 retry 0, no headers, no body
2020.09.09 23:28:08 5:  MyDevice: Read callback: body empty
2020.09.09 23:28:08 4:  MyDevice: Read found no charset header (bodyDecode was set to auto)
2020.09.09 23:28:08 5:  MyDevice: GetCookies is looking for Cookies
2020.09.09 23:28:08 5:  MyDevice: ExtractSid called, context set, num 01
2020.09.09 23:28:08 4:  MyDevice: no header to look for redirects
2020.09.09 23:28:08 5:  MyDevice: CheckAuth decided no authentication required
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 23:29:16
Wirklich ein Rätsel...

EDIT: wobei curl ein anderes Content-Type: (application/x-www-form-urlencoded) sendet.
EDIT2: Andere Container oder Elemente, die den Port 8090 evtl irgendwie benutzen?
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 09 September 2020, 23:41:59
Das einzige was den Port nutzt ist der Webserver, allerdings müsste ja dann die Anfrage aus dem RestClient im Firefox Addon ebenfalls einen Fehler zur Folge haben.
Zumindest so wie ich das verstehe.
Der klappt ja wie gezeigt ohne Probleme.

Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 09 September 2020, 23:50:04
Zitat von: Esjay am 09 September 2020, 23:41:59
Das einzige was den Port nutzt ist der Webserver, allerdings müsste ja dann die Anfrage aus dem RestClient im Firefox Addon ebenfalls einen Fehler zur Folge haben.
Zumindest so wie ich das verstehe.
Der klappt ja wie gezeigt ohne Probleme.

Sehe ich auch irgendwie so. Und bei curl auch. Aber ich kann es mir nicht anders erklären, als ein Routing Problem o.ä.
Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 09 September 2020, 23:56:02
aber ihr macht doch den curl Test von FHEM aus mit dem user fhem? Was anderes macht doch FHEM auch nicht?!

Das man den Json encoden muss?
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 10 September 2020, 00:09:50
Zitat von: Otto123 am 09 September 2020, 23:56:02
aber ihr macht doch den curl Test von FHEM aus mit dem user fhem? Was anderes macht doch FHEM auch nicht?!

Das ist korrekt.

ZitatDas man den Json encoden muss?

Das verstehe ich nicht so wirklich.
Der Json darf meiner Meinung nach nicht aufgelöst werden..Er muss direkt so ankommen wie er ist..Ich bin in das Thema heute erst eingestiegen, daher weiß ich natürlich nicht, ob ich das ganz durchdrungen habe.
Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 10 September 2020, 00:17:50
ZitatEDIT: wobei curl ein anderes Content-Type: (application/x-www-form-urlencoded) sendet.
Aber vielleicht macht das HTTPMOD von sich aus...
Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 10 September 2020, 00:24:41
Mach das mal versuchsweise:
attr MyDevice set01Data %7B%22command%22%3A%22componentstate%22%2C%22componentstate%22%3A%7B%22component%22%3A%22LEDDEVICE%22%2C%22state%22%3Afalse%7D%7D

Hab ich so erzeugt:
{use URI::Escape;;return uri_escape(q({"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}))}
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 10 September 2020, 00:26:59
@Otto: Ja, aber er hat explizit setHeader1 Content-Type: application/json gesetzt.
@Otto2: Ja, kann man versuchen.

@Esjay: funktionniert bei dir folgendes HTTPMOD?
defmod test8090 HTTPMOD http://insuvcld.vvdncloud.com:8090/ 0
attr test8090 extractAllJSON 1

dann set test8090 reread
Titel: Antw:JSON Senden in Post Request
Beitrag von: Otto123 am 10 September 2020, 00:28:56
Wie schon gesagt, ich habe keine wirkliche Ahnung von HTTPMOD  :-[
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 10 September 2020, 00:47:41
Zitat von: Otto123 am 10 September 2020, 00:28:56
Wie schon gesagt, ich habe keine wirkliche Ahnung von HTTPMOD  :-[
HTTPMOD macht grundsätzlich nichts anderes als HttpUtils_NonBlockingGet
Wenn man aber per Attribut explizit ein Header setzt, wird es auch benutzt ;)
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 10 September 2020, 08:20:41
Guten Morgen,
ich habs gestern nicht mehr geschafft..Wurde einfach zu spät, und ich musste mich zum Schlafen zwingen.

Zitat von: Otto123 am 10 September 2020, 00:24:41
Mach das mal versuchsweise:
attr MyDevice set01Data %7B%22command%22%3A%22componentstate%22%2C%22componentstate%22%3A%7B%22component%22%3A%22LEDDEVICE%22%2C%22state%22%3Afalse%7D%7D

Hab ich so erzeugt:
{use URI::Escape;;return uri_escape(q({"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}}))}

Das läuft ins leere:

2020.09.10 08:18:21 1:  Logfile gelöscht
2020.09.10 08:18:24 5:  MyDevice: UpdateHintList called
2020.09.10 08:18:24 5:  MyDevice: UpdateHintList: setlist = interval reread:noArg stop:noArg start:noArg clearCookies:noArg upgradeAttributes:noArg storeKeyValue LEDDevice
2020.09.10 08:18:24 5:  MyDevice: UpdateHintList: getlist =
2020.09.10 08:18:30 5:  MyDevice: set called with LEDDevice
2020.09.10 08:18:30 5:  MyDevice: set found option LEDDevice in attribute set01Name
2020.09.10 08:18:30 4:  MyDevice: set will now set LEDDevice ->
2020.09.10 08:18:30 5:  MyDevice: AddToQueue adds type set01 to URL http://192.168.178.76:8090/json-rpc, data %7B%22command%22%3A%22componentstate%22%2C%22componentstate%22%3A%7B%22component%22%3A%22LEDDEVICE%22%2C%22state%22%3Afalse%7D%7D, no headers, retry 0, initial queue len: 0
2020.09.10 08:18:30 5:  MyDevice: HandleSendQueue called, qlen = 1
2020.09.10 08:18:30 5:  MyDevice: HandleSendQueue - call with HTTP METHOD: POST
2020.09.10 08:18:30 4:  MyDevice: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.76:8090/json-rpc,
data: %7B%22command%22%3A%22componentstate%22%2C%22componentstate%22%3A%7B%22component%22%3A%22LEDDEVICE%22%2C%22state%22%3Afalse%7D%7D, No Header
2020.09.10 08:18:30 5:  HttpUtils url=http://192.168.178.76:8090/json-rpc
2020.09.10 08:18:30 4:  IP: 192.168.178.76 -> 192.168.178.76
2020.09.10 08:18:32 3:  MyDevice: Read callback: Error: connect to http://192.168.178.76:8090 timed out
2020.09.10 08:18:32 4:  MyDevice: Read callback: request type was set01 retry 0, no headers, no body
2020.09.10 08:18:32 5:  MyDevice: Read callback: body empty
2020.09.10 08:18:32 4:  MyDevice: Read found no charset header (bodyDecode was set to auto)
2020.09.10 08:18:32 5:  MyDevice: GetCookies is looking for Cookies
2020.09.10 08:18:32 5:  MyDevice: ExtractSid called, context set, num 01
2020.09.10 08:18:32 4:  MyDevice: no header to look for redirects
2020.09.10 08:18:32 5:  MyDevice: CheckAuth decided no authentication required



Zitat von: amenomade am 10 September 2020, 00:26:59
@Otto: Ja, aber er hat explizit setHeader1 Content-Type: application/json gesetzt.
@Otto2: Ja, kann man versuchen.

@Esjay: funktionniert bei dir folgendes HTTPMOD?
defmod test8090 HTTPMOD http://insuvcld.vvdncloud.com:8090/ 0
attr test8090 extractAllJSON 1

dann set test8090 reread

Dieser funktioniert soweit:

2020.09.10 08:16:19 5:  test8090: set called with reread
2020.09.10 08:16:19 5:  test8090: GetUpdate called (reread)
2020.09.10 08:16:19 5:  test8090: AddToQueue adds type update to URL http://insuvcld.vvdncloud.com:8090/, no data, no headers, retry 0, initial queue len: 0
2020.09.10 08:16:19 5:  test8090: HandleSendQueue called, qlen = 1
2020.09.10 08:16:19 4:  test8090: HandleSendQueue sends update with timeout 2 to http://insuvcld.vvdncloud.com:8090/, No Data, No Header
2020.09.10 08:16:19 5:  HttpUtils url=http://insuvcld.vvdncloud.com:8090/
2020.09.10 08:16:19 4:  IP: insuvcld.vvdncloud.com -> 52.249.189.74
2020.09.10 08:16:20 5:  HttpUtils request header:
GET / HTTP/1.0
Host: insuvcld.vvdncloud.com:8090
User-Agent: fhem
Accept-Encoding: gzip,deflate

2020.09.10 08:16:20 4:  http://insuvcld.vvdncloud.com:8090/: HTTP response code 200
2020.09.10 08:16:20 5:  HttpUtils http://insuvcld.vvdncloud.com:8090/: Got data, length: 1230
2020.09.10 08:16:20 5:  HttpUtils response header:
HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Date: Thu, 10 Sep 2020 06:16:20 GMT
Connection: close
2020.09.10 08:16:20 4:  test8090: Read callback: request type was update retry 0,
header: HTTP/1.1 200
Content-Type: application/hal+json;charset=UTF-8
Date: Thu, 10 Sep 2020 06:16:20 GMT
Connection: close, body length 1230
2020.09.10 08:16:20 5:  test8090: Read callback: body
{
  "_links" : {
    "modeEventses" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/modeEventses{?page,size,sort}",
      "templated" : true
    },
    "cameraModeses" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/cameraModeses{?page,size,sort}",
      "templated" : true
    },
    "deviceDatas" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/deviceDatas{?page,size,sort}",
      "templated" : true
    },
    "recordedVideos" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/recordedVideos{?page,size,sort}",
      "templated" : true
    },
    "deviceUsers" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/deviceUsers{?page,size,sort}",
      "templated" : true
    },
    "devices" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/devices{?page,size,sort}",
      "templated" : true
    },
    "cameraSettingDetailses" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/cameraSettingDetailses{?page,size,sort}",
      "templated" : true
    },
    "cameraSettingses" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/cameraSettingses{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://insuvcld.vvdncloud.com:8090/profile"
    }
  }
}
2020.09.10 08:16:20 4:  test8090: Read found charset header and set decoding to UTF-8 (bodyDecode was set to auto)
2020.09.10 08:16:20 4:  test8090: Read is decoding the buffer as UTF-8
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix , ref is HASH(0x55b100338b88)
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_, ref is HASH(0x55b100909650)
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_deviceDatas_, ref is HASH(0x55b0fed4bce8)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_deviceDatas_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_deviceDatas_href to http://insuvcld.vvdncloud.com:8090/deviceDatas{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_modeEventses_, ref is HASH(0x55b0ff74a640)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_modeEventses_href to http://insuvcld.vvdncloud.com:8090/modeEventses{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_modeEventses_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_cameraSettingDetailses_, ref is HASH(0x55b0fe0266f0)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraSettingDetailses_href to http://insuvcld.vvdncloud.com:8090/cameraSettingDetailses{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraSettingDetailses_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_cameraModeses_, ref is HASH(0x55b0fea0ef30)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraModeses_href to http://insuvcld.vvdncloud.com:8090/cameraModeses{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraModeses_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_profile_, ref is HASH(0x55b0fe398558)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_profile_href to http://insuvcld.vvdncloud.com:8090/profile
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_deviceUsers_, ref is HASH(0x55b0fddde7e0)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_deviceUsers_href to http://insuvcld.vvdncloud.com:8090/deviceUsers{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_deviceUsers_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_devices_, ref is HASH(0x55b0fef3bf70)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_devices_href to http://insuvcld.vvdncloud.com:8090/devices{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_devices_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_recordedVideos_, ref is HASH(0x55b0fe564020)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_recordedVideos_href to http://insuvcld.vvdncloud.com:8090/recordedVideos{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_recordedVideos_templated to 1
2020.09.10 08:16:20 5:  test8090: JSON Flatter doing recursion because value is a HASH
2020.09.10 08:16:20 5:  test8090: JSON Flatter called : prefix _links_cameraSettingses_, ref is HASH(0x55b0fe5977d0)
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraSettingses_href to http://insuvcld.vvdncloud.com:8090/cameraSettingses{?page,size,sort}
2020.09.10 08:16:20 5:  test8090: JSON Flatter sets _links_cameraSettingses_templated to 1
2020.09.10 08:16:20 4:  test8090: extracted JSON values to internal
2020.09.10 08:16:20 5:  test8090: GetCookies is looking for Cookies
2020.09.10 08:16:20 5:  test8090: ExtractSid called, context reading, num
2020.09.10 08:16:20 4:  test8090: checking for redirects, code=200, ignore=0
2020.09.10 08:16:20 4:  test8090: no redirects to handle
2020.09.10 08:16:20 5:  test8090: CheckAuth decided no authentication required
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_modeEventses_href to value http://insuvcld.vvdncloud.com:8090/modeEventses{?page,size,sort} of JSON _links_modeEventses_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_deviceDatas_href to value http://insuvcld.vvdncloud.com:8090/deviceDatas{?page,size,sort} of JSON _links_deviceDatas_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraModeses_templated to value 1 of JSON _links_cameraModeses_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraSettingDetailses_templated to value 1 of JSON _links_cameraSettingDetailses_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraSettingDetailses_href to value http://insuvcld.vvdncloud.com:8090/cameraSettingDetailses{?page,size,sort} of JSON _links_cameraSettingDetailses_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraSettingses_href to value http://insuvcld.vvdncloud.com:8090/cameraSettingses{?page,size,sort} of JSON _links_cameraSettingses_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_profile_href to value http://insuvcld.vvdncloud.com:8090/profile of JSON _links_profile_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_recordedVideos_href to value http://insuvcld.vvdncloud.com:8090/recordedVideos{?page,size,sort} of JSON _links_recordedVideos_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_deviceUsers_templated to value 1 of JSON _links_deviceUsers_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_devices_href to value http://insuvcld.vvdncloud.com:8090/devices{?page,size,sort} of JSON _links_devices_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_deviceUsers_href to value http://insuvcld.vvdncloud.com:8090/deviceUsers{?page,size,sort} of JSON _links_deviceUsers_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_modeEventses_templated to value 1 of JSON _links_modeEventses_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_devices_templated to value 1 of JSON _links_devices_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraModeses_href to value http://insuvcld.vvdncloud.com:8090/cameraModeses{?page,size,sort} of JSON _links_cameraModeses_href
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_cameraSettingses_templated to value 1 of JSON _links_cameraSettingses_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_deviceDatas_templated to value 1 of JSON _links_deviceDatas_templated
2020.09.10 08:16:20 5:  test8090: Read sets reading _links_recordedVideos_templated to value 1 of JSON _links_recordedVideos_templated
2020.09.10 08:16:20 5:  test8090: UpdateReadingList created list of reading.* nums to parse during getUpdate as
2020.09.10 08:16:20 5:  test8090: Read starts parsing response to update with defined readings:
2020.09.10 08:16:20 4:  test8090: Read response matched 17, unmatch 0 Reading(s)
2020.09.10 08:16:20 5:  test8090: Read response to update matched _links_modeEventses_href _links_deviceDatas_href _links_cameraModeses_templated _links_cameraSettingDetailses_templated _links_cameraSettingDetailses_href _links_cameraSettingses_href _links_profile_href _links_recordedVideos_href _links_deviceUsers_templated _links_devices_href _links_deviceUsers_href _links_modeEventses_templated _links_devices_templated _links_cameraModeses_href _links_cameraSettingses_templated _links_deviceDatas_templated _links_recordedVideos_templated
2020.09.10 08:16:20 5:  test8090: HandleSendQueue called, qlen = 0


Wolltest du schauen ob der Port doch irgendwie belegt ist?

Grüße
Titel: Antw:JSON Senden in Post Request
Beitrag von: amenomade am 10 September 2020, 10:51:18
Zitat von: Esjay am 10 September 2020, 08:20:41


Wolltest du schauen ob der Port doch irgendwie belegt ist?

Grüße
Also... ob die Antwort irgendwie geblockt oder gefangen wird. Aber der Test hat eigentlich wenig Sinn, da die Request von innen kommt. Ich weiss nur nicht mehr, wo genau zu suchen. In einem normalen Host hätte ich noch ein "sudo netstat -tulnp |grep 8090" vorgeschlagen.
Läuft dieser Webserver 192.168.178.76:8090 im gleichen Container wie Fhem?

Ich sehe nur noch die Möglichkeit, den Traffic mit tcpdump o.ä zu sniffen...
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 10 September 2020, 11:15:55
Nee, das Hyperion läuft auf einem separaten Pi.
Habe da auch schon alles an Authentifizierung abgeschaltet, um sicherzugehen, dass dort nichts dazwischen haut. Aber selbst wenn da eine Authentifizierung fehlt, müsste er es in der Response anmeckern.

Ich danke dir auf jeden Fall schonmal für deinen langen Atem.

Im Hyperion Forum habe ich den Hinweis gefunden, dass dort jemand über Node-red geht.
Da ich Node-Red <-->Fhem schon in einem anderen Projekt im Einsatz habe, werde ich wohl diesen Ansatz parallel verfolgen.

Nächste Möglichkeit wäre vll über eine sub zu gehen.

https://forum.fhem.de/index.php?topic=88104.0

Oder jemandem fällt noch irgendetwas ein.

Grüße
Titel: Antw:JSON Senden in Post Request
Beitrag von: Esjay am 10 September 2020, 13:01:19
So habs geschafft.
Hinweis auf die Http Version hat den Durchbruch gebracht.

Lösung:
defmod MyDevice HTTPMOD none 0
attr MyDevice userattr set01Data set01Name set01TextArg:0,1 set01URL setHeader1
attr MyDevice DbLogExclude .*
attr MyDevice httpVersion 1.1
attr MyDevice set01Data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}
attr MyDevice set01Name LEDDevice
attr MyDevice set01TextArg 1
attr MyDevice set01URL http://192.168.178.76:8090/json-rpc
attr MyDevice setHeader1 Content-Type: application/json
attr MyDevice showBody 1
attr MyDevice showError 1
attr MyDevice verbose 5


2020.09.10 12:57:57 1:  Logfile gelöscht
2020.09.10 12:58:07 5:  MyDevice: set called with LEDDevice false
2020.09.10 12:58:07 5:  MyDevice: set found option LEDDevice in attribute set01Name
2020.09.10 12:58:07 4:  MyDevice: set will now set LEDDevice -> false
2020.09.10 12:58:07 5:  MyDevice: AddToQueue adds type set01 to URL http://192.168.178.76:8090/json-rpc, data {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":$val}}, header Content-Type: application/json, retry 0, initial queue len: 0
2020.09.10 12:58:07 5:  MyDevice: HandleSendQueue called, qlen = 1
2020.09.10 12:58:07 4:  MyDevice: HandleSendQueue sends set01 with timeout 2 to http://192.168.178.76:8090/json-rpc,
data: {"command":"componentstate","componentstate":{"component":"LEDDEVICE","state":false}},
header: Content-Type: application/json
2020.09.10 12:58:07 5:  HttpUtils url=http://192.168.178.76:8090/json-rpc
2020.09.10 12:58:07 4:  IP: 192.168.178.76 -> 192.168.178.76
2020.09.10 12:58:08 5:  HttpUtils request header:
POST /json-rpc HTTP/1.1
Host: 192.168.178.76:8090
User-Agent: fhem
Accept-Encoding: gzip,deflate
Connection: Close
Content-Type: application/json
Content-Length: 85

2020.09.10 12:58:08 4:  http://192.168.178.76:8090/json-rpc: HTTP response code 200
2020.09.10 12:58:08 5:  HttpUtils http://192.168.178.76:8090/json-rpc: Got data, length: 71
2020.09.10 12:58:08 5:  HttpUtils response header:
HTTP/1.1 200 OK.
Content-Type: application/json
Server: Hyperion Webserver
Date: Thu, 10 Sep 2020 10:58:08 UTC
Content-Length: 71
2020.09.10 12:58:08 4:  MyDevice: Read callback: request type was set01 retry 0,
header: HTTP/1.1 200 OK.
Content-Type: application/json
Server: Hyperion Webserver
Date: Thu, 10 Sep 2020 10:58:08 UTC
Content-Length: 71, body length 71
2020.09.10 12:58:08 5:  MyDevice: Read callback: body
{
    "command": "componentstate",
    "success": true,
    "tan": 0
}

2020.09.10 12:58:08 4:  MyDevice: Read found no charset header (bodyDecode was set to auto)
2020.09.10 12:58:08 5:  MyDevice: GetCookies is looking for Cookies
2020.09.10 12:58:08 5:  MyDevice: ExtractSid called, context set, num 01
2020.09.10 12:58:08 4:  MyDevice: checking for redirects, code=200, ignore=0
2020.09.10 12:58:08 4:  MyDevice: no redirects to handle
2020.09.10 12:58:08 5:  MyDevice: CheckAuth decided no authentication required