This commit is contained in:
seydx
2025-05-26 18:36:21 +02:00
parent 5be5d9247c
commit 3036dd7cfe
4 changed files with 33 additions and 33 deletions
+8 -8
View File
@@ -568,14 +568,14 @@ Tested: KD110, KC200, KC401, KC420WS, EC71.
#### Source: Tuya
[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Cloud API` and `Tuya API`.
[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Tuya Cloud API` and `Tuya Smart API`.
The `Cloud API` requires setting up a cloud project in the Tuya Developer Platform to retrieve the required credentials. The `Tuya API` does not require a cloud project and the cameras can be added through the interface via email/password.
The `Tuya Cloud API` requires setting up a cloud project in the Tuya Developer Platform to retrieve the required credentials. The `Tuya Smart API` does not require a cloud project and the cameras can be added through the interface via email/password.
**Cloud API**:
**Tuya Cloud API**:
- Obtain `device_id`, `client_id`, `client_secret`, and `uid` from [Tuya IoT Platform](https://iot.tuya.com/). [Here's a guide](https://xzetsubou.github.io/hass-localtuya/cloud_api/).
**Open API**:
**Tuya Smart API**:
- Smart Life accounts are not supported, you need to create a Tuya account. If the cameras are already added to the Smart Life app, you need to remove them and add them again to the Tuya Smart app.
**Configuring the stream:**
@@ -585,19 +585,19 @@ The `Cloud API` requires setting up a cloud project in the Tuya Developer Platfo
```yaml
streams:
# Cloud API: WebRTC main stream
# Tuya Cloud API: WebRTC main stream
tuya_webrtc:
- tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX
# Cloud API: WebRTC sub stream
# Tuya Cloud API: WebRTC sub stream
tuya_webrtc_sd:
- tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX&resolution=sd
# Tuya API: WebRTC main stream
# Tuya Smart API: WebRTC main stream
tuya:
- tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX
# Tuya API: WebRTC sub stream
# Tuya Smart API: WebRTC sub stream
tuya:
- tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX&resolution=sd
```
+1 -1
View File
@@ -55,7 +55,7 @@ func apiTuya(w http.ResponseWriter, r *http.Request) {
return
}
tuyaAPI, err := tuya.NewTuyaApiClient(
tuyaAPI, err := tuya.NewTuyaSmartApiClient(
httpClient,
tuyaRegion.Host,
email,
+3 -3
View File
@@ -49,11 +49,11 @@ func Dial(rawURL string) (core.Producer, error) {
query := u.Query()
// Tuya API
// Tuya Smart API
email := query.Get("email")
password := query.Get("password")
// Cloud API
// Tuya Cloud API
uid := query.Get("uid")
clientId := query.Get("client_id")
clientSecret := query.Get("client_secret")
@@ -80,7 +80,7 @@ func Dial(rawURL string) (core.Producer, error) {
}
if useTuyaApi {
if client.api, err = NewTuyaApiClient(nil, u.Hostname(), email, password, deviceId); err != nil {
if client.api, err = NewTuyaSmartApiClient(nil, u.Hostname(), email, password, deviceId); err != nil {
return nil, fmt.Errorf("tuya: %w", err)
}
} else {
+21 -21
View File
@@ -121,12 +121,12 @@ type AppInfo struct {
}
type MQTTConfigResponse struct {
Result TuyaApiMQTTConfig `json:"result"`
Result SmartApiMQTTConfig `json:"result"`
Success bool `json:"success"`
Msg string `json:"errorMsg,omitempty"`
}
type TuyaApiMQTTConfig struct {
type SmartApiMQTTConfig struct {
Msid string `json:"msid"`
Password string `json:"password"`
}
@@ -203,18 +203,18 @@ type Device struct {
Uuid string `json:"uuid"`
}
type TuyaApiWebRTCConfigRequest struct {
type SmartApiWebRTCConfigRequest struct {
DevId string `json:"devId"`
ClientTraceId string `json:"clientTraceId"`
}
type TuyaApiWebRTCConfigResponse struct {
Result TuyaWebRTCConfig `json:"result"`
type SmartApiWebRTCConfigResponse struct {
Result SmartApiWebRTCConfig `json:"result"`
Success bool `json:"success"`
Msg string `json:"errorMsg,omitempty"`
}
type TuyaWebRTCConfig struct {
type SmartApiWebRTCConfig struct {
AudioAttributes AudioAttributes `json:"audioAttributes"`
Auth string `json:"auth"`
GatewayId string `json:"gatewayId"`
@@ -234,7 +234,7 @@ type TuyaWebRTCConfig struct {
VideoClarity int `json:"videoClarity"`
}
type TuyaApiClient struct {
type TuyaSmartApiClient struct {
TuyaClient
email string
@@ -259,7 +259,7 @@ var AvailableRegions = []Region{
{"india", "protect-in.ismartlife.me", "India", "IN"},
}
func NewTuyaApiClient(httpClient *http.Client, baseUrl, email, password, deviceId string) (*TuyaApiClient, error) {
func NewTuyaSmartApiClient(httpClient *http.Client, baseUrl, email, password, deviceId string) (*TuyaSmartApiClient, error) {
var region *Region
for _, r := range AvailableRegions {
if r.Host == baseUrl {
@@ -278,7 +278,7 @@ func NewTuyaApiClient(httpClient *http.Client, baseUrl, email, password, deviceI
mqttClient := NewTuyaMqttClient(deviceId)
client := &TuyaApiClient{
client := &TuyaSmartApiClient{
TuyaClient: TuyaClient{
httpClient: httpClient,
mqtt: mqttClient,
@@ -295,7 +295,7 @@ func NewTuyaApiClient(httpClient *http.Client, baseUrl, email, password, deviceI
}
// WebRTC Flow
func (c *TuyaApiClient) Init() error {
func (c *TuyaSmartApiClient) Init() error {
if err := c.initToken(); err != nil {
return fmt.Errorf("failed to initialize token: %w", err)
}
@@ -317,11 +317,11 @@ func (c *TuyaApiClient) Init() error {
return nil
}
func (c *TuyaApiClient) GetStreamUrl(streamType string) (streamUrl string, err error) {
func (c *TuyaSmartApiClient) GetStreamUrl(streamType string) (streamUrl string, err error) {
return "", errors.New("not supported")
}
func (c *TuyaApiClient) GetAppInfo() (*AppInfoResponse, error) {
func (c *TuyaSmartApiClient) GetAppInfo() (*AppInfoResponse, error) {
url := fmt.Sprintf("https://%s/api/customized/web/app/info", c.baseUrl)
body, err := c.request("POST", url, nil)
@@ -341,7 +341,7 @@ func (c *TuyaApiClient) GetAppInfo() (*AppInfoResponse, error) {
return &appInfoResponse, nil
}
func (c *TuyaApiClient) GetHomeList() (*HomeListResponse, error) {
func (c *TuyaSmartApiClient) GetHomeList() (*HomeListResponse, error) {
url := fmt.Sprintf("https://%s/api/new/common/homeList", c.baseUrl)
body, err := c.request("POST", url, nil)
@@ -361,7 +361,7 @@ func (c *TuyaApiClient) GetHomeList() (*HomeListResponse, error) {
return &homeListResponse, nil
}
func (c *TuyaApiClient) GetSharedHomeList() (*SharedHomeListResponse, error) {
func (c *TuyaSmartApiClient) GetSharedHomeList() (*SharedHomeListResponse, error) {
url := fmt.Sprintf("https://%s/api/new/playback/shareList", c.baseUrl)
body, err := c.request("POST", url, nil)
@@ -381,7 +381,7 @@ func (c *TuyaApiClient) GetSharedHomeList() (*SharedHomeListResponse, error) {
return &sharedHomeListResponse, nil
}
func (c *TuyaApiClient) GetRoomList(homeId string) (*RoomListResponse, error) {
func (c *TuyaSmartApiClient) GetRoomList(homeId string) (*RoomListResponse, error) {
url := fmt.Sprintf("https://%s/api/new/common/roomList", c.baseUrl)
data := RoomListRequest{
@@ -405,7 +405,7 @@ func (c *TuyaApiClient) GetRoomList(homeId string) (*RoomListResponse, error) {
return &roomListResponse, nil
}
func (c *TuyaApiClient) initToken() error {
func (c *TuyaSmartApiClient) initToken() error {
tokenUrl := fmt.Sprintf("https://%s/api/login/token", c.baseUrl)
tokenReq := LoginTokenRequest{
@@ -470,10 +470,10 @@ func (c *TuyaApiClient) initToken() error {
return nil
}
func (c *TuyaApiClient) loadWebrtcConfig() (*WebRTCConfig, error) {
func (c *TuyaSmartApiClient) loadWebrtcConfig() (*WebRTCConfig, error) {
url := fmt.Sprintf("https://%s/api/jarvis/config", c.baseUrl)
data := TuyaApiWebRTCConfigRequest{
data := SmartApiWebRTCConfigRequest{
DevId: c.deviceId,
ClientTraceId: fmt.Sprintf("%x", rand.Int63()),
}
@@ -483,7 +483,7 @@ func (c *TuyaApiClient) loadWebrtcConfig() (*WebRTCConfig, error) {
return nil, err
}
var webRTCConfigResponse TuyaApiWebRTCConfigResponse
var webRTCConfigResponse SmartApiWebRTCConfigResponse
err = json.Unmarshal(body, &webRTCConfigResponse)
if err != nil {
return nil, err
@@ -524,7 +524,7 @@ func (c *TuyaApiClient) loadWebrtcConfig() (*WebRTCConfig, error) {
}, nil
}
func (c *TuyaApiClient) loadHubConfig() (config *MQTTConfig, err error) {
func (c *TuyaSmartApiClient) loadHubConfig() (config *MQTTConfig, err error) {
mqttUrl := fmt.Sprintf("https://%s/api/jarvis/mqtt", c.baseUrl)
mqttBody, err := c.request("POST", mqttUrl, nil)
@@ -552,7 +552,7 @@ func (c *TuyaApiClient) loadHubConfig() (config *MQTTConfig, err error) {
}, nil
}
func (c *TuyaApiClient) request(method string, url string, body any) ([]byte, error) {
func (c *TuyaSmartApiClient) request(method string, url string, body any) ([]byte, error) {
var bodyReader io.Reader
if body != nil {
jsonBody, err := json.Marshal(body)