ifttt.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // support ifttt action between two devices.
  2. package rule
  3. import (
  4. "sparrow/pkg/models"
  5. "sparrow/pkg/productconfig"
  6. "sparrow/pkg/rpcs"
  7. "sparrow/pkg/server"
  8. )
  9. type Ifttt struct{}
  10. func NewIfttt() *Ifttt {
  11. return &Ifttt{}
  12. }
  13. func (ift *Ifttt) Check(deviceid string, eventid uint16) error {
  14. actions := &[]models.Rule{}
  15. query := &models.Rule{
  16. RuleType: "ifttt",
  17. DeviceID: deviceid,
  18. }
  19. err := server.RPCCallByName(nil, rpcs.RegistryServerName, "Registry.QueryRules", query, actions)
  20. if err != nil {
  21. server.Log.Warnf("load ifttt rules error : %v", err)
  22. return err
  23. }
  24. if len(*actions) > 0 {
  25. device := &models.Device{}
  26. err := server.RPCCallByName(nil, rpcs.RegistryServerName, "Registry.FindDeviceById", deviceid, device)
  27. if err != nil {
  28. server.Log.Errorf("find device error : %v", err)
  29. return err
  30. }
  31. product := &models.Product{}
  32. err = server.RPCCallByName(nil, rpcs.RegistryServerName, "Registry.FindProduct", device.ProductID, product)
  33. if err != nil {
  34. server.Log.Errorf("find product error : %v", err)
  35. return err
  36. }
  37. c, err := productconfig.New(product.ProductConfig)
  38. if err != nil {
  39. server.Log.Errorf("product config error : %v", err)
  40. return err
  41. }
  42. name := ""
  43. for _, ev := range c.Events {
  44. if ev.No == int(eventid) {
  45. name = ev.Name
  46. }
  47. }
  48. for _, action := range *actions {
  49. if action.Trigger == name {
  50. err := performRuleAction(action.Target, action.Action)
  51. if err != nil {
  52. server.Log.Warnf("ifttt action failed: %v", err)
  53. }
  54. }
  55. }
  56. }
  57. return nil
  58. }