Fix a couple more odd string->float types and add docs/dashboard
This commit is contained in:
		
							parent
							
								
									44ca420580
								
							
						
					
					
						commit
						f27c96775f
					
				| 
						 | 
					@ -1,12 +1,104 @@
 | 
				
			||||||
# Unifi
 | 
					# Unifi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Collect your Unifi Controller Client data and send it to an InfluxDB instance. Grafana dashboard included.
 | 
					Collect your Unifi Controller Data and send it to an InfluxDB instance.
 | 
				
			||||||
 | 
					Grafana dashboards included.
 | 
				
			||||||

 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Installation
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[See the Wiki!](https://github.com/davidnewhall/unifi-poller/wiki/Installation)
 | 
					[See the Wiki!](https://github.com/davidnewhall/unifi-poller/wiki/Installation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Backstory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Okay, so here's the deal. I found a simple piece of code on github that
 | 
				
			||||||
 | 
					sorta did what I needed; we all know that story. I wanted more data, so
 | 
				
			||||||
 | 
					I added more data collection. I believe I've completely rewritten every
 | 
				
			||||||
 | 
					piece of original code, except the copyright/license file and that's fine
 | 
				
			||||||
 | 
					by me. I probably wouldn't have made it this far if
 | 
				
			||||||
 | 
					[Garrett](https://github.com/dewski/unifi) hadn't written the original
 | 
				
			||||||
 | 
					code I started with. Many props my man.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The original code pulled only the client data. This app now pulls data
 | 
				
			||||||
 | 
					for clients, access points, security gateways and switches. I currently
 | 
				
			||||||
 | 
					own two UAP-AC-PROs, one USG-3 and one US-24-250W. If your devices differ
 | 
				
			||||||
 | 
					this app may miss some data. I'm willing to help and make it better.
 | 
				
			||||||
 | 
					Open an [Issue](https://github.com/davidnewhall/unifi-poller/issues) and
 | 
				
			||||||
 | 
					we'll figure out how to get things working for you.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# What's this data good for?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I've been trying to get my UAP data into Grafana. Sure, google search that.
 | 
				
			||||||
 | 
					You'll find [this](https://community.ubnt.com/t5/UniFi-Wireless/Grafana-dashboard-for-UniFi-APs-now-available/td-p/1833532).
 | 
				
			||||||
 | 
					And that's all you'll find. What if you don't want to deal with SNMP?
 | 
				
			||||||
 | 
					Well, here you go. I've replicated 90% of what you see on those SNMP-powered
 | 
				
			||||||
 | 
					dashboards with this Go app running on the same mac as my Unifi controller.
 | 
				
			||||||
 | 
					All without enabling SNMP nor trying to understand those OIDs. Mad props
 | 
				
			||||||
 | 
					to [waterside](https://community.ubnt.com/t5/user/viewprofilepage/user-id/303058)
 | 
				
			||||||
 | 
					for making this dashboard; it gave me a fantastic start to making my own.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# What now...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- I probably suck at InfluxDB.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I don't know what should be a tag and what should be a field. I think
 | 
				
			||||||
 | 
					I did my best, but there's certainly room for improvements in both
 | 
				
			||||||
 | 
					the data input and the Grafana graphs (output).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- The USW and USG code needs love.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Up to this point, my focus has been on UAP. I have only included dashboards
 | 
				
			||||||
 | 
					that focus on UAP. I am still working on the other two, but it may be a while
 | 
				
			||||||
 | 
					before I get around to publishing them. Help is appreciated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Are there other devices that need to be included?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I have: switch, router, access point. Three total, and the type structs are
 | 
				
			||||||
 | 
					likely missing data for variants of these devices. e.g. Some UAPs have more
 | 
				
			||||||
 | 
					radios, I probably didn't properly account for that. Some gateways have more
 | 
				
			||||||
 | 
					ports, some switches have 10Gb, etc. These are things I do not have data on
 | 
				
			||||||
 | 
					to write code for. If you have these devices, and want them graphed, open an
 | 
				
			||||||
 | 
					Issue and lets discuss.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Better Installation instructions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you're a nerd you can probably figure it out. I'd still like some pretty
 | 
				
			||||||
 | 
					pictures and maybe even a Twitch VOD.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Sanity Checking
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Did I actually graph the right data in the right way? Some validation would
 | 
				
			||||||
 | 
					be nice.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Radios, Frequencies, Interfaces, vAPs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					My access points only seem to have two radios, one interface and vAP per radio.
 | 
				
			||||||
 | 
					I'm not sure if the graphs, as-is, provide enough insight into APs with other
 | 
				
			||||||
 | 
					configurations. Help me figure that out?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# What's it look like?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here's a picture of the Client dashboard.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Here's a picture of the UAP dashboard. This only shows one device, but you can
 | 
				
			||||||
 | 
					select multiple to put specific stats side-by-side.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Woah, there's a library in here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sure is. If you want to write your own code around unifi data, you can import
 | 
				
			||||||
 | 
					the `unidev` library and easily poll your controller. If you have interest in
 | 
				
			||||||
 | 
					how to use the library, or need more features, open an Issue. I'm not committed
 | 
				
			||||||
 | 
					to documenting it unless it seems useful.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Copyright & License
 | 
					## Copyright & License
 | 
				
			||||||
Copyright © 2016 Garrett Bjerkhoel. See [MIT-LICENSE](MIT-LICENSE) for details.
 | 
					- Copyright © 2016 Garrett Bjerkhoel.
 | 
				
			||||||
 | 
					- Copyright © 2018 David Newhall II.
 | 
				
			||||||
 | 
					- See [MIT-LICENSE](MIT-LICENSE) for license information.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					# Grafana Dashboards
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Import these into Grafana to quickly visualize data from your devices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					They may/do use a few plugins: Clock, Discrete, Singlestat, Table
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
		 Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 246 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 141 KiB  | 
| 
						 | 
					@ -9,6 +9,9 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Points generates a device's datapoints for InfluxDB.
 | 
					// Points generates a device's datapoints for InfluxDB.
 | 
				
			||||||
func (u UAP) Points() ([]*influx.Point, error) {
 | 
					func (u UAP) Points() ([]*influx.Point, error) {
 | 
				
			||||||
 | 
						/* I generally suck at InfluxDB, so if I got the tags/fields wrong,
 | 
				
			||||||
 | 
						   please send me a PR or open an Issue to address my faults. Thanks!
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
	var points []*influx.Point
 | 
						var points []*influx.Point
 | 
				
			||||||
	tags := map[string]string{
 | 
						tags := map[string]string{
 | 
				
			||||||
		"id":                      u.ID,
 | 
							"id":                      u.ID,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,12 @@
 | 
				
			||||||
package unidev
 | 
					package unidev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UAP is a Unifi Access Point
 | 
					// UAP is a Unifi Access Point.
 | 
				
			||||||
type UAP struct {
 | 
					type UAP struct {
 | 
				
			||||||
 | 
						/* This was auto generated and then slowly edited by hand
 | 
				
			||||||
 | 
						   to get all the data types right and graphable.
 | 
				
			||||||
 | 
						   No ones feelings will be hurt if you want to break this
 | 
				
			||||||
 | 
							 up into multiple structs, and/or make it better in general.
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
	ID           string  `json:"_id"`
 | 
						ID           string  `json:"_id"`
 | 
				
			||||||
	UUptime      float64 `json:"_uptime"`
 | 
						UUptime      float64 `json:"_uptime"`
 | 
				
			||||||
	AdoptIP      string  `json:"adopt_ip,omitempty"`
 | 
						AdoptIP      string  `json:"adopt_ip,omitempty"`
 | 
				
			||||||
| 
						 | 
					@ -257,17 +262,17 @@ type UAP struct {
 | 
				
			||||||
	} `json:"stat"`
 | 
						} `json:"stat"`
 | 
				
			||||||
	State    int `json:"state"`
 | 
						State    int `json:"state"`
 | 
				
			||||||
	SysStats struct {
 | 
						SysStats struct {
 | 
				
			||||||
		Loadavg1  string  `json:"loadavg_1"`
 | 
							Loadavg1  float64 `json:"loadavg_1,string"`
 | 
				
			||||||
		Loadavg15 string  `json:"loadavg_15"`
 | 
							Loadavg15 float64 `json:"loadavg_15,string"`
 | 
				
			||||||
		Loadavg5  string  `json:"loadavg_5"`
 | 
							Loadavg5  float64 `json:"loadavg_5,string"`
 | 
				
			||||||
		MemBuffer float64 `json:"mem_buffer"`
 | 
							MemBuffer float64 `json:"mem_buffer"`
 | 
				
			||||||
		MemTotal  float64 `json:"mem_total"`
 | 
							MemTotal  float64 `json:"mem_total"`
 | 
				
			||||||
		MemUsed   float64 `json:"mem_used"`
 | 
							MemUsed   float64 `json:"mem_used"`
 | 
				
			||||||
	} `json:"sys_stats"`
 | 
						} `json:"sys_stats"`
 | 
				
			||||||
	SystemStats struct {
 | 
						SystemStats struct {
 | 
				
			||||||
		CPU    string `json:"cpu"`
 | 
							CPU    float64 `json:"cpu,string"`
 | 
				
			||||||
		Mem    string `json:"mem"`
 | 
							Mem    float64 `json:"mem,string"`
 | 
				
			||||||
		Uptime string `json:"uptime"`
 | 
							Uptime float64 `json:"uptime,string"`
 | 
				
			||||||
	} `json:"system-stats"`
 | 
						} `json:"system-stats"`
 | 
				
			||||||
	TxBytes    float64 `json:"tx_bytes"`
 | 
						TxBytes    float64 `json:"tx_bytes"`
 | 
				
			||||||
	TxBytesD   float64 `json:"tx_bytes-d"`
 | 
						TxBytesD   float64 `json:"tx_bytes-d"`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue