Skip to content

Commit c727b3e

Browse files
committed
Added home assistant client
1 parent ca5643f commit c727b3e

File tree

8 files changed

+243
-0
lines changed

8 files changed

+243
-0
lines changed

pkg/homeassistant/client.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
homeassistant implements an API client for Home Assistant API
3+
https://developers.home-assistant.io/docs/api/rest/
4+
*/
5+
package homeassistant
6+
7+
import (
8+
// Packages
9+
"github.com/mutablelogic/go-client/pkg/client"
10+
)
11+
12+
///////////////////////////////////////////////////////////////////////////////
13+
// TYPES
14+
15+
type Client struct {
16+
*client.Client
17+
}
18+
19+
///////////////////////////////////////////////////////////////////////////////
20+
// LIFECYCLE
21+
22+
func New(endPoint, apiKey string, opts ...client.ClientOpt) (*Client, error) {
23+
// Add a final slash to the endpoint
24+
if endPoint[len(endPoint)-1] != '/' {
25+
endPoint += "/"
26+
}
27+
28+
// Create client
29+
client, err := client.New(append(opts, client.OptEndpoint(endPoint), client.OptReqToken(client.Token{
30+
Scheme: client.Bearer,
31+
Value: apiKey,
32+
}))...)
33+
if err != nil {
34+
return nil, err
35+
}
36+
37+
// Return the client
38+
return &Client{client}, nil
39+
}

pkg/homeassistant/client_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package homeassistant_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
// Packages
8+
opts "github.com/mutablelogic/go-client/pkg/client"
9+
homeassistant "github.com/mutablelogic/go-client/pkg/homeassistant"
10+
assert "github.com/stretchr/testify/assert"
11+
)
12+
13+
func Test_client_001(t *testing.T) {
14+
assert := assert.New(t)
15+
client, err := homeassistant.New(GetEndPoint(t), GetApiKey(t), opts.OptTrace(os.Stderr, true))
16+
assert.NoError(err)
17+
assert.NotNil(client)
18+
t.Log(client)
19+
}
20+
21+
///////////////////////////////////////////////////////////////////////////////
22+
// ENVIRONMENT
23+
24+
func GetApiKey(t *testing.T) string {
25+
key := os.Getenv("HA_API_KEY")
26+
if key == "" {
27+
t.Skip("HA_API_KEY not set")
28+
t.SkipNow()
29+
}
30+
return key
31+
}
32+
33+
func GetEndPoint(t *testing.T) string {
34+
key := os.Getenv("HA_API_URL")
35+
if key == "" {
36+
t.Skip("HA_API_URL not set")
37+
t.SkipNow()
38+
}
39+
return key
40+
}

pkg/homeassistant/events.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package homeassistant
2+
3+
import "github.com/mutablelogic/go-client/pkg/client"
4+
5+
///////////////////////////////////////////////////////////////////////////////
6+
// TYPES
7+
8+
type Event struct {
9+
Event string `json:"event"`
10+
Listeners uint `json:"listener_count"`
11+
}
12+
13+
///////////////////////////////////////////////////////////////////////////////
14+
// API CALLS
15+
16+
// Events returns all the events and number of listeners
17+
func (c *Client) Events() ([]Event, error) {
18+
var response []Event
19+
payload := client.NewRequest(client.ContentTypeJson)
20+
if err := c.Do(payload, &response, client.OptPath("events")); err != nil {
21+
return nil, err
22+
}
23+
24+
// Return success
25+
return response, nil
26+
}

pkg/homeassistant/events_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package homeassistant_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
// Packages
8+
opts "github.com/mutablelogic/go-client/pkg/client"
9+
homeassistant "github.com/mutablelogic/go-client/pkg/homeassistant"
10+
assert "github.com/stretchr/testify/assert"
11+
)
12+
13+
func Test_events_001(t *testing.T) {
14+
assert := assert.New(t)
15+
client, err := homeassistant.New(GetEndPoint(t), GetApiKey(t), opts.OptTrace(os.Stderr, true))
16+
assert.NoError(err)
17+
assert.NotNil(client)
18+
19+
events, err := client.Events()
20+
assert.NoError(err)
21+
assert.NotNil(events)
22+
23+
t.Log(events)
24+
}

pkg/homeassistant/health.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package homeassistant
2+
3+
import "github.com/mutablelogic/go-client/pkg/client"
4+
5+
///////////////////////////////////////////////////////////////////////////////
6+
// API CALLS
7+
8+
// ListModels returns all the models
9+
func (c *Client) Health() (string, error) {
10+
// Response schema
11+
type responseHealth struct {
12+
Message string `json:"message"`
13+
}
14+
15+
// Return the response
16+
var response responseHealth
17+
payload := client.NewRequest(client.ContentTypeJson)
18+
if err := c.Do(payload, &response); err != nil {
19+
return "", err
20+
}
21+
22+
// Return success
23+
return response.Message, nil
24+
}

pkg/homeassistant/health_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package homeassistant_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
// Packages
8+
opts "github.com/mutablelogic/go-client/pkg/client"
9+
homeassistant "github.com/mutablelogic/go-client/pkg/homeassistant"
10+
assert "github.com/stretchr/testify/assert"
11+
)
12+
13+
func Test_health_001(t *testing.T) {
14+
assert := assert.New(t)
15+
client, err := homeassistant.New(GetEndPoint(t), GetApiKey(t), opts.OptTrace(os.Stderr, true))
16+
assert.NoError(err)
17+
assert.NotNil(client)
18+
19+
message, err := client.Health()
20+
assert.NoError(err)
21+
assert.NotEmpty(message)
22+
23+
t.Log(message)
24+
}

pkg/homeassistant/states.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package homeassistant
2+
3+
import (
4+
"encoding/json"
5+
"time"
6+
7+
"github.com/mutablelogic/go-client/pkg/client"
8+
)
9+
10+
///////////////////////////////////////////////////////////////////////////////
11+
// TYPES
12+
13+
type State struct {
14+
Entity string `json:"entity_id"`
15+
LastChanged time.Time `json:"last_changed"`
16+
State string `json:"state"`
17+
Attributes map[string]any `json:"attributes"`
18+
}
19+
20+
///////////////////////////////////////////////////////////////////////////////
21+
// API CALLS
22+
23+
// States returns all the entities and their state
24+
func (c *Client) States() ([]State, error) {
25+
// Return the response
26+
var response []State
27+
payload := client.NewRequest(client.ContentTypeJson)
28+
if err := c.Do(payload, &response, client.OptPath("states")); err != nil {
29+
return nil, err
30+
}
31+
32+
// Return success
33+
return response, nil
34+
}
35+
36+
///////////////////////////////////////////////////////////////////////////////
37+
// STRINGIFY
38+
39+
func (s State) String() string {
40+
data, _ := json.MarshalIndent(s, "", " ")
41+
return string(data)
42+
}

pkg/homeassistant/states_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package homeassistant_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
// Packages
8+
opts "github.com/mutablelogic/go-client/pkg/client"
9+
homeassistant "github.com/mutablelogic/go-client/pkg/homeassistant"
10+
assert "github.com/stretchr/testify/assert"
11+
)
12+
13+
func Test_states_001(t *testing.T) {
14+
assert := assert.New(t)
15+
client, err := homeassistant.New(GetEndPoint(t), GetApiKey(t), opts.OptTrace(os.Stderr, true))
16+
assert.NoError(err)
17+
assert.NotNil(client)
18+
19+
states, err := client.States()
20+
assert.NoError(err)
21+
assert.NotNil(states)
22+
23+
t.Log(states)
24+
}

0 commit comments

Comments
 (0)