Cacti - How to graph CCQ on Ubiquiti devices

As you probably already know the CCQ value is not available via SNMP (AirOS 5.5.2) but of course it doesn't mean it can't be graphed using Cacti. To graph CCQ on Ubiquiti devices you just need to use simple script to read desired value using web interface.

First step

Create read only user with password on Ubiquiti devices. This step is important for security reasons as it will be used in the script to read CCQ value.

Second step

Create ubiquiti_ccq.pl script in cacti scripts directory and replace USER and PASS with values defined in previous step.

#!/usr/bin/perl

use strict;
#use warnings;

use LWP::UserAgent;
use HTTP::Cookies;
use JSON;

if (($#ARGV+1) ne 1) {
 exit();
}

my $host = $ARGV[0];
my $cookie_jar = HTTP::Cookies->new();
my $browser  = LWP::UserAgent->new();
my $response = '';
my $json = JSON->new();

$browser->cookie_jar($cookie_jar);

$response = $browser->get(
  "https://${host}/login.cgi"
);

$response = $browser->post(
  "https://${host}/login.cgi",
  Content_Type => 'form-data',
  Content => [
    username => 'USER',
    password => 'PASS',
  ],
);

$response = $browser->get(
  "https://${host}/120816.1338/status.cgi"
);

print ($json->decode($response->content)->{wireless}->{ccq}/10 . "\n");

Script above will print CCQ value:

$ perl ubiquiti_ccq.pl 1.2.3.4
98.4

Third step

Create data input method as specified below.

Ubiquiti_ccq_data_input_method

Fourth step

Create data template as specified below.

ubiquiti_ccq_data_template

Fifth step

Create graph template, as specified below.

Ubiquiti_ccq_graph_template

Sixth step

Create new graph for desired device.

ubiquiti_ccq_create_graph

Data will be gathered, stored and graphed over time.

ubiquiti_ccq_graph

Notes - CCQ on Ubiquiti devices

If you want to graph different value then look at the status.cgi file contents and modify the script accordingly.

{ "host": {
        "uptime": 99289223,
        "time": "2012-12-10 22:59:43",
        "fwversion": "v5.5.2",
        "hostname": "Home1",
        "netrole": "bridge"
 },
 "wireless": {
        "mode": "ap",
        "essid": "Look! No wires!",
        "hide_essid": 0,
        "apmac": "00:27:22:11:12:13",
        "countrycode": 616,
        "channel": 104,
        "frequency": "5520 MHz",
        "dfs": "0",
        "opmode": "11naht40minus",
        "antenna": "Combined - 24 dBi",
        "chains": "2X2",
        "signal": -64, "rssi": 32, "noisef": -88,
        "ack": 30,
        "distance": 900,
        "ccq": 984,
        "txrate": "240", "rxrate": "240",
        "security": "WPA2", "qos": "No QoS",
        "rstatus": 5,
        "count": 1,
        "polling": {
                "enabled": 0,
                "quality": 0,
                "capacity": 0,
                "priority": 0,
                "noack": 0,
                "airsync_mode": 0, "airsync_connections": 0,
                "airsync_down_util" : 0, "airsync_up_util" : 0,
                "airselect" : 0, "airselect_interval" : 0
        },
        "stats": {
                "rx_nwids": 143634,
                "rx_crypts": 0,
                "rx_frags": 0,
                "tx_retries": 0,
                "missed_beacons": 0,
                "err_other": 0
        },
        "wds": 1,
        "aprepeater": 0,
        "chwidth": 40,
        "chanbw": 0,
        "cwmmode": 0,
        "rx_chainmask": 3,
        "tx_chainmask": 3,
        "chainrssi" : [ 30, 30, 0 ],
        "chainrssimgmt" : [ 32, 32, 0 ],
        "chainrssiext" : [ 30, 30, 0 ]
 },
 "airview": { "enabled": 0 },
 "services": { "dhcpc": 0, "dhcpd": 0, "pppoe": 0 },
 "firewall": { "iptables": 0, "ebtables" : 0 },
 "genuine": "/images/genuine.png",
 "interfaces" : [
        {
                "ifname" : "lo",
                "hwaddr": "00:00:00:00:00:00",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 0, "duplex": 255 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        },
        {
                "ifname" : "eth0",
                "hwaddr": "00:27:22:11:12:13",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 100, "duplex": 1 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        },
        {
                "ifname" : "wifi0",
                "hwaddr": "00:27:22:11:12:13",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 0, "duplex": 255 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        },
        {
                "ifname" : "ath0",
                "hwaddr": "00:27:22:11:12:13",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 300, "duplex": 255 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        },
        {
                "ifname" : "br0",
                "hwaddr": "00:27:22:11:12:13",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 0, "duplex": 255 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        },
        {
                "ifname" : "br1",
                "hwaddr": "00:27:22:11:12:13",
                "enabled" : true,
                "status" : { "plugged": 1, "speed": 0, "duplex": 255 },
                "services" : { "dhcpc": false, "dhcpd": false, "pppoe": false }
        }
 ]
}

I cannot tell if URL used to read status.cgi can change slightly over time - look here for an update.

I checked the script on NanoBridge and PowerBridge devices using AirOS 5.5.2.

Milosz Galazka's Picture

About Milosz Galazka

Milosz is a system administrator working for a successful Polish company and a long time supporter of Free Software Foundation and Debian operating system.

Gdansk, Poland https://sleeplessbeastie.eu