POST med form-data (Somfy-integrasjon)

Hei

Er det mulig å gjøre en POST-request med form-data?

Bakgrunn:
Forsøker å sette opp en enkel flyt for å kontrollere mine Somfy-solskjermer via en Connexoon-boks.
Det finnes et uoffisielt API som bl.a. brukes av Home Assistant, og et Python-prosjekt her: GitHub - dmaasland/python-tahoma-api: Async Python wrapper to interact with internal Somfy TaHoma API, or other OverKiz API's.

For min del trenger jeg egentlig bare å gjøre et login-kall med brukernavn/passord, etterfulgt av et kall med en kommando. Det fungerer fint via f.eks. Curl eller Postman.
Login:

curl --location --request POST 'https://tahomalink.com/enduser-mobile-web/enduserAPI/login' \
--form 'userId="xxx@xxx.no"' \
--form 'userPassword="xxx"' -v

Får da en Set-Cookie med en JSESSIONID i response header, som jeg kan bruke videre.

Lukk en solskjerm:

curl --location --request POST 'https://tahomalink.com/enduser-mobile-web/enduserAPI/exec/apply' \
--header 'Content-Type: application/json' \
--header 'Cookie: JSESSIONID=xxx' \
--data-raw '{
    "actions": [{"deviceURL": "io://xxx", "commands": ["close"]}]
}'

Har også begynt på en flyt som fungerer bra så lenge jeg har en fersk JSESSIONID.
Skjermbilde 2022-01-17 kl. 15.10.31

{
  "Id": "up3cVaWmxToMz1h",
  "ClassId": "dkUbz2L4rwiotuU",
  "Author": "",
  "Version": 0,
  "CreatedAt": "2022-01-15T02:27:38.208780302+01:00",
  "UpdatedAt": "2022-01-16T23:39:00.525098419+01:00",
  "Name": "Solskjerm_venstre",
  "Group": "Somfy",
  "Description": "",
  "Nodes": [
    {
      "Id": "1",
      "Type": "trigger",
      "Label": "Screen",
      "SuccessTransition": "2",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "pt:j1/mt:cmd/rt:dev/rn:flow/ad:1/sv:out_bin_switch/ad:up3cVaWmxToMz1h_0",
      "Service": "barrier_ctrl",
      "ServiceInterface": "cmd.tstate.set",
      "Config": {
        "ConnectorID": "",
        "InputVariableType": "",
        "IsValueFilterEnabled": false,
        "LookupServiceNameAndLocation": false,
        "PropFilterName": "",
        "PropFilterValue": "",
        "RegisterAsVirtualService": true,
        "Timeout": 0,
        "ValueFilter": {
          "Value": null,
          "ValueType": "string"
        },
        "ValueJPath": "",
        "ValueJPathResultType": "",
        "VirtualServiceGroup": "ch_0",
        "VirtualServiceProps": null
      },
      "Ui": {
        "nodeType": "",
        "x": 150,
        "y": 176
      },
      "TypeAlias": "Trigger",
      "LastValue": "open"
    },
    {
      "Id": "2",
      "Type": "if",
      "Label": "If open",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Expression": [
          {
            "BooleanOperator": "",
            "LeftVariableIsGlobal": false,
            "LeftVariableName": "",
            "Operand": "eq",
            "RightVariable": {
              "Value": "open",
              "ValueType": "string"
            }
          }
        ],
        "FalseTransition": "4",
        "TrueTransition": "3"
      },
      "Ui": {
        "nodeType": "",
        "x": 151,
        "y": 356
      },
      "TypeAlias": "If condition"
    },
    {
      "Id": "3",
      "Type": "rest_action",
      "Label": "Open screen",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Auth": {
          "ClientID": "",
          "ClientSecret": "",
          "Enabled": false,
          "GrantType": "",
          "Scope": "",
          "Url": "",
          "userId": "",
          "userPassword": ""
        },
        "Headers": [
          {
            "Name": "Cookie",
            "Value": "JSESSIONID=<fjernet>"
          },
          {
            "Name": "Content-Type",
            "Value": "application/json"
          }
        ],
        "LogResponse": true,
        "Method": "POST",
        "RequestPayloadType": "json",
        "RequestTemplate": "{\n    \"actions\": [{\"deviceURL\": \"io://<fjernet>\", \n    \"commands\": [\"open\"]}]\n}",
        "ResponseMapping": [],
        "Url": "https://tahomalink.com/enduser-mobile-web/enduserAPI/exec/apply"
      },
      "Ui": {
        "nodeType": "",
        "x": 32,
        "y": 535
      },
      "TypeAlias": "HTTP msg"
    },
    {
      "Id": "4",
      "Type": "rest_action",
      "Label": "Close screen",
      "SuccessTransition": "",
      "TimeoutTransition": "",
      "ErrorTransition": "",
      "Address": "",
      "Service": "",
      "ServiceInterface": "",
      "Config": {
        "Auth": {
          "ClientID": "",
          "ClientSecret": "",
          "Enabled": false,
          "GrantType": "",
          "Password": "",
          "Scope": "",
          "Url": "",
          "Username": ""
        },
        "Headers": [
          {
            "Name": "Cookie",
            "Value": "JSESSIONID=<fjernet>"
          },
          {
            "Name": "Content-Type",
            "Value": "application/json"
          }
        ],
        "LogResponse": false,
        "Method": "POST",
        "RequestPayloadType": "json",
        "RequestTemplate": "{\n    \"actions\": [{\"deviceURL\": \"io://<fjernet>\", \n    \"commands\": [\"close\"]}]\n}",
        "ResponseMapping": [],
        "Url": "https://tahomalink.com/enduser-mobile-web/enduserAPI/exec/apply"
      },
      "Ui": {
        "nodeType": "",
        "x": 306,
        "y": 532
      },
      "TypeAlias": "HTTP msg"
    }
  ],
  "Settings": null,
  "IsDisabled": false,
  "IsDefault": false,
  "ParallelExecution": "parallel"
}

Denne flyten lar meg legge til en solskjerm i appen og jeg kan styre den i noen minutter.
Det jeg forsøker er å sette inn en node som henter JSESSIONID før kommando-kallet, men jeg kan kun velge json eller xml som payload. Er det mulig å bruke form-data på et vis ved å kode dette rett i source, og hente data fra response header?

Så litt på å lage en app i Playground, som hadde vært den beste løsningen. Men foreløpig føler jeg det blir litt for omfattende og tidkrevende å sette meg inn i.

Løste det foreløpig ved å gå via en Firebase Cloud Function som jeg lagde for formålet, så får jeg se om jeg får tid til å lage en Edge-app senere.

1 Like