Hallo Zusammen,
ich hätte mal eine Frage an die PHP-Experten hier im Forum. Ich habe einen LBS (um)geschrieben um die API von Husqvarna nutzen zu können.
http://service.knx-user-forum.de/?co...ad&id=19000935
Jetzt habe ich festgestellt, dass sich nach und nach der RAM füllt und der EXEC-Prozess des LBS dafür verantwortlich ist. Da ich das ganze nur auf Basis eines anderen LBS von adaptiert habe, weiß ich nicht so recht, an welcher stelle es hapert.
Wer hat eine Idee wodurch der RAM vollläuft?
Hier der EXEC-Teil:
ich hätte mal eine Frage an die PHP-Experten hier im Forum. Ich habe einen LBS (um)geschrieben um die API von Husqvarna nutzen zu können.
http://service.knx-user-forum.de/?co...ad&id=19000935
Jetzt habe ich festgestellt, dass sich nach und nach der RAM füllt und der EXEC-Prozess des LBS dafür verantwortlich ist. Da ich das ganze nur auf Basis eines anderen LBS von adaptiert habe, weiß ich nicht so recht, an welcher stelle es hapert.
Wer hat eine Idee wodurch der RAM vollläuft?
Hier der EXEC-Teil:
PHP-Code:
<?php
require (dirname(__FILE__) . "/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(0);
//Wichtig! Script soll endlos laufen
sql_connect();
logging($id, "Husqvarna Automower Connect Daemon started", null, 5);
$E = logic_getInputs($id);
$cyclecounter = $E[11]['value'];
// start with max value, so a cycle is immidiatelly triggerd
while (getSysInfo(1) >= 1 && getLogicElementVar($id, 99) == 0) {
$E = logic_getInputs($id);
$cmd = getLogicElementVar($id, 5);
setLogicElementVar($id, 5, 0);
if ($cyclecounter < $E[11]['value'] && $cmd == 0) {
sleep(1);
$cyclecounter++;
} else {
$cyclecounter = 0;
logging($id, "Husqvarna Automower Connect Cycle started", null, 8);
if ($E) {
$username = $E[2]['value'];
$password = $E[3]['value'];
$mower_num = $E[4]['value'];
error_off();
$session_husqvarna = new husqvarna_api();
$session_husqvarna->login($username, $password);
error_on();
logging($id, "new husqvarna_api", null, 8);
if ($session_husqvarna == NULL) {
logging($id, '$session_husqvarna is NULL', null, 1);
} else {
error_off();
$mowers = $session_husqvarna->list_robots();
$mower = NULL;
if (count($mowers) < $mower_num)
logging($id, "mower not found - looking for mower number $mower_num, total found " . count($mowers), null, 3);
else {
$keys = array_keys($mowers);
$mower = $mowers[$keys[$mower_num - 1]];
}
error_on();
logging($id, "mower found", null, 8);
}
if (is_null($mower)) {
$cyclecounter = $E[11]['value'];
logging($id, "restart cycle", null, 8);
sleep(10);
} else {
switch ($cmd) {
case 1 :
$session_husqvarna->control($mower->id, 'START');
logging($id, "Send command START", null, 5);
break;
case 2 :
$session_husqvarna->control($mower->id, 'STOP');
logging($id, "Send command STOP", null, 5);
break;
case 3 :
$session_husqvarna->control($mower->id, 'PARK');
logging($id, "Send command PARK", null, 5);
break;
}
$mower_is_valid = true;
if ($cmd > 0) {
logging($id, "get mower after command", null, 5);
error_off();
$session_husqvarna = new husqvarna_api();
$session_husqvarna->login($username, $password);
error_on();
if ($session_husqvarna == NULL) {
logging($id, "husqvarna is NULL", null, 1);
} else {
error_off();
$mowers = $session_husqvarna->list_robots();
$mower = NULL;
if (count($mowers) < $mower_num) {
logging($id, "mower not found - looking for mower number $mower_num, total found " . count($mowers), null, 3);
} else {
$keys = array_keys($mowers);
$mower = $mowers[$keys[$mower_num - 1]];
}
error_on();
logging($id, "mower found v2", null, 8);
}
if (is_null($mower)) {
logging($id, "mower is NULL", null, 1);
$cyclecounter = $E[11]['value'];
sleep(10);
$mower_is_valid = false;
}
}
if ($mower_is_valid) {
logic_setOutput($id, 1, $mower->name);
$mowerstate = $session_husqvarna->get_status($mower->id);
logic_setOutput($id, 2, $mowerstate->valueFound);
logic_setOutput($id, 3, $mowerstate->batteryPercent);
logic_setOutput($id, 4, $mowerstate->connected);
logic_setOutput($id, 5, $mowerstate->lastErrorCode);
logic_setOutput($id, 6, $mowerstate->lastErrorCodeTimestamp);
logic_setOutput($id, 7, $mowerstate->mowerStatus);
logic_setOutput($id, 8, $mowerstate->nextStartSource);
logic_setOutput($id, 9, $mowerstate->nextStartTimestamp);
logic_setOutput($id, 10, $mowerstate->operatingMode);
logic_setOutput($id, 11, round($mowerstate->storedTimestamp / 1000, 0));
logic_setOutput($id, 12, json_encode($mowerstate->lastLocations));
}
logging($id, "Husqvarna Automower Connect Cycle exit", null, 8);
}
}
}
}
sql_disconnect();
logging($id, "Husqvarna Automower Connect Daemon exit", null, 5);
function myErrorHandler($errno, $errstr, $errfile, $errline) {
global $id;
logging($id, "File: $errfile | Error: $errno | Line: $errline | $errstr ");
}
function error_off() {
$error_handler = set_error_handler("myErrorHandler");
error_reporting(0);
}
function error_on() {
restore_error_handler();
error_reporting(E_ALL);
}
function logging($id, $msg, $var = NULL, $priority = 8) {
$E = getLogicEingangDataAll($id);
$logLevel = getLogicElementVar($id, 103);
if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
$logLevelNames = array('none', 'emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug');
$version = getLogicElementVar($id, 100);
$lbsNo = getLogicElementVar($id, 101);
$logName = getLogicElementVar($id, 102) . ' --- LBS' . $lbsNo;
strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
if (is_object($var))
$var = get_object_vars($var);
// transfer object into array
if (is_array($var)) {// print out array
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
foreach ($var as $index => $line)
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $index . " => " . $line);
writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT END ================");
}
}
}
class husqvarna_api {
protected $url_api_im = 'https://iam-api.dss.husqvarnagroup.net/api/v3/';
protected $url_api_track = 'https://amc-api.dss.husqvarnagroup.net/v1/';
protected $username;
protected $password;
protected $token;
protected $provider;
function login($username, $password) {
$this->username = $username;
$this->password = $password;
$fields["data"]["attributes"]["username"] = $this->username;
$fields["data"]["attributes"]["password"] = $this->password;
$fields["data"]["type"] = "token";
$result = $this->post_api("token", $fields);
if ($result !== false) {
$this->token = $result->data->id;
$this->provider = $result->data->attributes->provider;
return true;
}
return false;
}
private function get_headers($fields = null) {
if (isset($this->token)) {
$generique_headers = array('Content-type: application/json', 'Accept: application/json', 'Authorization: Bearer ' . $this->token, 'Authorization-Provider: ' . $this->provider);
} else {
$generique_headers = array('Content-type: application/json', 'Accept: application/json');
}
if (isset($fields)) {
$custom_headers = array('Content-Length: ' . strlen(json_encode($fields)));
} else {
$custom_headers = array();
}
return array_merge($generique_headers, $custom_headers);
}
private function post_api($page, $fields = null) {
$session = curl_init();
curl_setopt($session, CURLOPT_URL, $this->url_api_im . $page);
curl_setopt($session, CURLOPT_HTTPHEADER, $this->get_headers($fields));
curl_setopt($session, CURLOPT_POST, true);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
if (isset($fields)) {
curl_setopt($session, CURLOPT_POSTFIELDS, json_encode($fields));
}
$json = curl_exec($session);
curl_close($session);
// throw new Exception(__('La livebox ne repond pas a la demande de cookie.', __FILE__));
return json_decode($json);
}
private function get_api($page, $fields = null) {
$session = curl_init();
curl_setopt($session, CURLOPT_URL, $this->url_api_track . $page);
curl_setopt($session, CURLOPT_HTTPHEADER, $this->get_headers($fields));
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
if (isset($fields)) {
curl_setopt($session, CURLOPT_POSTFIELDS, json_encode($fields));
}
$json = curl_exec($session);
curl_close($session);
// throw new Exception(__('La livebox ne repond pas a la demande de cookie.', __FILE__));
return json_decode($json);
}
private function del_api($page) {
$session = curl_init();
curl_setopt($session, CURLOPT_URL, $this->url_api_im . $page);
curl_setopt($session, CURLOPT_HTTPHEADER, $this->get_headers());
curl_setopt($session, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($session);
curl_close($session);
// throw new Exception(__('La livebox ne repond pas a la demande de cookie.', __FILE__));
return json_decode($json);
}
function logout() {
$result = $this->del_api("token/" . $this->token);
if ($result !== false) {
unset($this->token);
unset($this->provider);
return true;
}
return false;
}
function list_robots() {
$list_robot = array();
foreach ($this->get_api("mowers") as $robot) {
$list_robot[$robot->id] = $robot;
}
return $list_robot;
}
function get_status($mover_id) {
return $this->get_api("mowers/" . $mover_id . "/status");
}
function get_geofence($mover_id) {
return $this->get_api("mowers/" . $mover_id . "/geofence");
}
function control($mover_id, $command) {
if (in_array($command, array('PARK', 'STOP', 'START'))) {
return $this->get_api("mowers/" . $mover_id . "/control", array("action" => $command));
}
}
}
Kommentar