Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. ecoflow PowerOcean Script - Hilfe nötig

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    ecoflow PowerOcean Script - Hilfe nötig

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Allodo last edited by Allodo

      Hallo,

      ich habe eine PV-Anlage mit Komponenten von ecoflow PowerOcean (WR, Speicher und Wallbox). Diese würde ich gerne abfragen und zwar alle 1-2 Sekunden um den Energiefluss anzeigen zu lassen. Ich habe das Java-Beispiel zum laufen bekommen und kann Werte abfragen. Allerdings tue ich mich mit dem Javascript sehr schwer. Kenne mich mit HTTP Request leider gar nicht aus 😞

      Eine Verbindung kann ich herstellen, allerdings bekomme ich keine Werte.

      Hatte es zuerste mit Blockly versucht, aber da scheitere ich schon an der Parameter-Übergabe.
      Ich denke mein Primärproblem liegt beim Aufbau des korrekten Headers. Der Body ist das JSON-Objekt.

      Hier mal mein Script, wobei ich mir viel zusammengeschustert habe 😉

      var json_String, json_Objekt;
      
        json_String = '"{\\"sn\\":\\"SN-PowerOcean\\",\\"params\\":{\\"quotas\\":[\\"mpptHeartBeat\\"]}}"';
        json_Objekt = (function () { try { return JSON.parse(json_String); } catch (e) { return {}; }})();
      
      var myacceskey = "U-Name";
      var mysecretkey = "P-Word";
      
      const nonce = "640273";
      const timestamp = Date.now();
      const param = "params.quotas[0]=mpptHeartBeat&sn=SN-PowerOcean&accessKey=U-Name";
      const data = param + "&nonce" + nonce + "&timestamp" + timestamp;
      
      const CryptoJS = require('crypto');
      const signTerm = CryptoJS.createHmac('sha256', mysecretkey).update(Buffer.from(data, 'utf-8')).digest();
      
      const sign = signTerm.toString("base64");
      
      
      // @ts-ignore
      
      httpPost(
          'https://api.ecoflow.com/iot-open/sign/device/quota', json_Objekt, 
          {
              timeout: 2000,
              basicAuth: {
                  user: 'U-Name',
                  password: 'P-Word',
              },
                      headers: {
              'Authorization': sign
              },
          },
      
          (error, response) => {
              if (!error) {
                  console.log(response);
                  console.log("DATA: " + response.data);
                  console.log("HEADERS: " + response.headers);
              } else {
                  console.error(error);
              }
          }
      );
      

      Und hier die Log-Ausgabe:

      javascript.0	07:18:00.394	info	Start JavaScript script.js.Test2 (Javascript/js)
      javascript.0	07:18:00.401	info	script.js.Test2: httpPost(config={"method":"post","url":"https://api.ecoflow.com/iot-open/sign/device/quota","responseType":"text","responseEncoding":"utf8","timeout":2000,"auth":{"username":"U-Name","password":"P-Word"},"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Authorization":"Auth-Code"},"data":"{\"sn\":\"SN-PowerOcean\",\"params\":{\"quotas\":[\"mpptHeartBeat\"]}}"}, data={"sn":"SN-PowerOcean","params":{"quotas":["mpptHeartBeat"]}})
      javascript.0	07:18:00.409	info	script.js.Test2: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
      javascript.0	07:18:00.486	info	script.js.Test2: { statusCode: 200, data: '{"code":"8524","message":"some parameter is empty: accessKey,nonce,timestamp,sign","eagleEyeTraceId":"Trace-ID","tid":""}', headers: Object [AxiosHeaders] { date: 'Mon, 29 Jul 2024 05:18:00 GMT', 'content-type': 'application/json; charset=UTF-8', 'content-length': '145', connection: 'keep-alive', 'eagleeye-traceid': 'Trace-ID', vary: 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'x-timestamp': 'User-ID' } }
      javascript.0	07:18:00.487	info	script.js.Test2: DATA: {"code":"8524","message":"some parameter is empty: accessKey,nonce,timestamp,sign","eagleEyeTraceId":"Trace-ID","tid":""}
      javascript.0	07:18:00.487	info	script.js.Test2: HEADERS: date: Mon, 29 Jul 2024 05:18:00 GMT content-type: application/json; charset=UTF-8 content-length: 145 connection: keep-alive eagleeye-traceid: Trace-ID vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers x-timestamp: User-ID
      javascript.0	07:18:04.819	info	Stopping script script.js.Test2
      

      Hier mal ein Auszug aus dem Java Aufruf, wo ich Werte erhalte:

       private static void getQuotaPVdata() {
              String json = "{\"sn\":\"" + SN_WR + "\",\"params\":{\"quotas\":[\"mpptHeartBeat\"]}}";
              JSONObject jsonObject = JSONUtil.parseObj(json);
              String response = HttpUtil.execute(HttpMethod.POST, GET_QUOTA_URL, jsonObject, ACCESS_KEY, SECRET_KEY);
              System.out.println("response: getQuotaPVData|" + response);
       }
        .
        .
        .
        HttpUtil.execute(HttpMethod httpMethod, String url, JSONObject req, String accessKey, String secretKey) {
        response = httpClient.execute(getHttpUriRequest(httpMethod, url, req, accessKey, secretKey));
        } 
        
         public static HttpUriRequest getHttpUriRequest(HttpMethod httpMethod, String url, JSONObject req, String accessKey, String secretKey) {
              String nonce = RandomUtils.nextInt(10000, 1000000) + "";
              String timestamp = System.currentTimeMillis() + "";
      
              SortedMap<String, Object> sortKeyValueMap = new TreeMap<>();
              if (!Objects.isNull(req)) {
                  sortKeyValueMap = MyMapUtil.getMapFromObject(req);
              }
              String queryString = MyMapUtil.getKeyValueString(sortKeyValueMap); (Wert: params.quotas[0]=mpptHeartBeat&sn=SN-PowerOcean)
              String keyValueString = MyMapUtil.appendAccessKey(queryString, accessKey, nonce, timestamp); (Wert: params.quotas[0]=mpptHeartBeat&sn=SN-PowerOcean&accessKey=U-Name&nonce=650037&timestamp=1722231467572)
              String sign = EncryptUtil.encryptHmacSHA256(keyValueString, secretKey);
      
              queryString = URLEncoder.createDefault().encode(queryString, StandardCharsets.UTF_8);
              HttpUriRequest httpUriRequest = null;
              switch (httpMethod) {
                  case GET:
                      httpUriRequest = new HttpGet(String.format("%s?%s", url, queryString));
                      break;
                  case PUT:
                      HttpPut httpPut = new HttpPut(url);
                      httpPut.addHeader("Content-Type", "application/json;charset=UTF-8");
                      buildBody(httpPut, req);
                      httpUriRequest = httpPut;
                      break;
                  case POST:
                      HttpPost httpPost = new HttpPost(url);
                      httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");
                      buildBody(httpPost, req);
                      httpUriRequest = httpPost;
                      break;
                  case DELETE:
                      httpUriRequest = new HttpDelete(String.format("%s?%s", url, queryString));
                      break;
                  default:
                      System.out.println(String.format("httMethod not match|url=%s,httpMethod=%s", url, httpMethod));
                      throw new RuntimeException("httMethod not match");
              }
              httpUriRequest.addHeader(ACCESS_KEY, accessKey);
              httpUriRequest.addHeader(NONCE, nonce);
              httpUriRequest.addHeader(TIMESTAMP, timestamp);
              httpUriRequest.addHeader(SIGN, sign);
              return httpUriRequest;
          }
      
      

      Und so sieht die Antwort in Java aus:

      response: getQuotaPVData|{"code":"0","message":"Success","data":{"mpptHeartBeat":[{"mpptPv":[{"vol":478.99057,"amp":0.48060158,"pwr":230.20363},{"vol":429.51254,"amp":7.4760933,"pwr":3211.076}]}]},"eagleEyeTraceId":"Trace-ID","tid":""}
      

      Das Ganze muss ich dann später noch auseinandernehmen. Derzeit wäre ich aber schon froh, wenn ich überhaupt diese Antwort bekäme.

      1 Reply Last reply Reply Quote 0
      • First post
        Last post

      Support us

      ioBroker
      Community Adapters
      Donate

      402
      Online

      31.8k
      Users

      80.0k
      Topics

      1.3m
      Posts

      1
      1
      301
      Loading More Posts
      • Oldest to Newest
      • Newest to Oldest
      • Most Votes
      Reply
      • Reply as topic
      Log in to reply
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
      The ioBroker Community 2014-2023
      logo