cbd_msg.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # coding=utf-8
  2. from smartfarming.api.views.forecast.all_dict import insect_dict
  3. from smartfarming.models.pest_count import MongoCBDPestWarning
  4. from smartfarming.models.worm_forecast import MongoCBDphoto
  5. from smartfarming.models.sim_card import MongoMsg_Conf
  6. from django.conf import settings
  7. import os
  8. import sys
  9. import time
  10. import logging
  11. import django
  12. import schedule
  13. from datetime import datetime, timedelta
  14. local_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  15. if local_path not in sys.path:
  16. sys.path.append(local_path)
  17. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kedong.settings")
  18. django.setup()
  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)