Seite 1 von 1

[V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: Mo Nov 03, 2025 9:16 pm
von CHD
Hallo zusammen,

nachdem mich dieses Velux ...-Dings vom Typ KFL200 zur Steuerung meines Dachfensters und Rollos an den Rand des Wahnsinns gebracht hat, hatte ich mich dazu entschieden, die Steuerung auf die TaHoma switch von Somfy zu ändern. Die lässt sich im Developermodus lokal und ohne Cloud steuern und ist zu anderen io-steuerbaren Produkten kompatibel. Das habe ich trotz meiner wenigen Kenntnisse bei API-Anwendungen soweit auch am laufen.

Jetzt komme ich nur beim "zusammenbauen" der eigentlichen Befehle und Abfragen nicht weiter. Vielleicht springt einem von euch das ja direkt ins Auge, wie ich den JSON zusammenbauen muss bzw. welche Selektoren genutzt werden müssen und welches Format...

Die Doku ist hier zu finden und dort gibt es auch einen Link zu Swagger.

https://github.com/Somfy-Developer/Somf ... me-ov-file

Dort habe ich den JSON gefunden und als Objekt zur Abfrage im TWS nachgebaut. Danke dann der Stelle auch für den Code aus dem Erfahrungsbericht hier viewtopic.php?p=62435&hilit=husquarna#p62435 , welchen ich für die Strings gut nutzen konnte.

Bild

Also, demnach muss ich doch alle Werte als STRING übergeben, oder? Ich habe davon abweichend auch einfach mal andere Selektoren bzw. Namen ausprobiert, aber noch ohne Erfolg.

Also zusammengefasst:
1) Welche Selektoren muss ich für z.B. öffnen, schließen und Zwischenstellungen ansprechen? Vielleicht hat da jemand einen Hinweis, damit ich an der richtigen Stelle weitersuchen kann. Ich finde da keine Erklärung zu, was was in dem JSON genau bewirkt. Ganz unten hänge ich noch eine Antwort auf die Abfrage des Rollos (Blind) an.
2) Welches Datenformat ist ggf. korrekt?

Abschließend noch ein Screenshot, wie das aktuell aussieht:
Bild
Und da man die Antwort nicht komplett lesen kann hier vollständig eingefügt:
{
"errorCode": "INVALID_PARAMETER",
"error": "Bad parameters. (\"[actions] content is not valid wrong type of iteration, expecting number iterator, got string iterator\")"
}

Der Antwort nach stört die API sich doch am STRING, oder was bedeutet das genau? Nach dem Swagger-Beispiel ist doch aber ein String erforderlich...

Und hier noch die Antwort zum Rollo, wenn ich die Device URL abfrage. Ich vermute mal, dass dort eigentlich alles zu wichtige zu erkennen sein sollte, wenn man das gewohnt ist und versteht.... Eventuell kann das ja jemand einmal grob und strukturiert erklären, wie man sowas aufbröselt und dabei vorgeht. Irgendwie hänge ich da nämlich gerade fest.

Code: Alles auswählen

{
  "enabled": true,
  "subsystemId": 0,
  "deviceURL": "io://XYZXYZXYZ",
  "synced": true,
  "label": "Blind",
  "type": 1,
  "definition": {
    "type": "ACTUATOR",
    "attributes": [
      {
        "name": "core:Manufacturer"
      },
      {
        "name": "core:FirmwareRevision"
      }
    ],
    "widgetName": "PositionableTiltedScreen",
    "states": [
      {
        "name": "core:PriorityLockTimerState"
      },
      {
        "name": "io:PriorityLockLevelState"
      },
      {
        "name": "io:PriorityLockOriginatorState"
      },
      {
        "name": "core:CommandLockLevelsState"
      },
      {
        "name": "core:SecuredPositionState"
      },
      {
        "name": "core:DiscreteRSSILevelState"
      },
      {
        "name": "core:RSSILevelState"
      },
      {
        "name": "core:Memorized1PositionState"
      },
      {
        "name": "core:ClosureState"
      },
      {
        "name": "core:OpenClosedState"
      },
      {
        "name": "core:NameState"
      },
      {
        "name": "core:StatusState"
      }
    ],
    "commands": [
      {
        "commandName": "open",
        "nparams": 0
      },
      {
        "commandName": "stop",
        "nparams": 0
      },
      {
        "commandName": "resetLockLevels",
        "nparams": 0
      },
      {
        "commandName": "identify",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "setName",
        "paramsSig": "p1"
      },
      {
        "nparams": 1,
        "commandName": "addLockLevel",
        "paramsSig": "p1,*p2"
      },
      {
        "nparams": 1,
        "commandName": "setClosure",
        "paramsSig": "p1"
      },
      {
        "commandName": "down",
        "nparams": 0
      },
      {
        "commandName": "up",
        "nparams": 0
      },
      {
        "commandName": "stopIdentify",
        "nparams": 0
      },
      {
        "commandName": "startIdentify",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "pairOneWayController",
        "paramsSig": "p1,*p2"
      },
      {
        "commandName": "getName",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "delayedStopIdentify",
        "paramsSig": "p1"
      },
      {
        "commandName": "my",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "removeLockLevel",
        "paramsSig": "p1"
      },
      {
        "nparams": 1,
        "commandName": "setSecuredPosition",
        "paramsSig": "p1"
      },
      {
        "nparams": 1,
        "commandName": "setPosition",
        "paramsSig": "p1"
      },
      {
        "nparams": 1,
        "commandName": "setMemorized1Position",
        "paramsSig": "p1"
      },
      {
        "nparams": 1,
        "commandName": "setConfigState",
        "paramsSig": "p1"
      },
      {
        "commandName": "refreshMemorized1Position",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "unpairOneWayController",
        "paramsSig": "p1,*p2"
      },
      {
        "commandName": "close",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "advancedRefresh",
        "paramsSig": "p1,*p2"
      },
      {
        "commandName": "unpairAllOneWayControllers",
        "nparams": 0
      },
      {
        "nparams": 1,
        "commandName": "wink",
        "paramsSig": "p1"
      }
    ],
    "uiClass": "Screen"
  },
  "states": [
    {
      "type": 3,
      "value": "normal",
      "name": "core:DiscreteRSSILevelState"
    },
    {
      "type": 1,
      "value": 76,
      "name": "core:RSSILevelState"
    },
    {
      "type": 3,
      "value": "Blind",
      "name": "core:NameState"
    },
    {
      "type": 1,
      "value": 0,
      "name": "core:ClosureState"
    },
    {
      "type": 3,
      "value": "open",
      "name": "core:OpenClosedState"
    },
    {
      "type": 11,
      "value": [],
      "name": "core:CommandLockLevelsState"
    },
    {
      "type": 1,
      "value": 0,
      "name": "core:Memorized1PositionState"
    },
    {
      "type": 3,
      "value": "available",
      "name": "core:StatusState"
    }
  ],
  "controllableName": "io:VerticalInteriorBlindVeluxIOComponent",
  "available": true,
  "attributes": [
    {
      "type": 3,
      "value": "VELUX",
      "name": "core:Manufacturer"
    },
    {
      "type": 3,
      "value": "00000000000000000004",
      "name": "core:FirmwareRevision"
    }
  ]
}
Vielen Dank im Voraus :bow-yellow:

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: So Nov 09, 2025 9:58 pm
von CHD
OK, ihr hatte eure Chance, jetzt beantworte ich das mal selber. :lol:

Das Problem bestand darin, dass ich für die Übergabe der Daten auch JSON Arrays bilden und übergeben musste, die mit den []-Klammern. Da ich damit zuvor noch nie gearbeitet habe, hat es einiges an Zeit gekostet, das überhaupt zu erkennen und dann auch noch herauszufinden, wie genau ich das mit dem TWS bewerkstelligen kann.

Aber jetzt kann ich einen ersten Erfolg vermelden und das Veluxrollo lokal über die API ansteuern. :dance:

Dennoch Danke an alle, die sich an dieser Stelle Gedanken gemacht haben. :handgestures-salute:

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: So Nov 09, 2025 10:00 pm
von CHD
Kann einer der Moderatoren die Frage bitte auf "gelöst" stellen. Vielen Dank!

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: Di Nov 11, 2025 6:03 pm
von Doscre
Hi,

ich wäre an der Lösungsfindung interessiert, wie Du das JSON im Timberwolf zusammengebaut hast.:-)

Danke.

VG

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: Di Nov 11, 2025 7:47 pm
von CHD
Klar, gerne. Ich habe die Selektoren einmal wie im TWS-WIKI in die Bezeichnung kopiert, damit man das auf einem Blick sieht:

Bild

Und hier im Detail. Ausgelöst wird die Übertragung aber nur bei Änderung des Wert-Objekts (das zweite folgende Bild). Die zwei nicht gezeigten Objekte zur Anfrage sehen entsprechend aus wie das erste Bild hier, aber natürlich mit den entsprechenden Selektoren.

Bild

Bild

Was mich noch irritiert: Ich übergebe als Wert einen Integer, laut Swagger (siehe oben im #1 Post) erwartet die API aber einen STRING... Na ja, vielleicht falsch in der Doku... So wie bei mir tut es bisher, ich kann das Rollo damit auf und zu fahren. Mehr konnte ich aber auch noch nicht testen...

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: Fr Nov 14, 2025 12:02 pm
von Doscre
Hi,

Danke für die Rückmeldung!

Zum Übergeben der Inhalte (Zusammenbauen des JSONs) hast Du dir eine Custom Logik angelegt, wo die Strings einfach als Parmeter übergeben werden?

VG

Re: [V4.8 DEV] Frage zur Somfy TaHoma local API zur Steuerung von Velux auf dem Timberwolf

Verfasst: Fr Nov 14, 2025 3:39 pm
von CHD
Ja korrekt. Die habe ich einfach aus dem Erfahrungsbericht zur Husqvarna Automower HTTP-API abfragen kopiert (dort Beitrag 8 ziemlich am Schluss), den ich im Beitrag #1 verlinkt habe. Muss ich auch bei Gelegenheit noch mal schön machen, aber "tuts".