Compare commits
6 Commits
46cd953b80
...
d58244c1f8
Author | SHA1 | Date | |
---|---|---|---|
d58244c1f8 | |||
db626ea516 | |||
fd8f7685a1 | |||
944b156528 | |||
76100593cc | |||
732d590344 |
@ -410,12 +410,13 @@ bool checkSpoolmanExtraFields() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http.end();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.println("-------- ENDE Prüfe Felder --------");
|
Serial.println("-------- ENDE Prüfe Felder --------");
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
|
http.end();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
260
src/bambu.cpp
260
src/bambu.cpp
@ -23,6 +23,11 @@ const char* bambu_username = "bblp";
|
|||||||
const char* bambu_ip = nullptr;
|
const char* bambu_ip = nullptr;
|
||||||
const char* bambu_accesscode = nullptr;
|
const char* bambu_accesscode = nullptr;
|
||||||
const char* bambu_serialnr = nullptr;
|
const char* bambu_serialnr = nullptr;
|
||||||
|
|
||||||
|
String g_bambu_ip = "";
|
||||||
|
String g_bambu_accesscode = "";
|
||||||
|
String g_bambu_serialnr = "";
|
||||||
|
|
||||||
bool bambu_connected = false;
|
bool bambu_connected = false;
|
||||||
bool autoSendToBambu = false;
|
bool autoSendToBambu = false;
|
||||||
int autoSetToBambuSpoolId = 0;
|
int autoSetToBambuSpoolId = 0;
|
||||||
@ -69,6 +74,11 @@ bool loadBambuCredentials() {
|
|||||||
String ip = doc["bambu_ip"].as<String>();
|
String ip = doc["bambu_ip"].as<String>();
|
||||||
String code = doc["bambu_accesscode"].as<String>();
|
String code = doc["bambu_accesscode"].as<String>();
|
||||||
String serial = doc["bambu_serialnr"].as<String>();
|
String serial = doc["bambu_serialnr"].as<String>();
|
||||||
|
|
||||||
|
g_bambu_ip = ip;
|
||||||
|
g_bambu_accesscode = code;
|
||||||
|
g_bambu_serialnr = serial;
|
||||||
|
|
||||||
if (doc["autoSendToBambu"].is<bool>()) autoSendToBambu = doc["autoSendToBambu"].as<bool>();
|
if (doc["autoSendToBambu"].is<bool>()) autoSendToBambu = doc["autoSendToBambu"].as<bool>();
|
||||||
if (doc["autoSendTime"].is<int>()) autoSetBambuAmsCounter = doc["autoSendTime"].as<int>();
|
if (doc["autoSendTime"].is<int>()) autoSetBambuAmsCounter = doc["autoSendTime"].as<int>();
|
||||||
|
|
||||||
@ -77,9 +87,9 @@ bool loadBambuCredentials() {
|
|||||||
serial.trim();
|
serial.trim();
|
||||||
|
|
||||||
// Dynamische Speicherallokation für die globalen Pointer
|
// Dynamische Speicherallokation für die globalen Pointer
|
||||||
bambu_ip = strdup(ip.c_str());
|
bambu_ip = g_bambu_ip.c_str();
|
||||||
bambu_accesscode = strdup(code.c_str());
|
bambu_accesscode = g_bambu_accesscode.c_str();
|
||||||
bambu_serialnr = strdup(serial.c_str());
|
bambu_serialnr = g_bambu_serialnr.c_str();
|
||||||
|
|
||||||
report_topic = "device/" + String(bambu_serialnr) + "/report";
|
report_topic = "device/" + String(bambu_serialnr) + "/report";
|
||||||
//request_topic = "device/" + String(bambu_serialnr) + "/request";
|
//request_topic = "device/" + String(bambu_serialnr) + "/request";
|
||||||
@ -112,6 +122,7 @@ FilamentResult findFilamentIdx(String brand, String type) {
|
|||||||
}
|
}
|
||||||
doc.clear();
|
doc.clear();
|
||||||
}
|
}
|
||||||
|
doc.clear();
|
||||||
|
|
||||||
// Laden der bambu_filaments.json
|
// Laden der bambu_filaments.json
|
||||||
if (!loadJsonValue("/bambu_filaments.json", doc))
|
if (!loadJsonValue("/bambu_filaments.json", doc))
|
||||||
@ -185,7 +196,7 @@ FilamentResult findFilamentIdx(String brand, String type) {
|
|||||||
return {"GFL99", "PLA"};
|
return {"GFL99", "PLA"};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sendMqttMessage(String payload) {
|
bool sendMqttMessage(const String& payload) {
|
||||||
Serial.println("Sending MQTT message");
|
Serial.println("Sending MQTT message");
|
||||||
Serial.println(payload);
|
Serial.println(payload);
|
||||||
if (client.publish(report_topic.c_str(), payload.c_str()))
|
if (client.publish(report_topic.c_str(), payload.c_str()))
|
||||||
@ -309,6 +320,90 @@ void autoSetSpool(int spoolId, uint8_t trayId) {
|
|||||||
autoSetToBambuSpoolId = 0;
|
autoSetToBambuSpoolId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateAmsWsData(JsonDocument& doc, JsonArray& amsArray, int& ams_count, JsonObject& vtTray) {
|
||||||
|
// Fortfahren mit der bestehenden Verarbeitung, da Änderungen gefunden wurden
|
||||||
|
ams_count = amsArray.size();
|
||||||
|
|
||||||
|
for (int i = 0; i < ams_count && i < 16; i++) {
|
||||||
|
JsonObject amsObj = amsArray[i];
|
||||||
|
JsonArray trayArray = amsObj["tray"].as<JsonArray>();
|
||||||
|
|
||||||
|
ams_data[i].ams_id = i; // Setze die AMS-ID
|
||||||
|
for (int j = 0; j < trayArray.size() && j < 4; j++) { // Annahme: Maximal 4 Trays pro AMS
|
||||||
|
JsonObject trayObj = trayArray[j];
|
||||||
|
|
||||||
|
ams_data[i].trays[j].id = trayObj["id"].as<uint8_t>();
|
||||||
|
ams_data[i].trays[j].tray_info_idx = trayObj["tray_info_idx"].as<String>();
|
||||||
|
ams_data[i].trays[j].tray_type = trayObj["tray_type"].as<String>();
|
||||||
|
ams_data[i].trays[j].tray_sub_brands = trayObj["tray_sub_brands"].as<String>();
|
||||||
|
ams_data[i].trays[j].tray_color = trayObj["tray_color"].as<String>();
|
||||||
|
ams_data[i].trays[j].nozzle_temp_min = trayObj["nozzle_temp_min"].as<int>();
|
||||||
|
ams_data[i].trays[j].nozzle_temp_max = trayObj["nozzle_temp_max"].as<int>();
|
||||||
|
//ams_data[i].trays[j].setting_id = trayObj["setting_id"].as<String>();
|
||||||
|
ams_data[i].trays[j].cali_idx = trayObj["cali_idx"].as<String>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setze ams_count auf die Anzahl der normalen AMS
|
||||||
|
ams_count = amsArray.size();
|
||||||
|
|
||||||
|
// Wenn externe Spule vorhanden, füge sie hinzu
|
||||||
|
if (doc["print"]["vt_tray"].is<JsonObject>()) {
|
||||||
|
//JsonObject vtTray = doc["print"]["vt_tray"];
|
||||||
|
int extIdx = ams_count; // Index für externe Spule
|
||||||
|
ams_data[extIdx].ams_id = 255; // Spezielle ID für externe Spule
|
||||||
|
ams_data[extIdx].trays[0].id = 254; // Spezielle ID für externes Tray
|
||||||
|
ams_data[extIdx].trays[0].tray_info_idx = vtTray["tray_info_idx"].as<String>();
|
||||||
|
ams_data[extIdx].trays[0].tray_type = vtTray["tray_type"].as<String>();
|
||||||
|
ams_data[extIdx].trays[0].tray_sub_brands = vtTray["tray_sub_brands"].as<String>();
|
||||||
|
ams_data[extIdx].trays[0].tray_color = vtTray["tray_color"].as<String>();
|
||||||
|
ams_data[extIdx].trays[0].nozzle_temp_min = vtTray["nozzle_temp_min"].as<int>();
|
||||||
|
ams_data[extIdx].trays[0].nozzle_temp_max = vtTray["nozzle_temp_max"].as<int>();
|
||||||
|
|
||||||
|
if (doc["print"]["vt_tray"]["tray_type"].as<String>() != "")
|
||||||
|
{
|
||||||
|
//ams_data[extIdx].trays[0].setting_id = vtTray["setting_id"].as<String>();
|
||||||
|
ams_data[extIdx].trays[0].cali_idx = vtTray["cali_idx"].as<String>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ams_data[extIdx].trays[0].setting_id = "";
|
||||||
|
ams_data[extIdx].trays[0].cali_idx = "";
|
||||||
|
}
|
||||||
|
ams_count++; // Erhöhe ams_count für die externe Spule
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erstelle JSON für WebSocket-Clients
|
||||||
|
JsonDocument wsDoc;
|
||||||
|
JsonArray wsArray = wsDoc.to<JsonArray>();
|
||||||
|
|
||||||
|
for (int i = 0; i < ams_count; i++) {
|
||||||
|
JsonObject amsObj = wsArray.add<JsonObject>();
|
||||||
|
amsObj["ams_id"] = ams_data[i].ams_id;
|
||||||
|
|
||||||
|
JsonArray trays = amsObj["tray"].to<JsonArray>();
|
||||||
|
int maxTrays = (ams_data[i].ams_id == 255) ? 1 : 4;
|
||||||
|
|
||||||
|
for (int j = 0; j < maxTrays; j++) {
|
||||||
|
JsonObject trayObj = trays.add<JsonObject>();
|
||||||
|
trayObj["id"] = ams_data[i].trays[j].id;
|
||||||
|
trayObj["tray_info_idx"] = ams_data[i].trays[j].tray_info_idx;
|
||||||
|
trayObj["tray_type"] = ams_data[i].trays[j].tray_type;
|
||||||
|
trayObj["tray_sub_brands"] = ams_data[i].trays[j].tray_sub_brands;
|
||||||
|
trayObj["tray_color"] = ams_data[i].trays[j].tray_color;
|
||||||
|
trayObj["nozzle_temp_min"] = ams_data[i].trays[j].nozzle_temp_min;
|
||||||
|
trayObj["nozzle_temp_max"] = ams_data[i].trays[j].nozzle_temp_max;
|
||||||
|
trayObj["setting_id"] = ams_data[i].trays[j].setting_id;
|
||||||
|
trayObj["cali_idx"] = ams_data[i].trays[j].cali_idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
serializeJson(wsArray, amsJsonData);
|
||||||
|
wsDoc.clear();
|
||||||
|
Serial.println("AMS data updated");
|
||||||
|
sendAmsData(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
// init
|
// init
|
||||||
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
||||||
String message;
|
String message;
|
||||||
@ -320,6 +415,7 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
// JSON-Dokument parsen
|
// JSON-Dokument parsen
|
||||||
JsonDocument doc;
|
JsonDocument doc;
|
||||||
DeserializationError error = deserializeJson(doc, message);
|
DeserializationError error = deserializeJson(doc, message);
|
||||||
|
message = "";
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
Serial.print("Fehler beim Parsen des JSON: ");
|
Serial.print("Fehler beim Parsen des JSON: ");
|
||||||
@ -372,9 +468,13 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
// Vergleiche die Trays
|
// Vergleiche die Trays
|
||||||
for (int j = 0; j < trayArray.size() && j < 4 && !hasChanges; j++) {
|
for (int j = 0; j < trayArray.size() && j < 4 && !hasChanges; j++) {
|
||||||
JsonObject trayObj = trayArray[j];
|
JsonObject trayObj = trayArray[j];
|
||||||
|
|
||||||
|
if (trayObj["tray_type"].as<String>() == "") ams_data[storedIndex].trays[j].setting_id = "";
|
||||||
|
if (trayObj["setting_id"].isNull()) trayObj["setting_id"] = "";
|
||||||
if (trayObj["tray_info_idx"].as<String>() != ams_data[storedIndex].trays[j].tray_info_idx ||
|
if (trayObj["tray_info_idx"].as<String>() != ams_data[storedIndex].trays[j].tray_info_idx ||
|
||||||
trayObj["tray_type"].as<String>() != ams_data[storedIndex].trays[j].tray_type ||
|
trayObj["tray_type"].as<String>() != ams_data[storedIndex].trays[j].tray_type ||
|
||||||
trayObj["tray_color"].as<String>() != ams_data[storedIndex].trays[j].tray_color ||
|
trayObj["tray_color"].as<String>() != ams_data[storedIndex].trays[j].tray_color ||
|
||||||
|
(trayObj["setting_id"].as<String>() != "" && trayObj["setting_id"].as<String>() != ams_data[storedIndex].trays[j].setting_id) ||
|
||||||
trayObj["cali_idx"].as<String>() != ams_data[storedIndex].trays[j].cali_idx) {
|
trayObj["cali_idx"].as<String>() != ams_data[storedIndex].trays[j].cali_idx) {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
break;
|
break;
|
||||||
@ -383,149 +483,52 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prüfe die externe Spule
|
// Prüfe die externe Spule
|
||||||
if (!hasChanges && doc["print"]["vt_tray"].is<JsonObject>()) {
|
|
||||||
JsonObject vtTray = doc["print"]["vt_tray"];
|
JsonObject vtTray = doc["print"]["vt_tray"];
|
||||||
bool foundExternal = false;
|
if (doc["print"]["vt_tray"].is<JsonObject>()) {
|
||||||
|
|
||||||
for (int i = 0; i < ams_count; i++) {
|
for (int i = 0; i < ams_count; i++) {
|
||||||
if (ams_data[i].ams_id == 255) {
|
if (ams_data[i].ams_id == 255) {
|
||||||
foundExternal = true;
|
if (vtTray["tray_type"].as<String>() == "") ams_data[i].trays[0].setting_id = "";
|
||||||
|
if (vtTray["setting_id"].isNull()) vtTray["setting_id"] = "";
|
||||||
if (vtTray["tray_info_idx"].as<String>() != ams_data[i].trays[0].tray_info_idx ||
|
if (vtTray["tray_info_idx"].as<String>() != ams_data[i].trays[0].tray_info_idx ||
|
||||||
vtTray["tray_type"].as<String>() != ams_data[i].trays[0].tray_type ||
|
vtTray["tray_type"].as<String>() != ams_data[i].trays[0].tray_type ||
|
||||||
vtTray["tray_color"].as<String>() != ams_data[i].trays[0].tray_color ||
|
vtTray["tray_color"].as<String>() != ams_data[i].trays[0].tray_color ||
|
||||||
|
(vtTray["setting_id"].as<String>() != "" && vtTray["setting_id"].as<String>() != ams_data[i].trays[0].setting_id) ||
|
||||||
(vtTray["tray_type"].as<String>() != "" && vtTray["cali_idx"].as<String>() != ams_data[i].trays[0].cali_idx)) {
|
(vtTray["tray_type"].as<String>() != "" && vtTray["cali_idx"].as<String>() != ams_data[i].trays[0].cali_idx)) {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//if (!foundExternal) hasChanges = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasChanges) return;
|
if (!hasChanges) return;
|
||||||
|
|
||||||
// Fortfahren mit der bestehenden Verarbeitung, da Änderungen gefunden wurden
|
updateAmsWsData(doc, amsArray, ams_count, vtTray);
|
||||||
ams_count = amsArray.size();
|
|
||||||
|
|
||||||
for (int i = 0; i < ams_count && i < 16; i++) {
|
|
||||||
JsonObject amsObj = amsArray[i];
|
|
||||||
JsonArray trayArray = amsObj["tray"].as<JsonArray>();
|
|
||||||
|
|
||||||
ams_data[i].ams_id = i; // Setze die AMS-ID
|
|
||||||
for (int j = 0; j < trayArray.size() && j < 4; j++) { // Annahme: Maximal 4 Trays pro AMS
|
|
||||||
JsonObject trayObj = trayArray[j];
|
|
||||||
|
|
||||||
ams_data[i].trays[j].id = trayObj["id"].as<uint8_t>();
|
|
||||||
ams_data[i].trays[j].tray_info_idx = trayObj["tray_info_idx"].as<String>();
|
|
||||||
ams_data[i].trays[j].tray_type = trayObj["tray_type"].as<String>();
|
|
||||||
ams_data[i].trays[j].tray_sub_brands = trayObj["tray_sub_brands"].as<String>();
|
|
||||||
ams_data[i].trays[j].tray_color = trayObj["tray_color"].as<String>();
|
|
||||||
ams_data[i].trays[j].nozzle_temp_min = trayObj["nozzle_temp_min"].as<int>();
|
|
||||||
ams_data[i].trays[j].nozzle_temp_max = trayObj["nozzle_temp_max"].as<int>();
|
|
||||||
ams_data[i].trays[j].setting_id = trayObj["setting_id"].as<String>();
|
|
||||||
ams_data[i].trays[j].cali_idx = trayObj["cali_idx"].as<String>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setze ams_count auf die Anzahl der normalen AMS
|
|
||||||
ams_count = amsArray.size();
|
|
||||||
|
|
||||||
// Wenn externe Spule vorhanden, füge sie hinzu
|
|
||||||
if (doc["print"]["vt_tray"].is<JsonObject>()) {
|
|
||||||
JsonObject vtTray = doc["print"]["vt_tray"];
|
|
||||||
int extIdx = ams_count; // Index für externe Spule
|
|
||||||
ams_data[extIdx].ams_id = 255; // Spezielle ID für externe Spule
|
|
||||||
ams_data[extIdx].trays[0].id = 254; // Spezielle ID für externes Tray
|
|
||||||
ams_data[extIdx].trays[0].tray_info_idx = vtTray["tray_info_idx"].as<String>();
|
|
||||||
ams_data[extIdx].trays[0].tray_type = vtTray["tray_type"].as<String>();
|
|
||||||
ams_data[extIdx].trays[0].tray_sub_brands = vtTray["tray_sub_brands"].as<String>();
|
|
||||||
ams_data[extIdx].trays[0].tray_color = vtTray["tray_color"].as<String>();
|
|
||||||
ams_data[extIdx].trays[0].nozzle_temp_min = vtTray["nozzle_temp_min"].as<int>();
|
|
||||||
ams_data[extIdx].trays[0].nozzle_temp_max = vtTray["nozzle_temp_max"].as<int>();
|
|
||||||
|
|
||||||
if (doc["print"]["vt_tray"]["tray_type"].as<String>() != "")
|
|
||||||
{
|
|
||||||
ams_data[extIdx].trays[0].setting_id = vtTray["setting_id"].as<String>();
|
|
||||||
ams_data[extIdx].trays[0].cali_idx = vtTray["cali_idx"].as<String>();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ams_data[extIdx].trays[0].setting_id = "";
|
|
||||||
ams_data[extIdx].trays[0].cali_idx = "";
|
|
||||||
}
|
|
||||||
ams_count++; // Erhöhe ams_count für die externe Spule
|
|
||||||
}
|
|
||||||
|
|
||||||
// Erstelle JSON für WebSocket-Clients
|
|
||||||
JsonDocument wsDoc;
|
|
||||||
JsonArray wsArray = wsDoc.to<JsonArray>();
|
|
||||||
|
|
||||||
for (int i = 0; i < ams_count; i++) {
|
|
||||||
JsonObject amsObj = wsArray.add<JsonObject>();
|
|
||||||
amsObj["ams_id"] = ams_data[i].ams_id;
|
|
||||||
|
|
||||||
JsonArray trays = amsObj["tray"].to<JsonArray>();
|
|
||||||
int maxTrays = (ams_data[i].ams_id == 255) ? 1 : 4;
|
|
||||||
|
|
||||||
for (int j = 0; j < maxTrays; j++) {
|
|
||||||
JsonObject trayObj = trays.add<JsonObject>();
|
|
||||||
trayObj["id"] = ams_data[i].trays[j].id;
|
|
||||||
trayObj["tray_info_idx"] = ams_data[i].trays[j].tray_info_idx;
|
|
||||||
trayObj["tray_type"] = ams_data[i].trays[j].tray_type;
|
|
||||||
trayObj["tray_sub_brands"] = ams_data[i].trays[j].tray_sub_brands;
|
|
||||||
trayObj["tray_color"] = ams_data[i].trays[j].tray_color;
|
|
||||||
trayObj["nozzle_temp_min"] = ams_data[i].trays[j].nozzle_temp_min;
|
|
||||||
trayObj["nozzle_temp_max"] = ams_data[i].trays[j].nozzle_temp_max;
|
|
||||||
trayObj["setting_id"] = ams_data[i].trays[j].setting_id;
|
|
||||||
trayObj["cali_idx"] = ams_data[i].trays[j].cali_idx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serializeJson(wsArray, amsJsonData);
|
|
||||||
Serial.println("AMS data updated");
|
|
||||||
sendAmsData(nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Neue Bedingung für ams_filament_setting
|
// Neue Bedingung für ams_filament_setting
|
||||||
if (doc["print"]["command"] == "ams_filament_setting") {
|
if (doc["print"]["command"] == "ams_filament_setting") {
|
||||||
int amsId = doc["print"]["ams_id"].as<int>();
|
int amsId = doc["print"]["ams_id"].as<int>();
|
||||||
int trayId = doc["print"]["tray_id"].as<int>();
|
int trayId = doc["print"]["tray_id"].as<int>();
|
||||||
String settingId = doc["print"]["setting_id"].as<String>();
|
String settingId = (doc["print"]["setting_id"].is<String>()) ? doc["print"]["setting_id"].as<String>() : "";
|
||||||
|
|
||||||
// Finde das entsprechende AMS und Tray
|
// Finde das entsprechende AMS und Tray
|
||||||
for (int i = 0; i < ams_count; i++) {
|
for (int i = 0; i < ams_count; i++) {
|
||||||
if (ams_data[i].ams_id == amsId) {
|
if (ams_data[i].ams_id == amsId) {
|
||||||
// Update setting_id im entsprechenden Tray
|
if (trayId == 254)
|
||||||
ams_data[i].trays[trayId].setting_id = settingId;
|
{
|
||||||
|
// Suche AMS mit ID 255 (externe Spule)
|
||||||
// Erstelle neues JSON für WebSocket-Clients
|
|
||||||
JsonDocument wsDoc;
|
|
||||||
JsonArray wsArray = wsDoc.to<JsonArray>();
|
|
||||||
|
|
||||||
for (int j = 0; j < ams_count; j++) {
|
for (int j = 0; j < ams_count; j++) {
|
||||||
JsonObject amsObj = wsArray.add<JsonObject>();
|
if (ams_data[j].ams_id == 255) {
|
||||||
amsObj["ams_id"] = ams_data[j].ams_id;
|
ams_data[j].trays[0].setting_id = settingId;
|
||||||
|
break;
|
||||||
JsonArray trays = amsObj["tray"].to<JsonArray>();
|
|
||||||
int maxTrays = (ams_data[j].ams_id == 255) ? 1 : 4;
|
|
||||||
|
|
||||||
for (int k = 0; k < maxTrays; k++) {
|
|
||||||
JsonObject trayObj = trays.add<JsonObject>();
|
|
||||||
trayObj["id"] = ams_data[j].trays[k].id;
|
|
||||||
trayObj["tray_info_idx"] = ams_data[j].trays[k].tray_info_idx;
|
|
||||||
trayObj["tray_type"] = ams_data[j].trays[k].tray_type;
|
|
||||||
trayObj["tray_sub_brands"] = ams_data[j].trays[k].tray_sub_brands;
|
|
||||||
trayObj["tray_color"] = ams_data[j].trays[k].tray_color;
|
|
||||||
trayObj["nozzle_temp_min"] = ams_data[j].trays[k].nozzle_temp_min;
|
|
||||||
trayObj["nozzle_temp_max"] = ams_data[j].trays[k].nozzle_temp_max;
|
|
||||||
trayObj["setting_id"] = ams_data[j].trays[k].setting_id;
|
|
||||||
trayObj["cali_idx"] = ams_data[j].trays[k].cali_idx;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Aktualisiere das globale amsJsonData
|
else
|
||||||
amsJsonData = "";
|
{
|
||||||
serializeJson(wsArray, amsJsonData);
|
ams_data[i].trays[trayId].setting_id = settingId;
|
||||||
|
}
|
||||||
|
|
||||||
// Sende an WebSocket Clients
|
// Sende an WebSocket Clients
|
||||||
Serial.println("Filament setting updated");
|
Serial.println("Filament setting updated");
|
||||||
@ -538,15 +541,16 @@ void mqtt_callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
|
|
||||||
void reconnect() {
|
void reconnect() {
|
||||||
// Loop until we're reconnected
|
// Loop until we're reconnected
|
||||||
|
uint8_t retries = 0;
|
||||||
while (!client.connected()) {
|
while (!client.connected()) {
|
||||||
Serial.println("Attempting MQTT connection...");
|
Serial.println("Attempting MQTT re/connection...");
|
||||||
bambu_connected = false;
|
bambu_connected = false;
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
|
|
||||||
// Attempt to connect
|
// Attempt to connect
|
||||||
if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) {
|
if (client.connect(bambu_serialnr, bambu_username, bambu_accesscode)) {
|
||||||
Serial.println("... re-connected");
|
Serial.println("MQTT re/connected");
|
||||||
// ... and resubscribe
|
|
||||||
client.subscribe(report_topic.c_str());
|
client.subscribe(report_topic.c_str());
|
||||||
bambu_connected = true;
|
bambu_connected = true;
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
@ -556,14 +560,23 @@ void reconnect() {
|
|||||||
Serial.println(" try again in 5 seconds");
|
Serial.println(" try again in 5 seconds");
|
||||||
bambu_connected = false;
|
bambu_connected = false;
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
// Wait 5 seconds before retrying
|
|
||||||
yield();
|
yield();
|
||||||
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
|
if (retries > 5) {
|
||||||
|
Serial.println("Disable Bambu MQTT Task after 5 retries");
|
||||||
|
//vTaskSuspend(BambuMqttTask);
|
||||||
|
vTaskDelete(BambuMqttTask);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
retries++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqtt_loop(void * parameter) {
|
void mqtt_loop(void * parameter) {
|
||||||
|
Serial.println("Bambu MQTT Task gestartet");
|
||||||
for(;;) {
|
for(;;) {
|
||||||
if (pauseBambuMqttTask) {
|
if (pauseBambuMqttTask) {
|
||||||
vTaskDelay(10000);
|
vTaskDelay(10000);
|
||||||
@ -577,6 +590,7 @@ void mqtt_loop(void * parameter) {
|
|||||||
}
|
}
|
||||||
client.loop();
|
client.loop();
|
||||||
yield();
|
yield();
|
||||||
|
esp_task_wdt_reset();
|
||||||
vTaskDelay(100);
|
vTaskDelay(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -617,7 +631,7 @@ bool setupMqtt() {
|
|||||||
xTaskCreatePinnedToCore(
|
xTaskCreatePinnedToCore(
|
||||||
mqtt_loop, /* Function to implement the task */
|
mqtt_loop, /* Function to implement the task */
|
||||||
"BambuMqtt", /* Name of the task */
|
"BambuMqtt", /* Name of the task */
|
||||||
10000, /* Stack size in words */
|
8192, /* Stack size in words */
|
||||||
NULL, /* Task input parameter */
|
NULL, /* Task input parameter */
|
||||||
mqttTaskPrio, /* Priority of the task */
|
mqttTaskPrio, /* Priority of the task */
|
||||||
&BambuMqttTask, /* Task handle. */
|
&BambuMqttTask, /* Task handle. */
|
||||||
|
@ -20,9 +20,9 @@ void setupDisplay() {
|
|||||||
// the library initializes this with an Adafruit splash screen.
|
// the library initializes this with an Adafruit splash screen.
|
||||||
display.setTextColor(WHITE);
|
display.setTextColor(WHITE);
|
||||||
display.display();
|
display.display();
|
||||||
delay(1000); // Pause for 2 seconds
|
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
delay(2000);
|
oledShowMessage("FilaMan v" + String(VERSION));
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void oledclearline() {
|
void oledclearline() {
|
||||||
@ -139,8 +139,9 @@ void oledShowMultilineMessage(String message, uint8_t size) {
|
|||||||
int totalHeight = lines.size() * lineHeight;
|
int totalHeight = lines.size() * lineHeight;
|
||||||
int startY = OLED_DATA_START + ((OLED_DATA_END - OLED_DATA_START - totalHeight) / 2);
|
int startY = OLED_DATA_START + ((OLED_DATA_END - OLED_DATA_START - totalHeight) / 2);
|
||||||
|
|
||||||
|
uint8_t lineDistance = (lines.size() == 2) ? 5 : 0;
|
||||||
for (size_t i = 0; i < lines.size(); i++) {
|
for (size_t i = 0; i < lines.size(); i++) {
|
||||||
display.setCursor(oled_center_h(lines[i]), startY + (i * lineHeight));
|
display.setCursor(oled_center_h(lines[i]), startY + (i * lineHeight) + (i == 1 ? lineDistance : 0));
|
||||||
display.print(lines[i]);
|
display.print(lines[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
src/main.cpp
16
src/main.cpp
@ -1,6 +1,4 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <DNSServer.h>
|
|
||||||
#include <ESPmDNS.h>
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
|
|
||||||
@ -30,13 +28,11 @@ void setup() {
|
|||||||
|
|
||||||
// Start Display
|
// Start Display
|
||||||
setupDisplay();
|
setupDisplay();
|
||||||
oledShowMessage("FilaMan v"+String(VERSION));
|
|
||||||
|
|
||||||
// WiFiManager
|
// WiFiManager
|
||||||
initWiFi();
|
initWiFi();
|
||||||
|
|
||||||
// Webserver
|
// Webserver
|
||||||
Serial.println("Starte Webserver");
|
|
||||||
setupWebserver(server);
|
setupWebserver(server);
|
||||||
|
|
||||||
// Spoolman API
|
// Spoolman API
|
||||||
@ -44,19 +40,9 @@ void setup() {
|
|||||||
initSpoolman();
|
initSpoolman();
|
||||||
|
|
||||||
// Bambu MQTT
|
// Bambu MQTT
|
||||||
// bambu.cpp
|
|
||||||
setupMqtt();
|
setupMqtt();
|
||||||
|
|
||||||
// mDNS
|
// NFC Reader
|
||||||
Serial.println("Starte MDNS");
|
|
||||||
if (!MDNS.begin("filaman")) { // Set the hostname to "esp32.local"
|
|
||||||
Serial.println("Error setting up MDNS responder!");
|
|
||||||
while(1) {
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Serial.println("mDNS responder started");
|
|
||||||
|
|
||||||
startNfc();
|
startNfc();
|
||||||
|
|
||||||
uint8_t scaleCalibrated = start_scale();
|
uint8_t scaleCalibrated = start_scale();
|
||||||
|
@ -238,10 +238,12 @@ void writeJsonToTag(void *parameter) {
|
|||||||
|
|
||||||
hasReadRfidTag = 3;
|
hasReadRfidTag = 3;
|
||||||
vTaskSuspend(RfidReaderTask);
|
vTaskSuspend(RfidReaderTask);
|
||||||
vTaskDelay(500 / portTICK_PERIOD_MS);
|
vTaskDelay(50 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
//pauseBambuMqttTask = true;
|
//pauseBambuMqttTask = true;
|
||||||
// aktualisieren der Website wenn sich der Status ändert
|
// aktualisieren der Website wenn sich der Status ändert
|
||||||
sendNfcData(nullptr);
|
sendNfcData(nullptr);
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
oledShowMessage("Waiting for NFC-Tag");
|
oledShowMessage("Waiting for NFC-Tag");
|
||||||
|
|
||||||
// Wait 10sec for tag
|
// Wait 10sec for tag
|
||||||
@ -331,7 +333,7 @@ void startWriteJsonToTag(const char* payload) {
|
|||||||
xTaskCreate(
|
xTaskCreate(
|
||||||
writeJsonToTag, // Task-Funktion
|
writeJsonToTag, // Task-Funktion
|
||||||
"WriteJsonToTagTask", // Task-Name
|
"WriteJsonToTagTask", // Task-Name
|
||||||
4096, // Stackgröße in Bytes
|
5115, // Stackgröße in Bytes
|
||||||
(void*)payloadCopy, // Parameter
|
(void*)payloadCopy, // Parameter
|
||||||
rfidWriteTaskPrio, // Priorität
|
rfidWriteTaskPrio, // Priorität
|
||||||
NULL // Task-Handle (nicht benötigt)
|
NULL // Task-Handle (nicht benötigt)
|
||||||
@ -456,7 +458,7 @@ void startNfc() {
|
|||||||
BaseType_t result = xTaskCreatePinnedToCore(
|
BaseType_t result = xTaskCreatePinnedToCore(
|
||||||
scanRfidTask, /* Function to implement the task */
|
scanRfidTask, /* Function to implement the task */
|
||||||
"RfidReader", /* Name of the task */
|
"RfidReader", /* Name of the task */
|
||||||
10000, /* Stack size in words */
|
5115, /* Stack size in words */
|
||||||
NULL, /* Task input parameter */
|
NULL, /* Task input parameter */
|
||||||
rfidTaskPrio, /* Priority of the task */
|
rfidTaskPrio, /* Priority of the task */
|
||||||
&RfidReaderTask, /* Task handle. */
|
&RfidReaderTask, /* Task handle. */
|
||||||
|
68
src/wlan.cpp
68
src/wlan.cpp
@ -3,6 +3,8 @@
|
|||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <esp_wifi.h>
|
#include <esp_wifi.h>
|
||||||
#include <WiFiManager.h>
|
#include <WiFiManager.h>
|
||||||
|
#include <DNSServer.h>
|
||||||
|
#include <ESPmDNS.h>
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@ -10,10 +12,11 @@ WiFiManager wm;
|
|||||||
bool wm_nonblocking = false;
|
bool wm_nonblocking = false;
|
||||||
uint8_t wifiErrorCounter = 0;
|
uint8_t wifiErrorCounter = 0;
|
||||||
|
|
||||||
void initWiFi() {
|
void wifiSettings() {
|
||||||
// Optimierte WiFi-Einstellungen
|
// Optimierte WiFi-Einstellungen
|
||||||
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
|
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
|
||||||
WiFi.setSleep(false); // disable sleep mode
|
WiFi.setSleep(false); // disable sleep mode
|
||||||
|
WiFi.setHostname("FilaMan");
|
||||||
esp_wifi_set_ps(WIFI_PS_NONE);
|
esp_wifi_set_ps(WIFI_PS_NONE);
|
||||||
|
|
||||||
// Maximale Sendeleistung
|
// Maximale Sendeleistung
|
||||||
@ -24,19 +27,45 @@ void initWiFi() {
|
|||||||
|
|
||||||
// Aktiviere WiFi-Roaming für bessere Stabilität
|
// Aktiviere WiFi-Roaming für bessere Stabilität
|
||||||
esp_wifi_set_rssi_threshold(-80);
|
esp_wifi_set_rssi_threshold(-80);
|
||||||
|
}
|
||||||
|
|
||||||
|
void startMDNS() {
|
||||||
|
if (!MDNS.begin("filaman")) {
|
||||||
|
Serial.println("Error setting up MDNS responder!");
|
||||||
|
while(1) {
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serial.println("mDNS responder started");
|
||||||
|
}
|
||||||
|
|
||||||
|
void configModeCallback (WiFiManager *myWiFiManager) {
|
||||||
|
Serial.println("Entered config mode");
|
||||||
|
oledShowTopRow();
|
||||||
|
oledShowMessage("WiFi Config Mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
void initWiFi() {
|
||||||
|
// load Wifi settings
|
||||||
|
wifiSettings();
|
||||||
|
|
||||||
|
wm.setAPCallback(configModeCallback);
|
||||||
|
|
||||||
|
wm.setSaveConfigCallback([]() {
|
||||||
|
Serial.println("Configurations updated");
|
||||||
|
ESP.restart();
|
||||||
|
});
|
||||||
|
|
||||||
if(wm_nonblocking) wm.setConfigPortalBlocking(false);
|
if(wm_nonblocking) wm.setConfigPortalBlocking(false);
|
||||||
wm.setConfigPortalTimeout(320); // Portal nach 5min schließen
|
//wm.setConfigPortalTimeout(320); // Portal nach 5min schließen
|
||||||
|
wm.setWiFiAutoReconnect(true);
|
||||||
|
wm.setConnectTimeout(5);
|
||||||
|
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
oledShowMessage("WiFi Setup");
|
oledShowMessage("WiFi Setup");
|
||||||
|
|
||||||
bool res;
|
//bool res = wm.autoConnect("FilaMan"); // anonymous ap
|
||||||
// res = wm.autoConnect(); // auto generated AP name from chipid
|
if(!wm.autoConnect("FilaMan")) {
|
||||||
res = wm.autoConnect("FilaMan"); // anonymous ap
|
|
||||||
// res = wm.autoConnect("spoolman","password"); // password protected ap
|
|
||||||
|
|
||||||
if(!res) {
|
|
||||||
Serial.println("Failed to connect or hit timeout");
|
Serial.println("Failed to connect or hit timeout");
|
||||||
// ESP.restart();
|
// ESP.restart();
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
@ -52,6 +81,11 @@ void initWiFi() {
|
|||||||
|
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
display.display();
|
display.display();
|
||||||
|
|
||||||
|
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
// mDNS
|
||||||
|
startMDNS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,21 +93,31 @@ void checkWiFiConnection() {
|
|||||||
if (WiFi.status() != WL_CONNECTED)
|
if (WiFi.status() != WL_CONNECTED)
|
||||||
{
|
{
|
||||||
Serial.println("WiFi connection lost. Reconnecting...");
|
Serial.println("WiFi connection lost. Reconnecting...");
|
||||||
|
wifiOn = false;
|
||||||
oledShowTopRow();
|
oledShowTopRow();
|
||||||
oledShowMessage("WiFi reconnecting...");
|
oledShowMessage("WiFi reconnecting");
|
||||||
WiFi.reconnect(); // Versuche, die Verbindung wiederherzustellen
|
WiFi.reconnect(); // Versuche, die Verbindung wiederherzustellen
|
||||||
delay(5000); // Warte 5 Sekunden, bevor erneut geprüft wird
|
vTaskDelay(5000 / portTICK_PERIOD_MS); // Warte 5 Sekunden, bevor erneut geprüft wird
|
||||||
if (WiFi.status() != WL_CONNECTED)
|
if (WiFi.status() != WL_CONNECTED)
|
||||||
{
|
{
|
||||||
Serial.println("Failed to reconnect. Restarting WiFi...");
|
Serial.println("Failed to reconnect. Restarting WiFi...");
|
||||||
WiFi.disconnect();
|
WiFi.disconnect();
|
||||||
delay(1000);
|
Serial.println("WiFi disconnected.");
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
wifiErrorCounter++;
|
wifiErrorCounter++;
|
||||||
//initWiFi();
|
|
||||||
|
//wifiSettings();
|
||||||
|
WiFi.reconnect();
|
||||||
|
Serial.println("WiFi reconnecting...");
|
||||||
|
WiFi.waitForConnectResult();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Serial.println("WiFi reconnected.");
|
||||||
wifiErrorCounter = 0;
|
wifiErrorCounter = 0;
|
||||||
|
wifiOn = true;
|
||||||
|
oledShowTopRow();
|
||||||
|
startMDNS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user