Browse Source

Add octoprint homepage item

your name 5 years ago
parent
commit
5b31c6b4ab

+ 9 - 1
api/config/default.php

@@ -183,6 +183,7 @@ return array(
 	'homepageOrderWeatherAndAir' => '23',
 	'homepageOrderSpeedtest' => '24',
 	'homepageOrderNetdata' => '25',
+	'homepageOrderOctoprint' => '26',
 	'homepageShowStreamNames' => false,
 	'homepageShowStreamNamesAuth' => '1',
 	'homepageStreamRefresh' => '60000',
@@ -387,8 +388,15 @@ return array(
 	'netdata6Enabled' => false,
 	'netdata7Enabled' => false,
 	'netdataCustom' => '{
-    
+
 	}',
+	'homepageOctoprintEnabled' => true,
+	'homepageOctoprintAuth' => '1',
+	'homepageOctoprintRefresh' => 10000,
+	'octoprintURL' => 'http://octopi.local',
+	'octoprintToken' => '',
+	'octoprintHeaderToggle' => true,
+	'octoprintHeader' => 'Octoprint',
 	'githubMenuLink' => true,
 	'organizrSupportMenuLink' => true,
 	'organizrDocsMenuLink' => true,

+ 34 - 0
api/functions/homepage-connect-functions.php

@@ -77,6 +77,9 @@ function homepageConnect($array)
 		case 'getNetdata':
 			return getNetdata();
 			break;
+		case 'getOctoprint':
+		  return getOctoprint();
+			break;
 		default:
 			# code...
 			break;
@@ -2888,6 +2891,37 @@ function getNetdata()
 	}
 }
 
+function getOctoprint()
+{
+	if ($GLOBALS['homepageOctoprintEnabled'] && !empty($GLOBALS['octoprintURL']) && !empty($GLOBALS['octoprintToken']) && qualifyRequest($GLOBALS['homepageOctoprintAuth'])) {
+		$api = [];
+		$url = qualifyURL($GLOBALS['octoprintURL']);
+		$endpoints = ['job', 'settings'];
+		$api['data']['url'] = $GLOBALS['octoprintURL'];
+		foreach ($endpoints as $endpoint) {
+			$dataUrl = $url . '/api/' . $endpoint;
+			try {
+				$headers = array('X-API-KEY' => $GLOBALS['octoprintToken']);
+				$response = Requests::get($dataUrl, $headers);
+				if ($response->success) {
+					$json = json_decode($response->body, true);
+
+					$api['data'][$endpoint] = $json;
+
+					$api['options'] = [
+						'title' => $GLOBALS['octoprintHeader'],
+						'titleToggle' => $GLOBALS['octoprintHeaderToggle'],
+					];
+				}
+			} catch (Requests_Exception $e) {
+				writeLog('error', 'Octoprint Function - Error: ' . $e->getMessage(), 'SYSTEM');
+			};
+		}
+		$api = isset($api) ? $api : false;
+		return $api;
+	}
+}
+
 function testAPIConnection($array)
 {
 	switch ($array['data']['action']) {

+ 77 - 2
api/functions/homepage-functions.php

@@ -28,6 +28,7 @@ function homepageOrder()
 		"homepageOrderWeatherAndAir" => $GLOBALS['homepageOrderWeatherAndAir'],
 		"homepageOrderSpeedtest" => $GLOBALS['homepageOrderSpeedtest'],
 		"homepageOrderNetdata" => $GLOBALS['homepageOrderNetdata'],
+		"homepageOrderOctoprint" => $GLOBALS['homepageOrderOctoprint'],
 	);
 	asort($homepageOrder);
 	return $homepageOrder;
@@ -409,6 +410,18 @@ function buildHomepageItem($homepageItem)
 				';
 			}
 			break;
+		case 'homepageOrderOctoprint':
+			if ($GLOBALS['homepageOctoprintEnabled']) {
+				$item .= '<div class="white-box"><h2 class="text-center" lang="en">Loading Octoprint...</h2></div>';
+				$item .= '
+				<script>
+				// Octoprint
+				homepageOctoprint("' . $GLOBALS['homepageOctoprintRefresh'] . '");
+				// End Octoprint
+				</script>
+				';
+			}
+			break;
 		default:
 			# code...
 			break;
@@ -2995,7 +3008,62 @@ function getHomepageList()
 				),
 			)
 		),
-		netdataSettngsArray()
+		netdataSettngsArray(),
+		array(
+			'name' => 'Octoprint',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/octoprint.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageOctoprintEnabled',
+						'label' => 'Enable',
+						'value' => $GLOBALS['homepageOctoprintEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageOctoprintAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $GLOBALS['homepageOctoprintAuth'],
+						'options' => $groups
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'octoprintURL',
+						'label' => 'URL',
+						'value' => $GLOBALS['octoprintURL'],
+						'help' => 'Enter the IP:PORT of your Octoprint instance e.g. http://octopi.local'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'octoprintToken',
+						'label' => 'API Key',
+						'value' => $GLOBALS['octoprintToken'],
+						'help' => 'Enter your Octoprint API key, found in Octoprints settings page.'
+					),
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'octoprintHeader',
+						'label' => 'Title',
+						'value' => $GLOBALS['octoprintHeader'],
+						'help' => 'Sets the title of this homepage module',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'octoprintToggle',
+						'label' => 'Toggle Title',
+						'value' => $GLOBALS['octoprintHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+				),
+			)
+		),
 	);
 }
 
@@ -3163,6 +3231,13 @@ function buildHomepageSettings()
 					$class .= ' faded';
 				}
 				break;
+			case 'homepageOrderOctoprint':
+				$class = 'bg-success';
+				$image = 'plugins/images/tabs/octoprint.png';
+				if (!$GLOBALS['homepageOctoprintEnabled']) {
+					$class .= ' faded';
+				}
+				break;
 			default:
 				$class = 'blue-bg';
 				$image = '';
@@ -3197,4 +3272,4 @@ function ombiTVDefault($type)
 			return false;
 	}
 	return false;
-}
+}

+ 124 - 0
js/functions.js

@@ -7905,6 +7905,130 @@ function tryUpdateNetdata(array){
     });
     return existing;
 }
+function homepageOctoprint(timeout){
+    var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh;
+    organizrAPI('POST','api/?v1/homepage/connect',{action:'getOctoprint'}).success(function(data) {
+        try {
+            var response = JSON.parse(data);
+        }catch(e) {
+            console.log(e + ' error: ' + data);
+            orgErrorAlert('<h4>' + e + '</h4>' + formatDebug(data));
+            return false;
+        }
+        document.getElementById('homepageOrderOctoprint').innerHTML = '';
+        if(response.data !== null){
+            $('#homepageOrderOctoprint').html(buildOctoprint(response.data));
+        }
+    }).fail(function(xhr) {
+        console.error("Organizr Function: API Connection Failed");
+    });
+    var timeoutTitle = 'Octoprint-Homepage';
+    if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
+    timeouts[timeoutTitle] = setTimeout(function(){ homepageOctoprint(timeout); }, timeout);
+}
+function buildOctoprint(array){
+	var menu = `<ul class="nav customtab nav-tabs pull-right" role="tablist">`;
+	var headerAlt = '';
+	var header = '';
+	var content = '';
+	var webcamUrl = '';
+	var webcamHtml = '';
+	var css = `
+	<style>
+	.octoprint-webcam {
+		max-height: 400px;
+		max-width: 100%;
+		float: right;
+	}
+	.octoprint-block {
+		margin-left: 0px;
+		margin-right: 0px;
+	}
+	.octoprint-button-spacer {
+		padding-right: 46px;
+	}
+	</style>
+	`;
+	menu += `
+		<li role="presentation" class="active" ><a href="" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="true" onclick="homepageOctoprint();"><span class="visible-xs"><i class="ti-download"></i></span><span class="hidden-xs">REFRESH</span></a></li>
+		`;
+	menu += '</ul>';
+	if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
+		var headerAlt = `
+		<div class="col-md-12">
+			<h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/octoprint.png">  &nbsp; </h2>
+			`+menu+`
+			<hr class="hidden-xs"><div class="clearfix"></div>
+		</div>
+		<div class="clearfix"></div>
+		`;
+	}else{
+		var header = `
+		<div class="white-box bg-info m-b-0 p-b-0 p-t-10 mailbox-widget">
+			<h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/octoprint.png">  &nbsp; </h2>
+			`+menu+`
+			<div class="clearfix"></div>
+		</div>
+		`;
+	}
+	content = '<p>State: '+array.data.job.state+'</p>';
+	if (array.data.job.state == "Printing") {
+		content += '<p>File: '+array.data.job.job.file.display+'</p>';
+		content += '<p>Progress: '+parseFloat(array.data.job.progress.completion).toFixed(0)+'%</p>';
+		content += '<p>Approx. Total Print Time: '+octoprintFormatTime(array.data.job.job.estimatedPrintTime)+'</p>';
+		content += '<p>Print Time Left: '+octoprintFormatTime(array.data.job.progress.printTimeLeft)+'</p>';
+	}
+	if (array.data.settings.webcam.webcamEnabled) {
+		webcamUrl = array.data.settings.webcam.streamUrl;
+		if (webcamUrl[0] == "/") {
+			webcamUrl = array.data.url + webcamUrl;
+		}
+	}
+	if (webcamUrl) {
+		var webcamHtml = `<div class="col-lg-4"><img class="octoprint-webcam" src="`+webcamUrl+`"></div>`;
+	}
+	return css+`
+	<div class="row">
+		`+headerAlt+`
+		<div class="col-lg-12">
+			`+header+`
+			<div class="row octoprint-block white-box">
+				<div class="col-lg-8 text-white">
+						<div class="tab-content m-t-0">`+content+`</div>
+				</div>
+				`+webcamHtml+`
+			</div>
+		</div>
+	</div>
+	`;
+}
+function octoprintFormatTime(seconds) {
+	var format = "";
+	var days = Math.floor(moment.duration(seconds,'seconds').asDays());
+	var hours = Math.floor(moment.duration(seconds,'seconds').asHours());
+	var minutes = moment.duration(seconds,'seconds').minutes()
+	var seconds = moment.duration(seconds,'seconds').seconds()
+	if (days > 0) {
+		format += days + " "+octoprintPluralize("day", days)+" ";
+	}
+	if (hours > 0) {
+		format += hours + " "+octoprintPluralize("hour", hours)+" ";
+	}
+	if (minutes > 0) {
+		format += minutes + " "+octoprintPluralize("minute", minutes)+" ";
+	}
+	if (seconds > 0) {
+		format += seconds + " "+octoprintPluralize("second", seconds)+" ";
+	}
+	return format;
+}
+
+function octoprintPluralize(s, n) {
+	if (n > 1) {
+		return s+"s";
+	}
+	return s
+}
 // Thanks Swifty!
 function PopupCenter(url, title, w, h) {
     // Fixes dual-screen position                         Most browsers      Firefox

BIN
plugins/images/tabs/octoprint.png