API und ESP8266

Hallo Zusammen,

kennt sich jemand mit dem ESP8266 aus? ich versuche mit so einem Teil über die API einen Filamentsensor zu realisieren. Das senden der Daten an den Server klappt und ich kann auch z.B. ein Homing auslösen. Nun möchte ich aber auch auslesen, ob der Drucker z.B. druckt. 

Zum test wollte ich mir folgendem Commando die Drucker auslesen:

192.168.8.22:3344/printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter

gebe ich diese Zeile in den Browser ein, erhalte ich korrekt die Daten im Jason zurück.

Nun habe ich mit dem unten aufgeführtem Skript das auf den ESP umgesetzt.

Ich halte vom Server die Antwort 200 zurück, was ja sagt das er alles verstanden hat, aber ich erhalte nur einen leeren payload.

Hat jemand eine Idee woran es liegen kann?

Danke schon mal für alle Infos.

Steve

--------------- snip --------------------
const String listPrinter  = "&a=listPrinter";

#include <ESP8266HTTPClient.h>
#include <WiFiManager.h>

String API = "637d4996-c02b-4d3e-8d78-9feb18978c60";
String ipAdressRepetierServer = "192.168.8.22";
String portRepetierServer = "3344";

void setup() {
  Serial.begin(115200);

  // W-Lan aktiviren
  init_WLAN();
}

void loop() {
  sendDataToServer2();
  delay(500000);
}

void sendDataToServer2() {
  HTTPClient http;
  String dummyURL = "http://" + ipAdressRepetierServer + ":" + portRepetierServer + "/printer/api/Ultimaker_2?apikey=" + API + listPrinter;
  Serial.println(dummyURL);
  http.begin(dummyURL);

  // Send HTTP GET request
  int httpResponseCode = http.GET();

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code (2): ");
    Serial.println(httpResponseCode);
    String payload = http.getString();
    Serial.println(payload);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();
}

void init_WLAN() {
  WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP

  // add a custom input field
  int customFieldLength = 40;

  const char* custom_radio_str = "<br/><label for='customfieldid'>Custom Field Label</label><input type='radio' name='customfieldid' value='1' checked> One<br><input type='radio' name='customfieldid' value='2'> Two<br><input type='radio' name='customfieldid' value='3'> Three";
  new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input

  wm.addParameter(&custom_field);
  wm.setSaveParamsCallback(saveParamCallback);

  std::vector<const char *> menu = {"wifi", "info", "param", "sep", "restart", "exit"};
  wm.setMenu(menu);

  // set dark theme
  wm.setClass("invert");

  wm.setConfigPortalTimeout(30); // auto close configportal after n seconds
  drawConfigScreen();
  connection = wm.autoConnect("AutoConnectAP", "password"); // password protected ap

  if (!connection) {
    Serial.println("Failed to connect or hit timeout");
    ESP.restart();
  }
  else {
    //if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)");
    wlanConnectScreen();
  }
}

Comments

  • Vermutlich probleme beim einlesen des strings. Wenn du vor dem include

    #define DEBUG_HTTPCLIENT(fmt, ...) DEBUG_ESP_PORT.printf_P( (PGM_P)PSTR(fmt), ## __VA_ARGS__ )

    definierst aber so das es bei die logt siehst du die Fehler in der Kommunikation wie es aussieht. Zumindest wenn du diese bibliothek nutzt:
    https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient

    Hab aber selber keinen ESP oder erfahrung. Hab nur mal den Code eben überflogen und gesehen das er den szring wohl in
    int HTTPClient::writeToStreamDataBlock(Stream * stream, int size)

    Belegt da wir keine Länge angeben und auch kein chunked transfer encoding nutzen. Zumindest bei dieser abfrage. Könnte daher ein Fall sein wo es Probleme gibt den inhalt auch wenn er gesendet wird abzufragen. Wobei es eiegntlich ja nur einlesen bis ende ist.

  • edited December 2020
    Hallo guter Tip  B)

    Anbei mal der Debug, der zurück kommt, wenn ich das richtig verstehe kommt wirklich nix zurück.
  • Ok das klappt nicht, dann eben so:

    [HTTP] begin...
    17:32:19.578 -> [HTTP-Client][begin] host: 192.168.8.22 port: 3344 url: /printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter
    17:32:19.578 -> [HTTP] GET...
    17:32:19.578 -> [HTTP-Client][sendRequest] type: 'GET' redirCount: 0
    17:32:19.681 -> [HTTP-Client] connected to 192.168.8.22:3344
    17:32:19.681 -> [HTTP-Client] sending request header
    17:32:19.716 -> -----
    17:32:19.716 -> GET /printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter HTTP/1.1
    17:32:19.716 -> Host: 192.168.8.22:3344
    17:32:19.716 -> User-Agent: ESP8266HTTPClient
    17:32:19.716 -> Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
    17:32:19.716 -> Connection: keep-alive
    17:32:19.716 -> Content-Length: 0
    17:32:19.716 -> 
    17:32:19.716 -> -----
    17:32:19.716 -> [HTTP-Client][handleHeaderResponse] RX: 'HTTP/1.1 200 OK
    '
    17:32:19.716 -> [HTTP-Client][handleHeaderResponse] RX: 'Date: Tue, 08 Dec 2020 16:32:19 GMT
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: 'Connection: Close
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: 'Server: 0.94
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: 'Access-Control-Allow-Origin: *
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: 'Content-Type: text/html; charset=utf-8
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: 'Cache-Control: public, max-age=0
    '
    17:32:19.750 -> [HTTP-Client][handleHeaderResponse] RX: '
    '
    17:32:19.787 -> [HTTP-Client][handleHeaderResponse] code: 200
    17:32:19.787 -> [HTTP] GET... code: 200
    17:32:19.787 -> [HTTP-Client][end] still data in buffer (114), clean up.
    17:32:19.787 -> [HTTP-Client][end] tcp keep open for reuse
    17:32:19.787 -> 0
    17:32:19.787 -> [HTTP-Client][end] tcp is closed
    17:32:22.227 -> pm open,type:2 0
  • 17:32:19.787 -> [HTTP-Client][end] still data in buffer (114), clean up.

    ist der Schlüssel. Da sind also noch 114 byte vom server die die Bibliothek nicht eingelesen hat! Hast du mal im Browser gemessen wie lange deine Antwort ist wenn du sie da schickst? Vielleicht 114 byte? Frage ist also warum liest er sie nicht in den string ein wenn du danach fragst.
  • wie messe ich das im Browser zeigt er mir folgendes an:

    [{"active":true,"job":"none","name":"Ultimaker_2+","online":1,"pauseState":0,"paused":false,"slug":"Ultimaker_2"}]

    das würde also passen. Warm er das nicht liest verstehe ich auch nicht
  • Ja das sind genau die 114 byte. Also werden die Daten korrekt gesendet und die bibliothek schafft es nicht sie einzulesen. Für einfach explizit
    https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp

    in dein Projekt ein stadt die Bibliothek zu nutzen. Dann kannst du sie ändern und debug meldungen einbauen. Wie ich schon sagte denke ich muss er in writeToStreamDataBlock gehen und den Text auslesen. Also mal mehr debuggen was er da so anstellt das er nicht einliest obwohl er ja weiß das da 114 byte sind.
  • alles klar setzte mich dran, sobald ich eine Lösung habe poste ich sie hier, vielleicht hilft es ja jemanden bei seinem Project  ;)
  • Auslesen klappt nun super, gibt es eigentlich eine Möglichkeit gezielte PushMessages über die API zu senden.

    Da ja mein Drucker keinen eigenen Filamentsensor hat, baue ich ja einen. Aktuell bekomme ich durch das Pause signal eine Meldung, dass der Drucker pausiert wurde. Nun würde ich aber gerne eine Nachricht haben, dass es wegen dem Filament ist. Ich denke das wird es ja geben für Drucker die einen eingebauten Sensor haben, aber kann ich die Nachricht auch forcieren irgendwie über die API?

    Danke für Infos

    Steve
  • Wenn du Nachrichten zum informer meinst ist der gcode: ;@pushmessage Nachricht wobei auch pausen ja gemeldet werden mit der Pause Nachricht.
    ;@message Text
    Fügt einen Text in der Nachrichtenzentrale ein.

    Ab 0.94.4 (aktuell nur als beta downloadbar) gibt es noch
    @info text
    @warning text
    @error text

    Die dann ein popup auf dem Fenster, touchscreen und im nächsten Monitor zeigen bis es bestätigt wird.
  • Ah super ja genau sowas suche ich,

    Apropos Pause. Kann ich einen Job über das API pausieren?

    startJob, stopJob, continueJob und removeJob

    werden in der Doku aufgeführt, aber nichts zum pausieren  :/
  • ;@pause Nachricht

    als gcode gesendet erzeugt eine pause. Es gibt noch Varianten mit Cooldown im Manual beschreiben.
Sign In or Register to comment.