liuxiulin 8 месяцев назад
Родитель
Сommit
7c3adc721a

+ 55 - 1
pkg/models/device.go

@@ -59,7 +59,61 @@ type UpgradeParams struct {
 // Validate 验证
 func (a *UpgradeParams) Validate() error {
 	if a.DeviceID == "" {
-		return errors.New("非法参数[Name, Label]")
+		return errors.New("非法参数[DeviceID, Label]")
 	}
 	return nil
 }
+
+type Command string
+
+const (
+	Report          Command = "report"          // 获取设备状态
+	Restart         Command = "restart"         // 重启设备
+	ClearData       Command = "clearData"       // 清除设备配置数据
+	SetDataTrans    Command = "setDataTrans"    // 设备端自动上报配置
+	GetInfo         Command = "getInfo"         // 获取网关信息(分控)
+	ForceRun        Command = "forceRun"        // 远程控制某个模块强制运行
+	SetDeviceId     Command = "setDeviceId"     // 写入设备 ID
+	SetFjsqStatus   Command = "setFjsqStatus"   // 智能分集水器控制
+	SetOutdoorPower Command = "setOutdoorPower" // 设置水系统外机电源状态
+	SetOutdoorTemp  Command = "setOutdoorTemp"  // 设置水系统外机出水温度
+)
+
+type SendCommandParams struct {
+	DeviceId     string `json:"device_id"`
+	Enable       int    `json:"enable"`         // 是否启用(0:禁用,1:启用)
+	Internal     int    `json:"internal"`       // 间隔时间,单位:秒,范围:30~180,默认:30秒
+	Module       int    `json:"module"`         // 对应模块(1:新风模块2:加湿模块)
+	ModulePower  int    `json:"module_power"`   // 电源状态,1:开启,2关闭
+	Id           string `json:"id"`             // 长度12个字节,如 YHK-16777216
+	Num          int    `json:"num"`            // 1-8 对应1-8路电热执行器
+	NumPower     int    `json:"num_power"`      // 1:开启,0:关闭
+	OutdoorPower int    `json:"outdoor_power"`  // 1:开启,0:关闭
+	CoolModeTemp int    `json:"cool_mode_temp"` // 制冷模式出水温度,0:代表不设置
+	HeatModeTemp int    `json:"heat_mode_temp"` // 制热模式出水温度,0:代表不设置
+}
+
+// Validate 验证
+func (a *SendCommandParams) Validate() error {
+	if a.DeviceId == "" {
+		return errors.New("非法参数[DeviceID, Label]")
+	}
+	return nil
+}
+
+type SplitDeviceStatus struct {
+	Power         int            `json:"power"`
+	Mode          int            `json:"mode"`
+	FanSpeed      int            `json:"fan_speed"`
+	SetTemp       int            `json:"set_temp"`
+	EnvTemp       int            `json:"env_temp"`
+	EnvHumidity   int            `json:"env_humidity"`
+	EnvCo2        int            `json:"env_co2"`
+	EnvPm25       int            `json:"env_pm25"`
+	StatusCode    int            `json:"status_code"`
+	StatusCodeMap map[string]int `json:"status_code_map"`
+	AirMode       int            `json:"air_mode"`
+	AcType        int            `json:"ac_type"`
+	AirType       int            `json:"air_type"`
+	HumType       int            `json:"hum_type"`
+}

+ 1 - 0
pkg/rpcs/controller.go

@@ -21,6 +21,7 @@ type ArgsOnEvent struct {
 	TimeStamp   uint64
 	SubDeviceId string
 	SubData     []byte
+	ProductKey  string
 }
 type ReplyOnEvent ReplyEmptyResult
 

+ 1 - 0
services/controller/controller.go

@@ -230,6 +230,7 @@ func (c *Controller) OnEvent(args rpcs.ArgsOnEvent, reply *rpcs.ReplyOnEvent) er
 			"tenant_id":     args.VendorId,
 			"device_id":     args.DeviceId,
 			"sub_device_id": args.SubDeviceId,
+			"product_key":   args.ProductKey,
 			"type":          "EVENT",
 			"timestamp":     strconv.Itoa(int(args.TimeStamp)),
 		},

+ 1 - 0
services/emqx-agent/agent.go

@@ -57,6 +57,7 @@ func (a *Access) processEvent(topicInfo *protocol.TopicInfo, vendorId string, me
 		SubDeviceId: message.GetString("subDeviceId"),
 		SubData:     message.GetJson("data").MustToJson(),
 		VendorId:    vendorId,
+		ProductKey:  topicInfo.ProductKey,
 	}
 	err := server.RPCCallByName(nil, rpcs.ControllerName, "Controller.OnEvent", args, &reply)
 	if err != nil {

+ 164 - 9
services/knowoapi/controllers/device.go

@@ -267,8 +267,11 @@ func (a *DeviceController) GetOtaProgress() {
 // GET /device/status?device_id=
 func (a *DeviceController) GetStatus() {
 	deviceId := a.Ctx.URLParam("device_id")
-
-	data, err := a.Service.GetDeviceStatus(deviceId)
+	deviceType, _ := a.Ctx.URLParamInt("device_type")
+	if deviceType == 0 {
+		deviceType = 1
+	}
+	data, err := a.Service.GetDeviceStatus(deviceId, deviceType)
 	if err != nil {
 		responseError(a.Ctx, ErrNormal, err.Error())
 		return
@@ -278,20 +281,172 @@ func (a *DeviceController) GetStatus() {
 	})
 }
 
-// PostStatus
-// POST /device/status
-func (a *DeviceController) PostStatus() {
+// PostSetReport  获取设备状态
+// POST /device/report
+func (a *DeviceController) PostSetReport() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.SetReport(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostRestart 重启设备
+// POST /device/restart
+func (a *DeviceController) PostRestart() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
 
-	d := new(models.UpgradeParams)
-	if err := parseBody(a.Ctx, d); err != nil {
+	err := a.Service.Restart(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostClearData 清除设备配置数据
+// POST /device/clear_data
+func (a *DeviceController) PostClearData() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.ClearData(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostSetDataTrans 设备端自动上报配置
+// POST /device/data_trans
+func (a *DeviceController) PostSetDataTrans() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.SetDataTrans(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostGetInfo
+// POST /device/get_info
+func (a *DeviceController) PostGetInfo() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.GetInfo(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostForceRun 远程控制某个模块强制运行
+// POST /device/force_run
+func (a *DeviceController) PostForceRun() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.ForceRun(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// SetDeviceId  写入设备 ID
+// POST /device/set_id
+func (a *DeviceController) SetDeviceId() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.SetDeviceId(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostSetFjsqStatus 智能分集水器控制
+// POST /device/fjsq_status
+func (a *DeviceController) PostSetFjsqStatus() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.SetFjsqStatus(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostSetOutdoorPower 设置水系统外机电源状态
+// POST /device/outdoor_power
+func (a *DeviceController) PostSetOutdoorPower() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
+		badRequest(a.Ctx, err)
+		return
+	}
+
+	err := a.Service.SetOutdoorPower(*params)
+	if err != nil {
+		responseError(a.Ctx, ErrNormal, err.Error())
+		return
+	}
+	done(a.Ctx, params.DeviceId)
+}
+
+// PostSetOutdoorTemp 设置水系统外机出水温度
+// POST /device/outdoor_temp
+func (a *DeviceController) PostSetOutdoorTemp() {
+	params := new(models.SendCommandParams)
+	if err := parseBody(a.Ctx, params); err != nil {
 		badRequest(a.Ctx, err)
 		return
 	}
 
-	err := a.Service.GetSplitInfo(d.DeviceID)
+	err := a.Service.SetOutdoorTemp(*params)
 	if err != nil {
 		responseError(a.Ctx, ErrNormal, err.Error())
 		return
 	}
-	done(a.Ctx, d.DeviceID)
+	done(a.Ctx, params.DeviceId)
 }

+ 154 - 9
services/knowoapi/services/device.go

@@ -1,6 +1,7 @@
 package services
 
 import (
+	"encoding/json"
 	"github.com/gogf/gf/encoding/gjson"
 	"sparrow/pkg/models"
 	"sparrow/pkg/rpcs"
@@ -28,10 +29,28 @@ type DeviceService interface {
 	Upgrade(params *models.UpgradeParams) error
 	// GetUpgradeProgress 获取ota升级进度
 	GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgress, error)
-	// 获取设备状态数据
-	GetDeviceStatus(deviceId string) (*gjson.Json, error)
-	// 获取分体式五恒获取网关信息
-	GetSplitInfo(deviceId string) error
+	// GetDeviceStatus 获取设备状态数据
+	GetDeviceStatus(deviceId string, deviceType int) (*gjson.Json, error)
+	// SetReport 获取设备状态
+	SetReport(params models.SendCommandParams) error
+	// Restart 重启设备
+	Restart(params models.SendCommandParams) error
+	// ClearData 清除设备配置数据
+	ClearData(params models.SendCommandParams) error
+	// SetDataTrans 设备端自动上报配置
+	SetDataTrans(params models.SendCommandParams) error
+	// GetInfo 获取网关信息
+	GetInfo(params models.SendCommandParams) error
+	// ForceRun 远程控制某个模块强制运行
+	ForceRun(params models.SendCommandParams) error
+	// SetDeviceId 写入设备id
+	SetDeviceId(params models.SendCommandParams) error
+	// SetFjsqStatus 智能分集水器控制
+	SetFjsqStatus(params models.SendCommandParams) error
+	// SetOutdoorPower 设置水系统外机电源状态
+	SetOutdoorPower(params models.SendCommandParams) error
+	// SetOutdoorTemp 设置水系统外机出水温度
+	SetOutdoorTemp(params models.SendCommandParams) error
 }
 
 type deviceservice struct {
@@ -175,7 +194,7 @@ func (a deviceservice) GetUpgradeProgress(deviceId string) (rpcs.ReplyOtaProgres
 	return reply, nil
 }
 
-func (a deviceservice) GetDeviceStatus(deviceId string) (*gjson.Json, error) {
+func (a deviceservice) GetDeviceStatus(deviceId string, deviceType int) (*gjson.Json, error) {
 	var args rpcs.ArgsGetStatus
 	args.Id = deviceId
 
@@ -185,14 +204,140 @@ func (a deviceservice) GetDeviceStatus(deviceId string) (*gjson.Json, error) {
 		server.Log.Errorf("设备状态数据获取失败:%v", err)
 		return nil, err
 	}
+	result := new(gjson.Json)
+	switch deviceType {
+	case 1:
+		status := new(models.SplitDeviceStatus)
+		err = json.Unmarshal([]byte(reply.Status), &status)
+		status.StatusCodeMap["nj1"] = 1
+		status.StatusCodeMap["nj2"] = 1
+		status.StatusCodeMap["nj3"] = 1
+		status.StatusCodeMap["nj4"] = 1
+		status.StatusCodeMap["nj5"] = 1
+		status.StatusCodeMap["air_quality_sensor"] = 1
 
-	return gjson.New(reply.Status), nil
+		if status.StatusCode&0x01 == 0 {
+			status.StatusCodeMap["nj1"] = 0
+		}
+		if status.StatusCode&0x02 == 0 {
+			status.StatusCodeMap["nj2"] = 0
+		}
+		if status.StatusCode&0x04 == 0 {
+			status.StatusCodeMap["nj1"] = 0
+		}
+		if status.StatusCode&0x08 == 0 {
+			status.StatusCodeMap["nj1"] = 0
+		}
+		if status.StatusCode&0x10 == 0 {
+			status.StatusCodeMap["nj1"] = 0
+		}
+
+		result = gjson.New(status)
+	}
+
+	return result, nil
+}
+
+// SetReport 获取设备状态
+func (a deviceservice) SetReport(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.Report)
+	return a.sendCommand(args)
+}
+
+// Restart 重启设备
+func (a deviceservice) Restart(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.Restart)
+	return a.sendCommand(args)
+}
+
+// ClearData 清除设备配置数据
+func (a deviceservice) ClearData(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.ClearData)
+	return a.sendCommand(args)
+}
+
+// SetDataTrans 设备端自动上报配置
+func (a deviceservice) SetDataTrans(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Params = map[string]interface{}{
+		"enable":   params.Enable,
+		"internal": params.Internal,
+	}
+	args.Cmd = string(models.SetDataTrans)
+	return a.sendCommand(args)
 }
 
-func (a deviceservice) GetSplitInfo(deviceId string) error {
+// GetInfo 获取网关信息
+func (a deviceservice) GetInfo(params models.SendCommandParams) error {
 	var args rpcs.ArgsSendCommand
-	args.DeviceId = deviceId
-	args.Cmd = "getInfo"
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.GetInfo)
+	return a.sendCommand(args)
+}
+
+// ForceRun 远程控制某个模块强制运行
+func (a deviceservice) ForceRun(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.ForceRun)
+	args.Params = map[string]interface{}{
+		"module": params.Module,
+		"power":  params.ModulePower,
+	}
+	return a.sendCommand(args)
+}
+
+// SetDeviceId 写入设备id
+func (a deviceservice) SetDeviceId(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.SetDeviceId)
+	args.Params = map[string]interface{}{
+		"id": params.Id,
+	}
+	return a.sendCommand(args)
+}
+
+// SetFjsqStatus 智能分集水器控制
+func (a deviceservice) SetFjsqStatus(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.SetFjsqStatus)
+	return a.sendCommand(args)
+}
+
+// SetOutdoorPower 设置水系统外机电源状态
+func (a deviceservice) SetOutdoorPower(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.SetOutdoorPower)
+	args.Params = map[string]interface{}{
+		"power": params.OutdoorPower,
+	}
+	return a.sendCommand(args)
+}
+
+// SetOutdoorTemp 设置水系统外机出水温度
+func (a deviceservice) SetOutdoorTemp(params models.SendCommandParams) error {
+	var args rpcs.ArgsSendCommand
+	args.DeviceId = params.DeviceId
+	args.Cmd = string(models.SetOutdoorTemp)
+	args.Params = map[string]interface{}{
+		"cool_mode_temp": params.CoolModeTemp,
+		"heat_mode_temp": params.HeatModeTemp,
+	}
+	return a.sendCommand(args)
+}
+
+// SendCommand 下发指令
+func (a deviceservice) sendCommand(args rpcs.ArgsSendCommand) error {
 	var reply rpcs.ReplySendCommand
 	err := server.RPCCallByName(nil, rpcs.ControllerName, "Controller.SendCommand", args, &reply)
 	if err != nil {