Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

97 řádky
2.9KB

  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. def _pre_put_callback(self, m):
  22. try:
  23. m.instance.stop()
  24. except:
  25. pass
  26. def _post_put_callback(self, m):
  27. m.state = False
  28. @route('/<int:id>/targettemp/<temp>', methods=['POST'])
  29. def postTargetTemp(self, id, temp):
  30. id = int(id)
  31. temp = float(temp)
  32. cbpi.cache.get("kettle")[id].target_temp = float(temp)
  33. self.model.update(**self.api.cache.get(self.cache_key)[id].__dict__)
  34. cbpi.emit("UPDATE_KETTLE_TARGET_TEMP", {"id": id, "target_temp": temp})
  35. return ('', 204)
  36. @route('/<int:id>/automatic', methods=['POST'])
  37. def toggle(self, id):
  38. kettle = cbpi.cache.get("kettle")[id]
  39. if kettle.state is False:
  40. # Start controller
  41. if kettle.logic is not None:
  42. cfg = kettle.config.copy()
  43. cfg.update(dict(api=cbpi, kettle_id=kettle.id, heater=kettle.heater, sensor=kettle.sensor))
  44. instance = cbpi.get_controller(kettle.logic).get("class")(**cfg)
  45. instance.init()
  46. kettle.instance = instance
  47. def run(instance):
  48. instance.run()
  49. t = self.api.socketio.start_background_task(target=run, instance=instance)
  50. kettle.state = not kettle.state
  51. cbpi.emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id))
  52. else:
  53. # Stop controller
  54. kettle.instance.stop()
  55. kettle.state = not kettle.state
  56. cbpi.emit("UPDATE_KETTLE", cbpi.cache.get("kettle").get(id))
  57. return ('', 204)
  58. @cbpi.event("SET_TARGET_TEMP")
  59. def set_target_temp(id, temp):
  60. '''
  61. Change Taget Temp Event
  62. :param id: kettle id
  63. :param temp: target temp to set
  64. :return: None
  65. '''
  66. Kettle2View().postTargetTemp(id,temp)
  67. @cbpi.backgroundtask(key="read_target_temps", interval=5)
  68. def read_target_temps(api):
  69. """
  70. background process that reads all passive sensors in interval of 1 second
  71. :return: None
  72. """
  73. result = {}
  74. for key, value in cbpi.cache.get("kettle").iteritems():
  75. cbpi.save_to_file(key, value.target_temp, prefix="kettle")
  76. @cbpi.initalizer()
  77. def init(cbpi):
  78. Kettle2View.api = cbpi
  79. Kettle2View.register(cbpi.app,route_base='/api/kettle')
  80. Kettle2View.init_cache()