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
 

chked

IPPF-Promi
Mitglied seit
20 Nov 2006
Beiträge
4,276
Punkte für Reaktionen
19
Punkte
38
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.
 

ws65

Aktives Mitglied
Mitglied seit
23 Jan 2012
Beiträge
1,137
Punkte für Reaktionen
17
Punkte
38

meintau

Neuer User
Mitglied seit
18 Nov 2014
Beiträge
10
Punkte für Reaktionen
0
Punkte
0
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
 

harrykausl

Neuer User
Mitglied seit
20 Aug 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
6
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?
 

chked

IPPF-Promi
Mitglied seit
20 Nov 2006
Beiträge
4,276
Punkte für Reaktionen
19
Punkte
38
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

harrykausl

Neuer User
Mitglied seit
20 Aug 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
6
Danke, probiere ich am Wochenende gleich aus.
 

harrykausl

Neuer User
Mitglied seit
20 Aug 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
6
@chked : Hat funktioniert, vielen Dank.
 

Felix_)

Neuer User
Mitglied seit
25 Sep 2010
Beiträge
11
Punkte für Reaktionen
0
Punkte
0
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:

harrykausl

Neuer User
Mitglied seit
20 Aug 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
6
Und auf welchem Gerät lässt Du das Skript laufen, d.h. wo läuft dein Webserver?
 

Felix_)

Neuer User
Mitglied seit
25 Sep 2010
Beiträge
11
Punkte für Reaktionen
0
Punkte
0
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
 

Felix_)

Neuer User
Mitglied seit
25 Sep 2010
Beiträge
11
Punkte für Reaktionen
0
Punkte
0
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
 

tatoosh11

Neuer User
Mitglied seit
23 Aug 2010
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
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
 

chris47803

Neuer User
Mitglied seit
27 Sep 2010
Beiträge
34
Punkte für Reaktionen
0
Punkte
6
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