scene.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package scene
  2. import (
  3. "context"
  4. "github.com/gogf/gf/database/gredis"
  5. )
  6. const (
  7. timerScenePrefix = "scene:timer:*"
  8. deviceScenePrefix = "scene:device_status:*"
  9. weatherScenePrefix = "scene:weather:*"
  10. scenePrefix = "scene:*"
  11. dataExpires = 7200
  12. )
  13. type GetSceneParams struct {
  14. Type string `json:"type"`
  15. Name string `json:"name"`
  16. DeviceCode string `json:"device_code"`
  17. }
  18. type InfoScene struct {
  19. SceneId string `json:"scene_id"`
  20. Conditions []*Conditions `json:"conditions"`
  21. Actions []*Action `json:"actions"`
  22. }
  23. type Conditions struct {
  24. TaskId string `json:"task_id"`
  25. Times int `json:"times"` // 执行次数 -1 表示无限次
  26. Cron string `json:"cron"`
  27. Key string `json:"key"` // redis key
  28. DeviceType string `json:"device_type"` // 设备类型
  29. DeviceId string `json:"device_id"` // 设备id
  30. SubDeviceId string `json:"sub_device_id"` // 子设备id
  31. FieldType int `json:"field_type"` // 字段类型 1字符串 2数值
  32. Field string `json:"field"` // 字段名
  33. TargetValue string `json:"target_value"` // 值
  34. Operator int `json:"operator"` // 比较类型 数值比较 1 > 2 >= 3 = 4 <= 5 < 6 !=
  35. Location string `json:"location"` // 地点
  36. }
  37. type Action struct {
  38. DeviceID string `json:"device_id"` // 设备ID
  39. SubDeviceId string `json:"sub_device_id"` // 实体子设备Id,如果需要
  40. ActionExecutor string `json:"action_executor"` // 动作对象类型
  41. ExecutorProperty *TaskExecutorProperty `json:"executor_property"` // 动作执行明细
  42. PlcPubMessage *PlcPubMessage `json:"plc_pub_message"` // PLC消息
  43. }
  44. // TaskExecutorProperty 定时任务执行动作执行参数
  45. type TaskExecutorProperty struct {
  46. FunctionCode string `json:"function_code"`
  47. FunctionValue map[string]interface{} `json:"function_value"`
  48. DelaySeconds int64 `json:"delay_seconds"`
  49. }
  50. type PlcPubMessage struct {
  51. Topic string `json:"topic"`
  52. Payload []byte `json:"payload"`
  53. }
  54. type AllSceneResult struct {
  55. Total int `json:"total"`
  56. Data []*InfoScene `json:"data"`
  57. }
  58. type Info struct {
  59. Key string `json:"key"`
  60. SceneId string `json:"scene_id"`
  61. TaskId string `json:"task_id"`
  62. Config string `json:"config"`
  63. }
  64. type Manager struct {
  65. redisClient *gredis.Redis
  66. ctx context.Context
  67. }
  68. func NewSceneManager(host string, port int) *Manager {
  69. red := gredis.New(&gredis.Config{
  70. Host: host,
  71. Port: port,
  72. Db: 2,
  73. MaxActive: 100,
  74. })
  75. ctx := context.Background()
  76. helper := &Manager{
  77. redisClient: red,
  78. ctx: ctx,
  79. }
  80. return helper
  81. }
  82. func (a *Manager) SaveScene(info *Info) error {
  83. _, err := a.redisClient.DoVar("SET", info.Key, info.Config)
  84. if err != nil {
  85. return err
  86. }
  87. _, err = a.redisClient.Do("EXPIRE", info.Key, -1)
  88. if err != nil {
  89. return err
  90. }
  91. return nil
  92. }
  93. func (a *Manager) GetScene(key string) (string, error) {
  94. // get status from redis
  95. result, err := a.redisClient.DoVar("GET", key)
  96. if err != nil {
  97. return "", err
  98. }
  99. return result.String(), nil
  100. }
  101. func (a *Manager) DeleteScene(key string) error {
  102. // get status from redis
  103. _, err := a.redisClient.Do("DEL", key)
  104. if err != nil {
  105. return err
  106. }
  107. return nil
  108. }
  109. // GetAllScenesPage 查询定时场景
  110. func (a *Manager) GetAllScenesPage(code string, pi, ps int) (AllSceneResult, error) {
  111. var key string
  112. switch code {
  113. case "time":
  114. key = timerScenePrefix
  115. case "device":
  116. key = deviceScenePrefix
  117. case "weather":
  118. key = weatherScenePrefix
  119. default:
  120. key = scenePrefix
  121. }
  122. var result AllSceneResult
  123. // 使用KEYS命令获取所有匹配前缀的键s
  124. keys, err := a.redisClient.DoVar("KEYS", key)
  125. if err != nil {
  126. return result, err
  127. }
  128. // 检查是否有数据
  129. if keys.IsEmpty() {
  130. return result, nil
  131. }
  132. var start, end int
  133. // 转换为字符串切片
  134. keyList := keys.Strings()
  135. result.Total = len(keyList)
  136. if len(keyList) > 0 {
  137. start = (pi - 1) * ps
  138. end = pi*ps - 1
  139. if end > len(keyList)-1 {
  140. end = len(keyList) - 1
  141. }
  142. }
  143. // 存储所有结果
  144. scenes := make([]*InfoScene, 0)
  145. var scene InfoScene
  146. for i := start; i <= end; i++ {
  147. r, err := a.redisClient.DoVar("GET", keyList[i])
  148. if err != nil {
  149. return result, err
  150. }
  151. err = r.Struct(&scene)
  152. if err != nil {
  153. return result, err
  154. }
  155. scenes = append(scenes, &scene)
  156. }
  157. return result, nil
  158. }
  159. // GetAllScenes 查询定时场景
  160. func (a *Manager) GetAllScenes(code string) ([]*InfoScene, error) {
  161. var key string
  162. switch code {
  163. case "time":
  164. key = timerScenePrefix
  165. case "device":
  166. key = deviceScenePrefix
  167. case "weather":
  168. key = weatherScenePrefix
  169. default:
  170. key = scenePrefix
  171. }
  172. // 使用KEYS命令获取所有匹配前缀的键s
  173. keys, err := a.redisClient.DoVar("KEYS", key)
  174. if err != nil {
  175. return nil, err
  176. }
  177. // 检查是否有数据
  178. if keys.IsEmpty() {
  179. return nil, nil
  180. }
  181. // 转换为字符串切片
  182. keyList := keys.Strings()
  183. // 存储所有结果
  184. scenes := make([]*InfoScene, 0)
  185. var scene InfoScene
  186. for _, v := range keyList {
  187. r, err := a.redisClient.DoVar("GET", v)
  188. if err != nil {
  189. return nil, err
  190. }
  191. err = r.Struct(&scene)
  192. if err != nil {
  193. return nil, err
  194. }
  195. scenes = append(scenes, &scene)
  196. }
  197. return scenes, nil
  198. }