first commit

This commit is contained in:
Devmel Apps
2021-05-17 14:23:10 +02:00
commit 14a283f6ee
12 changed files with 985 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
"""AirSend switches."""
import logging
from typing import Any
from requests import get
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType
from homeassistant.helpers.entity import async_generate_entity_id
from homeassistant.components.switch import (
SwitchEntity,
)
from . import (
DOMAIN,
)
_LOGGER = logging.getLogger(DOMAIN)
async def async_setup_platform(hass : HomeAssistant, config : ConfigType, async_add_entities, discovery_info=None):
if discovery_info is None:
return
for name, options in discovery_info.items():
if options['type'] == 4096 or options['type'] == 4097:
entity = AirSendSwitch(hass, name, options['id'], options['type'], options['apiKey'])
async_add_entities([entity])
return
class AirSendSwitch(SwitchEntity):
"""Representation of an AirSend Switch."""
def __init__(self, hass : HomeAssistant, name : str, id: str, type : int, apikey : str):
"""Initialize a switch or light device."""
self._name = name
self._id = id
self._type = type
self._apikey = apikey
uname = DOMAIN+name
self._unique_id = "_".join(x for x in uname)
self._state = False
@property
def unique_id(self):
"""Return unique identifier of remote device."""
return self._unique_id
@property
def available(self):
return True
@property
def should_poll(self):
"""No polling needed."""
return False
@property
def name(self):
"""Return the name of the device if any."""
return self._name
@property
def extra_state_attributes(self):
"""Return the device state attributes."""
return None
@property
def assumed_state(self):
"""Return true if unable to access real state of entity."""
return True
@property
def is_on(self):
return self._state
def turn_on(self, **kwargs: Any) -> None:
"""Turn the device on."""
command = "1" if self._type == 4097 else "6"
url = "https://airsend.cloud/device/"+str(self._id)+"/command/"+command+"/"
self._call_cloud(url, True)
def turn_off(self, **kwargs: Any) -> None:
"""Turn the device off."""
command = "0" if self._type == 4097 else "6"
url = "https://airsend.cloud/device/"+str(self._id)+"/command/"+command+"/"
self._call_cloud(url, False)
def _call_cloud(self, url : str, new_state : bool):
headers = {"Authorization": "Bearer "+self._apikey, "content-type": "application/json", "User-Agent": "hass_airsend"}
status_code = 404
try:
response = get(url, headers=headers)
status_code = response.status_code
except:
pass
if status_code == 200:
self._state = new_state
self.schedule_update_ha_state()
else:
_LOGGER.error("airsend.cloud error : "+str(status_code))
raise Exception("airsend.cloud error : "+str(status_code))