scene.go 5.2 KB

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