Insider Preview IP 2 zur V 4.8 - veröffentlicht

Verehrte Nutzer des Timberwolf Servers. Wir haben die IP2 zur nächsten Hauptversion 4.8 für alle Modelle des Timberwolf Servers freigegeben.

Bild

Diese neue Version enthält tolle Erweiterungen zur Timberwolf VISU mit Jalousie Widget, neuen herbstlichen Hintergründen und freier Hintergrundangabe per RGB / CSS



Release Notes im Wiki: https://elabnet.atlassian.net/wiki/x/AQDpzg


AKTION: Bitte unterstütze uns mit einem Software-Wartungsvertrag, damit wir dieses Projekt fortführen können und damit Dein Server weiterhin Updates, Upgrades und Support erhält. Jetzt in der Aktion schenken wir Dir den Insider Club mit derselben Laufzeit wie der am längsten laufende aktive Wartungsvertrag dazu - bei sofortigem Laufzeitbeginn. Damit profitierst Du auch von einer vorzeitigen Verlängerung. Alle Infos: https://elabnet.atlassian.net/wiki/x/GQB8z

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

Wissen, Planung & Diskussion zur Unterstützung von Rest-API & Webabfragen im Timberwolf Server.
Stellt uns hier Eure Projekte und Ideen vor.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
Antworten

Ersteller
CHD
Beiträge: 372
Registriert: Fr Dez 14, 2018 9:32 pm
Wohnort: Gronau
Hat sich bedankt: 1133 Mal
Danksagung erhalten: 227 Mal

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

#1

Beitrag 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:
Zuletzt geändert von Parsley am Di Nov 04, 2025 9:07 pm, insgesamt 1-mal geändert.
Viele Grüße, Christian

Timberwolf Server 2600 #200 ULTRA842 / PBM #778 / PBM #779 / PBM #780 / Reboot erlaubt / VPN offen
Timberwolf Server 3500XL #1715 ULTRA323 / Reboot erlaubt / VPN offen

Ersteller
CHD
Beiträge: 372
Registriert: Fr Dez 14, 2018 9:32 pm
Wohnort: Gronau
Hat sich bedankt: 1133 Mal
Danksagung erhalten: 227 Mal

#2

Beitrag 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:
Viele Grüße, Christian

Timberwolf Server 2600 #200 ULTRA842 / PBM #778 / PBM #779 / PBM #780 / Reboot erlaubt / VPN offen
Timberwolf Server 3500XL #1715 ULTRA323 / Reboot erlaubt / VPN offen

Ersteller
CHD
Beiträge: 372
Registriert: Fr Dez 14, 2018 9:32 pm
Wohnort: Gronau
Hat sich bedankt: 1133 Mal
Danksagung erhalten: 227 Mal

#3

Beitrag von CHD »

Kann einer der Moderatoren die Frage bitte auf "gelöst" stellen. Vielen Dank!
Viele Grüße, Christian

Timberwolf Server 2600 #200 ULTRA842 / PBM #778 / PBM #779 / PBM #780 / Reboot erlaubt / VPN offen
Timberwolf Server 3500XL #1715 ULTRA323 / Reboot erlaubt / VPN offen

Doscre
Beiträge: 9
Registriert: Mi Dez 23, 2020 5:12 pm
Hat sich bedankt: 1 Mal
Danksagung erhalten: 6 Mal

#4

Beitrag von Doscre »

Hi,

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

Danke.

VG
TWS 2500 ID:465 (VPN offen, Reboot nach Rücksprache)

Ersteller
CHD
Beiträge: 372
Registriert: Fr Dez 14, 2018 9:32 pm
Wohnort: Gronau
Hat sich bedankt: 1133 Mal
Danksagung erhalten: 227 Mal

#5

Beitrag 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...
Viele Grüße, Christian

Timberwolf Server 2600 #200 ULTRA842 / PBM #778 / PBM #779 / PBM #780 / Reboot erlaubt / VPN offen
Timberwolf Server 3500XL #1715 ULTRA323 / Reboot erlaubt / VPN offen

Doscre
Beiträge: 9
Registriert: Mi Dez 23, 2020 5:12 pm
Hat sich bedankt: 1 Mal
Danksagung erhalten: 6 Mal

#6

Beitrag 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
TWS 2500 ID:465 (VPN offen, Reboot nach Rücksprache)

Ersteller
CHD
Beiträge: 372
Registriert: Fr Dez 14, 2018 9:32 pm
Wohnort: Gronau
Hat sich bedankt: 1133 Mal
Danksagung erhalten: 227 Mal

#7

Beitrag 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".
Zuletzt geändert von CHD am Fr Nov 14, 2025 3:40 pm, insgesamt 1-mal geändert.
Viele Grüße, Christian

Timberwolf Server 2600 #200 ULTRA842 / PBM #778 / PBM #779 / PBM #780 / Reboot erlaubt / VPN offen
Timberwolf Server 3500XL #1715 ULTRA323 / Reboot erlaubt / VPN offen
Antworten

Zurück zu „HTTP-API, REST & Web-Abfragen“