1
0

- added dashboard\n- some debugging

This commit is contained in:
daniel Tartavel 2022-02-07 16:58:42 +01:00
parent 18d5b74a96
commit 314305bcb1
8 changed files with 265 additions and 61 deletions

View File

@ -17,6 +17,7 @@ class topic {
public $extensions; public $extensions;
public $config; public $config;
public $callback; public $callback;
public $getOnStart = false;
} }
class device class device
@ -47,7 +48,7 @@ class device
public function get() public function get()
{ {
publish($this->topic . "/" . $this->friendlyNames, $this->payload, "get"); //, $event); publish($this->topic . "/" . $this->friendlyName, $this->payload, "get"); //, $event);
} }
} }

10
config/dashboard_conf.php Normal file
View File

@ -0,0 +1,10 @@
<?php
$dashboards[] = array(
RDC_SALON_ECLAIRAGE_PANNEAU => "state",
RDC_SDB_WC_ECLAIRAGE => "state_l1",
RDC_SDB_WC_ECLAIRAGE => "state_l2",
RDC_CHAMBRE_AMBIANCE => "state",
RDC_CHAMBRE_ECLAIRAGE => "state_l1"
);
?>

View File

@ -1,7 +1,8 @@
<?php <?php
//Constants //Constants
define( "EOL", "\n"); define("EOL", "\n");
define("EOLR", "\n\r");
define("Z2M", "zigbee2mqtt"); define("Z2M", "zigbee2mqtt");
define("ON", 1); define("ON", 1);
define("OFF", 0); define("OFF", 0);

View File

@ -2,16 +2,20 @@
logger(DEBUG,_("Including db_functions.php"), __FILE__ . ":" . __LINE__); logger(DEBUG,_("Including db_functions.php"), __FILE__ . ":" . __LINE__);
// to save or not to save the DB, that is the question ... //to save or not to save the DB, that is the question ...
function storeDB($db, $filepath) function storeDB($db, $filepath)
{ {
$data = serialize($db); $data = serialize($db);
file_put_contents($filepath, $data); return file_put_contents($filepath, $data);
} }
function loadDB(& $db, $filepath) function loadDB(& $db, $filepath)
{ {
$data = file_get_contents($filepath); $data = file_get_contents($filepath);
if ($data === false)
{
return false;
}
$db = unserialize($data); $db = unserialize($data);
} }
@ -230,9 +234,36 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro
} }
} }
function getDevicesValues() function getDevicesValues($topic)
{ {
//TODO global $indexDevices, $topics;
logger(DEBUG, _("getDevicesValues function" ));
foreach($indexDevices as $device)
{
if ($device->topic == $topic)
{
logger(DEBUG, "device: " . $device->friendlyName);
$payload = "{";
$flag = false;
$properties = array_slice($device, 12);
logger(DEBUG, print_r($properties, true));
foreach($properties as $property)
{
if (flag)
{
$payload = ",";
}else {
$flag = true;
}
$payload .= $property . ':""';
}
$device->payload = $payload . "}";
logger(DEBUG, $device->payload);
$device->get();
}
}
exit(0);
} }
?> ?>

View File

@ -13,7 +13,7 @@ class rdc_salon_eclairage extends hook
public $delay = 3; // amount of time in $timeunit public $delay = 3; // amount of time in $timeunit
public $timeUnit = "minute"; // unit of time for delay, second, minute, hour, day, week, month, year public $timeUnit = "minute"; // unit of time for delay, second, minute, hour, day, week, month, year
public $luminance_min = 70; public $luminance_min = 60;
public $luminance_max = 3000; public $luminance_max = 3000;

View File

@ -34,6 +34,8 @@ $curlErr = 0; // Number of errors returned by curl
$configDir = "./config"; // default config dir (production value is /etc/moha/) $configDir = "./config"; // default config dir (production value is /etc/moha/)
$hooksInitialized = 0; // are all hooks initialized ? false/true $hooksInitialized = 0; // are all hooks initialized ? false/true
$flagHooks = false; $flagHooks = false;
if ($testMode) if ($testMode)
{ {
$mqttServerIp = "192.168.1.253"; // IP address of mqttserver in test mode $mqttServerIp = "192.168.1.253"; // IP address of mqttserver in test mode
@ -45,7 +47,7 @@ if ($testMode)
$mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode $mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode
$dataPath = "/usr/share/moha/"; $dataPath = "/usr/share/moha/";
$logFile = "/var/log/moha.log"; // Path of log file $logFile = "/var/log/moha.log"; // Path of log file
$configDir = "/etc/config"; // default config dir (production value is /etc/moha/) $configDir = "/etc/moha"; // default config dir (production value is /etc/moha/)
} }
@ -88,11 +90,7 @@ function logger($level, $log, $pos = false, $notif = true)
{ {
logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false); logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false);
} }
}else
{
logger(INFO, _("Notification not sent because of testMode"), __FILE__ . ":" . __LINE__, false);
} }
} }
function init() function init()
@ -134,7 +132,10 @@ function endMoha()
$x = 0; $x = 0;
logger(WARNING, _("moha is ending"), __FILE__ . ":" . __LINE__); logger(WARNING, _("moha is ending"), __FILE__ . ":" . __LINE__);
storeDB($devices, $dataPath . "moha.db"); if (storeDB($devices, $dataPath . "moha.db") === false)
{
logger(ERROR, _("Can not store db" ), __FILE__ . ":" . __LINE__);
}
if($testMode) file_put_contents($dataPath . "moha.devices", var_export($devices, true)); if($testMode) file_put_contents($dataPath . "moha.devices", var_export($devices, true));
if ($connected) if ($connected)
{ {
@ -160,6 +161,25 @@ function connect2mqttServer()
$client->onConnect('connectResponse'); $client->onConnect('connectResponse');
} }
logger(WARNING, _("starting moha"), __FILE__ . ":" . __LINE__); logger(WARNING, _("starting moha"), __FILE__ . ":" . __LINE__);
logger(DEBUG, _("requiring config files -> devices_constants.php"), __FILE__ . ":" . __LINE__);
//include predefined file witch define constants for devices
if (is_readable($configDir . "/devices_constants.php"))
{
include $configDir . "/devices_constants.php";
//echo "hooklist"; print_r($hooksList); echo EOL;
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}elseif(is_readable("config/devices_constants.php"))
{
include "config/devices_constants.php";
//echo "hooklist"; print_r($hooksList); echo EOL;
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}else
{
logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}
logger(DEBUG, _("requiring php modules"), __FILE__ . ":" . __LINE__); logger(DEBUG, _("requiring php modules"), __FILE__ . ":" . __LINE__);
require "class/main.php"; require "class/main.php";
require "class/db.php"; require "class/db.php";
@ -171,11 +191,11 @@ require "events.php";
require "db_functions.php"; require "db_functions.php";
require "webserver.php"; require "webserver.php";
//logger(DEBUG, _('assigning variable $client to mosquitto class "client"'), false);
//$client = new Mosquitto\Client();
logger(DEBUG, _("Loading stored devices datas"), __FILE__ . ":" . __LINE__); logger(DEBUG, _("Loading stored devices datas"), __FILE__ . ":" . __LINE__);
loadDB($devices, "moha.db"); if (loadDB($devices, $dataPath . "moha.db") === false)
{
logger(ERROR, _("Can not load device db"), __FILE__ . ":" . __LINE__);
}
// topics definition // topics definition
@ -189,22 +209,6 @@ if (!empty($hooksList))
} }
} }
logger(DEBUG, _("requiring config files -> devices_constants.php"), __FILE__ . ":" . __LINE__);
//include predefined file witch define constants for devices
if (is_readable($configDir . "/" . "devices_constants.php"))
{
include $configDir . "/" . "devices_constants.php";
//echo "hooklist"; print_r($hooksList); echo EOL;
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}elseif(is_readable("config/devices_constants.php"))
{
include "config/devices_constants.php";
//echo "hooklist"; print_r($hooksList); echo EOL;
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}else
{
logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
}
// making the list of hooks to include // making the list of hooks to include
listHooks("./hooks", $hooksList); listHooks("./hooks", $hooksList);
@ -252,13 +256,13 @@ while (true)
if (! $included) // hooks not already included if (! $included) // hooks not already included
{ {
logger(DEBUG, _("Making hooks list"), __FILE__ . ":" . __LINE__, false); logger(DEBUG, _("Making hooks list"), __FILE__ . ":" . __LINE__, false);
getDevicesValues(); // TODO get the values of devices
if (!empty($hooksList)) // some hooks to include if hooklist is not empty if (!empty($hooksList)) // some hooks to include if hooklist is not empty
{ {
foreach ($hooksList as $hook) // loop to include hooks in hookslist foreach ($hooksList as $hookFile) // loop to include hooks in hookslist
{ {
logger(INFO, _("Including ") . $hook, __FILE__ . ":" . __LINE__, false); logger(INFO, _("Including ") . $hookFile, __FILE__ . ":" . __LINE__, false);
include $hook; include $hookFile;
} }
file_put_contents($dataPath . "moha.devices", var_export($devices, true)); // debugging : save device list file_put_contents($dataPath . "moha.devices", var_export($devices, true)); // debugging : save device list
$included = true; $included = true;
@ -270,11 +274,12 @@ while (true)
if ($oneshot === false) // execute once initialization finished :WARNING hooks can to be not initialized if ($oneshot === false) // execute once initialization finished :WARNING hooks can to be not initialized
{ {
logger(DEBUG, _("Oneshot part of loop"), __FILE__ . ":" . __LINE__, false); logger(DEBUG, _("Oneshot part of loop"), __FILE__ . ":" . __LINE__, false);
$oneshot = true; $oneshot = true;
} }
if($hooksInitialized == 0) // all hooks are not initialized if($hooksInitialized == 0) // all hooks are not initialized
{ {
$i = 1; //$i = 1;
foreach($hooks as $hookName => $hook) foreach($hooks as $hookName => $hook)
{ {
if ($hook->initialized === false) if ($hook->initialized === false)
@ -288,6 +293,7 @@ while (true)
{ {
logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__); logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__);
$flagHooks = true; $flagHooks = true;
getDevicesValues();exit (0);
} }
checkEvents(); checkEvents();
askWebServer($read); askWebServer($read);

View File

@ -15,6 +15,7 @@ $callback = function($topic, $message)
$topics[$topic[0]]->devices = json_decode($message->payload); $topics[$topic[0]]->devices = json_decode($message->payload);
fwrite($logFh, var_export($topics[$topic[0]]->devices, true)); fwrite($logFh, var_export($topics[$topic[0]]->devices, true));
mkDevicesDB($topic[0], $topics[$topic[0]]->devices); mkDevicesDB($topic[0], $topics[$topic[0]]->devices);
getDevicesValues($topic[0]);
break; break;
case "groups": case "groups":
logger(DEBUG,_("Inserting zigbee groups in DB"), __FILE__ . ":" . __LINE__); logger(DEBUG,_("Inserting zigbee groups in DB"), __FILE__ . ":" . __LINE__);

View File

@ -4,17 +4,147 @@
set_time_limit(0); set_time_limit(0);
ob_implicit_flush(); ob_implicit_flush();
$error_message = null; $error_message = null;
$error_code = null; $error_code = null;
$listenHost = "0.0.0.0"; $listenHost = "0.0.0.0";
$listenPort = 1025; $listenPort = 1025;
$Dashboards = array();
require_once $configDir . "/dashboard_conf.php";
// opening listening server
$socket = stream_socket_server("tcp://" . $listenHost . ":" . $listenPort, $error_code, $error_message) or logger(ERROR, _("Could not create socket") . EOL); $socket = stream_socket_server("tcp://" . $listenHost . ":" . $listenPort, $error_code, $error_message) or logger(ERROR, _("Could not create socket") . EOL);
stream_set_blocking($socket, false); stream_set_blocking($socket, false);
$read = array( $socket ); $read = array( $socket );
function htmlSend($socket, $text)
{
$httpHeader = "HTTP/1.1 200 OK" . EOLR .
"Date: " . date("r") . EOLR .
"Connection: close" . EOLR .
"Content-Type: text/html; charset=UTF-8" . EOLR . EOLR;
$response = $httpHeader . '<!doctype html>' . EOL . '<html lang="fr">' . EOL . '<head>' . EOL . '<meta charset="utf-8">' . EOL . '<title>Moha</title>' . EOL . '</head><body>' . $text . "</body></html>";
stream_socket_sendto($socket, $response);
}
function webListTopics()
{
global $topics;
logger(DEBUG, _("webListTopics function"));
$response = "";
foreach ($topics as $name => $topic)
{
$response .= '<a href="/topic=' . $name . '">' . $name ."</a><br>";
}
return $response;
}
function webBrowse($socket, $argList)
{
global $topics, $devices;
$response = "";
logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
//$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
$response = "";
$flag = false;
if (array_key_exists("topic", $argList))
{
if (array_key_exists($argList["topic"], $topics))
{
logger(DEBUG, _("Topic exists") , __FILE__ . ":" . __LINE__);
$topicRef = '<a href="topic=' . $argList["topic"];
if (array_key_exists("fn", $argList))
{
logger(DEBUG, _("FriendlyName exists: ") . $argList["fn"] , __FILE__ . ":" . __LINE__);
$fn = "";
$fnArray = explode("/", $argList["fn"]);
$device = $devices[$argList["topic"]];
foreach($fnArray as $value)
{
if ($flag) $fn .= "/";
$fn .= $value;
if (!array_key_exists($value, $device))
{
htmlSend($socket, sprintf(_('"%s" does not exists')));
return false;
}
$device = $device[$value];
$flag = true;
}
if (array_key_exists("device", $device))
{
$device = $device["device"];
$fn .= "device/" . $fn;
}
if (is_object($device))
{
foreach($device as $key => $value)
{
if ($key != "device" and is_array($value))
{
print_r($value);
if (array_key_exists("value", $value))
{
$response .= $key . ' = ' . bool2string($value["value"]) . "<br>";
}
}
}
}else
{
foreach($device as $key => $value)
{
$response .= $topicRef . "&fn=" . $fn . "/" . $key . '">' . $key . "</a><br>";
}
}
logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__);
//htmlSend($socket, $response);
}else
{
foreach($devices[$argList["topic"]] as $key => $value)
{
logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__);
$response .= $topicRef . "&fn=" . $key . '">' . $key . "</a><br>";
logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__);
}
}
}else
{
$response = webListTopics();
}
}else
{
$response = webListTopics();
}
htmlSend($socket, $response);
}
function webDashboard($socket, $n = 0)
{
global $dashboards, $indexDevices;
logger(DEBUG, _("webDashboard function"));
$response = "";
if(array_key_exists($n, $dashboards))
{
foreach ($dashboards[$n] as $ieeeAddress => $property)
{
logger(DEBUG, _($indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"])));
$response .= $indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"]) . "<br>";
}
}else
{
$response = _("dashboard not found");
}
htmlSend($socket, $response);
}
function askWebServer($read) function askWebServer($read)
{ {
global $topics, $indexDevices, $devices;
$array = array(); $array = array();
$argList =array(); $argList =array();
@ -31,16 +161,32 @@ function askWebServer($read)
{ {
$input = substr($input,5); $input = substr($input,5);
$input = explode(" ", $input); // suppress text $input = explode(" ", $input); // suppress text
$argTmp = explode("&", $input[0]);
$argTmp = explode("&", urldecode($input[0]));
foreach($argTmp as $tmp) foreach($argTmp as $tmp)
{ {
//logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__); logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
$argList[strchr($tmp, "=", true)] = substr(strchr($tmp, "="), 1); if(strpos($tmp, "=") === false)
//logger(DEBUG, $argList[0] . " ==========> " . $argList[1]); {
//print_r($array); logger(DEBUG, _("no ="));
//if (isset($array[1])) $argList[$array[0]] = $array[1]; $argList[trim($tmp)] = "";
}else
{
$argList[trim(strchr($tmp, "=", true))] = trim(substr(strchr($tmp, "="), 1));
}
} }
logger(DEBUG, print_r($argList, true)); logger(DEBUG, print_r($argList, true));
if (array_key_exists("browse", $argList))
{
logger(DEBUG, _("Browsing"));
webBrowse($spawn, $argList);
return true;
}elseif(array_key_exists("dashboard", $argList))
{
webDashboard($spawn, $argList["dashboard"]);
return true;
}
if(array_key_exists("cmd", $argList)) if(array_key_exists("cmd", $argList))
{ {
$command = strtolower($argList["cmd"]); $command = strtolower($argList["cmd"]);
@ -51,25 +197,29 @@ function askWebServer($read)
logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__); logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList)) if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList))
{ {
$response = "<html><header></header><body>GET: " . _("no parameters passed, need topic, fn and property") . "</body></html>"; $response = "GET: " . _("no parameters passed, need topic, fn and property");
}else }else
{ {
$device = getDevice($argList["topic"], $argList["fn"]); if (($device = getDevice($argList["topic"], $argList["fn"])) === false)
$property = $argList["property"]; {
$response = "<html><header></header><body>GET: " . bool2string($device->$property["value"]) . "</body></html>"; htmlSend($spawn, sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"]));
return false;
} }
fwrite($spawn, $response); $property = $argList["property"];
$response = "GET: " . bool2string($device->$property["value"]);
}
htmlSend($spawn, $response);
break; break;
case "set": case "set":
logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__); logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
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("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList))
{ {
$response = "<html><header></header><body>SET: " . _("no parameters passed, need topic, fn, property and value") . "passed</body></html>"; $response = "SET: " . _("no parameters passed, need topic, fn, property and value") . "passed";
fwrite($spawn, $response); htmlSend($spawn, $response);
}else }else
{ {
$response = "<html><header></header><body>setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"] . "</body></html>"; $response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"];
fwrite($spawn, $response); htmlSend($spawn, $response);
$payload = array($argList["property"] => $argList["value"]); $payload = array($argList["property"] => $argList["value"]);
publish(Z2M . "/" . $argList["fn"], $payload); publish(Z2M . "/" . $argList["fn"], $payload);
} }
@ -104,7 +254,7 @@ function askWebServer($read)
$error = error_get_last(); $error = error_get_last();
if($error !== null) if($error !== null)
{ {
$response = "<html><header></header><body>" . $error["message"] . " file: " . $error["file"] . " line: " . $error["line"] . "</body></html>"; $response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"];
} }
if ($command === "print") if ($command === "print")
{ {
@ -114,28 +264,32 @@ function askWebServer($read)
$response = "Dump" . EOL; $response = "Dump" . EOL;
$response .= var_export($var, true); $response .= var_export($var, true);
} }
fwrite($spawn, $response); htmlSend($spawn, $response);
break; break;
case "notify": case "notify":
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__); logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
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)) 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 = "<html><header></header><body>" . _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value") . "</body></html>"; $response = _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value");
fwrite($spawn, $response); htmlSend($spawn, $response);
}else }else
{ {
$response = "<html><header></header><body>" . _("notify command have been set") . "</body></html>"; $response = _("notify command have been set");
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]); $monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
fwrite($spawn, $response); htmlSend($spawn, $response);
} }
logger(DEBUG, print_r($monitored, true)); logger(DEBUG, print_r($monitored, true));
break; break;
default: default:
logger(DEBUG, _("unknown command"), __FILE__ . ":" . __LINE__); webBrowse($spawn, $argList);
$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
fwrite($spawn, $response);
} }
}else
{
webBrowse($spawn,$argList);
} }
}else
{
webDashboard($spawn);
} }
} }
} }