Skip to content

Instantly share code, notes, and snippets.

@shamasis
Forked from rpanachi/command_line.yaml
Last active February 23, 2025 17:26
Show Gist options
  • Save shamasis/a71d0471f968550cfbf71551f304ae42 to your computer and use it in GitHub Desktop.
Save shamasis/a71d0471f968550cfbf71551f304ae42 to your computer and use it in GitHub Desktop.
Tuya api script (for home assistant) (India) (All Sensors)
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) }}
# 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