Skip to content

Commit 5c8379c

Browse files
author
Khole
authored
Merge pull request #27 from Pyhass/dev
Dev
2 parents b6211fb + d35be2d commit 5c8379c

25 files changed

+1774
-698
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ on:
55
push:
66
branches:
77
- master
8+
- dev
89
pull_request: ~
910

1011
env:

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ Here are examples and documentation on how to use the library independently.
1212

1313
https://pyhass.github.io/pyhiveapi.docs/ [WIP]
1414

15+

azure-pipelines.yml

Lines changed: 0 additions & 32 deletions
This file was deleted.

pyhiveapi/apyhiveapi/action.py

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
"""Hive Action Module."""
22

33

4-
class Action:
5-
"""Hive Action Code."""
4+
class HiveAction:
5+
"""Hive Action Code.
6+
7+
Returns:
8+
object: Return hive action object.
9+
"""
610

711
actionType = "Actions"
812

9-
def __init__(self, session=None):
10-
"""Initialise Action."""
13+
def __init__(self, session: object = None):
14+
"""Initialise Action.
15+
16+
Args:
17+
session (object, optional): session to interact with hive account. Defaults to None.
18+
"""
1119
self.session = session
1220

13-
async def getAction(self, device):
14-
"""Get smart plug current power usage."""
21+
async def getAction(self, device: dict):
22+
"""Action device to update.
23+
24+
Args:
25+
device (dict): Device to be updated.
26+
27+
Returns:
28+
dict: Updated device.
29+
"""
1530
dev_data = {}
1631

1732
if device["hiveID"] in self.data["action"]:
@@ -35,8 +50,15 @@ async def getAction(self, device):
3550
return "REMOVE"
3651
return device
3752

38-
async def getState(self, device):
39-
"""Get action state."""
53+
async def getState(self, device: dict):
54+
"""Get action state.
55+
56+
Args:
57+
device (dict): Device to get state of.
58+
59+
Returns:
60+
str: Return state.
61+
"""
4062
final = None
4163

4264
try:
@@ -47,8 +69,15 @@ async def getState(self, device):
4769

4870
return final
4971

50-
async def turnOn(self, device):
51-
"""Set action turn on."""
72+
async def setStatusOn(self, device: dict):
73+
"""Set action turn on.
74+
75+
Args:
76+
device (dict): Device to set state of.
77+
78+
Returns:
79+
boolean: True/False if successful.
80+
"""
5281
import json
5382

5483
final = False
@@ -65,8 +94,15 @@ async def turnOn(self, device):
6594

6695
return final
6796

68-
async def turnOff(self, device):
69-
"""Set action to turn off."""
97+
async def setStatusOff(self, device: dict):
98+
"""Set action to turn off.
99+
100+
Args:
101+
device (dict): Device to set state of.
102+
103+
Returns:
104+
boolean: True/False if successful.
105+
"""
70106
import json
71107

72108
final = False

pyhiveapi/apyhiveapi/alarm.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
"""Hive Alarm Module."""
2+
3+
4+
class HiveHomeShield:
5+
"""Hive homeshield alarm.
6+
7+
Returns:
8+
object: Hive homeshield
9+
"""
10+
11+
alarmType = "Alarm"
12+
13+
async def getMode(self):
14+
"""Get current mode of the alarm.
15+
16+
Returns:
17+
str: Mode if the alarm [armed_home, armed_away, armed_night]
18+
"""
19+
state = None
20+
21+
try:
22+
data = self.session.data.alarm
23+
state = data["mode"]
24+
except KeyError as e:
25+
await self.session.log.error(e)
26+
27+
return state
28+
29+
async def getState(self, device: dict):
30+
"""Get the alarm triggered state.
31+
32+
Returns:
33+
boolean: True/False if alarm is triggered.
34+
"""
35+
state = None
36+
37+
try:
38+
data = self.session.data.devices[device["hiveID"]]
39+
state = data["state"]["alarmActive"]
40+
except KeyError as e:
41+
await self.session.log.error(e)
42+
43+
return state
44+
45+
async def setMode(self, device: dict, mode: str):
46+
"""Set the alarm mode.
47+
48+
Args:
49+
device (dict): Alarm device.
50+
51+
Returns:
52+
boolean: True/False if successful.
53+
"""
54+
final = False
55+
56+
if (
57+
device["hiveID"] in self.session.data.devices
58+
and device["deviceData"]["online"]
59+
):
60+
await self.session.hiveRefreshTokens()
61+
resp = await self.session.api.setAlarm(mode=mode)
62+
if resp["original"] == 200:
63+
final = True
64+
await self.session.getAlarm()
65+
66+
return final
67+
68+
69+
class Alarm(HiveHomeShield):
70+
"""Home assistant alarm.
71+
72+
Args:
73+
HiveHomeShield (object): Class object.
74+
"""
75+
76+
def __init__(self, session: object = None):
77+
"""Initialise alarm.
78+
79+
Args:
80+
session (object, optional): Used to interact with the hive account. Defaults to None.
81+
"""
82+
self.session = session
83+
84+
async def getAlarm(self, device: dict):
85+
"""Get alarm data.
86+
87+
Args:
88+
device (dict): Device to update.
89+
90+
Returns:
91+
dict: Updated device.
92+
"""
93+
device["deviceData"].update(
94+
{"online": await self.session.attr.onlineOffline(device["device_id"])}
95+
)
96+
dev_data = {}
97+
98+
if device["deviceData"]["online"]:
99+
self.session.helper.deviceRecovered(device["device_id"])
100+
data = self.session.data.devices[device["device_id"]]
101+
dev_data = {
102+
"hiveID": device["hiveID"],
103+
"hiveName": device["hiveName"],
104+
"hiveType": device["hiveType"],
105+
"haName": device["haName"],
106+
"haType": device["haType"],
107+
"device_id": device["device_id"],
108+
"device_name": device["device_name"],
109+
"status": {
110+
"state": await self.getState(device),
111+
"mode": await self.getMode(),
112+
},
113+
"deviceData": data.get("props", None),
114+
"parentDevice": data.get("parent", None),
115+
"custom": device.get("custom", None),
116+
"attributes": await self.session.attr.stateAttributes(
117+
device["device_id"], device["hiveType"]
118+
),
119+
}
120+
121+
self.session.devices.update({device["hiveID"]: dev_data})
122+
return self.session.devices[device["hiveID"]]
123+
else:
124+
await self.session.log.errorCheck(
125+
device["device_id"], "ERROR", device["deviceData"]["online"]
126+
)
127+
return device

pyhiveapi/apyhiveapi/api/hive_api.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def __init__(self, hiveSession=None, websession=None, token=None):
2222
"weather": "https://weather.prod.bgchprod.info/weather",
2323
"holiday_mode": "/holiday-mode",
2424
"all": "/nodes/all?products=true&devices=true&actions=true",
25+
"alarm": "/security-lite?homeId=",
2526
"devices": "/devices",
2627
"products": "/products",
2728
"actions": "/actions",
@@ -111,9 +112,23 @@ def getAll(self):
111112
"""Build and query all endpoint."""
112113
url = self.urls["base"] + self.urls["all"]
113114
try:
114-
response = self.request("GET", url)
115-
self.json_return.update({"original": response.status_code})
116-
self.json_return.update({"parsed": response.json()})
115+
info = self.request("GET", url)
116+
self.json_return.update({"original": info.status_code})
117+
self.json_return.update({"parsed": info.json()})
118+
except (OSError, RuntimeError, ZeroDivisionError):
119+
self.error()
120+
121+
return self.json_return
122+
123+
def getAlarm(self, homeID=None):
124+
"""Build and query alarm endpoint."""
125+
if self.session is not None:
126+
homeID = self.session.config.homeID
127+
url = self.urls["base"] + self.urls["alarm"] + homeID
128+
try:
129+
info = self.request("GET", url)
130+
self.json_return.update({"original": info.status_code})
131+
self.json_return.update({"parsed": info.json()})
117132
except (OSError, RuntimeError, ZeroDivisionError):
118133
self.error()
119134

0 commit comments

Comments
 (0)