-
-
Save shamasis/a71d0471f968550cfbf71551f304ae42 to your computer and use it in GitHub Desktop.
Tuya api script (for home assistant) (India) (All Sensors)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
command_line: | |
sensor: | |
name: Meter PC321-W-TY | |
unique_id: meter_PC321_W_TY | |
command: 'python3 /config/tuyapc321.py d7978c72b206429cedo10z' | |
device_class: power | |
state_class: measurement | |
unit_of_measurement: W | |
scan_interval: 10 | |
json_attributes: | |
- VoltageA | |
- CurrentA | |
- ActivePowerA | |
- PowerFactorA | |
- ReactivePowerA | |
- EnergyConsumedA | |
- reverse_energy_a | |
- VoltageB | |
- CurrentB | |
- ActivePowerB | |
- PowerFactorB | |
- ReactivePowerB | |
- EnergyConsumedB | |
- reverse_energy_b | |
- VoltageC | |
- CurrentC | |
- ActivePowerC | |
- PowerFactorC | |
- ReactivePowerC | |
- EnergyConsumedC | |
- reverse_energy_c | |
- TotalEnergyConsumed | |
- Current | |
- ActivePower | |
- ReactivePower | |
- Frequency | |
- Temperature | |
- DeviceStatus | |
- voltage_phase_seq | |
- reverse_energy_t | |
value_template: "{{ value_json.ActivePower }}" | |
template: | |
- sensor: | |
- name: "Energy Meter Total Energy Consumed" | |
unique_id: "energy_meter_total_energy_consumed" | |
unit_of_measurement: "kWh" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'TotalEnergyConsumed') | default(0)) | float / 1000) | round(2) }} | |
- name: "Energy Meter Total Current" | |
unique_id: "energy_meter_total_current" | |
unit_of_measurement: "A" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'Current') | default(0)) | float / 1000) | round(2) }} | |
- name: "Energy Meter Total Active Power" | |
unique_id: "energy_meter_total_active_power" | |
unit_of_measurement: "W" | |
state: > | |
{{ state_attr('sensor.meter_pc321_w_ty', 'ActivePower') | default(0) }} | |
- name: "Energy Meter Total Reactive Power" | |
unique_id: "energy_meter_total_reactive_power" | |
unit_of_measurement: "VAR" | |
state: > | |
{{ state_attr('sensor.meter_pc321_w_ty', 'ReactivePower') | default(0) }} | |
- name: "Energy Meter Frequency" | |
unique_id: "energy_meter_frequency" | |
unit_of_measurement: "Hz" | |
state: > | |
{{ state_attr('sensor.meter_pc321_w_ty', 'Frequency') | default(0) }} | |
- name: "Energy Meter Temperature" | |
unique_id: "energy_meter_temperature" | |
unit_of_measurement: "°C" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'Temperature') | default(0)) | float / 10) | round(1) }} | |
- name: "Energy Meter Device Status" | |
unique_id: "energy_meter_device_status" | |
state: > | |
{{ state_attr('sensor.meter_pc321_w_ty', 'DeviceStatus') | default("Unknown") }} | |
######################################################################## | |
# Phase A | |
######################################################################## | |
- name: "Energy Meter Phase A Voltage" | |
unique_id: "energy_meter_phase_a_voltage" | |
unit_of_measurement: "V" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'VoltageA') | default(0) | float / 10) | round(1) }} | |
- name: "Energy Meter Phase A Current" | |
unique_id: "energy_meter_phase_a_current" | |
unit_of_measurement: "A" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'CurrentA') | default(0) | float / 1000) | round(2) }} | |
- name: "Energy Meter Phase A Active Power" | |
unique_id: "energy_meter_phase_a_active_power" | |
unit_of_measurement: "W" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ActivePowerA') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase A Reactive Power" | |
unique_id: "energy_meter_phase_a_reactive_power" | |
unit_of_measurement: "VAR" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ReactivePowerA') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase A Power Factor" | |
unique_id: "energy_meter_phase_a_power_factor" | |
unit_of_measurement: "%" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'PowerFactorA') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase A Energy Consumed" | |
unique_id: "energy_meter_phase_a_energy_consumed" | |
unit_of_measurement: "kWh" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'EnergyConsumedA') | default(0)) | float / 1000) | round(2) }} | |
######################################################################## | |
# Phase B | |
######################################################################## | |
- name: "Energy Meter Phase B Voltage" | |
unique_id: "energy_meter_phase_b_voltage" | |
unit_of_measurement: "V" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'VoltageB') | default(0) | float / 10) | round(1) }} | |
- name: "Energy Meter Phase B Current" | |
unique_id: "energy_meter_phase_b_current" | |
unit_of_measurement: "A" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'CurrentB') | default(0) | float / 1000) | round(2) }} | |
- name: "Energy Meter Phase B Active Power" | |
unique_id: "energy_meter_phase_b_active_power" | |
unit_of_measurement: "W" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ActivePowerB') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase B Reactive Power" | |
unique_id: "energy_meter_phase_b_reactive_power" | |
unit_of_measurement: "VAR" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ReactivePowerB') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase B Power Factor" | |
unique_id: "energy_meter_phase_b_power_factor" | |
unit_of_measurement: "%" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'PowerFactorB') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase B Energy Consumed" | |
unique_id: "energy_meter_phase_b_energy_consumed" | |
unit_of_measurement: "kWh" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'EnergyConsumedB') | default(0)) | float / 1000) | round(2) }} | |
######################################################################## | |
# Phase C | |
######################################################################## | |
- name: "Energy Meter Phase C Voltage" | |
unique_id: "energy_meter_phase_c_voltage" | |
unit_of_measurement: "V" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'VoltageC') | default(0) | float / 10) | round(1) }} | |
- name: "Energy Meter Phase C Current" | |
unique_id: "energy_meter_phase_c_current" | |
unit_of_measurement: "A" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'CurrentC') | default(0) | float / 1000) | round(2) }} | |
- name: "Energy Meter Phase C Active Power" | |
unique_id: "energy_meter_phase_c_active_power" | |
unit_of_measurement: "W" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ActivePowerC') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase C Reactive Power" | |
unique_id: "energy_meter_phase_c_reactive_power" | |
unit_of_measurement: "VAR" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'ReactivePowerC') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase C Power Factor" | |
unique_id: "energy_meter_phase_c_power_factor" | |
unit_of_measurement: "%" | |
state: > | |
{{ (state_attr('sensor.meter_pc321_w_ty', 'PowerFactorC') | default(0) | float) | round(0) }} | |
- name: "Energy Meter Phase C Energy Consumed" | |
unique_id: "energy_meter_phase_c_energy_consumed" | |
unit_of_measurement: "kWh" | |
state: > | |
{{ ((state_attr('sensor.meter_pc321_w_ty', 'EnergyConsumedC') | default(0)) | float / 1000) | round(2) }} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Update credentials, etc defined near the end of this script | |
import sys | |
import hashlib | |
import hmac | |
import json | |
import urllib | |
import urllib.parse | |
import logging | |
from urllib.request import urlopen, Request | |
from datetime import datetime | |
def make_request(url, params=None, headers=None): | |
if params: | |
url = url + "?" + urllib.parse.urlencode(params) | |
request = Request(url, headers=headers or {}) | |
try: | |
with urlopen(request, timeout=10) as response: | |
return response, response.read().decode("utf-8") | |
except Exception as error: | |
return error, "" | |
def get_timestamp(now = datetime.now()): | |
return str(int(datetime.timestamp(now)*1000)) | |
def get_sign(payload, key): | |
byte_key = bytes(key, 'UTF-8') | |
message = payload.encode() | |
sign = hmac.new(byte_key, message, hashlib.sha256).hexdigest() | |
return sign.upper() | |
def get_access_token(): | |
now = datetime.now() | |
timestamp = get_timestamp(now) | |
string_to_sign = client_id + timestamp + "GET\n" + \ | |
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n" + \ | |
"\n" + \ | |
LOGIN_URL | |
signed_string = get_sign(string_to_sign, client_secret) | |
headers = { | |
"client_id": client_id, | |
"sign": signed_string, | |
"t": timestamp, | |
"mode": "cors", | |
"sign_method": "HMAC-SHA256", | |
"Content-Type": "application/json" | |
} | |
response, body = make_request(BASE_URL + LOGIN_URL, headers = headers) | |
json_result = json.loads(body)["result"] | |
access_token = json_result["access_token"] | |
return access_token | |
''' | |
Get the current attributes of device as hash. Example: | |
{ | |
"attribute1": value, | |
"attribute2": value, | |
"attribute3": value | |
} | |
''' | |
def get_device_properties(access_token, device_id): | |
url = ATTRIBUTES_URL.format(device_id=device_id) | |
timestamp = get_timestamp() | |
string_to_sign = client_id + access_token + timestamp + "GET\n" + \ | |
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n" + \ | |
"\n" + \ | |
url | |
signed_string = get_sign(string_to_sign, client_secret) | |
headers = { | |
"client_id": client_id, | |
"sign": signed_string, | |
"access_token": access_token, | |
"t": timestamp, | |
"mode": "cors", | |
"sign_method": "HMAC-SHA256", | |
"Content-Type": "application/json" | |
} | |
response, body = make_request(BASE_URL + url, headers = headers) | |
json_result = json.loads(body) | |
properties = json_result["result"]["properties"] | |
output = {j['code']: j['value'] for j in properties} | |
return output | |
# Updated BASE_URL for the India data centre (change to tuyaus.com for US) | |
BASE_URL = "https://openapi.tuyain.com" | |
LOGIN_URL = "/v1.0/token?grant_type=1" | |
ATTRIBUTES_URL = "/v2.0/cloud/thing/{device_id}/shadow/properties" | |
if len(sys.argv) != 2: | |
raise SystemExit("usage: python3 tuya.py device_id") | |
_, device_id = sys.argv | |
# add your client ID from Tuya Developer Portal | |
# --------------------------------------------- | |
# Ensure you have cloud subscription Trial for API Access | |
client_id = "____" | |
client_secret = "____" | |
access_token = get_access_token() | |
attributes = get_device_properties(access_token, device_id) | |
json_output = json.dumps(attributes) | |
print(json_output) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment