1
0
moha/webserver/cmd_functions.php

414 lines
13 KiB
PHP
Raw Normal View History

2022-02-23 10:23:16 +01:00
<?php
2022-03-04 22:30:16 +01:00
require_once "events.php";
2022-02-23 10:23:16 +01:00
function webDashboard($socket, $n="Général")
2022-02-23 10:23:16 +01:00
{
global $dashboards, $indexDevices;
require_once "webserver/javascript.php";
2022-02-23 10:23:16 +01:00
logger(DEBUG, _("webDashboard function"));
$response = insertJavascript();
2022-03-04 22:30:16 +01:00
2022-02-23 10:23:16 +01:00
if(array_key_exists($n, $dashboards))
{
2022-03-04 22:30:16 +01:00
foreach ($dashboards[$n] as $array)
2022-02-23 10:23:16 +01:00
{
if (array_key_exists($array[0], $indexDevices))
2022-02-23 10:23:16 +01:00
{
$device = $indexDevices[$array[0]];
$property = $array[1];
if (array_key_exists($array[1], $device->properties))
2022-03-04 22:30:16 +01:00
{
$propertyObject = $device->properties[$property];
$value = $propertyObject["value"];
logger(DEBUG, $device->friendlyName . " => " . bool2string(_($value)));
$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 .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . displayChoice($device, $property, $value);
}
if(($propertyObject["access"] & 4))
{
logger(DEBUG, _("can get value") . ($propertyObject["access"] & 4), __FILE__ . ":" . __LINE__);
$response .= '<input type="button" id="' . $device->topic ."/" . $device->friendlyName . "/" . $propertyObject["name"] . '" value="' . _("Update") . "\" onmouseup=\"getPropertyValue('" . $device->topic . "','" . $device->friendlyName . "','" . $propertyObject["name"] . "')\">";
}
$response .= EOLH;
}else
{
$response .= bool2string(_($value));
if(array_key_exists("unit", $propertyObject))
{
$response .= $propertyObject["unit"];
logger(DEBUG, _("unit = ") . $unit, __FILE__ . ":" . __LINE__);
}
$response .= EOLH;
}
}else
2022-03-04 22:30:16 +01:00
{
logger(ERROR, _("Property does not exists"), __FILE__ . ":" . __LINE__);
2022-03-04 22:30:16 +01:00
}
}else
{
logger(ERROR, _("Device does not exists"), __FILE__ . ":" . __LINE__);
2022-02-23 10:23:16 +01:00
}
}
}else
{
logger(ERROR, _("Dashboard does not exists"), __FILE__ . ":" . __LINE__);
2022-02-23 10:23:16 +01:00
$response = _("dashboard not found");
}
htmlSend($socket, $response, '<meta http-equiv="refresh" content="10">');
2022-02-23 10:23:16 +01:00
}
function displayChoice($device, $propertyName, $value)
2022-03-04 22:30:16 +01:00
{
logger(INFO, _("function displayChoice"), __FILE__ . ":" . __LINE__);
$propertyObject = $device->properties[$propertyName];
$unit = '';
2022-03-04 22:30:16 +01:00
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);
2022-03-04 22:30:16 +01:00
$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);
2022-03-04 22:30:16 +01:00
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 = '<input type="number" id="' . $device->topic . "/"
. $device->friendlyName . "/"
. $propertyObject["name"] ."/value" . '"'
. ' min="' . $propertyObject["value_min"] . '"'
. ' max="' . $propertyObject["value_max"] . '"'
. $step
. ' value="' . $value . '">' . $unit . EOL;
$formHTML .= '<input type="range" id="' . $device->topic . "/" . $device->friendlyName . "/" . $propertyObject["name"] . '"';
2022-03-04 22:30:16 +01:00
$formHTML .= ' name="' . $propertyObject["name"] . '"';
$formHTML .= ' min="' . $propertyObject["value_min"] . '"';
$formHTML .= ' max="' . $propertyObject["value_max"] . '"';
$formHTML .= ' value="' . $propertyObject["value"] . '"';
$formHTML .= $step;
$formHTML .= " oninput=\"setPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', this.value, '" . $propertyObject["name"] . "')\">";
2022-03-04 22:30:16 +01:00
break;
case "enum":
logger(DEBUG, _("type is enum"), __FILE__ . ":" . __LINE__);
$formHTML = bool2string($value);
2022-03-04 22:30:16 +01:00
$choice = $propertyObject["values"];
$formHTML .= mkHTML($device, $propertyName, $choice);
2022-03-04 22:30:16 +01:00
break;
default:
logger(DEBUG, "type of property not recognized:" . $propertyObject["type"] , __FILE__ . ":" . __LINE__);
2022-03-04 22:30:16 +01:00
}
return $formHTML;
}
function mkHTML($device, $propertyName, $choice)
{
$html = "";
logger(DEBUG, "function mkHTML", __FILE__ . ":" . __LINE__);
2022-03-04 22:30:16 +01:00
foreach ($choice as $key => $value)
{
$html .= '<input type="button" id="' . $device->topic ."/" . $device->friendlyName . "/" . $propertyName . "/" . $key . '" value="' . $value . "\" onmouseup=\"setPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', '" . $value . "', '" . $propertyName . "')\">";
2022-03-04 22:30:16 +01:00
}
return $html;
}
function webBrowse($socket, $argList, $page="/browse")
2022-02-23 10:23:16 +01:00
{
2022-03-04 22:30:16 +01:00
global $topics, $devices, $listenPort,$indexDevices;
2022-02-23 10:23:16 +01:00
logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
//$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
$response = "";
$flag = false;
$tab = "";
2022-03-04 22:30:16 +01:00
2022-02-23 10:23:16 +01:00
if (array_key_exists("topic", $argList))
{
if (array_key_exists($argList["topic"], $topics))
{
2022-03-04 22:30:16 +01:00
logger(DEBUG, _("Topic exists: ") . $argList["topic"] , __FILE__ . ":" . __LINE__);
$topicRef = '<a href="/browse&amp;topic=' . htmlentities($argList["topic"]);
2022-02-23 10:23:16 +01:00
if (array_key_exists("fn", $argList))
{
logger(DEBUG, _("FriendlyName exists: ") . $argList["fn"] , __FILE__ . ":" . __LINE__);
$fn = "";
$fnArray = explode("/", $argList["fn"]);
$device = $devices[$argList["topic"]];
2022-03-04 22:30:16 +01:00
2022-02-23 10:23:16 +01:00
//var_dump($fnArray);
foreach($fnArray as $value)
{
if ($flag) $fn .= "/";
$fn .= $value;
if (!array_key_exists($value, $device))
{
htmlSend($socket, sprintf(_('"%s" does not exists'), $value));
return false;
}
$device = $device[$value];
$flag = true;
}
//var_dump($device);
if (array_key_exists("device", $device)) // TODO
{
$device = $device["device"];
$fn .= "device/" . $fn;
}
2022-03-04 22:30:16 +01:00
2022-02-23 10:23:16 +01:00
if (is_a($device, "device"))
{
require_once "webserver/javascript.php";
$response .= insertJavascript();
2022-02-23 10:23:16 +01:00
foreach($device->properties as $key => $value)
{
$response = displayProperty($device, $key, $value, $response);
2022-02-23 10:23:16 +01:00
}
/*foreach($device->properties as $key => $value)
{
$response = value($key, $value, $response);
}*/
}else
{
foreach($device as $key => $value)
{
$response .= $topicRef . htmlentities("&fn=" . $fn . "/" . $key) . '">' . $key . "</a><br>\n";
}
}
2022-03-04 22:30:16 +01:00
//logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__);
2022-02-23 10:23:16 +01:00
//htmlSend($socket, $response);
}else
{
2022-03-04 22:30:16 +01:00
logger(DEBUG, _("no FriendlyName given"), __FILE__ . ":" . __LINE__);
if (empty($devices[$argList["topic"]]))
{
$response .= _("No devices yet found");
}else
2022-02-23 10:23:16 +01:00
{
2022-03-04 22:30:16 +01:00
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 . "</a><br>\n";
logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__);
}
2022-02-23 10:23:16 +01:00
}
}
}else
{
$response = webListTopics();
}
}else
{
$response = webListTopics();
}
htmlSend($socket, $response);
}
function displayProperty($device, $key, $value, $response)
{
$tab="";
$response .= $key . "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
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 .= '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="button" id="' . $device->topic ."/" . $device->friendlyName . "/" . $key . '" value="' . _("Update") . "\" onmouseup=\"getPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', '" . $key . "')\">";
}
}
$response .= "<br>\n" . $tab . "[<br>\n";
//echo memory_get_usage();
//$response = value($key, $value, $response);
iterateProperty($device, $key, $value, $response, $tab);
$response .= $tab . "]<br>\n";
return $response;
}
2022-03-04 22:30:16 +01:00
function iterateProperty($device, $property, $value, &$response, $tab="")
2022-02-23 10:23:16 +01:00
{
2022-03-04 22:30:16 +01:00
$tab .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
2022-02-23 10:23:16 +01:00
if (is_array($value) or is_object($value))
{
2022-03-04 22:30:16 +01:00
logger(DEBUG, _("is array"), __FILE__ . ":" . __LINE__ );
2022-02-23 10:23:16 +01:00
foreach($value as $key => $value2)
{
logger(DEBUG, $key, __FILE__ . ":" . __LINE__ );
2022-03-04 22:30:16 +01:00
$response .= $tab . $key;
if (is_array($value2) or is_object($value2))
{
$response .= "<br>\n";
}else
{
$response .= " = ";
}
iterateProperty($device, $key, $value2, $response, $tab);
2022-02-23 10:23:16 +01:00
}
}else
{
2022-03-04 22:30:16 +01:00
$response .= bool2string($value) . "<br>\n";//. displayChoice($device, $property); //value($property, $value, "");
2022-02-23 10:23:16 +01:00
}
}
function webListTopics()
{
global $topics;
logger(DEBUG, _("webListTopics function"));
$response = "";
foreach ($topics as $name => $topic)
{
2022-03-04 22:30:16 +01:00
$response .= '<a href="/browse&topic=' . $name . '">' . $name ."</a><br>\n";
2022-02-23 10:23:16 +01:00
}
return $response;
}
function webGet($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__ );
2022-02-23 10:23:16 +01:00
$property = $argList["property"];
$response = "Sending GET command for: " . $argList["topic"] . $argList["fn"];
$payload = array($argList["property"] => "");
publish($argList["topic"] . "/" . $argList["fn"], $payload, "get");
2022-02-23 10:23:16 +01:00
}
}
return $response;
}
function webSet($argList)
{
2022-03-04 22:30:16 +01:00
global $indexFriendlyName;
2022-02-23 10:23:16 +01:00
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList))
{
2022-03-04 22:30:16 +01:00
if (!array_key_exists($argList["topic"], $topics) )
{
$response = "SET: " . _("bad parameter passed: topic does not exists") . "<br>\n";
}
if (!array_key_exists(!array_key_exists($argList["fn"], $indexFriendlyName)))
{
$response = "SET: " . _("bad parameter passed: fn does not exists") . "<br>\n";
}
$response .= "SET: " . _("not all parameters passed, need topic, fn, property and value");
2022-02-23 10:23:16 +01:00
}else
{
$response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"];
$payload = array($argList["property"] => $argList["value"]);
publish($argList["topic"] . "/" . $argList["fn"], $payload);
2022-03-04 22:30:16 +01:00
//removeEvent($indexFriendlyName($argList["fn"]), $argList["property"], "OFF");
2022-02-23 10:23:16 +01:00
}
return $response;
}
function webPrint($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 = "<pre>" . nl2br(print_r($var, true)) . "<pre>";
}elseif($command === "dump")
{
$response = "Dump" . EOL;
$response .= "<pre>" . nl2br(var_export($var, true)) . "<pre>";
}
}else
{
$response = _("Object do not exists");
}
return $response;
}
function webNotify($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))
{
2022-03-04 22:30:16 +01:00
$response = _("Error: With 'notify' command, you need 5 parameters: topic, fn, property, condition, value");
2022-02-23 10:23:16 +01:00
}else
{
$response = _("notify command have been set");
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
}
return $response;
}
/*
function webDisplayByType($argList)
{
global $indexTypes, $config;
require_once $config . "porpertiesbytype.php";
require_once "webserver/javascript.php";
$response .= insertJavascript();
foreach($indexTypes[$argList["type"]] as $device)
{
foreach($)
displayProperty($device, $device->, $value, $response)
}
2022-02-23 10:23:16 +01:00
}
*/
2022-02-23 10:23:16 +01:00
?>