golang开源量化自我与物联网数据管理平台插件库connectordb的使用

Golang开源量化自我与物联网数据管理平台插件库connectordb的使用

Heedy简介

Heedy是一个个人数据仓库和可扩展的分析引擎,专为量化自我和物联网数据管理而设计。它解决了现有服务数据孤岛的问题,将所有数据集中到一个自托管的开源系统中。

主要特点

  1. 开源且自托管:保证数据隐私和安全,完全由用户自己控制
  2. 可扩展:通过插件系统可以添加新功能、集成其他服务或修改核心功能

运行Heedy

Heedy支持Mac和Linux系统(包括树莓派),通过命令行启动:

chmod +x ./heedy  # 允许执行文件
./heedy           # 运行heedy

然后访问 http://localhost:1324 设置数据库。

Docker运行方式

mkdir myheedy
docker run --rm -d -p 1324:1324 -v $PWD/myheedy:/data --user $UID --name heedy dkumor/heedy

插件系统

Heedy的强大功能主要来自插件系统。一些值得关注的插件:

  • fitbit - 与Fitbit同步,访问和分析可穿戴设备数据
  • notebook - 在Heedy中直接使用Jupyter笔记本分析数据

Golang连接示例

以下是一个使用Golang连接Heedy API的基本示例:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// HeedyAPI 表示与Heedy服务器的连接
type HeedyAPI struct {
	BaseURL string
	Token   string
}

// NewHeedyAPI 创建一个新的Heedy API客户端
func NewHeedyAPI(baseURL, token string) *HeedyAPI {
	return &HeedyAPI{
		BaseURL: baseURL,
		Token:   token,
	}
}

// GetUser 获取当前用户信息
func (h *HeedyAPI) GetUser() (map[string]interface{}, error) {
	url := fmt.Sprintf("%s/api/users/@me", h.BaseURL)
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}
	
	req.Header.Set("X-Heedy-As", "admin")
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", h.Token))
	
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	
	var result map[string]interface{}
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, err
	}
	
	return result, nil
}

// CreateStream 创建一个新的数据流
func (h *HeedyAPI) CreateStream(name, schema string) (map[string]interface{}, error) {
	url := fmt.Sprintf("%s/api/streams", h.BaseURL)
	
	data := map[string]interface{}{
		"name":   name,
		"schema": schema,
	}
	
	jsonData, err := json.Marshal(data)
	if err != nil {
		return nil, err
	}
	
	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return nil, err
	}
	
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-Heedy-As", "admin")
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", h.Token))
	
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	
	var result map[string]interface{}
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, err
	}
	
	return result, nil
}

func main() {
	// 初始化Heedy API客户端
	api := NewHeedyAPI("http://localhost:1324", "your_access_token_here")
	
	// 获取用户信息
	user, err := api.GetUser()
	if err != nil {
		fmt.Printf("Error getting user: %v\n", err)
		return
	}
	fmt.Printf("User info: %+v\n", user)
	
	// 创建新的数据流
	stream, err := api.CreateStream("temperature", "number")
	if err != nil {
		fmt.Printf("Error creating stream: %v\n", err)
		return
	}
	fmt.Printf("Created stream: %+v\n", stream)
}

数据流操作示例

以下是一个更完整的示例,展示如何创建数据流并插入数据:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

type HeedyClient struct {
	BaseURL string
	Token   string
}

func NewHeedyClient(baseURL, token string) *HeedyClient {
	return &HeedyClient{
		BaseURL: baseURL,
		Token:   token,
	}
}

// InsertData 向指定流中插入数据
func (h *HeedyClient) InsertData(streamID string, data interface{}) error {
	url := fmt.Sprintf("%s/api/streams/%s/data", h.BaseURL, streamID)
	
	jsonData, err := json.Marshal(data)
	if err != nil {
		return err
	}
	
	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return err
	}
	
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-Heedy-As", "admin")
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", h.Token))
	
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	
	if resp.StatusCode != http.StatusOK {
		body, _ := ioutil.ReadAll(resp.Body)
		return fmt.Errorf("API error: %s - %s", resp.Status, string(body))
	}
	
	return nil
}

// QueryData 查询流数据
func (h *HeedyClient) QueryData(streamID string, query map[string]interface{}) ([]interface{}, error) {
	url := fmt.Sprintf("%s/api/streams/%s/data/query", h.BaseURL, streamID)
	
	jsonData, err := json.Marshal(query)
	if err != nil {
		return nil, err
	}
	
	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return nil, err
	}
	
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-Heedy-As", "admin")
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", h.Token))
	
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	
	var result []interface{}
	err = json.Unmarshal(body, &result)
	if err != nil {
		return nil, err
	}
	
	return result, nil
}

func main() {
	client := NewHeedyClient("http://localhost:1324", "your_access_token_here")
	
	// 插入温度数据
	tempData := map[string]interface{}{
		"t": time.Now().Unix(),
		"d": 22.5,
	}
	
	err := client.InsertData("temperature", tempData)
	if err != nil {
		fmt.Printf("Error inserting data: %v\n", err)
		return
	}
	fmt.Println("Data inserted successfully")
	
	// 查询最近24小时的数据
	query := map[string]interface{}{
		"t1": time.Now().Add(-24 * time.Hour).Unix(),
		"t2": time.Now().Unix(),
	}
	
	data, err := client.QueryData("temperature", query)
	if err != nil {
		fmt.Printf("Error querying data: %v\n", err)
		return
	}
	
	fmt.Printf("Query results: %+v\n", data)
}

构建Heedy

要构建Heedy,需要Go 1.18+和Node.js环境:

git clone https://github.com/heedy/heedy
cd heedy
make

调试版本使用:

make debug

Heedy提供了一个强大的平台来管理个人和物联网数据,通过Golang可以方便地与其API交互,实现数据的收集、存储和分析。


更多关于golang开源量化自我与物联网数据管理平台插件库connectordb的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang开源量化自我与物联网数据管理平台插件库connectordb的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用ConnectorDB管理量化自我与物联网数据

ConnectorDB是一个开源的量化自我与物联网数据管理平台,它允许用户收集、存储和分析来自各种设备的数据。下面我将介绍如何使用ConnectorDB的Go插件库来构建数据收集和管理应用。

安装ConnectorDB Go库

首先,安装ConnectorDB的Go库:

go get github.com/connectordb/connectordb

基本使用示例

1. 创建连接

package main

import (
	"log"
	"github.com/connectordb/connectordb"
)

func main() {
	// 连接到本地ConnectorDB实例
	cdb, err := connectordb.Connect("http://localhost:8000", "username", "password")
	if err != nil {
		log.Fatal(err)
	}
	defer cdb.Close()

	// 检查连接状态
	status, err := cdb.Status()
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Connected to ConnectorDB v%s", status.Version)
}

2. 创建设备和流

// 创建新设备
device := &connectordb.Device{
	Name:        "my_fitness_tracker",
	Description: "My personal fitness tracking device",
	Role:        "user",
}

createdDevice, err := cdb.CreateDevice(device)
if err != nil {
	log.Fatal(err)
}
log.Printf("Created device: %s", createdDevice.Name)

// 在设备下创建数据流
stream := &connectordb.Stream{
	Name:        "heart_rate",
	Description: "Heart rate measurements",
	Schema:      `{"type": "number"}`,
}

createdStream, err := cdb.CreateStream(createdDevice.Name, stream)
if err != nil {
	log.Fatal(err)
}
log.Printf("Created stream: %s/%s", createdDevice.Name, createdStream.Name)

3. 插入和读取数据

// 插入数据点
point := connectordb.Datapoint{
	Timestamp: time.Now().Unix(),
	Data:      72.0, // 心率值
}

err = cdb.Insert(createdDevice.Name, createdStream.Name, point)
if err != nil {
	log.Fatal(err)
}

// 读取最近的数据点
points, err := cdb.Read(createdDevice.Name, createdStream.Name, 0, 0, 10)
if err != nil {
	log.Fatal(err)
}

for _, p := range points {
	log.Printf("Time: %v, Value: %v", time.Unix(p.Timestamp, 0), p.Data)
}

高级功能

1. 批量插入数据

// 创建批量写入器
writer, err := cdb.BatchWriter(createdDevice.Name, createdStream.Name, 100) // 100点的缓冲区
if err != nil {
	log.Fatal(err)
}

// 添加多个数据点
for i := 0; i < 50; i++ {
	err = writer.Write(connectordb.Datapoint{
		Timestamp: time.Now().Add(time.Duration(i) * time.Second).Unix(),
		Data:      70 + float64(i%10),
	})
	if err != nil {
		log.Fatal(err)
	}
}

// 确保所有数据写入
err = writer.Close()
if err != nil {
	log.Fatal(err)
}

2. 订阅实时数据

// 创建订阅
sub, err := cdb.Subscribe(createdDevice.Name, createdStream.Name)
if err != nil {
	log.Fatal(err)
}
defer sub.Close()

// 在goroutine中处理实时数据
go func() {
	for {
		point, err := sub.Read()
		if err != nil {
			log.Printf("Subscription error: %v", err)
			return
		}
		log.Printf("New data: %v", point.Data)
	}
}()

// 主线程可以继续做其他工作
time.Sleep(30 * time.Second)

3. 用户和设备管理

// 创建新用户
newUser := &connectordb.User{
	Name:     "new_user",
	Email:    "user@example.com",
	Password: "securepassword",
	Role:     "user",
}

_, err = cdb.CreateUser(newUser)
if err != nil {
	log.Fatal(err)
}

// 列出所有设备
devices, err := cdb.ListDevices()
if err != nil {
	log.Fatal(err)
}

for _, device := range devices {
	log.Printf("Device: %s (%s)", device.Name, device.Description)
}

错误处理最佳实践

// 检查特定错误类型
if cerr, ok := err.(*connectordb.ConnectorDBError); ok {
	switch cerr.Code {
	case connectordb.ErrNotFound:
		log.Println("请求的资源不存在")
	case connectordb.ErrUnauthorized:
		log.Println("认证失败,请检查用户名和密码")
	default:
		log.Printf("ConnectorDB错误: %s", cerr.Message)
	}
} else if err != nil {
	log.Printf("非ConnectorDB错误: %v", err)
}

总结

ConnectorDB的Go库提供了丰富的功能来管理量化自我和物联网数据。通过这个库,你可以:

  1. 轻松创建用户、设备和数据流
  2. 高效地插入和查询时间序列数据
  3. 实时订阅数据变化
  4. 管理整个数据生态系统

ConnectorDB特别适合需要长期收集和分析个人或设备数据的应用场景,如健康追踪、家庭自动化或工业物联网解决方案。

更多详细信息和高级用法,请参考ConnectorDB官方文档

回到顶部