Dect 200 Steuerung über php

meintau

Neuer User
Mitglied seit
18 Nov 2014
Beiträge
10
Punkte für Reaktionen
0
Punkte
0
Hallo ich heiße Andreas und ich wende mich an euch.

Ich habe einen Sun Watch der meine Photovoltaikanlage überwacht (php)
.http://sun-watch.net
Außerdem eine Fritzbox 7490 und 3 Dect 200 Steckdosen.
Ziel soll sein bei überschuss- der Solaranlage die Steckdose zu schalten.
Ich möchte erst mal eine Anzeige sehen und der Programmierer würde das dann in der Software ändern falls es geht.
Andere Dosen von Edimax würden gehen aber warum eine andere kaufen.
Ich versuche jetzt schon seit 2 tagen ohne Erfolg.Braucht man da Fhem dazu oder irgend etwas anderes ?
Habe php Daten auf den Server geladen und versucht darauf zu zugreifen.Die waren von robw (smarthome.php).
Kann mir jemand irgendwie helfen ich weiß sind dürftige Angaben.Bin ein Anfänger.

Danke Andreas
 
Schau mal hier.Das Script schaltet die Steckdose und kann Infos abrufen, allerdings ohne Weboberfläche, nur auf "Kommandozeile". Vielleicht kannst du damit was anfangen.
 
Danke euch.Aber bin wahrscheinlich zu blöd oder irgendeine Einstellung der fritzbox stimmt nicht.
Bekomme diesen fehler Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /data/www/dect/smarthome.php on line 31.
Für heute mach ich Schluss sind jetzt wieder 2 Stunden versuchen.
Ich habe die Datei auf den Server in das Verzeichnis Dect geladen.
Dann http://die IP des Servers /dect/smarthome.php https habe ich auch versucht bekomme dann die Abfrage des Sun Watch Servers Benutzer/Passwort.
Nach Eingabe kommt nichts mehr.

Gruß Andreas
 
Hallo,
ich habe da auch mal eine Frage. Ich möchte die Datensicherung auf meinem PC mit Acronis automatisieren. Gesichert wird auf einer externen USB-Platte, das ganze läuft über den Aufgabenplaner in Windows. In Acronis kann ich eine Aktion vor der Sicherung und eine nach der Sicherung definieren. In der vorher-Aktion würde ich gerne eine Dect200 einschalten, an der das USB-Laufwerk hängt, danach ausschalten. Besteht eine Chance, dies über eine Windows-Batchprozedur zum Laufen zu bringen, d.h. per Windows-Batch die DECT200 schalten kann, oder brauche ich explizit php und damit einen php-Server. Wenn ja, kann dann die FB7390 der Server ein?
 
Probiers mal mit dem angehängten Programm. Wenn das Programm ohne Parameter auf der Kommandozeile gestartet wird, wirft es die möglichen/notwendigen Parameter aus. Man kann damit allerdings nur ein- oder ausschalten, über das Browserinterface der Box eingestellte Schaltzeiten oder Standby-Schwellwerte werden aber berücksichtigt.
 

Anhänge

  • FritzAHAc-0.9.zip
    1,001.3 KB · Aufrufe: 120
Danke, probiere ich am Wochenende gleich aus.
 
@chked : Hat funktioniert, vielen Dank.
 
Hab vor einigen Wochen ein möglichst simples PHP-Script geschrieben für die FritzDect!200. Vielleicht ist es jemandem ja nützlich.
Benötigt allerdings FW 6.20 mit XML-Ausgabe der Werte.

Code:
<?php
/*	very simple demonstration script for FritzDect200 powerswitch
 * 	with integrated powermeter and temperature sensor.
 * 	works maybe with other dect and powerline devices from AVM.
 *  
*/ 
	$version = "0.1";
	$date	 = "31.10.2014";
/*	author:      Felix (fe-X/Felix_)
 * 
 *     function get_sid() stolen from fritz_aha_reader2.phps V2.2 25.09.2014
 *	http://www.tdressler.net/ipsymcon/fritz_aha.html
 */


//config
	$host		= '192.168.1.1';
	$password 	= 'your-password';
//

	$loginURL	= "http://" . $host . "/login_sid.lua";
	$fd200URL	= "http://" . $host . "/webservices/homeautoswitch.lua";

	$sid = get_sid($loginURL, $password);
	
	if(!empty($_GET['switchcmd'])){
		file_get_contents($fd200URL . '?ain=' . $_GET['ain'] . '&switchcmd=' . $_GET['switchcmd'] . '&sid=' . $sid);
		sleep(4);
	}
	
	$xmlstring = rtrim(file_get_contents($fd200URL . '?sid=' 
		. $sid
		. "&switchcmd=getdevicelistinfos"));

	$xml = simplexml_load_string($xmlstring);
	//var_dump($xml);
	foreach($xml->device as $device){
		
		$info = $device->attributes();
		$productname		= $info->productname;
		$manufacturer 		= $info->manufacturer;
		$identifier 		= $info->identifier;
		$id			= $info->id;
		$fwversion		= $info->fwversion;
		
		$functionbitmask 	= $info->functionbitmask;
		$functionDect		= (($functionbitmask & bindec('10000000000')) == 0) ? "no" : "yes";
		$functionPowerswitch	= (($functionbitmask & bindec('01000000000')) == 0) ? "no" : "yes";
		$functionTempsensor	= (($functionbitmask & bindec('00100000000')) == 0) ? "no" : "yes";
		$functionPowermeter	= (($functionbitmask & bindec('00010000000')) == 0) ? "no" : "yes";

		$present		= $device->present;
		$name			= $device->name;
		
		$switch = $device->switch;
		$switch_state		= $switch->state;
		$switch_mode		= $switch->mode;
		$switch_lock		= $switch->lock;
		
		$powermeter = $device->powermeter;
		$powermeter_power	= $powermeter->power;
		$powermeter_energy	= $powermeter->energy;
		
		$temperature = $device->temperature;
		$temperature_celsius	= $temperature->celsius;
		$temperature_offset	= $temperature->offset;
		
		
		if(!empty($_GET['getdata'])){
			echo time() . ",";
			
		}elseif(!empty($_GET['set'])){
			echo "OK";
		}else{
			$on	= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchon">on</a>';
			$off	= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchoff">off</a>';
			$toggle	= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchtoggle">toggle</a>';
			$renew  = '<a href="' . $_SERVER['PHP_SELF'] . '">renew</a>';
			
			echo "<pre>
			very simple demonstration script for FritzDect!200
			version $version / $date
			
				productname			$productname
				manufacturer			$manufacturer
				identifier			$identifier
				id				$id
				firmware version		$fwversion
				
				function bitmask		$functionbitmask
					dect repeater		$functionDect
					powerswitch		$functionPowerswitch
					temperaturesensor 	$functionTempsensor
					powermeter		$functionPowermeter
				
				name				$name
				present		(0/1)		$present

				switch
					state	(0/1)		$switch_state	$on $off $toggle
					mode 	(manuell/auto)	$switch_mode
					lock	(0/1)		$switch_lock
				powermeter
					power	(mW)		$powermeter_power
					energy	(Wh)		$powermeter_energy
				temperature
					celsius	(0.1C)		$temperature_celsius
					offset	(K)		$temperature_offset
					
				$renew
			</pre>";
		}
	}
			
function get_sid ($loginurl,$password) {
	// get challenge string
	$http_response = file_get_contents($loginurl);
	$xml = simplexml_load_string($http_response);
	$challenge=(string)$xml->Challenge;
	$sid=(string)$xml->SID;

	 if ((strlen($sid)>0) && (preg_match("/^[0]+$/",$sid)) && $challenge) {
		//sid is null, got challenge
		$sid="";
		//build password response
		$pass=$challenge."-".$password;
		//UTF-16LE encoding as required
		$pass=mb_convert_encoding($pass, "UTF-16LE");
		//md5hash on top
		$md5 = md5($pass);
		//final answer string
		$challenge_response = $challenge."-".$md5;
		//send to box
		$url=$loginurl."?response=".$challenge_response;
		$http_response = file_get_contents($url);
		//check answer
		$xml = simplexml_load_string($http_response);
		$sid=(string)$xml->SID;
		if ((strlen($sid)>0) && !preg_match("/^[0]+$/",$sid)) {
			//is not null, bingo!
			return $sid;
		}
	}else{ 
		//use existing sid if $sid matches an hex string
		if ((strlen($sid)>0) && (preg_match("/^[0-9a-f]+$/",$sid))){
			return $sid;
		}
	} 
	return null;
}//function

?>

Verbesserungsvorschläge sind willkommen. Gerne nehme ich auch entgegen, wie es mit mehreren Geräten funktioniert und/oder mit Repeater/Powerline-Geräten. Ich habe nur genau eine FBDect!200-Dose und kann folglich nur genau das testen.

Grüsse

Felix_)
 
Zuletzt bearbeitet:
Und auf welchem Gerät lässt Du das Skript laufen, d.h. wo läuft dein Webserver?
 
Und auf welchem Gerät lässt Du das Skript laufen, d.h. wo läuft dein Webserver?

Auf einem QNAP TS-220 im LAN. Spielt aber m.E. keine Rolle, sofern der Server die FB über konfigurierte IP/Login erreichen kann. Werde mal testen, ob das von extern möglich ist.

Felix
 
Volià. Damit gehts auch von extern (der Server muss https aus php erlauben):

Code:
<?php
/*	very simple demonstration script for FritzDect200 powerswitch
 * 	with integrated powermeter and temperature sensor.
 * 	works maybe with other dect and powerline devices from AVM.
 *  
*/ 
	$version   = "0.2";
	$date	 = "05.12.2014";
/*	author:	 Felix (fe-X / Felix_)
 * 
 *	function get_sid() stolen from fritz_aha_reader2.phps V2.2 25.09.2014
 *	http://www.tdressler.net/ipsymcon/fritz_aha.html
 *	extended for use with username and https
 */


//config
	$host		= ''; //IP or URL (e.g. abc123.myfritz.net)
	$user		= ''; //username
	$password 	= ''; //your password
//

	$loginURL	= "https://" . $host . "/login_sid.lua";
	$fd200URL	= "https://" . $host . "/webservices/homeautoswitch.lua";

	$context = stream_context_create(array (
        'http' => array (
            'method' => 'GET',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
			)
		)
	);
	
	$sid = get_sid($loginURL, $user, $password, $context);
	
	if(!empty($_GET['switchcmd'])){
		file_get_contents($fd200URL . '?ain=' . $_GET['ain'] . '&switchcmd=' . $_GET['switchcmd'] . '&sid=' . $sid, false, $context);
		sleep(4);
	}
	
	$xmlstring = rtrim(file_get_contents($fd200URL . '?sid=' 
		. $sid
		. "&switchcmd=getdevicelistinfos", false, $context));

	$xml = simplexml_load_string($xmlstring);
	//var_dump($xml);
	foreach($xml->device as $device){
		
		$info = $device->attributes();
		$productname		= $info->productname;
		$manufacturer 		= $info->manufacturer;
		$identifier 		= $info->identifier;
		$id					= $info->id;
		$fwversion			= $info->fwversion;
		
		$functionbitmask 	= $info->functionbitmask;
		$functionDect		= (($functionbitmask & bindec('10000000000')) == 0) ? "no" : "yes";
		$functionPowerswitch= (($functionbitmask & bindec('01000000000')) == 0) ? "no" : "yes";
		$functionTempsensor	= (($functionbitmask & bindec('00100000000')) == 0) ? "no" : "yes";
		$functionPowermeter	= (($functionbitmask & bindec('00010000000')) == 0) ? "no" : "yes";

		$present			= $device->present;
		$name				= $device->name;
		
		$switch = $device->switch;
		$switch_state		= $switch->state;
		$switch_mode		= $switch->mode;
		$switch_lock		= $switch->lock;
		
		$powermeter = $device->powermeter;
		$powermeter_power	= $powermeter->power;
		$powermeter_energy	= $powermeter->energy;
		
		$temperature = $device->temperature;
		$temperature_celsius= $temperature->celsius;
		$temperature_offset = $temperature->offset;
		
		
		if(!empty($_GET['getdata'])){
			echo time() . ",";
			
		}elseif(!empty($_GET['set'])){
			echo "OK";
		}else{
			$on		= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchon">on</a>';
			$off	= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchoff">off</a>';
			$toggle	= '<a href="' . $_SERVER['PHP_SELF'] . '?ain=' . str_replace(" ", "", $identifier) . '&switchcmd=setswitchtoggle">toggle</a>';
			$renew  = '<a href="' . $_SERVER['PHP_SELF'] . '">renew</a>';
			
			echo "<pre>
			very simple demonstration script for FritzDect!200
			version $version / $date
			
				productname			$productname
				manufacturer			$manufacturer
				identifier			$identifier
				id				$id
				firmware version		$fwversion
				
				function bitmask		$functionbitmask
					dect repeater		$functionDect
					powerswitch		$functionPowerswitch
					temperaturesensor 	$functionTempsensor
					powermeter		$functionPowermeter
				
				name				$name
				present		(0/1)		$present

				switch
					state	(0/1)		$switch_state	$on $off $toggle
					mode 	(manuell/auto)	$switch_mode
					lock	(0/1)		$switch_lock
				powermeter
					power	(mW)		$powermeter_power
					energy	(Wh)		$powermeter_energy
				temperature
					celsius	(0.1C)		$temperature_celsius
					offset	(K)		$temperature_offset
					
				$renew
			</pre>";
		}
	}
			
function get_sid ($loginurl, $user, $password, $context) {
	// get challenge string
	
	$http_response = file_get_contents($loginurl, false, $context);
	$xml = simplexml_load_string($http_response);
	$challenge=(string)$xml->Challenge;
	$sid=(string)$xml->SID;

	 if ((strlen($sid)>0) && (preg_match("/^[0]+$/",$sid)) && $challenge) {
		//sid is null, got challenge
		$sid="";
		//build password response
		$pass=$challenge."-".$password;
		//UTF-16LE encoding as required
		$pass=mb_convert_encoding($pass, "UTF-16LE");
		//md5hash on top
		$md5 = md5($pass);
		//final answer string
		$challenge_response = $challenge."-".$md5;
		//send to box
		$url=$loginurl."?response=".$challenge_response . "&username=" . $user;
		$http_response = file_get_contents($url, false, $context);
		//check answer
		$xml = simplexml_load_string($http_response);
		$sid=(string)$xml->SID;
		if ((strlen($sid)>0) && !preg_match("/^[0]+$/",$sid)) {
			//is not null, bingo!
			return $sid;
		}
	}else{ 
		//use existing sid if $sid matches an hex string
		if ((strlen($sid)>0) && (preg_match("/^[0-9a-f]+$/",$sid))){
			return $sid;
		}
	} 
	return null;
}//function

?>

Vorsicht: URL zur eigenen FB und PW stehen hier im Skript! Also mehrfach prüfen, ob das Skript auch sicher nicht ausgelesen werden kann!

Felix
 
Probiers mal mit dem angehängten Programm. Wenn das Programm ohne Parameter auf der Kommandozeile gestartet wird, wirft es die möglichen/notwendigen Parameter aus. Man kann damit allerdings nur ein- oder ausschalten, über das Browserinterface der Box eingestellte Schaltzeiten oder Standby-Schwellwerte werden aber berücksichtigt.

Dein Tool funktioniert, vielen Dank. Über PHP bekomme ich die Schaltvorgänge nicht hin, kannst du mir deinen Quellcode senden ??

Gruß tatoosh
 
Hallo,

ist schon eine Weile her.
Genau das was ich schon lange suche.
Habe es an meine Bedürfnisse angepasst.
Ausgabe in Tabellenform, Werte entfernt die ich nicht brauche, etc.

Gerne hätte ich noch Folgendes:
Zugang mit Name und Passwort (habe einen Benutzer angelegt mit weniger Rechten)
Ausgabe der Werte Verbrauch und Temperatur in KW und Celsius.
Z.B. 1,664 statt 1664 und 23,5 statt 235

LG, Chris

EDIT:
Läuft mit FRITZ!DECT 301 und FRITZ!DECT 200
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.