Kennt jemand NUT und hat das in IPS?

Hallo,

ich habe schwer mit Stromausfällen zu kämpfen, dia auch mal deutlich über eine Stunde dauern und daher die Geräte „geordnet“ in einer bestimmten Reihenfolge runter gefahren werden müssen.

Bezüglich des NAS weiss ich, dass dieses „NUT“ „spricht“ und darüber wohl gesteuert werden kann.

Hat damit jemand schon rumgebastelt?

Danke
jwka

Moin…

hat Dein NAS eine Weboberfläche!? Würde mir mal den Quelltext anschauen bzw. die Befehle mitlesen wenn Du den Shutdown Button drückst!

Bei meinem HP NAS muss ich nur ein http Befehl senden und es fährt runter!! Ohne Login etc…

Checken ob es runtergefahren ist mach ich über ein Ping der IP!

Gruß,

Peter

Hi Peter,

macht Sinn und ich werde das mal checken. Via Weboberfläche muss ich aber noch ok-button etc. drücken.

Wäre natürlich schon interessant, ob es auch auf einzelne Befehle direkt reagiert (wie Deins). Ich habe ein Netgear ReadyNas Duo. Ich werd’ mal suchen gehen.

Danke auf jeden Fall für den Tip!

NUT Know How wäre aber trotzdem interessant, weil darüber auch das UPS abgefragt werden kann, und sich damit eine bessere „Load Balancing“ Steurung ergeben könnte.

jwka

Hallo jwka,

Bist Du da inzwischen weiter gekommen?

Ich frage bei meinem APC UPS den Status über NUT aus. Bei den meisten Komponenten benutze ich SNMP aber beim UPS, der nur USB Anschluss hat, musste ich mich mit NUT anfreunden. Ist jedoch relativ einfach. Du musst in IPS ein Client Socket auf Port 3493 (falls dein UPS oder NAS den standard NUT port nutzten) einrichten, darauf die NUT Befehle senden und dann mit einer Register Variable die Antworten abfangen.

Eine ausführliche Beschreibung des NUT protocols findest Du hier: Network UPS Tools - Documentation. Ich frage nur die Werte von Variablen ab aber steuern ist sicherlich auch möglich.

Gruß,

Zapp

Es steht noch auf der schier unendlich langen Liste meiner ToDo’s.

Daher hoffte ich ja hier auf eine fertige Lösung …

Die Seite mit dem Protokoll etc. hatte ich auch schon gefunden, aber das ist ja ert nur die halbe Miete. Ausprobieren ist das zeitraubende.

Könntest Du vielleicht Dein Script einstellen? Das würde mir schonmal die Bürde abnehmen, die Befehle raus zu suchen, die ich brauche, denn in Deinem Screenshot habe ich gesehen, dass Du auch das abfragst, was ich gerne tun würde.

Steuerst Du auch in abhägigkeit des Batteriestands Geräte? Bei mir ist es z.B. so, dass ich in meiner „Infrastruktur“ ein paar Server auf Notebooks betreibe und die würde ich bei Batteriestand „X“ schonmal vom Netz nehmen (ich denke da an bistabile Aktoren), um den Stand-PCs im Falle des Falls ein paar Minuten mehr Zeit zu geben.

Hintergrund ist, dass in meinem Gebiet Stromausfälle an der Tagesordnung sind und das die auch schonmal zwei Stunden dauern könnenen - ober, was fast schlimmer ist, 5 oder sechs mal 10-15 min., sodass sich der Ladezustand nicht wirklich weit genug aufbauen kann.

Danke
jwka

Klar. Hier sind die Scripts.

Der NUT Server läuft bei mir auf meinem QNAP NAS (ist auf dem NAS vorinstalliert). Der kommuniziert mit dem UPS und hat schon standardmässig eine Shutdown funktion integriert. Es erlaubt auch die Einrichtung von NUT Clients, an die er informationen vom UPS weiterleiten kann. Zum Runterfahren des PCs, auf dem IPS läuft, nutze ich WinNUT. Also keine direkte steuerung von IPS aus. Ist sicherlich möglich, aber WinNUT macht das ganz gut.

RequestNUT script (Alle paar Minuten via Timer ausführen). Instanz IDs ersetzen.


// NUT device key in den NUT Server Settings
$nut_device_key = "qnapups";  

// Beispiel (andere Variablen auf http://www.networkupstools.org/docs/developer-guide.chunked/apas01.html)
requestNUTVar("ups.status");
requestNUTVar("battery.charge");

function requestNUTVar($data_request) {
	global $nut_device_key;

	$TX_BUF = "GET VAR " . $nut_device_key . " " . $data_request ."
"; 

 	// send request to NUT server
 	$nut_response = CSCK_SendText(22823 /*[UPS NUT]*/ , $TX_BUF);

	IPS_Sleep(200);
}

Vorher musst du ein ClientSocket in IPS einrichten mit der IP deines NUT Servers (bei mir der NAS) und port 3493. Dann eine RegisterVariable einrichten mit dem Client Socket als „Parent Instanz“ und folgendem Target Script (bei mir heist der GetNUTResponse). Das Script richtet automatisch die Variablen in IPS ein, wenn diese nicht existieren.


$NUT_Response = trim($IPS_VALUE);

decodeNUTVar($NUT_Response);

function decodeNUTVar($NUT_Response) { 
	// use regex to locate the requested data

	// for numeric data
	if (preg_match("/^VAR \S+ (\S+) \"(\d*\.?\d*)\"$/", $NUT_Response, $scratch) != 0) { // from cacti-nut by Eric A. Hall
      $UPSvarName  = $scratch[1];
      $UPSvarValue = trim($scratch[2]);
      // create or fill variable
      $UPSvarID = @IPS_GetVariableIDByName($UPSvarName, 35113  /*[UPS]*/);
      if($UPSvarID === false)
		{
			// The variable does not exist. Create and fill it.
			$UPSvarID = IPS_CreateVariable(1);  // Create new Integer Variable
			IPS_SetParent ($UPSvarID, 35113  /*[UPS]*/);
			IPS_SetName($UPSvarID, "$UPSvarName");
			SetValue($UPSvarID, $UPSvarValue);
		} else {
		       // The Variable already exists. Just update it.
 			SetValue($UPSvarID, $UPSvarValue);
		}
	}
	// if not numeric
	elseif (strpos($NUT_Response, "ERR") === false) {
	  preg_match("/^VAR \S+ (\S+) \"(.*)\"$/", $NUT_Response, $scratch);

      $UPSvarName  = $scratch[1];
      $response = trim($scratch[2]);
      $UPSvarValue = getUPSStatus($response);

      // create or fill variable
      $UPSvarID = @IPS_GetVariableIDByName($UPSvarName, 35113  /*[UPS]*/);
      if($UPSvarID === false)
		{
			// The variable does not exist. Create and fill it.
			$UPSvarID = IPS_CreateVariable(3);  // Create new String Variable
			IPS_SetParent ($UPSvarID, 35113  /*[UPS]*/);
			IPS_SetName($UPSvarID, "$UPSvarName");
			SetValue($UPSvarID, $UPSvarValue);
		} else {
			// The Variable already exists. Just update it.
 			SetValue($UPSvarID, $UPSvarValue);
		}
	}
   // if error
	else {
	   $text = explode(" ", $NUT_Response);
	   $NUTError = "ERROR: $text[1]
";  // \"$data_request\"
	   IPS_LogMessage("NUT Response", "$NUTError");
	}

function getUPSStatus($status) {
   //Possible values for status (NUT protocol):
	$replace = array(	'OL' 		=> 'On line (mains is present)',
				'OB' 		=> 'On battery (mains is not present)',
				'LB' 		=> 'Low battery',
				'RB' 		=> 'The battery needs to be replaced',
				'CHRG' 	=> 'The battery is charging',
				'DISCHRG'=> 'The battery is discharging (inverter is providing load power)',
				'BYPASS' => 'UPS bypass circuit is active - no battery protection is available',
				'CAL' 	=> 'UPS is currently performing runtime calibration (on battery)',
				'OFF' 	=> 'UPS is offline and is not supplying power to the load',
				'OVER' 	=> 'UPS is overloaded',
				'TRIM' 	=> 'UPS is trimming incoming voltage (called "buck" in some hardware)',
				'BOOST' 	=> 'UPS is boosting incoming voltage'
	);
	return str_replace_assoc($replace, $status);
}

function str_replace_assoc(array $replace, $subject) {
   return str_replace(array_keys($replace), array_values($replace), $subject);
}

Zur Zeit nicht über IPS aber mit WinNUT. Wenn ich mehr Zeit habe, mach ich das mal über IPS.

Geht mir auch so. Deshalb habe ich mir das UPS geholt. Ausserdem habe ich hier im Haus ein sehr altes und schlechtes Stromnetzwerk (Ist ein Miethaus :() und da gibt es regelmässig Probleme. Tat mir einfach weh, NAS und PC 3 mal hintereinander abrupt stoppen und wieder starten zu sehen.

Gruss,

Zapp

Danke für die Idee, ich hab es mit meinem Synology NAS auf demselben Weg auch umgesetzt bekommen, allerdings mit diesem Skript.

Die USV lässt also den NAS runterfahren, der wiederum fährt dabei via NUT den IPS-Server runter. Sobald der Strom wieder da ist, fährt der NAS ja automatisch hoch. Damit sich auch der IPS-Server wieder einschaltet, löst der NAS bei seinem Neustart ein Wake on Lan aus. Funktioniert. :slight_smile:

Grüße
galleto