a lot of debug
This commit is contained in:
parent
f8fc3f63ec
commit
d1f1065e44
@ -47,8 +47,11 @@ function htmlSend($socket, $text, $meta="")
|
||||
function apiServer($read)
|
||||
{
|
||||
global $topics, $indexDevices, $devices;
|
||||
|
||||
logger(DEBUG, "Function apiServer", __FILE__ . ":" . __LINE__);
|
||||
$array = array();
|
||||
$argList =array();
|
||||
|
||||
//logger(DEBUG, _("askWebserver function starting"), __FILE__ . ":" . __LINE__);
|
||||
if ( stream_select( $read, $array, $array, 0 ))
|
||||
{
|
||||
@ -88,50 +91,63 @@ function apiServer($read)
|
||||
switch($command)
|
||||
{
|
||||
case "dashboard":
|
||||
webDashboard($spawn, $argList["dashboard"]);
|
||||
apiDashboard($spawn, $argList["dashboard"]);
|
||||
break;
|
||||
case "browse":
|
||||
logger(DEBUG, _("Browsing"), __FILE__ . ":" . __LINE__);
|
||||
webBrowse($spawn, $argList);
|
||||
apiBrowse($spawn, $argList);
|
||||
//return true;
|
||||
break;
|
||||
case "get":
|
||||
logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, webGet($argList));
|
||||
htmlSend($spawn, apiGet($argList));
|
||||
break;
|
||||
case "set":
|
||||
logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, webSet($argList));
|
||||
htmlSend($spawn, apiSet($argList));
|
||||
break;
|
||||
case "dump":
|
||||
case "print":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, webPrint($argList, $command));
|
||||
htmlSend($spawn, apiPrint($argList, $command));
|
||||
break;
|
||||
case "notify":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, webNotify($argList));
|
||||
htmlSend($spawn, apiNotify($argList));
|
||||
logger(DEBUG, print_r($monitored, true), __FILE__ . ":" . __LINE__);
|
||||
break;
|
||||
case "type":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
//htmlSend($spawn, webDisplayByType($argList));
|
||||
//htmlSend($spawn, apiDisplayByType($argList));
|
||||
/*case "stats":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
displayStats($spawn, $argList);*/
|
||||
break;
|
||||
case "verbose":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, apiVerbose($argList));
|
||||
break;
|
||||
case "friendlyname":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, getFn($argList));
|
||||
break;
|
||||
case "property":
|
||||
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, PropertiesDashboard($argList));
|
||||
break;
|
||||
default:
|
||||
if (is_numeric(array_key_first($argList)))
|
||||
{
|
||||
webDashboard($spawn, $argList[0]);
|
||||
}else
|
||||
{
|
||||
logger(DEBUG, $command . _(" so default action"), __FILE__ . ":" . __LINE__);
|
||||
if (file_exists("php://temp/". $command))
|
||||
if (is_numeric(array_key_first($argList)))
|
||||
{
|
||||
logger(DEBUG, $command . _(" is a file"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, file_get_contents("php://temp/". $command), 'Content-Type: image/png');
|
||||
apiDashboard($spawn, $argList[0]);
|
||||
}else
|
||||
{
|
||||
logger(DEBUG, $command . _(" so default action"), __FILE__ . ":" . __LINE__);
|
||||
if (file_exists("php://temp/". $command))
|
||||
{
|
||||
logger(DEBUG, $command . _(" is a file"), __FILE__ . ":" . __LINE__);
|
||||
htmlSend($spawn, file_get_contents("php://temp/". $command), 'Content-Type: image/png');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (array_key_exists("page", $argList))
|
||||
@ -141,11 +157,11 @@ function apiServer($read)
|
||||
}
|
||||
}else
|
||||
{
|
||||
webDashboard($spawn);
|
||||
apiDashboard($spawn);
|
||||
}
|
||||
}else
|
||||
{
|
||||
webDashboard($spawn);
|
||||
apiDashboard($spawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
<?php
|
||||
require_once "events.php";
|
||||
|
||||
function webDashboard($socket, $n="Général")
|
||||
function apiDashboard($socket, $n="Général")
|
||||
{
|
||||
global $dashboards, $indexDevices;
|
||||
require_once "apiserver/javascript.php";
|
||||
logger(DEBUG, _("webDashboard function"), __FILE__ . ":" . __LINE__);
|
||||
logger(INFO, _("apiDashboard function"), __FILE__ . ":" . __LINE__);
|
||||
$response = insertJavascript();
|
||||
|
||||
if(array_key_exists($n, $dashboards))
|
||||
@ -20,7 +20,7 @@ function webDashboard($socket, $n="Général")
|
||||
{
|
||||
$propertyObject = $device->properties[$property];
|
||||
$value = $propertyObject["value"];
|
||||
logger(DEBUG, $device->friendlyName . " => " . bool2string(_($value)));
|
||||
logger(DEBUG, $device->friendlyName . " => " . bool2string(_($value)), __FILE__ . ":" . __LINE__);
|
||||
$response .= $device->friendlyName . aliases($device->friendlyName, $property) . ' => ';
|
||||
if (array_key_exists("access", $propertyObject))
|
||||
{
|
||||
@ -130,7 +130,7 @@ function displayChoice($device, $propertyName, $value)
|
||||
function mkHTML($device, $propertyName, $choice)
|
||||
{
|
||||
$html = "";
|
||||
logger(DEBUG, "function mkHTML", __FILE__ . ":" . __LINE__);
|
||||
logger(INFO, "function mkHTML", __FILE__ . ":" . __LINE__);
|
||||
foreach ($choice as $key => $value)
|
||||
{
|
||||
$html .= '<input type="button" id="' . $device->topic ."/" . $device->friendlyName . "/" . $propertyName . "/" . strtolower($value) . '" value="' . $value . "\" onmouseup=\"setPropertyValue('" . $device->topic . "', '" . $device->friendlyName . "', '" . $value . "', '" . $propertyName . "')\">";
|
||||
@ -138,10 +138,10 @@ function mkHTML($device, $propertyName, $choice)
|
||||
return $html;
|
||||
}
|
||||
|
||||
function webBrowse($socket, $argList, $page="/browse")
|
||||
function apiBrowse($socket, $argList, $page="/browse")
|
||||
{
|
||||
global $topics, $devices, $listenPort,$indexDevices;
|
||||
logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
|
||||
logger(INFO, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
|
||||
//$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
|
||||
$response = "";
|
||||
$flag = false;
|
||||
@ -220,11 +220,11 @@ function webBrowse($socket, $argList, $page="/browse")
|
||||
}
|
||||
}else
|
||||
{
|
||||
$response = webListTopics();
|
||||
$response = apiListTopics();
|
||||
}
|
||||
}else
|
||||
{
|
||||
$response = webListTopics();
|
||||
$response = apiListTopics();
|
||||
}
|
||||
htmlSend($socket, $response);
|
||||
}
|
||||
@ -279,10 +279,10 @@ function iterateProperty($device, $property, $value, &$response, $tab="")
|
||||
}
|
||||
}
|
||||
|
||||
function webListTopics()
|
||||
function apiListTopics()
|
||||
{
|
||||
global $topics;
|
||||
logger(DEBUG, _("webListTopics function"));
|
||||
logger(INFO, _("apiListTopics function"), __FILE__ . ":" . __LINE__);
|
||||
$response = "";
|
||||
foreach ($topics as $name => $topic)
|
||||
{
|
||||
@ -291,7 +291,7 @@ function webListTopics()
|
||||
return $response;
|
||||
}
|
||||
|
||||
function webGet($argList)
|
||||
function apiGet($argList)
|
||||
{
|
||||
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList))
|
||||
{
|
||||
@ -313,7 +313,7 @@ function webGet($argList)
|
||||
return $response;
|
||||
}
|
||||
|
||||
function webSet($argList)
|
||||
function apiSet($argList)
|
||||
{
|
||||
global $indexFriendlyName;
|
||||
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList))
|
||||
@ -331,13 +331,13 @@ function webSet($argList)
|
||||
{
|
||||
$response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"];
|
||||
$payload = array($argList["property"] => $argList["value"]);
|
||||
publish($argList["topic"] . "/" . $argList["fn"], $payload);
|
||||
publish($argList["topic"] . "/" . $argList["fn"], $payload, "set");
|
||||
//removeEvent($indexFriendlyName($argList["fn"]), $argList["property"], "OFF");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function webPrint($argList, $command)
|
||||
function apiPrint($argList, $command)
|
||||
{
|
||||
global $GLOBALS, $topics;
|
||||
if (array_key_exists($argList["object"], $GLOBALS))
|
||||
@ -386,7 +386,7 @@ function webPrint($argList, $command)
|
||||
return $response;
|
||||
}
|
||||
|
||||
function webNotify($argList)
|
||||
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))
|
||||
{
|
||||
@ -398,8 +398,118 @@ function webNotify($argList)
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function apiVerbose($argList)
|
||||
{
|
||||
global $logLevel, $logLevels;
|
||||
logger(INFO, _("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 .= '<input type="button" id="' . $device->topic ."/" . $device->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 webDisplayByType($argList)
|
||||
function apiDisplayByType($argList)
|
||||
{
|
||||
global $indexTypes, $config;
|
||||
require_once $config . "porpertiesbytype.php";
|
||||
|
@ -24,28 +24,35 @@ class hook
|
||||
|
||||
function installHooks(&$indexDevices)
|
||||
{
|
||||
global $devices;
|
||||
global $devices, $devicesRequest;
|
||||
static $requestflag = 0;
|
||||
$result = true;
|
||||
// assigne the function to the sensors devices
|
||||
if ($this->active === true)
|
||||
{
|
||||
foreach ($this->devicelist as $ieeeAddress => $property)
|
||||
{
|
||||
if (array_key_exists($ieeeAddress, $devices))
|
||||
if (array_key_exists($ieeeAddress, $indexDevices))
|
||||
{
|
||||
logger(DEBUG, _("Device: ") . $ieeeAddress, __FILE__ . ":" . __LINE__);
|
||||
if ($this->propertyInitialized[$ieeeAddress][$property] === false)
|
||||
if (!array_key_exists($this->hookName, $indexDevices[$ieeeAddress]->properties[$property]["functions"]))
|
||||
{
|
||||
logger(DEBUG, _("Trying to store callback"), __FILE__ . ":" . __LINE__);
|
||||
if (array_key_exists("functions", $indexDevices[$ieeeAddress]->properties[$property]))
|
||||
if (array_key_exists($property, $indexDevices[$ieeeAddress]->properties))
|
||||
{
|
||||
$indexDevices[$ieeeAddress]->properties[$property]["functions"][$this->hookName] = array($this,"callback");
|
||||
$this->propertyInitialized[$ieeeAddress][$property] = true;
|
||||
logger(DEBUG, sprintf(_("Property '%s' of %s is initialized with callback"), $property, $indexDevices[$ieeeAddress]->friendlyName), __FILE__ . ":" . __LINE__);
|
||||
logger(DEBUG, _("Trying to store callback"), __FILE__ . ":" . __LINE__);
|
||||
if (array_key_exists("functions", $indexDevices[$ieeeAddress]->properties[$property]))
|
||||
{
|
||||
$indexDevices[$ieeeAddress]->properties[$property]["functions"][$this->hookName] = array($this,"callback");
|
||||
logger(DEBUG, sprintf(_("Property '%s' of %s is initialized with callback"), $property, $indexDevices[$ieeeAddress]->friendlyName), __FILE__ . ":" . __LINE__);
|
||||
|
||||
}else
|
||||
{
|
||||
logger(WARNING, sprintf(_("Hook %s can not initialize Property '%s' of device %s"), $this->hookName, $property, $ieeeAddress), __FILE__ . ":" . __LINE__);
|
||||
$result = false;
|
||||
}
|
||||
}else
|
||||
{
|
||||
logger(WARNING, sprintf(_("Hook %s can not initialize Property '%s' of device %s"), $this->hookName, $property, $ieeeAddress), __FILE__ . ":" . __LINE__);
|
||||
logger(WARNING, sprintf(_("Hook %s can not initialize Property '%s' of device %s : property does not exists"), $this->hookName, $property, $indexDevices[$ieeeAddress]->friendlyName), __FILE__ . ":" . __LINE__);
|
||||
$result = false;
|
||||
}
|
||||
}else
|
||||
@ -55,6 +62,16 @@ class hook
|
||||
}else
|
||||
{
|
||||
logger(ERROR, $ieeeAddress . (" does not exists"), __FILE__ . ":" . __LINE__);
|
||||
if ($devicesRequest === false)
|
||||
{
|
||||
publish("zigbee2mqtt", array("bridge/devices" => ""), "get");
|
||||
$devicesRequest = true;
|
||||
}elseif ($requestflag++ > 30)
|
||||
{
|
||||
$requestflag = 0;
|
||||
}
|
||||
|
||||
$result = false;
|
||||
mkIndexes();
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,8 @@
|
||||
array(METEO, "rainin"),
|
||||
array(METEO, "barominmb"),
|
||||
array(METEO, "UV"),
|
||||
array(METEO, "solarradiation")
|
||||
array(METEO, "solarradiation"),
|
||||
array(RDC_STORE, "position")
|
||||
);
|
||||
$dashboards["etage"] = array(
|
||||
array(ETAGE_SALON_RADIATEUR,"current_heating_setpoint"),
|
||||
|
@ -27,4 +27,5 @@ foreach ($logLevels as $key => $string)
|
||||
$logLevels[6] = "NOTICE & WARNING";
|
||||
|
||||
define( "ALL", DEBUG | INFO | NOTICE | WARNING | ERROR | ALERT);
|
||||
define("NOTIF_DEFAULT_DEST", "daniel");
|
||||
?>
|
||||
|
@ -9,7 +9,7 @@ function storeDB($db, $filepath)
|
||||
$data = serialize($db);
|
||||
if (file_put_contents($filepath, $data) === false)
|
||||
{
|
||||
logger(DEBUG,_("Failed storing database ") . $filepath , __FILE__ . ":" . __LINE__);
|
||||
logger(ALERT,_("Failed storing database ") . $filepath , __FILE__ . ":" . __LINE__);
|
||||
return false;
|
||||
}else
|
||||
{
|
||||
@ -23,20 +23,24 @@ function loadDB($filepath)
|
||||
$data = file_get_contents($filepath);
|
||||
if ($data === false)
|
||||
{
|
||||
logger(DEBUG,_("Failed loading database ") . $filepath , __FILE__ . ":" . __LINE__);
|
||||
logger(ALERT,_("Failed loading database ") . $filepath , __FILE__ . ":" . __LINE__);
|
||||
return false;
|
||||
}
|
||||
$db = unserialize($data);
|
||||
if (($db = unserialize($data)) === false)
|
||||
{
|
||||
logger(ALERT,_("Failed unserializing database ") . $filepath , __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
return $db;
|
||||
}
|
||||
|
||||
function mkDevicesDB($topic, $json, $group=false)
|
||||
{
|
||||
global $devices, $listProperties, $listPropertiesKeys, $indexDevices, $dbInit, $logFh, $hooks, $indexFriendlyNames;
|
||||
if (!isset($devices[$topic]))
|
||||
if (!array_key_exists($topic, $devices))
|
||||
{
|
||||
$devices[$topic]= array();
|
||||
}
|
||||
//fwrite($logFh, var_export($json, true));
|
||||
//print_r($json);
|
||||
foreach ($json as $jsonDevice)
|
||||
{
|
||||
@ -57,7 +61,7 @@ function addDevice($topic, $fn, $jsonDevice, $group=false )
|
||||
global $devices, $listProperties, $listPropertiesKeys, $hooks, $indexDevices, $indexFriendlyNames;
|
||||
$fnTree = explode("/", $fn);
|
||||
$device = & $devices[$topic];
|
||||
print_r($jsonDevice);
|
||||
//print_r($jsonDevice);
|
||||
foreach($fnTree as $fnPart)
|
||||
{
|
||||
if (!array_key_exists($fnPart, $device))
|
||||
@ -108,13 +112,13 @@ function searchPropertyKey($fn, &$device, $inputObject, $listPropertiesKeys)
|
||||
{
|
||||
//foreach($listPropertiesKeys as $propertyKey)
|
||||
//{
|
||||
logger(DEBUG, _("searching for property"), __FILE__ . ":" . __LINE__ );
|
||||
//logger(DEBUG, _("searching for property"), __FILE__ . ":" . __LINE__ );
|
||||
//if (is_object($inputObject))
|
||||
//{
|
||||
//print_r($inputObject);
|
||||
if (array_key_exists("property", $inputObject))
|
||||
{
|
||||
logger(DEBUG, _("property Key exists filling properties"), __FILE__ . ":" . __LINE__ );
|
||||
//logger(DEBUG, _("property Key exists filling properties"), __FILE__ . ":" . __LINE__ );
|
||||
$string = $inputObject["property"];
|
||||
if (!array_key_exists($string, $device->properties))
|
||||
{
|
||||
@ -136,11 +140,14 @@ function searchPropertyKey($fn, &$device, $inputObject, $listPropertiesKeys)
|
||||
{
|
||||
$device->type = $inputObject["type"];
|
||||
}
|
||||
/*foreach($inputObject as $key => $value)
|
||||
foreach($inputObject as $key => $value)
|
||||
{
|
||||
logger(DEBUG, sprintf(_("key = %s"), $key), __FILE__ . ":" . __LINE__ );
|
||||
searchPropertyKey($fn, $device, $value, $listPropertiesKeys);
|
||||
}*/
|
||||
//logger(DEBUG, sprintf(_("key = %s"), $key), __FILE__ . ":" . __LINE__ );
|
||||
if (is_array($value))
|
||||
{
|
||||
searchPropertyKey($fn, $device, $value, $listPropertiesKeys);
|
||||
}
|
||||
}
|
||||
}
|
||||
//print_r($device);
|
||||
//}
|
||||
@ -247,12 +254,16 @@ function getDevicesValues($topic)
|
||||
if ($value["access"] & 4)
|
||||
{
|
||||
$device->payload[$property] = "";
|
||||
$flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//logger(DEBUG, print_r($device->payload, true), __FILE__ . ":" . __LINE__ );
|
||||
$device->get();
|
||||
if ($flag === true)
|
||||
{
|
||||
$device->get();
|
||||
}
|
||||
}else
|
||||
{
|
||||
logger(DEBUG, _("no properties to get for device: " . $device->friendlyName ), __FILE__ . ":" . __LINE__ );
|
||||
@ -302,24 +313,32 @@ function mkIndexes()
|
||||
|
||||
function iterate2device(&$object)
|
||||
{
|
||||
global $indexDevices, $indexFriendlyNames, $indexTypes;
|
||||
global $indexDevices, $indexFriendlyNames, $indexTypes, $indexProperties;
|
||||
foreach ($object as $key => &$device)
|
||||
{
|
||||
if (is_a($device, "device"))
|
||||
{
|
||||
|
||||
$object = &$device;
|
||||
//$object = &$device;
|
||||
//print("=============" . $device->friendlyName);
|
||||
//if (!array_key_exists($object->ieeeAddress, $indexDevices))
|
||||
//{
|
||||
//print("============>");
|
||||
$indexDevices[$object->ieeeAddress] = &$object;
|
||||
$indexFriendlyNames[$object->friendlyName] = &$object;
|
||||
if (property_exists($object, "type"))
|
||||
$indexDevices[$device->ieeeAddress] = &$device;
|
||||
$indexFriendlyNames[$device->friendlyName] = &$device;
|
||||
if (property_exists($device, "type"))
|
||||
{
|
||||
$indexTypes[$object->type][] = &$object;
|
||||
$indexTypes[$device->type][] = &$object;
|
||||
}
|
||||
$properties = array_keys($device->properties);
|
||||
foreach($properties as $property)
|
||||
{
|
||||
$indexProperties[$property][$device->ieeeAddress] = &$device;
|
||||
}
|
||||
//}
|
||||
//return true;
|
||||
}elseif (empty($device))
|
||||
{
|
||||
return true;
|
||||
}else
|
||||
{
|
||||
|
32
events.php
32
events.php
@ -8,7 +8,7 @@ function checkEvents()
|
||||
{
|
||||
global $logLevel, $events;
|
||||
$oldLevel = $logLevel;
|
||||
$logLevel = DEBUG;
|
||||
//$logLevel = DEBUG;
|
||||
$exception = false;
|
||||
if ($events === null)
|
||||
{
|
||||
@ -68,10 +68,12 @@ function checkEvents()
|
||||
}
|
||||
}
|
||||
//print_r($events);
|
||||
$logLevel = $oldLevel;
|
||||
//$logLevel = $oldLevel;
|
||||
}
|
||||
|
||||
function setOneshotEvent(&$deviceObject, $datetime, $property, $value, $replace=false, $method=null)
|
||||
// datetime format : "yyyy-mm-dd hh:mm:ss"
|
||||
|
||||
function setOneshotEvent(device &$deviceObject, string $datetime, $property, $value, $replace=false, $method=null)
|
||||
{
|
||||
global $events;
|
||||
$events[] = new event;
|
||||
@ -85,18 +87,20 @@ function setOneshotEvent(&$deviceObject, $datetime, $property, $value, $replace=
|
||||
if ($method !==null) $events[$key]->method =$method;
|
||||
}
|
||||
|
||||
function setRecurrentEvent(&$deviceObject, $property, $value, $startDatetime, $stopDatetime, $hours, $minutes, $seconds, $days, $weeks, $months, $years, $method = null)
|
||||
// startDatetime and stopDatetime format : "yyyy-mm-dd hh:mm:ss"
|
||||
|
||||
function setRecurrentEvent(device &$deviceObject, string $property, $value, string $startDatetime, string $stopDatetime, int $hours, int $minutes, int $seconds, int $days, int $weeks, int $months, int $years, int $method = null)
|
||||
{
|
||||
global $events;
|
||||
$string = "P";
|
||||
if (!empty($years)) $string .= $days . "Y";
|
||||
if (!empty($months)) $string .= $days . "M";
|
||||
if (!empty($years)) $string .= $years . "Y";
|
||||
if (!empty($months)) $string .= $months . "M";
|
||||
if (!empty($week)) $string .= $week . "W";
|
||||
if (!empty($days)) $string .= $days . "D";
|
||||
$string .= "T";
|
||||
if (!empty($hours)) $string .= $days . "H";
|
||||
if (!empty($months)) $string .= $days . "M";
|
||||
if (!empty($seconds)) $string .= $days . "S";
|
||||
if (!empty($hours)) $string .= $hours . "H";
|
||||
if (!empty($months)) $string .= $months . "M";
|
||||
if (!empty($seconds)) $string .= $seconds . "S";
|
||||
|
||||
$event = new event;
|
||||
|
||||
@ -117,7 +121,7 @@ function setRecurrentEvent(&$deviceObject, $property, $value, $startDatetime, $s
|
||||
if ($method !== null) $event->method = $method;
|
||||
}
|
||||
|
||||
function setDelay(&$deviceObject, $delay, $unit, $property, $value, $replace=false, $method = null)
|
||||
function setDelay(device &$deviceObject, float $delay, string $unit, string $property, $value, bool $replace=false, int $method = null)
|
||||
{
|
||||
global $events, $logLevel;
|
||||
$oldLevel = $logLevel;
|
||||
@ -160,7 +164,7 @@ function setDelay(&$deviceObject, $delay, $unit, $property, $value, $replace=fal
|
||||
if ($replace)
|
||||
{
|
||||
$eventKey = searchEvent($deviceObject, $property, $value);
|
||||
if ($eventKey !== false) deleteEvent($events[$eventKey]);
|
||||
if ($eventKey !== false) deleteEvent($eventKey);
|
||||
}
|
||||
//$dt = $datetime->format("Y-m-d\TH:i:s\Z");
|
||||
$events[] = new event;
|
||||
@ -177,7 +181,7 @@ function setDelay(&$deviceObject, $delay, $unit, $property, $value, $replace=fal
|
||||
$logLevel = $oldLevel;
|
||||
}
|
||||
|
||||
function removeEvent($deviceObject, $property , $value, $method = null)
|
||||
function removeEvent(device $deviceObject, string $property , $value, int $method = null)
|
||||
{
|
||||
global $events;
|
||||
$eventKey = searchEvent($deviceObject, $property , $value);
|
||||
@ -188,7 +192,7 @@ function removeEvent($deviceObject, $property , $value, $method = null)
|
||||
}
|
||||
}
|
||||
|
||||
function searchEvent($deviceObject, $property , $value)
|
||||
function searchEvent(device $deviceObject, string $property , $value)
|
||||
{
|
||||
global $events;
|
||||
logger(DEBUG, sprintf(_("searching event for device %s, property %s and value %s"), $deviceObject->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__);
|
||||
@ -205,7 +209,7 @@ function searchEvent($deviceObject, $property , $value)
|
||||
}
|
||||
|
||||
// warning delete event does not manage method of the device (IDLE, )
|
||||
function deleteEvent($eventKey)
|
||||
function deleteEvent(int $eventKey)
|
||||
{
|
||||
global $events;
|
||||
if ($eventKey !== false)
|
||||
|
@ -6,7 +6,7 @@ class notificationFreemobile
|
||||
public $active = true;
|
||||
public $level;
|
||||
private $dest = array(
|
||||
"32886706&pass=JTGUY6l5OG73zX", //daniel
|
||||
"daniel" => "32886706&pass=JTGUY6l5OG73zX",
|
||||
);
|
||||
|
||||
function __construct()
|
||||
@ -14,7 +14,7 @@ class notificationFreemobile
|
||||
$this->level = ALERT | ERROR;
|
||||
}
|
||||
|
||||
function send($message, $destinataire=0)
|
||||
function send($message, $destinataire=NOTIF_DEFAULT_DEST)
|
||||
{
|
||||
global $curlErr;
|
||||
$result = false;
|
||||
@ -22,7 +22,7 @@ class notificationFreemobile
|
||||
{
|
||||
$ch = curl_init();
|
||||
// set url
|
||||
curl_setopt($ch, CURLOPT_URL, $this->url . $this->dest["destinataire"] . "&msg=" . urlencode(trim($message)));
|
||||
curl_setopt($ch, CURLOPT_URL, $this->url . $this->dest[$destinataire] . "&msg=" . urlencode(trim($message)));
|
||||
echo $this->url . urlencode(trim($message)) . EOL;
|
||||
//return the transfer as a string
|
||||
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
@ -26,8 +26,9 @@ class rdc_salon_eclairage extends hook
|
||||
$lux = $indexDevices[RDC_SALON_LUMINOSITE];
|
||||
$mvmt = $indexDevices[RDC_SALON_MVMT];
|
||||
$mvmt2 = $indexDevices[RDC_SALON_MVMT2];
|
||||
logger (INFO, _("property => ") . $param . _("value =>") . bool2string($value), __FILE__ . ":" . __LINE__);
|
||||
$illuminance = getValue(RDC_SALON_LUMINOSITE, "illuminance_lux");
|
||||
|
||||
logger (INFO, _("property => ") . $param . _("value =>") . bool2string($value), __FILE__ . ":" . __LINE__);
|
||||
switch($param)
|
||||
{
|
||||
case "occupancy":
|
||||
@ -35,7 +36,6 @@ class rdc_salon_eclairage extends hook
|
||||
//print_r(getValue(RDC_SALON_LUMINOSITE, "illuminance_lux"));
|
||||
if ($value == ON)
|
||||
{
|
||||
$illuminance = getValue(RDC_SALON_LUMINOSITE, "illuminance_lux");
|
||||
logger(INFO, _("illuminance value : ") . $illuminance, __FILE__ . ":" . __LINE__);
|
||||
if ($illuminance <= $this->luminance_min)
|
||||
{
|
||||
@ -49,14 +49,14 @@ class rdc_salon_eclairage extends hook
|
||||
if (getValue(RDC_SALON_MVMT, "occupancy") == OFF and (getValue(RDC_SALON_MVMT2, "occupancy") == OFF))
|
||||
{
|
||||
logger(INFO, _("Setting to OFF"), __FILE__ . ":" . __LINE__);
|
||||
//setDelay($deviceTarget, $this->delay, $this->timeUnit, "state", "OFF", true);
|
||||
$this->send($deviceTarget, "OFF", false, IDLE);
|
||||
setDelay($deviceTarget, $this->delay, $this->timeUnit, "state", "OFF", true);
|
||||
//$this->send($deviceTarget, "OFF", false, IDLE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "contact":
|
||||
logger(INFO, _("CASE: Contact Door"), __FILE__ . ":" . __LINE__);
|
||||
if ($value == false and getValue(RDC_SALON_LUMINOSITE, "illuminance_lux") <= $this->luminance_min)
|
||||
if ($value == false and $illuminance <= $this->luminance_min)
|
||||
{
|
||||
logger(INFO, _("Door is open and illumance < min"), __FILE__ . ":" . __LINE__);
|
||||
if ($deviceTarget->properties["state"]["method"] !== MANUAL)
|
||||
|
@ -14,8 +14,9 @@ class rdc_store extends hook
|
||||
protected $propertyInitialized =array();
|
||||
protected $devicelist = array(
|
||||
RDC_EXTERIEUR_LUMINOSITE => "illuminance_lux",
|
||||
RDC_SALON_LUMINOSITE => "illuminance_lux",
|
||||
METEO => "rainin",
|
||||
//METEO => "solarradiation",
|
||||
METEO => "solarradiation",
|
||||
METEO => "windspeedkmh",
|
||||
METEO => "windgustkmh"
|
||||
);
|
||||
@ -35,7 +36,7 @@ class rdc_store extends hook
|
||||
$rafale = 0;
|
||||
$soleil = 0;
|
||||
$storeDevice = $indexDevices[RDC_STORE];
|
||||
$maxLevel = 100;
|
||||
$this->maxLevel = 100;
|
||||
$r = 100;
|
||||
|
||||
if (array_key_exists("position", $storeDevice->properties))
|
||||
@ -50,11 +51,19 @@ class rdc_store extends hook
|
||||
if (array_key_exists("illuminance_lux", $indexDevices[RDC_EXTERIEUR_LUMINOSITE]->properties))
|
||||
{
|
||||
$exterieur_lux = $mohaDB->moyenne($indexDevices[RDC_EXTERIEUR_LUMINOSITE], "illuminance_lux", 15);
|
||||
if ($exterieur_lux == 0)
|
||||
{
|
||||
$exterieur_lux = $indexDevices[RDC_EXTERIEUR_LUMINOSITE]->properties["illuminance_lux"]["value"];
|
||||
}
|
||||
logger(DEBUG, "exterieur_lux=" . $exterieur_lux, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
if (array_key_exists("illuminance_lux", $indexDevices[RDC_SALON_LUMINOSITE]->properties))
|
||||
{
|
||||
$salon_lux = $mohaDB->moyenne($indexDevices[RDC_SALON_LUMINOSITE], "illuminance_lux", 10);
|
||||
if ($salon_lux == 0)
|
||||
{
|
||||
$salon_lux = $indexDevices[RDC_SALON_LUMINOSITE]->properties["illuminance_lux"]["value"];
|
||||
}
|
||||
logger(DEBUG, "salon_lux=" . $salon_lux, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
if (array_key_exists(METEO, $indexDevices))
|
||||
@ -66,13 +75,17 @@ class rdc_store extends hook
|
||||
}
|
||||
if (array_key_exists("windgustkmh", $indexDevices[METEO]->properties))
|
||||
{
|
||||
$rafale = $mohaDB->moyenne($indexDevices[METEO], "windgustkmh", 12);
|
||||
if ($indexDevices[METEO]->properties["windgustkmh"]["value"] > 50)
|
||||
{
|
||||
logger(ALERT, "Vent fort :" . $indexDevices[METEO]->properties["windgustkmh"]["value"], __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
$rafale = $mohaDB->moyenne($indexDevices[METEO], "windgustkmh", 7);
|
||||
logger(DEBUG, "rafale=" . $rafale, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
if (array_key_exists("solarradiation", $indexDevices[METEO]->properties))
|
||||
{
|
||||
$soleil = $mohaDB->moyenne($indexDevices[METEO], "solarradiation", 12);
|
||||
logger(DEBUG, "soleil=" . $exterieur_lux, __FILE__ . ":" . __LINE__);
|
||||
logger(DEBUG, "soleil=" . $soleil, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
}
|
||||
logger(DEBUG, sprintf(_("property=%s, value=%s"), $property, $value), __FILE__ . ":" . __LINE__);
|
||||
@ -94,10 +107,10 @@ class rdc_store extends hook
|
||||
{
|
||||
case "illuminance_lux":
|
||||
logger(DEBUG, "CASE: illuminance_lux:" . $value, __FILE__ . ":" . __LINE__);
|
||||
if ($exterieur_lux > 40000)
|
||||
if ($exterieur_lux > 30000)
|
||||
{
|
||||
logger(DEBUG, "exterieur_lux > 40000", __FILE__ . ":" . __LINE__);
|
||||
if ($this->maxLevel != 0 and $salon_lux > 150)
|
||||
logger(DEBUG, "exterieur_lux > 30000", __FILE__ . ":" . __LINE__);
|
||||
if ($this->maxLevel != 0 and $salon_lux > 100)
|
||||
{
|
||||
$store2level = $this->storeLevel + 15;
|
||||
if ( $store2level > $this->maxLevel )
|
||||
@ -110,9 +123,9 @@ class rdc_store extends hook
|
||||
$this->set($store2level);
|
||||
}
|
||||
}
|
||||
}elseif ($exterieur_lux < 35000)
|
||||
}elseif ($exterieur_lux < 15000 and $salon_lux < 300)
|
||||
{
|
||||
logger(DEBUG, "exterieur_lux < 35000", __FILE__ . ":" . __LINE__);
|
||||
logger(DEBUG, "exterieur_lux < 15000", __FILE__ . ":" . __LINE__);
|
||||
$this->close("Luminosité faible");
|
||||
}
|
||||
break;
|
||||
@ -141,11 +154,16 @@ class rdc_store extends hook
|
||||
|
||||
private function set ($level)
|
||||
{
|
||||
if ($this->storeLevel < $level)
|
||||
{
|
||||
logger(DEBUG, "function 'set' to level : " . $level, __FILE__ . ":" . __LINE__);
|
||||
//if ($this->storeLevel < $level)
|
||||
//{
|
||||
logger(DEBUG, "Open store :" . $level, __FILE__ . ":" . __LINE__);
|
||||
$this->send(100 - $level);
|
||||
}
|
||||
//}else
|
||||
/*{
|
||||
logger(DEBUG, "store is already at level" . $this->storeLevel . " so < at " . $level, __FILE__ . ":" . __LINE__);
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
private function close ($reason)
|
||||
|
92
moha.php
92
moha.php
@ -4,7 +4,7 @@ cli_set_process_title($title);
|
||||
file_put_contents("/proc/".getmypid()."/comm",$title);
|
||||
declare(ticks = 1);
|
||||
|
||||
$testMode = true;
|
||||
$testMode = false;
|
||||
$webServerIsActive = true;
|
||||
|
||||
require "constants.php";
|
||||
@ -14,15 +14,17 @@ $listPropertiesKeys = array("expose");
|
||||
|
||||
//global variables
|
||||
|
||||
$notificationLevel = ALERT | ERROR;
|
||||
$notificationLevel = ALERT;
|
||||
$topics = array(); // list of topics
|
||||
$mids = array(); // list of message IDs
|
||||
$devices = array(); // array of device objetcs
|
||||
$indexDevices = array(); // index of devices by ieee_address
|
||||
$indexFriendlyNames = array(); // index of devices by freindly name
|
||||
$indexTypes = array(); // index of devices by type
|
||||
$indexFriendlyNames = array(); // index of devices by friendly name
|
||||
$indexTypes = array();
|
||||
$indexProperties = array(); // index of properties
|
||||
$hooksList = array(); // list of hooks to be included
|
||||
$hooks = array(); // array of hooks
|
||||
$topicsCallbacks = array(); // array of topics's callbacks
|
||||
$notificationMethods = array(); // array of notification methods objects
|
||||
$events = array(); // list of event objects
|
||||
$monitored = array(); // list of device to watch
|
||||
@ -36,7 +38,7 @@ $curlErr = 0; // Number of errors returned by curl
|
||||
$configDir = "./config"; // default config dir (production value is /etc/moha/)
|
||||
$hooksInitialized = 0; // are all hooks initialized ? false/true
|
||||
$flagHooks = false;
|
||||
|
||||
$devicesRequest = false; //say to true when publishing device request to zigbee2mqtt
|
||||
|
||||
if ($testMode)
|
||||
{
|
||||
@ -199,10 +201,10 @@ require "db_functions.php";
|
||||
require "apiserver/apiserver.php";
|
||||
|
||||
// topics definition
|
||||
listHooks("./topics_callbacks", $hooksList);
|
||||
if (!empty($hooksList))
|
||||
listHooks("./topics_callbacks", $topicsCallbacks);
|
||||
if (!empty($topicsCallbacks))
|
||||
{
|
||||
foreach ($hooksList as $callback)
|
||||
foreach ($topicsCallbacks as $callback)
|
||||
{
|
||||
logger(INFO, _("Including ") . $callback, __FILE__ . ":" . __LINE__);
|
||||
include $callback;
|
||||
@ -211,7 +213,7 @@ if (!empty($hooksList))
|
||||
|
||||
// making the list of hooks to include
|
||||
listHooks("./hooks", $hooksList);
|
||||
if (!empty($hooksList)) // some hooks to include if hooklist is not empty
|
||||
if (!empty($hooksList)) // hooks to include if hooklist is not empty
|
||||
{
|
||||
foreach ($hooksList as $hookFile) // loop to include hooks in hookslist
|
||||
{
|
||||
@ -268,7 +270,6 @@ if (file_exists($dataPath . "events.db"))
|
||||
logger(DEBUG, _("Program start"), __FILE__ . ":" . __LINE__, false);
|
||||
$client = new Mosquitto\Client();
|
||||
|
||||
// defining callback functions
|
||||
|
||||
try
|
||||
{
|
||||
@ -298,6 +299,8 @@ foreach($topics as $name => &$topic)
|
||||
$topic->status = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// starting main loop
|
||||
logger(INFO, _("Starting loop"), __FILE__ . ":" . __LINE__, false);
|
||||
$oneshot = false;
|
||||
@ -305,56 +308,37 @@ $oneshot = false;
|
||||
while (true)
|
||||
{
|
||||
$client->loop(); // mqtt server loop()
|
||||
/*if (! $included) // hooks not already included
|
||||
|
||||
if ($oneshot === false) // execute while the first loop :WARNING hooks can to be not initialized
|
||||
{
|
||||
logger(DEBUG, _("Loading hooks list"), __FILE__ . ":" . __LINE__, false);
|
||||
if (!empty($hooksList)) // some hooks to include if hooklist is not empty
|
||||
{
|
||||
foreach ($hooksList as $hookFile) // loop to include hooks in hookslist
|
||||
{
|
||||
logger(INFO, _("Including ") . $hookFile, __FILE__ . ":" . __LINE__, false);
|
||||
include_once $hookFile;
|
||||
}
|
||||
if ($logLevel & DEBUG)
|
||||
{
|
||||
file_put_contents($dataPath . "moha.devices", var_export($devices, true)); // debugging : save device list
|
||||
}
|
||||
$included = true;
|
||||
}
|
||||
}else
|
||||
{*/
|
||||
logger(DEBUG, _("Oneshot part of loop"), __FILE__ . ":" . __LINE__, false);
|
||||
pws2mqttGetList();
|
||||
|
||||
if ($oneshot === false) // execute while the first loop :WARNING hooks can to be not initialized
|
||||
$oneshot = true;
|
||||
}
|
||||
$nn = 0;
|
||||
if($hooksInitialized == 0) // all hooks are not initialized
|
||||
{
|
||||
$i = 1;
|
||||
foreach($hooks as $hookName => &$hook)
|
||||
{
|
||||
logger(DEBUG, _("Oneshot part of loop"), __FILE__ . ":" . __LINE__, false);
|
||||
|
||||
$oneshot = true;
|
||||
}
|
||||
$nn = 0;
|
||||
if($hooksInitialized == 0) // all hooks are not initialized
|
||||
{
|
||||
$i = 1;
|
||||
foreach($hooks as $hookName => &$hook)
|
||||
if ($hook->initialized === false and $hook->active === true)
|
||||
{
|
||||
if ($hook->initialized === false and $hook->active === true)
|
||||
{
|
||||
logger(WARNING, _("Initializing Hook not completely initialized :") . $hookName, __FILE__ . ":" . __LINE__);
|
||||
$i &= $hook->installHooks($indexDevices);
|
||||
}
|
||||
logger(WARNING, _("Initializing Hook not completely initialized :") . $hookName, __FILE__ . ":" . __LINE__);
|
||||
$i &= $hook->installHooks($indexDevices);
|
||||
}
|
||||
$hooksInitialized = $i;
|
||||
}elseif($flagHooks === false)
|
||||
{
|
||||
logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__);
|
||||
$flagHooks = true;
|
||||
}else // executed when hooks initialization finished but database init not finished
|
||||
{
|
||||
//logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__);
|
||||
|
||||
}
|
||||
checkEvents();
|
||||
apiServer($read);
|
||||
//}
|
||||
$hooksInitialized = $i;
|
||||
}elseif($flagHooks === false)
|
||||
{
|
||||
logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__);
|
||||
$flagHooks = true;
|
||||
}else // executed when hooks initialization finished but database init not finished
|
||||
{
|
||||
//logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
checkEvents();
|
||||
apiServer($read);
|
||||
}
|
||||
|
||||
endMoha();
|
||||
|
@ -1,9 +1,7 @@
|
||||
#!/usr/bin/bash
|
||||
rsync -aP --exclude "*~" --exclude *kate-swp $1/config/ /etc/moha/
|
||||
chmod 0500 /etc/moha
|
||||
chmod 0400 /etc/moha/*
|
||||
chmod a+rX -R /etc/moha
|
||||
chown domotique:domotique -R /etc/moha
|
||||
rsync -aP --exclude "*~" --exclude *kate-swp $1/webserver/ /var/www/html/moha/
|
||||
chmod 0400 -R /var/www/html/moha/
|
||||
chmod 0500 /var/www/html/moha
|
||||
chmod u+rX -R /var/www/html/moha/
|
||||
chown apache:apache -R /var/www/html/moha
|
||||
|
@ -1,6 +1,5 @@
|
||||
<?php
|
||||
//TODO to test and debug
|
||||
var_dump($topics);
|
||||
if (!array_key_exists("linky2mqtt", $topics)) $topics["linky2mqtt"] = new topic;
|
||||
if (!array_key_exists("linky2mqtt", $devices)) $devices["linky2mqtt"] = array();
|
||||
|
||||
|
@ -11,50 +11,53 @@ function pws2mqttCallback($topic, $message)
|
||||
$device = & $devices[$topicName];
|
||||
$payloadArray = json_decode($message->payload, true);
|
||||
// friendlyname
|
||||
if (!array_key_exists($fn, $device))
|
||||
if ( $fn != "get")
|
||||
{
|
||||
echo "initializing $fn";
|
||||
$device[$fn] = array("device" => new device);
|
||||
$device = &$device[$fn];
|
||||
$device["device"]->friendlyName = $payloadArray["friendly_name"];
|
||||
$device["device"]->ieeeAddress = $payloadArray["ieeeAddress"];
|
||||
$device["device"]->type = $payloadArray["type"];
|
||||
$device["device"]->topic = $topicName;
|
||||
//$indexDevices[$device["device"]->ieeeAddress] = & $device["device"];
|
||||
//$indexFriendlyNames[$topicName][$fn] = & $device["device"];
|
||||
mkIndexes();
|
||||
if (!array_key_exists($fn, $device))
|
||||
{
|
||||
echo "initializing $fn";
|
||||
$device[$fn] = array("device" => new device);
|
||||
$device = &$device[$fn];
|
||||
$device["device"]->friendlyName = $payloadArray["friendly_name"];
|
||||
$device["device"]->ieeeAddress = $payloadArray["ieeeAddress"];
|
||||
$device["device"]->type = $payloadArray["type"];
|
||||
$device["device"]->topic = $topicName;
|
||||
//$indexDevices[$device["device"]->ieeeAddress] = & $device["device"];
|
||||
//$indexFriendlyNames[$topicName][$fn] = & $device["device"];
|
||||
mkIndexes();
|
||||
|
||||
}else
|
||||
{
|
||||
$device = &$device[$fn];
|
||||
}
|
||||
unset($payloadArray["friendly_name"]);
|
||||
unset($payloadArray["ieeeAddress"]);
|
||||
unset($payloadArray["type"]);
|
||||
}else
|
||||
{
|
||||
$device = &$device[$fn];
|
||||
}
|
||||
unset($payloadArray["friendly_name"]);
|
||||
unset($payloadArray["ieeeAddress"]);
|
||||
unset($payloadArray["type"]);
|
||||
|
||||
foreach ($payloadArray as $property => $value)
|
||||
{
|
||||
$str = substr($property, -1);
|
||||
if ($str == "f")
|
||||
foreach ($payloadArray as $property => $value)
|
||||
{
|
||||
$newProperty = rtrim($property, "f") . "c";
|
||||
$payloadArray[$newProperty] = farenheit2celsius($value);
|
||||
}elseif ($str == "h")
|
||||
{
|
||||
$newProperty = substr($property, 0, -3) . "kmh";
|
||||
$payloadArray[$newProperty] = mph2kmh($value);
|
||||
$str = substr($property, -1);
|
||||
if ($str == "f")
|
||||
{
|
||||
$newProperty = rtrim($property, "f") . "c";
|
||||
$payloadArray[$newProperty] = farenheit2celsius($value);
|
||||
}elseif ($str == "h")
|
||||
{
|
||||
$newProperty = substr($property, 0, -3) . "kmh";
|
||||
$payloadArray[$newProperty] = mph2kmh($value);
|
||||
}
|
||||
if ($property == "baromin")
|
||||
{
|
||||
$newProperty = "barominmb";
|
||||
$payloadArray["barominmb"] = millibars($value);
|
||||
}
|
||||
}
|
||||
if ($property == "baromin")
|
||||
//$device = getDeviceByFriendlyname($topicName, $fn, $payloadArray, true);
|
||||
if (!empty($payloadArray))
|
||||
{
|
||||
$newProperty = "barominmb";
|
||||
$payloadArray["barominmb"] = millibars($value);
|
||||
changeDevice($topicName, $fn, $device["device"], $payloadArray);
|
||||
}
|
||||
}
|
||||
//$device = getDeviceByFriendlyname($topicName, $fn, $payloadArray, true);
|
||||
if (!empty($payloadArray))
|
||||
{
|
||||
changeDevice($topicName, $fn, $device["device"], $payloadArray);
|
||||
}
|
||||
};
|
||||
$topics["pws2mqtt"]->callback = "pws2mqttCallback";
|
||||
|
||||
@ -66,5 +69,4 @@ if (!is_callable("pws2mqttGetList"))
|
||||
}
|
||||
}
|
||||
|
||||
pws2mqttGetList();
|
||||
?>
|
||||
|
@ -5,7 +5,7 @@ if (!array_key_exists("zigbee2mqtt", $devices)) $devices["zigbee2mqtt"] = array
|
||||
|
||||
function zigbee2mqttCallback($topic, $message)
|
||||
{
|
||||
global $topics, $devices, $included, $logFh, $indexFriendlyNames;
|
||||
global $topics, $devices, $included, $logFh, $indexFriendlyNames, $devicesRequest;
|
||||
|
||||
if ($topic[1] == "bridge")
|
||||
{
|
||||
@ -20,6 +20,7 @@ function zigbee2mqttCallback($topic, $message)
|
||||
//fwrite($logFh, var_export($topics[$topic[0]]->devices, true));
|
||||
mkDevicesDB($topic[0], $topics[$topic[0]]->devices);
|
||||
getDevicesValues($topic[0]);
|
||||
$devicesRequest = false;
|
||||
break;
|
||||
case "groups":
|
||||
logger(DEBUG,_("Inserting zigbee groups in DB"), __FILE__ . ":" . __LINE__);
|
||||
@ -77,7 +78,7 @@ function zigbee2mqttCallback($topic, $message)
|
||||
$alert = 0;
|
||||
while (!array_key_exists($fn, $indexFriendlyNames))
|
||||
{
|
||||
logger(INFO, _("device does not exists in IndexFriendlyNames: ") . print_r($payloadArray,true), __FILE__ . ":" . __LINE__);
|
||||
logger(ERROR, $fn . _(" device does not exists in IndexFriendlyNames: ") . print_r($payloadArray,true), __FILE__ . ":" . __LINE__);
|
||||
if ($flag == 0)
|
||||
{
|
||||
logger(INFO, "Reindexing all indexes", __FILE__ . ":" . __LINE__);
|
||||
@ -86,26 +87,32 @@ function zigbee2mqttCallback($topic, $message)
|
||||
}elseif($flag == 1)
|
||||
{
|
||||
logger(INFO, "getting device list from zigbee2mqtt", __FILE__ . ":" . __LINE__);
|
||||
publish("zigbee2mqtt", array("bridge/devices" => ""), "get");
|
||||
if ($devicesRequest === false)
|
||||
{
|
||||
publish("zigbee2mqtt", array("bridge/devices" => ""), "get");
|
||||
}
|
||||
$flag += 1;
|
||||
}elseif($flag >= 2)
|
||||
}elseif($flag++ >= 5)
|
||||
{
|
||||
$flage = 0;
|
||||
if ($alert++ > 4)
|
||||
{
|
||||
logger(ALERT, _("device does not exists in IndexFriendlyNames: ") . $fn, __FILE__ . ":" . __LINE__);
|
||||
break;
|
||||
}
|
||||
//if ($alert++ > 4)
|
||||
//{
|
||||
logger(ERROR, _(" stopping searching for ") . $fn . " payloadArray =>" . print_r($payloadArray, true), __FILE__ . ":" . __LINE__);
|
||||
break;
|
||||
//}
|
||||
}
|
||||
}
|
||||
//logger(DEBUG, "PayloadArray = " . print_r($payloadArray,true), __FILE__ . ":" . __LINE__);
|
||||
if ($alert <= 4)
|
||||
if ($flag <= 4)
|
||||
{
|
||||
changeDevice($topicName, $fn, $indexFriendlyNames[$fn], $payloadArray);
|
||||
}else
|
||||
{
|
||||
logger(ERROR, $fn . _(" not changed"), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
}else
|
||||
{
|
||||
logger(DEBUG, _("Zigbee2mqtt doing get or set !?"));
|
||||
logger(DEBUG, _("Zigbee2mqtt doing get or hooks not included !?"), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
};
|
||||
|
||||
|
14
utils.php
14
utils.php
@ -1,5 +1,5 @@
|
||||
<?php
|
||||
logger(DEBUG, _("Including utils.php"), __FILE__ . ":" . __LINE__);
|
||||
////logger(DEBUG, _("Including utils.php"), __FILE__ . ":" . __LINE__);
|
||||
|
||||
function bool2string($var)
|
||||
{
|
||||
@ -64,15 +64,15 @@ function getDevice($topic, $fn)
|
||||
$var = $var[$tmp];
|
||||
}else
|
||||
{
|
||||
logger(ERROR, sprintf(_("level %s of %s do not exists in %s"), $tmp, $fn, $topic), __FILE__ . ":" . __LINE__ );
|
||||
////logger(ERROR, sprintf(_("level %s of %s do not exists in %s"), $tmp, $fn, $topic), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
logger(DEBUG, sprintf(_("returning a value")), __FILE__ . ":" . __LINE__ );
|
||||
////logger(DEBUG, sprintf(_("returning a value")), __FILE__ . ":" . __LINE__ );
|
||||
return $var["device"];
|
||||
}else
|
||||
{
|
||||
logger(ERROR, sprintf(_("Topic %s do not exists"), $topic), __FILE__ . ":" . __LINE__ );
|
||||
////logger(ERROR, sprintf(_("Topic %s do not exists"), $topic), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -84,11 +84,11 @@ function getValue($ieeeAddress, $property)
|
||||
if (array_key_exists($property, $indexDevices[$ieeeAddress]->properties))
|
||||
{
|
||||
$r = $indexDevices[$ieeeAddress]->properties[$property]["value"];
|
||||
logger(DEBUG, "device: " . $indexDevices[$ieeeAddress]->friendlyName . " value: " . $r, __FILE__ . ":" . __LINE__ );
|
||||
//logger(DEBUG, "device: " . $indexDevices[$ieeeAddress]->friendlyName . " value: " . $r, __FILE__ . ":" . __LINE__ );
|
||||
}else
|
||||
{
|
||||
$r = false;
|
||||
logger(ERROR, "device: " . $indexDevices[$ieeeAddress]->friendlyName . "property " . $property . "does not exists", __FILE__ . ":" . __LINE__ );
|
||||
//logger(ERROR, "device: " . $indexDevices[$ieeeAddress]->friendlyName . "property " . $property . "does not exists", __FILE__ . ":" . __LINE__ );
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
@ -99,7 +99,7 @@ function setValue($fn, $property, $value)
|
||||
$indexDevices[$ieeeAddress]->properties[$property]["value"] = $value;
|
||||
}
|
||||
|
||||
logger(DEBUG, _("signal handling"), __FILE__ . ":" . __LINE__, false);
|
||||
//logger(DEBUG, _("signal handling"), __FILE__ . ":" . __LINE__, false);
|
||||
//signal handling
|
||||
function signalHandler($signal)
|
||||
{
|
||||
|
38
webserver/class/db.class.php
Normal file
38
webserver/class/db.class.php
Normal file
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
//logger(DEBUG, _("Including db.php"));
|
||||
|
||||
class db extends mysqli
|
||||
{
|
||||
public $mysqlServer = "127.0.0.1"; // Your production server
|
||||
public $username = "moha";
|
||||
public $passwd = "MysqlMoha";
|
||||
public $database = "moha";
|
||||
public $result;
|
||||
|
||||
function __construct()
|
||||
{
|
||||
global $testMode;
|
||||
$flagError = false;
|
||||
if ($testMode)
|
||||
{
|
||||
$this->mysqlServer = "192.168.1.253"; // Your test server
|
||||
}
|
||||
while ($this->connect($this->mysqlServer, $this->username, $this->passwd, $this->database) === false)
|
||||
{
|
||||
//logger(ERROR,_("Connection to sql server error :") . $this->connect_error, __FILE__ . ":" . __LINE__);
|
||||
sleep(5);
|
||||
$flagError = true;
|
||||
}
|
||||
if ($flagError === true)
|
||||
{
|
||||
//logger(ERROR, _("Connection to sql server ready"), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
$result = new mysqli_result($this);
|
||||
}
|
||||
|
||||
function protect($string)
|
||||
{
|
||||
return $this->real_escape_string($string);
|
||||
}
|
||||
}
|
||||
?>
|
5
webserver/config.php
Normal file
5
webserver/config.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
$varPath = "/usr/share/moha/";
|
||||
$mohaPath = "/home/daniel/moha";
|
||||
$configPath = "/etc/moha/";
|
||||
?>
|
@ -2,14 +2,19 @@
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/*need device ieeeAddress, property, startDate and finalDate */
|
||||
/*need device ieeeAddress, property, startDate and endDate */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
function displayStats($socket, $argList)
|
||||
require_once "config.php";
|
||||
require_once "utils.php";
|
||||
require_once "header.php";
|
||||
|
||||
|
||||
function displayStats($ieeeAddress, $fn, $property, $startDate, $endDate)
|
||||
{
|
||||
global $indexFriendlyNames, $mohaDB;
|
||||
logger(INFO, "Function displayStats", __FILE__ . ":" . __LINE__);
|
||||
//logger(INFO, "Function displayStats", __FILE__ . ":" . __LINE__);
|
||||
|
||||
// Validation of the dates
|
||||
if (validateDate($argList["startDate"]) && validateDate($argList["finalDate"]))
|
||||
@ -23,10 +28,10 @@ function displayStats($socket, $argList)
|
||||
}else
|
||||
{
|
||||
$query = "SELECT date, value FROM logs WHERE device='" . $indexFriendlyNames[$argList["fn"]]->ieeeAddress . "' AND property='" . $argList["property"] . "' AND '" . $argList["startDate"] . "'>= date AND '" . $argList["finalDate"] . "' <= date ORDER BY date";
|
||||
logger(DEBUG, _("query : ") . $query, __FILE__ . ":" . __LINE__);
|
||||
//logger(DEBUG, _("query : ") . $query, __FILE__ . ":" . __LINE__);
|
||||
if(!($mohaDB->result = $mohaDB->query($query)))
|
||||
{
|
||||
logger(ERROR, _("mysql query error: ") . $mohaDB->error, __FILE__ . ":" . __LINE__);
|
||||
//logger(ERROR, _("mysql query error: ") . $mohaDB->error, __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
$datas = $mohaDB->result->fetch_all(MYSQLI_ASSOC);
|
||||
htmlSend($socket, diagramDisplay($datas));
|
||||
@ -144,4 +149,9 @@ function diagramDisplay($datas)
|
||||
//Desallouer la mémoire utiliser par l'image
|
||||
imagedestroy($courbe);
|
||||
}
|
||||
|
||||
$tmp = explode("|", $_GET["device"]);
|
||||
|
||||
displayStats($tmp[0], $tmp[1], $tmp[2]);
|
||||
|
||||
?>
|
||||
|
@ -1,10 +1,92 @@
|
||||
<?php
|
||||
require_once "header.php";
|
||||
require_once "config.php";
|
||||
require_once "db_config.php";
|
||||
require_once "utils.php";
|
||||
require_once $mohaPath . "/constants.php";
|
||||
require_once $mohaPath . "/class/db.php";
|
||||
require_once $configPath . "properties2log.php";
|
||||
|
||||
function logger($level, $log, $pos = "")
|
||||
{
|
||||
global $logFh, $logLevel, $notificationLevel, $logLevels;
|
||||
$logString = $logLevels[$level] . " " ;
|
||||
if ($pos !== false)
|
||||
{
|
||||
$logString .= $pos;
|
||||
}
|
||||
$logString .= " - " . $log;
|
||||
if ($level & $logLevel)
|
||||
{
|
||||
fwrite($logFh, date("c") . ' ' . $logString . EOL);
|
||||
print ("MOHA-" . $logString . EOL);
|
||||
}
|
||||
}
|
||||
|
||||
function htmlGetFriendlyNames($ieeeAddress = '') : array
|
||||
{
|
||||
$url = "HTTP://localhost:1025/friendlyname";
|
||||
$ch = curl_init($url);
|
||||
if ($ieeeAddress !== '')
|
||||
{
|
||||
$url .= "&ieeeAddress=" . $ieeeAddress;
|
||||
}
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_HEADER, 0);
|
||||
$fn = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$start = strpos($fn, "{");
|
||||
$end = strpos($fn, "}");
|
||||
$length = $end - $start + 1;
|
||||
$fn = substr($fn, $start, $length);
|
||||
return jsonDecode($fn);
|
||||
}
|
||||
|
||||
$indexIeeeAddress = htmlGetFriendlyNames();
|
||||
|
||||
//print_r($indexIeeeAddress);
|
||||
print (_("This is the Statistics of Moha"));
|
||||
|
||||
if (empty($indexIeeeAddress))
|
||||
{
|
||||
$response = _("ERROR getting list of Friendly names: json error =>") . json_last_error_msg() .EOLH;
|
||||
}else
|
||||
{
|
||||
$query = "SELECT DISTINCT device, property FROM logs";
|
||||
$result = $mohaDB->query($query);
|
||||
$devices = mysqli_fetch_all($result, MYSQLI_ASSOC);
|
||||
$devicesList = array();
|
||||
// print_r($devices);
|
||||
print '<form method="GET" action="display_stats.php">';
|
||||
//print '<input type="hidden" name="fn" value="">';
|
||||
print '<label for="devicesSelectList">' . _("Choose a device:") . '</label>
|
||||
<select name="device" id="devicesSelectList">' ;
|
||||
foreach ($devices as $value)
|
||||
{
|
||||
if ( array_key_exists($value["device"], $indexIeeeAddress))
|
||||
{
|
||||
$devicesList[$value["device"]]["fn"] = $indexIeeeAddress[$value["device"]];
|
||||
$devicesList[$value["device"]][] = $value["property"];
|
||||
}
|
||||
}
|
||||
//$devicesList = array_intersect_key($indexIeeeAddress, $tmp);
|
||||
//print_r($devicesList);
|
||||
foreach($devicesList as $ieeeAddress => $array)
|
||||
{
|
||||
print '<optgroup label="' . $array["fn"] . '">';
|
||||
foreach($array as $key => $property)
|
||||
{
|
||||
if ($key != "fn")
|
||||
{
|
||||
print '<option value="' . $ieeeAddress . '|' . $array["fn"] . '|' . $property . '">' . $property . '</option>' . EOL;
|
||||
}
|
||||
}
|
||||
print '</optgroup>' . EOL;
|
||||
}
|
||||
print "</select>";
|
||||
print '<input type="submit" value="Afficher les statistiques">';
|
||||
print "</form>" . EOL;
|
||||
}
|
||||
|
||||
require_once "footer.php";
|
||||
?>
|
||||
|
16
webserver/utils.php
Normal file
16
webserver/utils.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
function jsonDecode($json)
|
||||
{
|
||||
$jsonArray = array();
|
||||
$json = trim($json, " {[]}");
|
||||
$tmp = explode(",", $json);
|
||||
foreach($tmp as $value)
|
||||
{
|
||||
$tmp2 = explode (":" , $value);
|
||||
$jsonArray[trim($tmp2[0], '"')] = trim($tmp2[1], '"');
|
||||
}
|
||||
return $jsonArray;
|
||||
}
|
||||
|
||||
?>
|
Loading…
Reference in New Issue
Block a user