Skip to content

Commit

Permalink
Merge pull request #32 from sinricpro/feature/custom-devices
Browse files Browse the repository at this point in the history
Custom device implementation and bug fixes
  • Loading branch information
thegoliathgeek authored Dec 4, 2021
2 parents cba5118 + 0ce95af commit 2e805a3
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 15 deletions.
22 changes: 14 additions & 8 deletions sinric/_cbhandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* This file is part of the Sinric Pro (https://github.com/sinricpro/)
"""

from re import X
from ._powerController import PowerController
from ._brightnessController import BrightnessController
from ._jsoncommands import JSON_COMMANDS
Expand All @@ -16,20 +17,21 @@
from ._temperatureController import TemperatureController
from ._tvcontorller import TvController
from ._speakerController import SpeakerController
from ._modeController import ModeController
from json import dumps, load, dump
from time import time, sleep
from uuid import uuid4
from ._lockController import LockStateController
from ._signature import Signature
from ._leafyBucket import LeakyBucket
from ._leakyBucket import LeakyBucket


# TODO fix target temperature Duration

# noinspection PyBroadException
class CallBackHandler(PowerLevel, PowerController, BrightnessController, ColorController, ColorTemperatureController,
ThermostateMode, RangeValueController, TemperatureController, TvController, SpeakerController,
LockStateController, Signature):
LockStateController, ModeController, Signature):
def __init__(self, callbacks, trace_bool, logger, enable_track=False, secretKey=""):
self.myHmac = None
self.secretKey = secretKey
Expand All @@ -46,6 +48,7 @@ def __init__(self, callbacks, trace_bool, logger, enable_track=False, secretKey=
LockStateController.__init__(self)
Signature.__init__(self, self.secretKey)
SpeakerController.__init__(self, 0)
ModeController.__init__(self, 0)
ColorTemperatureController.__init__(self, 0, [2200, 2700, 4000, 5500, 7000])
self.callbacks = callbacks
self.logger = logger
Expand All @@ -65,7 +68,7 @@ async def handleResponse(response, connection, udp_client):
elif Trace == 'udp_response' and udp_client != None :
udp_client.sendResponse(dumps(response).encode('ascii'), dataArr[2])

def jsnHandle(action, resp, dataDict) -> dict:
def jsnHandle(action, resp, dataDict, instanceId='') -> dict:
header = {
"payloadVersion": 2,
"signatureVersion": 1
Expand All @@ -81,6 +84,9 @@ def jsnHandle(action, resp, dataDict) -> dict:
"type": "response",
"value": dataDict
}

if instanceId:
payload['instanceId'] = instanceId

signature = self.getSignature(payload)

Expand Down Expand Up @@ -235,10 +241,10 @@ def jsnHandle(action, resp, dataDict) -> dict:
elif jsn.get('payload').get('action') == JSON_COMMANDS.get('SETRANGEVALUE'):
try:
assert (self.verifySignature(jsn.get('payload'), jsn.get("signature").get("HMAC")))
resp, value = await self.setRangeValue(jsn, self.callbacks.get('setRangeValue'))
resp, value, instanceId = await self.setRangeValue(jsn, self.callbacks.get('setRangeValue'))
response = jsnHandle(action="setRangeValue", resp=resp, dataDict={
"rangeValue": value
})
"rangeValue": value
}, instanceId=instanceId)

if resp:
await handleResponse(response, connection, udp_client)
Expand Down Expand Up @@ -485,10 +491,10 @@ def jsnHandle(action, resp, dataDict) -> dict:
elif jsn.get('payload').get('action') == 'setMode':
try:
assert (self.verifySignature(jsn.get('payload'), jsn.get("signature").get("HMAC")))
resp, value = await self.setMode(jsn, self.callbacks.get('setMode'))
resp, value, instanceId = await self.setMode(jsn, self.callbacks.get('setMode'))
response = jsnHandle(action="setMode", resp=resp, dataDict={
"mode": value
})
}, instanceId=instanceId)

if resp:
await handleResponse(response, connection, udp_client)
Expand Down
2 changes: 1 addition & 1 deletion sinric/_jsoncommands.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,5 @@
'ADJUSTVOLUME': 'adjustVolume',
'SETMUTE': 'setMute',
'MEDIACONTROL': 'mediaControl',

'INSTANCE_ID' : 'instanceId'
}
File renamed without changes.
17 changes: 17 additions & 0 deletions sinric/_modeController.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""
* Copyright (c) 2019 Sinric. All rights reserved.
* Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
*
* This file is part of the Sinric Pro (https://github.com/sinricpro/)
"""

from ._jsoncommands import JSON_COMMANDS

class ModeController:
def __init__(self, x):
self.instanceId = ''


async def setMode(self, jsn, callback):
self.instanceId= jsn.get("payload").get(JSON_COMMANDS['INSTANCE_ID'], '')
return callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), jsn.get("payload").get('value').get('mode'), self.instanceId)
6 changes: 4 additions & 2 deletions sinric/_rangeValueController.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@
class RangeValueController:
def __init__(self, k):
self.rangeValue = 0
self.instanceId = ''

async def setRangeValue(self, jsn, range_callback):
self.rangeValue= jsn.get("payload").get(JSON_COMMANDS['VALUE']).get('rangeValue')
return range_callback(jsn.get(JSON_COMMANDS.get('DEVICEID')), self.rangeValue)
self.instanceId= jsn.get("payload").get(JSON_COMMANDS['INSTANCE_ID'], '')
return range_callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), self.rangeValue, self.instanceId)

async def adjustRangeValue(self, jsn, callback):
self.rangeValue += jsn.get("payload").get(JSON_COMMANDS['VALUE']).get('rangeValue')
if self.rangeValue > 100:
self.rangeValue = 100
elif self.rangeValue < 0:
self.rangeValue = 0
return callback(jsn.get(JSON_COMMANDS.get('DEVICEID')), self.rangeValue)
return callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), self.rangeValue)
5 changes: 1 addition & 4 deletions sinric/_speakerController.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,4 @@ async def resetBands(self, jsn, callback):
band1 = value.get('bands')[0]
band2 = value.get('bands')[1]
band3 = value.get('bands')[2]
return callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), band1, band2, band3)

async def setMode(self, jsn, callback):
return callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), jsn.get("payload").get('value').get('mode'))
return callback(jsn.get("payload").get(JSON_COMMANDS.get('DEVICEID')), band1, band2, band3)

0 comments on commit 2e805a3

Please sign in to comment.