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();
}
}
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
#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.
Anbei mal der Debug, der zurück kommt, wenn ich das richtig verstehe kommt wirklich nix zurück.
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.
[{"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
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.
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
;@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.
Apropos Pause. Kann ich einen Job über das API pausieren?
startJob, stopJob, continueJob und removeJob
werden in der Doku aufgeführt, aber nichts zum pausierenals gcode gesendet erzeugt eine pause. Es gibt noch Varianten mit Cooldown im Manual beschreiben.