Wie Relais einer DoorBird via PHP schalten?

Hallo in die Runde, da ich in PHO absoliuter Laie bin, benötige ich eure Unterstützung.

ich möchte bei meiner DoorBird ein Relais aus IPSymcon ansteuern. Dies erfolgt mittels API Schnittstelle. Der Aufruf hierfür lautet: “http:///bha-api/open-door.cgi?r=gggaaa@Relaisnummer”.

Wie muss der exakte Syntax lauten, damit der Aufruf im PHP-Script ausgeführt wird. WEnn ich den http-Aufruf im Browser eitrage, wird das Relais auch angesteuert, d.h. der Part passt.

Besten Dank schon mal.

Klauss

Probier es mal hiermit:

<?php

file_get_contents('http:///bha-api/open-door.cgi?r=gggaaa@Relaisnummer');

Hallo Doc,

Danke für den Tip. Der Aufruf wird nicht ausgeführt, ich erhalte folgende Meldung8en)

Warning: file_get_contents(http://...@1): Failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
 in /mnt/data/symcon/scripts/35903.ips.php on line 3

Wenn ich die Hochstriche ˋ weglasse:

Parse error: Unclosed '(' on line 3 in /mnt/data/symcon/scripts/35903.ips.php on line 5

Was mache ich falsch?

Poste mal exakt das Script. Und zwar bitte auch mit dem korrekten ‚Vorformatierter Text‘ hier im Forum. Vermutlich ist irgendwo ein ’ oder ) zu wenig oder zuviel. Bzw. ein Sonderzeichen in der URL, dass nicht sogenannt escaped wurde.

1

2

3

4

5

<?php

file_get_contents(‚http://192.168.150.123/bha-api/open-door.cgi?r=gggaaa@1‘);

In der ersten Form mit Hochstrichen funktioniert das Skript, aber der Empfänger meldet, dass du nicht zugreifen darfst. Ich vermute, dass der Browser noch mehr mitschickt und sich beispielsweise per Cookie oder Header anmeldet. Und das fehlt halt im Skript.

Wenn du die Anführungszeichen weglässt wird der Code ungültig, deswesen kommt ein parse error.

Wie du dich jetzt bei Doorbird korrekt meldest und was du da anpassen musst, kann ich dir aber leider nicht sagen.

Die KI schlägt folgendes Script vor (NICHT GETESTET)


<?php

declare(strict_types=1);

/*
    DoorBird Relais schalten aus IP-Symcon

    Anpassen:
    - $doorbirdIp
    - $username
    - $password
    - $relay

    Relais:
    - 1 = Relais 1
    - 2 = Relais 2
*/

$doorbirdIp = '192.168.1.50';
$username   = 'dein_benutzer';
$password   = 'dein_passwort';
$relay      = 1;

$url = sprintf(
    'http://%s/bha-api/open-door.cgi?r=%d',
    $doorbirdIp,
    $relay
);

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_HTTPAUTH       => CURLAUTH_BASIC,
    CURLOPT_USERPWD        => $username . ':' . $password,
    CURLOPT_FAILONERROR    => false,
]);

$response = curl_exec($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);

curl_close($ch);

if ($response === false) {
    IPS_LogMessage('DoorBird', 'cURL-Fehler: ' . $curlError);
    throw new Exception('DoorBird Anfrage fehlgeschlagen: ' . $curlError);
}

IPS_LogMessage('DoorBird', 'HTTP-Code: ' . $httpCode . ' | Antwort: ' . $response);

switch ($httpCode) {
    case 200:
        echo 'Relais ' . $relay . ' wurde geschaltet.';
        break;

    case 204:
        echo 'DoorBird hat 204 zurückgegeben. Benutzer hat vermutlich keine aktuelle Berechtigung zum Auslösen. Prüfe "Watch always" bzw. die Benutzerrechte.';
        break;

    case 401:
        echo 'Authentifizierung fehlgeschlagen. Benutzername oder Passwort prüfen.';
        break;

    default:
        echo 'Unerwartete Antwort von DoorBird. HTTP-Code: ' . $httpCode . ' | Antwort: ' . $response;
        break;
}

Gruß Stephan

Warum wird dann der Befehl im Scripteditor bei manuellem Start wie hier ausgeführt mit “Follow Click” korrekt ausgeführt?

Kannst du das mal im privaten Browser (ohne Cookies, etc.) ausprobieren?

Weil dein Browser vermutlich irgendwo die Zugangsdaten gespeichert hat.

Ja, das konnte ich jetzt auch feststellen. Mal sehen wie ich das hinbekomme.

So, nun hab ich die Lösung:

file_get_contents('http://xxx.xxx.xxx.xxx/bha-api/open-door.cgi?r=gggaaa@1&http-user=Benutzernam&http-password=Passwort’);

1 „Gefällt mir“