Documentation
¶
Index ¶
- Variables
- type Client
- func (c *Client) Authenticate(privateKey, publicKey nacl.Key, nukiPublicKey []byte, ...) error
- func (c *Client) AuthenticationId() command.AuthorizationId
- func (c *Client) Close() error
- func (c *Client) DisableLogging(ctx context.Context, pin string) error
- func (c *Client) EnableLogging(ctx context.Context, pin string) error
- func (c *Client) EstablishConnection(ctx context.Context, deviceAddress ble.Addr) error
- func (c *Client) GeneralDataIOCommunicator() communication.Communicator
- func (c *Client) GetDeviceType() communication.DeviceType
- func (c *Client) Pair(ctx context.Context, privateKey, publicKey nacl.Key, id command.ClientId, ...) error
- func (c *Client) PerformAction(ctx context.Context, actionBuilder func(nonce []byte) command.Command) error
- func (c *Client) PerformLock(ctx context.Context, appId command.ClientId) error
- func (c *Client) PerformLockAction(ctx context.Context, appId command.ClientId, action command.LockAction) error
- func (c *Client) PerformOpen(ctx context.Context, appId command.ClientId) error
- func (c *Client) PerformOpenAction(ctx context.Context, appId command.ClientId, action command.OpenAction) error
- func (c *Client) PerformUnlock(ctx context.Context, appId command.ClientId) error
- func (c *Client) PublicKey() []byte
- func (c *Client) ReadConfig(ctx context.Context) (command.ConfigCommand, error)
- func (c *Client) ReadLogEntries(ctx context.Context, start uint32, count uint16, order command.LogSortOrder, ...) ([]command.LogEntryCommand, error)
- func (c *Client) ReadLogEntriesCount(ctx context.Context, pin string) (command.LogEntryCountCommand, error)
- func (c *Client) ReadLogEntryStream(ctx context.Context, start uint32, count uint16, order command.LogSortOrder, ...) error
- func (c *Client) ReadStates(ctx context.Context) (command.StatesCommand, error)
- func (c *Client) Reboot(ctx context.Context, pin string) error
- func (c *Client) SetLogging(ctx context.Context, pin string, enable bool) error
- func (c *Client) UpdateTime(ctx context.Context, pin string, t time.Time) error
- func (c *Client) UserSpecificDataIOCommunicator() communication.Communicator
- func (c *Client) WithTimeout(duration time.Duration) *Client
Examples ¶
- Client.Authenticate
- Client.EstablishConnection
- Client.Pair
- Client.PerformAction
- Client.PerformLock
- Client.PerformLockAction
- Client.PerformOpen
- Client.PerformOpenAction
- Client.PerformUnlock
- Client.ReadConfig
- Client.ReadLogEntries
- Client.ReadLogEntriesCount
- Client.ReadLogEntryStream
- Client.ReadStates
- Client.Reboot
- Client.SetLogging
- Client.UpdateTime
Constants ¶
This section is empty.
Variables ¶
var ConnectionNotEstablishedError = fmt.Errorf("the connection is not established")
ConnectionNotEstablishedError will be returned if the connection is not established before
var InvalidPinError = fmt.Errorf("the given pin is invalid")
InvalidPinError will be returned if the given pin is invalid
var UnauthenticatedError = fmt.Errorf("the client is not authenticated")
UnauthenticatedError will be returned if the client is not authenticated before
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
func (*Client) Authenticate ¶
func (c *Client) Authenticate(privateKey, publicKey nacl.Key, nukiPublicKey []byte, authId command.AuthorizationId) error
Authenticate will use the given authentication data and use them for further communication to nuki device. The data should be the same which is used for pairing before.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
func (*Client) AuthenticationId ¶
func (c *Client) AuthenticationId() command.AuthorizationId
AuthenticationId will return the authId which was generated after the pairing process. See Pair.
func (*Client) Close ¶
Close will close all underlying resources. This function should be called after the client will not be used anymore.
func (*Client) DisableLogging ¶
DisableLogging will disable the logging on the connected nuki device.
func (*Client) EnableLogging ¶
EnableLogging will enable the logging on the connected nuki device.
func (*Client) EstablishConnection ¶
EstablishConnection establish a connection to the given nuki device. Returns an error if there was a problem with connecting to the device.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
func (*Client) GeneralDataIOCommunicator ¶
func (c *Client) GeneralDataIOCommunicator() communication.Communicator
GeneralDataIOCommunicator will return the communicator which is responsible for general data io. This is only available after the connection is established (EstablishConnection)
func (*Client) GetDeviceType ¶
func (c *Client) GetDeviceType() communication.DeviceType
GetDeviceType will return the discovered type of the connected device.
func (*Client) Pair ¶
func (c *Client) Pair(ctx context.Context, privateKey, publicKey nacl.Key, id command.ClientId, idType command.ClientIdType, name string) error
Pair will perform a pairing process with the connected device. To pair a device, the device must be in pairing mode and a bluetooth connection must be established before. See EstablishConnection to establish a connection. The pairing must be done only once. After the successful pairing the authId, private- and public-key should be saved.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
//after pairing was successful, save the information into a file or similar
toSave := map[string]interface{}{
"authId": nukiClient.AuthenticationId(),
"privKey": privateKey,
"pubKey": publicKey,
"nukiPubKey": nukiClient.PublicKey(),
}
fmt.Printf("Save content:\n%#v", toSave)
func (*Client) PerformAction ¶
func (c *Client) PerformAction(ctx context.Context, actionBuilder func(nonce []byte) command.Command) error
PerformAction will request the connected and paired nuki opener to perform the given command.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.PerformAction(context.Background(), func(nonce []byte) command.Command {
suffix := "logSuffix"
return command.NewLockAction(
command.LockActionLockAndGo,
13,
command.LockActionFlagForce|command.LockActionFlagAutoUnlock,
&suffix,
nonce,
)
})
if err != nil {
panic(err)
}
func (*Client) PerformLock ¶
PerformLock will request the connected and paired nuki smart lock to lock.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.PerformLock(context.Background(), 13)
if err != nil {
panic(err)
}
func (*Client) PerformLockAction ¶
func (c *Client) PerformLockAction(ctx context.Context, appId command.ClientId, action command.LockAction) error
PerformLockAction will request the connected and paired nuki smart lock to perform the given lock action.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
err = nukiClient.PerformLockAction(context.Background(), 13, command.LockActionLockAndGo)
if err != nil {
panic(err)
}
func (*Client) PerformOpen ¶
PerformOpen will trigger the electric strike actuation to open the door and return the result.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.PerformOpen(context.Background(), 13)
if err != nil {
panic(err)
}
func (*Client) PerformOpenAction ¶
func (c *Client) PerformOpenAction(ctx context.Context, appId command.ClientId, action command.OpenAction) error
PerformOpenAction will request the connected and paired nuki opener to perform the given open action.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.PerformOpenAction(context.Background(), 13, command.OpenActionActivateRTO)
if err != nil {
panic(err)
}
func (*Client) PerformUnlock ¶
PerformUnlock will request the connected and paired nuki smart lock to unlock.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
err = nukiClient.PerformUnlock(context.Background(), 13)
if err != nil {
panic(err)
}
func (*Client) ReadConfig ¶
ReadConfig will request and return the applied config of the connected device.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
config, err := nukiClient.ReadConfig(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("Config:\n%s", config)
func (*Client) ReadLogEntries ¶
func (c *Client) ReadLogEntries(ctx context.Context, start uint32, count uint16, order command.LogSortOrder, pin string) ([]command.LogEntryCommand, error)
ReadLogEntries will return the persisted log entries from the device. All logentries will be saved in memory! For a huge load of log entries consider the usage of ReadLogEntryStream instead.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
logs, err := nukiClient.ReadLogEntries(context.Background(), 0, 10, command.LogSortOrderDescending, "0000")
if err != nil {
panic(err)
}
for _, log := range logs {
fmt.Printf("%s\n", log.String())
}
func (*Client) ReadLogEntriesCount ¶
func (c *Client) ReadLogEntriesCount(ctx context.Context, pin string) (command.LogEntryCountCommand, error)
ReadLogEntriesCount will return the count of persisting logs.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
logCount, err := nukiClient.ReadLogEntriesCount(context.Background(), "0000")
if err != nil {
panic(err)
}
fmt.Printf("Count: %s\n", logCount.String())
func (*Client) ReadLogEntryStream ¶
func (c *Client) ReadLogEntryStream(ctx context.Context, start uint32, count uint16, order command.LogSortOrder, pin string, clb func(command.LogEntryCommand)) error
ReadLogEntryStream will start consume the persisted logs from the device. While the callback function will be called foreach received log entry. This function is blocking which mean it will return after the log receiving is done.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
err = nukiClient.ReadLogEntryStream(context.Background(), 0, 0xffff, command.LogSortOrderDescending, "0000", func(log command.LogEntryCommand) {
fmt.Printf("%s\n", log.String())
})
if err != nil {
panic(err)
}
func (*Client) ReadStates ¶
ReadStates will request the current states for the connected and paired nuki device and return the result.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
state, err := nukiClient.ReadStates(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("Status:\n%s", state)
func (*Client) Reboot ¶
Reboot will trigger a reboot of the connected device. After the reboot you have to re-establish the connection to the device via EstablishConnection!
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.Reboot(context.Background(), "0000")
if err != nil {
panic(err)
}
//give the device a little time to reboot
time.Sleep(10 * time.Second)
//re-establish the connection to the device
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//do something with the device...
func (*Client) SetLogging ¶
SetLogging will set the logging on the connected nuki device.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
//generate key-pair
publicKey, privateKey, err := box.GenerateKey(rand.Reader)
if err != nil {
panic(err)
}
err = nukiClient.Pair(context.Background(), privateKey, publicKey, 13, command.ClientIdTypeApp, "Lib-Nuki-Example")
if err != nil {
panic(err)
}
err = nukiClient.SetLogging(context.Background(), "0000", true)
if err != nil {
panic(err)
}
func (*Client) UpdateTime ¶
UpdateTime set the given time on the connected device.
Example ¶
device, err := linux.NewDevice()
if err != nil {
panic(err)
}
nukiClient := NewClient(device)
defer nukiClient.Close()
nukiDeviceAddr := ble.NewAddr("54:D2:AA:BB:CC:DD")
err = nukiClient.EstablishConnection(context.Background(), nukiDeviceAddr)
if err != nil {
panic(err)
}
authId := command.AuthorizationId(111111) //load from file
privateKey := nacl.Key(make([]byte, 32)) //load from file
publicKey := nacl.Key(make([]byte, 32)) //load from file
nukiPublicKey := []byte{} //load from file
err = nukiClient.Authenticate(privateKey, publicKey, nukiPublicKey, authId)
if err != nil {
panic(err)
}
err = nukiClient.UpdateTime(context.Background(), "0000", time.Now())
if err != nil {
panic(err)
}
func (*Client) UserSpecificDataIOCommunicator ¶
func (c *Client) UserSpecificDataIOCommunicator() communication.Communicator
UserSpecificDataIOCommunicator will return the communicator which is responsible for user specific data io. This is only available after the connection is established (EstablishConnection) and the authentication is done (Pair or Authenticate).