Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

amenomade

Zitat von: ch.eick am 08 September 2020, 19:28:03
Ich habe da ein Problem die Daten zu liefern :-(

1)Das Log zeigt den Versuch der Anmeldung, was noch nicht geglückt ist, da die Keys wohl falsch berechnet werden.

2) Ich habe es nun geschafft, aus Burp einen gültigen Header zu kopieren, mit dem ich jetzt eine Verbindung bekomme.

attr BYD_Status_test get01Header Authorization: Digest username="installer", realm="BoxServer", nonce="2370ffe077296607d63cf6177159abdc", uri="/asp/RunData.asp", algorithm=MD5, response="a7da56c7835c90c025d6cf246a1e492f", opaque="5ccc069c403ebaf9f0171e9517f40e41", qop=auth, nc=00000002, cnonce="126c7fc80a04c19e"

Was mir nicht klar ist, wie die Keys aufgebaut werden. Über die Web Seiten gibt es da vielfältige Möglichkeiten, die ich mit dem replacement teste.
Die aktuellte Meldung ist "wrong Passwort", was mir sagt, dass die Berechnung mit HA1 und HA2 so nicht stimmen kann.

Ich erzeuge mal ein Log mit dem "wrong passwort" und eins mit dem get01Header" aus dem Browser.

Die list Device sind auch in den jeweiligen Dateien.

Gruß
   Christian

Du hast am Anfang gesagt, es gäbe ein Python Skript? Welches?
Hast Du schon einfach mit BasicAuth: http://User:Password@192.168.178.20/asp/RunData.asp versucht?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

wires.io

Da ändert sich leider nichts.

2020.09.09 08:24:51 5: sonoffdiy: set called with on 1
2020.09.09 08:24:51 5: sonoffdiy: set found option on in attribute set02Name
2020.09.09 08:24:51 4: sonoffdiy: set will now set on -> 1
2020.09.09 08:24:51 5: sonoffdiy: AddToQueue adds type set02 to URL http://192.168.178.93:8081/zeroconf/switch, data { "deviceid": "", "data": { "switch": "on" } }, header Content-Length: 46, retry 0, initial queue len: 0
2020.09.09 08:24:51 5: sonoffdiy: HandleSendQueue called, qlen = 1
2020.09.09 08:24:51 5: sonoffdiy: HandleSendQueue - call with HTTP METHOD: POST
2020.09.09 08:24:51 4: sonoffdiy: HandleSendQueue sends set02 with timeout 2 to http://192.168.178.93:8081/zeroconf/switch,
data: { "deviceid": "", "data": { "switch": "on" } },
header: Content-Length: 46
2020.09.09 08:24:51 5: HttpUtils url=http://192.168.178.93:8081/zeroconf/switch
2020.09.09 08:24:51 4: IP: 192.168.178.93 -> 192.168.178.93
2020.09.09 08:24:51 5: HttpUtils request header:
POST /zeroconf/switch HTTP/1.0
Host: 192.168.178.93:8081
User-Agent: fhem
Accept-Encoding: gzip,deflate
Content-Length: 46
Content-Type: application/x-www-form-urlencoded

2020.09.09 08:24:53 3: sonoffdiy: Read callback: Error: read from http://192.168.178.93:8081 timed out
2020.09.09 08:24:53 4: sonoffdiy: Read callback: request type was set02 retry 0, no headers, no body
2020.09.09 08:24:53 5: sonoffdiy: Read callback: body empty
2020.09.09 08:24:53 4: sonoffdiy: Read found no charset header (bodyDecode was set to auto)
2020.09.09 08:24:53 5: sonoffdiy: GetCookies is looking for Cookies
2020.09.09 08:24:53 5: sonoffdiy: ExtractSid called, context set, num 02
2020.09.09 08:24:53 4: sonoffdiy: no header to look for redirects
2020.09.09 08:24:53 5: sonoffdiy: CheckAuth decided no authentication required

frank

ZitatDa ändert sich leider nichts.

erhöhe mal den timeout.
zb "attr sonoffdiy timeout 30"
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

ch.eick

#843
EDIT: Ich habe nochmal ein neues Log erzeugt, weil die Übergabe der Keys in der Reihenfolge nicht richtig war.
         Kommentare und Erklärungen sind auch direkt in der log Datei.
         Auch der weitere Test mit der neuen "response" ist fehlgeschlagen.
         Ich ruf schon mal bei eft, dem Service von BYD an :-)

Zitat von: amenomade am 09 September 2020, 00:26:05
Du hast am Anfang gesagt, es gäbe ein Python Skript? Welches?
Hast Du schon einfach mit BasicAuth: http://User:Password@192.168.178.20/asp/RunData.asp versucht?
Das mit dem BasicAuth klappt nicht, da ist auch leider ein "@" im Passwort.


Das sind die Zeilen für das Login

    mySession = requests.Session()

        url='http://'+BYDboxIP+'/asp/RunData.asp'
        r4 = mySession.get(url, auth=HTTPBasicAuth(credentials["username"],credentials["password"]))

Ich habe nirgends gefunden, was HTTPBasicAuth() so alles macht, bin aber auch kein Entwickler.

Und hier alles

fhem@raspberrypi:~/python/bin$ cat byd_status.py
import fhem

import sys
BYDboxIP = sys.argv[1]
web = sys.argv[2]


import requests
import time
import json

from pprint import pprint
from bs4 import BeautifulSoup
from requests.auth import HTTPBasicAuth
import logging

#from loggerdate import loggerdate


def getvaluefromsubstring (inputvalue):
    # The input we pass looks like this:
    #<input readonly="readonly" type="text" value="5186"/>
    #Goal is to return value 5186 as outputvalue
    #Not sure if BeautifulSoup could do more / better...
    output_array=  str(inputvalue)
    A,B,C,outputvalue=  output_array.split('=')
    outputvalue, A= outputvalue.split('/')
    A,outputvalue,B = outputvalue.split('"')
    if ('%' in outputvalue):
        outputvalue, A = outputvalue.split('%')
    outputvalue = float(outputvalue)
    return outputvalue

def readbyd():

    #Please adjust the parameters below as appropriate for your environment:

    # username and password are read from pwd_byd.json file ; BYDboxIP is parsed from sys commandline
    #print ("Start reading Password file for BYD access....")
    try:
        with open('/opt/fhem/python/pwd_byd.json', 'r') as f:
            credentials=json.load(f)
    except Exception as e:
        print('Something went wrong: {}'.format(e))

    #No configurable parameters beyond this point       
   
    mySession = requests.Session()
    try:
        BYDdata={}
        #The two stupid lines below took me almost a day...
        #You can access other pages on the BYD WEB-Page - calling other asp scripts
        url='http://'+BYDboxIP+'/asp/RunData.asp'
        r4 = mySession.get(url, auth=HTTPBasicAuth(credentials["username"],credentials["password"]))
        if (r4.status_code == 200):
            page = r4.text
            soup = BeautifulSoup(page, 'html.parser')
            soup_ele = soup.body.form.table                                    #This gets us the RunData Table and Array Num 1 values - using this approach
            soup_reduced = soup_ele.find_all('input',attrs={"type": "text"} )  #Using this option now since BYD introduced some glitches with Firmware 3.012R on their html code..
            # It now contains a list of the following kind
            #<input readonly="readonly" type="text" value="19.300"/>
            #print (soup_reduced)
            #print ("ERSTES ELE", soup_reduced[1])
            Keyvalue=[]
            for elems in soup_reduced:
                elems=str(elems)
                myarray= elems.split('=')
                CurValue=myarray[3].split('"')
                Keyvalue.append(CurValue[1])

            BYDdata["arrayvoltage"]= float(Keyvalue[0])
            BYDdata["packvoltage"] = float(Keyvalue[1])
            BYDdata["current"] = float(Keyvalue[2])
            BYDdata["soc"] = (Keyvalue[3])
            BYDdata["sysTemp"] = Keyvalue[4]         
            BYDdata["maxcellvol"] = float(Keyvalue[5])
            BYDdata["mincellvol"] = float(Keyvalue[6])       
            BYDdata["maxcelltemp"] = float(Keyvalue[7])
            BYDdata["mincelltemp"] = float(Keyvalue[8])
            BYDdata["maxvolpos"] = int(Keyvalue[9])
            BYDdata["minvolpos"] = Keyvalue[10]
            BYDdata["maxtemppos"] = Keyvalue[11]
            BYDdata["mintemppos"] = Keyvalue[12]
            BYDdata["power"] = Keyvalue[13]           
            """
            # Oh well - with Firmware 3.012R, these values have disappeared from the BYD web pages...
            BYDdata["soc"] = Keyvalue[3]
            BYDdata["socwh"] = Keyvalue[4]
            BYDdata["socah"] = Keyvalue[5]   
            BYDdata["soh"] = Keyvalue[6]                 
            """

            Error_Connecting = 0

        else:
            print ("Not sure if we are able to connect with the given username & password - error code is:", r4.status_code)
            print ("Header information passed is :", r4.headers)
            Error_Connecting = r4.status_code
   
        url='http://'+BYDboxIP+'/asp/StatisticInformation.asp'
        r2 = mySession.get(url, auth=HTTPBasicAuth(credentials["username"],credentials["password"]))
        if ((r2.status_code == 200) and (Error_Connecting == 0)):
            page = r2.text
            soup = BeautifulSoup(page, 'html.parser')
            soup_ele = soup.body.table   
            #print (soup_ele)
            #print ("--------------------------------------------------------")
            #<input readonly="readonly" type="text" value="5186"/>
            soup_reduced = soup_ele.find_all('input')
            #print (soup_reduced)
            #print ("soup_ele", soup_ele)
            i = 0
            a= len(soup_ele.contents)
            total_charge_energy = soup_ele.find("td", text="Total Charge Energy:").find_next_sibling("td").text
            total_charge_energy,b = (total_charge_energy.split())
            total_charge_energy = float(total_charge_energy)
            #print ("Total Charge Energy :", total_charge_energy)
            BYDdata["Total_Charge_Energy"]= total_charge_energy
           
            total_discharge_energy = soup_ele.find("td", text="Total Discharge Energy:").find_next_sibling("td").text
            total_discharge_energy,b = (total_discharge_energy.split())
            total_discharge_energy = float(total_discharge_energy)
            #print ("Total Discharge Energy :", total_discharge_energy)
            BYDdata["Total_Discharge_Energy"] = total_discharge_energy
           
            total_cycle_counts = soup_ele.find("td", text="Total Cycle Counts:").find_next_sibling("td").text
            #total_cycle_counts,b = (total_cycle_counts.split())
            total_cycle_counts = float(total_cycle_counts)
            #print ("Total Cycle Counts :", total_cycle_counts)
            BYDdata["Total_Cycle_Counts"] = total_cycle_counts
        else:
            print ("Not sure if we are able to connect with the given username & password - error code is:", r4.status_code)
            print ("Header information passed is :", r2.headers)
            Error_Connecting = r2.status_code
           
    except Exception as Connecterror:
        print ("Error connecting to the BYD box :", Connecterror)
        #logging.error("%s %s %s", loggerdate(), ",readbyd: Ran into exception querying the BYD Box : ", Connecterror)
        Error_Connecting = Connecterror
    if (Error_Connecting == 0):
        if (len(BYDdata) >1):                         # We have something in the list

            Returnvalue =0
    else:                                               # We ran into trouble and allocate an empty list
        BYDdata={}
        print ("Issue getting data from BYD ", Error_Connecting)
       
    return (Returnvalue, BYDdata)   
       
   



if __name__ == "__main__": 

    #print ("Start querying BYD....")
    try:
        Myreturnvalue, Mydata = readbyd();
        if (Myreturnvalue == 0):
            #print ("Returnvalue -should be zero if successful : ", Myreturnvalue)
            #print ("----------------Start Values BYD ----------------")
            #pprint (Mydata)
            #print ("----------------End - Values from BYD ----------------")
            #print ("Specific values from array....")
            #print ("BYD Total Charge Energy                 :", Mydata['Total_Charge_Energy'], "Kwh")
            #print ("BYD Total Discharge Energy              :", Mydata['Total_Discharge_Energy'], "Kwh")
            #print ("Calculations...")
            #print ("Charging (+) / Discharging (-) Energy   :", round(Mydata['packvoltage']*Mydata['current'],0), "W")
            #print ("Efficiency is                           :",round(Mydata['Total_Discharge_Energy']/Mydata['Total_Charge_Energy'],3))
            #print (Mydata)

            message = json.dumps(Mydata)

            #print ("Start reading Password file for FHEM access....")
            try:
                with open('/opt/fhem/python/pwd_fhem.json', 'r') as f:
                    credentials=json.load(f)
            except Exception as e:
                print('Something went wrong: {}'.format(e))

            #print ("Start login to FHEM ....")
            fh = fhem.Fhem(web, protocol="http", port=8083, username=credentials["username"], password=credentials["password"])

            #print ("Start transfer of data to FHEM ....")
            fh.send_cmd("setreading BYD_Status output " + message)

        else:
            print ("Error unable to query BYD Box")
    except Exception as ex:
        print ("Issues querying BYD Box :", ex)

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

wires.io

Zitat von: frank am 09 September 2020, 10:52:35
erhöhe mal den timeout.
zb "attr sonoffdiy timeout 30"

Bewirkt leider auch keine Änderung. Ich habe das Gefühl, das FHEM garnicht sendet. Wenn ich vom selben System, auf dem FHEM läuft,
curl --request POST --data '{ "deviceid": "", "data": { "switch": "off" } }' http://192.168.178.93:8081/zeroconf/switch
ausführe, funktioniert es aber.

Echt seltsam...

ch.eick

Zitat von: wires.io am 09 September 2020, 13:04:52
Bewirkt leider auch keine Änderung. Ich habe das Gefühl, das FHEM garnicht sendet. Wenn ich vom selben System, auf dem FHEM läuft,
curl --request POST --data '{ "deviceid": "", "data": { "switch": "off" } }' http://192.168.178.93:8081/zeroconf/switch
ausführe, funktioniert es aber.
So etwas hatte ich auch schon, da lag es an den Headern, die curl wohl automatisch erzeugt.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

amenomade

Zitat von: wires.io am 09 September 2020, 08:25:57
Da ändert sich leider nichts.

Da wird immer noch nichts als Data mitgeschickt. Bitte wieder ein "list" vom HTTPMOD.

Zitat von: ch.eick am 09 September 2020, 15:45:49
So etwas hatte ich auch schon, da lag es an den Headern, die curl wohl automatisch erzeugt.
Das stimmt. Das kann man aber schön mit -v bei curl sehen, und ggf die entspr. Headers beim HTTPMOD setzen. Aber grundsätzlich macht HTTPMOD fast die gleiche Headers wie curl, bis auf dem User-Agent. Also:
attr sonoffdiy set01Header1 User-Agent: curl
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Zitat von: ch.eick am 09 September 2020, 11:07:53

Das mit dem BasicAuth klappt nicht, da ist auch leider ein "@" im Passwort.
Dann als %40 im Passwort escapen. (ggf andere Sonderzeichen auch "urlencode" escapen - aber nicht den Doppelpunkt zwischen User und Passwort und das "@" vor der URL! )

Zitat von: ch.eick am 09 September 2020, 11:07:53

Das sind die Zeilen für das Login

    mySession = requests.Session()

        url='http://'+BYDboxIP+'/asp/RunData.asp'
        r4 = mySession.get(url, auth=HTTPBasicAuth(credentials["username"],credentials["password"]))


Deswegen bestehe ich auf einem Test mit reinem BasicAuth :) Im Skript ist von DigestAuth überhaupt nicht die Rede.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

wires.io

Zitat von: amenomade am 09 September 2020, 20:03:55
Da wird immer noch nichts als Data mitgeschickt. Bitte wieder ein "list" vom HTTPMOD.
Das stimmt. Das kann man aber schön mit -v bei curl sehen, und ggf die entspr. Headers beim HTTPMOD setzen. Aber grundsätzlich macht HTTPMOD fast die gleiche Headers wie curl, bis auf dem User-Agent. Also:
attr sonoffdiy set01Header1 User-Agent: curl

Voila:
Internals:
   BUSY       0
   CFGFN     
   DEF        none 0
   FUUID      5f5532c5-f33f-64cd-67bc-e4205583225871dd
   Interval   0
   LASTSEND   1599676825.93438
   MainURL   
   ModuleVersion 3.5.22 - 7.2.2020
   NAME       sonoffdiy
   NOTIFYDEV  global
   NR         777
   NTFY_ORDER 50-sonoffdiy
   STATE      ???
   TRIGGERTIME 0
   TRIGGERTIME_FMT
   TYPE       HTTPMOD
   addr       http://192.168.178.93:8081
   auth       0
   buf       
   data       { "deviceid": "", "data": { "switch": "off" } }
   displayurl http://192.168.178.93:8081/zeroconf/switch
   header     User-Agent: curl/7.38.0
   host       192.168.178.93
   httpversion 1.0
   ignoreredirects 1
   loglevel   4
   method     POST
   path       /zeroconf/switch
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.93:8081/zeroconf/switch
   value      0
   QUEUE:
   READINGS:
   REQUEST:
     data       { "deviceid": "", "data": { "switch": "off" } }
     header     User-Agent: curl/7.38.0
     ignoreredirects 0
     method     POST
     retryCount 0
     type       set01
     url        http://192.168.178.93:8081/zeroconf/switch
     value      0
   sslargs:
Attributes:
   set01Data  { "deviceid": "", "data": { "switch": "off" } }
   set01Header User-Agent: curl/7.38.0
   set01Method POST
   set01Name  off
   set01NoArg 1
   set01URL   http://192.168.178.93:8081/zeroconf/switch
   set02Data  { "deviceid": "", "data": { "switch": "on" } }
   set02Header User-Agent: curl/7.38.0
   set02Method POST
   set02Name  on
   set02NoArg 1
   set02URL   http://192.168.178.93:8081/zeroconf/switch
   timeout    2
   userattr   set01Data set01Header set01Method:GET,POST,PUT set01Name set01NoArg:0,1 set01URL set02Data set02Header set02Method:GET,POST,PUT set02Name set02NoArg:0,1 set02URL
   verbose    5

amenomade

#849
Zitat von: wires.io am 09 September 2020, 20:42:38
Voila:
Internals:
   BUSY       0
   CFGFN     
...
Attributes:
   set01NoArg 1
...
   set02NoArg 1

Tja... die NoArg Attribute sind doch noch da... EDIT: sorry, das war Quatsch von mir.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Hmmm... Sorry, ich habe das falsche Attribut erwähnt. NoArg ist doch richtig, wenn Du nicht "set device on etwas" machen willst. Ich muss nochmal suchen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

#851
Mach mal noch ein
attr sonoffdiy set01Header2 Accept: */*

Sonst kannst Du bitte zeigen, was "curl -v ..." sagt?

Das in der Log ist merkwürdig, aber Du sagst, es gab bei timeOut 30 keine Änderung
Zitat2020.09.09 08:24:53 3: sonoffdiy: Read callback: Error: read from http://192.168.178.93:8081 timed out

EDIT: 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"?




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

wires.io

Zitat von: amenomade am 09 September 2020, 21:29:05
EDIT: 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"?

Ja, meldet "present".

Zitat von: amenomade am 09 September 2020, 21:29:05
Sonst kannst Du bitte zeigen, was "curl -v ..." sagt?

$ curl --request POST --data '{ "deviceid": "", "data": { "switch": "off" } }' -v http://192.168.178.93:8081/zeroconf/switch
* Hostname was NOT found in DNS cache
*   Trying 192.168.178.93...
* Connected to 192.168.178.93 (192.168.178.93) port 8081 (#0)
> POST /zeroconf/switch HTTP/1.1
> User-Agent: curl/7.38.0
> Host: 192.168.178.93:8081
> Accept: */*
> Content-Length: 47
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 47 out of 47 bytes
< HTTP/1.1 200 OK
* Server openresty is not blacklisted
< Server: openresty
< Content-Type: application/json; charset=utf-8
< Content-Length: 20
< Connection: close
<
* Closing connection 0
{"seq":39,"error":0}


Zitat von: amenomade am 09 September 2020, 21:29:05
attr sonoffdiy set01Header2 Accept: */*

Bewirkt leider nichts.

ch.eick

Zitat von: amenomade am 09 September 2020, 20:10:04
Dann als %40 im Passwort escapen. (ggf andere Sonderzeichen auch "urlencode" escapen - aber nicht den Doppelpunkt zwischen User und Passwort und das "@" vor der URL! )
Deswegen bestehe ich auf einem Test mit reinem BasicAuth :) Im Skript ist von DigestAuth überhaupt nicht die Rede.
- Das Escapen hat auch nicht geklappt, es kam wieder das Login Fenster vom Browser.
- Dann habe ich das Passwort geändert, ohne ein spezielles Sonderzeichen, was jedoch auch nicht geklappt hat. Wieder das Loginfenster

- BasicAuth: Ich vermute, dass die Python Funktion beim Login erkennt, was gefordert wird. Anhand von diesen Rückmeldungen gehe ich vin Digest aus

Erster Request, bis zum Login Fenster
WWW-Authenticate: Digest realm="BoxServer", domain="",qop="auth", nonce="0529bbb3c1bc9b68bc92765bd256e100", opaque="5ccc069c403ebaf9f0171e9517f40e41",algorithm="MD5", stale="FALSE"
Das liefert alle Werte, die auch in der allgemeinen Digest Dokumentation im Web zu finden sind.

Neuer Request mit Anmeldung.
Authorization: Digest username="installer", realm="BoxServer", nonce="c2f4d5c429bd3dc91180e1939167a25b", uri="/menu.asp", algorithm=MD5, response="57187e44d51950a90bdb42d7ee48f9f3", opaque="5ccc069c403ebaf9f0171e9517f40e41", qop=auth, nc=00000005, cnonce="98d14c0429be2188"


Ich habe im FHEM versucht die Funktion "md5()" aufzurufen, jedoch wird die nicht gefunden. Daraufhin habe ich "md5_hex()" gefunden und verwendet. Auch da ist sicherlich ein Unterschied und ein Fehler.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#854
Zitat von: wires.io am 10 September 2020, 08:36:03
Content-Type: application/json; charset=utf-8
auch das "charset=utf-8" könnte etwas bewirken.

EDIT: In dem List sehe ich, dass Du nur einen set01Header verwendest, um alles zu setzen kannst Du auch mehrere definieren, um alles zu setzen.

set01Header1 Accept: */*
set01Header2 Content-Type: application/x-www-form-urlencoded
set01Header3 charset=utf-8

RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick