scene.go 5.4 KB

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