scene.go 4.0 KB

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