# Trying to get data from solis API

**URL:** <https://discourse.nodered.org/t/trying-to-get-data-from-solis-api/91093>\
**Category:** General\
**Created:** [19 September 2024 06:17 UTC](https://discourse.nodered.org/t/trying-to-get-data-from-solis-api/91093 "2024-09-19T06:17:37Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [19 September 2024 07:51 UTC](https://discourse.nodered.org/t/trying-to-get-data-from-solis-api/91093/2 "2024-09-19T07:51:26Z")

</div>

the payload is just an Object.

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/5/e/5e0ef714bc625ded714ee641e35c1309978b8c84.png)

the _difficult_ part is the Auth header.

This is my take from the (not so great docs).  
NOTE: The URL and some other fields will need to be set up.  
NOTE2: I have no idea if this will work but it should get you moving.

```js
// MD5 the payload
const payload = JSON.stringify(msg.payload)
const md5Hash = crypto.createHash('md5').update(payload, 'utf8').digest();
const contentMD5 = md5Hash.toString('base64')

// extract other params or defaults
msg.method = msg.method || 'POST'
const canonicalResource = msg.canonicalResource || "/v1/api/inverterDetail"
const apiSecret = msg.secret || 'test-key'
const apiId = msg.apiId || 'your-api-id'
const contentType = 'application/json;charset=UTF-8' // fixed

// this might need some work - just hoping the UTC format works
const date = new Date().toUTCString()

// Generate the HMAC SHA-1 signature
const stringToSign = [
    msg.method, // HTTP verb
    contentMD5,
    contentType,
    date,
    canonicalResource
].join('\n')

const hmac = crypto.createHmac('sha1', apiSecret)
hmac.update(stringToSign)
const signature = hmac.digest('base64')

// add auth header
msg.headers = msg.headers || {}
msg.headers.Authorization = `API ${apiId}:${signature}`

// set full URL
msg.url = `https://host/${canonicalResource}`

return msg;

```

example:

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/a/8/a8478be6e95a75dda1843ec6c712a3c453b3f213.png)

demo flow

```auto
[{"id":"097d84fb54289894","type":"function","z":"02d4291f2e0c055e","name":"apply auth header","func":"// MD5 the payload\nconst payload = JSON.stringify(msg.payload)\nconst md5Hash = crypto.createHash('md5').update(payload, 'utf8').digest();\nconst contentMD5 = md5Hash.toString('base64')\n\n// extract other params or defaults\nmsg.method = msg.method || 'POST'\nconst canonicalResource = msg.canonicalResource || \"/v1/api/inverterDetail\"\nconst apiSecret = msg.secret || 'test-key'\nconst apiId = msg.apiId || 'your-api-id'\nconst contentType = 'application/json;charset=UTF-8' // fixed\n\n// this might need some work - just hoping the UTC format works\nconst date = new Date().toUTCString()\n\n// Generate the HMAC SHA-1 signature\nconst stringToSign = [\n msg.method, // HTTP verb\n contentMD5,\n contentType,\n date,\n canonicalResource\n].join('\\n')\n\nconst hmac = crypto.createHmac('sha1', apiSecret)\nhmac.update(stringToSign)\nconst signature = hmac.digest('base64')\n\n// add auth header\nmsg.headers = msg.headers || {}\nmsg.headers.Authorization = `API ${apiId}:${signature}`\n\n// set full URL\nmsg.url = `https://host/${canonicalResource}`\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"crypto","module":"crypto"}],"x":560,"y":300,"wires":[["171900bd52625a4f","0bb9c7398219b913"]]},{"id":"1fa080ee367fed3e","type":"inject","z":"02d4291f2e0c055e","name":"test object id + sn","props":[{"p":"payload"},{"p":"method","v":"POST","vt":"str"},{"p":"canonicalResource","v":"/v1/api/inverterDetail","vt":"str"},{"p":"apiId","v":"my-api-id","vt":"str"},{"p":"secret","v":"my=secret","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{ \"id\": \"1308675217944611083\", \"sn\": \"120B40198150131\" }","payloadType":"json","x":340,"y":300,"wires":[["097d84fb54289894"]]},{"id":"171900bd52625a4f","type":"http request","z":"02d4291f2e0c055e","d":true,"name":"","method":"use","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":790,"y":300,"wires":[["80adcc939017ae7d"]]},{"id":"0bb9c7398219b913","type":"debug","z":"02d4291f2e0c055e","name":"debug 199","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":790,"y":240,"wires":[]},{"id":"80adcc939017ae7d","type":"debug","z":"02d4291f2e0c055e","name":"debug 198","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1010,"y":300,"wires":[]}]

```

---

_[View the full topic](https://discourse.nodered.org/t/trying-to-get-data-from-solis-api/91093)._
