1
1
package taposmartplug
2
2
3
3
import (
4
+ "encoding/json"
4
5
"errors"
5
6
"github.com/achetronic/autoheater/api/v1alpha1"
7
+ tapogotypes "github.com/achetronic/tapogo/api/types"
8
+ "github.com/achetronic/tapogo/pkg/tapogo"
6
9
"github.com/richardjennings/tapo/pkg/tapo"
10
+ "time"
7
11
)
8
12
9
13
const (
10
14
RequiredConfigFieldsMissingMessage = "some mandatory config field is missing on Tapo SmartPlug integration"
15
+
16
+ RequestRetryAttempts = 3
11
17
)
12
18
13
19
// --
14
20
func checkConfigFields (ctx * v1alpha1.Context ) (err error ) {
15
21
tapoConfig := ctx .Config .Spec .Device .Integrations .TapoSmartPlug
16
22
17
23
// Check required fields to act
18
- if tapoConfig .Address == "" || tapoConfig .Auth .Username == "" || tapoConfig .Auth .Password == "" {
24
+ if tapoConfig .Address == "" ||
25
+ tapoConfig .Auth .Username == "" ||
26
+ tapoConfig .Auth .Password == "" ||
27
+ tapoConfig .Client == "" {
19
28
return errors .New (RequiredConfigFieldsMissingMessage )
20
29
}
21
30
@@ -30,18 +39,51 @@ func TurnOnDevice(ctx *v1alpha1.Context) (tapoResponse map[string]interface{}, e
30
39
return tapoResponse , err
31
40
}
32
41
33
- //
34
- var tapoClient * tapo.Tapo
35
-
36
42
tapoConfig := ctx .Config .Spec .Device .Integrations .TapoSmartPlug
37
43
38
- tapoClient , err = tapo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
39
- if err != nil {
40
- return tapoResponse , err
44
+ switch tapoConfig .Client {
45
+ case "legacy" :
46
+ tapoClient , err := tapo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
47
+ if err != nil {
48
+ return tapoResponse , err
49
+ }
50
+
51
+ tapoResponse , err = tapoClient .TurnOn ()
52
+
53
+ default :
54
+ tapoClientNew , err := tapogo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
55
+ if err != nil {
56
+ return tapoResponse , err
57
+ }
58
+
59
+ // New KLAP protocol throws random errors when the requests are done at speed.
60
+ // Retrying mostly solve the issue
61
+ tapoResponseNew := & tapogotypes.ResponseSpec {}
62
+ for retryAttempt := 0 ; retryAttempt < RequestRetryAttempts ; retryAttempt ++ {
63
+ tapoResponseNew , err = tapoClientNew .TurnOn ()
64
+ if err != nil {
65
+ time .Sleep (time .Millisecond * 250 ) // Magic number 0.25s
66
+ continue
67
+ }
68
+ break
69
+ }
70
+
71
+ if err != nil {
72
+ return tapoResponse , err
73
+ }
74
+
75
+ // Make response compatible with the global interface
76
+ jsonBytes , err := json .Marshal (tapoResponseNew )
77
+ if err != nil {
78
+ return tapoResponse , err
79
+ }
80
+
81
+ err = json .Unmarshal (jsonBytes , & tapoResponse )
82
+ if err != nil {
83
+ return tapoResponse , err
84
+ }
41
85
}
42
86
43
- tapoResponse , err = tapoClient .TurnOn ()
44
-
45
87
return tapoResponse , err
46
88
}
47
89
@@ -54,16 +96,50 @@ func TurnOffDevice(ctx *v1alpha1.Context) (tapoResponse map[string]interface{},
54
96
}
55
97
56
98
//
57
- var tapoClient * tapo.Tapo
58
-
59
99
tapoConfig := ctx .Config .Spec .Device .Integrations .TapoSmartPlug
60
100
61
- tapoClient , err = tapo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
62
- if err != nil {
63
- return tapoResponse , err
101
+ switch tapoConfig .Client {
102
+ case "legacy" :
103
+ tapoClient , err := tapo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
104
+ if err != nil {
105
+ return tapoResponse , err
106
+ }
107
+
108
+ tapoResponse , err = tapoClient .TurnOff ()
109
+
110
+ default :
111
+ tapoClientNew , err := tapogo .NewTapo (tapoConfig .Address , tapoConfig .Auth .Username , tapoConfig .Auth .Password )
112
+ if err != nil {
113
+ return tapoResponse , err
114
+ }
115
+
116
+ // New KLAP protocol throws random errors when the requests are done at speed.
117
+ // Retrying mostly solve the issue
118
+ tapoResponseNew := & tapogotypes.ResponseSpec {}
119
+ for retryAttempt := 0 ; retryAttempt < RequestRetryAttempts ; retryAttempt ++ {
120
+ tapoResponseNew , err = tapoClientNew .TurnOff ()
121
+ if err != nil {
122
+ time .Sleep (time .Millisecond * 250 ) // Magic number 0.25s
123
+ continue
124
+ }
125
+ break
126
+ }
127
+
128
+ if err != nil {
129
+ return tapoResponse , err
130
+ }
131
+
132
+ // Make response compatible with the global interface
133
+ jsonBytes , err := json .Marshal (tapoResponseNew )
134
+ if err != nil {
135
+ return tapoResponse , err
136
+ }
137
+
138
+ err = json .Unmarshal (jsonBytes , & tapoResponse )
139
+ if err != nil {
140
+ return tapoResponse , err
141
+ }
64
142
}
65
143
66
- tapoResponse , err = tapoClient .TurnOff ()
67
-
68
144
return tapoResponse , err
69
145
}
0 commit comments