operate.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package modbus
  2. import (
  3. "encoding/hex"
  4. "encoding/json"
  5. "os"
  6. "server/dao"
  7. "server/logger"
  8. "server/model"
  9. "server/utils"
  10. "time"
  11. )
  12. // GetSunPowerInfo 获取太阳能信息
  13. func GetSunPowerInfo() error {
  14. for id, conn := range model.ConnectionMap {
  15. _, dev, err := utils.GetDataByDeviceId(id)
  16. if dev.IsSun && dev.State == 1 { //打开 并且在线
  17. err = utils.WriteDevice(SolarEnergyData(), conn)
  18. if err != nil {
  19. return err
  20. }
  21. }
  22. }
  23. return nil
  24. }
  25. // GetDeviceInfo 获取设备信息
  26. func GetDeviceInfo() {
  27. for id, conn := range model.ConnectionMap {
  28. _, dev, _ := utils.GetDataByDeviceId(id)
  29. utils.WriteDevice(ReadDeviceInfo(dev.LoopNumber), conn)
  30. }
  31. }
  32. // CommandPub 命令发布
  33. func CommandPub(id, hexStr string) {
  34. bytes, err := hex.DecodeString(hexStr)
  35. if err != nil {
  36. logger.Get().Errorln("Error decoding hex string:", err)
  37. return
  38. }
  39. err = utils.WriteDevice(bytes, model.ConnectionMap[id])
  40. if err != nil {
  41. return
  42. }
  43. }
  44. // DealWithOffline 处理离线
  45. func DealWithOffline() {
  46. regions, err := utils.LoadData()
  47. if err != nil {
  48. logger.Get().Errorln("离线" + err.Error())
  49. return
  50. }
  51. datafb, err := os.ReadFile("static/data-fb.json")
  52. var regionsfb []dao.Region
  53. if err := json.Unmarshal(datafb, &regionsfb); err != nil {
  54. // 提供更多的上下文信息来帮助调试
  55. logger.Get().Errorf("解析 JSON 失败: %v, 原始数据: %s", err, regions)
  56. }
  57. // 检查文件是否为空
  58. if len(regions) == 0 {
  59. regions = regionsfb // 如果文件为空,返回空数组
  60. }
  61. // 确保 regions 不为 nil
  62. if regions == nil {
  63. regions = regionsfb
  64. }
  65. now := time.Now()
  66. for i, region := range regions {
  67. // 确保 region.Devices 不为 nil
  68. if region.Devices == nil {
  69. continue
  70. }
  71. for i2, device := range region.Devices {
  72. if now.After(device.OnlineTime.Add(13*time.Minute)) && device.State != 0 {
  73. regions[i].Devices[i2].State = 0
  74. }
  75. }
  76. }
  77. if len(regions) == 0 {
  78. return
  79. }
  80. err = utils.SaveData("static/data.json", regions)
  81. if err != nil {
  82. logger.Get().Errorf("离线保存失败: %v", err)
  83. }
  84. }