Skip to content

Commit

Permalink
- web server: device on/off timer param setting
Browse files Browse the repository at this point in the history
- set target temperature: apply only 'ON' state
  • Loading branch information
YOGYUI committed Dec 20, 2022
1 parent b9fa94e commit 0c033df
Show file tree
Hide file tree
Showing 11 changed files with 365 additions and 46 deletions.
3 changes: 2 additions & 1 deletion Hillstate-Gwanggyosan/Include/Define/Device.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ def setTimerOnOffParams(self, on_time: float, off_time: float, repeat: bool):
self.timer_onoff_params['on_time'] = on_time
self.timer_onoff_params['off_time'] = off_time
self.timer_onoff_params['repeat'] = repeat
writeLog(f'{self} Set On/Off Timer Params: {self.timer_onoff_params}')
if self.thread_timer_onoff is not None:
self.thread_timer_onoff.setParams(on_time, off_time, repeat)

Expand All @@ -150,7 +151,7 @@ def run(self):
writeLog(f'{self.name} Started', self)
step = 0
tm: float = 0.
wait_for_transition: bool = False
wait_for_transition: bool
while self._keepAlive:
if step == 0:
wait_for_transition = True
Expand Down
28 changes: 15 additions & 13 deletions Hillstate-Gwanggyosan/Include/Home.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
import time
import json
import queue
Expand Down Expand Up @@ -129,7 +130,6 @@ def initialize(self, init_service: bool, connect_rs485: bool):
self.device_list.append(self.elevator)
# self.device_list.append(self.doorlock)
self.device_list.append(self.subphone)
self.device_list.append(self.airquality)

self.loadConfig(xml_path)

Expand Down Expand Up @@ -390,11 +390,14 @@ def loadConfig(self, filepath: str):

node = root.find('airquality')
try:
mqtt_node = node.find('mqtt')
self.airquality.mqtt_publish_topic = mqtt_node.find('publish').text
apikey = node.find('apikey').text
obsname = node.find('obsname').text
self.airquality.setApiParams(apikey, obsname)
enable = bool(int(node.find('enable').text))
if enable:
self.device_list.append(self.airquality)
mqtt_node = node.find('mqtt')
self.airquality.mqtt_publish_topic = mqtt_node.find('publish').text
apikey = node.find('apikey').text
obsname = node.find('obsname').text
self.airquality.setApiParams(apikey, obsname)
except Exception as e:
writeLog(f"Failed to load airquality sensor config ({e})", self)

Expand Down Expand Up @@ -724,15 +727,14 @@ def onMqttClientUnsubscribe(self, _, userdata, mid):
if self.enable_mqtt_console_log:
writeLog('Mqtt Client Unsubscribe: {}, {}'.format(userdata, mid), self)

def onMqttCommandSystem(self, topic: str, message: dict):
def onMqttCommandSystem(self, _: str, message: dict):
if 'query_all' in message.keys():
writeLog('Got query all command', self)
self.publish_all()
if 'restart' in message.keys():
writeLog('Got restart command', self)
self.restart()
if 'reboot' in message.keys():
import os
os.system('sudo reboot')
if 'publish_interval' in message.keys():
try:
Expand Down Expand Up @@ -777,7 +779,7 @@ def onMqttCommandOutlet(self, topic: str, message: dict):
target=message['state']
)

def onMqttCommandGasvalve(self, topic: str, message: dict):
def onMqttCommandGasvalve(self, _: str, message: dict):
if 'state' in message.keys():
self.command(
device=self.gasvalve,
Expand Down Expand Up @@ -808,7 +810,7 @@ def onMqttCommandThermostat(self, topic: str, message: dict):
else:
room.thermostat.stopTimerOnOff()

def onMqttCommandVentilator(self, topic: str, message: dict):
def onMqttCommandVentilator(self, _: str, message: dict):
if 'state' in message.keys():
self.command(
device=self.ventilator,
Expand Down Expand Up @@ -862,7 +864,7 @@ def onMqttCommandAirconditioner(self, topic: str, message: dict):
else:
room.airconditioner.stopTimerOnOff()

def onMqttCommandElevator(self, topic: str, message: dict):
def onMqttCommandElevator(self, _: str, message: dict):
if 'state' in message.keys():
self.command(
device=self.elevator,
Expand All @@ -886,14 +888,14 @@ def onMqttCommandSubPhone(self, topic: str, message: dict):
target=message['state']
)

def onMqttCommandThinq(self, topic: str, message: dict):
def onMqttCommandThinq(self, _: str, message: dict):
if self.thinq is None:
return
if 'restart' in message.keys():
self.thinq.restart()
return
if 'log_mqtt_message' in message.keys():
self.thinq.setEnableLogMqttMessage(int(message.get('log_mqtt_message')))
self.thinq.setEnableLogMqttMessage(bool(int(message.get('log_mqtt_message'))))

def onSubphoneStateStreaming(self, state: int):
# 카메라 응답없음이 해제가 안되므로, 초기화 시에 시작하도록 한다
Expand Down
16 changes: 9 additions & 7 deletions Hillstate-Gwanggyosan/Include/RS485/ParserVarious.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class ParserVarious(PacketParser):
enable_store_packet_header_48: bool = False
enable_store_packet_unknown: bool = True

enable_trace_timestamp_packet: bool = False

def interpretPacket(self, packet: bytearray):
try:
store: bool = True
Expand Down Expand Up @@ -48,13 +50,13 @@ def interpretPacket(self, packet: bytearray):
elif packet[3] == 0x44: # maybe current date-time?
if packet[4] == 0x0C: # broadcasting?
packet_info['device'] = 'timestamp'
year, month, day = packet[8], packet[9], packet[10]
hour, minute, second = packet[11], packet[12], packet[13]
millis = packet[14] * 100 + packet[15] * 10 + packet[16]
dt = datetime.datetime(year, month, day, hour, minute, second, millis * 1000)
writeLog(f'Timestamp Packet: {self.prettifyPacket(packet)}', self)
# writeLog('>> {:02d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}'.format(year, month, day, hour, minute, second), self)
writeLog(f'>> {dt.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}', self)
if self.enable_trace_timestamp_packet:
year, month, day = packet[8], packet[9], packet[10]
hour, minute, second = packet[11], packet[12], packet[13]
millis = packet[14] * 100 + packet[15] * 10 + packet[16]
dt = datetime.datetime(year, month, day, hour, minute, second, millis * 1000)
writeLog(f'Timestamp Packet: {self.prettifyPacket(packet)}', self)
writeLog(f'>> {dt.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}', self)
else:
packet_info['device'] = 'unknown'
writeLog(f'Unknown packet (44): {self.prettifyPacket(packet)}', self)
Expand Down
15 changes: 11 additions & 4 deletions Hillstate-Gwanggyosan/Include/Threads/ThreadCommandQueue.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def run(self):
elif target == 'HEAT':
self.set_state_common(dev, 1, parser)
elif category == 'temperature':
self.set_temperature(dev, target, parser)
self.set_target_temperature(dev, target, parser)
elif isinstance(dev, Ventilator):
if category == 'state':
self.set_state_common(dev, target, parser)
Expand All @@ -75,7 +75,7 @@ def run(self):
self.set_airconditioner_mode(dev, 1, parser) # 최초 가동 시 모드를 '냉방'으로 바꿔준다
# self.set_rotation_speed(dev, 1, parser) # 최초 가동 시 풍량을 '자동'으로 바꿔준다
elif category == 'temperature':
self.set_temperature(dev, target, parser)
self.set_target_temperature(dev, target, parser)
elif category == 'rotationspeed':
self.set_rotation_speed(dev, target, parser)
elif isinstance(dev, Elevator):
Expand Down Expand Up @@ -140,14 +140,21 @@ def set_state_common(self, dev: Device, target: int, parser: PacketParser):
time.sleep(self._delay_response)
dev.publish_mqtt()

def set_temperature(self, dev: Thermostat, target: float, parser: PacketParser):
def set_target_temperature(self, dev: Union[Thermostat, AirConditioner], target: float, parser: PacketParser):
# 힐스테이트는 온도값 범위가 정수형이므로 올림처리해준다
tm_start = time.perf_counter()
cnt = 0
target_temp = math.ceil(target)
packet_command = dev.makePacketSetTemperature(target_temp)
interval, retry_cnt = self.getSendParams(parser)
while cnt < retry_cnt:
if not dev.state:
"""
Issue: OFF 상태에서 희망온도 설정 패킷만 보냈을 때 디바이스가 ON되는 문제 방지
(애플 자동화 끄기 - OFF, 희망온도 두 개 명령이 각각 수신되는 경우, 희망온도 명령에 의해 켜지는 문제)
TODO: 옵션 플래그로 변경
"""
break
if dev.temp_config == target_temp:
break
if parser.isRS485LineBusy():
Expand All @@ -158,7 +165,7 @@ def set_temperature(self, dev: Thermostat, target: float, parser: PacketParser):
time.sleep(interval) # wait for parsing response
if cnt > 0:
tm_elapsed = time.perf_counter() - tm_start
writeLog('set_temperature::send # = {}, elapsed = {:g} msec'.format(cnt, tm_elapsed * 1000), self)
writeLog('set_target_temperature::send # = {}, elapsed = {:g} msec'.format(cnt, tm_elapsed * 1000), self)
time.sleep(self._delay_response)
dev.publish_mqtt()

Expand Down
17 changes: 9 additions & 8 deletions Hillstate-Gwanggyosan/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ Integrate Hillstate Gwanggyosan Home Network to Apple HomeKit and Google Assista

Reference URLs
-------------
Illumination: [힐스테이트 광교산::조명 제어 RS-485 패킷 분석](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%A1%B0%EB%AA%85-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
Outlet: [힐스테이트 광교산::아울렛(콘센트) - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%BD%98%EC%84%BC%ED%8A%B8-%EC%A0%9C%EC%96%B4-RS-485-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D?category=1047622) <br>
GasValve: [힐스테이트 광교산::도시가스차단기(밸브) - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EA%B0%80%EC%8A%A4%EC%B0%A8%EB%8B%A8%EA%B8%B0-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
Thermostat: [힐스테이트 광교산::난방 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EB%82%9C%EB%B0%A9-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
Ventilator: [힐스테이트 광교산::환기(전열교환기) 제어 RS-485 패킷 분석](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%ED%99%98%EA%B8%B0%EC%A0%84%EC%97%B4%EA%B5%90%ED%99%98%EA%B8%B0-%EC%A0%9C%EC%96%B4-RS-485-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D?category=1047622) <br>
Airconditioner: [힐스테이트 광교산::시스템에어컨 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%96%B4%EC%BB%A8-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
Elevator: [힐스테이트 광교산::엘리베이터 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%97%98%EB%A6%AC%EB%B2%A0%EC%9D%B4%ED%84%B0-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
Doorlock: [힐스테이트 광교산::현관 도어락 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EB%8F%84%EC%96%B4%EB%9D%BD-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Illumination: [힐스테이트 광교산::조명 제어 RS-485 패킷 분석](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%A1%B0%EB%AA%85-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Outlet: [힐스테이트 광교산::아울렛(콘센트) - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%BD%98%EC%84%BC%ED%8A%B8-%EC%A0%9C%EC%96%B4-RS-485-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D?category=1047622) <br>
- GasValve: [힐스테이트 광교산::도시가스차단기(밸브) - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EA%B0%80%EC%8A%A4%EC%B0%A8%EB%8B%A8%EA%B8%B0-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Thermostat: [힐스테이트 광교산::난방 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EB%82%9C%EB%B0%A9-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Ventilator: [힐스테이트 광교산::환기(전열교환기) 제어 RS-485 패킷 분석](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%ED%99%98%EA%B8%B0%EC%A0%84%EC%97%B4%EA%B5%90%ED%99%98%EA%B8%B0-%EC%A0%9C%EC%96%B4-RS-485-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D?category=1047622) <br>
- Airconditioner: [힐스테이트 광교산::시스템에어컨 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90%EC%96%B4%EC%BB%A8-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Elevator: [힐스테이트 광교산::엘리베이터 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%97%98%EB%A6%AC%EB%B2%A0%EC%9D%B4%ED%84%B0-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Doorlock: [힐스테이트 광교산::현관 도어락 - 애플 홈킷 + 구글 어시스턴트 연동](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EB%8F%84%EC%96%B4%EB%9D%BD-%EC%95%A0%ED%94%8C-%ED%99%88%ED%82%B7-%EA%B5%AC%EA%B8%80-%EC%96%B4%EC%8B%9C%EC%8A%A4%ED%84%B4%ED%8A%B8-%EC%97%B0%EB%8F%99?category=1047622) <br>
- Kitchen Subphone: [힐스테이트 광교산::주방 비디오폰 연동 - 세대 및 공동 현관문 제어 (애플 홈킷)](https://yogyui.tistory.com/entry/%ED%9E%90%EC%8A%A4%ED%85%8C%EC%9D%B4%ED%8A%B8-%EA%B4%91%EA%B5%90%EC%82%B0%EC%A3%BC%EB%B0%A9-%EC%84%9C%EB%B8%8C%ED%8F%B0-%EC%97%B0%EB%8F%99-%ED%98%84%EA%B4%80%EB%AC%B8-%EB%B9%84%EB%94%94%EC%98%A4) <br>
3 changes: 2 additions & 1 deletion Hillstate-Gwanggyosan/config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
</rs485>
<mqtt>
<host>mosquitto ip address</host>
<port>mosquitto port</port>
<port>1883</port>
<username>mosquitto auth id</username>
<password>mosquitto auth password</password>
<console_log>0</console_log>
Expand Down Expand Up @@ -399,6 +399,7 @@
</mqtt>
</thinq>
<airquality>
<enable>1</enable>
<apikey>Your API Key from data.go.kr</apikey>
<obsname>수지</obsname>
<mqtt>
Expand Down
2 changes: 2 additions & 0 deletions Hillstate-Gwanggyosan/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ PyQt5
pyserial
requests
beautifulsoup4
regex
pyOpenSSL
2 changes: 1 addition & 1 deletion Hillstate-Gwanggyosan/web/api/packet_logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def packet_logger():
enable_header_various_43=int(parser_various.enable_store_packet_header_43),
enable_header_various_44=int(parser_various.enable_store_packet_header_44),
enable_header_various_48=int(parser_various.enable_store_packet_header_48),
enable_subphone = int(parser_subphone.enable_store_packets)
enable_subphone=int(parser_subphone.enable_store_packets)
)


Expand Down
55 changes: 53 additions & 2 deletions Hillstate-Gwanggyosan/web/api/timer.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from . import api
from flask import render_template, jsonify, request
from wtforms import Form, IntegerField, SelectField, validators
from datetime import datetime
import os
import sys
import json
import http
CURPATH = os.path.dirname(os.path.abspath(__file__)) # {$PROJECT}/web/api/
PROJPATH = os.path.dirname(os.path.dirname(CURPATH)) # {$PROJECT}/
INCPATH = os.path.join(PROJPATH, 'Include') # {$PROJECT}/Include/
Expand All @@ -11,6 +14,13 @@
del CURPATH, PROJPATH, INCPATH
from Include import get_home


class TesfForm(Form):
ontime = IntegerField('on_time', [validators.Length(min=0)])
offtime = IntegerField('off_time', [validators.Length(min=0)])
repeat = SelectField('repeat')


def get_timer_info() -> list:
home = get_home()
info = []
Expand Down Expand Up @@ -38,12 +48,53 @@ def get_timer_info() -> list:
info.append(d)
return info


@api.route('/timer', methods=['GET', 'POST'])
def timer():
timer_info = get_timer_info()

return render_template('timer.html')
return render_template(
'timer.html',
room1=timer_info[0],
room2=timer_info[1],
room3=timer_info[2],
room4=timer_info[3]
)


@api.route('/timer/update', methods=['GET', 'POST'])
def timer_update():
timer_info = get_timer_info()
return render_template(
'timer.html',
room1=timer_info[0],
room2=timer_info[1],
room3=timer_info[2],
room4=timer_info[3]
)


@api.route('/timer/set/<room_idx>/<dev_type>', methods=['POST'])
def timer_activate(room_idx: str, dev_type: str):
home = get_home()
try:
data = json.loads(request.get_data())
room_idx = int(room_idx) - 1

if dev_type == 'cool':
dev = home.rooms[room_idx].airconditioner
elif dev_type == 'heat':
dev = home.rooms[room_idx].thermostat
else:
return '', http.HTTPStatus.NO_CONTENT

if 'activate' in data.keys():
value = int(data.get('activate'))
dev.startTimerOnOff() if value else dev.stopTimerOnOff()
elif 'on_time' in data.keys() and 'off_time' in data.keys() and 'repeat' in data.keys():
on_time = int(data.get('on_time'))
off_time = int(data.get('off_time'))
repeat = bool(int(data.get('repeat')))
dev.setTimerOnOffParams(on_time, off_time, repeat)
except Exception as e:
print(e)
return '', http.HTTPStatus.NO_CONTENT

0 comments on commit 0c033df

Please sign in to comment.