Source code for noctua.devices.domotics

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# System modules
from urllib.parse import urlencode

# Third-party modules
import requests

# Other templates
from ..utils import check
from ..utils.logger import log


[docs] class Sonoff: def __init__(self, url, id): self.url = url self.addr = self.url + "/json.htm" self.timeout = 3 self.error = None self.id = id requests.packages.urllib3.disable_warnings() # For verify=False @check.request_errors def get(self, param=None, id=None): return base_params = {"type": "devices"} if id: base_params.update({"rid": id}) res = requests.get(self.addr, params=base_params, timeout=self.timeout, verify=False) res.raise_for_status() resj = res.json() if resj["status"] != "OK": log.error(f'DOMOTICS: {resj["status"]}') if "message" in resj: log.error(resj["message"]) else: try: if not param: return resj else: if param == "ServerTime": value = resj["ServerTime"] else: value = resj["result"][0][param] return value except AttributeError as e: return res except KeyError as e: return res @check.request_errors def put(self, params={}, id=None): return base_params = {"type": "command", "idx": id} params.update(base_params) res = requests.get(self.addr, params=params, timeout=self.timeout, verify=False) res.raise_for_status() resj = res.json() if resj["status"] != "OK": log.error(f'DOMOTICS: {resj["status"]}') if "message" in resj: log.error(resj["message"]) @property def clock(self): local = self.get("ServerTime") # Local time return local @property def last_update(self): res = self.get("LastUpdate", id=self.id) return res @property def name(self): res = self.get("Name", id=self.id) @property def all(self): res = self.get() return res
[docs] class Switch(Sonoff): def __init__(self, url, id): super().__init__(url, id)
[docs] def reboot(self): while self.state: self.state = False while not self.state: self.state = True return self.state
@property def state(self): res = self.get("Status", id=self.id) self._state = True if res == 'On' else False return self._state @state.setter def state(self, s): switchcmd = 'On' if s else 'Off' params = {"param": "switchlight", "switchcmd": switchcmd} res = self.put(params, id=self.id) self._state = self.state
[docs] class Sensor(Sonoff): def __init__(self, url, temp_id, hum_id): super().__init__(url, temp_id) self.id = temp_id # recycle for last_update self.hum_id = hum_id @property def temperature(self): res = self.get("Temp", id=self.id) return res @property def humidity(self): res = self.get("Humidity", id=self.hum_id) return res