&$event) { $now = now(); if (!empty($event->startDatetime)) { logger(DEBUG, _("StartDatetime is set"), __FILE__ . ":" . __LINE__); if($event->dateTimeEvent < $now) { logger(DEBUG, _("Event must be executed"), __FILE__ . ":" . __LINE__); if (!empty($event->exceptionInterval)) { logger(DEBUG, _("Testing exceptions"), __FILE__ . ":" . __LINE__); foreach($event->exceptionInterval as $key => $value) { if($now > $value->start and $now < $value->end) { $exception = true; }elseif($now > $value->stop) { unset($event->exceptionInterval[$key]); } } } if ($exception === false) { if (is_callable($this->function)) { $this->function($event); }else { 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"); if ($event->method !== null) $event->device->properties[$event->param]["method"] = $event->method; if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) { logger(ERROR, _("Error in adding interval to event recurrence. event: ") . $key, __FILE__ . ":" . __LINE__); } } } } }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__); $mid = publish(mktopic($event->device), array($event->param => $event->value), "set"); //, $key);null $event->published = $now; if ($event->method !== null) { $event->device->properties[$event->param]["method"] = $event->method; } //echo "#################################\nUnsetting event $key \n###########################" . EOL; unset($events[$key]); } } //print_r($events); //$logLevel = $oldLevel; } // 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; $key = key($events); $events[$key]->dateTimeEvent = new dateTime($datetime); $events[$key]->ieeeAddress = $deviceObject->ieeeAddress; $events[$key]->topic = $deviceObject->topic; $events[$key]->param = $property; $events[$key]->value = $value; $events[$key]->device = & $deviceObject; if ($method !==null) $events[$key]->method =$method; } // 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 .= $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 .= $hours . "H"; if (!empty($months)) $string .= $months . "M"; if (!empty($seconds)) $string .= $seconds . "S"; $event = new event; $event->recurrenceInterval = new DateInterval($string); $event->startDatetime = new datetime($startDatetime); $event->stopDatetime = new datetime($stopDatetime); $event->ieee_address = $deviceObject->ieeeAddress; $event->topic = $deviceObject->topic; $event->device = & $deviceObject; $event->param = $property; $event->value = $value; $event->dateTimeEvent = $event->startDatetime; if (($event->dateTimeEvent->add($event->recurrenceInterval)) === false) { logger(ERROR, _("Error in event recurrence. event: ") . $key, __FILE__ . ":" . __LINE__); } if ($method !== null) $event->method = $method; } function setDelay(device &$deviceObject, float $delay, string $unit, string $property, $value, bool $replace=false, int $method = null) { global $events, $logLevel; $oldLevel = $logLevel; $logLevel = DEBUG; $datetime = new dateTime(); strtolower($unit); switch($unit) { case "second": $s = "S"; break; case "minute": $s = "M"; break; case "hour": $s = "H"; break; case "day": $s = "D"; break; case "week": $s = "W"; break; case "month": $s = "M"; break; case "year": $s = "Y"; break; } if (empty($s)) { logger(ERROR, _("setDelay error: unit is empty"), __FILE__ . ":" . __LINE__); } if (($datetime->add(new DateInterval('PT'. $delay . $s))) === false) { logger(ERROR, _("setDelay error: datetime->add"), __FILE__ . ":" . __LINE__); } //print_r($datetime); if ($replace) { $eventKey = searchEvent($deviceObject, $property, $value); if ($eventKey !== false) deleteEvent($eventKey); } //$dt = $datetime->format("Y-m-d\TH:i:s\Z"); $events[] = new event; $key = array_key_last($events); $events[$key]->dateTimeEvent = $datetime; $events[$key]->ieeeAddress = $deviceObject->ieeeAddress; $events[$key]->topic = $deviceObject->topic; $events[$key]->param = $property; $events[$key]->value = $value; $events[$key]->device = & $deviceObject; if ($method !== null) $events[$key]->method = $method; logger (DEBUG, _('Setting new delay in $events[]'), __FILE__ . ":" . __LINE__); //print_r($events[$key]); $logLevel = $oldLevel; } function removeEvent(device $deviceObject, string $property , $value, int $method = null) { global $events; $eventKey = searchEvent($deviceObject, $property , $value); if ($eventKey !== false) { if ($method !== null) $events[$eventKey]->device->method = $method; deleteEvent($eventKey); } } 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__); foreach($events as $key => $event) { //echo "Event : $event => $value" . EOL; //echo "===>";print_r($event); echo EOL; if($event->topic == $deviceObject->topic and $event->param == $property and $event->value == $value and $event->ieeeAddress == $deviceObject->ieeeAddress) { return $key; } } return false; } // warning delete event does not manage method of the device (IDLE, ) function deleteEvent(int $eventKey) { global $events; if ($eventKey !== false) { logger(INFO, _("delete event key =") . $eventKey, __FILE__ . ":" . __LINE__); if (array_key_exists($eventKey, $events)) { unset ($events[$eventKey]); }else { logger(ERROR, _("event key does not exists: ") . $eventKey, __FILE__ . ":" . __LINE__); } } } ?>