cbd_msg.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # coding=utf-8
  2. import os
  3. import sys
  4. import time
  5. import logging
  6. import django
  7. import schedule
  8. from datetime import datetime, timedelta
  9. local_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  10. if local_path not in sys.path:
  11. sys.path.append(local_path)
  12. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kedong.settings")
  13. django.setup()
  14. from smartfarming.api.views.forecast.all_dict import insect_dict
  15. from smartfarming.models.pest_count import MongoCBDPestWarning
  16. from smartfarming.models.worm_forecast import MongoCBDphoto
  17. from smartfarming.models.sim_card import MongoMsg_Conf
  18. from django.conf import settings
  19. logger = logging.getLogger("other")
  20. def product_cbd_alarm():
  21. # 获取所有的预警配置
  22. msg_conf = MongoMsg_Conf.objects.all()
  23. for msg in msg_conf:
  24. # 获取device_id conf
  25. device_id = msg.device_id
  26. conf = eval(msg.conf)
  27. # 获取该device_id 下前一天的害虫情况
  28. now = datetime.now()
  29. now_stamp = int(time.time())
  30. previous_day = now - timedelta(days=1)
  31. start_time = datetime(
  32. previous_day.year, previous_day.month, previous_day.day, 0, 0, 0).timestamp()
  33. end_time = datetime(now.year, now.month, now.day,
  34. 23, 59, 59).timestamp()
  35. photo_data = MongoCBDphoto.objects.filter(
  36. addtime__range=[start_time, end_time]).values_list("indentify_result", flat=True)
  37. # 把当天的害虫统计出来
  38. indentify_result = {}
  39. for p in photo_data:
  40. tmp = p.split("#")
  41. for tp in tmp:
  42. k = tp.split(",")
  43. if k[0] in indentify_result.keys():
  44. indentify_result[k[0]] += int(k[1])
  45. else:
  46. indentify_result[k[0]] = int(k[1])
  47. # 定义预警变量
  48. warning_result = ""
  49. # 指定害虫数量预警
  50. appointPest = conf.get("appointPest")
  51. if appointPest == "on":
  52. appointPestName = conf.get("appointPestName")
  53. appointPestNum = conf.get("appointPestNum")
  54. pest_cg = appointPestName.split("#")
  55. pest_nu = appointPestNum.split("#")
  56. for i in pest_cg:
  57. if i in indentify_result.keys():
  58. if indentify_result[i] > int(pest_nu[pest_cg.index(i)]):
  59. zh = insect_dict.get(i, "未知")
  60. warning_result += f"害虫{zh}数量{str(indentify_result[i])},"
  61. # 写入数据库
  62. if warning_result:
  63. alarm_obj = MongoCBDPestWarning.objects.create(
  64. device_id=device_id,
  65. warning_content=f"{warning_result}请注意防范",
  66. warning_types="2",
  67. upltime=now_stamp
  68. )
  69. logger.warning(f"指定害虫数量预警: {alarm_obj.id}")
  70. # 害虫种类
  71. pestCategory = conf.get("pestCategory")
  72. if pestCategory == "on":
  73. pestCategoryNum = conf.get("pestCategoryNum")
  74. pest_cg_count = len(indentify_result.keys())
  75. if pest_cg_count > int(pestCategoryNum):
  76. # 写入数据库
  77. alarm_obj = MongoCBDPestWarning.objects.create(
  78. device_id=device_id,
  79. warning_content=f"害虫种类{pest_cg_count},请注意防范",
  80. warning_types="1",
  81. upltime=now_stamp
  82. )
  83. logger.warning(f"害虫种类: {alarm_obj.id}")
  84. # 害虫总数
  85. pestTotal = conf.get("pestTotal")
  86. if pestTotal == "on":
  87. pestTotalNum = conf.get("pestTotalNum")
  88. ct = 0
  89. for m, n in indentify_result.items():
  90. ct += int(n)
  91. if ct > int(pestTotalNum):
  92. # 写入数据库
  93. alarm_obj = MongoCBDPestWarning.objects.create(
  94. device_id=device_id,
  95. warning_content=f"害虫总数{str(ct)},请注意防范",
  96. warning_types="3",
  97. upltime=now_stamp
  98. )
  99. logger.warning(f"害虫总数: {alarm_obj.id}")
  100. # 综合预警
  101. total_warning = ""
  102. pestWarn = conf.get("pestWarn")
  103. if pestWarn == "on":
  104. for m, n in indentify_result.items():
  105. total_warning += f"害虫{insect_dict.get(m)},数量{str(n)};"
  106. # 写入数据库
  107. if total_warning:
  108. alarm_obj = MongoCBDPestWarning.objects.create(
  109. device_id=device_id,
  110. warning_content=f"{total_warning}请注意防范!",
  111. warning_types="4",
  112. upltime=now_stamp
  113. )
  114. logger.warning(f"综合预警: {alarm_obj.id}")
  115. # 每天的8点执行任务
  116. schedule.every().day.at("05:00").do(product_cbd_alarm)
  117. while True:
  118. schedule.run_pending()
  119. time.sleep(1)