vodike
(Vodike)
April 7, 2021, 8:15am
102
X-Gizwits-Application-Id - how do I get this?
sensor:
platform: rest
name: hottub_login
scan_interval: 172000
resource: “https://euapi.gizwits.com/app/login ”
headers:
Content-Type: application/json
X-Gizwits-Application-Id: “98754e684ec045528b073876c34c7348 ”
method: POST
payload: ‘{ “username”: “[email protected] ”, “password”: “xxxxxxxx”, “lang”: “en” }’
value_template: “{{ value_json.token }}”
json_attributes:
BruceH5200
(Bruce Hartley)
April 7, 2021, 9:13am
103
the gizwits ID is the same for everyone, so just use the one that is there.
vodike
(Vodike)
April 7, 2021, 9:53am
104
Thank you!
But something wrong for me, I put this to my configuration yaml:
- platform: rest
name: hottub_login
scan_interval: 172000
resource: "https://euapi.gizwits.com/app/login"
headers:
Content-Type: application/json
X-Gizwits-Application-Id: "98754e684ec045528b073876c34c7348"
method: POST
payload: '{ "username": "[email protected] ", "password": "mypassword", "lang": "en" }'
value_template: "{{ value_json.token }}"
json_attributes:
- uid
- expire_at
And I saw hottub_login entity but empty
gigagigagiga:
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-Application-Id: 98754e684ec045528b073876c34c7348' -d '{ "username": "[email protected] ", "password": "YOURPASSWORD", "lang": "en" }' 'https://euapi.gizwits.com/app/login'
I tried this with my BESTWAY username and password and got this:
{“error_message”:“form_invalid”,“error_code”:9015,“detail_message”:{“username”:[“\u8fd9\u4e2a\u5b57\u6bb5\u662f\u5fc5\u586b\u9879\u3002”],“password”:[“\u8fd9\u4e2a\u5b57\u6bb5\u662f\u5fc5\u586b\u9879\u3002”]}}
I must be not getting something. I’m running
gigagigagiga:
curl -X POST --header ‘Content-Type: application/json’ --header ‘Accept: application/json’ --header ‘X-Gizwits-Application-Id: 98754e684ec045528b073876c34c7348’ -d ‘{ “username”: “[email protected] ”, “password”: “YOURPASSWORD”, “lang”: “en” }’ ‘https://euapi.gizwits.com/app/login ’
Putting my credentials in. Everytime, I get the following:
{“error_message”:“username or password error!”,“error_code”:9020,“detail_message”:null}
And i recently changed and verified my password. Still no luck. What am i doing wrong?
BruceH5200
(Bruce Hartley)
April 16, 2021, 5:30am
106
Which app are you registered with ? Which country are you in ?
Bestway App. United States. I appreciate the help, I am driving myself nuts trying to make this work. I am still new to Home Assistant, but have had no problem to date making numerous items work.
That was it. Im now getting a response (via Curl) that shows a token, UID, and expiry.
Now to the next steps, and see if I can make this work.
Thank you so much, I did not even think or know to do that! I assumed the site would stay the same regardless of locale, and only would need to change the language. I will let you know how i progress.
BruceH5200
(Bruce Hartley)
April 17, 2021, 8:02am
110
Excellent. Glad you’re making progress.
I can get the hot tub status. But if I use any other of the template sensors, I get unavailable. Any ideas?
pops106
(Jody Popplewell)
April 24, 2021, 7:10pm
112
Hi guys, cleverspa tub here.
I have sent musicman2005 a message as he seems to have it working but wondered if anyone has come across this problem where it doesn’t show any devices.
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-Application-Id: 805cc6a3f41b48aeae471e2fcb6ebc73' -d '{ "username": "xxxxxx", "password": "xxxxxx", "lang": "en" }' 'https://api.gizwits.com/app/users'
Lets me login and gives me a token and uid
curl -X GET --header 'Accept: application/json' --header 'X-Gizwits-User-token: xxxxxxxxx' --header 'X-Gizwits-Application-Id: 805cc6a3f41b48aeae471e2fcb6ebc73' 'https://api.gizwits.com/app/bindings?limit=20&skip=0'
returns
{"devices": []}
But I am logged in on my phone and working fine.
I am in the UK, if I point at the euapi it doesn’t login and looking at the main.js it seems the app is pointing at api.gizwits.com
Cheers
BruceH5200
(Bruce Hartley)
April 24, 2021, 7:23pm
113
Maybe the application id is different for api.
Can you capture it with proxy or similar ?
pops106
(Jody Popplewell)
April 24, 2021, 7:52pm
114
I think I know what I have done…
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-Application-Id: 805cc6a3f41b48aeae471e2fcb6ebc73' -d '{ "username": "xxxxxx", "password": "xxxxxx", "lang": "en" }' 'https://api.gizwits.com/app/users'
That first command has created a new user
I have just tried registering a new user with a different email address and it doesn’t let me login to the cleverspa app with the right command
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Gizwits-Application-Id: 805cc6a3f41b48aeae471e2fcb6ebc73' -d '{ "username": "xxxxxx", "password": "xxxxxx", "lang": "en" }' 'https://api.gizwits.com/app/login'
So I think there is just an account there now that doesn’t really exist.
pops106
(Jody Popplewell)
April 24, 2021, 8:12pm
115
So the main.js has this as the first mention of gizwits
HomePage.prototype.getToken = function () {
var _this = this;
var httpOptions = {
headers: new __WEBPACK_IMPORTED_MODULE_4__angular_common_http__["c" /* HttpHeaders */]({
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Gizwits-Application-Id': '805cc6a3f41b48aeae471e2fcb6ebc73'
})
};
var user = this.db.object("users/" + this.user).valueChanges();
user.subscribe(function (usr) {
console.log(usr);
_this.token = usr['token'];
var timestamp = Math.round((new Date()).getTime() / 1000);
console.log(usr['expire_at'] + ' | ' + timestamp);
if (usr['expire_at'] >= timestamp) {
if (_this.did != undefined) {
_this.getDeviceStatus();
}
else {
_this.getDevices();
}
}
else {
var postData = {
"phone_id": _this.user
};
_this.http.post("https://api.gizwits.com/app/users", postData, httpOptions)
.subscribe(function (data) {
console.log(data);
var itemRef = _this.db.object('users/' + _this.user);
itemRef.set(data);
_this.token = data['token'];
if (_this.did != 'undefined') {
_this.getDeviceStatus();
}
else {
_this.getDevices();
}
}, function (error) {
console.log(error);
});
}
});
};
HomePage.prototype.getDeviceStatus = function () {
var _this = this;
var headers = new __WEBPACK_IMPORTED_MODULE_4__angular_common_http__["c" /* HttpHeaders */]({
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-Gizwits-Application-Id': '805cc6a3f41b48aeae471e2fcb6ebc73'
});
if (this.locked == 0) {
this.http.get("https://api.gizwits.com/app/devdata/" + this.did + "/latest", { headers: headers })
.subscribe(function (data) {
_this.rotateme = false;
//console.log(data);
if (_this.locked == 0) {
if (_this.bubblesbtn != data['attr']['Bubble']) {
_this.loadingbubbles = 0;
}
_this.bubblesbtn = data['attr']['Bubble'];
if (_this.filterbtn != data['attr']['Filter']) {
_this.loadingfilter = 0;
}
_this.filterbtn = data['attr']['Filter'];
if (_this.heaterbtn != data['attr']['Heater']) {
_this.loadingheater = 0;
}
_this.heaterbtn = data['attr']['Heater'];
_this.tempbtn = data['attr']['Current_temperature'];
_this.bubbles = data['attr']['Bubble'];
_this.filter = data['attr']['Filter'];
_this.heater = data['attr']['Heater'];
_this.temp = data['attr']['Current_temperature'];
if (_this.oldVal != data['attr']['Temperature_setup'] && _this.oldVal != 0 && _this.oldVal < 43) {
_this.targetTemp = _this.oldVal;
}
else {
if (data['attr']['Temperature_setup'] > 42) {
_this.targetTemp = 42;
}
else {
_this.targetTemp = data['attr']['Temperature_setup'];
}
}
_this.filterChange = data['attr']['Time_filter'];
if (data['attr']['Time_filter'] > 167 * _this.filterCount) {
_this.filterNoti();
}
if (_this.firsttime != 1) {
_this.updateValues('bubbles');
_this.firsttime = 1;
localStorage.setItem('firsttime', '1');
}
if (data == [] || !_this.temp) {
_this.offline = 1;
}
else {
_this.offline = 0;
}
if (_this.heater == 1) {
_this.filter = 1;
_this.filterbtn = 1;
}
_this.disabled = 0;
_this.loader.dismiss();
}
}, function (error) {
//console.log(error);
});
}
};
Which looks like the appid makes sense but it looks like it posts “phone_id” as _this.user
GSzabados
(Gábor Szabados)
April 26, 2021, 8:30pm
116
Do you have a picture where the esp-wroom-2us visible and how it is connected?
My current YAML which is working. It’s all based on what Bruce has done but changed where needed to work with the clever spa.
Once i’ve got all the functions working i’ll get a full package of code together.
#####################################
sensor:
- platform: rest
name: hottub_status
scan_interval: 30
timeout: 20
resource: "https://api.gizwits.com/app/devdata/xxxxxxxxxxxx/latest"
# xxxxxxxxxxxx is the did from the bindings sensor
device_class: timestamp
headers:
Content-Type: application/json
X-Gizwits-Application-Id: 805cc6a3f41b48aeae471e2fcb6ebc73
method: GET
value_template: "{{ value_json.updated_at | timestamp_custom ('%Y-%m-%dT%H:%M:%S+00:00') }}"
json_attributes_path: "$.attr"
json_attributes:
- Heater
- 03
- Undercooling
- Current_temperature
- Filter
- Temperature_setup
- Superheat
- Bubble
- Overtime_filter
- Timing
- Check
- Time_filter
- platform: template
sensors:
hottub_pump_temp:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
friendly_name: "HotTub Water Temperature"
unit_of_measurement: '°C'
value_template: "{{ state_attr('sensor.hottub_status', 'Current_temperature') | int }}"
hottub_water_temp:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
friendly_name: "HotTub Water Temperature"
unit_of_measurement: '°C'
value_template: "{{ states('input_number.Temperature_setup') | int }}"
hottub_summary:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
friendly_name: "HotTub Status"
value_template: "{% if is_state('binary_sensor.hottub_online','off') %}offline{% elif is_state('sensor.hottub_error','on') %}error{% elif is_state('input_boolean.hottub_scheduled','on') and is_state('switch.hottub_filter','off') %}scheduled{% elif is_state('switch.hottub_power','off') %}off{% elif state_attr('sensor.hottub_status','heat_temp_reach')==1 %}at temperature{% elif is_state('switch.hottub_heat','on') %}heating{% elif is_state('switch.hottub_filter','off') %}on{% elif is_state('switch.hottub_heat','off') %}filtering{% elif is_state('switch.hottub_bubbles','off') %}heating{% else %}bubbling{% endif %}"
- platform: history_stats
name: HotTub Heating This Week
entity_id: sensor.hottub_summary
state: "heating"
type: time
end: "{{ now().replace(hour=0, minute=0, second=0) }}"
duration:
days: 7
rest_command:
hottub_command:
method: POST
headers:
content_type: "application/json"
X-Gizwits-Application-Id: "805cc6a3f41b48aeae471e2fcb6ebc73"
X-Gizwits-User-token: #####your user token#####
url: "https://api.gizwits.com/app/control/ZUnVqKmSwvvgGkVtOFxS9v"
payload: "{{hottub_command}}"
binary_sensor:
- platform: template
sensors:
hottub_online:
friendly_name: "HotTub Online"
value_template: "{{ (now() | as_timestamp - states('sensor.hottub_status') | as_timestamp ) < 2000.0 }}"
switch:
- platform: template
switches:
hottub_heat:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
unique_id: Heater
friendly_name: Heater
value_template: "{% if state_attr('sensor.hottub_status', 'Heater') == 1 %}on{% else %}off{% endif %}"
turn_on:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"Heater": 1} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
turn_off:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"Heater": 0} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
hottub_filter:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
unique_id: hottub_filter
friendly_name: Filter
value_template: "{% if state_attr('sensor.hottub_status', 'filter') == 1 %}on{% else %}off{% endif %}"
turn_on:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"filter": 1} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
turn_off:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"filter": 0} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
hottub_bubbles:
availability_template: "{{ states('binary_sensor.hottub_online') }}"
unique_id: Bubbles
friendly_name: Bubbles
value_template: "{% if state_attr('sensor.hottub_status', 'Bubble') == 1 %}on{% else %}off{% endif %}"
turn_on:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"Bubble": 1} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
turn_off:
- service: rest_command.hottub_command
data_template:
hottub_command: >
{"attrs": {"Bubble": 0} }
- delay: 00:00:05
- service: homeassistant.update_entity
entity_id: sensor.hottub_status
Ok…I’m stuck, and just can’t make things work. I’ve got the basic rest working, and am getting the following for hot tub status via the rest api.
So its working, and I can see changes in state when I use the buttons on the tub controllers.
Using the following in my sensor.yaml file (which works):
platform: rest
name: hottub_status
resource: https://usapi.gizwits.com/app/devdata/youdontneedtoknow/latest
headers:
Content-Type: application/json
X-Gizwits-Application-Id: 98754e684ec045528b073876c34c7348
method: GET
value_template: “{% if value_json.attr.temp_set > 0%}online{% else %}offline{%endif%}”
json_attributes_path: “$.attr”
json_attributes:
system_err2
wave_appm_min
heat_timer_min
heat_power
earth
wave_timer_min
system_err6
system_err7
system_err4
system_err5
heat_temp_reach
system_err3
system_err1
system_err8
system_err9
filter_timer_min
heat_appm_min
power
temp_set_unit
filter_appm_min
temp_now
wave_power
locked
filter_power
temp_set
but when I attempt to use any template sensors, they all show unavailable.
Like this one:
binary_sensor:
platform: template
sensors:
hottub_online:
friendly_name: “HotTub Online”
value_template: “{{ (now() | as_timestamp - states(‘sensor.hottub_status’) | as_timestamp ) < 2000.0 }}”
None of them work from Bruce’s code, they all say unavailable. I must be missing something stupid, and am pulling my hair out. Am I placing some of the code in the wrong place (configuration vs sensor YAML files, I have tried both doesn’t seem to matter). Any help would be appreciated!
BruceH5200
(Bruce Hartley)
April 27, 2021, 3:08pm
119
I’ve changed some of my code since then.
It’s expecting the hottub_status sensor to show a timestamp as it’s state:
sensor:
- platform: rest
name: hottub_status
scan_interval: 30
timeout: 20
# resource: https://euapi.gizwits.com/app/devdata/{my did}/latest
resource: !secret bestway_status_url
device_class: timestamp
headers:
Content-Type: application/json
X-Gizwits-Application-Id: 98754e684ec045528b073876c34c7348
method: GET
value_template: "{{ value_json.updated_at | timestamp_custom ('%Y-%m-%dT%H:%M:%S+00:00') }}"
json_attributes_path: "$.attr"
json_attributes:
- temp_now # Temperature of Water in Pump
- temp_set # Target Temperature
- temp_set_unit # Temperature displayed in C or F
- power # Power - 1:On, 0:Off
- filter_appm_min # Start Filter in x minutes
- filter_power # Power - 1:On, 0:Off
- filter_timer_min # Filter for x minutes
- heat_appm_min # Start Heat in x minutes
- heat_power # Heater - 1:On, 0:Off
- heat_timer_min # Heat for x minutes
- heat_temp_reach # Target Temperature Reached
- wave_power # Bubbles - 1:On, 0:Off
- wave_appm_min # Start Bubbles in x minutes
- wave_timer_min # Bubbles for x minutes
- locked # Pump Keypad Locked
- earth # Earth Fault
- system_err1 # Error 1 - Sensor Error / Water Flow Error / Debris Buildup
- system_err2 # Error 2 - Water Flow Error
- system_err3 # Error 3 - Temperature too low / Thermostat broken
- system_err4 # Error 4 - Temperature too high / Thermostat broken / Thermostat needs reset
- system_err5 # Error 5 - Temperature too high / Thermostat broken / Thermostat needs reset
- system_err6 # Error 6 - Electrical Fault (Current Variation)
- system_err7 # Error 7 - Electrical Fault
- system_err8 # Error 8 - Thermostat needs reset
- system_err9 # Error 9 - Internal Fuse Failure
# https://support.bestwayaftersales.co.uk/faq/get-help-with-your-lay-z-spa-pump/
I put the code above in. That part works. But again, any template sensors are not working correctly. I’m taking small chunks to make it easier to debug.
I took your code of template sensors for HotTub Online and HotTub Error. You can see them in the background. Hottub Online shows Off regardless of status, and Hottub Error shows unavailable.
At this point I’m just using your code above, and then the code for HT Online and Error.
What am I missing? Bruce really appreciate the help.
BruceH5200
(Bruce Hartley)
April 28, 2021, 12:08pm
121
I’d advise you to look at the latest code in my GitHub.
Rather than the code posted in this thread.