API Fehler - Cannot Post?

Hallo,

ich möchte eine Lampe via API ein-/ausschalten.

Dazu habe ich folgende cURL Funktion gefunden:

$homeyProUrl = "http://192.168.xxx.xxx/api/manager/devices/xxxxxxxxxxx/action";
$apiKey = "xxxxxxxxxxxx";

$data = array(
    "command" => "turn_on" // Oder andere Befehle wie "turn_off", "dim" usw.
);

$ch = curl_init($homeyProUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: Bearer ' . $apiKey,
    'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Fehler: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

Hier erhalte ich folgenden Fehler:

Cannot POST /api/manager/devices/xxxxxxx/action

Woran könnte das liegen?

Die gesetzte URL ist so korrekt?

Und auf welchem System läuft das Skript, nicht Homey, oder?

Nein, PHP auf einem lokalen Webserver. (Zugriff auf Homey Pro early 2023)

Fügen Sie eine zusätzliche Zeile hinzu, um zu sehen, was die komplette Zeichenfolge $ch ist, und verwenden Sie sie in einer Telnet-Sitzung, um zu sehen, ob Ihre HTTP-Anfrage in Ordnung ist.

Und wenn nicht, fragen Sie dort, wo Sie den Code gefunden haben.

@RMB Hört sich an wie eine Antwort von ChatGPD (?) :wink: Ist leider nicht wirklich hilfreich…

Ich meine das hier in diesem Forum gefunden zu habe und habes es kopiert…

Ich denke meine Frage mit dem cURL-Fehler ist sehr Homey bezogen, speziell auf die API. So bin ich hier doch richtig mit meiner Anfrage, oder?

(Denn an cURL ansich, liegt es nicht)

Vielleicht können Sie den Link posten, wo Sie diesen Code in diesem Forum gefunden haben. Das wiederum gibt etwas mehr Kontext.

Mir fallen mehrere Dinge am Code auf, z. B. Sie verwenden z.B. keinen Webhook, und die Zeichenfolge „Aktion“ scheint in Ihrer URL statt „Turn-on“ zu sein, aber das muss ich herausfinden. Wenn Sie den Code nicht selbst debuggen wollen, hört es auch für mich auf. Ich werde das wirklich nicht für Sie tun.

Nicht nur die URL muss korrekt sein, sondern auch die gesamte POST-Anfrage.

Hmm, hatte das Beispiel irgendwann mal kopiert und bin jetzt zum testen gekommen. Habe keine Idee wo ich das tatsächlich mal gefunden habe.

Habe das ganze jetzt mit Webhook und cURL umgesetzt, wofür ich auch keinen API-Key benötige. cURL nutze ich um mal eine Auth einzufügen, die ja nicht gerade in der URL beinhaltet sein soll :wink:

Nun stellt sich mir noch die Frage, ob mit Webhook auch der Device-Status (on/off) abgefragt werden kann.

http://xx.xx.xx.xx/webhook?event=test
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  

liefert mir aktuell als Return lediglich ein “OK”…

Ich denke, du brauchst keine curl Befehlsgewalt, siehst du https://support.homey.app/hc/en-us/articles/18292876827548-Using-Webhooks-with-Homey

Im Übrigen erfordert die Verwendung von Homey API mehr als nur den von Ihnen gefundenen Code: https://api.developer.homey.app/

Ich glaube, Ihr gefundener Code hat das Regal völlig verfehlt.

1 Like

Ich würde hier ebenfalls mit webhooks arbeiten. Das ist für deine hier genannte Situation zielführender.

1 Like

Ja, war mal ein kurzes reinschnuppern :innocent: werde mich bei Gelegenheit mal intensiver mit der API beschäftigen. @Rmb Vielen Dank für dein Feedback.

Zu den Webhooks… Gibt es hier auch eine Möglichkeit damit gleichzeitig den Device Status (on/off) zurück zu erhalten?

Ich könnte alternativ mit dem Webhook ein Flow anstoßen, mit dem ich mir mit einem HTTP Request den Status abrufen könnte… Wäre jedoch schon bei 10 Devices ein Ressourcen intensives unterfangen (doppelt gemoppelt).

Mit einem Webhook starten Sie einen Flow, aber soweit ich weiß, können Sie mit einem Webhook keine Informationen zurückgeben. Sie könnten dies dann von Ihrem Flow mit einer HTTP-Anfrage an Ihren Server tun.

Ich weiß nicht genau, was Ihr ultimatives Ziel ist, aber wenn Sie auch Ihr Haus auf Ihrem Server steuern wollen, sollten Sie sich vielleicht MQTT ansehen. Dafür gibt es verschiedene Homey Apps.

Nun, ich habe eine umfangreiche Anwendung (PHP, auf Hybrid Global/Local webserver) in die ich Homey als IoT-Schnittstelle integrieren möchte. Hier möchte ich ua. registrierten User mit entsprechender Berechtigung die Möglichkeit geben, Device Status abzufragen und diese auch zu schalten. Hier kommt insbesondere das beachtliche und geniale Modul Advanced-Flow ins spiel, was mir tatsächlich viel (Script-) Arbeit erspart.

Idealerweise möchte ich auf so wenig Homey-Apps zurückgreifen wie möglich, obwohl MQTT sicherlich die richtige Wahl wäre…

Hast Du jetzt eine Lösung für dein Problem ?

Ich würde auch drauf tippen, das dein eingangs gezeigter Request etwas falsch ist.

Vielleicht könnte man sich gegenseitig unterstützen, bin auch mit php am einbinden in mein selbst erstelltes Smarthome-System

Nun, ein MQTT-Client selbst läuft mit PHP-MQTT (Konsole). Für die Herausforderung, das zB.über Websocket an eine Variable (PHP) zu übergeben, habe ich noch keine praktikable Lösung finden können? Evtl. liest ein Linux-Guru mit, der hier einen simplen Workaround parat hat? :wink:

Im Moment setze ich wieder auf die Webhook, funktioniert auch recht flott.

Dein Hinweis auf den Anfangs genannten Curl war zwischenzeitlich obsolet:

$url = 'http://<Lokale IP>/webhook?event=tag;
$ch = curl_init($url);                                                            
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
$result = curl_exec($ch);
echo '<br>Result: '.$result.'<br>';

Der Result liefert jedoch lediglich ein 200er, das der Request erfolgreich war. Eine XML-App für Homey, konnte ich leider nicht entdecken.