telldus/xpl/phpxpl/xpllighting.class.php

172 lines
5.6 KiB
PHP

<?php
require_once 'xplinstance.class.php';
class xPLLighting extends XPLInstance {
public function __construct($ip) {
parent::__construct('telldus', 'core', $ip);
}
protected function attatchedToNetwork() {
$message = new xPLMessage( xPLMessage::xpltrig );
$message->setMessageSchemeIdentifier( 'lighting.gateway' );
$message->setTarget('*');
$message->setSource( $this->_thisDevice->deviceName() );
$message->addBodyItem( 'report', 'gateway-ready' );
$this->sendMessage( $message );
}
protected function handleMessage( $message ) {
if ($message->messageSchemeIdentifier() == 'lighting.request') {
return $this->lightingRequest($message);
}
return false;
}
private function lightingRequest( $message ) {
switch( $message->bodyItem('request') ) {
case 'gateinfo':
return $this->gateInfo( );
case 'netlist':
return $this->netList( );
case 'netinfo':
return $this->netInfo( $message );
case 'devlist':
return $this->devList( $message );
case 'devinfo':
return $this->devInfo( $message );
}
return false;
}
private function gateInfo( ) {
$message = new xPLMessage( xPLMessage::xplstat );
$message->setMessageSchemeIdentifier( 'lighting.gateinfo' );
$message->setTarget('*');
$message->setSource( $this->_thisDevice->deviceName() );
$message->addBodyItem( 'status', 'ok' );
$message->addBodyItem( 'protocol', 'TELLDUS' );
$message->addBodyItem( 'description', 'xPL to Telldus TellStick gateway' );
$message->addBodyItem( 'version', '1.0' );
$message->addBodyItem( 'author', 'Telldus Technologies AB' );
$message->addBodyItem( 'info-url', 'http://www.telldus.se' );
$message->addBodyItem( 'net-count', '1' );
$message->addBodyItem( 'preferred-net', '1' );
$message->addBodyItem( 'scenes-ok', 'false' );
$message->addBodyItem( 'channels-ok', 'false' );
$message->addBodyItem( 'fade-rate-ok', 'false' );
$this->sendMessage( $message );
return true;
}
private function netList( ) {
$message = new xPLMessage( xPLMessage::xplstat );
$message->setMessageSchemeIdentifier( 'lighting.netlist' );
$message->setTarget('*');
$message->setSource( $this->_thisDevice->deviceName() );
$message->addBodyItem( 'status', 'ok' );
$message->addBodyItem( 'network', '1' );
$this->sendMessage( $message );
return true;
}
private function netInfo( $message ) {
$msg = new xPLMessage( xPLMessage::xplstat );
$msg->setMessageSchemeIdentifier( 'lighting.netinfo' );
$msg->setTarget('*');
$msg->setSource( $this->_thisDevice->deviceName() );
// print_r($message);
$msg->addBodyItem( 'network', $message->bodyItem('network') );
if ($msg->bodyItem('network') == '1') {
$msg->addBodyItem( 'status', 'ok' );
$msg->addBodyItem( 'name', exec('hostname') );
$msg->addBodyItem( 'device-count', tdGetNumberOfDevices() );
$msg->addBodyItem( 'scene-count', 0 );
} else {
$msg->addBodyItem( 'status', 'not-found' );
}
$this->sendMessage( $msg );
return true;
}
private function devList( $message ) {
$msg = new xPLMessage( xPLMessage::xplstat );
$msg->setMessageSchemeIdentifier( 'lighting.devlist' );
$msg->setTarget('*');
$msg->setSource( $this->_thisDevice->deviceName() );
$msg->addBodyItem( 'network', $message->bodyItem('network') );
if ($msg->bodyItem('network') == '1') {
$msg->addBodyItem( 'status', 'ok' );
$count = tdGetNumberOfDevices();
$deviceList = array();
for( $i = 0; $i < $count; ++$i ) {
$deviceList[] = tdGetDeviceId($i);
}
$msg->addBodyItem( 'device-count', $count );
$msg->addBodyItem( 'device', implode(',', $deviceList) );
} else {
$msg->addBodyItem( 'status', 'not-found' );
}
$this->sendMessage( $msg );
return true;
}
private function devInfo( $message ) {
$found = false;
$count = tdGetNumberOfDevices();
$deviceId = $message->bodyItem('device');
for( $i = 0; $i < $count; ++$i ) {
if (tdGetDeviceId($i) == $deviceId) {
$found = true;
break;
}
}
$msg = new xPLMessage( xPLMessage::xplstat );
$msg->setMessageSchemeIdentifier( 'lighting.devinfo' );
$msg->addBodyItem( 'network', $message->bodyItem('network') );
$msg->addBodyItem( 'device', $deviceId );
$msg->setTarget('*');
$msg->setSource( $this->_thisDevice->deviceName() );
if ($msg->bodyItem('network') == '1' && $found) {
$methods = tdMethods($deviceId, TELLDUS_TURNON | TELLDUS_TURNOFF | TELLDUS_DIM );
$msg->addBodyItem( 'status', 'ok' );
$msg->addBodyItem( 'name', tdGetName($deviceId) );
$msg->addBodyItem( 'report-on-manual', 'false' );
$msg->addBodyItem( 'channel-count', '1');
$msg->addBodyItem( 'primary-channel', '1');
$msg->addBodyItem( 'channel', sprintf('1,%s,0,0', ($methods & TELLDUS_DIM ? 'true' : 'false')) );
$msg->addBodyItem( 'scene-count', '0');
} else {
$msg->addBodyItem( 'status', 'not-found' );
}
$this->sendMessage( $msg );
return true;
}
private function scnList( $message ) {
$msg = new xPLMessage( xPLMessage::xplstat );
$msg->setMessageSchemeIdentifier( 'lighting.scnlist' );
$msg->setTarget('*');
$msg->setSource( $this->_thisDevice->deviceName() );
$msg->addBodyItem( 'network', $message->bodyItem('network') );
$msg->addBodyItem( 'status', 'not-found' );
$this->sendMessage( $msg );
return true;
}
private function scnInfo( $message ) {
$msg = new xPLMessage( xPLMessage::xplstat );
$msg->setMessageSchemeIdentifier( 'lighting.scninfo' );
$msg->addBodyItem( 'network', $message->bodyItem('network') );
$msg->addBodyItem( 'scene', $message->bodyItem('scene') );
$msg->setTarget('*');
$msg->setSource( $this->_thisDevice->deviceName() );
$msg->addBodyItem( 'status', 'not-found' );
$this->sendMessage( $msg );
return true;
}
}