+ Antworten
Seite 20 von 20 ErsteErste ... 10 18 19 20
Ergebnis 191 bis 192 von 192
  1. #191
    Registriert seit
    Apr 2010
    Ort
    Oberbayern
    Beiträge
    5,056

    Hi.

    Erstelle bitte einmal ausgehend vom Basispfad Deiner IPS-Installation ein Backup von der Datei

    \Symcon\modules\MK_Unifi\UniFi\module.php

    und ersetzte Sie durch folgendes Script:

    PHP-Code:
    <?

    class UniFi extends IPSModule {

        
    /**
         * public properties
         */
        
    public $ch '';
        public 
    $user '';
        public 
    $password '';
        public 
    $site 'default';
        public 
    $baseurl 'https://127.0.0.1:8443';
        public 
    $version '5.4.16';

        
    /**
         * private properties
         */
        
    private $debug false;
        private 
    $is_loggedin false;
        private 
    $cookies '';
        private 
    $request_type 'POST';
        private 
    $last_results_raw;
        private 
    $last_error_message;

        public function 
    Create() {
            
    //Never delete this line!
            
    parent::Create();

            
    //These lines are parsed on Symcon Startup or Instance creation
            //You cannot use variables here. Just static values.
            
    $this->RegisterPropertyString("IPAddress""https://127.0.0.1:8443");
            
    $this->RegisterPropertyString("UserName""admin");
            
    $this->RegisterPropertyString("UserPassword""");
            
    $this->RegisterPropertyString("Clients""");
            
    $this->RegisterPropertyString("Site""default");
            
    $this->RegisterPropertyInteger("Intervall_Network"3600);
            
    $this->RegisterPropertyInteger("Intervall_Client"60);
            
    $this->RegisterPropertyBoolean("Debug"FALSE);
            
    $this->RegisterTimer("Intervall_Network"3600'UniFi_UpdateUniFiNetworkData($_IPS[\'TARGET\']);');
            
    $this->RegisterTimer("Intervall_Client"60'UniFi_UpdateUniFiClientData($_IPS[\'TARGET\']);');
        }

        
    /**
         * Login to UniFi Controller
         */
        
    private function login()
        {
            
    $this->baseURL $this->ReadPropertyString("IPAddress");
            
    $this->userName $this->ReadPropertyString("UserName");
            
    $this->userPassword $this->ReadPropertyString("UserPassword");

            
    # init curl object and set session-wide options
            
    $this->ch curl_init();

            
    curl_setopt($this->chCURLOPT_HEADER1);
            
    curl_setopt($this->chCURLOPT_REFERER$this->baseurl.'/login');
            
    curl_setopt($this->chCURLOPT_URL$this->baseURL.'/api/login');
            
    curl_setopt($this->chCURLOPT_POSTFIELDSjson_encode(['username' => $this->userName'password' => $this->userPassword]));
            
    curl_setopt($this->chCURLOPT_RETURNTRANSFERTRUE);
            
    curl_setopt($this->chCURLOPT_SSL_VERIFYPEERFALSE);
            
    curl_setopt($this->chCURLOPT_SSL_VERIFYHOSTFALSE);
            
    curl_setopt($this->chCURLOPT_COOKIEFILE"/tmp/unifi_cookie");
            
    curl_setopt($this->chCURLOPT_COOKIEJAR"/tmp/unifi_cookie");
            
    curl_setopt($this->chCURLOPT_SSLVERSION1); //set TLSv1 (SSLv3 is no longer supported)        

            
    if (($content curl_exec($this->ch)) === false) {
                
    error_log('cURL error: '.curl_error($this->ch));
                
    $this->SetStatus(202);// login error
            
    }

            if (
    $this->debug) {
                
    curl_setopt($this->chCURLOPT_VERBOSEtrue);

                print 
    '<pre>';
                print 
    PHP_EOL.'-----------LOGIN-------------'.PHP_EOL;
                
    print_r (curl_getinfo($this->ch));
                print 
    PHP_EOL.'----------RESPONSE-----------'.PHP_EOL;
                print 
    $content;
                print 
    PHP_EOL.'-----------------------------'.PHP_EOL;
                print 
    '</pre>';
            }

            
    $header_size curl_getinfo($this->chCURLINFO_HEADER_SIZE);
            
    $body        trim(substr($content$header_size));
            
    $code        curl_getinfo($this->chCURLINFO_HTTP_CODE);

            
    //curl_close ($this->ch);

            
    preg_match_all('|Set-Cookie: (.*);|U'substr($content0$header_size), $results);
            if (isset(
    $results[1])) {
                
    $this->cookies implode(';'$results[1]);
                if (!empty(
    $body)) {
                    if ((
    $code >= 200) && ($code 400)) {
                        if (
    strpos($this->cookies'unifises') !== false) {
                            
    $this->is_loggedin true;
                            
    $this->SetStatus(102); // login OK
                        
    }
                    }

                    if (
    $code === 400) {
                         
    error_log('We have received an HTTP response status: 400. Probably a controller login failure');
                         
    $this->SetStatus(201);// login failed
                         
    return $code;
                    }
                }
            }

            return 
    $this->is_loggedin;
        }    

        
    /**
         * Logout from UniFi Controller
         */
        
    private function logout() {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $this->exec_curl($this->baseURL '/logout');
            
    $this->is_loggedin false;
            
    $this->cookies '';
            return 
    true;
        }

        
    /*     * **************************************************************
         * setter/getter functions from here:
         * ************************************************************** */

        /**
         * Set debug mode
         * --------------
         * sets debug mode to true or false, returns false if a non-boolean parameter was passed
         * required parameter <enable> = boolean; true will enable debug mode, false will disable it
         */
        
    private function set_debug($enable) {
            if (
    $enable) {
                
    $this->debug true;
            } elseif (
    $enable === false) {
                
    $this->debug false;
            }

            return 
    false;
        }

        
    /**
         * Get last raw results
         * --------------------
         * returns the raw results of the last method called in PHP stdClass Object format by default, returns false if not set
         * optional parameter <return_json> = boolean; true will return the results in "pretty printed" json format
         *
         * NOTE:
         * this method can be used to get the full error as returned by the controller
         */
        
    private function get_last_results_raw($return_json false) {
            if (
    $this->last_results_raw != null) {
                if (
    $return_json) {
                    return 
    json_encode($this->last_results_rawJSON_PRETTY_PRINT);
                }

                return 
    $this->last_results_raw;
            }

            return 
    false;
        }

        
    /**
         * Get last error message
         * ----------------------
         * returns the error message of the last method called in PHP stdClass Object format, returns false if not set
         */
        
    private function get_last_error_message() {
            if (isset(
    $this->last_error_message)) {
                return 
    $this->last_error_message;
            }

            return 
    false;
        }

        
    /*     * **************************************************************
         * Functions to access UniFi controller API routes from here:
         * ************************************************************** */

        /**
         * Authorize a client device
         * -------------------------
         * return true on success
         * required parameter <mac>     = client MAC address
         * required parameter <minutes> = minutes (from now) until authorization expires
         * optional parameter <up>      = upload speed limit in kbps
         * optional parameter <down>    = download speed limit in kbps
         * optional parameter <MBytes>  = data transfer limit in MB
         * optional parameter <ap_mac>  = AP MAC address to which client is connected, should result in faster authorization
         */
        
    private function authorize_guest($mac$minutes$up null$down null$MBytes null$ap_mac null) {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $mac strtolower($mac);
            
    $json = ['cmd' => 'authorize-guest''mac' => $mac'minutes' => $minutes];

            
    /**
             * if we have received values for up/down/MBytes we append them to the payload array to be submitted
             */
            
    if (isset($up)) {
                
    $json['up'] = $up;
            }
            if (isset(
    $down)) {
                
    $json['down'] = $down;
            }
            if (isset(
    $MBytes)) {
                
    $json['bytes'] = $MBytes;
            }
            if (isset(
    $ap_mac)) {
                
    $json['ap_mac'] = $ap_mac;
            }
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/stamgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Unauthorize a client device
         * ---------------------------
         * return true on success
         * required parameter <mac> = client MAC address
         */
        
    private function unauthorize_guest($mac) {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $mac strtolower($mac);
            
    $json json_encode(['cmd' => 'unauthorize-guest''mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/stamgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Reconnect a client device
         * -------------------------
         * return true on success
         * required parameter <mac> = client MAC address
         */
        
    private function reconnect_sta($mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $mac strtolower($mac);
            
    $json json_encode(['cmd' => 'kick-sta''mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/stamgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Block a client device
         * ---------------------
         * return true on success
         * required parameter <mac> = client MAC address
         */
        
    private function block_sta($mac) {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $mac strtolower($mac);
            
    $json json_encode(['cmd' => 'block-sta''mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/stamgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Unblock a client device
         * -----------------------
         * return true on success
         * required parameter <mac> = client MAC address
         */
        
    private function unblock_sta($mac) {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $mac strtolower($mac);
            
    $json json_encode(['cmd' => 'unblock-sta''mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/stamgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Add/modify a client device note
         * -------------------------------
         * return true on success
         * required parameter <user_id> = id of the user device to be modified
         * optional parameter <note>    = note to be applied to the user device
         *
         * NOTES:
         * - when note is empty or not set, the existing note for the user will be removed and "noted" attribute set to false
         */
        
    private function set_sta_note($user_id$note null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $noted = (is_null($note)) || (empty($note)) ? false true;
            
    $json json_encode(['note' => $note'noted' => $noted]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/user/' trim($user_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Add/modify a client device name
         * -------------------------------
         * return true on success
         * required parameter <user_id> = id of the user device to be modified
         * optional parameter <name>    = name to be applied to the user device
         *
         * NOTES:
         * - when name is empty or not set, the existing name for the user will be removed
         */
        
    private function set_sta_name($user_id$name null) {
            if (!
    $this->is_loggedin) {
                return 
    false;
            }
            
    $json json_encode(['name' => $name]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/user/' trim($user_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Daily site stats method
         * ------------------------
         * returns an array of daily stats objects for the current site
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         *
         * NOTES:
         * - defaults to the past 52*7*24 hours
         * - bytes" are no longer returned with controller version 4.9.1 and later
         */
        
    private function stat_daily_site($start null$end null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? ((time() - (time() % 3600)) * 1000) : $end;
            
    $start is_null($start) ? $end - (52 24 3600 1000) : $start;
            
    $attributes = ['bytes''wan-tx_bytes''wan-rx_bytes''wlan_bytes''num_sta''lan-num_sta''wlan-num_sta''time'];
            
    $json json_encode(['attrs' => $attributes'start' => $start'end' => $end]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/report/daily.site''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Hourly site stats method
         * ------------------------
         * returns an array of hourly stats objects for the current site
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         *
         * NOTES:
         * - defaults to the past 7*24 hours
         * - "bytes" are no longer returned with controller version 4.9.1 and later
         */
        
    private function stat_hourly_site($start null$end null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? ((time()) * 1000) : $end;
            
    $start is_null($start) ? $end - (24 3600 1000) : $start;
            
    $attributes = ['bytes''wan-tx_bytes''wan-rx_bytes''wlan_bytes''num_sta''lan-num_sta''wlan-num_sta''time'];
            
    $json json_encode(['attrs' => $attributes'start' => $start'end' => $end]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/report/hourly.site''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Hourly stats method for all access points
         * -----------------------------------------
         * returns an array of hourly stats objects
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         *
         * NOTES:
         * - defaults to the past 7*24 hours
         * - UniFi controller does not keep these stats longer than 5 hours with versions < 4.6.6
         */
        
    private function stat_hourly_aps($start null$end null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? ((time()) * 1000) : $end;
            
    $start is_null($start) ? $end - (24 3600 1000) : $start;
            
    $json json_encode(['attrs' => ['bytes''num_sta''time'], 'start' => $start'end' => $end]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/report/hourly.ap''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Daily stats method for all access points
         * ----------------------------------------
         * returns an array of daily stats objects
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         *
         * NOTES:
         * - defaults to the past 7*24 hours
         * - UniFi controller does not keep these stats longer than 5 hours with versions < 4.6.6
         */
        
    private function stat_daily_aps($start null$end null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? ((time()) * 1000) : $end;
            
    $start is_null($start) ? $end - (24 3600 1000) : $start;
            
    $json json_encode(['attrs' => ['bytes''num_sta''time'], 'start' => $start'end' => $end]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/report/daily.ap''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Show all login sessions
         * -----------------------
         * returns an array of login session objects for all devices
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         * optional parameter <mac>   = client MAC address to return sessions for (can only be used when start and end are also provided)
         *
         * NOTES:
         * - defaults to the past 7*24 hours
         */
        
    private function stat_sessions($start null$end null$mac null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? time() : $end;
            
    $start is_null($start) ? $end - (24 3600) : $start;
            
    $json = ['type' => 'all''start' => $start'end' => $end];
            if (!
    is_null($mac))
                
    $json['mac'] = $mac;
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/session''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Show latest 'n' login sessions for a single client device
         * ---------------------------------------------------------
         * returns an array of latest login session objects for given client device
         * required parameter <mac>   = client MAC address
         * optional parameter <limit> = maximum number of sessions to get (defaults to 5)
         */
        
    private function stat_sta_sessions_latest($mac$limit null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $limit is_null($limit) ? $limit;
            
    $json json_encode(['mac' => $mac'_limit' => $limit'_sort' => '-assoc_time']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/session''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Show all authorizations
         * -----------------------
         * returns an array of authorization objects
         * optional parameter <start> = Unix timestamp in seconds
         * optional parameter <end>   = Unix timestamp in seconds
         *
         * NOTES:
         * - defaults to the past 7*24 hours
         */
        
    private function stat_auths($start null$end null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $end is_null($end) ? time() : $end;
            
    $start is_null($start) ? $end - (24 3600) : $start;
            
    $json json_encode(['start' => $start'end' => $end]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/authorization''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List all client devices ever connected to the site
         * --------------------------------------------------
         * returns an array of client device objects
         * optional parameter <historyhours> = hours to go back (default is 8760 hours or 1 year)
         *
         * NOTES:
         * - <historyhours> is only used to select clients that were online within that period,
         *   the returned stats per client are all-time totals, irrespective of the value of <historyhours>
         */
        
    private function stat_allusers($historyhours 8760) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['type' => 'all''conn' => 'all''within' => $historyhours]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/alluser''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List guest devices
         * ------------------
         * returns an array of guest device objects with valid access
         * optional parameter <within> = time frame in hours to go back to list guests with valid access (default = 24*365 hours)
         */
        
    private function list_guests($within 8760) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['within' => $within]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/guest''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List online client device(s)
         * ----------------------------
         * returns an array of online client device objects, or in case of a single device request, returns a single client device object
         * optional parameter <client_mac> = the MAC address of a single online client device for which the call must be made
         */
        
    private function list_clients($client_mac null) {
            
    /*if (!$this->is_loggedin)
                return false; */
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/sta/' trim($client_mac)));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Get data for a single client device
         * -----------------------------------
         * returns an object with the client device information
         * required parameter <client_mac> = client device MAC address
         */
        
    private function stat_client($client_mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/user/' trim($client_mac)));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List user groups
         * ----------------
         * returns an array of user group objects
         */
        
    private function list_usergroups() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/usergroup'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Assign user device to another group
         * -----------------------------------
         * return true on success
         * required parameter <user_id>  = id of the user device to be modified
         * required parameter <group_id> = id of the user group to assign user to
         */
        
    private function set_usergroup($user_id$group_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['usergroup_id' => $group_id]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/user/' trim($user_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Edit user group
         * ---------------
         * returns an array containing a single object with attributes of the updated usergroup on success
         * required parameter <group_id>   = id of the user group
         * required parameter <site_id>    = id of the site
         * required parameter <group_name> = name of the user group
         * optional parameter <group_dn>   = limit download bandwidth in Kbps (default = -1, which sets bandwidth to unlimited)
         * optional parameter <group_up>   = limit upload bandwidth in Kbps (default = -1, which sets bandwidth to unlimited)
         *
         */
        
    private function edit_usergroup($group_id$site_id$group_name$group_dn = -1$group_up = -1) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $this->request_type 'PUT';
            
    $json json_encode(['_id' => $group_id'name' => $group_name'qos_rate_max_down' => $group_dn'qos_rate_max_up' => $group_up'site_id' => $site_id]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/usergroup/' trim($group_id), $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Add user group
         * --------------
         * returns an array containing a single object with attributes of the new usergroup ("_id", "name", "qos_rate_max_down", "qos_rate_max_up", "site_id") on success
         * required parameter <group_name> = name of the user group
         * optional parameter <group_dn>   = limit download bandwidth in Kbps (default = -1, which sets bandwidth to unlimited)
         * optional parameter <group_up>   = limit upload bandwidth in Kbps (default = -1, which sets bandwidth to unlimited)
         */
        
    private function add_usergroup($group_name$group_dn = -1$group_up = -1) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['name' => $group_name'qos_rate_max_down' => $group_dn'qos_rate_max_up' => $group_up]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/usergroup'$json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Delete user group
         * -----------------
         * returns true on success
         * required parameter <group_id> = id of the user group
         */
        
    private function delete_usergroup($group_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $this->request_type 'DELETE';
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/usergroup/' trim($group_id)));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * List health metrics
         * -------------------
         * returns an array of health metric objects
         */
        
    private function list_health() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/health'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List dashboard metrics
         * ----------------------
         * returns an array of dashboard metric objects (available since controller version 4.9.1.alpha)
         */
        
    private function list_dashboard() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/dashboard'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List user devices
         * -----------------
         * returns an array of known user device objects
         */
        
    private function list_users() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/user'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List access points and other devices under management of the controller (USW and/or USG devices)
         * ------------------------------------------------------------------------------------------------
         * returns an array of known device objects (or a single device when using the <device_mac> parameter)
         * optional parameter <device_mac> = the MAC address of a single device for which the call must be made
         */
        
    private function list_devices($device_mac null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/device/' $device_mac));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List rogue access points
         * ------------------------
         * returns an array of known rogue access point objects
         * optional parameter <within> = hours to go back to list discovered "rogue" access points (default = 24 hours)
         */
        
    private function list_rogueaps($within '24') {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['within' => $within]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/rogueap''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List sites
         * ----------
         * returns a list sites hosted on this controller with some details
         */
        
    private function list_sites() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/self/sites'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List sites stats
         * ----------------
         * returns statistics for all sites hosted on this controller
         *
         * NOTES: this endpoint was introduced with controller version 5.2.9
         */
        
    private function stat_sites() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/stat/sites'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Add a site
         * ----------
         * returns an array containing a single object with attributes of the new site ("_id", "desc", "name") on success
         * required parameter <description> = the long name for the new site
         *
         * NOTES: immediately after being added, the new site will be available in the output of the "list_sites" function
         */
        
    private function add_site($description) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['desc' => $description'cmd' => 'add-site']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/sitemgr''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Delete a site
         * -------------
         * return true on success
         * required parameter <site_id> = 24 char string; _id of the site to delete
         */
        
    private function delete_site($site_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['site' => $site_id'cmd' => 'delete-site']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/sitemgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * List admins
         * -----------
         * returns an array containing administrator objects for selected site
         */
        
    private function list_admins() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['cmd' => 'get-admins']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/sitemgr''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List wlan_groups
         * ----------------
         * returns an array containing known wlan_groups
         */
        
    private function list_wlan_groups() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/wlangroup'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List sysinfo
         * ------------
         * returns an array of known sysinfo data
         */
        
    private function stat_sysinfo() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/sysinfo'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List self
         * ---------
         * returns an array of information about the logged in user
         */
        
    private function list_self() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/self'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List networkconf
         * ----------------
         * returns an array of network configuration data
         */
        
    private function list_networkconf() {
            
    /* if (!$this->is_loggedin)
                return false; */
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/networkconf'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List vouchers
         * -------------
         * returns an array of hotspot voucher objects
         * optional parameter <create_time> = Unix timestamp in seconds
         */
        
    private function stat_voucher($create_time null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode([]);
            if (
    trim($create_time) != null) {
                
    $json json_encode(['create_time' => $create_time]);
            }

            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/voucher''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List payments
         * -------------
         * returns an array of hotspot payments
         * optional parameter <within> = number of hours to go back to fetch payments
         */
        
    private function stat_payment($within null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $url_suffix '';
            if (
    $within != null) {
                
    $url_suffix '?within=' $within;
            }

            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/payment' $url_suffix));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Create hotspot operator
         * -----------------------
         * return true upon success
         * required parameter <name>       = name for the hotspot operator
         * required parameter <x_password> = clear text password for the hotspot operator
         * optional parameter <note>       = note to attach to the hotspot operator
         */
        
    private function create_hotspotop($name$x_password$note null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['name' => $name'x_password' => $x_password];

            
    /**
             * if we have received a value for note, we append it to the payload array to be submitted
             */
            
    if (isset($note))
                
    $json['note'] = trim($note);
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/hotspotop''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * List hotspot operators
         * ----------------------
         * returns an array of hotspot operators
         */
        
    private function list_hotspotop() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/hotspotop'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Create voucher(s)
         * -----------------
         * returns an array of voucher codes (without the dash "-" in the middle) by calling the stat_voucher method
         * required parameter <minutes> = minutes the voucher is valid after activation
         * optional parameter <count>   = number of vouchers to create, default value is 1
         * optional parameter <quota>   = single-use or multi-use vouchers, string value '0' is for multi-use, '1' is for single-use,
         *                                "n" is for multi-use n times
         * optional parameter <note>    = note text to add to voucher when printing
         * optional parameter <up>      = upload speed limit in kbps
         * optional parameter <down>    = download speed limit in kbps
         * optional parameter <MBytes>  = data transfer limit in MB
         */
        
    private function create_voucher($minutes$count 1$quota '0'$note null$up null$down null$MBytes null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['cmd' => 'create-voucher''expire' => $minutes'n' => $count'quota' => $quota];

            
    /**
             * if we have received values for note/up/down/MBytes we append them to the payload array to be submitted
             */
            
    if (isset($note))
                
    $json['note'] = trim($note);
            if (isset(
    $up))
                
    $json['up'] = $up;
            if (isset(
    $down))
                
    $json['down'] = $down;
            if (isset(
    $MBytes))
                
    $json['bytes'] = $MBytes;
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/hotspot''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Revoke voucher
         * --------------
         * return true on success
         * required parameter <voucher_id> = 24 char string; _id of the voucher to revoke
         */
        
    private function revoke_voucher($voucher_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['_id' => $voucher_id'cmd' => 'delete-voucher']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/hotspot''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Extend guest validity
         * ---------------------
         * return true on success
         * required parameter <guest_id> = 24 char string; _id of the guest to extend validity
         */
        
    private function extend_guest_validity($guest_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['_id' => $guest_id'cmd' => 'extend']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/hotspot''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * List port forwarding stats
         * --------------------------
         * returns an array of port forwarding stats
         */
        
    private function list_portforward_stats() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/portforward'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List DPI stats
         * --------------
         * returns an array of DPI stats
         */
        
    private function list_dpi_stats() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/dpi'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List current channels
         * ---------------------
         * returns an array of currently allowed channels
         */
        
    private function list_current_channels() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/current-channel'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List port forwarding settings
         * -----------------------------
         * returns an array of port forwarding settings
         */
        
    private function list_portforwarding() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/portforward'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List dynamic DNS settings
         * -------------------------
         * returns an array of dynamic DNS settings
         */
        
    private function list_dynamicdns() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/dynamicdns'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List port configuration
         * -----------------------
         * returns an array of port configurations
         */
        
    private function list_portconf() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/portconf'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List VoIP extensions
         * --------------------
         * returns an array of VoIP extensions
         */
        
    private function list_extension() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/extension'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List site settings
         * ------------------
         * returns an array of site configuration settings
         */
        
    private function list_settings() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/get/setting'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Adopt a device to the selected site
         * -----------------------------------
         * return true on success
         * required parameter <mac> = device MAC address
         */
        
    private function adopt_device($mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $mac strtolower($mac);
            
    $json json_encode(['mac' => $mac'cmd' => 'adopt']);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Reboot an access point
         * ----------------------
         * return true on success
         * required parameter <mac> = device MAC address
         */
        
    private function restart_ap($mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $mac strtolower($mac);
            
    $json json_encode(['cmd' => 'restart''mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Disable/enable an access point
         * ------------------------------
         * return true on success
         * required parameter <ap_id>   = 24 char string; value of _id for the access point which can be obtained from the device list
         * required parameter <disable> = boolean; true will disable the device, false will enable the device
         *
         * NOTES:
         * - a disabled device will be excluded from the dashboard status and device count and its LED and WLAN will be turned off
         * - appears to only be supported for access points
         * - available since controller versions 5.2.X
         */
        
    private function disable_ap($ap_id$disable) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $this->request_type 'PUT';
            
    $json json_encode(['disabled' => (bool) $disable]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/device/' trim($ap_id), $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Override LED mode for a device
         * ------------------------------
         * return true on success
         * required parameter <device_id>     = 24 char string; value of _id for the device which can be obtained from the device list
         * required parameter <override_mode> = string, off/on/default; "off" will disable the LED of the device,
         *                                      "on" will enable the LED of the device,
         *                                      "default" will apply the site-wide setting for device LEDs
         *
         * NOTES:
         * - available since controller versions 5.2.X
         */
        
    private function led_override($device_id$override_mode) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $this->request_type 'PUT';
            
    $override_mode_options = ['off''on''default'];
            if (
    in_array($override_mode$override_mode_options)) {
                
    $json json_encode(['led_override' => $override_mode]);
                
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/rest/device/' trim($device_id), $json));
                return 
    $this->process_response_boolean($content_decoded);
            }

            return 
    false;
        }

        
    /**
         * Toggle flashing LED of an access point for locating purposes
         * ------------------------------------------------------------
         * return true on success
         * required parameter <mac>    = device MAC address
         * required parameter <enable> = boolean; true will enable flashing LED, false will disable
         *
         * NOTES:
         * replaces the old set_locate_ap() and unset_locate_ap() methods/functions
         */
        
    private function locate_ap($mac$enable) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $mac strtolower($mac);
            
    $cmd = (($enable) ? 'set-locate' 'unset-locate');
            
    $json json_encode(['cmd' => $cmd'mac' => $mac]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Toggle LEDs of all the access points ON or OFF
         * ----------------------------------------------
         * return true on success
         * required parameter <enable> = boolean; true will switch LEDs of all the access points ON, false will switch them OFF
         */
        
    private function site_leds($enable) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['led_enabled' => (bool) $enable]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/set/setting/mgmt''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Set access point radio settings
         * -------------------------------
         * return true on success
         * required parameter <ap_id>
         * required parameter <radio>(default=ng)
         * required parameter <channel>
         * required parameter <ht>(default=20)
         * required parameter <tx_power_mode>
         * required parameter <tx_power>(default=0)
         */
        
    private function set_ap_radiosettings($ap_id$radio$channel$ht$tx_power_mode$tx_power) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['radio_table' => ['radio' => $radio'channel' => $channel'ht' => $ht'tx_power_mode' => $tx_power_mode'tx_power' => $tx_power]]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/device/' trim($ap_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Set guest login settings
         * ------------------------
         * return true on success
         * required parameter <portal_enabled>
         * required parameter <portal_customized>
         * required parameter <redirect_enabled>
         * required parameter <redirect_url>
         * required parameter <x_password>
         * required parameter <expire_number>
         * required parameter <expire_unit>
         * required parameter <site_id>
         *
         * NOTES:
         * - both portal parameters are set to the same value!
         */
        
    private function set_guestlogin_settings(
        
    $portal_enabled$portal_customized$redirect_enabled$redirect_url$x_password$expire_number$expire_unit$site_id
        
    ) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = [
                
    'portal_enabled' => $portal_enabled,
                
    'portal_customized' => $portal_customized,
                
    'redirect_enabled' => $redirect_enabled,
                
    'redirect_url' => $redirect_url,
                
    'x_password' => $x_password,
                
    'expire_number' => $expire_number,
                
    'expire_unit' => $expire_unit,
                
    'site_id' => $site_id
            
    ];
            
    $json json_encode($jsonJSON_UNESCAPED_SLASHES);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/set/setting/guest_access''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Rename access point
         * -------------------
         * return true on success
         * required parameter <ap_id>
         * required parameter <apname>
         */
        
    private function rename_ap($ap_id$apname) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode(['name' => $apname]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/device/' trim($ap_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Add a wlan
         * ----------
         * return true on success
         * required parameter <name>             = string; SSID
         * required parameter <x_passphrase>     = string; new pre-shared key, minimal length is 8 characters, maximum length is 63
         * required parameter <usergroup_id>     = string; user group id that can be found using the list_usergroups() function
         * required parameter <wlangroup_id>     = string; wlan group id that can be found using the list_wlan_groups() function
         * optional parameter <enabled>          = boolean; enable/disable wlan
         * optional parameter <hide_ssid>        = boolean; hide/unhide wlan SSID
         * optional parameter <is_guest>         = boolean; apply guest policies or not
         * optional parameter <security>         = string; security type
         * optional parameter <wpa_mode>         = string; wpa mode (wpa, wpa2, ..)
         * optional parameter <wpa_enc>          = string; encryption (auto, ccmp)
         * optional parameter <vlan_enabled>     = boolean; enable/disable vlan for this wlan
         * optional parameter <vlan>             = string; vlan id
         * optional parameter <uapsd_enabled>    = boolean; enable/disable Unscheduled Automatic Power Save Delivery
         * optional parameter <schedule_enabled> = boolean; enable/disable wlan schedule
         * optional parameter <schedule>         = string; schedule rules
         * -----------------
         * TODO: Check parameter values
         */
        
    private function create_wlan(
        
    $name$x_passphrase$usergroup_id$wlangroup_id$enabled true$hide_ssid false$is_guest false$security 'open'$wpa_mode 'wpa2'$wpa_enc 'ccmp'$vlan_enabled false$vlan null$uapsd_enabled false$schedule_enabled false$schedule = []
        ) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = [
                
    'name' => $name,
                
    'x_passphrase' => $x_passphrase,
                
    'usergroup_id' => $usergroup_id,
                
    'wlangroup_id' => $wlangroup_id,
                
    'enabled' => $enabled,
                
    'hide_ssid' => $hide_ssid,
                
    'is_guest' => $is_guest,
                
    'security' => $security,
                
    'wpa_mode' => $wpa_mode,
                
    'wpa_enc' => $wpa_enc,
                
    'vlan_enabled' => $vlan_enabled,
                
    'uapsd_enabled' => $uapsd_enabled,
                
    'schedule_enabled' => $schedule_enabled,
                
    'schedule' => $schedule,
            ];
            if (!
    is_null($vlan) && $vlan_enabled)
                
    $json['vlan'] = $vlan;
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/add/wlanconf''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Delete a wlan
         * -------------
         * return true on success
         * required parameter <wlan_id> = 24 char string; _id of the wlan that can be found with the list_wlanconf() function
         */
        
    private function delete_wlan($wlan_id) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode([]);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/del/wlanconf/' trim($wlan_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Set wlan settings
         * -----------------
         * return true on success
         * required parameter <wlan_id>
         * required parameter <x_passphrase> = new pre-shared key, minimal length is 8 characters, maximum length is 63,
         *                                     will be ignored if set to null
         * optional parameter <name>
         */
        
    private function set_wlansettings($wlan_id$x_passphrase$name null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = [];
            if (!
    is_null($x_passphrase))
                
    $json['x_passphrase'] = trim($x_passphrase);
            if (!
    is_null($name))
                
    $json['name'] = trim($name);
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/wlanconf/' trim($wlan_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Disable/Enable wlan
         * -------------------
         * return true on success
         * required parameter <wlan_id>
         * required parameter <disable> = boolean; true disables the wlan, false enables it
         */
        
    private function disable_wlan($wlan_id$disable) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $action = ($disable) ? false true;
            
    $json = ['enabled' => (bool) $action];
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/upd/wlanconf/' trim($wlan_id), 'json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * List events
         * -----------
         * returns an array of known events
         * optional parameter <historyhours> = hours to go back, default value is 720 hours
         * optional parameter <start>        = which event number to start with (useful for paging of results), default value is 0
         * optional parameter <limit>        = number of events to return, default value is 3000
         */
        
    private function list_events($historyhours 720$start 0$limit 3000) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['_sort' => '-time''within' => $historyhours'type' => null'_start' => $start'_limit' => $limit];
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/event''json=' $json));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List wireless settings
         * ----------------------
         * returns an array of wireless networks and settings
         */
        
    private function list_wlanconf() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/wlanconf'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * List alarms
         * -----------
         * returns an array of known alarms
         */
        
    private function list_alarms() {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/list/alarm'));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Count alarms
         * ------------
         * returns an array containing the alarm count
         * optional parameter <archived> = boolean; if true all alarms will be counted, if false only non-archived (active) alarms will be counted
         */
        
    private function count_alarms($archived null) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $url_suffix = ($archived === false) ? '?archived=false' null;
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cnt/alarm' $url_suffix));
            return 
    $this->process_response($content_decoded);
        }

        
    /**
         * Upgrade a device to the latest firmware
         * ---------------------------------------
         * return true on success
         * required parameter <device_mac> = MAC address of the device to upgrade
         *
         * NOTES:
         * - updates the device to the latest firmware known to the controller
         */
        
    private function upgrade_device($device_mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['mac' => $device_mac];
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr/upgrade''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Upgrade a device to a specific firmware file
         * --------------------------------------------
         * return true on success
         * required parameter <firmware_url> = URL for the firmware file to upgrade the device to
         * required parameter <device_mac>   = MAC address of the device to upgrade
         *
         * NOTES:
         * - updates the device to the firmware file at the given URL
         * - please take great care to select a valid firmware file for the device!
         */
        
    private function upgrade_device_external($firmware_url$device_mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['url' => $firmware_url'mac' => $device_mac];
            
    $json json_encode($jsonJSON_UNESCAPED_SLASHES);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr/upgrade-external''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Trigger an RF scan by an AP
         * ---------------------------
         * return true on success
         * required parameter <ap_mac> = MAC address of the AP
         */
        
    private function spectrum_scan($ap_mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json = ['cmd' => 'spectrum-scan''mac' => $ap_mac];
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/cmd/devmgr''json=' $json));
            return 
    $this->process_response_boolean($content_decoded);
        }

        
    /**
         * Check the RF scanning state of an AP
         * ------------------------------------
         * returns an object with relevant information (results if available) regarding the RF scanning state of the AP
         * required parameter <ap_mac> = MAC address of the AP
         */
        
    private function spectrum_scan_state($ap_mac) {
            if (!
    $this->is_loggedin)
                return 
    false;
            
    $json json_encode($json);
            
    $content_decoded json_decode($this->exec_curl($this->baseURL '/api/s/' $this->site '/stat/spectrum-scan/' trim($ap_mac)));
            return 
    $this->process_response($content_decoded);
        }

        
    /*     * **************************************************************
         * "Aliases" for deprecated functions from here, to support
         * backward compatibility:
         * ************************************************************** */

        /**
         * List access points and other devices under management of the controller (USW and/or USG devices)
         * ------------------------------------------------------------------------------------------------
         * returns an array of known device objects (or a single device when using the <device_mac> parameter)
         * optional parameter <device_mac> = the MAC address of a single device for which the call must be made
         *
         * NOTE:
         * changed function/method name to fit it's purpose
         */
        
    private function list_aps($device_mac null) {
            return 
    $this->list_devices($device_mac);
        }

        
    /**
         * Start flashing LED of an access point for locating purposes
         * -----------------------------------------------------------
         * return true on success
         * required parameter <mac> = device MAC address
         */
        
    private function set_locate_ap($mac) {
            
    trigger_error(
                    
    'Function set_locate_ap() has been deprecated, use locate_ap() instead.'E_USER_DEPRECATED
            
    );
            return 
    $this->locate_ap($mactrue);
        }

        
    /**
         * Stop flashing LED of an access point for locating purposes
         * ----------------------------------------------------------
         * return true on success
         * required parameter <mac> = device MAC address
         */
        
    private function unset_locate_ap($mac) {
            
    trigger_error(
                    
    'Function unset_locate_ap() has been deprecated, use locate_ap() instead.'E_USER_DEPRECATED
            
    );
            return 
    $this->locate_ap($macfalse);
        }

        
    /**
         * Switch LEDs of all the access points ON
         * ---------------------------------------
         * return true on success
         */
        
    private function site_ledson() {
            
    trigger_error(
                    
    'Function site_ledson() has been deprecated, use site_leds() instead.'E_USER_DEPRECATED
            
    );
            return 
    $this->site_leds(true);
        }

        
    /**
         * Switch LEDs of all the access points OFF
         * ----------------------------------------
         * return true on success
         */
        
    private function site_ledsoff() {
            
    trigger_error(
                    
    'Function site_ledsoff() has been deprecated, use site_leds() instead.'E_USER_DEPRECATED
            
    );
            return 
    $this->site_leds(false);
        }

        
    /*     * **************************************************************
         * Internal (private) functions from here:
         * ************************************************************** */

        /**
         * Process regular responses where output is the content of the data array
         */
        
    private function process_response($response) {
            
    $this->last_results_raw $response;
            if (isset(
    $response->meta->rc)) {
                if (
    $response->meta->rc === 'ok') {
                    
    $this->last_error_message null;
                    if (
    is_array($response->data)) {
                        return 
    $response->data;
                    }

                    return 
    true;
                } elseif (
    $response->meta->rc === 'error') {
                    
    /**
                     * we have an error; set latest_error_message if we have a message
                     */
                    
    if (isset($response->meta->msg)) {
                        
    $this->last_error_message $response->meta->msg;
                    }

                    if (
    $this->debug) {
                        
    error_log('Last error message: ' $this->last_error_message);
                    }
                }
            }

            return 
    false;
        }

        
    /**
         * Process responses where output should be boolean (true/false)
         */
        
    private function process_response_boolean($response) {
            
    $this->last_results_raw $response;
            if (isset(
    $response->meta->rc)) {
                if (
    $response->meta->rc === 'ok') {
                    
    $this->last_error_message null;
                    return 
    true;
                } elseif (
    $response->meta->rc === 'error') {
                    
    /**
                     * we have an error:
                     * set latest_error_message if the returned error message is available
                     */
                    
    if (isset($response->meta->msg)) {
                        
    $this->last_error_message $response->meta->msg;
                    }

                    if (
    $this->debug) {
                        
    error_log('Last error message: ' $this->last_error_message);
                    }
                }
            }

            return 
    false;
        }

        
    /**
         * Execute the cURL request
         */
        
    private function exec_curl($url$data '') {
            
    $this->ch $this->get_curl_obj();
            
    curl_setopt($this->chCURLOPT_URL$url);

            if (
    trim($data) != '') {
                
    curl_setopt($this->chCURLOPT_POSTFIELDS$data);
                if (
    $this->request_type === 'PUT') {
                    
    curl_setopt($this->chCURLOPT_HTTPHEADER, ['Content-Type: application/json''Content-Length: ' strlen($data)]);
                    
    curl_setopt($this->chCURLOPT_CUSTOMREQUEST'PUT');
                } else {
                    
    curl_setopt($this->chCURLOPT_HTTPHEADER, ['Content-Type: application/json']);
                }
            } else {
                
    curl_setopt($this->chCURLOPT_POSTfalse);
                if (
    $this->request_type === 'DELETE') {
                    
    curl_setopt($this->chCURLOPT_CUSTOMREQUEST'DELETE');
                }
            }

            if ((
    $content curl_exec($this->ch)) === false) {
                
    error_log('cURL error: ' curl_error($this->ch));
            }

            if (
    $this->debug) {
                print 
    '<pre>';
                print 
    PHP_EOL '---------cURL INFO-----------' PHP_EOL;
                
    print_r(curl_getinfo($this->ch));
                print 
    PHP_EOL '-------URL & PAYLOAD---------' PHP_EOL;
                print 
    $url PHP_EOL;
                print 
    $data;
                print 
    PHP_EOL '----------RESPONSE-----------' PHP_EOL;
                print 
    $content;
                print 
    PHP_EOL '-----------------------------' PHP_EOL;
                print 
    '</pre>';
            }

            
    curl_close($this->ch);
            return 
    $content;
        }

        
    /**
         * get the cURL object
         */
        
    private function get_curl_obj() {
            
    $this->ch curl_init();
            
    curl_setopt($this->chCURLOPT_POSTtrue);
            
    curl_setopt($this->chCURLOPT_SSL_VERIFYPEERfalse);
            
    curl_setopt($this->chCURLOPT_SSL_VERIFYHOSTfalse);
            
    curl_setopt($this->chCURLOPT_RETURNTRANSFERtrue);

            if (
    $this->debug) {
                
    curl_setopt($this->chCURLOPT_VERBOSEtrue);
            }

            if (
    $this->cookies != '') {
                
    curl_setopt($this->chCURLOPT_COOKIESESSIONtrue);
                
    curl_setopt($this->chCURLOPT_COOKIE$this->cookies);
            }

            return 
    $this->ch;
        }

        private function 
    maskUmlaute($text) {
            
    $text str_replace("ä""a"$text);
            
    $text str_replace("Ä""AE"$text);
            
    $text str_replace("ö""oe"$text);
            
    $text str_replace("Ö""OE"$text);
            
    $text str_replace("ü""ue"$text);
            
    $text str_replace("Ü""UE"$text);
            
    $text str_replace("ß""ss"$text);
            
    $text str_replace(" ""_"$text);
            
    $text str_replace("(""_"$text);
            
    $text str_replace(")""_"$text);
            
    $text str_replace("&""_"$text);
            
    $text str_replace("§""_"$text);
            
    $text str_replace("/""_"$text);
            
    $text str_replace("=""_"$text);
            
    $text str_replace("{""_"$text);
            
    $text str_replace("}""_"$text);
            
    $text str_replace(":""_"$text);
            
    $text str_replace(",""_"$text);
            
    $text str_replace(";""_"$text);

            return 
    $text;
        }

        private function 
    CreateCategoryByIdent($id$ident$name) {
            
    $cid = @IPS_GetObjectIDByIdent($this->maskUmlaute($ident), $id);
            if (
    $cid === false) {
                
    $cid IPS_CreateCategory();
                
    IPS_SetParent($cid$id);
                
    IPS_SetName($cid$name);
                
    IPS_SetIdent($cid$this->maskUmlaute($ident));
            }
            else
            {
                
    IPS_SetName($cid$name);
            }
            return 
    $cid;
        }

        private function 
    SetVariable($VarID$Type$Value) {
            switch (
    $Type) {
                case 
    0// boolean
                    
    SetValueBoolean($VarID$Value);
                    break;
                case 
    1// integer
                    
    SetValueInteger($VarID$Value);
                    break;
                case 
    2// float
                    
    SetValueFloat($VarID$Value);
                    break;
                case 
    3// string
                    
    SetValueString($VarID$Value);
                    break;
            }
        }

        private function 
    CalculateRate($Name$AktValue$Ident ''$ParentID 0) {
            
    $rate=0;
            
    $this->SendDebug("getVariableValue""Ident ist: " $Ident0);
            if (
    '' != $Ident) {
                
    $VarID = @IPS_GetObjectIDByIdent($Ident$ParentID);
                if (
    false !== $VarID) {
                    
    $this->SendDebug("getVariableValue""VarID ist: " $VarID0);
                    
    $v IPS_GetVariable($VarID);
                    
    $this->SendDebug("getVariableValue""letztes Update: " .date("d.m.y H:i"$v['VariableUpdated']),0);
                    
    $this->SendDebug("getVariableValue""letzter Wert: " $v['VariableValue'],0);
                    
    $this->SendDebug("getVariableValue""aktueller Wert: " $AktValue,0);
                    
    $this->SendDebug("getVariableValue""aktuelle Zeit: " time(),0);
                    
                    
    //Ueberlauf/Zuruecksetzen Downloadzaehler abfangen
                    
    if ($AktValue>$v['VariableValue']){
                        
    $timediff=$v['VariableUpdated']-time();
                        
    $datendiff=($v['VariableValue']-$AktValue)*8;
                        
    $rate=round($datendiff/$timediff);
                        
    $this->SendDebug("getVariableValue""Downloadrate: " $rate,0);
                    }
                }
            }
            return 
    $rate;
        }
        
        private function 
    CreateScriptByName($ScriptNAME$ParentID$ScriptTEXT$SetHidden TRUE)
        {
            
    $ScriptID = @IPS_GetScriptIDByName($ScriptNAME$ParentID);
            if (
    $ScriptID === false){

               
    $ScriptID IPS_CreateScript(0);
               
    IPS_SetName($ScriptID$ScriptNAME);
               
    IPS_SetParent($ScriptID$ParentID);
               
    IPS_SetInfo($ScriptID"This script was created by: #".$_IPS['SELF']."#");
               
    IPS_SetHidden($ScriptID$SetHidden);
               
    IPS_SetScriptContent($ScriptID$ScriptTEXT);
               return 
    $ScriptID;
            }
            
    IPS_SetScriptContent($ScriptID$ScriptTEXT);
            return 
    $ScriptID;   
        }
        
        private function 
    SetEventByName($triggervariableID$scriptid$name$eventtype$triggervalue)
        {
            
    $eid = @IPS_GetEventIDByName($name$scriptid);
            if(
    $eid === false)
            {
                
    $eid IPS_CreateEvent(0);                                    //Ausgelöstes Ereignis
                
    IPS_SetEventTrigger($eid$eventtype$triggervariableID);    //Event-Typ festlegen (Aktualisierung, Änderung etc.)
                
    if ($eventtype >= 2IPS_SetEventTriggerValue($eid$triggervalue);
                
    IPS_SetParent($eid$scriptid);
                
    IPS_SetName($eid$name);
                
    IPS_SetInfo($eid"this event was created by script #".$_IPS['SELF']);
                
    IPS_SetEventActive($eidtrue);
            }
            return 
    $eid;
        }

        private function 
    CreateVariable($Name$Type$Value$Ident ''$ParentID 0$profile "") {
            
    //echo "CreateVariable: (Name:".$Name.", Type:".$Type.", Value:".$Value.", Ident:".$Ident.", Parent:".$ParentID.") \n";
            
    if ('' != $Ident) {
                
    $VarID = @IPS_GetObjectIDByIdent($Ident$ParentID);
                if (
    false !== $VarID) {
                    
    IPS_SetVariableCustomProfile($VarID$profile);
                    
    $this->SetVariable($VarID$Type$Value);
                    return;
                }
            }
            
    $VarID = @IPS_GetObjectIDByName($Name$ParentID);
            
    //echo "GetObjectIDByName: ".$Name.", ".$ParentID."\n";
            
    if (false !== $VarID) { // exists?
                
    $Obj IPS_GetObject($VarID);
                if (
    == $Obj['ObjectType']) { // is variable?
                    
    $Var IPS_GetVariable($VarID);
                    if (
    $Type == $Var['VariableValue']['ValueType']) {
                        
    IPS_SetVariableCustomProfile($VarID$profile);
                        
    $this->SetVariable($VarID$Type$Value);
                        return;
                    }
                }
            }
            
    $VarID IPS_CreateVariable($Type);
            
    IPS_SetParent($VarID$ParentID);
            
    IPS_SetName($VarID$Name);
            if(
    $profile != "")
            {
                
    IPS_SetVariableCustomProfile($VarID$profile);
            }
            if (
    '' != $Ident) {
                
    IPS_SetIdent($VarID$Ident);
            }
            
    $this->SetVariable($VarID$Type$Value);
        }

        private function 
    GetWLANclients($instance_Clients_ID$instance_Clients_Presence_ID$instance_Clients_PresenceWLAN_ID) {
            
    $clientList $this->list_clients();

            if (
    is_object($this->last_results_raw)) {
                foreach (
    $this->last_results_raw->data as $client) { 
                    if(
    $client->is_wired === FALSE)
                    {
                        if(!isset(
    $client->hostname) AND isset($client->name))
                        {
                            
    $client->hostname $client->name;
                        }
                        if(!isset(
    $client->name) AND isset($client->hostname))
                        {
                            
    $client->name $client->hostname;
                        }
                        if(!isset(
    $client->name) AND !isset($client->hostname))
                        {
                            
    $client->name $client->mac;
                            
    $client->hostname $client->mac;
                        }   
                        if(!isset(
    $client->ip))
                        {
                            
    $client->ip "n/a";
                        }                     
                        
    $ident str_replace(":"""$client->mac);
                        
    $ident str_replace("-"""$ident);
                        
    $catID $this->CreateCategoryByIdent($instance_Clients_ID$ident "_name"$client->name);
                        if (isset(
    $client->mac)) $this->CreateVariable("MAC"3$client->mac$ident "_mac"$catID);
                        if (isset(
    $client->ap_mac)) $this->CreateVariable("Accesspoint MAC"3$client->ap_mac$ident "_ap_mac"$catID);
                        if (isset(
    $client->ip)) $this->CreateVariable("IP"3$client->ip$ident "_ip"$catID);
                        if (isset(
    $client->hostname)) $this->CreateVariable("Hostname"3$client->hostname$ident "_hostname"$catID);
                        if (isset(
    $client->signal)) $this->CreateVariable("Signal"1$client->signal$ident "_signal"$catID);
                        if (isset(
    $client->radio)) $this->CreateVariable("Radio"3$client->radio$ident "_radio"$catID);
                        
    //Downloadrate berechnen
                        
    if (isset($client->tx_bytes)) $txrate=$this->CalculateRate("TX Bytes"$client->tx_bytes$ident "_txbytes"$catID);
                        
    //Erste danach die aktuellen Werte eintragen
                        
    if (isset($client->tx_bytes)) $this->CreateVariable("TX Bytes"1$client->tx_bytes$ident "_txbytes"$catID);
                        if (isset(
    $client->rx_bytes)) $this->CreateVariable("RX Bytes"1$client->rx_bytes$ident "_rxbytes"$catID);
                        if (isset(
    $client->uptime)) $this->CreateVariable("Uptime"1$client->uptime$ident "_uptime"$catID"~UnixTimestampTime");
                        if (isset(
    $client->last_seen))
                        {
                            
    $this->CreateVariable("Last Seen"1$client->last_seen$ident "_last_seen"$catID"~UnixTimestamp");
                            
    $var_now time();
                            
    $var_timedifference = ($var_now $client->last_seen)/60//vergangene Minuten seit letztem Kontakt
                            
    if ($var_timedifference <= 30)
                            {
                                
    $this->ClientArrayOnline[] = $ident;
                                
    $this->ClientArrayOnlineWLAN[] = $ident;
                            }
                        }
                        else
                        {
                            
    $this->ClientArrayOnline[] = $ident;
                            
    $this->ClientArrayOnlineWLAN[] = $ident;
                        }
                        if (isset(
    $client->_last_seen_by_usw))
                        {
                            
    $this->CreateVariable("Last Seen by USG"1$client->_last_seen_by_usw$ident "_last_seen_usw"$catID"~UnixTimestamp");
                            
    $var_now time();
                            
    $var_timedifference = ($var_now $client->_last_seen_by_usw)/60//vergangene Minuten seit letztem Kontakt
                            
    if ($var_timedifference <= 30)
                            {
                                
    $this->ClientArrayOnline[] = $ident;
                                
    $this->ClientArrayOnlineWLAN[] = $ident;
                            }
                        }
                        else
                        {
                            
    $this->ClientArrayOnline[] = $ident;
                            
    $this->ClientArrayOnlineWLAN[] = $ident;
                        }                   
                        if (isset(
    $client->first_seen)) $this->CreateVariable("First Seen"1$client->first_seen$ident "_first_seen"$catID"~UnixTimestamp");
                        if (isset(
    $client->uptime)) $this->CreateVariable("Uptime"1$client->uptime$ident "_uptime"$catID"~UnixTimestampTime");
                        if (isset(
    $txrate)) $this->CreateVariable("Downloadrate"1$txrate$ident "_txrate"$catID);
                    }
                }
            }       
        }

        private function 
    GetLANclients($instance_Clients_ID$instance_Clients_Presence_ID$instance_Clients_PresenceLAN_ID) {
            if (
    $this->is_loggedin == true)
            {        
                
    $clientList $this->list_clients();

                if (
    is_object($this->last_results_raw)) {
                    foreach (
    $this->last_results_raw->data as $client) { 
                        if(
    $client->is_wired === TRUE)
                        {
                            if(!isset(
    $client->hostname) AND isset($client->name))
                            {
                                
    $client->hostname $client->name;
                            }
                            if(!isset(
    $client->name) AND isset($client->hostname))
                            {
                                
    $client->name $client->hostname;
                            }
                            if(!isset(
    $client->name) AND !isset($client->hostname))
                            {
                                
    $client->name $client->mac;
                                
    $client->hostname $client->mac;
                            }
                            if(!isset(
    $client->ip))
                            {
                                
    $client->ip "0.0.0.0";
                            }  
                            if(!isset(
    $client->{'wired-tx_bytes'}))
                            {
                                
    $client->{'wired-tx_bytes'} = 0;
                            }  
                            if(!isset(
    $client->{'wired-rx_bytes'}))
                            {
                                
    $client->{'wired-rx_bytes'} = 0;
                            }  
                            
    $ident str_replace(":"""$client->mac);
                            
    $ident str_replace("-"""$ident);
                            
    $catID $this->CreateCategoryByIdent($instance_Clients_ID$ident "_name"$client->name);
                            
    $this->CreateVariable("MAC"3$client->mac$ident "_mac"$catID);
                            
    $this->CreateVariable("IP"3$client->ip$ident "_ip"$catID);
                            
    $this->CreateVariable("Hostname"3$client->hostname$ident "_hostname"$catID);
                            if (!isset(
    $client->tx_bytes) AND isset($client->{'wired-tx_bytes'})) $client->tx_bytes $client->{'wired-tx_bytes'}; 
                            if (!isset(
    $client->rx_bytes) AND isset($client->{'wired-rx_bytes'})) $client->rx_bytes $client->{'wired-rx_bytes'};                  
                            
    $this->CreateVariable("TX Bytes"1$client->tx_bytes$ident "_txbytes"$catID);
                            
    $this->CreateVariable("RX Bytes"1$client->rx_bytes$ident "_rxbytes"$catID);
                            
    $this->CreateVariable("Uptime"1$client->uptime$ident "_uptime"$catID"~UnixTimestampTime");
                            if (isset(
    $client->last_seen))
                            {
                                
    $this->CreateVariable("Last Seen"1$client->last_seen$ident "_last_seen"$catID"~UnixTimestamp");
                                
    $var_now time();
                                
    $var_timedifference = ($var_now $client->last_seen)/60//vergangene Minuten seit letztem Kontakt
                                
    if ($var_timedifference <= 30)
                                {
                                    
    $this->ClientArrayOnline[] = $ident;
                                    
    $this->ClientArrayOnlineLAN[] = $ident;
                                }
                            }
                            else
                            {
                                
    $this->ClientArrayOnline[] = $ident;
                                
    $this->ClientArrayOnlineLAN[] = $ident;
                            }   
                            if (isset(
    $client->_last_seen_by_usw))
                            {
                                
    $this->CreateVariable("Last Seen by USG"1$client->_last_seen_by_usw$ident "_last_seen_usw"$catID"~UnixTimestamp");
                                
    $var_now time();
                                
    $var_timedifference = ($var_now $client->_last_seen_by_usw)/60//vergangene Minuten seit letztem Kontakt
                                
    if ($var_timedifference <= 30)
                                {
                                    
    $this->ClientArrayOnline[] = $ident;
                                    
    $this->ClientArrayOnlineLAN[] = $ident;
                                }
                            }
                            else
                            {
                                
    $this->ClientArrayOnline[] = $ident;
                                
    $this->ClientArrayOnlineLAN[] = $ident;
                            }                           
                        }
                    }
                }       
            }  
    }

        private function 
    CheckPresence($instance_Clients_Presence_ID$instance_Clients_PresenceLAN_ID$instance_Clients_PresenceWLAN_ID) {
            if (
    $this->is_loggedin == true)
            {
                if (
    count($this->ClientArray) != 0)
                {
                    foreach(
    $this->ClientArray as $obj) {
                        
    $varClientMAC $obj->varDeviceMAC;
                        
    $varClientMAC str_replace(":"""$varClientMAC);
                        
    $varClientMAC str_replace("-"""$varClientMAC);
                        
    //setvalue(53957, count($this->ClientArrayOnline));
                            //print_r($this->ClientArrayOnline);
                        //$varClientMAC = "2e:ed:d9:7d:21:5d";
    //print_r($this);
                        
    if (property_exists($this'ClientArrayOnline'))
                        {
                            if (
    in_array($varClientMAC$this->ClientArrayOnlineTRUE))
                            {
    //echo $varClientMAC."\n";
                        
    $varOnlineID $this->CreateVariable($obj->varDeviceName0TRUE$varClientMAC "_presence"$instance_Clients_Presence_ID"~Presence");
                            }
                            else
                                
    $varOnlineID $this->CreateVariable($obj->varDeviceName0FALSE$varClientMAC "_presence"$instance_Clients_Presence_ID"~Presence");
                        }
                        if (
    property_exists($this'ClientArrayOnlineLAN'))
                        {
                            if (
    in_array($varClientMAC$this->ClientArrayOnlineLANTRUE))
                            {
                                
    $varOnlineID $this->CreateVariable($obj->varDeviceName0TRUE$varClientMAC "_presenceLAN"$instance_Clients_PresenceLAN_ID"~Presence");
                            }
                            else
                                
    $varOnlineID $this->CreateVariable($obj->varDeviceName0FALSE$varClientMAC "_presenceLAN"$instance_Clients_PresenceLAN_ID"~Presence");
                        }    
                        if (
    property_exists($this'ClientArrayOnlineWLAN'))
                        {
                            if (
    in_array($varClientMAC$this->ClientArrayOnlineWLANTRUE))
                            {
                                
    $varOnlineID $this->CreateVariable($obj->varDeviceName0TRUE$varClientMAC "_presenceWLAN"$instance_Clients_PresenceWLAN_ID"~Presence");
                            }
                            else
                                
    $varOnlineID $this->CreateVariable($obj->varDeviceName0FALSE$varClientMAC "_presenceWLAN"$instance_Clients_PresenceWLAN_ID"~Presence");
                        }                    
                    }
                }
            }
        }

        private function 
    GetWLANnetworks($instance_WLAN_ID) {
            if (
    $this->is_loggedin == true)
            {
                
    $wlanList $this->list_wlanconf();

                
    $ScriptTEXT '<?php

    $controlId = $_IPS[\'VARIABLE\'];
    $value = $_IPS[\'VALUE\'];

    // WLAN-Name
    $start = stripos(IPS_GetName($controlId), "[") + 1;
    $end = stripos(IPS_GetName($controlId), "]");
    $wlanName = substr(IPS_GetName($controlId), $start, $end-$start);

    $wlanId = GetValue(IPS_GetVariableIDByName("ID", IPS_GetCategoryIDByName($wlanName, IPS_GetParent($_IPS[\'SELF\']))));

    if($value)
    {
        // on
        UniFi_SetWLANMode('
    .$this->InstanceID.', $wlanId."_enabledSET", TRUE); 
    }
    else
    {
        // off
        UniFi_SetWLANMode('
    .$this->InstanceID.', $wlanId."_enabledSET", FALSE);
    }

    ?>'
    ;    
            
    $actionId $this->CreateScriptByName("switchWlanMode"$instance_WLAN_ID$ScriptTEXT$SetHidden TRUE);

                if (
    is_object($this->last_results_raw)) {
                    foreach (
    $this->last_results_raw->data as $wlan) {
                        
    $ident $wlan->_id;
                        
    $catID $this->CreateCategoryByIdent($instance_WLAN_ID$ident$wlan->name);
                        
    $this->CreateVariable("ID"3$wlan->_id$ident "_id"$catID);
                        
    $this->CreateVariable("Enabled"0$wlan->enabled$ident "_enabled"$catID"Schalter");
                        
    $this->RegisterVariableBoolean($ident "_enabledSET""WLAN [".$wlan->name."]""Schalter");
                        
    IPS_SetInfo($this->GetIDForIdent($ident "_enabledSET"), $ident);
                        
    IPS_SetVariableCustomAction($this->GetIDForIdent($ident "_enabledSET"), $actionId);
                        
    $this->CreateVariable("Security"3$wlan->security$ident "_security"$catID);
                    }
                } 
            }
        }

        private function 
    GetLANnetworks($instance_LAN_ID) {
            if (
    $this->is_loggedin == true)
            {
                
    $lanList $this->list_networkconf();

                if (
    is_object($this->last_results_raw)) {
                    foreach (
    $this->last_results_raw->data as $lan) {
                        
    $this->SendDebug("LAN""Name: ".$lan->name0);
                        
    $this->SendDebug("LAN""Enabled: ".isset($lan->enabled),0);
                        
    $ident $lan->_id;
                        
    $catID $this->CreateCategoryByIdent($instance_LAN_ID$ident$lan->name);
                        
    $this->CreateVariable("ID"3$lan->_id$ident "_id"$catID);
                        if (isset(
    $lan->enabled)) $this->CreateVariable("Enabled"0$lan->enabled$ident "_enabled"$catID);
                        if (isset(
    $lan->vlan))    $this->CreateVariable("VLAN",    1intval($lan->vlan), $ident "_vlan"$catID);
                    }
                } 
            }
        }  

        private function 
    GetUnifi_Devices($instance_APS_ID) {
            if (
    $this->is_loggedin == true)
            {
                
    $apList $this->list_devices();

                if (
    is_object($this->last_results_raw)) {
                    foreach (
    $this->last_results_raw->data as $aps) {
                        
    $ident $aps->_id;
                        
    $catID $this->CreateCategoryByIdent($instance_APS_ID$ident$aps->name);
                        
    $this->CreateVariable("ID"3$aps->_id$ident "_id"$catID);
                        
    $this->CreateVariable("Uptime"1$aps->uptime$ident "_uptime"$catID"~UnixTimestampTime");
                        if (isset(
    $aps->ip)) $this->CreateVariable("IP"3$aps->ip$ident "_ip"$catID);     
                        if (isset(
    $aps->hostname)) $this->CreateVariable("Hostname"3$aps->hostname$ident "_hostname"$catID); 
                        if (isset(
    $aps->upgradable)) $this->CreateVariable("Firmwareupdate available"0$aps->upgradable$ident "_upgradable"$catID); 
                    }
                } 
            }
        }    

        public function 
    SetWLANMode($Ident$Value)
        {
            
    $this->baseURL $this->ReadPropertyString("IPAddress");
            
    $this->user $this->ReadPropertyString("UserName");
            
    $this->password $this->ReadPropertyString("UserPassword");
            
    $this->site $this->ReadPropertyString("Site");
            
    $this->version '5.4.16';
            
    $this->checkIntervalNetwork $this->ReadPropertyInteger("Intervall_Network");
            
    $this->checkIntervalClient $this->ReadPropertyInteger("Intervall_Client");
            
    $this->debug $this->ReadPropertyBoolean("Debug");
            
    $this->Login();
            
    $ChangeNetworkIdent $this->GetIDForIdent($Ident);
            
    $ChangeNetworkID    IPS_GetObject($ChangeNetworkIdent)["ObjectInfo"];
            
    $ChangeNetwork $this->disable_wlan($ChangeNetworkID, !$Value);
            if ( 
    $ChangeNetwork == TRUE)
            {
                
    SetValue($this->GetIDForIdent($Ident), $Value);
                
    $this->UpdateUniFiNetworkData();
                throw new 
    Exception("Valid Network-ID: ".$ChangeNetworkID);
            }
            else
            {
                throw new 
    Exception("Invalid Network-ID: ".$ChangeNetworkID);
            }
        }
        
        public function 
    RequestAction($Ident$Value)
        {
            throw new 
    Exception("Network-ID: ".$ChangeNetworkID);
            
    $this->SetWLANMode($Identboolval($Value));
        }    

        public function 
    ApplyChanges() {
            
    //Never delete this line!
            
    parent::ApplyChanges();

            
    $this->baseURL $this->ReadPropertyString("IPAddress");
            
    $this->user $this->ReadPropertyString("UserName");
            
    $this->password $this->ReadPropertyString("UserPassword");
            
    $this->site $this->ReadPropertyString("Site");
            
    $this->version '5.4.16';
            
    $this->checkIntervalNetwork $this->ReadPropertyInteger("Intervall_Network");
            
    $this->checkIntervalClient $this->ReadPropertyInteger("Intervall_Client");
            
    $this->debug $this->ReadPropertyBoolean("Debug");

            
    $this->SetTimerInterval("Intervall_Network", ($this->ReadPropertyInteger("Intervall_Network") * 1000));
            
    $this->SetTimerInterval("Intervall_Client", ($this->ReadPropertyInteger("Intervall_Client") * 1000));

            
    # create neccessary folders
            
    $instance_id_parent $this->InstanceID;
            
    $instance_Clients_ID $this->CreateCategoryByIdent($instance_id_parent"Clients""Clients");
            
    $instance_WLAN_ID $this->CreateCategoryByIdent($instance_id_parent"WLAN""WLAN");
            
    $instance_LAN_ID  $this->CreateCategoryByIdent($instance_id_parent"LAN""LAN");
            
    $instance_APS_ID  $this->CreateCategoryByIdent($instance_id_parent"UniFiDevices""UniFi-Devices");

            
    $this->UpdateUniFiNetworkData();
            
    $this->UpdateUniFiClientData();
        }

        public function 
    UpdateUniFiNetworkData() {
            
    $this->baseURL $this->ReadPropertyString("IPAddress");
            
    $this->user $this->ReadPropertyString("UserName");
            
    $this->password $this->ReadPropertyString("UserPassword");
            
    $this->site $this->ReadPropertyString("Site");
            
    $this->version '5.4.16';
            
    $this->checkIntervalNetwork $this->ReadPropertyInteger("Intervall_Network");
            
    $this->checkIntervalClient $this->ReadPropertyInteger("Intervall_Client");
            
    $this->debug $this->ReadPropertyBoolean("Debug");
            
    $this->Login();

            
    # create neccessary folders
            
    $instance_id_parent $this->InstanceID;
            
    $instance_WLAN_ID $this->CreateCategoryByIdent($instance_id_parent"WLAN""WLAN");
            
    $instance_LAN_ID  $this->CreateCategoryByIdent($instance_id_parent"LAN""LAN");
            
    $instance_APS_ID  $this->CreateCategoryByIdent($instance_id_parent"UniFiDevices""UniFi-Devices");

            
    $this->GetWLANnetworks($instance_WLAN_ID);
            
    $this->GetLANnetworks($instance_LAN_ID);
            
    $this->GetUnifi_Devices($instance_APS_ID);
            
    $this->Logout();
        }

        public function 
    UpdateUniFiClientData() {
            
    $this->baseURL $this->ReadPropertyString("IPAddress");
            
    $this->user $this->ReadPropertyString("UserName");
            
    $this->password $this->ReadPropertyString("UserPassword");
            
    $this->site $this->ReadPropertyString("Site");
            
    $this->version '5.4.16';
            
    $this->checkIntervalNetwork $this->ReadPropertyInteger("Intervall_Network");
            
    $this->checkIntervalClient $this->ReadPropertyInteger("Intervall_Client");
            
    $this->debug $this->ReadPropertyBoolean("Debug");
            
    $this->ClientArray json_decode($this->ReadPropertyString("Clients"));
            
    $this->Login();

            
    # create neccessary folders
            
    $instance_id_parent $this->InstanceID;
            
    $instance_Clients_ID $this->CreateCategoryByIdent($instance_id_parent"Clients""Clients");
            
    $instance_Clients_Wireless_ID $this->CreateCategoryByIdent($instance_Clients_ID"Wireless""Wireless");
            
    $instance_Clients_LAN_ID $this->CreateCategoryByIdent($instance_Clients_ID"LAN""LAN");
            
    $instance_Clients_Presence_ID     $this->CreateCategoryByIdent($instance_Clients_ID"Presence""_Presence");
            
    $instance_Clients_PresenceLAN_ID  $this->CreateCategoryByIdent($instance_Clients_ID"Presence: LAN""_PresenceLAN");
            
    $instance_Clients_PresenceWLAN_ID $this->CreateCategoryByIdent($instance_Clients_ID"Presence: WLAN""_PresenceWLAN");

            
    $this->GetWLANclients($instance_Clients_Wireless_ID$instance_Clients_Presence_ID$instance_Clients_PresenceWLAN_ID);
            
    $this->GetLANclients($instance_Clients_LAN_ID$instance_Clients_Presence_ID$instance_Clients_PresenceLAN_ID);
            
    $this->CheckPresence($instance_Clients_Presence_ID$instance_Clients_PresenceLAN_ID$instance_Clients_PresenceWLAN_ID);
            
    $this->Logout();
        }

    }

    ?>
    Geändert von kronos (02.12.20 um 10:16 Uhr)
    Grüsse, Kronos.
    Wenn am Anfang alles schief geht, nenne es Version 1.0
    IPS 5.5 auf Server 2016 / HM und HM-IP mit CCU2 (RaspberryMatic) + LAN-Adapter + LAN- & Wired Gateway, 252 Geräte / XBee Pro (Roomba) / RoboRock S50 / RGB-W 868 / MiLight / EKM 868 / AKM / ein Rudel Squeezeboxen+Pi / EM24DIN+VS102 / AM 220 AC / Shelly / VU+ / ALL4x00 / LevelJet / IRTRans / Echos diverse / Harmony / Sainlogic / viel zu wenig Zeit


    Einfach mal rein schauen: IPS-Chat

  2. #192
    Registriert seit
    Jan 2008
    Beiträge
    233

    Hallo Kronos,

    lieben Dank, das war es aber scheinbar noch nicht:
    Code:
    02.12.2020, 19:00:31 | TimerPool            | UniFi (Intervall_Client): <br />
    <b>Notice</b>:  Trying to access array offset on value of type bool in <b>C:\ProgramData\Symcon\modules\MK_UniFi\UniFi\module.php</b> on line <b>1741</b><br />
    Tom

Ähnliche Themen

  1. Buderus Logamatic Web KM200 - Reloaded
    Von Slash im Forum Haustechnik
    Antworten: 439
    Letzter Beitrag: 28.10.20, 16:26
  2. Ubiquiti - Unifi Video
    Von Spoosie im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 20
    Letzter Beitrag: 23.04.20, 20:38
  3. UniFi Modul
    Von Spoosie im Forum PHP-Module
    Antworten: 66
    Letzter Beitrag: 01.08.17, 09:00
  4. Ubiquiti - Unifi AP ClientListe
    Von Spoosie im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 64
    Letzter Beitrag: 26.12.15, 10:29
  5. Regenmengenproblem reloaded !
    Von guyabano im Forum Sonstige Funkkomponenten / Wetterstationen
    Antworten: 2
    Letzter Beitrag: 02.11.06, 07:03

Stichworte