Skip to content

scSNMP – Usage

All functions in scSNMP create event-driven monitoring objects. The objects poll the device at a configurable interval and send an event to the main script every time new data has been retrieved.


SynologySystemMIB

Retrieves overall system status from a Synology NAS.

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the NAS device
name String "<NONAME>" Name of the instance
poll Boolean true true starts automatic polling
interval Number 3600000 (60 min) Poll interval in milliseconds
port Number 161 SNMP port
community String "public" SNMP community string

Available data in the event (event.data)

Property Description
systemStatus System status: Normal, Failed
temperature System temperature in Celsius
powerStatus Power supply status
systemFanStatus System fan status
cpuFanStatus CPU fan status
modelName Model name
serialNumber Serial number
version DSM version
upgradeAvailable Whether a DSM update is available
ssCpuSystem CPU usage as a percentage
memTotalReal Total RAM
memAvailReal Free RAM
memCached Cached memory
var snmp1 = new scSNMP.SynologySystemMIB("192.168.1.10", "NAS_Ethiris");
snmp1.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("NAS system status: " + event.data.systemStatus.status);
        Debug.Print("NAS temperature: " + event.data.temperature.value + "°C");
    }
    else
        Debug.Print("Error during SNMP retrieval: " + event.errorMessage);
}

SynologyDiskMIB

Retrieves per-disk status from a Synology NAS.

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the NAS device
name String "<NONAME>" Name of the instance
disks Array<Number> [1,2,3,4,5,6,7,8] List of disk indexes to monitor
poll Boolean true true starts automatic polling
interval Number 3600000 (60 min) Poll interval in milliseconds
port Number 161 SNMP port
community String "public" SNMP community string

Available data per disk (event.data["Disk N"])

Property Description
diskStatus Normal, Initialized, Crashed, etc.
diskHealthStatus Normal, Warning, Critical, Failing
diskTemperature Disk temperature in Celsius
diskModel Disk model
diskRemainLife Estimated remaining lifespan
diskBadSector Number of bad sectors
var snmp2 = new scSNMP.SynologyDiskMIB("192.168.1.10", "NAS_Disks", [1,2,3,4]);
snmp2.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("Disk 1 status: " + event.data["Disk 1"].diskStatus.status);
        Debug.Print("Disk 1 temperature: " + event.data["Disk 1"].diskTemperature.value + "°C");
    }
}

SynologySystemTemperatureCheck

Event-driven temperature monitoring for Synology NAS. Sends an event when the temperature crosses a configured limit in either direction.

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the NAS device
limit Number 50 Temperature limit in Celsius
name String "<NONAME>" Name of the instance
port Number 161 SNMP port
community String "public" SNMP community string
interval Number 10000 Check interval in milliseconds

Event properties

Property Type Description
event.isAboveLimit Boolean true if the temperature exceeds the limit
event.isBelowLimit Boolean true if the temperature is below the limit
event.currentTemperature Number Current temperature in Celsius
event.limit Number Configured limit
var snmp3 = new scSNMP.SynologySystemTemperatureCheck("192.168.1.10", 45, "NAS_Temp");
snmp3.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print(event.text);
}

HPSystemMIB

Retrieves overall system status from an HP switch (tested on HPE OfficeConnect 1950).

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the switch
name String "<NONAME>" Name of the instance
poll Boolean true true starts automatic polling
interval Number 3600000 (60 min) Poll interval in milliseconds
port Number 161 SNMP port
community String "public" SNMP community string

Available data in the event (event.data)

Property Description
hh3cEntityExtCpuUsage CPU usage as a percentage
hh3cEntityExtMemUsage Memory usage as a percentage
hh3cEntityExtUpTime Uptime in seconds
hh3cEntityExtManuSerialNum Serial number
hh3cEntityExtTemperature Switch temperature
entPhysicalHardwareRev Hardware revision
entPhysicalFirmwareRev Firmware revision
var snmp4 = new scSNMP.HPSystemMIB("192.168.1.20", "HP_Switch");
snmp4.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
    {
        Debug.Print("CPU: " + event.data.hh3cEntityExtCpuUsage.value + "%");
        Debug.Print("Memory: " + event.data.hh3cEntityExtMemUsage.value + "%");
    }
}

HPPortMIB

Retrieves per-port status from an HP switch.

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the switch
name String "<NONAME>" Name of the instance
poll Boolean true true starts automatic polling
interval Number 3600000 (60 min) Poll interval in milliseconds
port Number 161 SNMP port
community String "public" SNMP community string
ports Array<Number> [1,2,3,4] Port indexes to monitor

Available data per port (event.data["Port N"])

Property Description
ifHighSpeed Port bandwidth in Mbit/s
ifSpeed Port bandwidth in bit/s
dot3StatsDuplexStatus Duplex mode: unknown, halfDuplex, fullDuplex
hh3cIfStatFlowInBits Incoming traffic in bits per interval
hh3cIfStatFlowOutBits Outgoing traffic in bits per interval
var snmp5 = new scSNMP.HPPortMIB("192.168.1.20", "HP_Ports", true, 60000, 161, "public", [1,2,3,4,5,6]);
snmp5.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print("Port 1 speed: " + event.data["Port 1"].ifHighSpeed.value + " Mbit/s");
}

HPFanMIB

Retrieves fan status from an HP switch.

Parameters

Parameter Type Default value Description
ipAddress String (required) IP address of the switch
name String "<NONAME>" Name of the instance
fans Array<Number> [1,2] Fan indexes to monitor
poll Boolean true true starts automatic polling
interval Number 3600000 (60 min) Poll interval in milliseconds
port Number 161 SNMP port
community String "public" SNMP community string

Available data per fan (event.data["Fan N"])

Property Description
operStatus Operational status: Not Supported, Disabled, Enabled, Dangerous
errorStatus Error status: Normal, Post failure, Fan error, etc.
var snmp6 = new scSNMP.HPFanMIB("192.168.1.20", "HP_Fans", [1,2]);
snmp6.getEventTarget().onDataAvailable = function(event)
{
    if(!event.error)
        Debug.Print("Fan 1: " + event.data["Fan 1"].operStatus.status);
}

ArubaSystemMIB

Retrieves overall system status from an Aruba switch (tested on Aruba Instant On 1930).

Parameters – same as HPSystemMIB.

Available data in the event (event.data)

Property Description
rlPhdUnitEnvParamTempSensorValue Current temperature
rlPhdUnitEnvParamTempSensorStatus Temperature status: Ok, Unavailable, Non-operational
rlPhdUnitEnvParamMonitorTemperatureStatus Temperature alarm status
rlCpuUtilDuringLastSecond CPU usage over the last second (%)
rlCpuUtilDuringLastMinute CPU usage over the last minute (%)
rlCpuUtilDuringLast5Minutes CPU usage over the last 5 minutes (%)
rlPhdUnitGenParamModelName Model name
rlPhdUnitGenParamSoftwareVersion Software version
rlPhdUnitGenParamSerialNum Serial number
sysUpTime Uptime (in 1/100 seconds)
pethMainPsePower Total PoE capacity in Watts
pethMainPseOperStatus PoE status: On, Off, Faulty
pethMainPseConsumptionPower Current PoE consumption in Watts

ArubaFanMIB

Retrieves fan status from an Aruba switch. Parameters – same as HPFanMIB.

Available data per fan (event.data["Fan N"])

Property Description
fanStatus Status: Normal, Warning, Critical, Shutdown, Not present, Not functioning
fanSpeed Fan speed (raw value)

ArubaPortMIB

Retrieves per-port status from an Aruba switch. Parameters – same as HPPortMIB.

Available data per port (event.data["Port N"])

Property Description
ifHighSpeed Speed in Mbit/s
dot3StatsDuplexStatus Duplex mode
ifAdminStatus Administrative status: Up, Down, Testing
ifOperStatus Operational status: Up, Down, Testing

ArubaPoeMIB

Retrieves per-port PoE status from an Aruba switch.

Parameters – same as HPPortMIB.

Available data per port (event.data["Port N"])

Property Description
rlPethPsePortOutputVoltage Output voltage in millivolts
rlPethPsePortOutputCurrent Output current in milliamps
rlPethPsePortOutputPower Output power in milliwatts
rlPethPsePortPowerLimit Configured power limit in milliwatts
rlPethPsePortOperStatus Whether the port is active (True/False)
rlPethPsePortLinkPartnerPoeType PoE type of the connected device

The script

Download scSNMP.js

//***********************************************//
// The purpose of this script library
// is to collect data from one or more
// Synology NAS and/or HP/Aruba switches
// using SNMP and MIBs' defined by Synology and
// HP/Aruba documentation
// Version 1.3 (2024-03-04)
// Copyright © 2022-2024 Kentima AB. No rights reserved.
//***********************************************//

try
{    
    //SYNOLOGY-SYSTEM-MIB. Get system status Tested on Synology RS1219+
    this.SynologySystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var systemStatus = "1.3.6.1.4.1.6574.1.1.0";
            oids[systemStatus] = {};
            oids[systemStatus].name = "systemStatus";
            oids[systemStatus].description = "Synology system status";
            oids[systemStatus].status = ["Not Used(0)", "Normal(1): System is functioning normally", "Failed(2): Volume has crashed"];
            snmpReader.AddOID(systemStatus);

            var temperature = "1.3.6.1.4.1.6574.1.2.0";
            oids[temperature] = {};
            oids[temperature].name = "temperature";
            oids[temperature].description = "Synology system temperature (Celsius)";
            snmpReader.AddOID(temperature);

            var powerStatus = "1.3.6.1.4.1.6574.1.3.0";
            oids[powerStatus] = {};
            oids[powerStatus].name = "powerStatus";
            oids[powerStatus].description = "Synology power status";
            oids[powerStatus].status = ["Not Used(0)", "Normal(1): All power supplies are functioning normally", "Failed(2): One of the power supplies have failed"];
            snmpReader.AddOID(powerStatus);

            var fan             = {};
            fan.systemFanStatus = "1.3.6.1.4.1.6574.1.4.1.0";
            oids[fan.systemFanStatus] = {};
            oids[fan.systemFanStatus].name = "systemFanStatus";
            oids[fan.systemFanStatus].description = "Synology system fan status";
            oids[fan.systemFanStatus].status = ["Not Used(0)", "Normal(1): All internal fans are functioning normally", "Failed(2): One of the internal fans have stopped"];
            snmpReader.AddOID(fan.systemFanStatus);

            fan.cpuFanStatus = "1.3.6.1.4.1.6574.1.4.2.0";
            oids[fan.cpuFanStatus] = {};
            oids[fan.cpuFanStatus].name = "cpuFanStatus";
            oids[fan.cpuFanStatus].description = "Synology cpu fan status";
            oids[fan.cpuFanStatus].status = ["Not Used(0)", "Normal(1): All CPU fans functioning normally", "Failed(2): One of the CPU fans have stopped"];
            snmpReader.AddOID(fan.cpuFanStatus);

            var dsmInfo       = {};
            dsmInfo.modelName = "1.3.6.1.4.1.6574.1.5.1.0";
            oids[dsmInfo.modelName] = {};
            oids[dsmInfo.modelName].name = "modelName";
            oids[dsmInfo.modelName].description = "The model name of this NAS";
            snmpReader.AddOID(dsmInfo.modelName);

            dsmInfo.serialNumber = "1.3.6.1.4.1.6574.1.5.2.0";
            oids[dsmInfo.serialNumber] = {};
            oids[dsmInfo.serialNumber].name = "serialNumber";
            oids[dsmInfo.serialNumber].description = "The serial number of this NAS";
            snmpReader.AddOID(dsmInfo.serialNumber);

            dsmInfo.version = "1.3.6.1.4.1.6574.1.5.3.0";
            oids[dsmInfo.version] = {};
            oids[dsmInfo.version].name = "version";
            oids[dsmInfo.version].description = "The version of this DSM";
            snmpReader.AddOID(dsmInfo.version);

            dsmInfo.upgradeAvailable = "1.3.6.1.4.1.6574.1.5.4.0";
            oids[dsmInfo.upgradeAvailable] = {};
            oids[dsmInfo.upgradeAvailable].name = "upgradeAvailable";
            oids[dsmInfo.upgradeAvailable].description = "This oid is for checking whether there is a newer version of DSM.";
            oids[dsmInfo.upgradeAvailable].status = ["Not Used(0)", "Available(1): There is version ready for download.", "Unavailable(2): The DSM is latest version.", "Connecting(3): Checking for the latest DSM.", "Disconnected(4): Failed to connect to server.", "Others(5): If DSM is upgrading or downloading, the status will show others."];
            snmpReader.AddOID(dsmInfo.upgradeAvailable);

            var systemStats   = {};
            systemStats.ssCpuSystem = "1.3.6.1.4.1.2021.11.10.0";
            oids[systemStats.ssCpuSystem] = {};
            oids[systemStats.ssCpuSystem].name = "ssCpuSystem";
            oids[systemStats.ssCpuSystem].description = "percentages of system CPU time";
            snmpReader.AddOID(systemStats.ssCpuSystem);

            var memory               = {};
            memory.memTotalReal = "1.3.6.1.4.1.2021.4.5.0";
            oids[memory.memTotalReal] = {};
            oids[memory.memTotalReal].name = "memTotalReal";
            oids[memory.memTotalReal].description = "Total RAM in machine";
            snmpReader.AddOID(memory.memTotalReal);

            memory.memAvailReal = "1.3.6.1.4.1.2021.4.6.0";
            oids[memory.memAvailReal] = {};
            oids[memory.memAvailReal].name = "memAvailReal";
            oids[memory.memAvailReal].description = "Total RAM used";
            snmpReader.AddOID(memory.memAvailReal);

            memory.memCached = "1.3.6.1.4.1.2021.4.15.0";
            oids[memory.memCached] = {};
            oids[memory.memCached].name = "memCached";
            oids[memory.memCached].description = "Total Cached Memory";
            snmpReader.AddOID(memory.memCached);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.SynologySystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologySystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologySystemMIB: " + e); //Catch error
        }
    }

    //SYNOLOGY-DISK-MIB. Get disk status. Tested on Synology RS1219+
    this.SynologyDiskMIB = function (ipAddress, name, disks, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var disks       = (typeof disks == "undefined" || typeof disks !== "object") ? [1, 2, 3, 4, 5, 6, 7, 8] : disks; //Store disk
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init event

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.data = data; //Store data in the event
                event.name = name; //Store name in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener for type 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var disk in diskEntry)
                    data[disk] = {}; //Create object for each disk

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var disk in diskEntry)
                            {
                                var propName    = oids[oid].name;

                                if(diskEntry[disk][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                                data[disk][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologyDiskMIB.getData(): " + e); //Catch any Error
                }
            }

            var oids      = {}; //Create Object to store 'oid' information
            var diskEntry = {}; //Create Object to store 'disk' information

            //Go through all available disks
            for (var disk in disks)
            {
                var d = "Disk " + disks[disk];
                diskEntry[d] = {};

                var oid = "1.3.6.1.4.1.6574.2.1.1.2." + (disks[disk] - 1);
                diskEntry[d].diskID = oid;
                oids[oid] = {};
                oids[oid].name = "diskID";
                oids[oid].description = "Synology disk ID (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.3." + (disks[disk] - 1);
                diskEntry[d].diskModel = oid;
                oids[oid] = {};
                oids[oid].name = "diskModel";
                oids[oid].description = "Synology disk model name (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.4." + (disks[disk] - 1);
                diskEntry[d].diskType = oid;
                oids[oid] = {};
                oids[oid].name = "diskType";
                oids[oid].description = "Synology disk type (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.5." + (disks[disk] - 1);
                diskEntry[d].diskStatus = oid;
                oids[oid] = {};
                oids[oid].name = "diskStatus";
                oids[oid].description = "Synology disk status (" + disks[disk] + "): ";
                oids[oid].status = ["Not Used(0)", "Normal(1): The hard disk functions normally.", "Initialized(2): The hard disk has system partition but no data.", "NotInitialized(3):    The hard disk does not have system in system partition.", "SystemPartitionFailed(4): The system partitions on the hard disks are damaged.", "Crashed(5): The hard disk has damaged."];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.6." + (disks[disk] - 1);
                diskEntry[d].diskTemperature = oid;
                oids[oid] = {};
                oids[oid].name = "diskTemperature";
                oids[oid].description = "Synology disk temperature (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.7." + (disks[disk] - 1);
                diskEntry[d].diskRole = oid;
                oids[oid] = {};
                oids[oid].name = "diskRole";
                oids[oid].description = "Synology disk role (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.8." + (disks[disk] - 1);
                diskEntry[d].diskRetry = oid;
                oids[oid] = {};
                oids[oid].name = "diskRetry";
                oids[oid].description = "Synology disk retry (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.9." + (disks[disk] - 1);
                diskEntry[d].diskBadSector = oid;
                oids[oid] = {};
                oids[oid].name = "diskBadSector";
                oids[oid].description = "Synology disk bad sector (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.10." + (disks[disk] - 1);
                diskEntry[d].diskIdentifyFail = oid;
                oids[oid] = {};
                oids[oid].name = "diskIdentifyFail";
                oids[oid].description = "Synology disk identify fail (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.11." + (disks[disk] - 1);
                diskEntry[d].diskRemainLife = oid;
                oids[oid] = {};
                oids[oid].name = "diskRemainLife";
                oids[oid].description = "The estimated remaining life of disk (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.12." + (disks[disk] - 1);
                diskEntry[d].diskName = oid;
                oids[oid] = {};
                oids[oid].name = "diskName";
                oids[oid].description = "The disk name (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.2.1.1.13." + (disks[disk] - 1);
                diskEntry[d].diskHealthStatus = oid;
                oids[oid] = {};
                oids[oid].name = "diskHealthStatus";
                oids[oid].description = "Synology disk status (" + disks[disk] + "): ";
                oids[oid].status = ["Not Used(0)", "Normal(1): The disk health status is normal.", "Warning(2): The disk health status is warning", "Critical(3): The disk health status is critical.", "Failing(4): The disk health status is failing."];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.8." + (disks[disk]);
                diskEntry[d].storageIOLA = oid;
                oids[oid] = {};
                oids[oid].name = "storageIOLA";
                oids[oid].description = "The disk load (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.14." + (disks[disk]);
                diskEntry[d].storageIODeviceSerial = oid;
                oids[oid] = {};
                oids[oid].name = "storageIODeviceSerial";
                oids[oid].description = "The disk serial (" + disks[disk] + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.6574.101.1.1.2." + (disks[disk]);
                diskEntry[d].storageIODevice = oid;
                oids[oid] = {};
                oids[oid].name = "storageIODevice";
                oids[oid].description = "The name of the device we are counting/checking";
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer       = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent    = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.SynologyDiskMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologyDiskMIB()', name: " + name + ", ipAddress: " + ipAddress + ", disks: " + disks.toString() + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologyDiskMIB: " + e); //Catch error
        }
    }

    //HH3C-COMMON-SYSTEM-MIB, entityMIB. Get system status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPSystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPSystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPSystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var hh3cEntityExtCpuUsage = "1.3.6.1.4.1.25506.2.6.1.1.1.1.6.212";
            oids[hh3cEntityExtCpuUsage] = {};
            oids[hh3cEntityExtCpuUsage].name = "hh3cEntityExtCpuUsage";
            oids[hh3cEntityExtCpuUsage].description = "The CPU usage for this entity. Generally, the overall CPU usage on the entity is calculated, independent of the number of CPUs on the entity.";
            snmpReader.AddOID(hh3cEntityExtCpuUsage);

            var hh3cEntityExtMemUsage = "1.3.6.1.4.1.25506.2.6.1.1.1.1.8.212";
            oids[hh3cEntityExtMemUsage] = {};
            oids[hh3cEntityExtMemUsage].name = "hh3cEntityExtMemUsage";
            oids[hh3cEntityExtMemUsage].description = "The memory usage for the entity. This object indicates what percent of memory are used.";
            snmpReader.AddOID(hh3cEntityExtMemUsage);

            var hh3cEntityExtUpTime = "1.3.6.1.4.1.25506.2.6.1.1.1.1.11.2";
            oids[hh3cEntityExtUpTime] = {};
            oids[hh3cEntityExtUpTime].name = "hh3cEntityExtUpTime";
            oids[hh3cEntityExtUpTime].description = "The uptime for the entity. The meaning of uptime is when the entity is up, and the value of the object will add 1 seconds while the entity is running.";
            snmpReader.AddOID(hh3cEntityExtUpTime);

            var hh3cEntityExtManuSerialNum = "1.3.6.1.4.1.25506.2.6.1.2.1.1.2.2";
            oids[hh3cEntityExtManuSerialNum] = {};
            oids[hh3cEntityExtManuSerialNum].name = "hh3cEntityExtManuSerialNum";
            oids[hh3cEntityExtManuSerialNum].description = "Manufacture serial number. The manufacture serial number of the entity such as chassis, module, and so on.  It is got from the device when manufacturing. For low level box-device, the manufacture serial number is the device-number of System Control Board(SCB for short), it is written into the SCB directly; for middle level or high level frame-device, the manufacture serial number is the device-numbers of SCB and Service Board, because the SCB, Service Board and chassis are separate to sale and the device-number of chassis cannot be written into board.";
            snmpReader.AddOID(hh3cEntityExtManuSerialNum);

            var entPhysicalHardwareRev = "1.3.6.1.2.1.47.1.1.1.1.8.2";
            oids[entPhysicalHardwareRev] = {};
            oids[entPhysicalHardwareRev].name = "entPhysicalHardwareRev";
            oids[entPhysicalHardwareRev].description = "The vendor-specific hardware revision string for the physical entity.  The preferred value is the hardware revision identifier actually printed on the component itself (if present). Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific hardware revision string is associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalHardwareRev);

            var entPhysicalFirmwareRev = "1.3.6.1.2.1.47.1.1.1.1.9.2";
            oids[entPhysicalFirmwareRev] = {};
            oids[entPhysicalFirmwareRev].name = "entPhysicalFirmwareRev";
            oids[entPhysicalFirmwareRev].description = "The vendor-specific firmware revision string for the physical entity. Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific firmware programs are associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalFirmwareRev);

            var entPhysicalSoftwareRev = "1.3.6.1.2.1.47.1.1.1.1.10.2";
            oids[entPhysicalSoftwareRev] = {};
            oids[entPhysicalSoftwareRev].name = "entPhysicalSoftwareRev";
            oids[entPhysicalSoftwareRev].description = "The vendor-specific software revision string for the physical entity. Note that if revision information is stored internally in a non-printable (e.g., binary) format, then the agent must convert such information to a printable format, in an implementation-specific manner. If no specific software programs are associated with the physical component, or if this information is unknown to the agent, then this object will contain a zero-length string.";
            snmpReader.AddOID(entPhysicalSoftwareRev);

            var entPhysicalDescr = "1.3.6.1.2.1.47.1.1.1.1.2.2";
            oids[entPhysicalDescr] = {};
            oids[entPhysicalDescr].name = "entPhysicalDescr";
            oids[entPhysicalDescr].description = "A textual description of physical entity.  This object should contain a string that identifies the manufacturer's name for the physical entity, and should be set to a distinct value for each version or model of the physical entity.";
            snmpReader.AddOID(entPhysicalDescr);

            var hh3cEntityExtTemperature = "1.3.6.1.4.1.25506.2.6.1.1.1.1.12.212";
            oids[hh3cEntityExtTemperature] = {};
            oids[hh3cEntityExtTemperature].name = "hh3cEntityExtTemperature";
            oids[hh3cEntityExtTemperature].description = "The temperature for the entity.";
            snmpReader.AddOID(hh3cEntityExtTemperature);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPSystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPSystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPSystemMIB: " + e); //Catch error
        }
    }

    //ifMIB. Get different kinds of port status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPPortMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPPortMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status[snmpReader.Results[oid]] != "undefined") ? oids[oid].status[snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPPortMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available disks
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.2.1.10.7.2.1.19." + (ports[port]);
                portEntry[p].dot3StatsDuplexStatus = oid;
                oids[oid] = {};
                oids[oid].name = "dot3StatsDuplexStatus";
                oids[oid].description = "The current mode of operation of the MAC entity. 'unknown' indicates that the current duplex mode could not be determined. (" + p + "): ";
                oids[oid].status = ["not used(0)", "unknown(1)", "halfDuplex(2)", "fullDuplex(3)"];
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.5." + (ports[port]);
                portEntry[p].ifSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in bits per second. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.31.1.1.1.15." + (ports[port]);
                portEntry[p].ifHighSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifHighSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in units of 1,000,000 bits per second. If this object reports a value of `n' then the speed of the interface is somewhere in the range of `n-500,000' to `n+499,999'. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. For a sub-layer which has no concept of bandwidth, this object should be zero. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.1." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInterval = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInterval";
                oids[oid].description = "Sampling interval(s) for in/out flow of interface. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.2." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInBits = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInBits";
                oids[oid].description = "Flow in bits in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.3." + (ports[port]);
                portEntry[p].hh3cIfStatFlowOutBits = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowOutBits";
                oids[oid].description = "Flow out bits in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.6." + (ports[port]);
                portEntry[p].hh3cIfStatFlowInBytes = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowInBytes";
                oids[oid].description = "Flow in bytes in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.40.2.1.2.1.1.7." + (ports[port]);
                portEntry[p].hh3cIfStatFlowOutBytes = oid;
                oids[oid] = {};
                oids[oid].name = "hh3cIfStatFlowOutBytes";
                oids[oid].description = "Flow out bytes in the specific interval. (" + p + "): ";
                snmpReader.AddOID(oid);
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPPortMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPPortMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPPortMIB: " + e); //Catch error
        }
    }

    //HH3C-ENTITY-MIB. Get fan status. Tested on HPE OfficeConnect 1950 12XGT 4SFP+ Switch
    this.HPFanMIB = function (ipAddress, name, fans, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.HPFanMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var fans        = (typeof fans == "undefined" || typeof fans !== "object") ? [1, 2] : fans; //Store fans
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var fan in fanEntry)
                    data[fan] = {}; //Create object for each disk

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var fan in fanEntry)
                            {
                                var propName    = oids[oid].name;

                                if(fanEntry[fan][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description;
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[fan][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPFanMIB.getData(): " + e); //Catch any Error
                }
            }           

            var oids      = {}; //Create Object to store 'oid' information
            var fanEntry = {}; //Create Object to store 'fan' information

            //Go through all available disks
            for (var fan in fans)
            {
                var f = "Fan " + fans[fan];
                fanEntry[f] = {};

                var oid = "1.3.6.1.4.1.25506.2.6.1.1.1.1.3." + (fans[fan] + 215);
                fanEntry[f].operStatus = oid;
                oids[oid] = {};
                oids[oid].name = "operStatus"; //"hh3cEntityExtOperStatus";
                oids[oid].description = "HP fan operating status (" + fans[fan] + "): ";
                oids[oid].status = {_1:f + ": Not Supported(1)",_2:f + ": Disabled(2)",_3:f + ": Enabled(3)",_4:f + ": Dangerous(4)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.25506.2.6.1.1.1.1.19." + (fans[fan] + 215);
                fanEntry[f].errorStatus = oid;
                oids[oid] = {};
                oids[oid].name = "errorStatus"; //"hh3cEntityExtErrorStatus";
                oids[oid].description = "HP fan error status (" + fans[fan] + "): ";
                oids[oid].status = {_1:f + ": Not supported(1)",_2:f + ": Normal(2)",_3:f + ": Post failure(3)",_4:f + ": Entity absent(4)",_41:f + ": Fan error(41)"};
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.HPFanMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.HPFanMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes, Fans: " + fans.toString());
        }
        catch (e)
        {
            Debug.Print("scSNMP.HPFanMIB: " + e); //Catch error
        }
    }

    //HPE-Physicaldescription-MIB, HPE-rndMng, rfc1213-mib, power-ethernet-mib. Get system status. Tested on Aruba Instant On 1930 24G Class4 PoE 4SFP/SFP+ 195W Switch JL683B
    this.ArubaSystemMIB = function (ipAddress, name, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaSystemMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            var propName    = oids[oid].name;
                            var value       = snmpReader.Results[oid]; 
                            var description = oids[oid].description;
                            var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                            data[propName] = 
                            {
                                name: propName,
                                oid: oid,
                                value: value,
                                description: description,
                                status: status
                            }; //Add data to data Object
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.HPSystemMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var rlPhdUnitEnvParamTempSensorValue = "1.3.6.1.4.1.11.2.53.15.1.10.1";
            oids[rlPhdUnitEnvParamTempSensorValue] = {};
            oids[rlPhdUnitEnvParamTempSensorValue].name = "rlPhdUnitEnvParamTempSensorValue";
            oids[rlPhdUnitEnvParamTempSensorValue].description = "Current value for the Sensor being instrumented.";
            snmpReader.AddOID(rlPhdUnitEnvParamTempSensorValue);

            var rlPhdUnitEnvParamTempSensorStatus = "1.3.6.1.4.1.11.2.53.15.1.11.1";
            oids[rlPhdUnitEnvParamTempSensorStatus] = {};
            oids[rlPhdUnitEnvParamTempSensorStatus].name = "rlPhdUnitEnvParamTempSensorStatus";
            oids[rlPhdUnitEnvParamTempSensorStatus].description = "Status value for the Sensor being instrumented.";
            oids[rlPhdUnitEnvParamTempSensorStatus].status = {_1:"Ok(1)", _2:"Unavailable(2)", _3:"Non-operational(3)"};
            snmpReader.AddOID(rlPhdUnitEnvParamTempSensorStatus);

            var rlPhdUnitEnvParamMonitorTemperatureStatus = "1.3.6.1.4.1.11.2.53.15.1.16.1";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus] = {};
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].name = "rlPhdUnitEnvParamMonitorTemperatureStatus";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].description = "Display environment monitoring chassis temperature status";
            oids[rlPhdUnitEnvParamMonitorTemperatureStatus].status = {_1:"Ok(1)", _2:"Over temperature threshold(2)", _3:"Over critical temperature threshold(3)"};
            snmpReader.AddOID(rlPhdUnitEnvParamMonitorTemperatureStatus);

            var rlCpuUtilDuringLastSecond = "1.3.6.1.4.1.11.2.1.7.0";
            oids[rlCpuUtilDuringLastSecond] = {};
            oids[rlCpuUtilDuringLastSecond].name = "rlCpuUtilDuringLastSecond";
            oids[rlCpuUtilDuringLastSecond].description = "Percentage of the device CPU utilization during last second. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last second).";
            snmpReader.AddOID(rlCpuUtilDuringLastSecond);

            var rlCpuUtilDuringLastMinute = "1.3.6.1.4.1.11.2.1.8.0";
            oids[rlCpuUtilDuringLastMinute] = {};
            oids[rlCpuUtilDuringLastMinute].name = "rlCpuUtilDuringLastMinute";
            oids[rlCpuUtilDuringLastMinute].description = "Percentage of the device CPU utilization during last minute. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last minute).";
            snmpReader.AddOID(rlCpuUtilDuringLastMinute);

            var rlCpuUtilDuringLast5Minutes = "1.3.6.1.4.1.11.2.1.9.0";
            oids[rlCpuUtilDuringLast5Minutes] = {};
            oids[rlCpuUtilDuringLast5Minutes].name = "rlCpuUtilDuringLast5Minutes";
            oids[rlCpuUtilDuringLast5Minutes].description = "Percentage of the device CPU utilization during the last 5 minutes. The value 101 is a dummy value, indicating that the CPU utilization was not measured (since measurement is disabled or was disabled during last 5 minutes).";
            snmpReader.AddOID(rlCpuUtilDuringLast5Minutes);

            var rlPhdUnitGenParamModelName = "1.3.6.1.4.1.11.2.53.14.1.11.1";
            oids[rlPhdUnitGenParamModelName] = {};
            oids[rlPhdUnitGenParamModelName].name = "rlPhdUnitGenParamModelName";
            oids[rlPhdUnitGenParamModelName].description = "Model name.";
            snmpReader.AddOID(rlPhdUnitGenParamModelName);

            var rlPhdUnitGenParamSoftwareVersion = "1.3.6.1.4.1.11.2.53.14.1.2.1";
            oids[rlPhdUnitGenParamSoftwareVersion] = {};
            oids[rlPhdUnitGenParamSoftwareVersion].name = "rlPhdUnitGenParamSoftwareVersion";
            oids[rlPhdUnitGenParamSoftwareVersion].description = "Software version.";
            snmpReader.AddOID(rlPhdUnitGenParamSoftwareVersion);

            var rlPhdUnitGenParamSerialNum = "1.3.6.1.4.1.11.2.53.14.1.5.1";
            oids[rlPhdUnitGenParamSerialNum] = {};
            oids[rlPhdUnitGenParamSerialNum].name = "rlPhdUnitGenParamSerialNum";
            oids[rlPhdUnitGenParamSerialNum].description = "Serial number.";
            snmpReader.AddOID(rlPhdUnitGenParamSerialNum);

            var sysUpTime = "1.3.6.1.2.1.1.3.0";
            oids[sysUpTime] = {};
            oids[sysUpTime].name = "sysUpTime";
            oids[sysUpTime].description = "The time (in hundredths of a second) since the network management portion of the system was last re-initialized.";
            snmpReader.AddOID(sysUpTime);

            var sysDescr = "1.3.6.1.2.1.1.1.0";
            oids[sysDescr] = {};
            oids[sysDescr].name = "sysDescr";
            oids[sysDescr].description = "The time (in hundredths of a second) since the network management portion of the system was last re-initialized.";
            snmpReader.AddOID(sysDescr);

            var pethMainPsePower = "1.3.6.1.2.1.105.1.3.1.1.2.1";
            oids[pethMainPsePower] = {};
            oids[pethMainPsePower].name = "pethMainPsePower";
            oids[pethMainPsePower].description = "The nominal power of the PSE expressed in Watts.";
            snmpReader.AddOID(pethMainPsePower);

            var pethMainPseOperStatus = "1.3.6.1.2.1.105.1.3.1.1.3.1";
            oids[pethMainPseOperStatus] = {};
            oids[pethMainPseOperStatus].name = "pethMainPseOperStatus";
            oids[pethMainPseOperStatus].description = "The operational status of the main PSE.";
            oids[pethMainPseOperStatus].status = {_1:"On(1)", _2:"Off(2)", _3:"Faulty(3)"};
            snmpReader.AddOID(pethMainPseOperStatus);

            var pethMainPseConsumptionPower = "1.3.6.1.2.1.105.1.3.1.1.4.1";
            oids[pethMainPseConsumptionPower] = {};
            oids[pethMainPseConsumptionPower].name = "pethMainPseConsumptionPower";
            oids[pethMainPseConsumptionPower].description = "Measured usage power expressed in Watts.";
            snmpReader.AddOID(pethMainPseConsumptionPower);

            var pethMainPseUsageThreshold = "1.3.6.1.2.1.105.1.3.1.1.5.1";
            oids[pethMainPseUsageThreshold] = {};
            oids[pethMainPseUsageThreshold].name = "pethMainPseUsageThreshold";
            oids[pethMainPseUsageThreshold].description = "The usage threshold expressed in percents for comparing the measured power and initiating an alarm if the threshold is exceeded.";
            snmpReader.AddOID(pethMainPseUsageThreshold);

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaSystemMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaSystemMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaSystemMIB: " + e); //Catch error
        }
    }

    //HPE-Physicaldescription-MIB. Get fan status. Tested on Aruba Instant On 1930 24G Class4 PoE 4SFP/SFP+ 195W Switch JL683B
    this.ArubaFanMIB = function (ipAddress, name, fans, poll, interval, port, community)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaFanMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var fans        = (typeof fans == "undefined" || typeof fans !== "object") ? [1, 2] : fans; //Store fans
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var port        = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var fan in fanEntry)
                        data[fan] = {}; //Create object for each fan

                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var fan in fanEntry)
                            {
                                var propName    = oids[oid].name;

                                if(fanEntry[fan][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description;
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[fan][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaFanMIB.getData(): " + e); //Catch any Error
                }
            }           

            var oids      = {}; //Create Object to store 'oid' information
            var fanEntry = {}; //Create Object to store 'fan' information

            //Go through all available disks
            for (var fan in fans)
            {
                var f = "Fan " + fans[fan];
                fanEntry[f] = {};

                var index = Number(fans[fan]) + 3; //Fan 1 == 4
                var oid = "1.3.6.1.4.1.11.2.53.15.1." + index + ".1";
                fanEntry[f].fanStatus = oid;
                oids[oid] = {};
                oids[oid].status = {};
                oids[oid].name = "fanStatus"; //"rlPhdUnitEnvParamFanXStatus";
                oids[oid].description = "Aruba fan operating status (" + fans[fan] + "): ";
                oids[oid].status = {_1:"Normal(1)",_2:"Warning(2)",_3:"Critical(3)",_4:"Shutdown(4)",_5:"Not present(5)",_6:"Not functioning(6)",_7:"Not available(7)",_8:"Backing up(8)",_9:"Reading failed(9)"};
                snmpReader.AddOID(oid);

                var index = Number(fans[fan]) + 17; //Fan 1 == 18
                var oid = "1.3.6.1.4.1.11.2.53.15.1." + index + ".1";
                fanEntry[f].fanSpeed = oid;
                oids[oid] = {};
                oids[oid].status = {};
                oids[oid].name = "fanSpeed"; //"rlPhdUnitEnvParamFanXSpeed";
                oids[oid].description = "Aruba fan speed (" + fans[fan] + "): ";
                snmpReader.AddOID(oid);
            }

            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaFanMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaFanMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes, Fans: " + fans.toString());
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaFanMIB: " + e); //Catch error
        }
    }

    //rfc2233, IF-MIB. Get different kinds of port status. Tested on 
    this.ArubaPortMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaPortMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var sPort       = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, sPort, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaPortMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available disks
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.2.1.10.7.2.1.19." + (ports[port]);
                portEntry[p].dot3StatsDuplexStatus = oid;
                oids[oid] = {};
                oids[oid].name = "dot3StatsDuplexStatus";
                oids[oid].description = "The current mode of operation of the MAC entity. 'unknown' indicates that the current duplex mode could not be determined. (" + p + "): ";
                oids[oid].status = { _1:"unknown(1)", _2:"halfDuplex(2)", _3:"fullDuplex(3)" };
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.31.1.1.1.15." + (ports[port]);
                portEntry[p].ifHighSpeed = oid;
                oids[oid] = {};
                oids[oid].name = "ifHighSpeed";
                oids[oid].description = "An estimate of the interface's current bandwidth in units of 1,000,000 bits per second. If this object reports a value of `n' then the speed of the interface is somewhere in the range of `n-500,000' to `n+499,999'. For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain the nominal bandwidth. For a sub-layer which has no concept of bandwidth, this object should be zero. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.7." + (ports[port]);
                portEntry[p].ifAdminStatus = oid;
                oids[oid] = {};
                oids[oid].name = "ifAdminStatus";
                oids[oid].description = "The desired state of the interface. The testing(3) state indicates that no operational packets can be passed.  When a managed system initializes, all interfaces start with ifAdminStatus in the down(2) state.  As a result of either explicit management action or per configuration information retained by the managed system, ifAdminStatus is then changed to either the up(1) or testing(3) states (or remains in the down(2) state). (" + p + "): ";
                oids[oid].status = { _1:"Up(1)", _2:"Down(2)", _3:"Testing(3)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.2.1.2.2.1.8." + (ports[port]);
                portEntry[p].ifOperStatus = oid;
                oids[oid] = {};
                oids[oid].name = "ifOperStatus";
                oids[oid].description = "The current operational state of the interface. The testing(3) state indicates that no operational packets can be passed.";
                oids[oid].status = { _1:"Up(1)", _2:"Down(2)", _3:"Testing(3)"};
                snmpReader.AddOID(oid);

                //ifHCInOctets
                //ifHCOutOctets
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaPortMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaPortMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + sPort + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaPortMIB: " + e); //Catch error
        }
    }            

    //HPE-POE. Get different kinds of port status. Tested on 
    this.ArubaPoeMIB = function (ipAddress, name, poll, interval, port, community, ports)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.ArubaPoeMIB: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress   = ipAddress; //Store IP address
            var name        = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var poll        = (typeof poll == "undefined" || typeof poll !== "boolean") ? true : poll; //Store poll status
            var interval    = (typeof interval == "undefined" || typeof interval !== "number") ? (60000 * 60) : interval; //Store interval(how often to poll)
            var sPort       = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store Port number
            var community   = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //store community
            var ports       = (typeof ports == "undefined" || typeof ports !== "object") ? [1,2,3,4] : ports; //Number of ports to monitor
            var snmpReader  = new SNMPReader(ipAddress, sPort, community); //Create new SNMPReader object
            var eventTarget = new EventTarget(); //Create an EventTarget

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            //Define function to send an Event
            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, data)
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event, (type, canBubble, cancelable)

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.data = data; //Store data in the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event); //Send event
                else
                    throw new Error("Event listener 'DataAvailable' is missing"); //Throw an Error if Event listener 'DataAvailable' is missing
            }

            //Define function to get new data
            this.getData = function ()
            {
                try
                {
                    var data = {}; //Create new Struct object
                    for(var port in portEntry)
                        data[port] = {}; //Create object for each port
                    snmpReader.Get(); //Get new data from SNMPReader object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        for (var oid in snmpReader.Results) //Iterate Results
                        {
                            for(var port in portEntry)
                            {
                                var propName    = oids[oid].name;

                                if(portEntry[port][propName] != oid) //Only add data for relevant OID
                                    continue; 

                                var value       = snmpReader.Results[oid];
                                var description = oids[oid].description; 
                                var status      = (typeof oids[oid].status != "undefined" && typeof oids[oid].status["_" + snmpReader.Results[oid]] != "undefined") ? oids[oid].status["_" + snmpReader.Results[oid]] : null;
                                data[port][propName] = 
                                {
                                    name: propName,
                                    oid: oid,
                                    value: value,
                                    description: description,
                                    status: status
                                }; //Add data to data Object
                            }
                        }
                        sendEvent(false, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget, data); //Execute sendEvent() function
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error status, if Results Object is empty
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.ArubaPoeMIB.getData(): " + e); //Catch any Error
                }
            }
            var oids = {} //Store OIDs

            var portEntry = {}; //Create Object to store 'port' information

            //Go through all available ports
            for (var port in ports)
            {
                var p = "Port " + ports[port];
                portEntry[p] = {};

                var oid = "1.3.6.1.4.1.11.2.108.1.1.3.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputVoltage = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputVoltage";
                oids[oid].description = "This variable indicates on the output voltage level in millivolts from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.4.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputCurrent = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputCurrent";
                oids[oid].description = "This variable indicates on the output current level in milliampere from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.5.1." + (ports[port]);
                portEntry[p].rlPethPsePortOutputPower = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOutputPower";
                oids[oid].description = "This variable indicates on the output power level in milliwatts from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.6.1." + (ports[port]);
                portEntry[p].rlPethPsePortPowerLimit = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortPowerLimit";
                oids[oid].description = "This variable indicates on the user configured power level in milli watts which is available from rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.8.1." + (ports[port]);
                portEntry[p].rlPethPsePortStatusDescription = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortStatusDescription";
                oids[oid].description = "This variable indicates the description of the hardware status of rlPethPsePortIndex. (" + p + "): ";
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.11.1." + (ports[port]);
                portEntry[p].rlPethPsePortOperStatus = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortOperStatus";
                oids[oid].description = "This Read-Only variable indicates PoE port current status affected by time range active/inactive and admin status. (" + p + "): ";
                oids[oid].status = {_1:"True(1)",_2:"False(2)"};
                snmpReader.AddOID(oid);

                var oid = "1.3.6.1.4.1.11.2.108.1.1.14.1." + (ports[port]);
                portEntry[p].rlPethPsePortLinkPartnerPoeType = oid;
                oids[oid] = {};
                oids[oid].name = "rlPethPsePortLinkPartnerPoeType";
                oids[oid].description = "This variable indicates the link partner PoE type. (" + p + "): ";
                oids[oid].status = {_1:"None(1)",_2:"Poe(2)",_3:"Poe plus(3)",_4:"Poe 60w(4)",_5:"Poe BT type 3(5)",_6:"Poe BT type 4(6)"};
                snmpReader.AddOID(oid);
            }


            //Create timer if 'poll' is 'true'
            if (poll)
            {
                var timer = new Timer(1000, false); //Run once on startup, after 1 second timeout
                timer.parent = this; //Create reference to this object for access from timer object
                timer.onTimeout = function ()
                {
                    try
                    {
                        this.parent.getData(); //Execute getData() function
                        this.start(this.parent.getInterval()); //Restart timer object
                    }
                    catch (e)
                    {
                        Debug.Print("scSNMP.ArubaPoeMIB.timer.onTimeout: " + e); //Catch error
                    }
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.ArubaPoeMIB()', name: " + name + ", ipAddress: " + ipAddress + ", port: " + sPort + ", community: " + community + ", interval: " + interval / 1000 / 60 + " minutes");
        }
        catch (e)
        {
            Debug.Print("scSNMP.ArubaPoeMIB: " + e); //Catch error
        }
    }

    //Event driven system temperature check. Function will fire an event which can be processed in the main script.
    this.SynologySystemTemperatureCheck = function (ipAddress, limit, name, port, community, interval)
    {
        try
        {
            if (typeof ipAddress == "undefined" || ipAddress == "")
                throw new Error("scSNMP.SynologySystemTemperatureCheck: parameter ipAddress is missing"); //Throw an Error if ip address is missing

            var ipAddress = ipAddress; //Store IP address
            var limit = (typeof limit == "undefined" || typeof limit !== "number") ? 50 : limit; //Store limit
            var name = (typeof name == "undefined" || typeof name !== "string" || name == "") ? "<NONAME>" : name; //Store name
            var port = (typeof port == "undefined" || typeof port !== "number") ? 161 : port; //Store poll
            var community = (typeof community == "undefined" || typeof community !== "string" || community == "") ? "public" : community; //Store community
            var interval = (typeof interval == "undefined" || typeof interval !== "number") ? 10000 : interval; //Store interval(how often to poll)
            var OID = "1.3.6.1.4.1.6574.1.2.0";
            var snmpReader = new SNMPReader(ipAddress, port, community); //Create new SNMPReader object
            snmpReader.AddOID(OID); //Add system temperature oid
            var aboveEdge = false; //Variable to to keep track of positive/negative change
            var belowEdge = false; //Variable to to keep track of positive/negative change
            var eventTarget = new EventTarget(); //Create an EventTarget object

            //Get interval
            this.getInterval = function ()
            {
                return interval;
            }

            //Get EventTarget
            this.getEventTarget = function ()
            {
                return eventTarget;
            }

            var sendEvent = function (error, errorCode, errorMessage, name, eventTarget, limit, isAboveLimit, isBelowLimit, temp) //Define function to send an Event
            {
                var event = new Event(); //Create new Event object
                event.initEvent("DataAvailable", true, true); //Init Event

                event.error = error; //Store error in the event
                event.errorCode = errorCode; //Store errorCode in the event
                event.errorMessage = errorMessage; //Store errorMessage in the event
                event.name = name; //Store name in the event
                event.limit = limit; //Store limit in the event
                event.isAboveLimit = isAboveLimit; //Store above limit status in the event
                event.isBelowLimit = isBelowLimit; //Store below limit status in the event
                event.currentTemperature = temp; //Store currentTemperature
                event.text = "System temperature for '" + name + "' is " + (isAboveLimit ? "above" : "below or equal to") + " limit '" + limit + "C', current temperature: " + temp + "C"; //Add optional text to the event

                if (eventTarget.willTrigger("DataAvailable")) //Check if 'onDataAvailable()' function has been defined in the main script
                    eventTarget.dispatchEvent(event);
                else
                    throw new Error("Event listener 'DataAvailable' is missing");
            }

            //Function to get new data
            this.getData = function ()
            {
                try
                {
                    snmpReader.Get(); //Create new Struct object
                    if (snmpReader.Results.length != 0) //Check if Results is not empty
                    {
                        var temp = snmpReader.Results[OID]; //Get current system temperature
                        var isAboveLimit = temp > limit; //Check if temperature is above limit
                        var isBelowLimit = temp <= limit; //Check if temperature is below or equals to limit
                        if ((isAboveLimit && !aboveEdge) || (isBelowLimit && !belowEdge)) //Check if temperature is above/below the limit at the same time as it was not above/below the limit on last timeout
                        {
                            sendEvent(false, 0, "", name, eventTarget, limit, isAboveLimit, isBelowLimit, temp); // Send event to EventTarget
                        }
                        else
                        {
                            //Debug.Print("Script running, current system temperature: " + temp + ", limit: " + this.limit); //For debug purposes
                        }
                        aboveEdge = isAboveLimit; //Store state for next interval
                        belowEdge = isBelowLimit; //Store state for next interval
                    }
                    else
                    {
                        sendEvent(true, snmpReader.Error, snmpReader.ErrorMessage, name, eventTarget); //Send error
                    }
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemTemperatureCheck.getData(): " + e); //Catch error
                }
            }

            //Create timer object to check if limit is above or below limit on timeout
            var timer = new Timer(1000, false);
            timer.parent = this; //Create reference to this object, to be able to access properties from onTimeout function
            timer.onTimeout = function ()
            {
                try
                {
                    this.parent.getData(); //Execute getData() function
                    this.start(this.parent.getInterval()); //Restart timer
                }
                catch (e)
                {
                    Debug.Print("scSNMP.SynologySystemTemperatureCheck.timer.onTimeout(): " + e); //Catch any error from onTimeout function
                }
            }

            Debug.Print("Created new instance of object 'scSNMP.SynologySystemTemperatureCheck()', name: " + name + ", ipAddress: " + ipAddress + ", limit: " + limit + ", port: " + port + ", community: " + community + ", interval: " + interval / 1000 + " seconds, OID: " + OID);
        }
        catch (e)
        {
            Debug.Print("scSNMP.SynologySystemTemperatureCheck(): " + e);
        }
    }
}
catch (e)
{
    Debug.Print("scSNMP: " + e);
}

//Main Script
/*
try
{
    var init;
    if(init == undefined)
    {
        init      = true;

        var snmp1 = new scSNMP.SynologySystemMIB("192.168.20.70", "EthirisNAS_System");
        snmp1.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - " + event.data.systemStatus.status);
                    Debug.Print("System: " + event.name + " - System temp: " + event.data.temperature.value);
                }
                else
                    Debug.Print("snmp1 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
            }
            catch(e)
            {
                Debug.Print("snmp1.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp1.onDataChange = function()
        //{
        //  if(bSnmp1)
        //      snmp1.getData();
        //}

        snmp2 = new scSNMP.SynologyDiskMIB("192.168.20.70", "EthirisNAS_Disks");
        snmp2.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Disk 1 status: " + event.data["Disk 1"].diskStatus.status);
                    Debug.Print("System: " + event.name + " - Disk 1 temperature: " + event.data["Disk 1"].diskTemperature.value + "C");
                }
                else
                    Debug.Print("snmp2 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
            }
            catch(e)
            {
                Debug.Print("snmp2.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp2.onDataChange = function()
        //{
        //  if(bSnmp2)
        //      snmp2.getData();
        //}

        var snmp3 = new scSNMP.SynologySystemTemperatureCheck("192.168.20.70", 40, "EthirisNAS");
        snmp3.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print(event.text);
                }
                else
                {
                    Debug.Print("snmp3 - System: " + event.name + ", Something went wrong, connection to NAS may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp3.getEventTarget().onDataAvailable: " + e);
            }
        }

        var snmp4 = new scSNMP.HPSystemMIB("192.168.20.60", "HP1950", true, 60000);
        snmp4.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - System CPU usage(%): " + event.data.hh3cEntityExtCpuUsage.value);
                    Debug.Print("System: " + event.name + " - System memory usage(%): " + event.data.hh3cEntityExtMemUsage.value);
                }
                else
                {
                  Debug.Print("snmp4 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp4.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp4.onDataChange = function()
        //{
        //  if(bSnmp4)
        //      snmp4.getData();
        //}

        var snmp5 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 1-6", true, 60000, 161, "public", [1,2,3,4,5,6]);
        snmp5.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 1 bandwidth(Mbits/s): " + event.data["Port 1"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 1 duplex status: " + event.data["Port 1"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp5 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp5.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp5.onDataChange = function()
        //{
        //  if(bSnmp5)
        //      snmp5.getData();
        //}

        var snmp6 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 7-12", true, 60000, 161, "public", [7,8,9,10,11,12]);
        snmp6.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 12 bandwidth(Mbits/s): " + event.data["Port 12"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 12 duplex status: " + event.data["Port 12"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp6 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp6.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp6.onDataChange = function()
        //{
        //  if(bSnmp6)
        //      snmp6.getData();
        //}

        var snmp7 = new scSNMP.HPPortMIB("192.168.20.60", "HP1950 - ports 13-16", true, 60000, 161, "public", [13,14,15,16]);
        snmp7.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Port 16 bandwidth(Mbits/s): " + event.data["Port 16"].ifHighSpeed.value);
                    Debug.Print("System: " + event.name + " - Port 16 duplex status: " + event.data["Port 16"].dot3StatsDuplexStatus.status);
                }
                else
                {
                    Debug.Print("snmp7 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp7.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp7.onDataChange = function()
        //{
        //  if(bSnmp7)
        //      snmp7.getData();
        //}

        var snmp8 = new scSNMP.HPFanMIB("192.168.20.60", "HP1950", [1,2], true, 5000);
        snmp8.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    Debug.Print("System: " + event.name + " - Fan 1 status: " + event.data["Fan 1"].operStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 1 error: " + event.data["Fan 1"].errorStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 2 status: " + event.data["Fan 2"].operStatus.status);
                    Debug.Print("System: " + event.name + " - Fan 2 error: " + event.data["Fan 2"].errorStatus.status);
                }
                else
                {
                    Debug.Print("snmp8 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp8.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp8.onDataChange = function()
        //{
        //  if(bSnmp8)
        //      snmp8.getData();
        //}

        var snmp9 = new scSNMP.ArubaFanMIB("192.168.20.60", "Aruba1930", [1,2], true, 5000);
        snmp9.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "FanStatus" + index + ": " + event.data[i].fanStatus.value);
                        Debug.Print(event.name + "FanStatusString" + index + ": " + event.data[i].fanStatus.status);
                        Debug.Print(event.name + "FanSpeed" + index + ": " + event.data[i].fanSpeed.value);
                    }
                }
                else
                {
                    Debug.Print("snmp9 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp9.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp9.onDataChange = function()
        //{
        //  if(bSnmp9)
        //      snmp9.getData();
        //}

        var snmp10 = new scSNMP.ArubaSystemMIB("192.168.20.90", "Aruba1930");
        snmp10.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        Debug.Print(event.name + "TempSensorValue1" + ": " + event.data.rlPhdUnitEnvParamTempSensorValue.value);
                        Debug.Print(event.name + "TempSensorStatus1" + ": " + event.data.rlPhdUnitEnvParamTempSensorStatus.status);
                        Debug.Print(event.name + "MonitorTemperatureStatusValue1" + ": " + event.data.rlPhdUnitEnvParamMonitorTemperatureStatus.value);
                        Debug.Print(event.name + "MonitorTemperatureStatus1" + ": " + event.data.rlPhdUnitEnvParamMonitorTemperatureStatus.status);
                        Debug.Print(event.name + "CpuUtilDuringLastSecond1" + ": " + event.data.rlCpuUtilDuringLastSecond.value);
                        Debug.Print(event.name + "CpuUtilDuringLastMinute1" + ": " + event.data.rlCpuUtilDuringLastMinute.value);
                        Debug.Print(event.name + "CpuUtilDuringLast5Minutes1" + ": " + event.data.rlCpuUtilDuringLast5Minutes.value);
                        Debug.Print(event.name + "ModelName1" + ": " + event.data.rlPhdUnitGenParamModelName.value);
                        Debug.Print(event.name + "SoftwareVersion1" + ": " + event.data.rlPhdUnitGenParamSoftwareVersion.value);
                        Debug.Print(event.name + "SerialNum1" + ": " + event.data.rlPhdUnitGenParamSerialNum.value);
                        Debug.Print(event.name + "SysUpTime1" + ": " + event.data.sysUpTime.value);
                        Debug.Print(event.name + "SysDescr1" + ": " + event.data.sysDescr.value);
                        Debug.Print(event.name + "MainPsePower1" + ": " + event.data.pethMainPsePower.value);
                        Debug.Print(event.name + "MainPseOperStatus1" + ": " + event.data.pethMainPseOperStatus.status);
                        Debug.Print(event.name + "MainPseConsumptionPower1" + ": " + event.data.pethMainPseConsumptionPower.value);
                        Debug.Print(event.name + "MainPseUsageThreshold1" + ": " + event.data.pethMainPseUsageThreshold.value);
                    }
                }
                else
                {
                    Debug.Print("snmp10 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp10.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp10.onDataChange = function()
        //{
        //  if(bSnmp10)
        //      snmp10.getData();
        //}

        var snmp11 = new scSNMP.ArubaPortMIB("192.168.20.100", "Aruba1930", true, 10000, 161, "public", [1,2,3,4,5,6,7]);
        snmp11.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "PortSpeed" + index + ": " + event.data[i].ifHighSpeed.value);
                        Debug.Print(event.name + "PortDuplexValue" + index + ": " + event.data[i].dot3StatsDuplexStatus.value);
                        Debug.Print(event.name + "PortDuplexStatus" + index + ": " + event.data[i].dot3StatsDuplexStatus.status);
                        Debug.Print(event.name + "PortStatusValue" + index + ": " + event.data[i].ifAdminStatus.value);
                        Debug.Print(event.name + "PortStatus" + index + ": " + event.data[i].ifAdminStatus.status);
                        Debug.Print(event.name + "PortOperatingStatusValue" + index + ": " + event.data[i].ifOperStatus.value);
                        Debug.Print(event.name + "PortOperatingStatus" + index + ": " + event.data[i].ifOperStatus.status);
                    }

                }
                else
                {
                    Debug.Print("snmp11 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp11.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp11.onDataChange = function()
        //{
        //  if(bSnmp11)
        //      snmp11.getData();
        //}

        var snmp12 = new scSNMP.ArubaPoeMIB("192.168.20.100", "Aruba1930", true, 10000, 161, "public", [1,2,3,4,5,6]);
        snmp12.getEventTarget().onDataAvailable = function(event)
        {
            try
            {
                if(!event.error)
                {
                    for(var i in event.data)
                    {
                        var index = i.split(' ')[1];
                        Debug.Print(event.name + "PortOutputVoltage" + index + ": " + event.data[i].rlPethPsePortOutputVoltage.value);
                        Debug.Print(event.name + "PortOutputCurrent" + index + ": " + event.data[i].rlPethPsePortOutputCurrent.value);
                        Debug.Print(event.name + "PortOutputPower" + index + ": " + event.data[i].rlPethPsePortOutputPower.value);
                        Debug.Print(event.name + "PortPowerLimit" + index + ": " + event.data[i].rlPethPsePortPowerLimit.value);
                        Debug.Print(event.name + "PortStatusDescription" + index + ": " + event.data[i].rlPethPsePortStatusDescription.value);
                        Debug.Print(event.name + "PortOperStatus" + index + ": " + event.data[i].rlPethPsePortOperStatus.status);
                        Debug.Print(event.name + "PortLinkPartnerPoeType" + index + ": " + event.data[i].rlPethPsePortLinkPartnerPoeType.status);
                    }
                }
                else
                {
                    Debug.Print("snmp12 - System: " + event.name + ", Something went wrong, connection to Switch may be broken. ErrorCode: " + event.errorCode + ", ErrorMessage: " + event.errorMessage);
                }
            }
            catch(e)
            {
                Debug.Print("snmp12.getEventTarget().onDataAvailable: " + e);
            }
        }
        //bSnmp12.onDataChange = function()
        //{
        //  if(bSnmp12)
        //      snmp12.getData();
        //}
    }
}
catch(e)
{
    Debug.Print("Main script: " + e);
}
*/