github.com/dim13/unifi@v0.0.0-20230308161331-9b04946f5e93/event.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  	"fmt"
    10  	"time"
    11  )
    12  
    13  type EventFilter struct {
    14  	Limit  int `json:"_limit"`
    15  	Start  int `json:"_start"`
    16  	Within int `json:"within"`
    17  }
    18  
    19  type RawEvent struct {
    20  	Data json.RawMessage
    21  	Key  string
    22  }
    23  
    24  type BasicEvent struct {
    25  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
    26  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
    27  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field	ID        string `json:"_id"`
    28  	ID             string    `json:"_id"`
    29  	Datetime       time.Time
    30  	Key            string `json:"key"`
    31  	Message        string `json:"msg"`
    32  	Time           int64  `json:"time"`
    33  }
    34  
    35  type EVT_AD_Login struct {
    36  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
    37  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
    38  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
    39  	ID             string    `json:"_id"`
    40  	Admin          string    `json:"admin"`
    41  	Datetime       time.Time `json:"datetime"`
    42  	IP             string    `json:"ip"`
    43  	IsAdmin        bool      `json:"is_admin"`
    44  	Key            string    `json:"key"`
    45  	Msg            string    `json:"msg"`
    46  	SiteID         string    `json:"site_id"`
    47  	Subsystem      string    `json:"subsystem"`
    48  	Time           int64     `json:"time"`
    49  }
    50  
    51  type EVT_AP_Adopted struct {
    52  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
    53  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
    54  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
    55  	ID             string    `json:"_id"`
    56  	Admin          string    `json:"admin"`
    57  	Ap             string    `json:"ap"`
    58  	ApName         string    `json:"ap_name"`
    59  	Datetime       time.Time `json:"datetime"`
    60  	IsAdmin        bool      `json:"is_admin"`
    61  	Key            string    `json:"key"`
    62  	Msg            string    `json:"msg"`
    63  	SiteID         string    `json:"site_id"`
    64  	Subsystem      string    `json:"subsystem"`
    65  	Time           int64     `json:"time"`
    66  }
    67  
    68  type EVT_AP_Connected struct {
    69  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
    70  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
    71  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
    72  	ID             string    `json:"_id"`
    73  	Ap             string    `json:"ap"`
    74  	ApName         string    `json:"ap_name"`
    75  	Datetime       time.Time `json:"datetime"`
    76  	Key            string    `json:"key"`
    77  	Msg            string    `json:"msg"`
    78  	SiteID         string    `json:"site_id"`
    79  	Subsystem      string    `json:"subsystem"`
    80  	Time           int64     `json:"time"`
    81  }
    82  
    83  type EVT_AP_DetectRogueAP struct {
    84  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
    85  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
    86  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
    87  	ID             string    `json:"_id"`
    88  	Datetime       time.Time `json:"datetime"`
    89  	Essid          string    `json:"essid"`
    90  	Key            string    `json:"key"`
    91  	Mac            string    `json:"mac"`
    92  	Msg            string    `json:"msg"`
    93  	SiteID         string    `json:"site_id"`
    94  	Subsystem      string    `json:"subsystem"`
    95  	Time           int64     `json:"time"`
    96  }
    97  
    98  type EVT_AP_DiscoveredPending struct {
    99  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   100  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   101  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   102  	ID             string    `json:"_id"`
   103  	Ap             string    `json:"ap"`
   104  	ApName         string    `json:"ap_name"`
   105  	Datetime       time.Time `json:"datetime"`
   106  	Key            string    `json:"key"`
   107  	Msg            string    `json:"msg"`
   108  	SiteID         string    `json:"site_id"`
   109  	Subsystem      string    `json:"subsystem"`
   110  	Time           int64     `json:"time"`
   111  }
   112  
   113  type EVT_AP_Isolated struct {
   114  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   115  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   116  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   117  	ID             string    `json:"_id"`
   118  	Ap             string    `json:"ap"`
   119  	Datetime       time.Time `json:"datetime"`
   120  	Key            string    `json:"key"`
   121  	Msg            string    `json:"msg"`
   122  	SiteID         string    `json:"site_id"`
   123  	Subsystem      string    `json:"subsystem"`
   124  	Time           int64     `json:"time"`
   125  }
   126  
   127  type EVT_AP_Lost_Contact struct {
   128  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   129  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   130  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   131  	ID             string    `json:"_id"`
   132  	Ap             string    `json:"ap"`
   133  	ApName         string    `json:"ap_name"`
   134  	Datetime       time.Time `json:"datetime"`
   135  	Key            string    `json:"key"`
   136  	Msg            string    `json:"msg"`
   137  	SiteID         string    `json:"site_id"`
   138  	Subsystem      string    `json:"subsystem"`
   139  	Time           int64     `json:"time"`
   140  }
   141  
   142  type EVT_AP_PossibleInterference struct {
   143  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   144  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   145  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   146  	ID             string    `json:"_id"`
   147  	Ap             string    `json:"ap"`
   148  	Channel        string    `json:"channel"`
   149  	Datetime       time.Time `json:"datetime"`
   150  	Key            string    `json:"key"`
   151  	Msg            string    `json:"msg"`
   152  	Radio          string    `json:"radio"`
   153  	SiteID         string    `json:"site_id"`
   154  	Subsystem      string    `json:"subsystem"`
   155  	Time           int64     `json:"time"`
   156  }
   157  
   158  type EVT_AP_Restarted struct {
   159  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   160  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   161  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   162  	ID             string    `json:"_id"`
   163  	Admin          string    `json:"admin"`
   164  	Ap             string    `json:"ap"`
   165  	ApName         string    `json:"ap_name"`
   166  	Datetime       time.Time `json:"datetime"`
   167  	IsAdmin        bool      `json:"is_admin"`
   168  	Key            string    `json:"key"`
   169  	Msg            string    `json:"msg"`
   170  	SiteID         string    `json:"site_id"`
   171  	Subsystem      string    `json:"subsystem"`
   172  	Time           int64     `json:"time"`
   173  }
   174  
   175  type EVT_AP_RestartedUnknown struct {
   176  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   177  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   178  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   179  	ID             string    `json:"_id"`
   180  	Ap             string    `json:"ap"`
   181  	ApName         string    `json:"ap_name"`
   182  	Datetime       time.Time `json:"datetime"`
   183  	Duration       int       `json:"duration"`
   184  	Key            string    `json:"key"`
   185  	Msg            string    `json:"msg"`
   186  	NumSta         int       `json:"num_sta"`
   187  	SiteID         string    `json:"site_id"`
   188  	Subsystem      string    `json:"subsystem"`
   189  	Time           int64     `json:"time"`
   190  }
   191  
   192  type EVT_AP_Upgraded struct {
   193  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   194  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   195  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   196  	ID             string    `json:"_id"`
   197  	Ap             string    `json:"ap"`
   198  	ApName         string    `json:"ap_name"`
   199  	Datetime       time.Time `json:"datetime"`
   200  	Key            string    `json:"key"`
   201  	Msg            string    `json:"msg"`
   202  	SiteID         string    `json:"site_id"`
   203  	Subsystem      string    `json:"subsystem"`
   204  	Time           int64     `json:"time"`
   205  	VersionFrom    string    `json:"version_from"`
   206  	VersionTo      string    `json:"version_to"`
   207  }
   208  
   209  type EVT_AP_UpgradeScheduled struct {
   210  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   211  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   212  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   213  	ID             string    `json:"_id"`
   214  	Admin          string    `json:"admin"`
   215  	Ap             string    `json:"ap"`
   216  	ApName         string    `json:"ap_name"`
   217  	Datetime       time.Time `json:"datetime"`
   218  	IsAdmin        bool      `json:"is_admin"`
   219  	Key            string    `json:"key"`
   220  	Msg            string    `json:"msg"`
   221  	SiteID         string    `json:"site_id"`
   222  	Subsystem      string    `json:"subsystem"`
   223  	Time           int64     `json:"time"`
   224  }
   225  
   226  type EVT_LU_Connected struct {
   227  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   228  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   229  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   230  	ID             string    `json:"_id"`
   231  	Datetime       time.Time `json:"datetime"`
   232  	Key            string    `json:"key"`
   233  	Msg            string    `json:"msg"`
   234  	Network        string    `json:"network"`
   235  	SiteID         string    `json:"site_id"`
   236  	Subsystem      string    `json:"subsystem"`
   237  	Time           int64     `json:"time"`
   238  	User           string    `json:"user"`
   239  }
   240  
   241  type EVT_LU_Disconnected struct {
   242  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   243  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   244  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   245  	ID             string    `json:"_id"`
   246  	Bytes          int       `json:"bytes"`
   247  	Datetime       time.Time `json:"datetime"`
   248  	Duration       int       `json:"duration"`
   249  	Key            string    `json:"key"`
   250  	Msg            string    `json:"msg"`
   251  	Network        string    `json:"network"`
   252  	SiteID         string    `json:"site_id"`
   253  	Subsystem      string    `json:"subsystem"`
   254  	Time           int64     `json:"time"`
   255  	User           string    `json:"user"`
   256  }
   257  
   258  type EVT_SW_Adopted struct {
   259  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   260  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   261  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   262  	ID             string    `json:"_id"`
   263  	Admin          string    `json:"admin"`
   264  	Datetime       time.Time `json:"datetime"`
   265  	IsAdmin        bool      `json:"is_admin"`
   266  	Key            string    `json:"key"`
   267  	Msg            string    `json:"msg"`
   268  	SiteID         string    `json:"site_id"`
   269  	Subsystem      string    `json:"subsystem"`
   270  	Sw             string    `json:"sw"`
   271  	SwName         string    `json:"sw_name"`
   272  	Time           int64     `json:"time"`
   273  }
   274  
   275  type EVT_SW_Connected struct {
   276  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   277  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   278  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   279  	ID             string    `json:"_id"`
   280  	Datetime       time.Time `json:"datetime"`
   281  	Key            string    `json:"key"`
   282  	Msg            string    `json:"msg"`
   283  	SiteID         string    `json:"site_id"`
   284  	Subsystem      string    `json:"subsystem"`
   285  	Sw             string    `json:"sw"`
   286  	SwName         string    `json:"sw_name"`
   287  	Time           int64     `json:"time"`
   288  }
   289  
   290  type EVT_SW_DiscoveredPending struct {
   291  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   292  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   293  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   294  	ID             string    `json:"_id"`
   295  	Datetime       time.Time `json:"datetime"`
   296  	Key            string    `json:"key"`
   297  	Msg            string    `json:"msg"`
   298  	SiteID         string    `json:"site_id"`
   299  	Subsystem      string    `json:"subsystem"`
   300  	Sw             string    `json:"sw"`
   301  	SwName         string    `json:"sw_name"`
   302  	Time           int64     `json:"time"`
   303  }
   304  
   305  type EVT_SW_Lost_Contact struct {
   306  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   307  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   308  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   309  	ID             string    `json:"_id"`
   310  	Datetime       time.Time `json:"datetime"`
   311  	Key            string    `json:"key"`
   312  	Msg            string    `json:"msg"`
   313  	SiteID         string    `json:"site_id"`
   314  	Subsystem      string    `json:"subsystem"`
   315  	Sw             string    `json:"sw"`
   316  	SwName         string    `json:"sw_name"`
   317  	Time           int64     `json:"time"`
   318  }
   319  
   320  // EVT_SW_PoeDisconnect controller version 5.8.21+ / USW firmware 3.9.27+
   321  type EVT_SW_PoeDisconnect struct {
   322  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   323  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   324  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   325  	ID             string    `json:"_id"`
   326  	Datetime       time.Time `json:"datetime"`
   327  	Key            string    `json:"key"`
   328  	Msg            string    `json:"msg"`
   329  	Port           int       `json:"port"`
   330  	SiteID         string    `json:"site_id"`
   331  	Subsystem      string    `json:"subsystem"`
   332  	Sw             string    `json:"sw"`
   333  	SwName         string    `json:"sw_name"`
   334  	Time           int64     `json:"time"`
   335  }
   336  
   337  type EVT_SW_RestartedUnknown struct {
   338  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   339  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   340  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   341  	ID             string    `json:"_id"`
   342  	Datetime       time.Time `json:"datetime"`
   343  	Key            string    `json:"key"`
   344  	Msg            string    `json:"msg"`
   345  	SiteID         string    `json:"site_id"`
   346  	Subsystem      string    `json:"subsystem"`
   347  	Sw             string    `json:"sw"`
   348  	SwName         string    `json:"sw_name"`
   349  	Time           int64     `json:"time"`
   350  }
   351  
   352  type EVT_SW_Upgraded struct {
   353  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   354  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   355  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   356  	ID             string    `json:"_id"`
   357  	Datetime       time.Time `json:"datetime"`
   358  	Key            string    `json:"key"`
   359  	Msg            string    `json:"msg"`
   360  	SiteID         string    `json:"site_id"`
   361  	Subsystem      string    `json:"subsystem"`
   362  	Sw             string    `json:"sw"`
   363  	SwName         string    `json:"sw_name"`
   364  	Time           int64     `json:"time"`
   365  	VersionFrom    string    `json:"version_from"`
   366  	VersionTo      string    `json:"version_to"`
   367  }
   368  
   369  type EVT_SW_UpgradeScheduled struct {
   370  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   371  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   372  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   373  	ID             string    `json:"_id"`
   374  	Admin          string    `json:"admin"`
   375  	Datetime       time.Time `json:"datetime"`
   376  	IsAdmin        bool      `json:"is_admin"`
   377  	Key            string    `json:"key"`
   378  	Msg            string    `json:"msg"`
   379  	SiteID         string    `json:"site_id"`
   380  	Subsystem      string    `json:"subsystem"`
   381  	Sw             string    `json:"sw"`
   382  	SwName         string    `json:"sw_name"`
   383  	Time           int64     `json:"time"`
   384  }
   385  
   386  type EVT_WU_Connected struct {
   387  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   388  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   389  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   390  	ID             string    `json:"_id"`
   391  	Ap             string    `json:"ap"`
   392  	Channel        string    `json:"channel"`
   393  	Datetime       time.Time `json:"datetime"`
   394  	Hostname       string    `json:"hostname"`
   395  	Key            string    `json:"key"`
   396  	Msg            string    `json:"msg"`
   397  	Radio          string    `json:"radio"`
   398  	SiteID         string    `json:"site_id"`
   399  	Ssid           string    `json:"ssid"`
   400  	Subsystem      string    `json:"subsystem"`
   401  	Time           int64     `json:"time"`
   402  	User           string    `json:"user"`
   403  }
   404  
   405  type EVT_WU_Disconnected struct {
   406  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   407  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   408  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   409  	ID             string    `json:"_id"`
   410  	Ap             string    `json:"ap"`
   411  	Bytes          int       `json:"bytes"`
   412  	Datetime       time.Time `json:"datetime"`
   413  	Duration       int       `json:"duration"`
   414  	Hostname       string    `json:"hostname"`
   415  	Key            string    `json:"key"`
   416  	Msg            string    `json:"msg"`
   417  	SiteID         string    `json:"site_id"`
   418  	Ssid           string    `json:"ssid"`
   419  	Subsystem      string    `json:"subsystem"`
   420  	Time           int64     `json:"time"`
   421  	User           string    `json:"user"`
   422  }
   423  
   424  type EVT_WU_Roam struct {
   425  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   426  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   427  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   428  	ID             string    `json:"_id"`
   429  	ApFrom         string    `json:"ap_from"`
   430  	ApTo           string    `json:"ap_to"`
   431  	Channel        string    `json:"channel"`
   432  	ChannelFrom    string    `json:"channel_from"`
   433  	ChannelTo      string    `json:"channel_to"`
   434  	Datetime       time.Time `json:"datetime"`
   435  	Key            string    `json:"key"`
   436  	Msg            string    `json:"msg"`
   437  	Radio          string    `json:"radio"`
   438  	RadioFrom      string    `json:"radio_from"`
   439  	RadioTo        string    `json:"radio_to"`
   440  	SiteID         string    `json:"site_id"`
   441  	Ssid           string    `json:"ssid"`
   442  	Subsystem      string    `json:"subsystem"`
   443  	Time           int64     `json:"time"`
   444  	User           string    `json:"user"`
   445  }
   446  
   447  type EVT_WU_RoamRadio struct {
   448  	Archived       *bool     `json:"archived,omitempty"`         // Alarm field
   449  	HandledAdminID string    `json:"handled_admin_id,omitempty"` // Alarm field
   450  	HandledTime    time.Time `json:"handled_time,omitempty"`     // Alarm field
   451  	ID             string    `json:"_id"`
   452  	Ap             string    `json:"ap"`
   453  	ChannelFrom    string    `json:"channel_from"`
   454  	ChannelTo      string    `json:"channel_to"`
   455  	Datetime       time.Time `json:"datetime"`
   456  	Key            string    `json:"key"`
   457  	Msg            string    `json:"msg"`
   458  	RadioFrom      string    `json:"radio_from"`
   459  	RadioTo        string    `json:"radio_to"`
   460  	SiteID         string    `json:"site_id"`
   461  	Subsystem      string    `json:"subsystem"`
   462  	Time           int64     `json:"time"`
   463  	User           string    `json:"user"`
   464  }
   465  
   466  // Returns a slice of json RawDevices as received by the controller
   467  func (u *Unifi) RawEvents(site *Site, filter any) ([]RawEvent, error) {
   468  
   469  	var rawEvents []RawEvent
   470  
   471  	// Response from controller
   472  	var response struct {
   473  		Data []json.RawMessage
   474  		Meta meta
   475  	}
   476  
   477  	err := u.parse(site, "stat/event", filter, &response)
   478  	if err != nil {
   479  		return nil, err
   480  	}
   481  
   482  	for _, d := range response.Data {
   483  
   484  		// unmarshal into a map to check the "type" field
   485  		var obj map[string]any
   486  		err := json.Unmarshal(d, &obj)
   487  		if err != nil {
   488  			return nil, err
   489  		}
   490  
   491  		eventKey, ok := obj["key"].(string)
   492  		if !ok {
   493  			return nil, fmt.Errorf("error on retrieving object type from raw json")
   494  		}
   495  
   496  		var re RawEvent
   497  		re.Key = eventKey
   498  		re.Data = d
   499  		rawEvents = append(rawEvents, re)
   500  	}
   501  	return rawEvents, err
   502  }
   503  
   504  // Returns a slice of json RawDevices as received by the controller
   505  func (u *Unifi) BasicEvents(site *Site, filter any) ([]BasicEvent, error) {
   506  
   507  	var basicEvents []BasicEvent
   508  
   509  	rawEvents, err := u.RawEvents(site, filter)
   510  
   511  	for _, re := range rawEvents {
   512  
   513  		var be BasicEvent
   514  		err := json.Unmarshal(re.Data, &be)
   515  		if err != nil {
   516  			return nil, err
   517  		}
   518  
   519  		basicEvents = append(basicEvents, be)
   520  	}
   521  
   522  	return basicEvents, err
   523  }