diff --git a/CHANGELOG.md b/CHANGELOG.md index f5fb0f15a..51ad02fa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,67 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# [3.5.0] February 6 2023 + +## **IMPORTANT! BREAKING CHANGES** + +- When upgrading to v3.5 for the first time from v3.4 on a BBQKees Gateway board you will need to use the [EMS-EPS Flasher](https://github.com/emsesp/EMS-ESP-Flasher/releases) to correctly re-partition the flash. Make sure you backup the settings and customizations from the WebUI (System->Upload/Download) and restore after the upgrade. + +## Added + +- Translations in Web UI and all device entity names (DE, NL, SV, PL, NO, FR) [#22](https://github.com/emsesp/EMS-ESP32/issues/22) +- Add support for Lolin C3 mini [#620](https://github.com/emsesp/EMS-ESP32/pull/620) +- Add support for ESP32-S2 [#667](https://github.com/emsesp/EMS-ESP32/pull/667) +- Add devices: Greenstar 30Ri boiler, Junkers FW500 thermostat, Buderus BC30 controller +- Add program memory info +- Add mqtt queue and connection infos +- Adapt min/max if ems-value is not in this range +- Add heat pump settings for inputs and limits [#600](https://github.com/emsesp/EMS-ESP32/issues/600) +- Add hybrid heatpump [#500](https://github.com/emsesp/EMS-ESP32/issues/500) +- Add translated tags +- Add min/max to customization table [#686](https://github.com/emsesp/EMS-ESP32/issues/686) +- Add MD5 check [#637](https://github.com/emsesp/EMS-ESP32/issues/637) +- Add more bus-ids [#673](https://github.com/emsesp/EMS-ESP32/issues/673) +- Use HA connectivity device class for Status, added boot time [#751](https://github.com/emsesp/EMS-ESP32/issues/751) +- Add commands for analog sensors outputs +- Support for multiple EMS-ESPs with MQTT and HA [[#759](https://github.com/emsesp/EMS-ESP32/issues/759)] +- Settings for heatpump silent mode and additional heater [[#802](https://github.com/emsesp/EMS-ESP32/issues/802)] [[#803](https://github.com/emsesp/EMS-ESP32/issues/803)] +- Zone module MZ100 [#826](https://github.com/emsesp/EMS-ESP32/issues/826) +- Default MQTT hostname is blank [#829](https://github.com/emsesp/EMS-ESP32/issues/829) +- wwCurFlow for ems+ devices [#829](https://github.com/emsesp/EMS-ESP32/issues/829) +- Add Rego 3000, TR120RF thermostats [#917](https://github.com/emsesp/EMS-ESP32/issues/917) +- Add config for ESP32-S3 +- Add heatpump silent mode and other entities [#896](https://github.com/emsesp/EMS-ESP32/issues/896) +- Allow reboot to other partition (factory or asymetric OTA) +- Blacklist entities to remove from memory [#891](https://github.com/emsesp/EMS-ESP32/issues/891) +- Add boiler pump operating mode [#944](https://github.com/emsesp/EMS-ESP32/issues/944) + +## Fixed + +- Factory Reset not working [#628](https://github.com/emsesp/EMS-ESP32/issues/628) +- Valid 4 byte values [#820](https://github.com/emsesp/EMS-ESP32/issues/820) +- Commands for multiple thermostats [#826](https://github.com/emsesp/EMS-ESP32/issues/826) +- API queries for multiple devices [#865](https://github.com/emsesp/EMS-ESP32/issues/865) +- Console crash when using call with command `hcx` only. [#841](https://github.com/emsesp/EMS-ESP32/issues/841) +- `heatingPump2Mod` was wrong, changed to absBurnPow [[#908](https://github.com/emsesp/EMS-ESP32/issues/908) +- Rounding of web input values +- Analog sensor with single gpio number [#915](https://github.com/emsesp/EMS-ESP32/issues/915) +- HA dallas and analog configs: remove/rebuild on change [#888](https://github.com/emsesp/EMS-ESP32/issues/888) +- Modes and set seltemp for RC30 and RC20 [#932](https://github.com/emsesp/EMS-ESP32/issues/932) + +## Changed + +- Discovery in HomeAssistant don't work with custom base topic. [#596](https://github.com/emsesp/EMS-ESP32/issues/596) Base topic containing `/` are changed to `_` +- RF room temperature sensor are shown as thermostat +- Render mqtt float json values with trailing zero +- Removed flash strings, to increase available heap memory +- Reload page after restart button is pressed +- Analog/dallas values command as list like ems-devices +- Analog/dallas HA-entities based on id +- MQTT Base is a mandatory field. Removed MQTT topic length from settings +- HA duration class for time entities [[#822](https://github.com/emsesp/EMS-ESP32/issues/822) +- AM200 alternative heatsource as class heatsource [[#857](https://github.com/emsesp/EMS-ESP32/issues/857) + # [3.4.2] September 18 2022 ## Added diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b63843a33..ab1e58895 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -1,61 +1,11 @@ # Changelog -# [3.5.0] +# [3.6.0] ## **IMPORTANT! BREAKING CHANGES** -- When upgrading to v3.5 for the first time from v3.4 on a BBQKees Gateway board you will need to use the [EMS-EPS Flasher](https://github.com/emsesp/EMS-ESP-Flasher/releases) to correctly re-partition the flash. Make sure you backup the settings and customizations from the WebUI (System->Upload/Download) and restore after the upgrade. - ## Added -- Translations in Web UI and all device entity names (DE, NL, SV, PL, NO, FR) [#22](https://github.com/emsesp/EMS-ESP32/issues/22) -- Add support for Lolin C3 mini [#620](https://github.com/emsesp/EMS-ESP32/pull/620) -- Add support for ESP32-S2 [#667](https://github.com/emsesp/EMS-ESP32/pull/667) -- Add devices: Greenstar 30Ri boiler, Junkers FW500 thermostat, Buderus BC30 controller -- Add program memory info -- Add mqtt queue and connection infos -- Adapt min/max if ems-value is not in this range -- Add heat pump settings for inputs and limits [#600](https://github.com/emsesp/EMS-ESP32/issues/600) -- Add hybrid heatpump [#500](https://github.com/emsesp/EMS-ESP32/issues/500) -- Add translated tags -- Add min/max to customization table [#686](https://github.com/emsesp/EMS-ESP32/issues/686) -- Add MD5 check [#637](https://github.com/emsesp/EMS-ESP32/issues/637) -- Add more bus-ids [#673](https://github.com/emsesp/EMS-ESP32/issues/673) -- Use HA connectivity device class for Status, added boot time [#751](https://github.com/emsesp/EMS-ESP32/issues/751) -- Add commands for analog sensors outputs -- Support for multiple EMS-ESPs with MQTT and HA [[#759](https://github.com/emsesp/EMS-ESP32/issues/759)] -- Settings for heatpump silent mode and additional heater [[#802](https://github.com/emsesp/EMS-ESP32/issues/802)] [[#803](https://github.com/emsesp/EMS-ESP32/issues/803)] -- Zone module MZ100 [#826](https://github.com/emsesp/EMS-ESP32/issues/826) -- Default MQTT hostname is blank [#829](https://github.com/emsesp/EMS-ESP32/issues/829) -- wwCurFlow for ems+ devices [#829](https://github.com/emsesp/EMS-ESP32/issues/829) -- Add Rego 3000, TR120RF thermostats [#917](https://github.com/emsesp/EMS-ESP32/issues/917) -- Add config for ESP32-S3 -- Add heatpump silent mode and other entities [#896](https://github.com/emsesp/EMS-ESP32/issues/896) -- Allow reboot to other partition (factory or asymetric OTA) -- Blacklist entities to remove from memory [#891](https://github.com/emsesp/EMS-ESP32/issues/891) - ## Fixed -- Factory Reset not working [#628](https://github.com/emsesp/EMS-ESP32/issues/628) -- Valid 4 byte values [#820](https://github.com/emsesp/EMS-ESP32/issues/820) -- Commands for multiple thermostats [#826](https://github.com/emsesp/EMS-ESP32/issues/826) -- API queries for multiple devices [#865](https://github.com/emsesp/EMS-ESP32/issues/865) -- Console crash when using call with command `hcx` only. [#841](https://github.com/emsesp/EMS-ESP32/issues/841) -- `heatingPump2Mod` was wrong, changed to absBurnPow [[#908](https://github.com/emsesp/EMS-ESP32/issues/908) -- Rounding of web input values -- Analog sensor with single gpio number [#915](https://github.com/emsesp/EMS-ESP32/issues/915) -- HA dallas and analog configs: remove/rebuild on change [#888](https://github.com/emsesp/EMS-ESP32/issues/888) -- Modes and set seltemp for RC30 and RC20 [#932](https://github.com/emsesp/EMS-ESP32/issues/932) - ## Changed - -- Discovery in HomeAssistant don't work with custom base topic. [#596](https://github.com/emsesp/EMS-ESP32/issues/596) Base topic containing `/` are changed to `_` -- RF room temperature sensor are shown as thermostat -- Render mqtt float json values with trailing zero -- Removed flash strings, to increase available heap memory -- Reload page after restart button is pressed -- Analog/dallas values command as list like ems-devices -- Analog/dallas HA-entities based on id -- MQTT Base is a mandatory field. Removed MQTT topic length from settings -- HA duration class for time entities [[#822](https://github.com/emsesp/EMS-ESP32/issues/822) -- AM200 alternative heatsource as class heatsource [[#857](https://github.com/emsesp/EMS-ESP32/issues/857) diff --git a/interface/.typesafe-i18n.json b/interface/.typesafe-i18n.json index fd00af250..430f417fc 100644 --- a/interface/.typesafe-i18n.json +++ b/interface/.typesafe-i18n.json @@ -1,5 +1,5 @@ { - "adapter": "react", - "baseLocale": "pl", - "$schema": "https://unpkg.com/typesafe-i18n@5.24.0/schema/typesafe-i18n.json" -} + "adapter": "react", + "baseLocale": "pl", + "$schema": "https://unpkg.com/typesafe-i18n@5.24.0/schema/typesafe-i18n.json" +} \ No newline at end of file diff --git a/interface/package-lock.json b/interface/package-lock.json index a7a077b63..d1a9592b1 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -29,7 +29,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-icons": "^4.7.1", - "react-router-dom": "^6.8.0", + "react-router-dom": "^6.8.1", "react-scripts": "^5.0.1", "sockette": "^2.0.6", "typesafe-i18n": "^5.24.0", @@ -3449,9 +3449,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz", - "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", "engines": { "node": ">=14" } @@ -14885,11 +14885,11 @@ } }, "node_modules/react-router": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz", - "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", "dependencies": { - "@remix-run/router": "1.3.1" + "@remix-run/router": "1.3.2" }, "engines": { "node": ">=14" @@ -14899,12 +14899,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz", - "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", "dependencies": { - "@remix-run/router": "1.3.1", - "react-router": "6.8.0" + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" }, "engines": { "node": ">=14" @@ -20210,9 +20210,9 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@remix-run/router": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz", - "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -28368,20 +28368,20 @@ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz", - "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", "requires": { - "@remix-run/router": "1.3.1" + "@remix-run/router": "1.3.2" } }, "react-router-dom": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz", - "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", "requires": { - "@remix-run/router": "1.3.1", - "react-router": "6.8.0" + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" } }, "react-scripts": { diff --git a/interface/package.json b/interface/package.json index 4e6e70d12..e96a45d9b 100644 --- a/interface/package.json +++ b/interface/package.json @@ -29,7 +29,7 @@ "typesafe-i18n": "^5.24.0", "typescript": "^4.9.5", "axios": "^1.3.2", - "react-router-dom": "^6.8.0" + "react-router-dom": "^6.8.1" }, "scripts": { "start": "react-app-rewired start", diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 16ad14bf4..8ad7f0913 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -157,6 +157,8 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const MAKE_CF_CB(set_heating_temp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMax_, DeviceValueType::UINT, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMin_, DeviceValueType::UINT, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &pumpMode_, DeviceValueType::ENUM, FL_(enum_pumpMode), FL_(pumpMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_pumpMode)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpDelay_, DeviceValueType::UINT, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnMinPeriod_, @@ -941,6 +943,7 @@ void Boiler::process_UBAParameters(std::shared_ptr telegram) { has_update(telegram, pumpDelay_, 8); has_update(telegram, pumpModMax_, 9); has_update(telegram, pumpModMin_, 10); + has_update(telegram, pumpMode_, 11); has_update(telegram, boil2HystOff_, 12); has_update(telegram, boil2HystOn_, 13); } @@ -1916,6 +1919,15 @@ bool Boiler::set_max_pump(const char * value, const int8_t id) { return true; } +bool Boiler::set_pumpMode(const char * value, const int8_t id) { + uint8_t v; + if (Helpers::value2enum(value, v, FL_(enum_pumpMode))) { + write_command(EMS_TYPE_UBAParameters, 11, v, EMS_TYPE_UBAParameters); + return true; + } + return false; +} + // set boiler on hysteresis bool Boiler::set_hyst_on(const char * value, const int8_t id) { int v; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index fc1a906ac..b8f5de33e 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -121,6 +121,7 @@ class Boiler : public EMSdevice { uint8_t heatingTemp_; // Heating temperature setting on the boiler uint8_t pumpModMax_; // Boiler circuit pump modulation max. power % uint8_t pumpModMin_; // Boiler circuit pump modulation min. power + uint8_t pumpMode_; // pump setting proportional/deltaP uint8_t pumpDelay_; uint8_t burnMinPeriod_; uint8_t burnMinPower_; @@ -331,6 +332,7 @@ class Boiler : public EMSdevice { bool set_max_power(const char * value, const int8_t id); bool set_min_pump(const char * value, const int8_t id); bool set_max_pump(const char * value, const int8_t id); + bool set_pumpMode(const char * value, const int8_t id); bool set_hyst_on(const char * value, const int8_t id); bool set_hyst_off(const char * value, const int8_t id); inline bool set_hyst2_on(const char * value, const int8_t id) { diff --git a/src/locale_common.h b/src/locale_common.h index d0e3e3484..b9b56b0bc 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -249,6 +249,7 @@ MAKE_PSTR_ENUM(enum_comfort2, FL_(eco), FL_(high_comfort)) MAKE_PSTR_ENUM(enum_flow, FL_(off), FL_(flow), FL_(bufferedflow), FL_(buffer), FL_(layeredbuffer)) MAKE_PSTR_ENUM(enum_reset, FL_(dash), FL_(maintenance), FL_(error)) MAKE_PSTR_ENUM(enum_maxHeat, FL_(0kW), FL_(2kW), FL_(3kW), FL_(4kW), FL_(6kW), FL_(9kW)) +MAKE_PSTR_ENUM(enum_pumpMode, FL_(proportional), FL_(deltaP1), FL_(deltaP2), FL_(deltaP3), FL_(deltaP4)) // thermostat lists MAKE_PSTR_ENUM(enum_ibaMainDisplay, FL_(internal_temperature), FL_(internal_setpoint), FL_(external_temperature), FL_(burner_temperature), FL_(ww_temperature), FL_(functioning_mode), FL_(time), FL_(date), FL_(smoke_temperature)) diff --git a/src/locale_translations.h b/src/locale_translations.h index bf5e83d39..8d4bb343e 100644 --- a/src/locale_translations.h +++ b/src/locale_translations.h @@ -183,6 +183,12 @@ MAKE_PSTR_LIST(disinfecting, "disinfecting", "Desinfizieren", "Desinfecteren", " MAKE_PSTR_LIST(no_heat, "no heat", "keine Wärme", "Geen warmte", "Ingen värme", "brak ciepła", "ingen varme", "pas de chauffage") MAKE_PSTR_LIST(heatrequest, "heat request", "Wärmeanforderung", "Verwarmignsverzoek", "Värmeförfrågan", "zapotrzebowanie na ciepło", "varmeforespørsel", "demande de chauffage") MAKE_PSTR_LIST(valve, "valve", "Ventil", "Klep", "Ventil", "zawór", "ventil", "valve") +MAKE_PSTR_LIST(proportional, "proportional", "", "", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(deltaP1, "deltaP-1", "", "", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(deltaP2, "deltaP-2", "", "", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(deltaP3, "deltaP-3", "", "", "", "", "", "", "") // TODO translate +MAKE_PSTR_LIST(deltaP4, "deltaP-4", "", "", "", "", "", "", "") // TODO translate + // heatpump MAKE_PSTR_LIST(none, "none", "keine", "geen", "ingen", "brak", "ingen", "aucun") @@ -316,6 +322,7 @@ MAKE_PSTR_LIST(maintenanceType, "maintenance", "maintenance scheduled", "Wartung MAKE_PSTR_LIST(maintenanceTime, "maintenancetime", "time to next maintenance", "Wartung in", "Onderhoud in", "Tid till nästa underhall", "czas do kolejnego przeglądu", "vedlikeholdstid", "durée avant la prochaine maintenance") MAKE_PSTR_LIST(emergencyOps, "emergencyops", "emergency operation", "Notoperation", "Noodoperatie", "Nöddrift", "praca w trybie awaryjnym", "nøddrift", "opération d'urgence") MAKE_PSTR_LIST(emergencyTemp, "emergencytemp", "emergency temperature", "Nottemperatur", "Noodtemperatuur", "Nöddrift temperatur", "temperatura w trybie awaryjnym", "nødtemperatur", "température d'urgence") +MAKE_PSTR_LIST(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpen Modus", "", "", "", "", "") // TODO translate // heatpump/compress specific MAKE_PSTR_LIST(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "", "durée totale de fonctionnement chauffage") // TODO translate