#!/usr/bin/env python3 # © Copyright 2021-2022, Scott Gasch """Most basic definition of a smart device: it must have a name and a MAC address and may have some optional keywords. All devices have these whether they are lights, outlets, thermostats, etc... """ import re from typing import List, Optional import arper class Device(object): """Most basic definition of a smart device: it must have a name and a MAC address and may have some optional keywords. All devices have these whether they are lights, outlets, thermostats, etc...""" def __init__( self, name: str, mac: str, keywords: Optional[str] = "", ): self.name = name self.mac = mac self.keywords = keywords self.arper = arper.Arper() if keywords is not None: self.kws: List[str] = keywords.split(' ') else: self.kws = [] def get_name(self) -> str: return self.name def get_mac(self) -> str: return self.mac def get_ip(self) -> Optional[str]: return self.arper.get_ip_by_mac(self.mac) def has_static_ip(self) -> bool: for kw in self.kws: m = re.search(r'static:([\d\.]+)', kw) if m is not None: ip = m.group(1) assert self.get_ip() == ip return True return False # Add command -> URL logic here. def get_keywords(self) -> Optional[List[str]]: return self.kws def has_keyword(self, keyword: str) -> bool: for kw in self.kws: if kw == keyword: return True return False def get_on_limit_seconds(self) -> Optional[int]: for kw in self.kws: m = re.search(r"timeout:(\d+)", kw) if m is not None: return int(m.group(1)) * 60 return None