diff --git a/hmdooris/ccujack.py b/hmdooris/ccujack.py index a1be509..7b2f125 100644 --- a/hmdooris/ccujack.py +++ b/hmdooris/ccujack.py @@ -1,6 +1,5 @@ import json import logging -import ssl from typing import List, Dict import requests @@ -17,11 +16,22 @@ class CCUJackHmIPDLD: self.name = name self.id = id self.value_list = self.get_value_list(id) + self.ops = { + 'low_battery': True, + 'unreachable': True, + 'voltage': -99, + } def status(self): r = self.ccu.get_json(f"/device/{self.id}/1/LOCK_STATE/~pv") return self.value_list[r["v"]] + def get_ops(self): + self.ops['low_battery'] = self.ccu.get_value(f"/device/{self.id}/0/LOW_BAT/~pv") + self.ops['unreachable'] = self.ccu.get_value(f"/device/{self.id}/0/UNREACH/~pv") + self.ops['voltage'] = self.ccu.get_value(f"/device/{self.id}/0/OPERATING_VOLTAGE/~pv") + return self.ops + def get_value_list(self, id) -> List[str]: """ Uses the fist lock to obtain the valueList property that maps the enum values to strings @@ -47,7 +57,7 @@ class CCUJack: self.kvargs['verify'] = certpath if certpath is True: urllib3.disable_warnings() - self.locks : Dict[str, CCUJackHmIPDLD] = {} + self.locks: Dict[str, CCUJackHmIPDLD] = {} self.get_all_locks() def get_json(self, url: str): @@ -61,6 +71,9 @@ class CCUJack: pass return {} + def get_value(self, url: str): + return self.get_json(url)["v"] + def put_json(self, url: str, data: dict): url = self.url + url r = requests.put(url, json=data, **self.kvargs) @@ -86,11 +99,12 @@ class CCUJack: s[lock.id] = { "name": lock.name, "id": lock.id, - "status": lock.status() + "status": lock.status(), + 'ops': lock.get_ops(), } return s - def lock_unlock(self, lock_id, locked_state = None): + def lock_unlock(self, lock_id, locked_state=None): lock = self.locks.get(lock_id) s = lock.status() if locked_state is None: diff --git a/hmdooris/static/icons.svg b/hmdooris/static/icons.svg index 82f472d..c50c94c 100644 --- a/hmdooris/static/icons.svg +++ b/hmdooris/static/icons.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/hmdooris/static/main.css b/hmdooris/static/main.css index b7c98e1..f369439 100644 --- a/hmdooris/static/main.css +++ b/hmdooris/static/main.css @@ -6,6 +6,12 @@ body { font-family: Arial, Helvetica, sans-serif; } +@keyframes blink-animation { + to { + visibility: hidden; + } +} + #locks { width: 40em; } @@ -30,11 +36,16 @@ body { margin: 1em 0 0 0; } +.lock__line .lock__state-bat { + color: red; + animation: blink-animation 1s steps(5, start) infinite; +} + .lock__line button { min-width: 10em; margin: 0.1em 0.5em; padding: 0.1em 0.5em; - border-radius: 1em; + border-radius: 2em; background-color: white; color: black; } @@ -64,4 +75,18 @@ svg.icon { font-size: 0.7em; position: absolute; bottom: 0; +} + +.legend { + width: 40em; +} + +.legend__icons { + list-style-type: none; + padding: calc(32px + 0.3em); + text-indent: calc(-32px - 0.3em); +} + +.legend__icons .icon { + color: black; } \ No newline at end of file diff --git a/hmdooris/static/main.js b/hmdooris/static/main.js index fd21872..b6b014c 100644 --- a/hmdooris/static/main.js +++ b/hmdooris/static/main.js @@ -1,16 +1,17 @@ (function () { let update_button = function (lock) { - let state_icon = document.getElementById(`lock__state-icon__${lock.id}`); - let state_label = document.getElementById(`lock__state-label__${lock.id}`); - let button_lock = document.getElementById(`lock__lock__${lock.id}`); - let button_unlock = document.getElementById(`lock__unlock__${lock.id}`); + let state_icon = document.querySelector(`#lock__line__${lock.id} .lock__state-icon`); + let state_label = document.querySelector(`#lock__line__${lock.id} .lock__state-label`); + let state_bat = document.querySelector(`#lock__line__${lock.id} .lock__state-bat`); + let button_lock = document.querySelector(`#lock__line__${lock.id} .lock__button__lock`); + let button_unlock = document.querySelector(`#lock__line__${lock.id} .lock__button__unlock`); if (lock.status === "LOCKED") { - state_icon.innerHTML = ''; + state_icon.innerHTML = ''; state_label.innerText = 'locked'; button_lock.disabled = true; button_unlock.disabled = false; } else if (lock.status === "UNLOCKED") { - state_icon.innerHTML = ''; + state_icon.innerHTML = ''; state_label.innerText = 'unlocked'; button_lock.disabled = false; button_unlock.disabled = true; @@ -20,6 +21,13 @@ button_lock.disabled = true; button_unlock.disabled = true; } + state_bat.innerHTML = ''; + if (lock.ops.low_battery) { + state_bat.innerHTML = state_bat.innerHTML + ''; + } + if (lock.ops.low_battery) { + state_bat.innerHTML = state_bat.innerHTML + ''; + } } let lock_button_add_event_handler = function (e, id, locking) { @@ -68,20 +76,24 @@ let lock_line = document.createElement("div"); lock_line.id = `lock__line__${lock.id}`; lock_line.classList.add("lock__line"); - lock_line.innerHTML = `
Click the respective buttons to lock or unlock a door. If the status of a door is ”unknown”, you will need to - run the lock manually by pressing the lock or unlock button on the door lock.
+Click the respective buttons to lock or unlock a door.
+