lampstrategy.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. package main
  2. import (
  3. "runtime/debug"
  4. "strconv"
  5. "strings"
  6. "sync"
  7. "time"
  8. "github.com/go-redis/redis/v7"
  9. "github.com/sirupsen/logrus"
  10. "lc/common/models"
  11. "lc/common/mqtt"
  12. "lc/common/protocol"
  13. "lc/common/util"
  14. )
  15. var _LampStrategyMgrOnce sync.Once
  16. var _LampStrategyMgrSingle *LampStrategyMgr
  17. func GetLampStrategyMgr() *LampStrategyMgr {
  18. _LampStrategyMgrOnce.Do(func() {
  19. _LampStrategyMgrSingle = &LampStrategyMgr{
  20. mapLampOOT: make(map[string][]protocol.CHZB_OnOffTime),
  21. mapLampHlOOT: make(map[string][]protocol.HLWLZB_OnOffTime),
  22. }
  23. })
  24. return _LampStrategyMgrSingle
  25. }
  26. // LampStrategyQueue redis缓存
  27. var LampStrategyQueue = "lamp_strategy_queue" //已修改的灯控编码列表,队列方式,先进先出
  28. // LampStrategyMgr 灯控时间策略管理
  29. type LampStrategyMgr struct {
  30. mapLampOOT map[string][]protocol.CHZB_OnOffTime //灯控策略时间,开灯时间段
  31. mapLampHlOOT map[string][]protocol.HLWLZB_OnOffTime //灯控策略时间,开灯时间段
  32. }
  33. func (o *LampStrategyMgr) Handler(args ...interface{}) interface{} {
  34. defer func() {
  35. if err := recover(); err != nil {
  36. time.Sleep(time.Second)
  37. gopool.Add(o.Handler, args)
  38. logrus.Errorf("LampStrategyMgr.Handler发生异常:%s", string(debug.Stack()))
  39. }
  40. }()
  41. IDList := make([]string, 0, 100)
  42. for {
  43. strID, err := redisCltRawData.RPop(LampStrategyQueue).Result() //灯控id
  44. if err != nil {
  45. if err != redis.Nil { //排除掉无数据的情况
  46. logrus.Errorf("读取redis队列lamp_strategy_queue发生错误:%s", err.Error())
  47. }
  48. } else {
  49. id := strings.Trim(strID, " ")
  50. if len(id) > 0 {
  51. IDList = append(IDList, id)
  52. }
  53. }
  54. //队列无数据并且IDList有数据,或IDList数据达到封顶值100,则进行处理
  55. if (err == redis.Nil && len(IDList) > 0) || len(IDList) == 100 {
  56. idlist := RemoveReplicaString(IDList)
  57. o.HandleZigbeeLampStrategy(idlist) //处理zigbee灯控
  58. o.HandleHLZigbeeLampStrategy(idlist) //处理海蓝zigbee灯控
  59. o.HandleYm485LampStrategy(idlist) //处理485灯控
  60. IDList = make([]string, 0, 100)
  61. }
  62. time.Sleep(1 * time.Second)
  63. }
  64. }
  65. type ConcentratorInfo struct {
  66. DID string
  67. Tenant string
  68. GID string
  69. LampIDs []uint32
  70. }
  71. // HandleZigbeeLampStrategy 处理Zigbee灯控策略
  72. func (o *LampStrategyMgr) HandleZigbeeLampStrategy(IDs []string) {
  73. zlsArr, err := models.GetZigbeeLampStrategyByIDs(IDs)
  74. if err != nil {
  75. oList := make([]interface{}, 0, len(IDs))
  76. for _, v := range IDs {
  77. oList = append(oList, v)
  78. }
  79. redisCltRawData.LPush(LampStrategyQueue, oList...)
  80. }
  81. if len(zlsArr) == 0 {
  82. return
  83. }
  84. //处理照明策略时间
  85. mapTime := make(map[string][]protocol.CHZB_OnOffTime) //策略编号->时间和亮度信息
  86. for _, v := range zlsArr {
  87. if _, ok := mapTime[v.Strategy]; ok {
  88. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  89. continue
  90. }
  91. var ls []models.LampStrategy //time_info字段
  92. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  93. logrus.Errorf("HandleZigbeeLampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  94. continue
  95. }
  96. if len(ls) == 0 {
  97. continue
  98. }
  99. //日出日落
  100. if v.Sunset == 1 {
  101. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  102. onOffTimes := make([]protocol.CHZB_OnOffTime, 1)
  103. onOffTimes[0].Brightness = uint8(ls[0].Brightness)
  104. onHour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  105. onMinute, _ := strconv.Atoi(strings.Split(set, ":")[1])
  106. offHour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  107. offMinute, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  108. onOffTimes[0].OnHour = uint8(onHour)
  109. onOffTimes[0].OnMinite = uint8(onMinute)
  110. onOffTimes[0].OffHour = uint8(offHour)
  111. onOffTimes[0].OffMinite = uint8(offMinute)
  112. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  113. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  114. }
  115. } else {
  116. onOffTimes := make([]protocol.CHZB_OnOffTime, len(ls), len(ls))
  117. for i, v := range ls {
  118. onOffTimes[i].Brightness = uint8(v.Brightness)
  119. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  120. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  121. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  122. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  123. onOffTimes[i].OnHour = uint8(onHour)
  124. onOffTimes[i].OnMinite = uint8(onMinute)
  125. onOffTimes[i].OffHour = uint8(offHour)
  126. onOffTimes[i].OffMinite = uint8(offMinute)
  127. }
  128. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  129. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  130. }
  131. }
  132. //处理照明策略,集控器及末端编号
  133. mapStrategyToMapConcentratorToNumbers := make(map[string]map[string]*ConcentratorInfo)
  134. for _, v := range zlsArr {
  135. if _, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy]; !ok {
  136. mapStrategyToMapConcentratorToNumbers[v.Strategy] = make(map[string]*ConcentratorInfo)
  137. }
  138. if pConcentratorInfo, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator]; !ok {
  139. c := ConcentratorInfo{DID: v.Concentrator, Tenant: v.Tenant, GID: v.GID}
  140. c.LampIDs = append(c.LampIDs, uint32(v.Number))
  141. mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator] = &c
  142. } else {
  143. pConcentratorInfo.LampIDs = append(pConcentratorInfo.LampIDs, uint32(v.Number))
  144. }
  145. }
  146. for k0, v0 := range mapStrategyToMapConcentratorToNumbers {
  147. oots, ok := mapTime[k0]
  148. if !ok {
  149. continue
  150. }
  151. for k1, v1 := range v0 {
  152. var obj protocol.Pack_SetOnOffTime
  153. seq := GetNextSeq()
  154. str, err := obj.EnCode(k1, v1.GID, seq, v1.LampIDs, oots)
  155. if err != nil {
  156. continue
  157. }
  158. topic := GetTopic(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  159. var msg string
  160. if msg0, errmsg := json.MarshalIndent(obj, "", " "); errmsg == nil {
  161. msg = string(msg0)
  162. } else {
  163. msg = str
  164. }
  165. odb := models.DeviceCmdRecord{
  166. ID: seq,
  167. GID: v1.GID,
  168. DID: k1,
  169. Topic: topic,
  170. Message: msg,
  171. State: 0,
  172. }
  173. if err := models.G_db.Create(&odb).Error; err != nil {
  174. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  175. } else {
  176. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库成功", k1, v1.LampIDs)
  177. }
  178. err = GetMQTTMgr().Publish(topic, str, mqtt.AtLeastOnce)
  179. if err != nil {
  180. logrus.Errorf("HandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落消息错误:%s", k1, v1.LampIDs, err.Error())
  181. }
  182. }
  183. }
  184. }
  185. // HandleHLZigbeeLampStrategy 处理海蓝Zigbee灯控策略
  186. func (o *LampStrategyMgr) HandleHLZigbeeLampStrategy(IDs []string) {
  187. zlsArr, err := models.GetHLZigbeeLampStrategyByIDs(IDs) ////海蓝根据灯控编码列表,获取所有hlzigbee灯控
  188. if err != nil {
  189. oList := make([]interface{}, 0, len(IDs))
  190. for _, v := range IDs {
  191. oList = append(oList, v)
  192. }
  193. redisCltRawData.LPush(LampStrategyQueue, oList...) //灯控ID入队列中,待处理的ids
  194. }
  195. if len(zlsArr) == 0 {
  196. return
  197. }
  198. //处理照明策略时间-从存入到数据库中的策略处理
  199. mapTime := make(map[string][]protocol.HLWLZB_OnOffTime) //策略编号->时间和亮度信息
  200. for _, v := range zlsArr {
  201. if _, ok := mapTime[v.Strategy]; ok {
  202. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  203. continue
  204. }
  205. var ls []models.LampStrategy //time_info字段
  206. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  207. logrus.Errorf("HandleZigbeeLampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  208. continue
  209. }
  210. if len(ls) == 0 {
  211. continue
  212. }
  213. //日出日落
  214. if v.Sunset == 1 {
  215. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  216. oots := make([]protocol.HLWLZB_OnOffTime, 1)
  217. oots[0].Brightness = uint8(ls[0].Brightness)
  218. onhour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  219. onminite, _ := strconv.Atoi(strings.Split(set, ":")[1])
  220. offhour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  221. offminite, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  222. oots[0].OnHour = uint8(onhour)
  223. oots[0].OnMinite = uint8(onminite)
  224. oots[0].OffHour = uint8(offhour)
  225. oots[0].OffMinite = uint8(offminite)
  226. mapTime[v.Strategy] = append(mapTime[v.Strategy], oots...)
  227. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  228. }
  229. } else {
  230. onOffTimes := make([]protocol.HLWLZB_OnOffTime, len(ls), len(ls))
  231. for i, v := range ls {
  232. onOffTimes[i].Brightness = uint8(v.Brightness)
  233. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  234. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  235. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  236. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  237. onOffTimes[i].OnHour = uint8(onHour)
  238. onOffTimes[i].OnMinite = uint8(onMinute)
  239. onOffTimes[i].OffHour = uint8(offHour)
  240. onOffTimes[i].OffMinite = uint8(offMinute)
  241. }
  242. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  243. o.mapLampHlOOT[v.ID] = append(o.mapLampHlOOT[v.ID], mapTime[v.Strategy]...)
  244. }
  245. }
  246. //处理照明策略,集控器及末端编号
  247. mapStrategyToMapConcentratorToNumbers := make(map[string]map[string]*ConcentratorInfo)
  248. for _, v := range zlsArr {
  249. if _, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy]; !ok {
  250. mapStrategyToMapConcentratorToNumbers[v.Strategy] = make(map[string]*ConcentratorInfo) //key为Strategy 没有就创建
  251. }
  252. if pConcentratorInfo, ok := mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator]; !ok { //没有就创建
  253. c := ConcentratorInfo{DID: v.Concentrator, Tenant: v.Tenant, GID: v.GID}
  254. c.LampIDs = append(c.LampIDs, uint32(v.Number)) //灯加入进去
  255. mapStrategyToMapConcentratorToNumbers[v.Strategy][v.Concentrator] = &c
  256. } else {
  257. pConcentratorInfo.LampIDs = append(pConcentratorInfo.LampIDs, uint32(v.Number)) //加灯
  258. }
  259. }
  260. for k0, v0 := range mapStrategyToMapConcentratorToNumbers {
  261. oots, ok := mapTime[k0]
  262. if !ok {
  263. continue
  264. }
  265. for k1, v1 := range v0 {
  266. if len(oots) == 1 && (oots[0].OffHour == 0 && oots[0].OffMinite == 0 && oots[0].OnHour == 0 && oots[0].OnMinite == 0) { //清除策略
  267. var obj protocol.Pack_HLClearStrategy
  268. seq := GetNextSeq()
  269. str, err := obj.EnCode(k1)
  270. logrus.Debugf("%s", str)
  271. s, err := json.MarshalToString(oots)
  272. logrus.Debugf("%s", s)
  273. if err != nil {
  274. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器---[%s]对灯控[%v]发布清除策略指令入库错误:%s", k1, v1.LampIDs, err.Error())
  275. continue
  276. }
  277. topic := GetHLTopicDown(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  278. var msg string
  279. if msg0, errmsg := json.MarshalIndent(obj, "", " "); errmsg == nil {
  280. msg = string(msg0)
  281. } else {
  282. msg = str
  283. }
  284. odb := models.DeviceCmdRecord{ //记录入库
  285. ID: seq,
  286. GID: v1.GID,
  287. DID: k1,
  288. Topic: topic,
  289. Message: msg,
  290. State: 0,
  291. }
  292. if err := models.G_db.Create(&odb).Error; err != nil {
  293. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  294. } else {
  295. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略时指令入库成功", k1, v1.LampIDs)
  296. }
  297. err = GetHlMqttMgr().Publish(topic, str, mqtt.AtLeastOnce)
  298. if err != nil {
  299. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布清除策略消息错误:%s", k1, v1.LampIDs, err.Error())
  300. }
  301. return
  302. }
  303. var obj protocol.Pack_HLSetOnOffTime
  304. seq := GetNextSeq()
  305. str, err := obj.EnCode(k1, v1.GID, seq, v1.LampIDs, oots)
  306. logrus.Debugf("%s", str)
  307. s, err := json.MarshalToString(oots)
  308. logrus.Debugf("%s", s)
  309. if err != nil {
  310. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器---[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  311. continue
  312. }
  313. topic := GetHLTopicDown(v1.Tenant, protocol.DT_CONCENTRATOR, k1, protocol.TP_CHZB_SET_ONOFFTIME)
  314. var msg string
  315. if msg0, errMsg := json.MarshalIndent(obj, "", " "); errMsg == nil {
  316. msg = string(msg0)
  317. } else {
  318. msg = str
  319. }
  320. odb := models.DeviceCmdRecord{ //记录入库
  321. ID: seq,
  322. GID: v1.GID,
  323. DID: k1,
  324. Topic: topic,
  325. Message: msg,
  326. State: 0,
  327. }
  328. if err := models.G_db.Create(&odb).Error; err != nil {
  329. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库错误:%s", k1, v1.LampIDs, err.Error())
  330. } else {
  331. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落时间时指令入库成功", k1, v1.LampIDs)
  332. }
  333. err = GetHlMqttMgr().Publish(topic, str, mqtt.AtLeastOnce)
  334. if err != nil {
  335. logrus.Errorf("HLHandleZigbeeLampStrategy:集控器[%s]对灯控[%v]发布日出日落消息错误:%s", k1, v1.LampIDs, err.Error())
  336. }
  337. }
  338. }
  339. }
  340. // HandleYm485LampStrategy 处理裕明485灯控
  341. func (o *LampStrategyMgr) HandleYm485LampStrategy(IDs []string) {
  342. lsArr, err := models.GetYm485Lampstrategy(IDs)
  343. if err != nil {
  344. oList := make([]interface{}, 0, len(IDs))
  345. for _, v := range IDs {
  346. oList = append(oList, v)
  347. }
  348. redisCltRawData.LPush(LampStrategyQueue, oList...)
  349. }
  350. if len(lsArr) == 0 {
  351. return
  352. }
  353. //处理照明策略时间
  354. mapTime := make(map[string][]protocol.CHZB_OnOffTime) //策略编号->时间和亮度信息
  355. for _, v := range lsArr {
  356. if _, ok := mapTime[v.Strategy]; ok {
  357. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  358. continue
  359. }
  360. var ls []models.LampStrategy //time_info字段
  361. if err := json.UnmarshalFromString(v.TimeInfo, &ls); err != nil {
  362. logrus.Errorf("HandleYm485LampStrategy:策略时间字段解析错误,字段内容:%s,错误原因:%s", v.TimeInfo, err.Error())
  363. continue
  364. }
  365. if len(ls) == 0 {
  366. continue
  367. }
  368. //日出日落
  369. if v.Sunset == 1 {
  370. if rise, set, err := util.SunriseSunsetForChina(v.Latitude, v.Longitude); err == nil {
  371. onOffTimes := make([]protocol.CHZB_OnOffTime, 1)
  372. onOffTimes[0].Brightness = uint8(ls[0].Brightness)
  373. onHour, _ := strconv.Atoi(strings.Split(set, ":")[0])
  374. onMinute, _ := strconv.Atoi(strings.Split(set, ":")[1])
  375. offHour, _ := strconv.Atoi(strings.Split(rise, ":")[0])
  376. offMinute, _ := strconv.Atoi(strings.Split(rise, ":")[1])
  377. onOffTimes[0].OnHour = uint8(onHour)
  378. onOffTimes[0].OnMinite = uint8(onMinute)
  379. onOffTimes[0].OffHour = uint8(offHour)
  380. onOffTimes[0].OffMinite = uint8(offMinute)
  381. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  382. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  383. }
  384. } else {
  385. onOffTimes := make([]protocol.CHZB_OnOffTime, len(ls), len(ls))
  386. for i, v := range ls {
  387. onOffTimes[i].Brightness = uint8(v.Brightness)
  388. onHour, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[0])
  389. onMinute, _ := strconv.Atoi(strings.Split(v.Ontime, ":")[1])
  390. offHour, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[0])
  391. offMinute, _ := strconv.Atoi(strings.Split(v.Offtime, ":")[1])
  392. onOffTimes[i].OnHour = uint8(onHour)
  393. onOffTimes[i].OnMinite = uint8(onMinute)
  394. onOffTimes[i].OffHour = uint8(offHour)
  395. onOffTimes[i].OffMinite = uint8(offMinute)
  396. }
  397. mapTime[v.Strategy] = append(mapTime[v.Strategy], onOffTimes...)
  398. o.mapLampOOT[v.ID] = append(o.mapLampOOT[v.ID], mapTime[v.Strategy]...)
  399. }
  400. }
  401. //处理照明策略,集控器及末端编号
  402. for _, v := range lsArr {
  403. oots, ok := mapTime[v.Strategy]
  404. if !ok {
  405. continue
  406. }
  407. var obj protocol.Pack_SetOnOffTime
  408. seq := GetNextSeq()
  409. str, err := obj.EnCode(v.ID, v.GID, seq, nil, oots)
  410. if err != nil {
  411. continue
  412. }
  413. topic := GetTopic(v.Tenant, protocol.DT_LAMPCONTROLLER, v.ID, protocol.TP_YM_SET_ONOFFTIME)
  414. var msg string
  415. if msg0, errMsg := json.MarshalIndent(obj, "", " "); errMsg == nil {
  416. msg = string(msg0)
  417. } else {
  418. msg = str
  419. }
  420. odb := models.DeviceCmdRecord{
  421. ID: seq,
  422. GID: v.GID,
  423. DID: v.ID,
  424. Topic: topic,
  425. Message: msg,
  426. State: 0,
  427. }
  428. if err := models.G_db.Create(&odb).Error; err != nil {
  429. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落时间时指令入库错误:%s", v.ID, err.Error())
  430. } else {
  431. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落时间时指令入库成功", v.ID)
  432. }
  433. err = GetMQTTMgr().Publish(topic, str, mqtt.AtLeastOnce)
  434. if err != nil {
  435. logrus.Errorf("HandleYm485LampStrategy:对灯控[%s]发布日出日落消息错误:%s", v.ID, err.Error())
  436. }
  437. }
  438. }
  439. // RemoveReplicaString 字符串去重
  440. func RemoveReplicaString(slc []string) []string {
  441. result := make([]string, 0)
  442. tempMap := make(map[string]bool, len(slc))
  443. for _, e := range slc {
  444. if _, ok := tempMap[e]; !ok {
  445. tempMap[e] = true
  446. result = append(result, e)
  447. }
  448. }
  449. return result
  450. }