adding command test in apiserver\nsome debugging\nfree sms now running fine
This commit is contained in:
		| @@ -143,6 +143,10 @@ function apiServer($read) | |||||||
| 							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__); | 							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__); | ||||||
| 							htmlSend($spawn, deleteDevice($argList)); | 							htmlSend($spawn, deleteDevice($argList)); | ||||||
| 							break; | 							break; | ||||||
|  | 						case "test": | ||||||
|  | 							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__); | ||||||
|  | 							htmlSend($spawn, test($argList)); | ||||||
|  | 							break; | ||||||
| 						default: | 						default: | ||||||
| 							if (is_numeric(array_key_first($argList))) | 							if (is_numeric(array_key_first($argList))) | ||||||
| 							{ | 							{ | ||||||
|   | |||||||
| @@ -559,4 +559,13 @@ function apiDisplayByType($argList) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| */ | */ | ||||||
|  |  | ||||||
|  | function test() | ||||||
|  | { | ||||||
|  | 	global $hooks; | ||||||
|  | 	logger(DEBUG, _("Testing doors") , __FILE__ . ":" . __LINE__); | ||||||
|  | 	echo "testing doors"; | ||||||
|  | 	return $hooks["alerte_intrusion"]->testPortes(); | ||||||
|  | } | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -18,6 +18,9 @@ class topic { | |||||||
| 	public $config; | 	public $config; | ||||||
| 	public $callback; | 	public $callback; | ||||||
| 	public $getOnStart = false; | 	public $getOnStart = false; | ||||||
|  | 	public $lastSeen; | ||||||
|  | 	public $timeOut = 5; | ||||||
|  | 	public $notificationSent = false; | ||||||
| } | } | ||||||
|  |  | ||||||
| class device | class device | ||||||
| @@ -33,6 +36,7 @@ class device | |||||||
| 	public $toConfirm; | 	public $toConfirm; | ||||||
| 	public $triggerDevice; | 	public $triggerDevice; | ||||||
| 	public $properties = array(); | 	public $properties = array(); | ||||||
|  | 	public $lastSeen; | ||||||
|  |  | ||||||
| 	public function __construct() | 	public function __construct() | ||||||
| 	{ | 	{ | ||||||
| @@ -72,6 +76,7 @@ class event | |||||||
| 	public $recurrenceInterval;		// interval : for recurrent event   | 	public $recurrenceInterval;		// interval : for recurrent event   | ||||||
| 	public $exceptionInterval;		// array of object ranges | 	public $exceptionInterval;		// array of object ranges | ||||||
| 	public $method;					// cf: constants.php (IDLE, AUTO, MANUAL) | 	public $method;					// cf: constants.php (IDLE, AUTO, MANUAL) | ||||||
|  | 	public $isInterval; 			// 0 => recurence by date  1 => by interval | ||||||
| } | } | ||||||
|  |  | ||||||
| class watch | class watch | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								events.php
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								events.php
									
									
									
									
									
								
							| @@ -7,13 +7,15 @@ logger(DEBUG, _("Including events.php"), __FILE__ . ":" . __LINE__); | |||||||
| function checkEvents() | function checkEvents() | ||||||
| { | { | ||||||
| 	global $logLevel, $events; | 	global $logLevel, $events; | ||||||
|  | 	logger(DEBUG, _("Checking events"), __FILE__ . ":" . __LINE__); | ||||||
|  |  | ||||||
| 	$oldLevel = $logLevel; | 	$oldLevel = $logLevel; | ||||||
| 	//$logLevel = DEBUG; | 	//$logLevel = DEBUG; | ||||||
| 	$exception = false; | 	$exception = false; | ||||||
| 	if ($events === null) | 	/*if ($events === null) | ||||||
| 	{ | 	{ | ||||||
| 		$events = array(); | 		$events = array(); | ||||||
| 	} | 	}*/ | ||||||
| 	foreach ($events as $key => &$event) | 	foreach ($events as $key => &$event) | ||||||
| 	{ | 	{ | ||||||
| 		$now = now(); | 		$now = now(); | ||||||
| @@ -23,7 +25,8 @@ function checkEvents() | |||||||
| 			if($event->dateTimeEvent < $now) | 			if($event->dateTimeEvent < $now) | ||||||
| 			{ | 			{ | ||||||
| 				logger(DEBUG, _("Event must be executed"), __FILE__ . ":" . __LINE__); | 				logger(DEBUG, _("Event must be executed"), __FILE__ . ":" . __LINE__); | ||||||
| 				if (!empty($event->exceptionInterval)) | 				 | ||||||
|  | 				if (!empty($event->exceptionInterval) and $event->isInterval == true) | ||||||
| 				{ | 				{ | ||||||
| 					logger(DEBUG, _("Testing exceptions"), __FILE__ . ":" . __LINE__); | 					logger(DEBUG, _("Testing exceptions"), __FILE__ . ":" . __LINE__); | ||||||
| 					foreach($event->exceptionInterval as $key => $value) | 					foreach($event->exceptionInterval as $key => $value) | ||||||
| @@ -37,15 +40,20 @@ function checkEvents() | |||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | 				 | ||||||
| 				if ($exception === false) | 				if ($exception === false) | ||||||
| 				{ | 				{ | ||||||
| 					if (is_callable($this->function)) | 					if (is_callable($event->function)) | ||||||
| 					{ | 					{ | ||||||
| 						$this->function($event); | 						logger(DEBUG, _("executing function") . $event->function[1], __FILE__ . ":" . __LINE__); | ||||||
|  | 						$event->function(); | ||||||
|  | 						$event->published = $now; | ||||||
| 					}else | 					}else | ||||||
| 					{ | 					{ | ||||||
| 						logger(DEBUG, sprintf(_("sending command set %s => %s  for %s"), $event->param ,bool2string($event->value), $event->device->friendlyName), __FILE__ . ":" . __LINE__); | 						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"); | 						publish(mktopic($event->device), array($event->param => $event->value), "set"); | ||||||
|  | 						$event->published = $now; | ||||||
|  | 					} | ||||||
| 					if ($event->method !== null)	$event->device->properties[$event->param]["method"] = $event->method; | 					if ($event->method !== null)	$event->device->properties[$event->param]["method"] = $event->method; | ||||||
| 					if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) | 					if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) | ||||||
| 					{ | 					{ | ||||||
| @@ -53,7 +61,6 @@ function checkEvents() | |||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			} |  | ||||||
| 		}elseif (!empty($event->dateTimeEvent) and $event->dateTimeEvent < now()) | 		}elseif (!empty($event->dateTimeEvent) and $event->dateTimeEvent < now()) | ||||||
| 		{ | 		{ | ||||||
| 				logger(DEBUG, sprintf(_("Sending command set %s => %s to %s"),$event->param,  bool2string($event->value), $event->device->friendlyName), __FILE__ . ":" . __LINE__); | 				logger(DEBUG, sprintf(_("Sending command set %s => %s to %s"),$event->param,  bool2string($event->value), $event->device->friendlyName), __FILE__ . ":" . __LINE__); | ||||||
| @@ -89,9 +96,11 @@ function setOneshotEvent(device &$deviceObject, string $datetime, $property, $va | |||||||
|  |  | ||||||
| // startDatetime and stopDatetime format : "yyyy-mm-dd hh:mm:ss" | // 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) | function setRecurrentEvent($function, $ieeeAddress, string $property, $value, bool $isInterval, string $startDatetime, string $stopDatetime, int $hours, int $minutes, int $seconds, int $days, int $weeks, int $months, int $years, int $method = null) | ||||||
| { | { | ||||||
| 	global $events; | 	global $events, $indexDevices; | ||||||
|  | 	logger(INFO, _("Setting recurrent event"), __FILE__ . ":" . __LINE__); | ||||||
|  | 	 | ||||||
| 	$string = "P"; | 	$string = "P"; | ||||||
| 	if (!empty($years))		$string .= $years . "Y"; | 	if (!empty($years))		$string .= $years . "Y"; | ||||||
| 	if (!empty($months))	$string .= $months . "M"; | 	if (!empty($months))	$string .= $months . "M"; | ||||||
| @@ -101,24 +110,51 @@ function setRecurrentEvent(device &$deviceObject, string $property, $value, stri | |||||||
| 	if (!empty($hours))  $string .= $hours . "H"; | 	if (!empty($hours))  $string .= $hours . "H"; | ||||||
| 	if (!empty($months))  $string .= $months . "M"; | 	if (!empty($months))  $string .= $months . "M"; | ||||||
| 	if (!empty($seconds))  $string .= $seconds . "S"; | 	if (!empty($seconds))  $string .= $seconds . "S"; | ||||||
|  | 	logger(DEBUG, _("reccurrent event string : ") . $string, __FILE__ . ":" . __LINE__); | ||||||
|  | 	 | ||||||
| 	 | 	 | ||||||
| 	$event = new event; | 	$event = new event; | ||||||
|  | 	//  pb in  recurrent event in case of date and not interval | ||||||
|  | 	if ($isInterval === true) | ||||||
|  | 	{ | ||||||
| 		$event->recurrenceInterval 	= new DateInterval($string); | 		$event->recurrenceInterval 	= new DateInterval($string); | ||||||
|  | 	}else | ||||||
|  | 	{ | ||||||
|  | 		$event->recurrenceInterval 	= 0; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	if (!empty($startDatetime)) | ||||||
|  | 	{ | ||||||
| 		$event->startDatetime = new datetime($startDatetime); | 		$event->startDatetime = new datetime($startDatetime); | ||||||
|  | 	}else | ||||||
|  | 	{ | ||||||
|  | 		$event->startDatetime = now(); | ||||||
|  | 	} | ||||||
|  | 	$event->dateTimeEvent = $event->startDatetime; | ||||||
|  | 	 | ||||||
|  | 	if (!empty($stopDatetime)) | ||||||
|  | 	{ | ||||||
| 		$event->stopDatetime		= new datetime($stopDatetime); | 		$event->stopDatetime		= new datetime($stopDatetime); | ||||||
| 	$event->ieee_address		= $deviceObject->ieeeAddress; | 	} | ||||||
| 	$event->topic				= $deviceObject->topic; | 	if (!empty($ieeeAddress)) | ||||||
| 	$event->device				= & $deviceObject; | 	{ | ||||||
|  | 		$event->ieee_address		= $ieeeAddress; | ||||||
|  | 		$event->topic				= $indexDevices[$deviceObject]->topic; | ||||||
|  | 		$event->device				= &$indexDevices[$deviceObject]; | ||||||
| 		$event->param				= $property; | 		$event->param				= $property; | ||||||
| 		$event->value				= $value; | 		$event->value				= $value; | ||||||
| 	$event->dateTimeEvent 		= $event->startDatetime; | 	} | ||||||
|  | 	 | ||||||
|  | 	if ($event->recurrenceInterval != 0) | ||||||
|  | 	{ | ||||||
| 		if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) | 		if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) | ||||||
| 		{ | 		{ | ||||||
| 			logger(ERROR, _("Error in event recurrence. event: ") . $key, __FILE__ . ":" . __LINE__); | 			logger(ERROR, _("Error in event recurrence. event: ") . $key, __FILE__ . ":" . __LINE__); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if ($method !== null)	$event->method = $method; | 	if ($method !== null)	$event->method = $method; | ||||||
|  | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| function setDelay(device &$deviceObject, float $delay, string $unit, string $property, $value, bool $replace=false, int $method = null) | function setDelay(device &$deviceObject, float $delay, string $unit, string $property, $value, bool $replace=false, int $method = null) | ||||||
|   | |||||||
| @@ -5,8 +5,11 @@ class notificationFreemobile | |||||||
| 	private $name = "freemobile"; | 	private $name = "freemobile"; | ||||||
| 	public $active = true; | 	public $active = true; | ||||||
| 	public $level; | 	public $level; | ||||||
| 	private $dest = array( | 	public $curlErr; | ||||||
| 		"daniel" =>	"32886706&pass=JTGUY6l5OG73zX", | 	public $lastTry; | ||||||
|  | 	public $lastTryTimeout = 5; | ||||||
|  | 	protected $dest = array( | ||||||
|  | 		"daniel" =>	"15480189&pass=yVpPmCWmUl2HGp", | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
| 	function __construct() | 	function __construct() | ||||||
| @@ -16,37 +19,50 @@ class notificationFreemobile | |||||||
|  |  | ||||||
| 	function send($message, $destinataire=NOTIF_DEFAULT_DEST) | 	function send($message, $destinataire=NOTIF_DEFAULT_DEST) | ||||||
| 	{ | 	{ | ||||||
| 		global $curlErr; | 		$error = false; | ||||||
| 		$result = false; |  | ||||||
| 		if ($this->active === true) | 		if ($this->active === true) | ||||||
| 		{ | 		{ | ||||||
| 			$ch = curl_init(); | 			$ch = curl_init(); | ||||||
| 			// set url | 			// 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 | 			//return the transfer as a string | ||||||
| 			//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | 			//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||||||
| 			// $result contains the output string | 			// $result contains the output string | ||||||
| 			if ($curlErr <= 10) | 			if ($this->curlErr <= 5) | ||||||
| 			{ | 			{ | ||||||
| 				$result = curl_exec($ch); |                 logger(DEBUG, _("Curl sending message"), false, __FILE__ . ":" . __LINE__); | ||||||
| 				if ($result === false) |                 echo $this->url . urlencode(trim($message)) . EOL; | ||||||
|  | 				curl_exec($ch); | ||||||
|  | 				if (curl_errno($ch) != 0) | ||||||
| 				{ | 				{ | ||||||
| 					$curlErr += 1; | 					$this->curlErr += 1; | ||||||
|  | 					$this->lastTry = time(); | ||||||
| 					logger(ERROR, sprintf( _("Curl return error  %d: %s when sending notification"), curl_errno($ch), curl_error($ch)), false, __FILE__ . ":" . __LINE__); | 					logger(ERROR, sprintf( _("Curl return error  %d: %s when sending notification"), curl_errno($ch), curl_error($ch)), false, __FILE__ . ":" . __LINE__); | ||||||
|  | 					$error = true; | ||||||
| 				}else | 				}else | ||||||
| 				{ | 				{ | ||||||
| 					logger(DEBUG, sprintf(_("Curl return: %s when sending notification"), $result), false); | 					logger(DEBUG, sprintf(_("Curl return: %s when sending notification"), $result), false, __FILE__ . ":" . __LINE__); | ||||||
|  | 					$this->curlErr = 0; | ||||||
| 				} | 				} | ||||||
| 			} //TODO managing curl errors | 			}else | ||||||
|  | 			{ | ||||||
|  | 				if ((time() - $this->lastTry) > ($this->lastTryTimeout*60)) | ||||||
|  | 				{ | ||||||
|  | 					$this->curlErr -= 1; | ||||||
|  | 				} | ||||||
|  | 				$error = true; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			 | ||||||
|  | 			//TODO managing curl errors | ||||||
| 			// close curl resource to free up system resources | 			// close curl resource to free up system resources | ||||||
| 			curl_close($ch); | 			curl_close($ch); | ||||||
| 			return true; | 			 | ||||||
| 		} | 		} | ||||||
| 		return false; | 		return $error; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| $notificationMethods["freemobile"] = new notificationFreemobile(); | $notificationMethods["freemobile"] = new notificationFreemobile(); | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -1,4 +1,6 @@ | |||||||
| <?php | <?php | ||||||
|  | require_once "events.php"; | ||||||
|  |  | ||||||
| class alerte_intrusion extends hook | class alerte_intrusion extends hook | ||||||
| { | { | ||||||
| 	public $hookName = "alerte_intrusion"; | 	public $hookName = "alerte_intrusion"; | ||||||
| @@ -26,24 +28,30 @@ class alerte_intrusion extends hook | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public function test() | 	public function testPortes() | ||||||
| 	{ | 	{ | ||||||
| 		global $indexDevices; | 		global $indexDevices; | ||||||
|  | 		logger(DEBUG, _("Function alerte_intrusion->testPorte"), __FILE__ . ":" . __LINE__); | ||||||
|  |  | ||||||
| 		$msg = ""; | 		$msg = ""; | ||||||
| 		foreach ($this->devicelist as $device => $property) | 		foreach ($this->devicelist as $device => $property) | ||||||
| 		{ | 		{ | ||||||
| 			if($indexDevices[$device]->properties[$property] != false) | 			if($indexDevices[$device]->properties[$property] != false) | ||||||
| 			{ | 			{ | ||||||
| 				$msg .= $indexDevices->friendlyName . " is open" . EOL; | 				$msg .= $indexDevices[$device]->friendlyName . " is open" . EOL; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if ($msg != "") | 		if (!empty($msg)) | ||||||
| 		{ | 		{ | ||||||
| 			logger(ALERT, $msg, __FILE__ . ":" . __LINE__); | 			logger(ALERT, $msg, __FILE__ . ":" . __LINE__); | ||||||
| 		} | 		} | ||||||
|  | 		return nl2br($msg); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| $hooks["alerte_intrusion"] = new alerte_intrusion(); | $hooks["alerte_intrusion"] = new alerte_intrusion(); | ||||||
|  | logger(DEBUG, _("Initializing event"), __FILE__ . ":" . __LINE__); | ||||||
|  | $function = array($hooks["alerte_intrusion"], "testPortes"); | ||||||
|  | setRecurrentEvent($function, 0, 0, 0, 0, 0, 0, 21, 0, 0, 1, 0, 0, 0); | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -237,7 +237,7 @@ class rdc_store extends hook | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	private function send($level) | 	private function send($level, $method) | ||||||
| 	{ | 	{ | ||||||
| 		global $indexDevices; | 		global $indexDevices; | ||||||
| 		$deviceObject = $indexDevices[RDC_STORE]; | 		$deviceObject = $indexDevices[RDC_STORE]; | ||||||
|   | |||||||
| @@ -31,16 +31,16 @@ class rdc_wc_eclairage extends hook | |||||||
| 					if ($targetDevice->properties["state_l2"]["method"] == IDLE) | 					if ($targetDevice->properties["state_l2"]["method"] == IDLE) | ||||||
| 					{ | 					{ | ||||||
| 						$targetDevice->properties["state_l2"]["method"] = MANUAL; | 						$targetDevice->properties["state_l2"]["method"] = MANUAL; | ||||||
| 						setDelay($device, $this->delayManual, $this->timeUnit, "state_l2", "OFF", true); | 						setDelay($targetDevice, $this->delayManual, $this->timeUnit, "state_l2", "OFF", true); | ||||||
| 					} | 					} | ||||||
| 				}elseif ($value == "OFF") | 				}elseif ($value == "OFF") | ||||||
| 				{ | 				{ | ||||||
| 					$targetDevice->properties["state_l2"]["method"] = IDLE; | 					$targetDevice->properties["state_l2"]["method"] = IDLE; | ||||||
| 					removeEvent($device, "state_l2", "OFF"); | 					removeEvent($targetDevice, "state_l2", "OFF"); | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 			case "occupancy": | 			case "occupancy": | ||||||
| 				logger(DEBUG, "CASE: occupancy", __FILE__ . ":" . __LINE__); | 				logger(DEBUG, "CASE: WC occupancy", __FILE__ . ":" . __LINE__); | ||||||
| 				logger(DEBUG, "method =" . $targetDevice->properties["state_l2"]["method"], __FILE__ . ":" . __LINE__); | 				logger(DEBUG, "method =" . $targetDevice->properties["state_l2"]["method"], __FILE__ . ":" . __LINE__); | ||||||
| 				if ($value === true and $targetDevice->properties["state_l2"]["method"] == IDLE) | 				if ($value === true and $targetDevice->properties["state_l2"]["method"] == IDLE) | ||||||
| 				{ | 				{ | ||||||
| @@ -50,7 +50,7 @@ class rdc_wc_eclairage extends hook | |||||||
| 				{ | 				{ | ||||||
| 					//$targetDevice->properties["state_l2"]["method"] = IDLE; | 					//$targetDevice->properties["state_l2"]["method"] = IDLE; | ||||||
| 					//$this->send($targetDevice, "OFF"); | 					//$this->send($targetDevice, "OFF"); | ||||||
| 					setDelay($device, $this->delay, $this->timeUnit, "state_l2", "OFF", true, IDLE); | 					setDelay($targetDevice, $this->delay, $this->timeUnit, "state_l2", "OFF", true, IDLE); | ||||||
| 				} | 				} | ||||||
| 		} | 		} | ||||||
| 		logger (INFO, sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); | 		logger (INFO, sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								moha.php
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								moha.php
									
									
									
									
									
								
							| @@ -50,7 +50,7 @@ if ($testMode) | |||||||
| 	$httpServerIp = "192.168.1.253"; | 	$httpServerIp = "192.168.1.253"; | ||||||
| }else | }else | ||||||
| { | { | ||||||
| 	$logLevel = INFO | NOTICE | WARNING | ERROR | ALERT; | 	$logLevel = DEBUG | INFO | NOTICE | WARNING | ERROR | ALERT; | ||||||
| 	$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 | ||||||
| @@ -64,13 +64,13 @@ if (!init()) exit(1); | |||||||
| bindtextdomain("moha", "./locale"); | bindtextdomain("moha", "./locale"); | ||||||
| textdomain("moha"); | textdomain("moha"); | ||||||
|  |  | ||||||
| function notify($message) | function notify($message, $destinataire=NOTIF_DEFAULT_DEST) | ||||||
| { | { | ||||||
| 	global $notificationMethods; | 	global $notificationMethods; | ||||||
| 	$result = false; | 	$result = false; | ||||||
| 	foreach($notificationMethods as $value) | 	foreach($notificationMethods as $value) | ||||||
| 	{ | 	{ | ||||||
| 		$result =  $result | $value->send($message); | 		$result =  $result | $value->send($message, $destinataire); | ||||||
| 	} | 	} | ||||||
| 	return $result; | 	return $result; | ||||||
| } | } | ||||||
| @@ -95,8 +95,10 @@ function logger($level, $log, $pos = "", $notif = true) | |||||||
| 		if(notify("Moha\n" . $logString) === false) | 		if(notify("Moha\n" . $logString) === false) | ||||||
| 		{ | 		{ | ||||||
| 			logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false); | 			logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false); | ||||||
|  | 			return true; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| function init() | function init() | ||||||
| @@ -200,6 +202,18 @@ require "events.php"; | |||||||
| require "db_functions.php"; | require "db_functions.php"; | ||||||
| require "apiserver/apiserver.php"; | require "apiserver/apiserver.php"; | ||||||
|  |  | ||||||
|  | logger(DEBUG, _("Loading stored events datas from ") . $dataPath . "events.db", __FILE__ . ":" . __LINE__); | ||||||
|  | if (file_exists($dataPath . "events.db")) | ||||||
|  | { | ||||||
|  | 	if (($db = loadDB($dataPath . "events.db")) === false) | ||||||
|  | 	{ | ||||||
|  | 		logger(ERROR, _("Can not load events db"), __FILE__ . ":" . __LINE__); | ||||||
|  | 	}else | ||||||
|  | 	{ | ||||||
|  | 		$events = $db; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
| // topics definition | // topics definition | ||||||
| listHooks("./topics_callbacks", $topicsCallbacks); | listHooks("./topics_callbacks", $topicsCallbacks); | ||||||
| if (!empty($topicsCallbacks)) | if (!empty($topicsCallbacks)) | ||||||
| @@ -236,6 +250,11 @@ if (file_exists($dataPath . "topics.db")) | |||||||
| 	}else | 	}else | ||||||
| 	{ | 	{ | ||||||
| 		$topics = $db; | 		$topics = $db; | ||||||
|  | 		foreach($topics as $topicName => $topic ) | ||||||
|  | 		{ | ||||||
|  | 			$topic->notificationSent = false; | ||||||
|  | 			logger(DEBUG, "topic: " . $topicName . " is " . bool2string($topic->notificationSent)); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -253,18 +272,7 @@ if (file_exists($dataPath . "devices.db")) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| logger(DEBUG, _("Loading stored events datas from ") . $dataPath . "events.db", __FILE__ . ":" . __LINE__); |  | ||||||
| if (file_exists($dataPath . "events.db")) |  | ||||||
| { |  | ||||||
| 	if (($db = loadDB($dataPath . "events.db")) === false) |  | ||||||
| 	{ |  | ||||||
| 		logger(ERROR, _("Can not load events db"), __FILE__ . ":" . __LINE__); |  | ||||||
| 	}else |  | ||||||
| 	{ |  | ||||||
| 		$events = $db; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Program start | // Program start | ||||||
| logger(DEBUG, _("Program start"), __FILE__ . ":" . __LINE__, false); | logger(DEBUG, _("Program start"), __FILE__ . ":" . __LINE__, false); | ||||||
| @@ -338,6 +346,7 @@ while (true) | |||||||
| 		//logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__); | 		//logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__); | ||||||
| 	} | 	} | ||||||
| 	checkEvents(); | 	checkEvents(); | ||||||
|  | 	checkTopicsAvailability(); | ||||||
| 	if ($apiServerIsActive)		apiServer($read); | 	if ($apiServerIsActive)		apiServer($read); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ function linky2mqttCallback($topic, $message) | |||||||
| { | { | ||||||
| 	global $topics, $logFh, $devices, $included; | 	global $topics, $logFh, $devices, $included; | ||||||
| 	$topicName = $topic[0]; | 	$topicName = $topic[0]; | ||||||
|  |     $topics[$topicName]->lastSeen = time(); | ||||||
| 	$friendlyName = $topic[1]; 			// get friendlyName | 	$friendlyName = $topic[1]; 			// get friendlyName | ||||||
| 	logger(INFO, sprintf(_("Incoming notification of device %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); | 	logger(INFO, sprintf(_("Incoming notification of device %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); | ||||||
| 	$payloadArray = json_decode($message->payload, true); | 	$payloadArray = json_decode($message->payload, true); | ||||||
| @@ -36,4 +37,6 @@ function linky2mqttCallback($topic, $message) | |||||||
| 	//print_r($device["device"]); | 	//print_r($device["device"]); | ||||||
| } | } | ||||||
| $topics["linky2mqtt"]->callback = "linky2mqttCallback"; | $topics["linky2mqtt"]->callback = "linky2mqttCallback"; | ||||||
|  | $topics["linky2mqtt"]->timeOut = 3;        // timeOut in minutes | ||||||
|  | $topics["linky2mqtt"]->lastSeen = time(); | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ if (!array_key_exists("pws2mqtt", $devices))	$devices["pws2mqtt"] = array(); | |||||||
|  |  | ||||||
| function pws2mqttCallback($topic, $message) | function pws2mqttCallback($topic, $message) | ||||||
| { | { | ||||||
| 	global $logFh, $devices, $included; | 	global $logFh, $devices, $included, $topics; | ||||||
| 	$topicName = $topic[0]; | 	$topicName = $topic[0]; | ||||||
| 	$fn = $topic[1]; | 	$fn = $topic[1]; | ||||||
| 	logger(INFO, sprintf(_("Incoming notification of device %s => friendly name : %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); | 	logger(INFO, sprintf(_("Incoming notification of device %s => friendly name : %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); | ||||||
| @@ -30,6 +30,7 @@ function pws2mqttCallback($topic, $message) | |||||||
| 		{ | 		{ | ||||||
| 			$device = &$device[$fn]; | 			$device = &$device[$fn]; | ||||||
| 		} | 		} | ||||||
|  | 		$topics[$topicName]->lastSeen = time(); | ||||||
| 		unset($payloadArray["friendly_name"]); | 		unset($payloadArray["friendly_name"]); | ||||||
| 		unset($payloadArray["ieeeAddress"]); | 		unset($payloadArray["ieeeAddress"]); | ||||||
| 		unset($payloadArray["type"]); | 		unset($payloadArray["type"]); | ||||||
| @@ -60,6 +61,8 @@ function pws2mqttCallback($topic, $message) | |||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
| $topics["pws2mqtt"]->callback = "pws2mqttCallback"; | $topics["pws2mqtt"]->callback = "pws2mqttCallback"; | ||||||
|  | $topics["pws2mqtt"]->timeOut = 3;           //timeOut in minutes | ||||||
|  | $topics["pws2mqtt"]->lastSeen = time(); | ||||||
|  |  | ||||||
| if (!is_callable("pws2mqttGetList")) | if (!is_callable("pws2mqttGetList")) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ function zigbee2mqttCallback($topic, $message) | |||||||
| { | { | ||||||
| 	global $topics, $devices, $included, $logFh, $indexFriendlyNames, $devicesRequest; | 	global $topics, $devices, $included, $logFh, $indexFriendlyNames, $devicesRequest; | ||||||
|      |      | ||||||
|  |     $topics[$topic[0]]->lastSeen = time(); | ||||||
| 	if ($topic[1] == "bridge") | 	if ($topic[1] == "bridge") | ||||||
| 	{ | 	{ | ||||||
| 		switch ($topic[2]) | 		switch ($topic[2]) | ||||||
| @@ -117,5 +118,6 @@ function zigbee2mqttCallback($topic, $message) | |||||||
| }; | }; | ||||||
|  |  | ||||||
| $topics["zigbee2mqtt"]->callback = "zigbee2mqttCallback"; | $topics["zigbee2mqtt"]->callback = "zigbee2mqttCallback"; | ||||||
|  | $topics["zigbee2mqtt"]->timeOut = 3; | ||||||
|  | $topics["zigbee2mqtt"]->lastSeen = time(); | ||||||
| ?> | ?> | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								utils.php
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								utils.php
									
									
									
									
									
								
							| @@ -16,6 +16,27 @@ | |||||||
| 		print ("MOHA-" . $logString . EOL); | 		print ("MOHA-" . $logString . EOL); | ||||||
| 	} | 	} | ||||||
| }*/ | }*/ | ||||||
|  |  | ||||||
|  | function checkTopicsAvailability() | ||||||
|  | { | ||||||
|  |     global$topics; | ||||||
|  |     foreach($topics as $topicName => $topic) | ||||||
|  |     { | ||||||
|  |         if ($topic->status == 1) | ||||||
|  |         { | ||||||
|  |             logger(DEBUG, "time is " . time() . " lastSeen is " . $topic->lastSeen, __FILE__ . ":" . __LINE__ ); | ||||||
|  |  | ||||||
|  |             if ((time() - $topic->lastSeen > $topic->timeOut*60) and ($topic->notificationSent == false)) | ||||||
|  |             {  | ||||||
|  |                 if (logger(ALERT, $topicName . _(" is not available"), __FILE__ . ":" . __LINE__) == false); | ||||||
|  |                 { | ||||||
|  | 					$topic->notificationSent = true; | ||||||
|  | 				} | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| function testActionneurs(array $actionneurs) | function testActionneurs(array $actionneurs) | ||||||
| { | { | ||||||
| 	global $indexDevices; | 	global $indexDevices; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user