github.com/dim13/unifi@v0.0.0-20230308161331-9b04946f5e93/uap.go (about) 1 // Copyright (c) 2014 The unifi Authors. All rights reserved. 2 // Use of this source code is governed by ISC-style license 3 // that can be found in the LICENSE file. 4 5 package unifi 6 7 import ( 8 "encoding/json" 9 "time" 10 ) 11 12 // Access point data 13 type UAP struct { 14 u *Unifi 15 ID string `json:"_id"` 16 //Uptime int `json:"_uptime"` 17 Adopted bool `json:"adopted"` 18 AntennaTable []any `json:"antenna_table"` 19 Bytes int64 `json:"bytes"` 20 BytesD int64 `json:"bytes-d"` 21 BytesR int64 `json:"bytes-r"` 22 Cfgversion string `json:"cfgversion"` 23 ConfigNetwork struct { 24 IP string `json:"ip"` 25 Type string `json:"type"` 26 } `json:"config_network"` 27 ConnectRequestIP string `json:"connect_request_ip"` 28 //ConnectRequestPort int `json:"connect_request_port"` //FIXME: Prior to 5.7.20 type string! 29 ConsideredLostAt int `json:"considered_lost_at"` 30 DeviceID string `json:"device_id"` 31 DownlinkTable []any `json:"downlink_table"` 32 EthernetTable []struct { 33 Mac string `json:"mac"` 34 Name string `json:"name"` 35 NumPort int `json:"num_port"` 36 } `json:"ethernet_table"` 37 FwCaps int `json:"fw_caps"` 38 GuestNumSta int `json:"guest-num_sta"` 39 GuestToken string `json:"guest_token"` 40 HasEth1 bool `json:"has_eth1"` 41 HasSpeaker bool `json:"has_speaker"` 42 InformIP string `json:"inform_ip"` 43 InformURL string `json:"inform_url"` 44 IP string `json:"ip"` 45 Isolated bool `json:"isolated"` 46 KnownCfgversion string `json:"known_cfgversion"` 47 LastSeen int `json:"last_seen"` 48 LedOverride string `json:"led_override"` 49 LicenseState string `json:"license_state"` 50 Locating bool `json:"locating"` 51 52 Mac string `json:"mac"` 53 MapID string `json:"map_id"` 54 Model string `json:"model"` 55 56 Name string `json:"name"` 57 NextHeartbeatAt int `json:"next_heartbeat_at"` 58 NumSta int `json:"num_sta"` 59 PortStats []any `json:"port_stats"` 60 PortTable []Port `json:"port_table,omitempty"` 61 RadioTable []struct { 62 BuiltinAntGain int `json:"builtin_ant_gain"` 63 BuiltinAntenna bool `json:"builtin_antenna"` 64 CurrentAntennaGain int `json:"current_antenna_gain"` 65 MaxTxpower int `json:"max_txpower"` 66 MinTxpower int `json:"min_txpower"` 67 Name string `json:"name"` 68 Nss int `json:"nss"` 69 Radio string `json:"radio"` 70 RadioCaps int `json:"radio_caps"` 71 WlangroupID string `json:"wlangroup_id"` 72 HasDfs bool `json:"has_dfs,omitempty"` 73 HasFccdfs bool `json:"has_fccdfs,omitempty"` 74 Is11Ac bool `json:"is_11ac,omitempty"` 75 } `json:"radio_table"` 76 RadioTableStats []struct { 77 AstBeXmit any `json:"ast_be_xmit"` 78 AstCst any `json:"ast_cst"` 79 AstTxto any `json:"ast_txto"` 80 Channel int `json:"channel"` 81 CuSelfRx int `json:"cu_self_rx"` 82 CuSelfTx int `json:"cu_self_tx"` 83 CuTotal int `json:"cu_total"` 84 Extchannel int `json:"extchannel"` 85 Gain int `json:"gain"` 86 GuestNumSta int `json:"guest-num_sta"` 87 Name string `json:"name"` 88 NumSta int `json:"num_sta"` 89 Radio string `json:"radio"` 90 State string `json:"state"` 91 TxPackets int64 `json:"tx_packets"` 92 TxPower int64 `json:"tx_power"` 93 TxRetries int64 `json:"tx_retries"` 94 UserNumSta int `json:"user-num_sta"` 95 } `json:"radio_table_stats"` 96 97 RxBytes int64 `json:"rx_bytes"` 98 RxBytesD int64 `json:"rx_bytes-d"` 99 ScanRadioTable []any `json:"scan_radio_table"` 100 Scanning bool `json:"scanning"` 101 Serial string `json:"serial"` 102 SiteID string `json:"site_id"` 103 SpectrumScanning bool `json:"spectrum_scanning"` 104 SSHSessionTable []any `json:"ssh_session_table"` 105 Stat struct { 106 Ap struct { 107 Ap string `json:"ap"` 108 Bytes float64 `json:"bytes"` 109 Datetime time.Time `json:"datetime"` 110 Duration float64 `json:"duration"` 111 GuestRxBytes float64 `json:"guest-rx_bytes"` 112 GuestRxCrypts float64 `json:"guest-rx_crypts"` 113 GuestRxDropped float64 `json:"guest-rx_dropped"` 114 GuestRxErrors float64 `json:"guest-rx_errors"` 115 GuestRxFrags float64 `json:"guest-rx_frags"` 116 GuestRxPackets float64 `json:"guest-rx_packets"` 117 GuestTxBytes float64 `json:"guest-tx_bytes"` 118 GuestTxDropped float64 `json:"guest-tx_dropped"` 119 GuestTxErrors float64 `json:"guest-tx_errors"` 120 GuestTxPackets float64 `json:"guest-tx_packets"` 121 GuestTxRetries float64 `json:"guest-tx_retries"` 122 O string `json:"o"` 123 Oid string `json:"oid"` 124 RxBytes float64 `json:"rx_bytes"` 125 RxCrypts float64 `json:"rx_crypts"` 126 RxDropped float64 `json:"rx_dropped"` 127 RxErrors float64 `json:"rx_errors"` 128 RxFrags float64 `json:"rx_frags"` 129 RxPackets float64 `json:"rx_packets"` 130 SiteID string `json:"site_id"` 131 Time int64 `json:"time"` 132 TxBytes float64 `json:"tx_bytes"` 133 TxDropped float64 `json:"tx_dropped"` 134 TxErrors float64 `json:"tx_errors"` 135 TxPackets float64 `json:"tx_packets"` 136 TxRetries float64 `json:"tx_retries"` 137 UserRxBytes float64 `json:"user-rx_bytes"` 138 UserRxCrypts float64 `json:"user-rx_crypts"` 139 UserRxDropped float64 `json:"user-rx_dropped"` 140 UserRxErrors float64 `json:"user-rx_errors"` 141 UserRxFrags float64 `json:"user-rx_frags"` 142 UserRxPackets float64 `json:"user-rx_packets"` 143 UserTxBytes float64 `json:"user-tx_bytes"` 144 UserTxDropped float64 `json:"user-tx_dropped"` 145 UserTxErrors float64 `json:"user-tx_errors"` 146 UserTxPackets float64 `json:"user-tx_packets"` 147 UserTxRetries float64 `json:"user-tx_retries"` 148 UserWifi0Ath05Aa99001C9E77C011Dc149F7RxBytes float64 `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-rx_bytes"` 149 UserWifi0Ath05Aa99001C9E77C011Dc149F7RxPackets float64 `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-rx_packets"` 150 UserWifi0Ath05Aa99001C9E77C011Dc149F7TxBytes float64 `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-tx_bytes"` 151 UserWifi0Ath05Aa99001C9E77C011Dc149F7TxPackets float64 `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-tx_packets"` 152 UserWifi0RxBytes float64 `json:"user-wifi0-rx_bytes"` 153 UserWifi0RxCrypts float64 `json:"user-wifi0-rx_crypts"` 154 UserWifi0RxDropped float64 `json:"user-wifi0-rx_dropped"` 155 UserWifi0RxErrors float64 `json:"user-wifi0-rx_errors"` 156 UserWifi0RxFrags float64 `json:"user-wifi0-rx_frags"` 157 UserWifi0RxPackets float64 `json:"user-wifi0-rx_packets"` 158 UserWifi0TxBytes float64 `json:"user-wifi0-tx_bytes"` 159 UserWifi0TxDropped float64 `json:"user-wifi0-tx_dropped"` 160 UserWifi0TxErrors float64 `json:"user-wifi0-tx_errors"` 161 UserWifi0TxPackets float64 `json:"user-wifi0-tx_packets"` 162 UserWifi0TxRetries float64 `json:"user-wifi0-tx_retries"` 163 UserWifi1Ath2NullRxBytes float64 `json:"user-wifi1-ath2-null-rx_bytes"` 164 UserWifi1Ath2NullRxPackets float64 `json:"user-wifi1-ath2-null-rx_packets"` 165 UserWifi1Ath2NullTxBytes float64 `json:"user-wifi1-ath2-null-tx_bytes"` 166 UserWifi1Ath2NullTxPackets float64 `json:"user-wifi1-ath2-null-tx_packets"` 167 UserWifi1RxBytes float64 `json:"user-wifi1-rx_bytes"` 168 UserWifi1RxCrypts float64 `json:"user-wifi1-rx_crypts"` 169 UserWifi1RxDropped float64 `json:"user-wifi1-rx_dropped"` 170 UserWifi1RxErrors float64 `json:"user-wifi1-rx_errors"` 171 UserWifi1RxFrags float64 `json:"user-wifi1-rx_frags"` 172 UserWifi1RxPackets float64 `json:"user-wifi1-rx_packets"` 173 UserWifi1TxBytes float64 `json:"user-wifi1-tx_bytes"` 174 UserWifi1TxDropped float64 `json:"user-wifi1-tx_dropped"` 175 UserWifi1TxErrors float64 `json:"user-wifi1-tx_errors"` 176 UserWifi1TxPackets float64 `json:"user-wifi1-tx_packets"` 177 UserWifi1TxRetries float64 `json:"user-wifi1-tx_retries"` 178 Wifi0RxBytes float64 `json:"wifi0-rx_bytes"` 179 Wifi0RxCrypts float64 `json:"wifi0-rx_crypts"` 180 Wifi0RxDropped float64 `json:"wifi0-rx_dropped"` 181 Wifi0RxErrors float64 `json:"wifi0-rx_errors"` 182 Wifi0RxFrags float64 `json:"wifi0-rx_frags"` 183 Wifi0RxPackets float64 `json:"wifi0-rx_packets"` 184 Wifi0TxBytes float64 `json:"wifi0-tx_bytes"` 185 Wifi0TxDropped float64 `json:"wifi0-tx_dropped"` 186 Wifi0TxErrors float64 `json:"wifi0-tx_errors"` 187 Wifi0TxPackets float64 `json:"wifi0-tx_packets"` 188 Wifi0TxRetries float64 `json:"wifi0-tx_retries"` 189 Wifi1RxBytes float64 `json:"wifi1-rx_bytes"` 190 Wifi1RxCrypts float64 `json:"wifi1-rx_crypts"` 191 Wifi1RxDropped float64 `json:"wifi1-rx_dropped"` 192 Wifi1RxErrors float64 `json:"wifi1-rx_errors"` 193 Wifi1RxFrags float64 `json:"wifi1-rx_frags"` 194 Wifi1RxPackets float64 `json:"wifi1-rx_packets"` 195 Wifi1TxBytes float64 `json:"wifi1-tx_bytes"` 196 Wifi1TxDropped float64 `json:"wifi1-tx_dropped"` 197 Wifi1TxErrors float64 `json:"wifi1-tx_errors"` 198 Wifi1TxPackets float64 `json:"wifi1-tx_packets"` 199 Wifi1TxRetries float64 `json:"wifi1-tx_retries"` 200 } `json:"at"` 201 } `json:"stat"` 202 State DevState `json:"state"` 203 SysStats struct { 204 } `json:"sys_stats"` 205 SystemStats struct { 206 } `json:"system-stats"` 207 TxBytes int64 `json:"tx_bytes"` 208 TxBytesD int64 `json:"tx_bytes-d"` 209 Type string `json:"type"` 210 Upgradable bool `json:"upgradable"` 211 UpgradeState int `json:"upgrade_state"` 212 UpgradeToFirmware string `json:"upgrade_to_firmware"` 213 Uplink struct { 214 FullDuplex bool `json:"full_duplex"` 215 IP string `json:"ip"` 216 Mac string `json:"mac"` 217 MaxSpeed int `json:"max_speed"` 218 Name string `json:"name"` 219 Netmask string `json:"netmask"` 220 NumPort int `json:"num_port"` 221 RxBytes int64 `json:"rx_bytes"` 222 RxBytesR int64 `json:"rx_bytes-r"` 223 RxDropped int64 `json:"rx_dropped"` 224 RxErrors int64 `json:"rx_errors"` 225 RxMulticast int64 `json:"rx_multicast"` 226 RxPackets int64 `json:"rx_packets"` 227 Speed int `json:"speed"` 228 TxBytes int64 `json:"tx_bytes"` 229 TxBytesR int64 `json:"tx_bytes-r"` 230 TxDropped int64 `json:"tx_dropped"` 231 TxErrors int64 `json:"tx_errors"` 232 TxPackets int64 `json:"tx_packets"` 233 Type string `json:"type"` 234 Up bool `json:"up"` 235 } `json:"uplink"` 236 UplinkTable []any `json:"uplink_table"` 237 Uptime int `json:"uptime"` 238 UserNumSta int `json:"user-num_sta"` 239 VapTable []struct { 240 ApMac string `json:"ap_mac"` 241 Bssid string `json:"bssid"` 242 Ccq int `json:"ccq"` 243 Channel int `json:"channel"` 244 Essid string `json:"essid"` 245 ID string `json:"id"` 246 IsGuest bool `json:"is_guest"` 247 IsWep bool `json:"is_wep"` 248 MapID string `json:"map_id"` 249 Name string `json:"name"` 250 NumSta int `json:"num_sta"` 251 Radio string `json:"radio"` 252 RadioName string `json:"radio_name"` 253 RxBytes int64 `json:"rx_bytes"` 254 RxCrypts int64 `json:"rx_crypts"` 255 RxDropped int64 `json:"rx_dropped"` 256 RxErrors int64 `json:"rx_errors"` 257 RxFrags int64 `json:"rx_frags"` 258 RxNwids int64 `json:"rx_nwids"` 259 RxPackets int64 `json:"rx_packets"` 260 SiteID string `json:"site_id"` 261 State string `json:"state"` 262 T string `json:"t"` 263 TxBytes int64 `json:"tx_bytes"` 264 TxDropped int64 `json:"tx_dropped"` 265 TxErrors int64 `json:"tx_errors"` 266 TxPackets int64 `json:"tx_packets"` 267 TxPower int64 `json:"tx_power"` 268 TxRetries int64 `json:"tx_retries"` 269 Up bool `json:"up"` 270 Usage string `json:"usage"` 271 WlanconfID string `json:"wlanconf_id"` 272 } `json:"vap_table"` 273 Version string `json:"version"` 274 VersionIncompatible bool `json:"version_incompatible"` 275 VwireEnabled bool `json:"vwireEnabled"` 276 VwireTable []any `json:"vwire_table"` 277 VwireVapTable []any `json:"vwire_vap_table"` 278 WifiCaps int `json:"wifi_caps"` 279 X fuzzyFloat `json:"x"` 280 XAuthkey string `json:"x_authkey"` 281 XFingerprint string `json:"x_fingerprint"` 282 XHasSSHHostkey bool `json:"x_has_ssh_hostkey"` 283 XInformAuthkey string `json:"x_inform_authkey"` 284 XSSHHostkeyFingerprint string `json:"x_ssh_hostkey_fingerprint"` 285 XVwirekey string `json:"x_vwirekey"` 286 Y fuzzyFloat `json:"y"` 287 } 288 289 type UAPmap map[string]UAP 290 291 // Returns a slice of access points 292 // Deprecated: Use UAPs instead 293 func (u *Unifi) Aps(site *Site) ([]UAP, error) { 294 return u.UAPs(site) 295 } 296 297 // Returns a slice of access points 298 func (u *Unifi) UAPs(site *Site) ([]UAP, error) { 299 rawDevices, err := u.RawDevices(site, "uap") 300 if err != nil { 301 return nil, err 302 } 303 304 // Devices 305 var uaps []UAP 306 for _, v := range rawDevices { 307 var uap UAP 308 err := json.Unmarshal(v.Data, &uap) 309 if err != nil { 310 return uaps, err 311 } 312 // Set unifi pointer 313 uap.u = u 314 315 uaps = append(uaps, uap) 316 } 317 return uaps, nil 318 } 319 320 // Returns a map of access points with mac as a key 321 func (u *Unifi) UAPMap(site *Site) (UAPmap, error) { 322 aps, err := u.Aps(site) 323 if err != nil { 324 return nil, err 325 } 326 m := make(UAPmap) 327 for _, a := range aps { 328 m[a.Mac] = a 329 } 330 return m, nil 331 } 332 333 // Reboot access point 334 func (a UAP) Restart() error { 335 if a.u == nil { 336 return ErrLoginFirst 337 } 338 return a.u.devcmd(a.Mac, "restart") 339 } 340 341 func (a UAP) DeviceName() string { 342 if a.Name != "" { 343 return a.Name 344 } 345 // If no name is given, return mac as name 346 return a.Mac 347 } 348 349 func (a UAP) ModelName() string { 350 if m, ok := model[a.Model]; ok { 351 return m 352 } 353 return a.Model 354 }