properties)) { $propertyObject = $device->properties[$property]; $value = $propertyObject["value"]; logger(DEBUG, $device->friendlyName . " => " . bool2string(_($value)), __FILE__ . ":" . __LINE__); $response .= $device->friendlyName . aliases($device->friendlyName, $property) . ' => '; if (array_key_exists("access", $propertyObject)) { logger(DEBUG, _("Access = ") . $propertyObject["access"], __FILE__ . ":" . __LINE__); if(($propertyObject["access"] & 2)) { logger(DEBUG, _("Write Access OK ") . ($propertyObject["access"] & 2), __FILE__ . ":" . __LINE__); $response .= "     " . displayChoice($device, $property, $value); $response .= "   " . displayMethod($device, $property); } if(($propertyObject["access"] & 4)) { logger(DEBUG, _("can get value") . ($propertyObject["access"] & 4), __FILE__ . ":" . __LINE__); $response .= 'friendlyName . "/" . $propertyObject["name"] . '" value="' . _("Update") . "\" onmouseup=\"getPropertyValue('" . $device->topic . "','" . $device->friendlyName . "','" . $propertyObject["name"] . "')\">"; }else { $response .= $value; } $response .= EOLH; }else { $response .= bool2string(_($value)); if(array_key_exists("unit", $propertyObject)) { $response .= $propertyObject["unit"]; logger(DEBUG, _("unit = ") . $unit, __FILE__ . ":" . __LINE__); } $response .= EOLH; } }else { logger(ERROR, _("Property does not exists"), __FILE__ . ":" . __LINE__); } }else { logger(ERROR, _("Device does not exists"), __FILE__ . ":" . __LINE__); } } }else { logger(ERROR, _("Dashboard does not exists"), __FILE__ . ":" . __LINE__); $response = _("dashboard not found"); } htmlSend($socket, $response, ''); } function displayChoice($device, $propertyName, $value) { logger(DEBUG, _("function displayChoice"), __FILE__ . ":" . __LINE__); $propertyObject = $device->properties[$propertyName]; $unit = ''; if(array_key_exists("unit", $propertyObject)) { $unit = $propertyObject["unit"]; logger(DEBUG, _("unit = ") . $unit, __FILE__ . ":" . __LINE__); } if (!array_key_exists("type", $propertyObject)) return ""; switch ($propertyObject["type"]) { case "binary": logger(DEBUG, _("type is binary"), __FILE__ . ":" . __LINE__); $formHTML = bool2string($value); $choice["on"] = $propertyObject["value_on"]; $choice["off"] = $propertyObject["value_off"]; if (array_key_exists("toggle", $propertyObject)) { $choice["toggle"] = $propertyObject["toggle"]; } $formHTML .= mkHTML($device, $propertyName, $choice); break; case "numeric": logger(DEBUG, _("type is numeric") . "#" . $value . "#", __FILE__ . ":" . __LINE__); $step = ''; if (array_key_exists("value_step", $propertyObject)) { $step = ' step="' . $propertyObject["value_step"] . '"'; } //$formHTML .= $device->friendlyName . aliases($device->friendlyName, $property) . ' => '; $formHTML = 'friendlyName . "/" . $propertyObject["name"] . '"' . ' min="' . $propertyObject["value_min"] . '"' . ' max="' . $propertyObject["value_max"] . '"' . $step . ' value="' . $value . '">' . $unit . EOL; $formHTML .= 'friendlyName . "/" . $propertyObject["name"] . '"'; $formHTML .= ' name="' . $propertyObject["name"] . '"'; $formHTML .= ' min="' . $propertyObject["value_min"] . '"'; $formHTML .= ' max="' . $propertyObject["value_max"] . '"'; $formHTML .= ' value="' . $propertyObject["value"] . '"'; $formHTML .= $step; $formHTML .= " oninput=\"setPropertyNumberValue('" . $device->topic . "', '" . $device->friendlyName . "', this.value, '" . $propertyObject["name"] . "')\">"; break; case "enum": logger(DEBUG, _("type is enum"), __FILE__ . ":" . __LINE__); $formHTML = bool2string($value); $choice = $propertyObject["values"]; $formHTML .= mkHTML($device, $propertyName, $choice); break; default: logger(DEBUG, "type of property not recognized:" . $propertyObject["type"] , __FILE__ . ":" . __LINE__); } return $formHTML; } function displayMethod($device, $property) { $html = 'friendlyName . "/" . $propertyName . "/" . strtolower($value) . '" method="' . IDLE . "\" onmouseup=\"setPropertyMethod('" . $device->topic . "', '" . $device->friendlyName . "', '" . IDLE . "', '" . $propertyName . "')\">"; $html = 'friendlyName . "/" . $propertyName . "/" . strtolower($value) . '" method="' . AUTO . "\" onmouseup=\"setPropertyMethod('" . $device->topic . "', '" . $device->friendlyName . "', '" . AUTO . "', '" . $propertyName . "')\">"; $html = 'friendlyName . "/" . $propertyName . "/" . strtolower($value) . '" method="' . MANUAL . "\" onmouseup=\"setPropertyMethod('" . $device->topic . "', '" . $device->friendlyName . "', '" . MANUAL . "', '" . $propertyName . "')\">"; } function mkHTML($device, $propertyName, $choice) { $html = ""; logger(DEBUG, "function mkHTML", __FILE__ . ":" . __LINE__); foreach ($choice as $key => $value) { $html .= 'friendlyName . "/" . $propertyName . "/" . strtolower($value) . '" value="' . $value . "\" onmouseup=\"setPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', '" . $value . "', '" . $propertyName . "')\">"; } return $html; } function apiBrowse($socket, $argList, $page="/browse") { global $topics, $devices, $listenPort,$indexDevices; logger(INFO, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__); //$response = "
" . _("unknown command") . ""; $response = ""; $flag = false; $tab = ""; if (array_key_exists("topic", $argList)) { if (array_key_exists($argList["topic"], $topics)) { logger(DEBUG, _("Topic exists: ") . $argList["topic"] , __FILE__ . ":" . __LINE__); $topicRef = 'properties as $key => $value) { $response = displayProperty($device, $key, $value, $response); } /*foreach($device->properties as $key => $value) { $response = value($key, $value, $response); }*/ }else { foreach($device as $key => $value) { $response .= $topicRef . htmlentities("&fn=" . $fn . "/" . $key) . '">' . $key . "
\n"; } } //logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__); //htmlSend($socket, $response); }else { logger(DEBUG, _("no FriendlyName given"), __FILE__ . ":" . __LINE__); if (empty($devices[$argList["topic"]])) { $response .= _("No devices yet found"); }else { foreach($devices[$argList["topic"]] as $key => $value) { //print "key = " . print_r($key, true) . " value = " . print_r($value, true) . EOL; logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__); $response .= $topicRef . htmlentities("&fn=" . $key) . '">' . $key . "
\n"; logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__); } } } }else { $response = apiListTopics(); } }else { $response = apiListTopics(); } htmlSend($socket, $response); } function displayProperty($device, $key, $value, $response) { $tab=""; $response .= $key . "     "; if (array_key_exists("access", $value)) { if(($value["access"] & 2)) { logger(DEBUG, _("Write Access OK: ") . ($value["access"] & 2) . "value:" . $value["value"], __FILE__ . ":" . __LINE__); $response .= displayChoice($device, $key, $value["value"]); } if(($value["access"] & 4)) { logger(DEBUG, _("can get value") . ($value["access"] & 4), __FILE__ . ":" . __LINE__); $response .= '     friendlyName . "/" . $key . '" value="' . _("Update") . "\" onmouseup=\"getPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', '" . $key . "')\">"; } } $response .= "
\n" . $tab . "[
\n"; //echo memory_get_usage(); //$response = value($key, $value, $response); iterateProperty($device, $key, $value, $response, $tab); $response .= $tab . "]
\n"; return $response; } function iterateProperty($device, $property, $value, &$response, $tab="") { $tab .= "        "; if (is_array($value) or is_object($value)) { logger(DEBUG, _("is array"), __FILE__ . ":" . __LINE__ ); foreach($value as $key => $value2) { logger(DEBUG, $key, __FILE__ . ":" . __LINE__ ); $response .= $tab . $key; if (is_array($value2) or is_object($value2)) { $response .= "
\n"; }else { $response .= " = "; } iterateProperty($device, $key, $value2, $response, $tab); } }else { $response .= bool2string($value) . "
\n";//. displayChoice($device, $property); //value($property, $value, ""); } } function apiListTopics() { global $topics; logger(INFO, _("apiListTopics function"), __FILE__ . ":" . __LINE__); $response = ""; foreach ($topics as $name => $topic) { $response .= '' . $name ."
\n"; } return $response; } function apiGet($argList) { if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList)) { $response = "GET: " . _("no parameters passed, need topic, fn and property"); }else { if (($device = getDevice($argList["topic"], $argList["fn"])) === false) { $response = sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"]); }else { logger(DEBUG, _("Getting "), __FILE__ . ":" . __LINE__ ); $property = $argList["property"]; $response = "Sending GET command for: " . $argList["topic"] . $argList["fn"]; $payload = array($argList["property"] => ""); publish($argList["topic"] . "/" . $argList["fn"], $payload, "get"); } } return $response; } function apiSet($argList) { global $indexFriendlyNames, $topics; if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList)) { if (!array_key_exists($argList["topic"], $topics) ) { $response = "SET: " . _("bad parameter passed: topic does not exists") . "
\n"; } if (!array_key_exists($argList["fn"], $indexFriendlyNames)) { $response = "SET: " . _("bad parameter passed: fn does not exists") . "
\n"; } $response .= "SET: " . _("not all parameters passed, need topic, fn, property and value"); }else { $response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"]; $device = $indexFriendlyNames[$argList["fn"]]; $device->payload = array($argList["property"] => $argList["value"]); $device->set($argList["property"], IDLE); publish($argList["topic"] . "/" . $argList["fn"], $payload, "set"); //removeEvent($indexFriendlyNames($argList["fn"]), $argList["property"], "OFF"); } return $response; } function apiPrint($argList, $command) { global $GLOBALS, $topics; if (array_key_exists($argList["object"], $GLOBALS)) { $var = $GLOBALS[$argList["object"]]; if (isset($argList["topic"])) { $topic = $argList["topic"]; } if (isset($argList["address"])) { $var = $var[$argList["address"]]; }elseif (isset($argList["fn"])) { if(!empty($topic)) { $var = getDevice($topic, $argList["fn"]); }else { $str = _("topic is not defining: add &topic=\nThese topics are availables: "); foreach($topics as $key => $value) { $str .= $key . EOL; } logger(ERROR, $str, __FILE__ . ":" . __LINE__); } } $error = error_get_last(); if($error !== null) { $response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"]; } if ($command === "print") { $response = "
" . nl2br(print_r($var, true)) . "
";
		}elseif($command === "dump")
		{
			$response = "Dump" . EOL;
			$response .= "
" . nl2br(var_export($var, true)) . "
";
		}
	}else
	{
		$response = _("Object do not exists");
	}
	return $response;
}

function apiNotify($argList)
{
	if (!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("condition", $argList) or !array_key_exists("value", $argList))
	{
		$response = _("Error: With 'notify' command, you need 5 parameters: topic, fn, property, condition, value");
	}else
	{
		$response = _("notify command have been set");
		$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
	}
	return $response;
}

function apiVerbose($argList)
{
	global $logLevel, $logLevels;
	logger(DEBUG, _("apiVerbose function"), __FILE__ . ":" . __LINE__);
	$response = "";
	//print_r($argList);
	foreach ($logLevels as $value => $level)
	{
		//print $level . " => " . $value . " ==>" . strtoupper(trim($argList["cmd"])) . EOL;
		if (strtoupper(trim($argList["verbose"])) == $level)
		{
			print "change of " . $level . EOL;
			$logLevel ^= $value;
		}
		if ($logLevel & $value)
		{
			$response .= $level . _(" is active") . EOLH;
		}else
		{
			$response .= $level . _(" is inactive") . EOLH;
		}
	}
	return $response;
}

function getFn($argList)
{
	global $indexDevices;
	$jsonArray = array();
	logger(INFO, _("getFn function"), __FILE__ . ":" . __LINE__);

	if (array_key_exists("ieeeAddress", $argList))
	{
		logger(DEBUG, "ieeeAddress = " . $argList["ieeeAddress"], __FILE__ . ":" . __LINE__);
		if (array_key_exists($argList["ieeeAddress"], $indexDevices))
		{
			logger(DEBUG, "FriendlyName is " . $indexDevices[$argList["ieeeAddress"]]->friendlyName, __FILE__ . ":" . __LINE__);
			$response = '["' . $argList["ieeeAddress"] . '":"' . $indexDevices[$argList["ieeeAddress"]]->friendlyName . '"]';
		}
	}else
	{
		$flag = false;
		//$response = "{";
		foreach($indexDevices as $ieeeAddress => $device)
		{
			/*if ($flag == false)
			{
				$flag = true;
			}else
			{
				$response .= ', ';
			}
			*/
			//$response .= '"' . $ieeeAddress . '" : "' . $indexDevices[$ieeeAddress]->friendlyName . '"';
			$jsonArray[$ieeeAddress] = $indexDevices[$ieeeAddress]->friendlyName;
			array_multisort($jsonArray);
		}
		$response = json_encode($jsonArray, JSON_UNESCAPED_SLASHES);
		print $response;
		//print_r(json_decode($response));
	}
	logger(DEBUG, "response = " . $response, __FILE__ . ":" . __LINE__);
	return $response;
}

function PropertiesDashboard($argList)
{
	global $indexProperties;
	require_once "apiserver/javascript.php";
	logger(INFO, _("propertiesDashboard function"), __FILE__ . ":" . __LINE__);
	$response = insertJavascript();
	$property = $argList["property"];
	foreach ($indexProperties[$property] as $device)
	{
		$propertyObject = $device->properties[$property];
		$value = $propertyObject["value"];
		logger(DEBUG, $device->friendlyName . " => " . bool2string(_($value)), __FILE__ . ":" . __LINE__);
		$response .= $device->friendlyName . aliases($device->friendlyName, $property) . ' => ';
		if (array_key_exists("access", $propertyObject))
		{
			logger(DEBUG, _("Access = ") . $propertyObject["access"], __FILE__ . ":" . __LINE__);
			if(($propertyObject["access"] & 2))
			{
				logger(DEBUG, _("Write Access OK ") . ($propertyObject["access"] & 2), __FILE__ . ":" . __LINE__);
				$response .= "     " . displayChoice($device, $property, $value);
			}
			if(($propertyObject["access"] & 4))
			{
				logger(DEBUG, _("can get value") . ($propertyObject["access"] & 4), __FILE__ . ":" . __LINE__);
				$response .= 'friendlyName . "/" . $propertyObject["name"] . '" value="'  . _("Update") . "\" onmouseup=\"getPropertyValue('" . $device->topic . "','" . $device->friendlyName . "','" . $propertyObject["name"] . "')\">";
			}else
			{
				$response .= $value;
			}
			$response .= EOLH;
		}else
		{
			$response .= bool2string(_($value));
			if(array_key_exists("unit", $propertyObject))
			{
				$response .= $propertyObject["unit"];
				logger(DEBUG, _("unit = ") . $unit, __FILE__ . ":" . __LINE__);
			}
			$response .= EOLH;
		}
	}
	return "json=" . $response;
}

function apiHookActive($argList, $status)
{
	global $hooks;
	if (array_key_exists($argList["hook"], $hooks))
	{
		$hooks[$argList["hook"]]->active = $status;
		if ($status)
		{
			return $argList["hook"] . _(" has been enabled");
		}else
		{
			return $argList["hook"] . _(" has been disabled");
		}
	}else
	{
		return _("Hook does not exists");
	}
}

function deleteDevice($argList)
{
	global $indexFriendlyNames;
	logger(DEBUG, _("removing ") . $indexFriendlyNames[$argList["fn"]]->friendlyname , __FILE__ . ":" . __LINE__);
	//unset($indexFriendlyNames[$argList["fn"]]);
}
/*
function apiDisplayByType($argList)
{
	global $indexTypes, $config;
	require_once $config . "porpertiesbytype.php";
	require_once "apiserver/javascript.php";

	$response .= insertJavascript();
	foreach($indexTypes[$argList["type"]] as $device)
	{
		foreach($)
		displayProperty($device, $device->, $value, $response)
	}
}
*/
?>