|
|
@@ -3,15 +3,12 @@ package main
|
|
|
import (
|
|
|
"context"
|
|
|
"encoding/binary"
|
|
|
- "encoding/hex"
|
|
|
"errors"
|
|
|
- "runtime/debug"
|
|
|
"strconv"
|
|
|
"sync"
|
|
|
"time"
|
|
|
|
|
|
"github.com/go-redis/redis/v7"
|
|
|
- "github.com/sirupsen/logrus"
|
|
|
"github.com/valyala/bytebufferpool"
|
|
|
|
|
|
"lc/common/mqtt"
|
|
|
@@ -60,7 +57,7 @@ type LampAlarmInfo struct {
|
|
|
type Concentrator struct {
|
|
|
seq uint8
|
|
|
mutexSeq sync.Mutex
|
|
|
- devinfo *protocol.DevInfo
|
|
|
+ devInfo *protocol.DevInfo
|
|
|
model *protocol.IotModel
|
|
|
ctx context.Context
|
|
|
cancel context.CancelFunc
|
|
|
@@ -80,7 +77,7 @@ func NewConcentrator(info *protocol.DevInfo) Device {
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
dev := &Concentrator{
|
|
|
mapLamps: make(map[uint32]string),
|
|
|
- devinfo: info,
|
|
|
+ devInfo: info,
|
|
|
ctx: ctx,
|
|
|
cancel: cancel,
|
|
|
downQueue: util.NewQueue(200),
|
|
|
@@ -103,25 +100,22 @@ func NewConcentrator(info *protocol.DevInfo) Device {
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) SetTopicHandle() {
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_BROADCASTTIME)] = o.HandleTpChzbSetBroadcasttime
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_WAITTIME)] = o.HandleTpChzbSetWaittime
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_SWITCH)] = o.HandleTpChzbSetSwitch
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO)] = o.HandleTpChzbSetRecoveryAuto
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME)] = o.HandleTpChzbSetOnofftime
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_ONOFFTIME)] = o.HandleTpChzbQueryOnofftime
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP)] = o.HandleTpChzbSetUpdateLamp
|
|
|
- o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_TIME)] = o.HandleTpChzbQueryTime
|
|
|
+ o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_SWITCH)] = o.HandleTpChzbSetSwitch
|
|
|
+ o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO)] = o.HandleTpChzbSetRecoveryAuto
|
|
|
+ o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME)] = o.HandleSetOnOffTime
|
|
|
+ o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP)] = o.HandleSetUpdateLamp
|
|
|
+ o.mapTopicHandle[GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_TIME)] = o.HandleQueryTime
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) MQTTSubscribe() {
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_BROADCASTTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //广播校时
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_WAITTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //设置zigbee集中器收发等待时间
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_SWITCH), mqtt.ExactlyOnce, o.HandleCache, ToAll) //开关灯,广播开关灯
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO), mqtt.ExactlyOnce, o.HandleCache, ToAll) //广播开关灯
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //设置开关灯时间段
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_ONOFFTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //读取开关灯时间段
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //更新灯控末端
|
|
|
- GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_TIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //读取单灯末端时间
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_BROADCASTTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //广播校时
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_WAITTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //设置zigbee集中器收发等待时间
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_SWITCH), mqtt.ExactlyOnce, o.HandleCache, ToAll) //开关灯,广播开关灯
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO), mqtt.ExactlyOnce, o.HandleCache, ToAll) //广播开关灯
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //设置开关灯时间段
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_ONOFFTIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //读取开关灯时间段
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //更新灯控末端
|
|
|
+ GetMQTTMgr().Subscribe(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_TIME), mqtt.ExactlyOnce, o.HandleCache, ToCloud) //读取单灯末端时间
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) Start() {
|
|
|
@@ -167,7 +161,7 @@ func (o *Concentrator) UpdateInfo(devinfo protocol.DevInfo) {
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) GetDevInfo() *protocol.DevInfo {
|
|
|
- return o.devinfo
|
|
|
+ return o.devInfo
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) UpdateModel(tid uint16, flag int) {
|
|
|
@@ -181,72 +175,63 @@ func (o *Concentrator) UpdateModel(tid uint16, flag int) {
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) UpdateModel2(mi *ModelInfo) {
|
|
|
- if o.devinfo.TID != mi.TID {
|
|
|
+ if o.devInfo.TID != mi.TID {
|
|
|
return
|
|
|
}
|
|
|
if mi.Flag == 0 {
|
|
|
- logrus.Errorf("Concentrator.UpdateModel2:设备[%s]的物模型[tid=%d]模型文件被删除,下次启动即将生效。", o.devinfo.DevCode, mi.TID)
|
|
|
return
|
|
|
}
|
|
|
- logrus.Debugf("Concentrator.UpdateModel2:更新设备[%s]的物模型[%d]", o.devinfo.DevCode, mi.TID)
|
|
|
iot, err := loadModel(mi.TID)
|
|
|
if err != nil {
|
|
|
- logrus.Errorf("Concentrator.UpdateModel2:加载模型[%d]文件错误:%s", mi.TID, err.Error())
|
|
|
return
|
|
|
}
|
|
|
if iot.Protocol == ConcentratorProtocol { //合法的物模型
|
|
|
o.model = iot
|
|
|
- logrus.Infof("Concentrator.UpdateModel2:更新设备[%s]的物模型[%d]成功", o.devinfo.DevCode, mi.TID)
|
|
|
- } else {
|
|
|
- logrus.Error("Concentrator.UpdateModel2:物模型错误,TID和文件名tid不一致或协议非ModbusRTU协议")
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) ReloadOOTFromRedis() error {
|
|
|
- mapdata, err := redisEdgeData.HGetAll(LampOotPrefix + o.devinfo.DevCode).Result()
|
|
|
+ result, err := redisEdgeData.HGetAll(LampOotPrefix + o.devInfo.DevCode).Result()
|
|
|
if err != nil {
|
|
|
if err == redis.Nil {
|
|
|
return nil
|
|
|
}
|
|
|
- logrus.Errorf("Concentrator.ReloadOOTFromRedis设备[%s]从redis加载时间策略失败:%s", o.devinfo.DevCode, err.Error())
|
|
|
return err
|
|
|
}
|
|
|
- for k, v := range mapdata {
|
|
|
+ for k, v := range result {
|
|
|
var oot []zigbee.OnOffTime
|
|
|
- lampid, errkey := strconv.Atoi(k)
|
|
|
- errval := json.UnmarshalFromString(v, &oot)
|
|
|
- if errkey == nil && errval == nil {
|
|
|
- o.mapLamps2OOT[uint32(lampid)] = oot
|
|
|
+ lampId, err2 := strconv.Atoi(k)
|
|
|
+ err3 := json.UnmarshalFromString(v, &oot)
|
|
|
+ if err2 == nil && err3 == nil {
|
|
|
+ o.mapLamps2OOT[uint32(lampId)] = oot
|
|
|
}
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
func (o *Concentrator) ReloadSwitchOOTFromRedis() error {
|
|
|
- mapdata, err := redisEdgeData.HGetAll(LampSwitchPrefix + o.devinfo.DevCode).Result()
|
|
|
+ result, err := redisEdgeData.HGetAll(LampSwitchPrefix + o.devInfo.DevCode).Result()
|
|
|
if err != nil {
|
|
|
if err == redis.Nil {
|
|
|
return nil
|
|
|
}
|
|
|
- logrus.Errorf("Concentrator.ReloadSwitchOOTFromRedis设备[%s]从redis加载时间策略失败:%s", o.devinfo.DevCode, err.Error())
|
|
|
return err
|
|
|
}
|
|
|
- for k, v := range mapdata {
|
|
|
+ for k, v := range result {
|
|
|
var ltr LampTimeRange
|
|
|
- lampid, errkey := strconv.Atoi(k)
|
|
|
- errval := json.UnmarshalFromString(v, <r)
|
|
|
- if errkey == nil && errval == nil {
|
|
|
- o.mapTempLampsOOT[uint32(lampid)] = <r
|
|
|
+ lampId, err2 := strconv.Atoi(k)
|
|
|
+ err3 := json.UnmarshalFromString(v, <r)
|
|
|
+ if err2 == nil && err3 == nil {
|
|
|
+ o.mapTempLampsOOT[uint32(lampId)] = <r
|
|
|
}
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
func (o *Concentrator) ReloadBroadCastFromRedis() error {
|
|
|
- strTime, err := redisEdgeData.Get(LampBroadcastPrefix + o.devinfo.DevCode).Result()
|
|
|
+ strTime, err := redisEdgeData.Get(LampBroadcastPrefix + o.devInfo.DevCode).Result()
|
|
|
if err != nil {
|
|
|
if err == redis.Nil {
|
|
|
return nil
|
|
|
}
|
|
|
- logrus.Errorf("Concentrator.ReloadBroadCastFromRedis设备[%s]从redis加载广播恢复截止时间失败:%s", o.devinfo.DevCode, err.Error())
|
|
|
return err
|
|
|
}
|
|
|
if t, err := util.MlParseTime(strTime); err == nil {
|
|
|
@@ -256,20 +241,17 @@ func (o *Concentrator) ReloadBroadCastFromRedis() error {
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) ReloadLampAlarmFromRedis() error {
|
|
|
- mapAlarm, err := redisEdgeData.HGetAll(LampAlarmPrefix + o.devinfo.DevCode).Result()
|
|
|
+ mapAlarm, err := redisEdgeData.HGetAll(LampAlarmPrefix + o.devInfo.DevCode).Result()
|
|
|
if err != nil {
|
|
|
if err == redis.Nil {
|
|
|
return nil
|
|
|
}
|
|
|
- logrus.Errorf("Concentrator.ReloadLampAlarmFromRedis设备[%s]从redis加载广播恢复截止时间失败:%s", o.devinfo.DevCode, err.Error())
|
|
|
return err
|
|
|
}
|
|
|
for k, v := range mapAlarm {
|
|
|
var lai LampAlarmInfo
|
|
|
if err := json.UnmarshalFromString(v, &lai); err == nil {
|
|
|
o.mapLampAlarm[k] = &lai
|
|
|
- } else {
|
|
|
- logrus.Errorf("从redis获取的告警信息还原失败,原内容:%s,失败原因:%s", v, err.Error())
|
|
|
}
|
|
|
}
|
|
|
return nil
|
|
|
@@ -277,14 +259,12 @@ func (o *Concentrator) ReloadLampAlarmFromRedis() error {
|
|
|
|
|
|
func (o *Concentrator) Handle() {
|
|
|
defer func() {
|
|
|
- if err := recover(); err != nil {
|
|
|
- logrus.Errorf("Concentrator.Handle发生异常:%v", err)
|
|
|
- logrus.Errorf("Concentrator.Handle发生异常,堆栈信息:%s", string(debug.Stack()))
|
|
|
- go o.Handle()
|
|
|
- }
|
|
|
+ recover()
|
|
|
+ go o.Handle()
|
|
|
+
|
|
|
}()
|
|
|
|
|
|
- o.queryPoleids()
|
|
|
+ o.queryPush()
|
|
|
o.BroadcastTime()
|
|
|
|
|
|
exit := false
|
|
|
@@ -294,10 +274,9 @@ func (o *Concentrator) Handle() {
|
|
|
for {
|
|
|
select {
|
|
|
case <-o.ctx.Done():
|
|
|
- logrus.Errorf("设备[%s]的HandlePole退出,原因:%v", o.devinfo.DevCode, o.ctx.Err())
|
|
|
exit = true
|
|
|
- case devinfo_ := <-o.chanDevInfo:
|
|
|
- o.devinfo = devinfo_
|
|
|
+ case devInfo := <-o.chanDevInfo:
|
|
|
+ o.devInfo = devInfo
|
|
|
case mi := <-o.chanModelInfo:
|
|
|
o.UpdateModel2(mi)
|
|
|
default:
|
|
|
@@ -306,8 +285,6 @@ func (o *Concentrator) Handle() {
|
|
|
if mm, ok := m.(mqtt.Message); ok {
|
|
|
if fn, ok := o.mapTopicHandle[mm.Topic()]; ok {
|
|
|
fn(mm)
|
|
|
- } else {
|
|
|
- logrus.Errorf("Concentrator.Handle:不支持的主题:%s", mm.Topic())
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
@@ -317,7 +294,7 @@ func (o *Concentrator) Handle() {
|
|
|
}
|
|
|
//每小时同步一次时间
|
|
|
if time.Now().Sub(LastTime).Minutes() > 60 {
|
|
|
- o.queryPoleids() //每小时从服务端同步一次单灯编号
|
|
|
+ o.queryPush() //每小时从服务端同步一次单灯编号
|
|
|
o.BroadcastTime() //每小时广播一次时间同步消息
|
|
|
LastTime = time.Now()
|
|
|
}
|
|
|
@@ -328,7 +305,7 @@ func (o *Concentrator) Handle() {
|
|
|
if quantity == 0 || send {
|
|
|
if nextFillTime.IsZero() || nextFillTime.Before(util.MlNow()) {
|
|
|
o.fillReadQueue()
|
|
|
- nextFillTime = util.MlNow().Add(time.Duration(o.devinfo.SendCloud) * time.Millisecond)
|
|
|
+ nextFillTime = util.MlNow().Add(time.Duration(o.devInfo.SendCloud) * time.Millisecond)
|
|
|
}
|
|
|
if send {
|
|
|
mapData = make(map[string]*protocol.CHZB_LampData)
|
|
|
@@ -348,58 +325,32 @@ func (o *Concentrator) CheckRecoveryAuto(force bool) {
|
|
|
for k := range o.mapTempLampsOOT {
|
|
|
delete(o.mapTempLampsOOT, k)
|
|
|
}
|
|
|
- if err := o.BroadcastAuto(); err != nil {
|
|
|
- logrus.Errorf("广播恢复时控失败:%s", err.Error())
|
|
|
- } else {
|
|
|
+ if err := o.BroadcastAuto(); err == nil {
|
|
|
o.broadcastAutoTime = time.Time{}
|
|
|
//删除redis中所有临时开关灯记录
|
|
|
- if err := redisEdgeData.Del(LampSwitchPrefix + o.devinfo.DevCode).Err(); err != nil {
|
|
|
- logrus.Errorf("手动广播恢复时控,更新redis失败:%s", err.Error())
|
|
|
- }
|
|
|
- logrus.Info("广播恢复时控成功")
|
|
|
+ redisEdgeData.Del(LampSwitchPrefix + o.devInfo.DevCode)
|
|
|
}
|
|
|
} else {
|
|
|
//如果广播控模式未过期,则判断单灯是否手动控过期,过期则恢复
|
|
|
var strList []string
|
|
|
for k, v := range o.mapTempLampsOOT {
|
|
|
if time.Time(v.End).Before(util.MlNow()) {
|
|
|
- if err := o.SetPoleAuto(k); err != nil {
|
|
|
- logrus.Errorf("单灯[%d]恢复时控失败:%s", k, err.Error())
|
|
|
- } else {
|
|
|
- logrus.Infof("单灯[%d]恢复时控成功", k)
|
|
|
+ if err := o.SetPoleAuto(k); err == nil {
|
|
|
strList = append(strList, strconv.Itoa(int(k)))
|
|
|
delete(o.mapTempLampsOOT, k)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if len(strList) > 0 {
|
|
|
- if err := redisEdgeData.HDel(LampSwitchPrefix+o.devinfo.DevCode, strList...).Err(); err != nil {
|
|
|
- logrus.Errorf("手动恢复灯控[%v]时控模式,更新redis失败:%s", strList, err.Error())
|
|
|
- }
|
|
|
+ _ = redisEdgeData.HDel(LampSwitchPrefix+o.devInfo.DevCode, strList...)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (o *Concentrator) queryPoleids() {
|
|
|
+func (o *Concentrator) queryPush() {
|
|
|
var obj protocol.Pack_CHZB_EmptyObject
|
|
|
- if str, err := obj.EnCode(o.devinfo.DevCode, appConfig.GID, GetNextUint64()); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_LAMP), str, mqtt.AtMostOnce, ToCloud)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func ConvertExcept(except uint16) string {
|
|
|
- //-1初始值 0正常,1异常亮灯,2异常熄灯,3亮度异常
|
|
|
- switch except {
|
|
|
- case protocol.LE_OK: //正常(正常开灯或熄灯状态)
|
|
|
- return "正常"
|
|
|
- case protocol.LE_ON: //亮灯异常(本该关灯状态)
|
|
|
- return "熄灯时段亮灯"
|
|
|
- case protocol.LE_OFF: //亮灯,但亮度异常(本该开灯状态,但开灯亮度不对)
|
|
|
- return "亮灯时段熄灯"
|
|
|
- case protocol.LE_ON_BRIGHTNESS:
|
|
|
- return "亮灯但亮度异常"
|
|
|
- default:
|
|
|
- return "状态未知"
|
|
|
+ if str, err := obj.EnCode(o.devInfo.DevCode, appConfig.GID, GetNextUint64()); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_LAMP), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -446,8 +397,8 @@ func (o *Concentrator) NextQueueRead(mapData map[string]*protocol.CHZB_LampData)
|
|
|
|
|
|
if quantity == 0 && len(mapData) > 0 {
|
|
|
var obj protocol.Pack_CHZB_UploadData
|
|
|
- if str, err := obj.EnCode(o.devinfo.DevCode, appConfig.GID, GetNextUint64(), o.devinfo.TID, mapData); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_DATA), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := obj.EnCode(o.devInfo.DevCode, appConfig.GID, GetNextUint64(), o.devInfo.TID, mapData); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_DATA), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
return quantity, true
|
|
|
}
|
|
|
@@ -461,8 +412,8 @@ func (o *Concentrator) UploadLampAlarm() {
|
|
|
for k, v := range o.mapLampAlarm {
|
|
|
if !v.Send && v.Alarm.EndTime == "" { //告警开始上报
|
|
|
var obj protocol.Pack_CHZB_LampAlarm
|
|
|
- if str, err := obj.EnCode(o.devinfo.DevCode, appConfig.GID, GetNextUint64(), v.Alarm); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_ALARM), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := obj.EnCode(o.devInfo.DevCode, appConfig.GID, GetNextUint64(), v.Alarm); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_ALARM), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
v.Send = true
|
|
|
|
|
|
@@ -470,30 +421,25 @@ func (o *Concentrator) UploadLampAlarm() {
|
|
|
strAlarm, _ := json.MarshalToString(v)
|
|
|
mapRedis := make(map[string]interface{})
|
|
|
mapRedis[k] = strAlarm
|
|
|
- if err := redisEdgeData.HSet(LampAlarmPrefix+o.devinfo.DevCode, mapRedis).Err(); err != nil {
|
|
|
- logrus.Errorf("告警信息缓存入redis失败:%s", err.Error())
|
|
|
- }
|
|
|
-
|
|
|
+ redisEdgeData.HSet(LampAlarmPrefix+o.devInfo.DevCode, mapRedis)
|
|
|
} else if v.Alarm.EndTime != "" { //告警结束上报
|
|
|
var obj protocol.Pack_CHZB_LampAlarm
|
|
|
- if str, err := obj.EnCode(o.devinfo.DevCode, appConfig.GID, GetNextUint64(), v.Alarm); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_ALARM), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := obj.EnCode(o.devInfo.DevCode, appConfig.GID, GetNextUint64(), v.Alarm); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_ALARM), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
toDelete = append(toDelete, k)
|
|
|
delete(o.mapLampAlarm, k)
|
|
|
}
|
|
|
}
|
|
|
if len(toDelete) > 0 {
|
|
|
- if err := redisEdgeData.HDel(LampAlarmPrefix+o.devinfo.DevCode, toDelete...).Err(); err != nil {
|
|
|
- logrus.Errorf("告警信息从redis删除失败:%s", err.Error())
|
|
|
- }
|
|
|
+ redisEdgeData.HDel(LampAlarmPrefix+o.devInfo.DevCode, toDelete...)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// CheckLampAlarm 检查开灯、关灯、亮度异常
|
|
|
func (o *Concentrator) CheckLampAlarm(lnd LampNumberDID, b1, b2 uint8) {
|
|
|
//真实数据时间
|
|
|
- now := util.MlNow().Add(-time.Duration(o.devinfo.WaitTime) * time.Millisecond)
|
|
|
+ now := util.MlNow().Add(-time.Duration(o.devInfo.WaitTime) * time.Millisecond)
|
|
|
except := uint16(protocol.LE_UNKNOWN)
|
|
|
//策略时间段检查
|
|
|
if oots, ok := o.mapLamps2OOT[lnd.LampID]; ok {
|
|
|
@@ -543,14 +489,12 @@ func (o *Concentrator) CheckLampAlarm(lnd LampNumberDID, b1, b2 uint8) {
|
|
|
if except == protocol.LE_OK { //告警结束
|
|
|
a.Alarm.EndTime = now.Format("2006-01-02 15:04:05")
|
|
|
a.Alarm.Brightness = b1
|
|
|
- logrus.Debugf("灯控[%s]状态[%s]", lnd.DID, ConvertExcept(except))
|
|
|
}
|
|
|
} else {
|
|
|
if except != protocol.LE_OK { //告警开始
|
|
|
a := protocol.LampAlarm{DID: lnd.DID, AlarmType: except, AlarmBrightness: b1, StartTime: now.Format("2006-01-02 15:04:05")}
|
|
|
lai := LampAlarmInfo{Alarm: &a, Send: false}
|
|
|
o.mapLampAlarm[lnd.DID] = &lai
|
|
|
- logrus.Debugf("灯控[%s]状态[%s]", lnd.DID, ConvertExcept(except))
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -563,7 +507,7 @@ func (o *Concentrator) nextSeq() uint8 {
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) SendRecvData(aduRequest []byte, retry int) (aduResponse []byte, err error) {
|
|
|
- serial := GetSerialMgr().GetSerialPort(o.devinfo.Code)
|
|
|
+ serial := GetSerialMgr().GetSerialPort(o.devInfo.Code)
|
|
|
if serial == nil {
|
|
|
return nil, ErrClosedConnection
|
|
|
}
|
|
|
@@ -571,7 +515,7 @@ func (o *Concentrator) SendRecvData(aduRequest []byte, retry int) (aduResponse [
|
|
|
retry = 1
|
|
|
}
|
|
|
for ; retry > 0; retry-- {
|
|
|
- aduResponse, err = serial.SendRecvData(aduRequest, FlagChZigbee, o.devinfo.WaitTime)
|
|
|
+ aduResponse, err = serial.SendRecvData(aduRequest, FlagChZigbee, o.devInfo.WaitTime)
|
|
|
if err == nil {
|
|
|
break
|
|
|
}
|
|
|
@@ -580,7 +524,7 @@ func (o *Concentrator) SendRecvData(aduRequest []byte, retry int) (aduResponse [
|
|
|
}
|
|
|
|
|
|
func (o *Concentrator) SendData(aduRequest []byte, retry int) (err error) {
|
|
|
- serial := GetSerialMgr().GetSerialPort(o.devinfo.Code)
|
|
|
+ serial := GetSerialMgr().GetSerialPort(o.devInfo.Code)
|
|
|
if serial == nil {
|
|
|
return ErrClosedConnection
|
|
|
}
|
|
|
@@ -588,7 +532,7 @@ func (o *Concentrator) SendData(aduRequest []byte, retry int) (err error) {
|
|
|
retry = 1
|
|
|
}
|
|
|
for ; retry > 0; retry-- {
|
|
|
- if err = serial.SendData(aduRequest, FlagChZigbee, o.devinfo.WaitTime); err == nil {
|
|
|
+ if err = serial.SendData(aduRequest, FlagChZigbee, o.devInfo.WaitTime); err == nil {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
@@ -616,7 +560,6 @@ func (o *Concentrator) BroadcastOnOrOff(on, brightness uint8) error {
|
|
|
cmd = zigbee.CmdSetBroadcastOff
|
|
|
}
|
|
|
var pack zigbee.PackUpgradeFuncCommand
|
|
|
- //pack.SetData(0x0000FEFE, cmd, o.nextSeq(), []byte{0xFE, 0xFE, 0xFF})
|
|
|
pack.SetData(0x0000FEFE, cmd, o.nextSeq(), []byte{0xFE, 0xFE, 0xFF, brightness, brightness}) //灯1和2
|
|
|
buff, err := pack.EnCode()
|
|
|
defer PoolPut(buff)
|
|
|
@@ -645,9 +588,9 @@ func (o *Concentrator) SetOnOffTime(PoleID uint32, Cmd uint8, data []zigbee.OnOf
|
|
|
defer PoolPut(buff0)
|
|
|
buff0.Write(GetPoleIDByte(PoleID))
|
|
|
|
|
|
- len := len(data)
|
|
|
+ length := len(data)
|
|
|
for i := 0; i < 4; i++ {
|
|
|
- if i < len {
|
|
|
+ if i < length {
|
|
|
buff0.Write(data[i].EnCode())
|
|
|
} else {
|
|
|
buff0.Write((&zigbee.OnOffTime{}).EnCode())
|
|
|
@@ -701,8 +644,6 @@ func (o *Concentrator) GetOnOffTime(PoleID uint32, Cmd uint8) ([]zigbee.OnOffTim
|
|
|
ret = append(ret, v)
|
|
|
}
|
|
|
return ret, nil
|
|
|
- } else {
|
|
|
- logrus.Errorf("读取开关灯时间返回的内容错误:%s", hex.EncodeToString(recvdata))
|
|
|
}
|
|
|
return nil, errors.New("读取开关灯时间返回的内容错误")
|
|
|
}
|
|
|
@@ -730,8 +671,6 @@ func (o *Concentrator) ReadPoleTime(PoleID uint32) (uint8, uint8, uint8, error)
|
|
|
}
|
|
|
if len(pgfcresp.Data) >= 5 {
|
|
|
return pgfcresp.Data[2], pgfcresp.Data[3], pgfcresp.Data[4], nil
|
|
|
- } else {
|
|
|
- logrus.Errorf("读取单灯时间返回的内容错误:%s", hex.EncodeToString(recvdata))
|
|
|
}
|
|
|
return 0, 0, 0, errors.New("读取单灯时间返回的内容错误")
|
|
|
}
|
|
|
@@ -772,8 +711,6 @@ func (o *Concentrator) ReadElectricalPara(PoleID uint32) (*ElecPara, error) {
|
|
|
ep.Degree[0] = binary.BigEndian.Uint16(pgfcresp.Data[9:11])
|
|
|
ep.Degree[1] = binary.BigEndian.Uint16(pgfcresp.Data[11:13])
|
|
|
return &ep, nil
|
|
|
- } else {
|
|
|
- logrus.Errorf("读取电流电压电度返回的内容错误:%s", hex.EncodeToString(recvdata))
|
|
|
}
|
|
|
return nil, errors.New("读取电流电压电度返回错误")
|
|
|
}
|
|
|
@@ -817,8 +754,6 @@ func (o *Concentrator) GetBrightness(PoleID uint32) (uint8, uint8, error) {
|
|
|
}
|
|
|
if pgfcresp.Cmd == zigbee.CmdReadBrightness && len(pgfcresp.Data) >= 4 {
|
|
|
return pgfcresp.Data[2], pgfcresp.Data[3], nil
|
|
|
- } else {
|
|
|
- logrus.Errorf("查询亮度返回的内容错误:%s", hex.EncodeToString(recvdata))
|
|
|
}
|
|
|
return 0, 0, errors.New("查询亮度返回错误")
|
|
|
}
|
|
|
@@ -860,12 +795,11 @@ func (o *Concentrator) HandleTpChzbSetBroadcasttime(m mqtt.Message) {
|
|
|
var ret protocol.Pack_Ack
|
|
|
var err error
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
err = o.BroadcastTime()
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_BROADCASTTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_BROADCASTTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -874,16 +808,15 @@ func (o *Concentrator) HandleTpChzbSetWaittime(m mqtt.Message) {
|
|
|
var ret protocol.Pack_Ack
|
|
|
var err error
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
if obj.Data.Waittime < 1000 || obj.Data.Waittime > 15000 {
|
|
|
err = errors.New("设置的等待时间不在[1000,15000]范围")
|
|
|
} else {
|
|
|
- o.devinfo.WaitTime = obj.Data.Waittime
|
|
|
+ o.devInfo.WaitTime = obj.Data.Waittime
|
|
|
}
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_WAITTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_WAITTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -893,10 +826,9 @@ func (o *Concentrator) HandleTpChzbSetSwitch(m mqtt.Message) {
|
|
|
var err error
|
|
|
mapIpole := make(map[uint32]*protocol.StateError)
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
- if obj.Id != o.devinfo.DevCode {
|
|
|
+ if obj.Id != o.devInfo.DevCode {
|
|
|
return
|
|
|
}
|
|
|
Brightness := obj.Data.Brightness
|
|
|
@@ -909,13 +841,13 @@ func (o *Concentrator) HandleTpChzbSetSwitch(m mqtt.Message) {
|
|
|
End: util.MLTime(util.MlNow().Add(time.Duration(obj.Data.Recovery) * time.Second)), //延迟2分钟,以防指令在队列中未及时执行
|
|
|
Brightness: Brightness,
|
|
|
}
|
|
|
- ltrstr, _ := json.MarshalToString(ltr)
|
|
|
+ str, _ := json.MarshalToString(ltr)
|
|
|
if len(obj.Data.LampIDs) == 0 { //广播
|
|
|
err = o.BroadcastOnOrOff(obj.Data.Switch, Brightness)
|
|
|
o.broadcastAutoTime = util.MlNow().Add(time.Duration(obj.Data.Recovery) * time.Second)
|
|
|
for k := range o.mapLamps {
|
|
|
- mapRedisTempLampsOOT[strconv.Itoa(int(k))] = ltrstr //redis
|
|
|
- o.mapTempLampsOOT[k] = <r //内存
|
|
|
+ mapRedisTempLampsOOT[strconv.Itoa(int(k))] = str //redis
|
|
|
+ o.mapTempLampsOOT[k] = <r //内存
|
|
|
}
|
|
|
} else { //指定的灯
|
|
|
for _, pid := range obj.Data.LampIDs {
|
|
|
@@ -925,15 +857,13 @@ func (o *Concentrator) HandleTpChzbSetSwitch(m mqtt.Message) {
|
|
|
}
|
|
|
err = o.SetBrightness(pid, Brightness, Brightness)
|
|
|
mapIpole[pid] = protocol.NewStateError(err)
|
|
|
- mapRedisTempLampsOOT[strconv.Itoa(int(pid))] = ltrstr //redis
|
|
|
- o.mapTempLampsOOT[pid] = <r //内存
|
|
|
+ mapRedisTempLampsOOT[strconv.Itoa(int(pid))] = str //redis
|
|
|
+ o.mapTempLampsOOT[pid] = <r //内存
|
|
|
}
|
|
|
}
|
|
|
- if err := redisEdgeData.HSet(LampSwitchPrefix+o.devinfo.DevCode, mapRedisTempLampsOOT).Err(); err != nil {
|
|
|
- logrus.Errorf("手动开关灯时间设置[内容:%v]缓存到redis失败:%s", mapRedisTempLampsOOT, err.Error())
|
|
|
- }
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_SWITCH_ACK), str, mqtt.AtMostOnce, ToAll)
|
|
|
+ redisEdgeData.HSet(LampSwitchPrefix+o.devInfo.DevCode, mapRedisTempLampsOOT)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_SWITCH_ACK), str, mqtt.AtMostOnce, ToAll)
|
|
|
}
|
|
|
}
|
|
|
func (o *Concentrator) HandleTpChzbSetRecoveryAuto(m mqtt.Message) {
|
|
|
@@ -942,10 +872,9 @@ func (o *Concentrator) HandleTpChzbSetRecoveryAuto(m mqtt.Message) {
|
|
|
var err error
|
|
|
mapIpole := make(map[uint32]*protocol.StateError)
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
- if obj.Id != o.devinfo.DevCode {
|
|
|
+ if obj.Id != o.devInfo.DevCode {
|
|
|
return
|
|
|
}
|
|
|
if len(obj.Data.LampIDs) == 0 { //广播
|
|
|
@@ -957,36 +886,29 @@ func (o *Concentrator) HandleTpChzbSetRecoveryAuto(m mqtt.Message) {
|
|
|
if err == nil {
|
|
|
delete(o.mapTempLampsOOT, v)
|
|
|
strList = append(strList, strconv.Itoa(int(v)))
|
|
|
- } else {
|
|
|
- logrus.Errorf("手动单灯[%d]恢复时控失败:%s", v, err.Error())
|
|
|
}
|
|
|
mapIpole[v] = protocol.NewStateError(err)
|
|
|
}
|
|
|
- if err := redisEdgeData.HDel(LampSwitchPrefix+o.devinfo.DevCode, strList...).Err(); err != nil {
|
|
|
- logrus.Errorf("手动恢复灯控[%v]时控模式,更新redis失败:%s", strList, err.Error())
|
|
|
- }
|
|
|
+ redisEdgeData.HDel(LampSwitchPrefix+o.devInfo.DevCode, strList...)
|
|
|
}
|
|
|
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO_ACK), str, mqtt.AtMostOnce, ToAll)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_RECOVERY_AUTO_ACK), str, mqtt.AtMostOnce, ToAll)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (o *Concentrator) HandleTpChzbSetOnofftime(m mqtt.Message) {
|
|
|
+func (o *Concentrator) HandleSetOnOffTime(m mqtt.Message) {
|
|
|
var obj protocol.Pack_SetOnOffTime
|
|
|
var ret protocol.Pack_CHZB_SeqLampAck
|
|
|
var err error
|
|
|
mapIpole := make(map[uint32]*protocol.StateError)
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
- if obj.Id != o.devinfo.DevCode {
|
|
|
+ if obj.Id != o.devInfo.DevCode {
|
|
|
return
|
|
|
}
|
|
|
if len(obj.Data.LampIDs) == 0 || len(obj.Data.OnOffTime) == 0 {
|
|
|
- logrus.Errorf("Handle_TP_CHZB_SET_ONOFFTIME:错误,灯控编号[%v],时间段个数:%v",
|
|
|
- obj.Data.LampIDs, obj.Data.OnOffTime)
|
|
|
return
|
|
|
}
|
|
|
mapRedisOOT := make(map[string]interface{})
|
|
|
@@ -1001,45 +923,38 @@ func (o *Concentrator) HandleTpChzbSetOnofftime(m mqtt.Message) {
|
|
|
}
|
|
|
data = append(data, dat)
|
|
|
}
|
|
|
- datastr, _ := json.MarshalToString(data)
|
|
|
+ dataStr, _ := json.MarshalToString(data)
|
|
|
for _, v := range obj.Data.LampIDs {
|
|
|
if v == 0 || v == 0x0000FEFE { //编号等于0或为广播地址则不处理
|
|
|
continue
|
|
|
}
|
|
|
- if err = o.SetOnOffTime(v, zigbee.CmdSetOnofftime, data); err != nil {
|
|
|
- logrus.Errorf("单灯[%d]设置开关灯时间失败:%s", v, err.Error())
|
|
|
- } else {
|
|
|
- logrus.Infof("单灯[%d]设置开关灯时间成功", v)
|
|
|
- }
|
|
|
+ o.SetOnOffTime(v, zigbee.CmdSetOnofftime, data)
|
|
|
mapIpole[v] = protocol.NewStateError(err)
|
|
|
- mapRedisOOT[strconv.Itoa(int(v))] = datastr //缓存到redis
|
|
|
+ mapRedisOOT[strconv.Itoa(int(v))] = dataStr //缓存到redis
|
|
|
o.mapLamps2OOT[v] = data //缓存在内存中
|
|
|
}
|
|
|
//持久缓存到redis,以便于重启后读取进内存中
|
|
|
- if err := redisEdgeData.HSet(LampOotPrefix+o.devinfo.DevCode, mapRedisOOT).Err(); err != nil {
|
|
|
- logrus.Errorf("灯控时间设置[内容:%v]缓存到redis失败:%s", mapRedisOOT, err.Error())
|
|
|
- }
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ redisEdgeData.HSet(LampOotPrefix+o.devInfo.DevCode, mapRedisOOT)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, mapIpole); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_ONOFFTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (o *Concentrator) HandleTpChzbQueryOnofftime(m mqtt.Message) {
|
|
|
+func (o *Concentrator) HandleQueryOnOffTime(m mqtt.Message) {
|
|
|
var obj protocol.Pack_CHZB_QueryOnOffTime
|
|
|
var oot []zigbee.OnOffTime
|
|
|
var err error
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
- if obj.Id != o.devinfo.DevCode {
|
|
|
+ if obj.Id != o.devInfo.DevCode {
|
|
|
return
|
|
|
}
|
|
|
if obj.Data.Poleid > 0 {
|
|
|
oot, err = o.GetOnOffTime(obj.Data.Poleid, zigbee.CmdReadOnofftime)
|
|
|
}
|
|
|
var ret protocol.Pack_CHZB_QueryOnOffTimeAck
|
|
|
- var poot []protocol.CHZB_OnOffTime
|
|
|
+ var offTimes []protocol.CHZB_OnOffTime
|
|
|
for _, v := range oot {
|
|
|
x := protocol.CHZB_OnOffTime{
|
|
|
OnHour: v.OnHour,
|
|
|
@@ -1048,22 +963,21 @@ func (o *Concentrator) HandleTpChzbQueryOnofftime(m mqtt.Message) {
|
|
|
OffMinite: v.OffMinite,
|
|
|
Brightness: v.Brightness,
|
|
|
}
|
|
|
- poot = append(poot, x)
|
|
|
+ offTimes = append(offTimes, x)
|
|
|
}
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, obj.Data.Poleid, err, poot); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_ONOFFTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, obj.Data.Poleid, err, offTimes); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_ONOFFTIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (o *Concentrator) HandleTpChzbSetUpdateLamp(m mqtt.Message) {
|
|
|
+func (o *Concentrator) HandleSetUpdateLamp(m mqtt.Message) {
|
|
|
var obj protocol.Pack_CHZB_LampIDs
|
|
|
var ret protocol.Pack_Ack
|
|
|
var err error
|
|
|
if err = obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
- if obj.Id != o.devinfo.DevCode {
|
|
|
+ if obj.Id != o.devInfo.DevCode {
|
|
|
return
|
|
|
}
|
|
|
if len(obj.Data.MapLamps) > 0 {
|
|
|
@@ -1076,16 +990,15 @@ func (o *Concentrator) HandleTpChzbSetUpdateLamp(m mqtt.Message) {
|
|
|
}
|
|
|
o.mapLamps = mapLampsTmp
|
|
|
}
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, err); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_SET_UPDATE_LAMP_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (o *Concentrator) HandleTpChzbQueryTime(m mqtt.Message) {
|
|
|
+func (o *Concentrator) HandleQueryTime(m mqtt.Message) {
|
|
|
var obj protocol.Pack_CHZB_QueryTime
|
|
|
var ret protocol.Pack_CHZB_QueryTimeAck
|
|
|
if err := obj.DeCode(m.PayloadString()); err != nil {
|
|
|
- logrus.Errorf("协议解析错误:%s,协议主题:%s,协议内容:%s", err.Error(), m.Topic(), m.PayloadString())
|
|
|
return
|
|
|
}
|
|
|
var pt *protocol.CHZB_LampTime = nil
|
|
|
@@ -1093,7 +1006,7 @@ func (o *Concentrator) HandleTpChzbQueryTime(m mqtt.Message) {
|
|
|
if err == nil {
|
|
|
pt = &protocol.CHZB_LampTime{Hour: hh, Minite: mm, Second: ss}
|
|
|
}
|
|
|
- if str, err := ret.EnCode(o.devinfo.DevCode, appConfig.GID, obj.Seq, obj.Data.LampID, err, pt); err == nil {
|
|
|
- GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devinfo.DevCode, protocol.TP_CHZB_QUERY_TIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
+ if str, err := ret.EnCode(o.devInfo.DevCode, appConfig.GID, obj.Seq, obj.Data.LampID, err, pt); err == nil {
|
|
|
+ GetMQTTMgr().Publish(GetTopic(protocol.DT_CONCENTRATOR, o.devInfo.DevCode, protocol.TP_CHZB_QUERY_TIME_ACK), str, mqtt.AtMostOnce, ToCloud)
|
|
|
}
|
|
|
}
|