diff --git a/printermonitor/OctoPrintClient.cpp b/printermonitor/OctoPrintClient.cpp
index 2db4341..204f9b9 100644
--- a/printermonitor/OctoPrintClient.cpp
+++ b/printermonitor/OctoPrintClient.cpp
@@ -23,14 +23,20 @@ SOFTWARE.
#include "OctoPrintClient.h"
-OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port) {
- updateOctoPrintClient(ApiKey, server, port);
+OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass) {
+ updateOctoPrintClient(ApiKey, server, port, user, pass);
}
-void OctoPrintClient::updateOctoPrintClient(String ApiKey, String server, int port) {
+void OctoPrintClient::updateOctoPrintClient(String ApiKey, String server, int port, String user, String pass) {
server.toCharArray(myServer, 100);
myApiKey = ApiKey;
myPort = port;
+ encodedAuth = "";
+ if (user != "") {
+ String userpass = user + ":" + pass;
+ base64 b64;
+ encodedAuth = b64.encode(userpass, true);
+ }
}
boolean OctoPrintClient::validate() {
@@ -59,21 +65,25 @@ WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) {
printClient.println(apiGetData);
printClient.println("Host: " + String(myServer) + ":" + String(myPort));
printClient.println("X-Api-Key: " + myApiKey);
+ if (encodedAuth != "") {
+ printClient.print("Authorization: ");
+ printClient.println("Basic " + encodedAuth);
+ }
printClient.println("User-Agent: ArduinoWiFi/1.1");
printClient.println("Connection: close");
if (printClient.println() == 0) {
Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed.");
Serial.println();
+ resetPrintData();
printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed.";
- printerData.state = "";
return printClient;
}
}
else {
Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect
Serial.println();
+ resetPrintData();
printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort);
- printerData.state = "";
return printClient;
}
@@ -177,6 +187,27 @@ void OctoPrintClient::getPrinterJobResults() {
printClient.stop(); //stop client
}
+// Reset all PrinterData
+void OctoPrintClient::resetPrintData() {
+ printerData.averagePrintTime = "";
+ printerData.estimatedPrintTime = "";
+ printerData.fileName = "";
+ printerData.fileSize = "";
+ printerData.lastPrintTime = "";
+ printerData.progressCompletion = "";
+ printerData.progressFilepos = "";
+ printerData.progressPrintTime = "";
+ printerData.progressPrintTimeLeft = "";
+ printerData.state = "";
+ printerData.toolTemp = "";
+ printerData.toolTargetTemp = "";
+ printerData.filamentLength = "";
+ printerData.bedTemp = "";
+ printerData.bedTargetTemp = "";
+ printerData.isPrinting = false;
+ printerData.error = "";
+}
+
String OctoPrintClient::getAveragePrintTime(){
return printerData.averagePrintTime;
}
@@ -210,7 +241,11 @@ String OctoPrintClient::getProgressPrintTime() {
}
String OctoPrintClient::getProgressPrintTimeLeft() {
- return printerData.progressPrintTimeLeft;
+ String rtnValue = printerData.progressPrintTimeLeft;
+ if (getProgressCompletion() == "100") {
+ rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint
+ }
+ return rtnValue;
}
String OctoPrintClient::getState() {
diff --git a/printermonitor/OctoPrintClient.h b/printermonitor/OctoPrintClient.h
index 8c694e5..0871868 100644
--- a/printermonitor/OctoPrintClient.h
+++ b/printermonitor/OctoPrintClient.h
@@ -24,6 +24,7 @@ SOFTWARE.
#pragma once
#include
#include
+#include
class OctoPrintClient {
@@ -31,7 +32,9 @@ private:
char myServer[100];
int myPort = 80;
String myApiKey = "";
+ String encodedAuth = "";
+ void resetPrintData();
boolean validate();
WiFiClient getSubmitRequest(String apiGetData);
@@ -61,9 +64,9 @@ private:
public:
- OctoPrintClient(String ApiKey, String server, int port);
+ OctoPrintClient(String ApiKey, String server, int port, String user, String pass);
void getPrinterJobResults();
- void updateOctoPrintClient(String ApiKey, String server, int port);
+ void updateOctoPrintClient(String ApiKey, String server, int port, String user, String pass);
String getAveragePrintTime();
String getEstimatedPrintTime();
diff --git a/printermonitor/Settings.h b/printermonitor/Settings.h
index 0c973b2..bd4fdb8 100644
--- a/printermonitor/Settings.h
+++ b/printermonitor/Settings.h
@@ -53,8 +53,11 @@ SOFTWARE.
// OctoPrint Monitoring -- Monitor your 3D printer OctoPrint Server
String OctoPrintApiKey = ""; // ApiKey from your User Account on OctoPrint
+String OctoPrintHostName = "octopi";// Default 'octopi' -- or hostname if different (optional if your IP changes)
String OctoPrintServer = ""; // IP or Address of your OctoPrint Server (DO NOT include http://)
int OctoPrintPort = 80; // the port you are running your OctoPrint server on (usually 80);
+String OctoAuthUser = ""; // only used if you have haproxy or basic athentintication turned on (not default)
+String OctoAuthPass = ""; // only used with haproxy or basic auth (only needed if you must authenticate)
const int WEBSERVER_PORT = 80; // The port you can access this device on over HTTP
const boolean WEBSERVER_ENABLED = true; // Device will provide a web interface via http://[ip]:[port]/
@@ -69,6 +72,7 @@ boolean DISPLAYCLOCK = true; // true = Show Clock when not printing / false =
const int I2C_DISPLAY_ADDRESS = 0x3c; // I2C Address of your Display (usually 0x3c or 0x3d)
const int SDA_PIN = D2;
const int SCL_PIN = D5;
+const boolean INVERT_DISPLAY = false; // true = pins at top | false = pins at the bottom
//#define DISPLAY_SH1106 // Uncomment this line to use the SH1106 display -- SSD1306 is used by default and is most common
boolean ENABLE_OTA = true; // this will allow you to load firmware to the device over WiFi (see OTA for ESP8266)
diff --git a/printermonitor/printermonitor.ino b/printermonitor/printermonitor.ino
index cdf0628..2a79341 100644
--- a/printermonitor/printermonitor.ino
+++ b/printermonitor/printermonitor.ino
@@ -27,7 +27,7 @@ SOFTWARE.
#include "Settings.h"
-#define VERSION "1.4"
+#define VERSION "1.5"
#define HOSTNAME "OctMon-"
#define CONFIG "/conf.txt"
@@ -83,7 +83,7 @@ String lastReportStatus = "";
boolean displayOn = true;
// OctoPrint Client
-OctoPrintClient printerClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort);
+OctoPrintClient printerClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass);
int printerCount = 0;
//declairing prototypes
@@ -100,13 +100,16 @@ const String WEB_ACTIONS = "OctoPrint API Key (get from your server)"
+ ""
""
""
+ ""
+ "
"
" Display Clock when printer is off"
" Use 24 Hour Clock (military time)
"
"Time Refresh (minutes)
"
"Theme Color
"
- ""
+ "
"
""
""
"";
@@ -154,6 +157,9 @@ void setup() {
// initialize dispaly
display.init();
+ if (INVERT_DISPLAY) {
+ display.flipScreenVertically(); // connections at top of OLED display
+ }
display.clear();
display.display();
@@ -195,6 +201,9 @@ void setup() {
// Inital UI takes care of initalising the display too.
ui.init();
+ if (INVERT_DISPLAY) {
+ display.flipScreenVertically(); //connections at top of OLED display
+ }
// print the received signal strength:
Serial.print("Signal Strength (RSSI): ");
@@ -256,6 +265,34 @@ void setup() {
}
flashLED(5, 500);
+ findMDNS(); //go find Octoprint Server by the hostname
+}
+
+void findMDNS() {
+ if (OctoPrintHostName == "") {
+ return; // nothing to do here
+ }
+ // We now query our network for 'web servers' service
+ // over tcp, and get the number of available devices
+ int n = MDNS.queryService("http", "tcp");
+ if (n == 0) {
+ Serial.println("no services found - make sure OctoPrint server is turned on");
+ return;
+ }
+ Serial.println("*** Looking for " + OctoPrintHostName + " over mDNS");
+ for (int i = 0; i < n; ++i) {
+ // Going through every available service,
+ // we're searching for the one whose hostname
+ // matches what we want, and then get its IP
+ Serial.println("Found: " + MDNS.hostname(i));
+ if (MDNS.hostname(i) == OctoPrintHostName) {
+ IPAddress serverIp = MDNS.IP(i);
+ OctoPrintServer = serverIp.toString();
+ OctoPrintPort = MDNS.port(i); // save the port
+ Serial.println("*** Found OctoPrint Server " + OctoPrintHostName + " http://" + OctoPrintServer + ":" + OctoPrintPort);
+ writeSettings(); // update the settings
+ }
+ }
}
//************************************************************
@@ -325,8 +362,11 @@ void handleUpdateConfig() {
return server.requestAuthentication();
}
OctoPrintApiKey = server.arg("octoPrintApiKey");
+ OctoPrintHostName = server.arg("octoPrintHostName");
OctoPrintServer = server.arg("octoPrintAddress");
OctoPrintPort = server.arg("octoPrintPort").toInt();
+ OctoAuthUser = server.arg("octoUser");
+ OctoAuthPass = server.arg("octoPass");
DISPLAYCLOCK = server.hasArg("isClockEnabled");
IS_24HOUR = server.hasArg("is24hour");
minutesBetweenDataRefresh = server.arg("refresh").toInt();
@@ -337,6 +377,7 @@ void handleUpdateConfig() {
temp = server.arg("stationpassword");
temp.toCharArray(www_password, sizeof(temp));
writeSettings();
+ findMDNS();
printerClient.getPrinterJobResults();
checkDisplay();
lastEpoch = 0;
@@ -374,8 +415,11 @@ void handleConfigure() {
String form = String(CHANGE_FORM);
form.replace("%OCTOKEY%", OctoPrintApiKey);
+ form.replace("%OCTOHOST%", OctoPrintHostName);
form.replace("%OCTOADDRESS%", OctoPrintServer);
form.replace("%OCTOPORT%", String(OctoPrintPort));
+ form.replace("%OCTOUSER%", OctoAuthUser);
+ form.replace("%OCTOPASS%", OctoAuthPass);
String isClockChecked = "";
if (DISPLAYCLOCK) {
isClockChecked = "checked='checked'";
@@ -730,8 +774,11 @@ void writeSettings() {
Serial.println("Saving settings now...");
f.println("UtcOffset=" + String(UtcOffset));
f.println("octoKey=" + OctoPrintApiKey);
+ f.println("octoHost=" + OctoPrintHostName);
f.println("octoServer=" + OctoPrintServer);
f.println("octoPort=" + String(OctoPrintPort));
+ f.println("octoUser=" + OctoAuthUser);
+ f.println("octoPass=" + OctoAuthPass);
f.println("refreshRate=" + String(minutesBetweenDataRefresh));
f.println("themeColor=" + themeColor);
f.println("www_username=" + String(www_username));
@@ -764,6 +811,11 @@ void readSettings() {
OctoPrintApiKey.trim();
Serial.println("OctoPrintApiKey=" + OctoPrintApiKey);
}
+ if (line.indexOf("octoHost=") >= 0) {
+ OctoPrintHostName = line.substring(line.lastIndexOf("octoHost=") + 9);
+ OctoPrintHostName.trim();
+ Serial.println("OctoPrintHostName=" + OctoPrintHostName);
+ }
if (line.indexOf("octoServer=") >= 0) {
OctoPrintServer = line.substring(line.lastIndexOf("octoServer=") + 11);
OctoPrintServer.trim();
@@ -773,6 +825,16 @@ void readSettings() {
OctoPrintPort = line.substring(line.lastIndexOf("octoPort=") + 9).toInt();
Serial.println("OctoPrintPort=" + String(OctoPrintPort));
}
+ if (line.indexOf("octoUser=") >= 0) {
+ OctoAuthUser = line.substring(line.lastIndexOf("octoUser=") + 9);
+ OctoAuthUser.trim();
+ Serial.println("OctoAuthUser=" + OctoAuthUser);
+ }
+ if (line.indexOf("octoPass=") >= 0) {
+ OctoAuthPass = line.substring(line.lastIndexOf("octoPass=") + 9);
+ OctoAuthPass.trim();
+ Serial.println("OctoAuthPass=" + OctoAuthPass);
+ }
if (line.indexOf("refreshRate=") >= 0) {
minutesBetweenDataRefresh = line.substring(line.lastIndexOf("refreshRate=") + 12).toInt();
Serial.println("minutesBetweenDataRefresh=" + String(minutesBetweenDataRefresh));
@@ -804,7 +866,7 @@ void readSettings() {
}
}
fr.close();
- printerClient.updateOctoPrintClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort);
+ printerClient.updateOctoPrintClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass);
timeClient.setUtcOffset(UtcOffset);
}