Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Pynobo | 33 | a month ago | 8 | September 29, 2021 | gpl-3.0 | Python | ||||
Python 3 TCP/IP interface for Nobø Hub / Nobø Energy Control | ||||||||||
Tuyaface | 26 | 2 | 2 years ago | 13 | June 10, 2020 | 1 | unlicense | Python | ||
Python Tuya client that allows you to locally communicate with tuya devices | ||||||||||
Raspend | 5 | 6 months ago | mit | Python | ||||||
raspend is a small and easy to use web service framework, which is ideal for small to medium-sized home automation projects. |
Tuya client that allows you to locally communicate with tuya devices without the tuya-cloud.
pip install tuyaface
tuyaface
{#tuyaface}Functionality for communicating with a Tuya device.
set_state
{#tuyaface.set_state}
def set_state(device:dict, value, idx:int=1) -> bool
Send status update request for one dps value to the tuya device.
returns bool
set_status
{#tuyaface.set_status}
def set_status(device:dict, dps:dict) -> bool
Send state update request to the tuya device and waits for response.
returns bool
status
{#tuyaface.status}
def status(device:dict) -> dict
Request status of the tuya device.
returns dict
tuyaface.aescipher
{#tuyaface.aescipher}Helpers for AES crypto.
decrypt
{#tuyaface.aescipher.decrypt}
def decrypt(key, enc, use_base64=True)
Optionally base64-decode and decrypt.
encrypt
{#tuyaface.aescipher.encrypt}
def encrypt(key, raw, use_base64=True)
Encrypt and optionally base64-encode.
tuyaface.const
{#tuyaface.const}Tuya constants.
CMD_TYPE
{#tuyaface.const.CMD_TYPE}
class CMD_TYPE(value, names=None, *, module=None, qualname=None, type=None, start=1)
Tuya message types.
ACTIVE
{#tuyaface.const.CMD_TYPE.ACTIVE}AP_CONFIG
{#tuyaface.const.CMD_TYPE.AP_CONFIG}AP_CONFIG_NEW
{#tuyaface.const.CMD_TYPE.AP_CONFIG_NEW}BIND
{#tuyaface.const.CMD_TYPE.BIND}CONTROL
{#tuyaface.const.CMD_TYPE.CONTROL}CONTROL_NEW
{#tuyaface.const.CMD_TYPE.CONTROL_NEW}DP_QUERY
{#tuyaface.const.CMD_TYPE.DP_QUERY}DP_QUERY_NEW
{#tuyaface.const.CMD_TYPE.DP_QUERY_NEW}ENABLE_WIFI
{#tuyaface.const.CMD_TYPE.ENABLE_WIFI}HEART_BEAT
{#tuyaface.const.CMD_TYPE.HEART_BEAT}LAN_CHECK_GW_UPDATE
{#tuyaface.const.CMD_TYPE.LAN_CHECK_GW_UPDATE}LAN_DELETE_SUB_DEV
{#tuyaface.const.CMD_TYPE.LAN_DELETE_SUB_DEV}LAN_EXPORT_APP_CONFIG
{#tuyaface.const.CMD_TYPE.LAN_EXPORT_APP_CONFIG}LAN_GW_ACTIVE
{#tuyaface.const.CMD_TYPE.LAN_GW_ACTIVE}LAN_GW_UPDATE
{#tuyaface.const.CMD_TYPE.LAN_GW_UPDATE}LAN_PUBLISH_APP_CONFIG
{#tuyaface.const.CMD_TYPE.LAN_PUBLISH_APP_CONFIG}LAN_PUBLISH_CLOUD_CONFIG
{#tuyaface.const.CMD_TYPE.LAN_PUBLISH_CLOUD_CONFIG}LAN_PUBLISH_SCENE_PANEL
{#tuyaface.const.CMD_TYPE.LAN_PUBLISH_SCENE_PANEL}LAN_REMOVE_GW
{#tuyaface.const.CMD_TYPE.LAN_REMOVE_GW}LAN_REPORT_SUB_DEV
{#tuyaface.const.CMD_TYPE.LAN_REPORT_SUB_DEV}LAN_SCENE
{#tuyaface.const.CMD_TYPE.LAN_SCENE}LAN_SET_GW_CHANNEL
{#tuyaface.const.CMD_TYPE.LAN_SET_GW_CHANNEL}LAN_SUB_DEV_REQUEST
{#tuyaface.const.CMD_TYPE.LAN_SUB_DEV_REQUEST}QUERY_WIFI
{#tuyaface.const.CMD_TYPE.QUERY_WIFI}RENAME_DEVICE
{#tuyaface.const.CMD_TYPE.RENAME_DEVICE}RENAME_GW
{#tuyaface.const.CMD_TYPE.RENAME_GW}SCENE_EXECUTE
{#tuyaface.const.CMD_TYPE.SCENE_EXECUTE}STATUS
{#tuyaface.const.CMD_TYPE.STATUS}TOKEN_BIND
{#tuyaface.const.CMD_TYPE.TOKEN_BIND}UDP
{#tuyaface.const.CMD_TYPE.UDP}UDP_NEW
{#tuyaface.const.CMD_TYPE.UDP_NEW}UNBIND
{#tuyaface.const.CMD_TYPE.UNBIND}UNKNOWN
{#tuyaface.const.CMD_TYPE.UNKNOWN}tuyaface.helper
{#tuyaface.helper}Helpers.
bytes2hex
{#tuyaface.helper.bytes2hex}
def bytes2hex(data:bytes, pretty:bool=False)
Render hexstring from bytes.
hex2bytes
{#tuyaface.helper.hex2bytes}
def hex2bytes(data:str)
Parse hexstring to bytes.
tuyaface.tuyaclient
{#tuyaface.tuyaclient}Helper to maintain a connection to and serialize access to a Tuya device.
TuyaClient
{#tuyaface.tuyaclient.TuyaClient}
class TuyaClient(device:dict, on_status:<built-infunctioncallable>=None, on_connection:<built-infunctioncallable>=None)
Helper class to maintain a connection to and serialize access to a Tuya device.
Initialize the Tuya client.
run
{#tuyaface.tuyaclient.TuyaClient.run}
def run(self)
Tuya client main loop.
set_state
{#tuyaface.tuyaclient.TuyaClient.set_state}
def set_state(self, value, idx:int=1) -> dict
Set state.
set_status
{#tuyaface.tuyaclient.TuyaClient.set_status}
def set_status(self, value:dict) -> dict
Set status.
status
{#tuyaface.tuyaclient.TuyaClient.status}
def status(self) -> dict
Request status.
stop_client
{#tuyaface.tuyaclient.TuyaClient.stop_client}
def stop_client(self)
Close the connection and stop the worker thread.
from tuyaface.tuyaclient import TuyaClient
def on_status(data: dict):
print(data)
def on_connection(value: bool):
print(value)
device = {
'protocol': '3.3', # 3.1 | 3.3
'deviceid': '34280100600194d17c96',
'localkey': 'e7e9339aa82abe61',
'ip': '192.168.1.101',
}
client = TuyaClient(device, on_status, on_connection)
client.start()
data = client.status()
client.set_state(!data['dps']['1'], 1) #toggle
client.stop_client()
Device dict
device = {
'protocol': '3.3', # 3.1 | 3.3
'deviceid': '34280100600194d17c96',
'localkey': 'e7e9339aa82abe61',
'ip': '192.168.1.101',
'pref_status_cmd': 10 #optional, default 10
}
TuyaFace will automatically add tuyaface
dict to the device with data to support implementations without the TuyaClient class.
tuyaface = {
"sequence_nr": 0, # Request counter
"connection": None, # Holds the connection
"availability": False, # If the device could be reached
"pref_status_cmd": 10, # Preferred status command
"status": None, # Reply to the last status request
}
DPS dict
dps = {
'1': True,
'2': False,
'101': 255,
'102': 128,
...etc...
}
Do you have ideas how we can make this package even better? Or would you like to contribute in another way? Drop a line in the issue section, all help is welcome.