debugging api and add notify command
This commit is contained in:
parent
85db4e3ff4
commit
18d5b74a96
@ -23,7 +23,6 @@ class device
|
||||
{
|
||||
public $method; //0 = auto or 1 = manual
|
||||
public $topic;
|
||||
public $device;
|
||||
public $ieeeAddress;
|
||||
public $groupID;
|
||||
public $friendlyName;
|
||||
@ -78,37 +77,41 @@ class watch
|
||||
public $topic;
|
||||
public $property;
|
||||
public $PropertyValue;
|
||||
public $device;
|
||||
public $function;
|
||||
private $conditions = array(
|
||||
public $conditions = array(
|
||||
"<", ">", "==", ">=", "<="
|
||||
);
|
||||
public $acceptedValues = array(
|
||||
"ON", "OFF"
|
||||
);
|
||||
public $condition;
|
||||
|
||||
public function __construct($topic, $fn, $property, $condition, $value)
|
||||
{
|
||||
logger(DEBUG, _("New Notify object"), __FILE__ . ":" . __LINE__);
|
||||
if (($this->device = getDevice($topic, $fn)) === false)
|
||||
global $conditions, $acceptedValues, $indexDevices;
|
||||
logger(DEBUG, _("New Notification"), __FILE__ . ":" . __LINE__);
|
||||
if (($device = getDevice($topic, $fn)) !== false)
|
||||
{
|
||||
$this->topic = $topic;
|
||||
if (array_key_exist($property, $this->device))
|
||||
if (property_exists($device, $property))
|
||||
{
|
||||
$this->property = $property;
|
||||
if (!is_numeric($value))
|
||||
if (!is_numeric($value) and array_search($value, $this->acceptedValues) === false)
|
||||
{
|
||||
logger(ERROR, _("Value is not numeric"), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
if (array_search($condition, $conditions))
|
||||
if (array_search($condition, $this->conditions))
|
||||
{
|
||||
$this->function = '$value ' . $condition . " " . $value;
|
||||
logger(DEBUG, _("Test function is ") . $this->function);
|
||||
$this->condition = $condition;
|
||||
$this->function = '$value ' . $condition . " " . $value . ";";
|
||||
logger(DEBUG, _("Test function is ") . $this->function, __FILE__ . ":" . __LINE__ );
|
||||
}else
|
||||
{
|
||||
logger(ERROR, _("Condition is not one of the permitted"), __FILE__ . ":" . __LINE__ );
|
||||
logger(ERROR, sprintf(_("Condition %s is not one of the permitted : "), $condition) . print_r($conditions, true), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
$this->device[$ieeeAddress]->$property["functions"][] = array($this,"notifyCallback");
|
||||
$indexDevices[$device->ieeeAddress]->$property["functions"][] = array($this,"notifyCallback");
|
||||
}else
|
||||
{
|
||||
logger(ERROR, _("Property do not exists"), __FILE__ . ":" . __LINE__ );
|
||||
@ -119,6 +122,7 @@ class watch
|
||||
logger(ERROR, _("Device do not exists"), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
logger(DEBUG, var_export($this, true), __FILE__ . ":" . __LINE__ );
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -126,6 +130,7 @@ class watch
|
||||
{
|
||||
if (eval($this->function))
|
||||
{
|
||||
logger(DEBUG, _("notifyCallback"));
|
||||
$msg = sprintf(_("Device '%s' have property '%s' value %s %s %s"), $device->friendlyName, $property, $value, $this->condition, $this->PropertyValue );
|
||||
notify($msg);
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ function mkDevicesDB($topic, $json, $group=false)
|
||||
}
|
||||
$dbInit += 1;
|
||||
fwrite($logFh, "################################START##################################################");
|
||||
fwrite($logFh, print_r($devices, true));
|
||||
fwrite($logFh, var_export($devices, true));
|
||||
fwrite($logFh, "################################END##################################################");
|
||||
|
||||
logger(DEBUG, _("Devices DB made"), __FILE__ . ":" . __LINE__);
|
||||
@ -122,6 +122,8 @@ function changeDevice($topic, $fn, &$device, $payloadArray)
|
||||
//print_r($payloadArray);
|
||||
if (!empty($payloadArray))
|
||||
{
|
||||
//echo "==================== New ChangeDevice =====================" .EOL;
|
||||
|
||||
iterateDevice($topic, $fn, $device, $device, $payloadArray);
|
||||
}else
|
||||
{
|
||||
@ -134,8 +136,8 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro
|
||||
{
|
||||
global $changed, $mohaDB, $testMode;
|
||||
$deviceType = (gettype($device) == "object"); // = true if object
|
||||
//echo "==================== New iterate =====================" .EOL;
|
||||
//echo "devicetype = "; var_dump($deviceType); echo EOL;
|
||||
//print_r($payloadArray);
|
||||
//echo "device =>";print_r($device);echo EOL;
|
||||
//echo "PropertyTree ==============> " . $propertyTree . EOL;
|
||||
foreach($payloadArray as $key => $value)
|
||||
@ -145,17 +147,22 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro
|
||||
//echo "value =>"; print_r($value); echo EOL;
|
||||
//echo "type : " . gettype($value) .EOL;
|
||||
$valueType = gettype($value);
|
||||
if ( $valueType == "object")
|
||||
if ($valueType == "object")
|
||||
{
|
||||
$propertyTree .= $key . "/";
|
||||
//echo "PropertyTree " . $propertyTree . EOL;
|
||||
//echo " is Object" . EOL;
|
||||
if ($deviceType === true )
|
||||
{
|
||||
//echo "deviceType = true" . EOL;
|
||||
if (!property_exists($device, $key))
|
||||
{
|
||||
//echo "Property do not exists" . EOL;
|
||||
$device->{$key} = new stdClass;
|
||||
}
|
||||
//echo "iterating" . EOL;
|
||||
//echo "===============>";
|
||||
|
||||
iterateDevice($topic, $fn, $parentDevice, $device->$key, $value, $propertyTree);
|
||||
}else
|
||||
{
|
||||
@ -183,6 +190,7 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro
|
||||
|
||||
}else
|
||||
{
|
||||
//var_dump($device);echo EOL;
|
||||
//if (empty($device->$key) or $value != null)
|
||||
//{
|
||||
if (property_exists($device, $key))
|
||||
|
@ -36,7 +36,7 @@ function checkEvents()
|
||||
if ($exception === false)
|
||||
{
|
||||
logger(DEBUG, sprintf(_("sending command set %s => %s for %s"), $event->param ,bool2string($event->value), $event->device->friendlyName), __FILE__ . ":" . __LINE__);
|
||||
publish(mktopic($event->device), array($event->param => $event->value), "set", $key);
|
||||
publish(mktopic($event->device), array($event->param => $event->value), "set");
|
||||
if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false)
|
||||
{
|
||||
logger(ERROR, _("Error in adding interval to event recurrence. event: ") . $key, __FILE__ . ":" . __LINE__);
|
||||
@ -194,7 +194,7 @@ function deleteEvent($eventKey)
|
||||
}else
|
||||
{
|
||||
//try to delete an flase event
|
||||
logger(WARNING, _("Try to delete event with key = ") . var_dump($eventKey), __FILE__ . ":" . __LINE__);
|
||||
logger(WARNING, _("Try to delete event with key = ") . var_export($eventKey, true), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,10 +9,10 @@ class rdc_chambre_eclairage extends hook
|
||||
public $luminance_min = 60;
|
||||
public $luminance_max = 3000;
|
||||
protected $devicelist = array(
|
||||
"RDC_CHAMBRE_AMBIANCE" => array("state", false), // "ON"/"OFF"
|
||||
"RDC_CHAMBRE_ECLAIRAGE" => array("state_l1", false), // "ON"/"OFF"
|
||||
"RDC_CHAMBRE_MVMT" => array("occupancy", false),
|
||||
"RDC_CHAMBRE_ARMOIRE_GAUCHE" => array("contact", false)
|
||||
RDC_CHAMBRE_AMBIANCE => array("state", false), // "ON"/"OFF"
|
||||
RDC_CHAMBRE_ECLAIRAGE => array("state_l1", false), // "ON"/"OFF"
|
||||
RDC_CHAMBRE_MVMT => array("occupancy", false),
|
||||
RDC_CHAMBRE_ARMOIRE_GAUCHE => array("contact", false)
|
||||
);
|
||||
|
||||
// callback fonction. Is called with these 3 parameters
|
||||
@ -26,7 +26,7 @@ class rdc_chambre_eclairage extends hook
|
||||
if ($property == "occupancy" and $value == "ON")
|
||||
{
|
||||
$this->send(RDC_CHAMBRE_AMBIANCE, "ON", "OFF", AUTO);
|
||||
}elseif ($property == "contact" and $value = true and getValue(RDC_CHAMBRE_ECLAIRAGE) == "OFF")
|
||||
}elseif ($property == "contact" and $value = true and getValue(RDC_CHAMBRE_ECLAIRAGE, "state_l1") == "OFF")
|
||||
{
|
||||
$this->send(RDC_CHAMBRE_ECLAIRAGE, "ON", "OFF", AUTO);
|
||||
}
|
||||
|
32
moha.php
32
moha.php
@ -29,18 +29,27 @@ $dbInit = 0; // flag to indicate that devices db is initializedl
|
||||
$connected = false; // connected to MQTT server
|
||||
$included = false; // flag indicate scripts are loaded
|
||||
$nSubscribed = 0; // Number of topics subsribed
|
||||
$logFile = "/var/log/moha.log"; // Path of log file
|
||||
$logFh = null; // filehandle of log file
|
||||
$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;
|
||||
$mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode
|
||||
if ($testMode)
|
||||
{
|
||||
$mqttServerIp = "192.168.1.253"; // IP address of mqttserver in test mode
|
||||
$dataPath = ".";
|
||||
$logFile = "./moha.log"; // Path of log file
|
||||
$configDir = "./config"; // default config dir (production value is /etc/moha/)
|
||||
}else
|
||||
{
|
||||
$mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode
|
||||
$dataPath = "/usr/share/moha/";
|
||||
$logFile = "/var/log/moha.log"; // Path of log file
|
||||
$configDir = "/etc/config"; // default config dir (production value is /etc/moha/)
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (!init()) exit(1);
|
||||
|
||||
// gettext
|
||||
@ -79,7 +88,11 @@ function logger($level, $log, $pos = false, $notif = true)
|
||||
{
|
||||
logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
}else
|
||||
{
|
||||
logger(INFO, _("Notification not sent because of testMode"), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function init()
|
||||
@ -117,12 +130,12 @@ function listHooks($dir, &$hookList)
|
||||
|
||||
function endMoha()
|
||||
{
|
||||
global $testMode, $devices, $topics, $nSubscribed ,$client, $logFh, $connected;
|
||||
global $testMode, $devices, $topics, $nSubscribed ,$client, $logFh, $connected, $dataPath;
|
||||
$x = 0;
|
||||
|
||||
logger(WARNING, _("moha is ending"), __FILE__ . ":" . __LINE__);
|
||||
storeDB($devices, "/usr/share/moha/moha.db");
|
||||
if($testMode) file_put_contents("moha.devices", print_r($devices, true));
|
||||
storeDB($devices, $dataPath . "moha.db");
|
||||
if($testMode) file_put_contents($dataPath . "moha.devices", var_export($devices, true));
|
||||
if ($connected)
|
||||
{
|
||||
$mid = $client->unsubscribe("#");
|
||||
@ -152,7 +165,7 @@ require "class/main.php";
|
||||
require "class/db.php";
|
||||
require "class/hook_class.php";
|
||||
require "utils.php";
|
||||
require $configDir . "/properties2log.php";
|
||||
require "config/properties2log.php";
|
||||
require "mqtt_functions.php";
|
||||
require "events.php";
|
||||
require "db_functions.php";
|
||||
@ -183,6 +196,11 @@ 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);
|
||||
@ -242,7 +260,7 @@ while (true)
|
||||
logger(INFO, _("Including ") . $hook, __FILE__ . ":" . __LINE__, false);
|
||||
include $hook;
|
||||
}
|
||||
file_put_contents("/usr/share/moha/moha.devices", print_r($devices, true)); // debugging : save device list
|
||||
file_put_contents($dataPath . "moha.devices", var_export($devices, true)); // debugging : save device list
|
||||
$included = true;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@ function messageReceived($message)
|
||||
global $topics, $logFh, $devices, $included;
|
||||
$topic = explode ("/", $message->topic);
|
||||
$callback = $topics[$topic[0]]->callback;
|
||||
logger(DEBUG, "topic => " . print_r($topic, true), __FILE__ . ":" . __LINE__);
|
||||
//logger(DEBUG, "topic => " . var_export($topic, true), __FILE__ . ":" . __LINE__);
|
||||
$callback($topic, $message);
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ $callback = function($topic, $message)
|
||||
case "devices":
|
||||
logger(DEBUG,_("Inserting zigbee devices in DB"), __FILE__ . ":" . __LINE__);
|
||||
$topics[$topic[0]]->devices = json_decode($message->payload);
|
||||
fwrite($logFh, print_r($topics[$topic[0]]->devices, true));
|
||||
fwrite($logFh, var_export($topics[$topic[0]]->devices, true));
|
||||
mkDevicesDB($topic[0], $topics[$topic[0]]->devices);
|
||||
break;
|
||||
case "groups":
|
||||
|
@ -55,13 +55,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__ );
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return $var;
|
||||
logger(DEBUG, sprintf(_("returning a value")), __FILE__ . ":" . __LINE__ );
|
||||
return $var["device"];
|
||||
}else
|
||||
{
|
||||
logger(ERROR, sprintf(_("Topic %s do not exists"), $topic), __FILE__ . ":" . __LINE__ );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -34,28 +34,46 @@ function askWebServer($read)
|
||||
$argTmp = explode("&", $input[0]);
|
||||
foreach($argTmp as $tmp)
|
||||
{
|
||||
logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
|
||||
$array = explode("=", $tmp);
|
||||
//logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
|
||||
$argList[strchr($tmp, "=", true)] = substr(strchr($tmp, "="), 1);
|
||||
//logger(DEBUG, $argList[0] . " ==========> " . $argList[1]);
|
||||
//print_r($array);
|
||||
if (isset($array[1])) $argList[$array[0]] = $array[1];
|
||||
//if (isset($array[1])) $argList[$array[0]] = $array[1];
|
||||
}
|
||||
logger(DEBUG, print_r($argList, true));
|
||||
if(array_key_exists("cmd", $argList))
|
||||
{
|
||||
$command = strtolower($argList["cmd"]);
|
||||
logger(DEBUG, _("command is ") . $command);
|
||||
switch($command)
|
||||
{
|
||||
case "get":
|
||||
logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
|
||||
if(empty($argList["device"]))
|
||||
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList))
|
||||
{
|
||||
$response = "<html><header><body>get passed</body></header><html>";
|
||||
$response = "<html><header></header><body>GET: " . _("no parameters passed, need topic, fn and property") . "</body></html>";
|
||||
}else
|
||||
{
|
||||
$device = getDevice($argList["topic"], $argList["fn"]);
|
||||
$property = $argList["property"];
|
||||
$response = "<html><header></header><body>GET: " . bool2string($device->$property["value"]) . "</body></html>";
|
||||
}
|
||||
fwrite($spawn, $response);
|
||||
break;
|
||||
case "set":
|
||||
logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
|
||||
$response = "<html><header><body>set passed</body></header><html>";
|
||||
fwrite($spawn, $response);
|
||||
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>";
|
||||
fwrite($spawn, $response);
|
||||
}else
|
||||
{
|
||||
$response = "<html><header></header><body>setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"] . "</body></html>";
|
||||
fwrite($spawn, $response);
|
||||
$payload = array($argList["property"] => $argList["value"]);
|
||||
publish(Z2M . "/" . $argList["fn"], $payload);
|
||||
}
|
||||
|
||||
break;
|
||||
case "dump":
|
||||
case "print":
|
||||
@ -86,7 +104,7 @@ function askWebServer($read)
|
||||
$error = error_get_last();
|
||||
if($error !== null)
|
||||
{
|
||||
$response = "<html><header><body>" . $error["message"] . " file: " . $error["file"] . " line: " . $error["line"] . "</body></header><html>";
|
||||
$response = "<html><header></header><body>" . $error["message"] . " file: " . $error["file"] . " line: " . $error["line"] . "</body></html>";
|
||||
}
|
||||
if ($command === "print")
|
||||
{
|
||||
@ -99,17 +117,23 @@ function askWebServer($read)
|
||||
fwrite($spawn, $response);
|
||||
break;
|
||||
case "notify":
|
||||
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))
|
||||
{
|
||||
fwrite($spawn, _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value"));
|
||||
$response = "<html><header></header><body>" . _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value") . "</body></html>";
|
||||
fwrite($spawn, $response);
|
||||
}else
|
||||
{
|
||||
$response = "<html><header></header><body>" . _("notify command have been set") . "</body></html>";
|
||||
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
|
||||
fwrite($spawn, $response);
|
||||
}
|
||||
logger(DEBUG, print_r($monitored, true));
|
||||
break;
|
||||
default:
|
||||
logger(DEBUG, _("unknown command"), __FILE__ . ":" . __LINE__);
|
||||
fwrite($spawn, _("unknown command"));
|
||||
$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
|
||||
fwrite($spawn, $response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user