Homematic Neustarte aus IPS

Hallo,

kann man die Homematic CCU aus IPS heraus neu starten?

Da mir heute die Homematic ausgefallen ist, suche ich eine Möglichkeit die CCU per Skript neu zu starten. Habt Ihr eine Idee wie das geht.

Gruß Uwe

Wenn die CCU ausfällt, wird es schwierig diese von alleine zu starten, oder? :rolleyes:

Wenn du aber ein anderes Funksystem in IPS hast, kannst du die CCU aber Stromlos schalten und dann wieder an.

paresy

CCU aber Stromlos schalten

Das zieht aber einen Rattenschwanz hinter sich her. Batterien aus CCU raus, dafür mit USV absichern um wieder sicher gegen Stromausfälle zu sein.

Wenn „nur“ die Homematic-Dienste tot sind könnte man die CCU auch über Telnet neu starten. Wenn sie sich komplett daneben gelegt hat bleibt wohl nur der erste Weg.

Wie es aussah war nur der Funk / Dienst weg.

Gruß Uwe

Wenn Du Dir über Google die Extension besorgst (habe die erst heute abend zur Hand) und auf Deiner CCU der Telnet-Zugang aktiviert ist dann sollte das hier funktionieren:


<?

require_once "PHPTelnet.php";

$telnet = new PHPTelnet();

$server = "xxx.xxx.xxx.xxx"; // IP der CCU
$port = "23";
$loginname = "Benutzername";
$passwort= "Passwort";

$result = $telnet->Connect($server,$port,$loginname,$passwort);  // Login
IPS_Sleep(1000);
$telnet->DoCommand("reboot", $result);  //Reboot-Kommando
IPS_Sleep(1000);

$telnet->Disconnect($result); // Telnet Session beenden

?>

Starte damit alle paar Tage ein Modem neu wenn der Provider mal wieder einen Aussetzer hatte.

Und die PHPTelnet.php:


<?php
/*
PHPTelnet 1.1
by Antone Roundy
adapted from code found on the PHP website
public domain
*/

class PHPTelnet {
	var $show_connect_error=1;

	var $use_usleep=0;	// change to 1 for faster execution
		// don't change to 1 on Windows servers unless you have PHP 5
	var $sleeptime=125000;
	var $loginsleeptime=1000000;

	var $fp=NULL;
	var $loginprompt;
	
	var $conn1;
	var $conn2;
	
	/*
	0 = success
	1 = couldn't open network connection
	2 = unknown host
	3 = login failed
	4 = PHP version too low
	*/
	function Connect($server,$port,$user,$pass) {
		$rv=0;
		$vers=explode('.',PHP_VERSION);
		$needvers=array(4,3,0);
		$j=count($vers);
		$k=count($needvers);
		if ($k<$j) $j=$k;
		for ($i=0;$i<$j;$i++) {
			if (($vers[$i]+0)>$needvers[$i]) break;
			if (($vers[$i]+0)<$needvers[$i]) {
				$this->ConnectError(4);
				return 4;
			}
		}
		
		$this->Disconnect();
		
		if (strlen($server)) {
			if (preg_match('/[^0-9.]/',$server)) {
				$ip=gethostbyname($server);
				if ($ip==$server) {
					$ip='';
					$rv=2;
				}
			} else $ip=$server;
		} else $ip='127.0.0.1';
		
		if (strlen($ip)) {
			if ($this->fp=fsockopen($ip,$port)) {
				fputs($this->fp,$this->conn1);
				$this->Sleep();
				
				fputs($this->fp,$this->conn2);
				$this->Sleep();
				$this->GetResponse($r);
				$r=explode("
",$r);
				$this->loginprompt=$r[count($r)-1];

				fputs($this->fp,"$user\r");
				$this->Sleep();

				fputs($this->fp,"$pass\r");
				if ($this->use_usleep) usleep($this->loginsleeptime);
				else sleep(1);
				$this->GetResponse($r);
				$r=explode("
",$r);
				if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
					$rv=3;
					$this->Disconnect();
				}
			} else $rv=1;
		}
		
		if ($rv) $this->ConnectError($rv);
		return $rv;
	}
	
	function Disconnect($exit=1) {
		if ($this->fp) {
			if ($exit) $this->DoCommand('exit',$junk);
			fclose($this->fp);
			$this->fp=NULL;
		}
	}

	function DoCommand($c,&$r) {
		if ($this->fp) {
			fputs($this->fp,"$c\r");
			$this->Sleep();
			$this->GetResponse($r);
			$r=preg_replace("/^.*?
(.*)
[^
]*$/","$1",$r);
		}
		return $this->fp?1:0;
	}
	
	function GetResponse(&$r) {
		$r='';
		do { 
			$r.=fread($this->fp,1000);
			$s=socket_get_status($this->fp);
		} while ($s['unread_bytes']);
	}
	
	function Sleep() {
		if ($this->use_usleep) usleep($this->sleeptime);
		else sleep(1);
	}
	
	function PHPTelnet() {
		$this->conn1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
			chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
			chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
			chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
			chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
			chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
			chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
			chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
			chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
			chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
		$this->conn2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
			chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
	}
	
	function ConnectError($num) {
		if ($this->show_connect_error) switch ($num) {
		case 1: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break;
		case 2: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break;
		case 3: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break;
		case 4: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break;
		}
	}
}
?>

Hallo zusammen,

einer meiner beiden CCUs erzeugt ca. alle 1-8 Wochen einen Totalabsturz. Warum ist mir ein Rätsel. Wenn Sie abstützt, bekomme ich in IPS für alle möglichen Homematic Komponenten die Fehlermeldung „Gerät xyz, Kommunikation aktuell gestört“. Dann hilft nur ein Reset. Wenn man nicht zu Hause ist, wird das schwierig.

Dank Parsey’s einfachem wie effektiven Hinweis habe ich eine vorhandene FS20 Steckdose vor das Netzteil der CCU gesteckt. Die Steckdose schaltet für 15 Sekunden aus , wenn in dem String mit den CCU Fehlermeldungen 10 mal das Wort „aktuell“ vorkommt. Anschließend wird neugestartet. Die Batterie der CCU ist natürlich entfernt, das Netzteil wird nun über den FS20 Stecker und eine in unmittelbarer Nähe ohnehin vorhande USV mit Strom versorgt. Das funktioniert bestens!

Nur: wie bekomme ich die Fehlermeldung in der CCU weg, daß die eingebaute Pufferbatterie leer ist / fehlt? Bisher habe ich dazu keine Möglichkeit gefunden. Hat jemand eine Idee.

Beste Grüße

Axel

Eine Frage: Ist die CCU komplett weg oder würdest Du die über Telnet noch erreichen können?

Die Fehlermeldung wegen der fehlender Pufferbatterie bekommst Du mit einer kleinen Hardwaremodifikation unterdrückt. CCU aufschrauben und den Pluspol des Batteriefach über einen 1KOhm Widerstand mit dem Pluspol der Powerbuchse verbinden.

Aber dann keine Batterien mehr einlegen! :wink:

Hallo Kronos,

Das habe ich nicht getestet.

Ich kann auch noch gar nicht sagen, wann und wie oft die CCU jetzt neugestartet wurde, weil es ja automatisch geht und ich derzeit davon nichts mehr mitbekomme. Ich werde das mal mitloggen. Wenn das sicher läuft (so wie es bis jetzt aussieht), werde ich den FS20 Schalter rausnehmen, warten bis die CCU abschmiert und den Versuch mit Telnet machen.

@ Heimgeist, danke für den Hinweis! Ich hatte gehofft, es gibt eine Möglichkeit die Meldung per Konfiguration zu unterdrücken.

Beste Grüße

Axel

Hallo zusammen,

habe das Skript mal versucht bei mir zu starten und bekomme deine Fehlermeldung, mit der ich auch nach ein wenig googeln nix anfangen kann. Hat jemand eine Idee:

Notice: fputs(): send of 5 bytes failed with errno=10053 Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen.

VG Thorsten

Hat den reboot schon jemand über ssh bei der CCU2 realisiert ?

Schau Dir mal ein Tool Namens

plink.exe

an.

Mercie,

das bringt mich dahin, wo ich hin möchte!

Wie das schon im Fred angedeutet wurde, ist ein CCU-Neustart eine eher suboptimale Variante.
Fast immer ist es in solchen Fällen der „rfd“, der sich aufhängt (sollte man natürlich verifizieren) - entweder ein automatisches Neustart-Skript für den Dienst selbst basteln oder DIESE recht taugliche Variante als Workaround nutzen. Im Log erscheint dann auch ein entsprechender Eintrag.

Für die Hardcore-Reboot-Variante würde ich SSH der telnet-Geschichte vorziehen. Beispiel HIER. Die Lib dazu gibt es HIER als Download. Ist universell einsetzbar, man kann natürlich auch den „rfd“ neustarten :wink: - Ich nutze es u.a. um bei meinen Ubiquiti APs die Radios und LEDs nach Bedarf zu schalten.

Cheers
/Jens

Ich will ja eigentlich hoffen, dass ich diese „Notlösung“, wenn möglich nicht nutzen muss!

Aber es ist beruhigend zu wissen ,dass man könnte, wenn Mann müsste!

Ich hab mir auf jeden Fall jeweils einen Button für den IPS Dienst, den IPS Server und die ccu zum neu starten gemacht.

Neu starten der CCU ist immer doof.
Unter anderem verliert sie die Timer von Geräten welche nur gelegentlich eine Lebensmeldung senden oder die zwei Tage alte Lowbat Meldung und der Sender ist dann bald tot ohne das du es merkst. Dann merkt du erst das der Rauchmelder nicht mehr geht wenn die Bude brennt. (Mal etwas über trieben)

Michael

Ich bin mittlerweile dazu übergegangen, die CCU jede Nacht per Cronjob rebooten zu lassen, da mit die ständigen Probleme dami tauf dem Wecker gingen. Das funktionier seit ca 1/2 Jahr täglich problemlos.

Ansonsten währe es kein Problem, das ganze von Windows aus per putty zu realisieren, User/Password und Kommando in einem String mitgeben und fertig.

Und du bist sicher das noch alle batteriebetriebenen Geräte gehen ?
Durch die ganzen Neustarts meiner CCU (wegen RS485 Probleme) habe ich zwei Lowbat Meldungen übersehen.
Die Lowbat sind weg nach dem Neustart und die Lebenszeichen der Sensoren größer 1 Tag. Somit auch keine Kommunikationsstörung und ich habe erst jetzt gemerkt das zwei Geräte tot sind.
Michael

Regelmäßige Neustarts halte ich auch für groben Unfug. Ich habe damit selbst schon Erfahrungen gesammelt und die waren durchweg negativ.
Ich will damit nicht sagen, dass es wie bei @Tuxtom007 in einzelnen, speziellen Fällen nicht hilft. Es setzt allerdings voraus, dass die Geräte dagegen „unempfindlich“ sind. Z.B. bei: Geräten, die oft ihren Status melden (Heizung,…), nicht-batteriebetrieben sind, man den Status nicht zwingend für eine Weiterverarbeitung benötigt, o.ä.
Aber selbst bei 230V-Aktoren kann man sich nicht sicher sein, dass der Status in IPS vor der ersten Bedienung (manuell oder per Skript) auch wirklich der Realität entspricht.

Wie dem auch sei, ein Neustart beseitigt so oder so nicht die eigentliche Ursache des Problems.

Cheers
/Jens