Jump to content

Request method for this URI is not handled by server


michael99

Recommended Posts

Ah, da ist die API-Dokumentation veraltet, das behebe ich gleich. Du musst in dem Fall (immer wenn du Daten zur Wallbox schickst und sei es nur null) HTTP PUT anstelle von POST o.Ä. als Method verwenden.

Edit: gefixt: https://www.warp-charger.com/api_beta.html

Support für POST und die anderen HTTP Methods kommt eventuell wieder, da wehrt sich leider die Webserver-Implementierung etwas: https://github.com/Tinkerforge/esp32-firmware/issues/39

Link to comment
Share on other sites

  • 2 weeks later...

Ah, ich ging davon aus, dass du versuchst die API mit einem eigenen Skript o.Ä. zu benutzen. Vergiss den Rest ;)

On 3/29/2022 at 3:50 PM, michael99 said:

Bisher konnte ich im Browser das als http senden und auch kontrollieren.

Das verstehe ich nicht. Wenn du http://192.168.0.xx/evse/start_charging in die Addresszeile einfügst, sollte eigentlich nichts passieren, weil das eigentlich nicht dafür gedacht ist, "von Hand" benutzt zu werden. Mit welcher Firmware hat das denn funktioniert? Bzw. warum machst du das so und nicht per Web-Interface? Hast du das einfach als Abkürzung als Lesezeichen hinterlegt o.Ä.?

Link to comment
Share on other sites

  • 1 month later...

Hallo, eventuell mache ich auch etwas grundsätzlich falsch. Wie muss denn der Befehl bei Curl aussehen, damit es funktioniert. Auch über das Mqtt Protokoll wären ein paar Beispiele hilfreich um das ganze zu verstehen. Also eigentlich starten und anhalten des Ladens als HTTP oder MQTT. Mein Kopf ist schon älter und dageht das nicht mehr so schnell.

Edited by michael99
Link to comment
Share on other sites

Am 4.4.2022 um 09:33 schrieb rtrbt:

Ah, ich ging davon aus, dass du versuchst die API mit einem eigenen Skript o.Ä. zu benutzen. Vergiss den Rest ;)

Das verstehe ich nicht. Wenn du http://192.168.0.xx/evse/start_charging in die Addresszeile einfügst, sollte eigentlich nichts passieren, weil das eigentlich nicht dafür gedacht ist, "von Hand" benutzt zu werden. Mit welcher Firmware hat das denn funktioniert? Bzw. warum machst du das so und nicht per Web-Interface? Hast du das einfach als Abkürzung als Lesezeichen hinterlegt o.Ä.?

Ja, ich schicke das über PHP zum Warp.

<?php
$d1 = $_GET["d1"];
$d2 = substr ($d1 , 0,3);
echo $d2;
$heute = date("M-d.h:i");
$filename = "warp/warp-".date("d").".csv";
$contents = file_get_contents('warp/warp.txt');
echo $contents;
$contents = substr ($contents , 0,2);
$pos = strpos($d2,$contents);
echo $pos;
if ($pos !== false){
    echo "Zustand hat sich nicht geändert";
    echo $pos;
    $filestatus = file_put_contents("warp/nicht_geaendert-".date("m-d").".jur",$heute."\r\n",FILE_APPEND);
    exit;
}

$uhrzeit = date("H:i");
$inhalt = $heute.";".$uhrzeit.";".$d1."\r\n";
$filestatus = file_put_contents($filename,$inhalt,FILE_APPEND);
echo $inhalt;
if ($d1 == 'ein'){
    $url = "http://192.168.0.140/evse/start_charging";
    $filestatus = file_put_contents('warp/warp.txt','ein');
    senden($url);
}
if ($d1 == 'aus'){
    $url = "http://192.168.0.140/evse/stop_charging";
    $filestatus = file_put_contents('warp/warp.txt','aus');
    senden($url);
}

function senden($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);      
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_setopt($ch, CURLOPT_CAINFO, "/volume1/web/cacert.pem");
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd() . '/cookies.cookie');
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd() . '/cookies.cookie');
    curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.2.18) Gecko/20110614 Firefox/3.6.18");

    if (strtolower($type) == 'post') {
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      curl_setopt($ch, CURLOPT_HEADER, true);
    }

    $content = curl_exec($ch);
    $ergebnis = curl_error ($ch );
    echo $ergebnis."\r\n";
    curl_close($ch);
    return $content;

}
?>

 

 

Link to comment
Share on other sites

Moin,

Ich habe den Code etwas umgebaut, so funktioniert es bei mir:

<?php
$d1 = $_GET["d1"];

if ($d1 == 'ein'){
    $url = "http://192.168.0.140/evse/start_charging";
    senden($url, "null");
}
if ($d1 == 'aus'){
    $url = "http://192.168.0.140/evse/stop_charging";
    senden($url, "null");
}

if ($d1 == '6A'){
    $url = "http://192.168.0.140/evse/global_current_update";
    senden($url, '{"current": 6000}');
}

if ($d1 == 'strom'){
    $url = "http://192.168.0.140/evse/global_current";
    echo senden($url, '');
}

function senden($url, $payload) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ENCODING, "utf-8");

    if ($payload != "") {
        // Payload ist nicht leer, wir wollen Daten zur Wallbox schicken. Benutze PUT und setze payload
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($payload)));
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    } else {
        // Payload ist leer, wir wollen Daten von der Wallbox empfangen. Benutze GET
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    }
    
    $content = curl_exec($ch);
    $ergebnis = curl_error ($ch );
    echo $ergebnis."\r\n";
    curl_close($ch);
    return $content;
}
?>

Ich habe den Code, der die Dateien liest und schreibt erstmal weggelassen, habe ja nicht die selben Dateien bei mir wie du.

Die senden-Funktion bekommt die Daten, die sie schicken soll übergeben, wenn du da einen leeren String übergibst, kannst du stattdessen Daten von der Wallbox lesen.

Zusätzlich zu ?d1=ein und ?d1=aus habe ich eingebaut, dass du das Script mit ?d1=6A, aufrufen kannst (als Beispiel für komplexere Daten), damit wird der Ladestrom auf 6 Ampere gesetzt.

Außerdem kannst du auch ?d1=strom benutzen, als Beispiel, wie du Daten von der Wallbox lesen kannst. Damit wird der Strom wieder abgefragt. Das ist der selbe Ladestrom, den du auf dem Webinterface der Wallbox sehen kannst.

17 hours ago, michael99 said:

Auch über das Mqtt Protokoll wären ein paar Beispiele hilfreich um das ganze zu verstehen.

Für MQTT musst du erst einen Broker aufsetzen und die Verbindung auf der Wallbox konfigurieren.

Prinzipiell funktioniert die Benutzung über MQTT dann aber fast genauso wie die über HTTP. Also wenn du z.B. über HTTP den Ladestrom auf 8 Ampere setzen willst, musst du {"current": 8000} an http://192.168.0.140/evse/global_current_update schicken. Über MQTT kannst du die selben Daten, also {"current": 8000} an warp/AbC/evse/global_current_update schicken. warp/AbC ist dabei der Präfix, den du auf der MQTT-Seite der Wallbox konfigurieren kannst.

Zum Schicken per MQTT kannst du z.B. mosquitto_pub benutzen. Es gibt hier: https://www.warp-charger.com/api.html#mqtt_section noch ein paar Erklärungen zur Verwendung davon.

Link to comment
Share on other sites

  • 2 months later...

Jeder Punkt auf dem Graph ist ein Mittelwert über ~ 4 Minuten. Da der Ladevorgang da gerade gestartet ist, wäre es also möglich, dass das noch Datenpunkte sind, wo der "Vollausschlag" nicht erreicht war. Falls sich das nach ein paar Minuten aber nicht behoben hat, muss ich dem nochmal nachgehen.

Bist du auf der aktuellen WARP1 Firmware 2.0.6? Nicht dass wir alte Bugs jagen.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...