Zendure Solarflow in Fhem via MQTT einbinden

Begonnen von Reinhart, 15 Februar 2024, 17:29:53

Vorheriges Thema - Nächstes Thema

rabehd

Login, Daten verändert

2025.04.16 13:05:45.518 5: ZendureBridge: <Get> called for ZendureBridge : msg = ?
2025.04.16 13:05:49.638 5: ZendureBridge: <Request> URL:https://app.zendure.tech/eu/auth/app/token send:
## Header ############
$VAR1 = {
          'Accept-Language' => 'de-DE',
          'Content-Type' => 'application/json',
          'Accept' => '*/*',
          'appVersion' => '4.3.1',
          'Authorization' => 'Basic YmVja2VycmFsZkBxxxxxxxxxxxxxxdDIwMjU=',
          'User-Agent' => 'Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)',
          'Blade-Auth' => 'bearer (null)'
        };

## Body ##############
{"password":"Passwort","tenantId":"","account":"mailadr@x.com","appId":"121c83f761305d6cf7b","grantType":"password","appType":"iOS"}

2025.04.16 13:05:49.711 5: ZendureBridge: <Get> called for ZendureBridge : msg = ?
2025.04.16 13:05:50.207 5: ZendureBridge: <parseRequestAnswer> URL:https://app.zendure.tech/eu/auth/app/token returned data:
## HTTP-Statuscode ###
200
## Data ##############
{"code":200,"success":true,"data":{"userType":"21","accessToken":"TOKENTOCKEN","userId":"ID123","tenantId":"","oauthId":"","avatar":"https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png","authority":"","userName":"","account":"","countryCode":"DE","serverNode":"eu","iotUrl":"mqtteu.zen-iot.com","iotUserName":"zenApp","iotPassword":"h+jwZvTlDg2e7g0lyMIkUlP5VraxLJtPgIUZohDg4SeR2n2eJrtoM+lFU4lrbBdaif4JpsA7vfhxAC3RLrrt0KUOhdiZUX1SsiYFESxz21K8M0nRHUkHn65uBYThA8SxGf84mvNesKyabW/rDrXnTyn1v6motJm/Am1bLA2WDh4=","serverNodeUrl":"https://app.zendure.tech/eu","serverH5Url":"https://app.zendure.tech","mallSwitch":1,"isNew":1,"whitelist":0,"hemsFlag":false,"zone":"Europe/Berlin"},"msg":"Vorgang erfolgreich"}
## Header ############
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Connection: close
Date: Wed, 16 Apr 2025 11:05:50 GMT
Access-Control-Allow-Methods: POST, GET, PATCH, DELETE, PUT
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Accept-Encoding,Host,Connection,Content-Length,User-Agent,Origin, X-Requested-With, Content-Type, Accept,blade-auth,authorization,Accept-Language,appVersion,captcha-code,captcha-key
Access-Control-Allow-Credentials: true
X-Cache: Miss from cloudfront
Via: 1.1 62be04c57195b92a15c9e33c0bb32906.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: MUC50-P5
X-Amz-Cf-Id: iczy7PXpHWxC3hAJnNfTnOreZFjlIu3LbJFHkYQRUgyukJMZkuzJgA==

2025.04.16 13:05:50.211 5: ZendureBridge: <Request> URL:https://app.zendure.tech/eu/productModule/device/queryDeviceListByConsumerId send:
## Header ############
$VAR1 = {
          'User-Agent' => 'Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)',
          'Authorization' => 'Basic Q29uc3VtZXJBcHA6NX4qUmRuTnJATWg0WjEyMw==',
          'Blade-Auth' => 'bearer TOKENTOCKEN',
          'Accept-Language' => 'de-DE',
          'Content-Type' => 'application/json',
          'Accept' => '*/*',
          'appVersion' => '4.3.1'
        };

## Body ##############
{}

2025.04.16 13:05:50.410 5: ZendureBridge: <parseRequestAnswer> URL:https://app.zendure.tech/eu/productModule/device/queryDeviceListByConsumerId returned data:
## HTTP-Statuscode ###
200
## Data ##############
{"code":200,"success":true,"data":[{"id":ID234,"deviceKey":"keydev","snNumber":"SNNR","name":"WER","productId":68,"productKey":"gDa3tb","onlineFlag":"00601","productName":"Hyper 2000","wifiStatus":true,"blueState":false,"fourGStatus":false,"isShareFlag":"00601","input":false,"output":false,"electricity":89,"hasPack":true,"restState":0,"upsMode":false,"upgradeStatusDes":"","productType":17,"deviceType":0,"upgradeStatus":{},"bindId":0,"bindStatus":0,"batteryCode":"","packList":[],"inputPower":0,"outputPower":0,"slowChargePower":0,"temperature":0,"temperatureUnit":0,"remainOutTime":0,"bindType":0,"seriesMode":0,"parallelMode":0,"networkType":0,"standard":"E","isSwitch":false,"url":"","remainOil":0,"genMode":0,"shortCode":"E1","phaseCheck":0,"pass":0,"clusterList":[],"clusterNotice":false,"nodeStatus":0,"clusterId":null,"phase":null,"reverseState":0,"meterId":0,"hemsId":0}],"msg":"Vorgang erfolgreich"}
## Header ############
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Connection: close
Date: Wed, 16 Apr 2025 11:05:50 GMT
Access-Control-Allow-Methods: POST, GET, PATCH, DELETE, PUT
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Accept-Encoding,Host,Connection,Content-Length,User-Agent,Origin, X-Requested-With, Content-Type, Accept,blade-auth,authorization,Accept-Language,appVersion,captcha-code,captcha-key
Access-Control-Allow-Credentials: true
X-Cache: Miss from cloudfront
Via: 1.1 3e8fb1cae95e63b7f329b9330db0c47a.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: MUC50-P5
X-Amz-Cf-Id: H5Z7GVvcq8bUyhpEHynJeM6p9-sL-Wje5A4IWr8EOkDbXQlsWpAqtA==

2025.04.16 13:05:50.412 5: ZendureBridge: <Request> URL:https://app.zendure.tech/as/tdengine/device/solarFlow/electric send:
## Header ############
$VAR1 = {
          'Accept' => '*/*',
          'appVersion' => '4.3.1',
          'Accept-Language' => 'de-DE',
          'Content-Type' => 'application/json',
          'User-Agent' => 'Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)',
          'Blade-Auth' => 'bearer TOKENTOCKEN'
        };

## Body ##############
{"deviceId":ID234,"beginDate":"2025-04-16","zone":"Europe/Berlin","type":0,"aceId":"","endDate":"2025-04-16"}

2025.04.16 13:05:50.413 5: ZendureBridge: <Request> URL:https://app.zendure.tech/as/tdengine/device/solarFlow/energy send:
## Header ############
$VAR1 = {
          'Accept' => '*/*',
          'appVersion' => '4.3.1',
          'Accept-Language' => 'de-DE',
          'Content-Type' => 'application/json',
          'User-Agent' => 'Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)',
          'Blade-Auth' => 'bearer TOKENTOCKEN'
        };

## Body ##############
{"beginDate":"2025-04-16","deviceId":ID234,"endDate":"2025-04-16","type":0,"zone":"Europe/Berlin","aceId":""}

2025.04.16 13:05:50.971 5: ZendureBridge: <parseRequestAnswer> URL:https://app.zendure.tech/as/tdengine/device/solarFlow/electric returned data:
## HTTP-Statuscode ###
200
## Data ##############
{"code":401,"success":false,"data":null,"msg":"Die Anfrage ist nicht autorisiert"}
## Header ############
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 82
Connection: close
Date: Wed, 16 Apr 2025 11:05:50 GMT
Access-Control-Allow-Headers: Accept-Encoding,Host,Connection,Content-Length,User-Agent,Origin, X-Requested-With, Content-Type, Accept,blade-auth,authorization,Accept-Language,appVersion,captcha-code,captcha-key
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, PATCH, DELETE, PUT
Access-Control-Max-Age: 3600
X-Cache: Miss from cloudfront
Via: 1.1 3909cd34f904454f54cf78c975b2c198.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: MUC50-P5
X-Amz-Cf-Id: 7azEWUOO3ymBT2ekQzo_n9AS4llT_O0h4N3O2gRvsQeuQjX6D8o4Uw==

2025.04.16 13:05:50.977 5: ZendureBridge: <parseRequestAnswer> URL:https://app.zendure.tech/as/tdengine/device/solarFlow/energy returned data:
## HTTP-Statuscode ###
200
## Data ##############
{"code":401,"success":false,"data":null,"msg":"Die Anfrage ist nicht autorisiert"}
## Header ############
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 82
Connection: close
Date: Wed, 16 Apr 2025 11:05:50 GMT
Access-Control-Allow-Headers: Accept-Encoding,Host,Connection,Content-Length,User-Agent,Origin, X-Requested-With, Content-Type, Accept,blade-auth,authorization,Accept-Language,appVersion,captcha-code,captcha-key
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, PATCH, DELETE, PUT
Access-Control-Max-Age: 3600
X-Cache: Miss from cloudfront
Via: 1.1 653de2a3596d1ebffe452d8daf65c9ea.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: MUC50-P5
X-Amz-Cf-Id: 4HWjfs5uvdTpPWjhMM8_11hZSenyOj-UgCbxClixKLMPKdCF6OJydw==

Auch funktionierende Lösungen kann man hinterfragen.

rabehd

get showdata enery und devicelist
2025.04.16 13:15:25.132 5: ZendureBridge: <Get> called for ZendureBridge : msg = ?
2025.04.16 13:16:40.809 5: ZendureBridge: <Get> called for ZendureBridge : msg = showData
2025.04.16 13:17:29.554 5: ZendureBridge: <Get> called for ZendureBridge : msg = ?
2025.04.16 13:17:35.588 5: ZendureBridge: <Get> called for ZendureBridge : msg = showData
Auch funktionierende Lösungen kann man hinterfragen.

RalfP

oh, sollte das wieder eine Thematik des Servers sein?
ZendureBridge: <Request> URL:https://app.zendure.tech/eu/auth/app/tokenDu bist auf dem eu Server. Shadow scheint auf dem v2 (global) zu sein. Bei ihm hat es ja funktioniert. Es war immer mal wieder Thema, das es mit dem eu Server manches Problem gab.
Wenn es daran liegen sollte, wird es schwierig, da ich nicht ohne Weiteres auf den eu Server umschalten kann ohne Daten (und evtl. Funktionalität meines Produktivsystems) zu verlieren. Könnte auch an den URL's liegen, die bei einem Token von einem eu Server woanders hingehen müssten.

Ich schaue jetzt mal in die Glaskugel: Sofern du im Code eine Änderung mal durchführen kannst, ändere doch mal den Link
my $url = "https://app.zendure.tech/as/tdengine/device/solarFlow/electric";

in

my $url = "https://app.zendure.tech/eu/tdengine/device/solarFlow/electric";

rabehd

Erfolgreich, danke

Zitat'msg' => 'Erfolgreiche Operation',

Device_xx_energy_batteryInput 75.23 2025-04-16 15:12:01
Device_xx_energy_batteryOutput 1885.49 2025-04-16 15:12:01
Device_xx_energy_bindDeviceInput 0 2025-04-16 15:12:01
Device_xx_energy_dcOutputTotal 0 2025-04-16 15:12:01
Device_xx_energy_gridDirectTotal 0 2025-04-16 15:12:01
Device_xx_energy_gridInputTotal 0 2025-04-16 15:12:01
Device_xx_energy_home 4058.56 2025-04-16 15:12:01
Auch funktionierende Lösungen kann man hinterfragen.

RalfP

...darauf muss man kommen  ::)

OK, werde es mit einbauen.

PS: war auch 'solar' dabei?

rabehd

Bezeichner in der App

energy_home = Heimgebrauch
energy_batteryOutput = Eingang (Akku); in der App in kWh
energy_batteryInput = Ausgang (Akku)
energy_solar = Energie erzeugt (Solar); in der App in kWh


Auch funktionierende Lösungen kann man hinterfragen.

rabehd

Zitat von: RalfP am 16 April 2025, 15:21:47...darauf muss man kommen  ::)

OK, werde es mit einbauen.

PS: war auch 'solar' dabei?
DU bist draufgekommen!

Ist doch gut, so hast Du einen Tester mit global und einen mit EU

Zitat von: RalfP am 16 April 2025, 15:21:47PS: war auch 'solar' dabei?
energy_solar = Energie erzeugt (Solar); in der App in kWh
Auch funktionierende Lösungen kann man hinterfragen.

RalfP

Hallo rabehd,

kannst du mir mal diese Werte aus GET showData Account zeigen? Würde vermuten, das beim eu Server es etwas anders aussieht.
'serverNode' => 'as',
'zone' => 'Asia/Shanghai',
'serverNodeUrl' => 'https://app.zendure.tech/as'
Grüße
Ralf

RalfP

Ich hab mal etwas Neues zum Testen.
Nur die Produkttypen 8 & 17 zeigen jetzt nur die relevanten, wie auch die totalen Werte an. Mit expert 1 oder einem anderem Produkttyp, werden wieder alle Daten gezeigt, aber keine totalen Werte.
Den richtigen Server nehme ich jetzt aus den Accountinfos, in der Hoffnung für den eu Server wird dort die richtige serverNodeUrl angezeigt.

Grüße
Ralf

rabehd

Hallo Ralf,

danke für Deinen Einsatz.
Ist damit die Aufgabe für mich aus #67 hinfällig?

Viele Grüße
Ralf
Auch funktionierende Lösungen kann man hinterfragen.

RalfP

...das ist meine Hoffnung. Die serverNodeUrl lasse ich jetzt auch in den Internals anzeigen.

rabehd

Version aus #68 funktioniert, danke Dir.
Jetzt warte ich auf die Sonne.


          'success' => 1,
          'data' => {
                      'userName' => '',
                      'authority' => '',
                      'userType' => '21',
                      'serverNodeUrl' => 'https://app.zendure.tech/eu',
                      'iotUrl' => 'mqtteu.zen-iot.com',
                      'hemsFlag' => 0,
                      'tenantId' => '',
                      'account' => '',
                      'isNew' => 1,
                      'zone' => 'Europe/Berlin',
                      'whitelist' => 0,
                      'iotUserName' => 'zenApp',
                      'serverH5Url' => 'https://app.zendure.tech',
                      'countryCode' => 'DE',
                      'serverNode' => 'eu',
                      'mallSwitch' => 1
                    },
          'code' => 200

Kann es sein, dass nach einem Neustart das Login manuell ausgeführt werden muss?
Auch funktionierende Lösungen kann man hinterfragen.

RalfP

Zitat von: rabehd am 17 April 2025, 06:51:19Kann es sein, dass nach einem Neustart das Login manuell ausgeführt werden muss?
Ja, das Login muss nach Neustart wieder ausgeführt werden, damit die Daten wieder in den Speicher geholt werden können.

Könnte mir auch noch ein Autologin vorstellen, wie auch einen Re-Login nach einer gewissen Zeit. Die max Gültigkeit eines Token ist 30 Tage.
Als nächstes werde ich erst einmal ZendureUtils nachziehen mit den neuen Funktionen.

PS: bei mir ist es sehr trüb, es scheint, das die Sonne sich heute nicht viel zeigen wird  :(

rabehd

Da ist ein Wert, der zu prüfen wäre.
'data' => {'gridInputTotal' => '9188.9'     },
'today' => {'gridInputTotal' => 0,          },
'success' => 1,
'msg' => 'Erfolgreiche Operation',
'code' => 200,
'total' => { 'gridInputTotal' => '9188.9', }
        };

Ich finde diesen Wert aber nicht in der App.

Auch funktionierende Lösungen kann man hinterfragen.

RalfP

ah, das wird dein Bezug von Energie aus dem Netz sein.
ZitatZendure: Die bidirektionale 1.200-Watt-Leistung kann nicht nur zur Stromversorgung Ihres Hauses, sondern auch zur Speicherung von Strom aus dem Netz verwendet werden.
Werde beim Hyper 2000 diesen Wert mit anzeigen lassen.