25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.8KB

  1. from flask import request
  2. from flask_classy import FlaskView, route
  3. from modules import cbpi, socketio
  4. from modules.core.baseview import BaseView
  5. from modules.core.db import DBModel
  6. class Kettle(DBModel):
  7. __fields__ = ["name","sensor", "heater", "automatic", "logic", "config", "agitator", "target_temp"]
  8. __table_name__ = "kettle"
  9. __json_fields__ = ["config"]
  10. class Kettle2View(BaseView):
  11. model = Kettle
  12. cache_key = "kettle"
  13. @classmethod
  14. def pre_post_callback(self, data):
  15. data["target_temp"] = 0
  16. @classmethod
  17. def post_init_callback(cls, obj):
  18. obj.state = False
  19. def post_post_callback(self, m):
  20. m.state = False
  21. @route('/<int:id>/targettemp/<temp>', methods=['POST'])
  22. def postTargetTemp(self, id, temp):
  23. id = int(id)
  24. temp = float(temp)
  25. cbpi.cache.get("kettle")[id].target_temp = float(temp)
  26. self.model.update(**self.api.cache.get(self.cache_key)[id].__dict__)
  27. cbpi.emit("UPDATE_KETTLE_TARGET_TEMP", {"id": id, "target_temp": temp})
  28. return ('', 204)
  29. @route('/<int:id>/automatic', methods=['POST'])
  30. def toggle(self, id):
  31. kettle = cbpi.cache.get("kettle")[id]
  32. if kettle.state is False:
  33. # Start controller
  34. if kettle.logic is not None:
  35. cfg = kettle.config.copy()
  36. cfg.update(dict(api=cbpi, kettle_id=kettle.id, heater=kettle.heater, sensor=kettle.sensor))
  37. instance = cbpi.get_controller(kettle.logic).get("class")(**cfg)
  38. instance.init()
  39. kettle.controller_instance = instance
  40. def run(instance):
  41. instance.run()
  42. t = self.api.socketio.start_background_task(target=run, instance=instance)
  43. kettle.state = not kettle.state
  44. cbpi.emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id))
  45. else:
  46. # Stop controller
  47. kettle.controller_instance.stop()
  48. kettle.state = not kettle.state
  49. cbpi.emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id))
  50. return ('', 204)
  51. @cbpi.event("SET_TARGET_TEMP")
  52. def set_target_temp(id, temp):
  53. '''
  54. Change Taget Temp Event
  55. :param id: kettle id
  56. :param temp: target temp to set
  57. :return: None
  58. '''
  59. print "GOT EVENT %s %s" % (id, temp)
  60. Kettle2View().postTargetTemp(id,temp)
  61. @cbpi.backgroundtask(key="read_target_temps", interval=5)
  62. def read_target_temps():
  63. """
  64. background process that reads all passive sensors in interval of 1 second
  65. :return: None
  66. """
  67. result = {}
  68. for key, value in cbpi.cache.get("kettle").iteritems():
  69. cbpi.save_to_file(key, value.target_temp, prefix="kettle")
  70. @cbpi.initalizer()
  71. def init(cbpi):
  72. Kettle2View.api = cbpi
  73. Kettle2View.register(cbpi.app,route_base='/api/kettle')
  74. Kettle2View.init_cache()