Skip to content

Instantly share code, notes, and snippets.

@sorryusernameisalreadytaken
Created September 6, 2024 13:41
Show Gist options
  • Save sorryusernameisalreadytaken/e1c6b1397b13db942c1a2ec3999814de to your computer and use it in GitHub Desktop.
Save sorryusernameisalreadytaken/e1c6b1397b13db942c1a2ec3999814de to your computer and use it in GitHub Desktop.
HomeAssistant Rest Call for Zendure AIO 2400 - Balcony power station storage unit - This allows you to get many, but not all, of your values, which can also be seen in the Zendure app. For my buddy, the “electricity” was mainly important, which probably shows the battery level. He can now write automations for this. Why all this when there is a …
template:
# Simply delete all the ones you don't want or which are zero. But you can also leave them all in, they will all be retrieved anyway
# In this case, in addition to the Zendure AIO, there is also an integrated shelly_em3. Attention: if you only have one aio2400,
# the all shelly_em3 sensor must be removed here and all sensors aio2400 should point to [0] instead of [1]
- sensor:
- name: "shelly_em3_id"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].id }}"
- name: "shelly_em3_deviceKey"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].deviceKey }}"
- name: "shelly_em3_snNumber"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].snNumber }}"
- name: "shelly_em3_name"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].name }}"
- name: "shelly_em3_productId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].productId }}"
- name: "shelly_em3_productKey"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].productKey }}"
- name: "shelly_em3_onlineFlag"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].onlineFlag }}"
- name: "shelly_em3_productName"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].productName }}"
- name: "shelly_em3_wifiStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].wifiStatus }}"
- name: "shelly_em3_blueState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].blueState }}"
- name: "shelly_em3_fourGStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].fourGStatus }}"
- name: "shelly_em3_isShareFlag"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].isShareFlag }}"
- name: "shelly_em3_input"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].input }}"
- name: "shelly_em3_output"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].output }}"
- name: "shelly_em3_electricity"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].electricity }}"
- name: "shelly_em3_restState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].restState }}"
- name: "shelly_em3_upsMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].upsMode }}"
- name: "shelly_em3_upgradeStatusDes"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].upgradeStatusDes }}"
- name: "shelly_em3_productType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].productType }}"
- name: "shelly_em3_bindId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].bindId }}"
- name: "shelly_em3_bindStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].bindStatus }}"
- name: "shelly_em3_batteryCode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].batteryCode }}"
- name: "shelly_em3_inputPower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].inputPower }}"
- name: "shelly_em3_outputPower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].outputPower }}"
- name: "shelly_em3_slowChargePower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].slowChargePower }}"
- name: "shelly_em3_temperature"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].temperature }}"
- name: "shelly_em3_temperatureUnit"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].temperatureUnit }}"
- name: "shelly_em3_remainOutTime"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].remainOutTime }}"
- name: "shelly_em3_bindType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].bindType }}"
- name: "shelly_em3_seriesMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].seriesMode }}"
- name: "shelly_em3_parallelMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].parallelMode }}"
- name: "shelly_em3_networkType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].networkType }}"
- name: "shelly_em3_standard"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].standard }}"
- name: "shelly_em3_isSwitch"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].isSwitch }}"
- name: "shelly_em3_url"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].url }}"
- name: "shelly_em3_remainOil"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].remainOil }}"
- name: "shelly_em3_genMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].genMode }}"
- name: "shelly_em3_shortCode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].shortCode }}"
- name: "shelly_em3_phaseCheck"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].phaseCheck }}"
- name: "shelly_em3_pass"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].pass }}"
- name: "shelly_em3_clusterNotice"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].clusterNotice }}"
- name: "shelly_em3_nodeStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].nodeStatus }}"
- name: "shelly_em3_clusterId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].clusterId }}"
- name: "shelly_em3_phase"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].phase }}"
- name: "shelly_em3_reverseState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[0].reverseState }}"
# This is the second device in my case (AIO 2400)
- name: "aio2400_id"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].id }}"
- name: "aio2400_deviceKey"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].deviceKey }}"
- name: "aio2400_snNumber"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].snNumber }}"
- name: "aio2400_name"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].name }}"
- name: "aio2400_productId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].productId }}"
- name: "aio2400_productKey"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].productKey }}"
- name: "aio2400_onlineFlag"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].onlineFlag }}"
- name: "aio2400_productName"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].productName }}"
- name: "aio2400_wifiStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].wifiStatus }}"
- name: "aio2400_blueState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].blueState }}"
- name: "aio2400_fourGStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].fourGStatus }}"
- name: "aio2400_isShareFlag"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].isShareFlag }}"
- name: "aio2400_input"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].input }}"
- name: "aio2400_output"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].output }}"
- name: "aio2400_electricity"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].electricity }}"
- name: "aio2400_restState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].restState }}"
- name: "aio2400_upsMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].upsMode }}"
- name: "aio2400_upgradeStatusDes"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].upgradeStatusDes }}"
- name: "aio2400_productType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].productType }}"
- name: "aio2400_bindId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].bindId }}"
- name: "aio2400_bindStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].bindStatus }}"
- name: "aio2400_batteryCode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].batteryCode }}"
- name: "aio2400_inputPower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].inputPower }}"
- name: "aio2400_outputPower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].outputPower }}"
- name: "aio2400_slowChargePower"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].slowChargePower }}"
- name: "aio2400_temperature"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].temperature }}"
- name: "aio2400_temperatureUnit"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].temperatureUnit }}"
- name: "aio2400_remainOutTime"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].remainOutTime }}"
- name: "aio2400_bindType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].bindType }}"
- name: "aio2400_seriesMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].seriesMode }}"
- name: "aio2400_parallelMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].parallelMode }}"
- name: "aio2400_networkType"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].networkType }}"
- name: "aio2400_standard"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].standard }}"
- name: "aio2400_isSwitch"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].isSwitch }}"
- name: "aio2400_url"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].url }}"
- name: "aio2400_remainOil"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].remainOil }}"
- name: "aio2400_genMode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].genMode }}"
- name: "aio2400_shortCode"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].shortCode }}"
- name: "aio2400_phaseCheck"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].phaseCheck }}"
- name: "aio2400_pass"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].pass }}"
- name: "aio2400_clusterNotice"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].clusterNotice }}"
- name: "aio2400_nodeStatus"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].nodeStatus }}"
- name: "aio2400_clusterId"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].clusterId }}"
- name: "aio2400_phase"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].phase }}"
- name: "aio2400_reverseState"
state: "{{ state_attr('sensor.zendure_device_infos', 'data')[1].reverseState }}"
rest:
#This rest call fetches a bearer token with your log-in data. You should use another account. you can invite more guests in the app. If you don't do this, your app will log you out again and again
- resource: "https://app.zendure.tech/v2/auth/app/token"
method: POST
payload: '{"account": "[email protected]", "appType": "Android", "grantType": "password", "password": "yourZendureAppPasswort", "tenantId": ""}'
headers:
Content-Type: "application/json"
appVersion: "4.3.1"
sensor:
- name: "zendure_access_token"
value_template: "{{ value_json.data.accessToken }}"
json_attributes_path: $.data
json_attributes:
- accessToken
#This 1 hour is guessed! The bearer Token runs out after while
scan_interval: 3600 # this is 1 hour in seconds
#This rest call then uses your bearer tokens to retrieve the actual values from all (!) your devices. Not all are filled with values.
- resource: "https://app.zendure.tech/eu/productModule/device/queryDeviceListByConsumerId"
method: POST
headers:
Blade-Auth: "bearer {{ state_attr('sensor.zendure_access_token', 'accessToken') }}"
Content-Type: "application/json"
appVersion: "4.3.1"
sensor:
- name: "zendure_device_infos"
# value_template: "{{ value_json }}" #That was too big!!! 255 max characters! Therefore now saved as data
value_template: "{{ value_json.msg }}"
json_attributes:
- data
#The 20 seconds could also lead to the API being requested too often, but could also work without problems
scan_interval: 20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment