diff --git a/class/db.php b/class/db.php index 84a4600..d41bb0a 100644 --- a/class/db.php +++ b/class/db.php @@ -3,7 +3,7 @@ logger(DEBUG,"Including db.php"); class db extends mysqli { - public $mysqlServer = "localhost"; // "127.0.0.1"; + public $mysqlServer = "127.0.0.1"; // Your production server public $username = "moha"; public $passwd = "MysqlMoha"; public $database = "moha"; @@ -11,10 +11,21 @@ class db extends mysqli function __construct() { - if ($this->connect($this->mysqlServer, $this->username, $this->passwd, $this->database) === false) + global $testMode; + $flagError = false; + if ($testMode) { - logger(ERROR,"Connection to sql server error :" . $this->connect_error); - return 2; + $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); + sleep(5); + $flagError = true; + } + if ($flagError === true) + { + logger(ERROR, _("Connection to sql server ready")); } $result = new mysqli_result($this); } @@ -38,14 +49,19 @@ class db extends mysqli if (is_numeric($value) and !empty($properties2log[$propertyTree])) { // calculate a min/max value for storing data + $var = $properties2log[$propertyTree]; - if (!is_numeric($var)) + if (is_callable($var)) { - $minMax = (float)$value * (float)$var / 100; - }else - { - $minMax = $var; + $var = $var($value); } + //if (!is_numeric($var)) + //{ + $minMax = (float)$value + $var; + //}else + //{ + // $minMax = $var; + //} echo "minMax = " .$minMax . EOL; //echo "oldValue = " . $oldValue . EOL; //echo "Value = " . $value . EOL; diff --git a/class/hook_class.php b/class/hook_class.php index f67a3a8..bf2603f 100644 --- a/class/hook_class.php +++ b/class/hook_class.php @@ -11,6 +11,10 @@ class hook { logger(DEBUG, _("Initializing hook: ") . $this->hookName); $this->installHooks(); + if (method_exists($this, "init")) + { + $this->init(); + } } function installHooks() diff --git a/class/main.php b/class/main.php index b69a31a..9894cd0 100644 --- a/class/main.php +++ b/class/main.php @@ -32,11 +32,11 @@ class device public $functions; public $payload; public $availability; + public $toConfirm; private function __construct() { $this->availability = array("value" => null, "functions" => array()); - var_dump($this->availability); } public function set($method=0) //, $event = null) diff --git a/config/devices_constants.php b/config/devices_constants.php index 8dd4ca9..53a87bb 100644 --- a/config/devices_constants.php +++ b/config/devices_constants.php @@ -19,7 +19,10 @@ $deviceTable = array( "0x00124b001f90ee7e" => "ENTREE_PORTE", "0x00124b002226d9a2" => "GARAGE_PORTE", "0x00124b001f90e725" => "RDC_CHAMBRE_BAIE", - "0x00124b002226e384" => "RDC_SALON_BAIE" + "0x00124b002226e384" => "RDC_SALON_BAIE", + "0x842e14fffe8c53a5" => "ETAGE_CUISINE_PLAN_TRAVAIL_INTER", + "0x680ae2fffe403f22" => "ETAGE_CUISINE_PLAN_TRAVAIL_ECLAIRAGE", + "0xbc33acfffe65621b" => "ETAGE_CUISINE_PLAN_TRAVAIL_SPOT" ); foreach($deviceTable as $device => $name) diff --git a/config/properties2log.php b/config/properties2log.php index 412204a..7bd8852 100644 --- a/config/properties2log.php +++ b/config/properties2log.php @@ -19,9 +19,9 @@ $properties2log = array( "pressure" => 10, "occupancy" => null, "tamper" => null, - "illuminance_lux" => '10%', + "illuminance_lux" => function($value) {($value < 500?50:$value*10/100); return $value;}, // "illuminance" => 8, - "requested_brightness_level" => '10%', + "requested_brightness_level" => function($value) {($value < 500?50:$value*10/100);return $value;}, "tempf" => 0.5, "humidity" => null, "dewptf" => 0.5, diff --git a/db_functions.php b/db_functions.php index e1bdc0c..e030e09 100644 --- a/db_functions.php +++ b/db_functions.php @@ -199,7 +199,7 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro $device->{$key} = array("value" => null); $device->$key["functions"] = array(); } - echo $key . 'oldvalue = ' . $oldValue . " value = " . $value . EOL; + echo $key . ' ===> oldvalue = ' . $oldValue . " value = " . $value . EOL; if ($oldValue !== $value) { $device->$key["value"] = $value; @@ -207,14 +207,14 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro //$changed[$fn]["value"] = $value; logger(INFO, sprintf(_("Device %s property %s, %s"), $fn, $propertyTree . $key, bool2string($value))); $mohaDB->logProperty($parentDevice, $propertyTree . $key, $value, $oldValue); -print_r($device->$key); - if (!empty($device->$key["functions"])) + + } + if (!empty($device->$key["functions"])) + { + logger(DEBUG,_("executing notifications functions")); + foreach($device->$key["functions"] as $function) { - logger(DEBUG,_("executing notifications functions")); - foreach($device->$key["functions"] as $function) - { - $function($device, $key, $value); - } + $function($device, $key, $value); } } //} diff --git a/events.php b/events.php index cedc65c..0bd6df4 100644 --- a/events.php +++ b/events.php @@ -6,7 +6,9 @@ logger(DEBUG,"Including events.php"); function checkEvents() { - global $events, $indexDevices, $devices; + global $logLevel, $events, $indexDevices, $devices; + $oldLevel = $logLevel; + $loglevel = DEBUG; $exception = false; foreach ($events as $key => $event) { @@ -51,6 +53,7 @@ function checkEvents() } } //print_r($events); + $logLevel = $oldLevel; } function setOneshotEvent(&$device, $datetime, $property, $value, $replace=false) @@ -99,9 +102,11 @@ function setRecurrentEvent(&$device, $property, $value, $startDatetime, $stopDat function setDelay(&$device, $delay, $unit="second", $property, $value, $replace=false) { - global $events; + global $events, $logLevel; + $oldLevel = $logLevel; + $loglevel = DEBUG; $datetime = new dateTime(); - //print_r($datetime); + strtolower($unit); switch($unit) { case "second": @@ -150,6 +155,8 @@ function setDelay(&$device, $delay, $unit="second", $property, $value, $replace= $events[$key]->value = $value; $events[$key]->device = & $device; logger (DEBUG, _('Setting new delay in $events[]')); + print_r($events[$key]); + $loglevel = $oldLevel; } function searchEvent($device, $property , $value) diff --git a/hooks/notifiers/notificationfreemobile.php b/hooks/notifiers/notificationfreemobile.php index c44b272..1a17fa9 100644 --- a/hooks/notifiers/notificationfreemobile.php +++ b/hooks/notifiers/notificationfreemobile.php @@ -8,7 +8,7 @@ class notificationFreemobile function __construct() { - $this->level = WARNING | ERROR; + $this->level = ALERT | ERROR; } function send($message) diff --git a/hooks/scripts/etage_plan_travail_eclairage b/hooks/scripts/etage_plan_travail_eclairage new file mode 100644 index 0000000..65c4a10 --- /dev/null +++ b/hooks/scripts/etage_plan_travail_eclairage @@ -0,0 +1,58 @@ + enabled) + public $delay = 3; // amount of time in $timeunit + public $timeUnit = "hour"; // unit of time for delay, second, minute, hour, day, week, month, year + protected $devicelist = array("ETAGE_CUISINE_PLAN_TRAVAIL_ECLAIRAGE" => array("action", false)); + + // if you need some initialisation when creating the object, uncomment andput your code here. + // If existing, This function is called by __construct + /*protected function init() + { + // Your code here + } + */ + + // callback fonction. Is called with these 3 parameters + // $device -> calling device + // $property -> property of the device (given by mqtt) + // $value -> value of the property + public function callBack(&$device, $property, $value) + { + // here your code + if($value == "ON") // ON + { + $this->send("ON", "OFF"); + }elseif($value == "OFF") + { + $this->send("OFF", null, AUTO); + } + logger (INFO,sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, $value)); + } + + private function send($state, $delayState = false, $method = MANUAL) + { + global $devices, $indexDevices; + $device = & $indexDevices[ETAGE_CUISINE_PLAN_TRAVAIL_SPOT]; + $msg = array("state_l1" => $state); + if ($device->state_l1["value"] != $state) + { + logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $device->friendlyName)); + $device->payload = $msg; + $device->set(); + $device->method = $method; + }else + { + logger(INFO, sprintf(_("not publishing message: %s to %s, already set"), json_encode($msg), $device->friendlyName)); + + } + //echo 'delaystate = ' . var_dump($delayState); + if ($delayState !== false) setDelay($device, $this->delay, $this->timeUnit, "state", $delayState, true); + } +} + +$hooks["etage_plan_travail_eclairage"] = new etage_plan_travail_eclairage(); +?> diff --git a/hooks/scripts/rdc_chambre_eclairage.php b/hooks/scripts/rdc_chambre_eclairage.php new file mode 100644 index 0000000..acc4cbf --- /dev/null +++ b/hooks/scripts/rdc_chambre_eclairage.php @@ -0,0 +1,31 @@ + enabled) + + protected $devicelist = array(); + + // if you need some initialisation when creating the object, uncomment andput your code here. + // If existing, This function is called by __construct + /*protected function init() + { + // Your code here + } + */ + + // callback fonction. Is called with these 3 parameters + // $device -> calling device + // $property -> property of the device (given by mqtt) + // $value -> value of the property + public function callBack(&$device, $property, $value) + { + // here your code + + logger (INFO,sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, $value)); + } +} + +$hooks["rdc_chambre_eclairage"] = new rdc_chambre_eclairage(); +?> diff --git a/hooks/scripts/rdc_salon_eclairage.php b/hooks/scripts/rdc_salon_eclairage.php index 409bb47..43be3fb 100644 --- a/hooks/scripts/rdc_salon_eclairage.php +++ b/hooks/scripts/rdc_salon_eclairage.php @@ -12,7 +12,7 @@ class rdc_salon_eclairage extends hook ); public $delay = 5; // amount of time in $timeunit - public $timeUnit = "minute"; // unit of time for delay, second, minute, day, week, month, year + public $timeUnit = "minute"; // unit of time for delay, second, minute, hour, day, week, month, year public $luminance_min = 60; public $luminance_max = 3000; diff --git a/hooks/scripts/rdc_sdb_eclairage.php b/hooks/scripts/rdc_sdb_eclairage.php index 177953d..1615aa1 100644 --- a/hooks/scripts/rdc_sdb_eclairage.php +++ b/hooks/scripts/rdc_sdb_eclairage.php @@ -3,6 +3,7 @@ class rdc_sdb_eclairage extends hook { public $hookName = "rdc_sdb_eclairage"; + public $active = true; /* already defined in hook class */ // public $active = true; @@ -26,7 +27,7 @@ class rdc_sdb_eclairage extends hook public function callBack(&$device, $property, $value) { global $devices, $indexDevices; - var_dump($value); + //var_dump($value); switch($property) { case "occupancy": @@ -56,9 +57,10 @@ class rdc_sdb_eclairage extends hook global $devices, $indexDevices; $msg = array("state_l1" => $state); $device = & $indexDevices[RDC_SDB_WC_ECLAIRAGE]; - logger(INFO, sprintf(_("publishing message: %s to %s"), $msg, $device->friendlyName)); + logger(INFO, sprintf(_("publishing message: %s to %s"), $state, $device->friendlyName)); $device->payload = $msg; $device->set(null); + } } $hooks["rdc_sdb_eclairage"] = new rdc_sdb_eclairage(); diff --git a/hooks/scripts/rdc_wc_eclairage.php b/hooks/scripts/rdc_wc_eclairage.php index 2ca5b62..6ca396c 100644 --- a/hooks/scripts/rdc_wc_eclairage.php +++ b/hooks/scripts/rdc_wc_eclairage.php @@ -14,7 +14,7 @@ class rdc_wc_eclairage extends hook public function callBack(&$device, $property, $value) { global $devices, $indexDevices; - var_dump($value); + //var_dump($value); switch($property) { case "state_l2": diff --git a/moha.php b/moha.php index 87bccfe..a319972 100644 --- a/moha.php +++ b/moha.php @@ -2,6 +2,8 @@ $title = "moha"; $testMode = true; +$webServerIsActive = true; + cli_set_process_title($title); file_put_contents("/proc/".getmypid()."/comm",$title); @@ -14,7 +16,7 @@ $listPropertiesKeys = array("property"); //global variables $logLevel = INFO | NOTICE | WARNING | ERROR | ALERT; //ALL; -$notificationLevel = WARNING | ERROR; +$notificationLevel = ALERT | ERROR; $topics = array(); // list of topics $mids = array(); // list of message IDs $devices = array(); // array of device objetcs @@ -32,8 +34,12 @@ $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 - +$hooksInitialized = 0; // are all hooks initialized ? false/true +$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 +} if (!init()) exit(1); @@ -47,7 +53,7 @@ function notify($message) $result = false; foreach($notificationMethods as $value) { - //$result = $result | $value->send($message); + $result = $result | $value->send($message); } return $result; } @@ -55,8 +61,6 @@ function notify($message) function logger($level, $log, $notif = true) { global $logFh, $logLevel, $notificationLevel, $logLevels; - //echo "=====>>>> $level => $logLevel => $notificationLevel" . EOL ; - //echo $log .EOL; $logString = date("c") . ' ' . $logLevels[$level] . " : $log"; if ($level & $logLevel) { @@ -64,7 +68,6 @@ function logger($level, $log, $notif = true) print ($logString . EOL); } $test = $level & $notificationLevel; - //echo "notif =>" .$notif . EOL; if (($test != 0) and ($notif === true)) { if(notify("Moha\n" . $logString) === false) @@ -74,125 +77,6 @@ function logger($level, $log, $notif = true) } } - - -logger(DEBUG, _("requiring php modules"), false); -require "class/main.php"; -require "class/db.php"; -require "class/hook_class.php"; -require "utils.php"; -require $configDir . "/properties2log.php"; -require "mqtt_functions.php"; -require "events.php"; -require "db_functions.php"; - -logger(DEBUG, _('assigning variable $client to mosquitto class "client"'), false); -$client = new Mosquitto\Client(); - -logger(DEBUG, _("Loading stored devices datas")); -loadDB($devices, "moha.db"); - - -// topics definition -listHooks("./topics_callbacks", $hooksList); -if (!empty($hooksList)) -{ - foreach ($hooksList as $callback) - { - logger(INFO, _("Including ") . $callback, false); - include $callback; - } -} - -logger(DEBUG, _("requiring config files -> devices_constants.php"), false); -//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), false); -}else -{ - logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), false); -} - -// making the list of hooks to include -listHooks("./hooks", $hooksList); - -// Program start -logger(DEBUG, _("Program start"), false); -$client = new Mosquitto\Client(); - -// defining callback functions -$client->onConnect('connectResponse'); -$client->onDisconnect('disconnectResponse'); -$client->onSubscribe('subscribeResponse'); -$client->onUnsubscribe('unsubscribeResponse'); -$client->onMessage('messageReceived'); -$client->onLog('logger'); -$client->onPublish('publishResponse'); - -// connectong to mqtt server -$client->connect("192.168.1.253", 1883, 5); - -logger(INFO, _("Subscribing to bridge"), false); -foreach($topics as $name => $topic) -{ - $topic->mid = $client->subscribe($name . "/#", 2); - $mids[$topic->mid] = $name; - $topic->status = false; -} - -// starting main loop -logger(INFO, _("Starting loop"), false); -$oneshot = false; -while (true) -{ - $client->loop(); // mqtt server loop() - if (! $included) // hooks not already included - { - logger(DEBUG, _("Making hooks list"), false); - getDevicesValues(); // TODO get the values of devices - if (!empty($hooksList)) // some hooks to include if hooklist is not empty - { - foreach ($hooksList as $hook) // loop to include hooks in hookslist - { - logger(INFO, _("Including ") . $hook, false); - include $hook; - } - file_put_contents("moha.devices", print_r($devices, true)); // debugging : save device list - $included = true; - } - - }else - { - if ($oneshot === false) // execute once initialization finished :WARNING hooks can to be not initialized - { - logger(DEBUG, _("Oneshot part of loop"), false); - $oneshot = true; - } - checkEvents(); - if($hooksInitialized == 0) // all hooks are not initialized - { - $i = 1; - foreach($hooks as $hookName => $hook) - { - if ($hook->initialized === false) - { - logger(WARNING, _("Hook not completely initialized :") . $hookName); - $i &= $hook->installHooks(); - } - } - $hooksInitialized = $i; - }else - { - logger(DEBUG,_("All hooks initialized")); - } - } -} - -endMoha(); - function init() { global $logFile, $logFh, $client; @@ -230,8 +114,8 @@ function endMoha() { global $devices, $topics, $nSubscribed ,$client, $logFh, $connected; $x = 0; - storeDB($devices, "moha.db"); - file_put_contents("moha.devices", print_r($devices, true)); + storeDB($devices, "/usr/share/moha/moha.db"); + if($testMode) file_put_contents("moha.devices", print_r($devices, true)); if ($connected) { $mid = $client->unsubscribe("#"); @@ -250,6 +134,138 @@ function endMoha() exit(0); } +function connect2mqttServer() +{ + global $client; + $client->onConnect('connectResponse'); +} +logger(DEBUG, _("requiring php modules"), false); +require "class/main.php"; +require "class/db.php"; +require "class/hook_class.php"; +require "utils.php"; +require $configDir . "/properties2log.php"; +require "mqtt_functions.php"; +require "events.php"; +require "db_functions.php"; + +//logger(DEBUG, _('assigning variable $client to mosquitto class "client"'), false); +//$client = new Mosquitto\Client(); + +logger(DEBUG, _("Loading stored devices datas")); +loadDB($devices, "moha.db"); + + +// topics definition +listHooks("./topics_callbacks", $hooksList); +if (!empty($hooksList)) +{ + foreach ($hooksList as $callback) + { + logger(INFO, _("Including ") . $callback, false); + include $callback; + } +} + +logger(DEBUG, _("requiring config files -> devices_constants.php"), false); +//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), false); +}else +{ + logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), false); +} + +// making the list of hooks to include +listHooks("./hooks", $hooksList); + +// Program start +logger(DEBUG, _("Program start"), false); +$client = new Mosquitto\Client(); + +// defining callback functions + +try +{ + connect2mqttServer(); +}catch ( Mosquitto\Exception $err) +{ + logger(ALERT, sprintf(_("Error connecting to mosquitto server, retrying in 10 seconds:"), $err), false); + sleep (10); + exit(1); +} + +$client->onDisconnect('disconnectResponse'); +$client->onSubscribe('subscribeResponse'); +$client->onUnsubscribe('unsubscribeResponse'); +$client->onMessage('messageReceived'); +$client->onLog('logger'); +$client->onPublish('publishResponse'); + +// connectong to mqtt server +$client->connect($mqttServerIp, 1883, 5); + +logger(INFO, _("Subscribing to bridge"), false); +foreach($topics as $name => $topic) +{ + $topic->mid = $client->subscribe($name . "/#", 2); + $mids[$topic->mid] = $name; + $topic->status = false; +} + +// starting main loop +logger(INFO, _("Starting loop"), false); +$oneshot = false; +while (true) +{ + $client->loop(); // mqtt server loop() + if (! $included) // hooks not already included + { + logger(DEBUG, _("Making hooks list"), false); + getDevicesValues(); // TODO get the values of devices + if (!empty($hooksList)) // some hooks to include if hooklist is not empty + { + foreach ($hooksList as $hook) // loop to include hooks in hookslist + { + logger(INFO, _("Including ") . $hook, false); + include $hook; + } + file_put_contents("/usr/share/moha/moha.devices", print_r($devices, true)); // debugging : save device list + $included = true; + } + + }else + { + + if ($oneshot === false) // execute once initialization finished :WARNING hooks can to be not initialized + { + logger(DEBUG, _("Oneshot part of loop"), false); + $oneshot = true; + } + if($hooksInitialized == 0) // all hooks are not initialized + { + $i = 1; + foreach($hooks as $hookName => $hook) + { + if ($hook->initialized === false) + { + logger(WARNING, _("Hook not completely initialized :") . $hookName); + $i &= $hook->installHooks(); + } + } + $hooksInitialized = $i; + }else + { + logger(DEBUG,_("All hooks initialized")); + } + checkEvents(); + } +} + +endMoha(); ?>