scene.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package scene
  2. import (
  3. "context"
  4. "github.com/gogf/gf/database/gredis"
  5. "time"
  6. )
  7. const (
  8. timerScenePrefix = "scene:timer:*"
  9. deviceScenePrefix = "scene:device_status:*"
  10. weatherScenePrefix = "scene:weather:*"
  11. scenePrefix = "scene:*"
  12. dataExpires = 7200
  13. )
  14. type GetSceneParams struct {
  15. Type string `json:"type"`
  16. Name string `json:"name"`
  17. DeviceCode string `json:"device_code"`
  18. }
  19. type InfoScene struct {
  20. Key string `json:"key"`
  21. Name string `json:"name"`
  22. Desc string `json:"desc"`
  23. SceneId string `json:"scene_id"`
  24. Config string `json:"config"`
  25. }
  26. type AllSceneResult struct {
  27. Total int `json:"total"`
  28. Data []*InfoScene `json:"data"`
  29. }
  30. type Info struct {
  31. Key string `json:"key"`
  32. Name string `json:"name"`
  33. ActionDesc string `json:"action_desc"`
  34. ConditionDesc string `json:"condition_desc"`
  35. SceneId string `json:"scene_id"`
  36. Config string `json:"config"`
  37. Time time.Time `json:"time"`
  38. }
  39. type Manager struct {
  40. redisClient *gredis.Redis
  41. ctx context.Context
  42. }
  43. func NewSceneManager(host string, port int) *Manager {
  44. red := gredis.New(&gredis.Config{
  45. Host: host,
  46. Port: port,
  47. Db: 2,
  48. MaxActive: 100,
  49. })
  50. ctx := context.Background()
  51. helper := &Manager{
  52. redisClient: red,
  53. ctx: ctx,
  54. }
  55. return helper
  56. }
  57. func (a *Manager) SaveScene(info *Info) error {
  58. _, err := a.redisClient.DoVar("SET", info.Key, info)
  59. if err != nil {
  60. return err
  61. }
  62. //_, err = a.redisClient.Do("EXPIRE", info.Key, -1)
  63. //if err != nil {
  64. // return err
  65. //}
  66. return nil
  67. }
  68. func (a *Manager) GetScene(key string) (string, error) {
  69. // get status from redis
  70. result, err := a.redisClient.DoVar("GET", key)
  71. if err != nil {
  72. return "", err
  73. }
  74. return result.String(), nil
  75. }
  76. func (a *Manager) DeleteScene(key string) error {
  77. // get status from redis
  78. _, err := a.redisClient.Do("DEL", key)
  79. if err != nil {
  80. return err
  81. }
  82. return nil
  83. }
  84. // GetAllScenesPage 查询定时场景
  85. func (a *Manager) GetAllScenesPage(code string, pi, ps int) (AllSceneResult, error) {
  86. var key string
  87. switch code {
  88. case "timer":
  89. key = timerScenePrefix
  90. case "device":
  91. key = deviceScenePrefix
  92. case "weather":
  93. key = weatherScenePrefix
  94. default:
  95. key = scenePrefix
  96. }
  97. var result AllSceneResult
  98. // 使用KEYS命令获取所有匹配前缀的键s
  99. keys, err := a.redisClient.DoVar("KEYS", key)
  100. if err != nil {
  101. return result, err
  102. }
  103. // 检查是否有数据
  104. if keys.IsEmpty() {
  105. return result, nil
  106. }
  107. var start, end int
  108. // 转换为字符串切片
  109. keyList := keys.Strings()
  110. result.Total = len(keyList)
  111. if len(keyList) > 0 {
  112. start = (pi - 1) * ps
  113. end = pi*ps - 1
  114. if end > len(keyList)-1 {
  115. end = len(keyList) - 1
  116. }
  117. }
  118. // 存储所有结果
  119. for i := start; i <= end; i++ {
  120. scene := new(InfoScene)
  121. r, err := a.redisClient.DoVar("GET", keyList[i])
  122. if err != nil {
  123. return result, err
  124. }
  125. err = r.Struct(&scene)
  126. if err != nil {
  127. return result, err
  128. }
  129. result.Data = append(result.Data, scene)
  130. }
  131. return result, nil
  132. }
  133. // GetAllScenes 查询定时场景
  134. func (a *Manager) GetAllScenes(code string) ([]*InfoScene, error) {
  135. var key string
  136. switch code {
  137. case "time":
  138. key = timerScenePrefix
  139. case "device":
  140. key = deviceScenePrefix
  141. case "weather":
  142. key = weatherScenePrefix
  143. default:
  144. key = scenePrefix
  145. }
  146. // 使用KEYS命令获取所有匹配前缀的键s
  147. keys, err := a.redisClient.DoVar("KEYS", key)
  148. if err != nil {
  149. return nil, err
  150. }
  151. // 检查是否有数据
  152. if keys.IsEmpty() {
  153. return nil, nil
  154. }
  155. // 转换为字符串切片
  156. keyList := keys.Strings()
  157. // 存储所有结果
  158. scenes := make([]*InfoScene, 0)
  159. var scene InfoScene
  160. for _, v := range keyList {
  161. r, err := a.redisClient.DoVar("GET", v)
  162. if err != nil {
  163. return nil, err
  164. }
  165. err = r.Struct(&scene)
  166. if err != nil {
  167. return nil, err
  168. }
  169. scenes = append(scenes, &scene)
  170. }
  171. return scenes, nil
  172. }