Merge pull request #2178 from MichaelDvP/dev

add commands for shower, small fixes
This commit is contained in:
Proddy
2024-11-06 08:50:11 +01:00
committed by GitHub
8 changed files with 111 additions and 17 deletions

View File

@@ -135,11 +135,27 @@ const char * EMSdevice::device_type_2_device_name(const uint8_t device_type) {
case DeviceType::GATEWAY: case DeviceType::GATEWAY:
return F_(gateway); return F_(gateway);
case DeviceType::SWITCH: case DeviceType::SWITCH:
return F_(switch); return F_(switcher);
case DeviceType::CONTROLLER : return F_(controller); case DeviceType::CONNECT : return F_(connect); case DeviceType::ALERT : return F_(alert); case DeviceType::CONTROLLER:
case DeviceType::EXTENSION : return F_(extension); case DeviceType::GENERIC : return F_(generic); return F_(controller);
case DeviceType::HEATSOURCE : return F_(heatsource); case DeviceType::VENTILATION : return F_(ventilation); case DeviceType::CONNECT:
case DeviceType::WATER : return F_(water); case DeviceType::POOL : return F_(pool); default : return Helpers::translated_word(FL_(unknown), true); return F_(connect);
case DeviceType::ALERT:
return F_(alert);
case DeviceType::EXTENSION:
return F_(extension);
case DeviceType::GENERIC:
return F_(generic);
case DeviceType::HEATSOURCE:
return F_(heatsource);
case DeviceType::VENTILATION:
return F_(ventilation);
case DeviceType::WATER:
return F_(water);
case DeviceType::POOL:
return F_(pool);
default:
return Helpers::translated_word(FL_(unknown), true);
} }
} }
@@ -217,23 +233,47 @@ uint8_t EMSdevice::device_name_2_device_type(const char * topic) {
if (!strcmp(lowtopic, F_(mixer))) { if (!strcmp(lowtopic, F_(mixer))) {
return DeviceType::MIXER; return DeviceType::MIXER;
} }
if (!strcmp(lowtopic, F_(switch))) { if (!strcmp(lowtopic, F_(switcher))) {
return DeviceType::SWITCH; return DeviceType::SWITCH;
} }
if (!strcmp(lowtopic, F_(gateway))) { return DeviceType::GATEWAY; } if (!strcmp(lowtopic, F_(alert))) { if (!strcmp(lowtopic, F_(gateway))) {
return DeviceType::GATEWAY;
}
if (!strcmp(lowtopic, F_(alert))) {
return DeviceType::ALERT; return DeviceType::ALERT;
} if (!strcmp(lowtopic, F_(extension))) { return DeviceType::EXTENSION; } if (!strcmp(lowtopic, F_(heatsource))) { }
if (!strcmp(lowtopic, F_(extension))) {
return DeviceType::EXTENSION;
}
if (!strcmp(lowtopic, F_(heatsource))) {
return DeviceType::HEATSOURCE; return DeviceType::HEATSOURCE;
} if (!strcmp(lowtopic, F_(ventilation))) { return DeviceType::VENTILATION; } if (!strcmp(lowtopic, F_(water))) { }
if (!strcmp(lowtopic, F_(ventilation))) {
return DeviceType::VENTILATION;
}
if (!strcmp(lowtopic, F_(water))) {
return DeviceType::WATER; return DeviceType::WATER;
} if (!strcmp(lowtopic, F_(pool))) { return DeviceType::POOL; } }
if (!strcmp(lowtopic, F_(pool))) {
return DeviceType::POOL;
}
// non EMS // non EMS
if (!strcmp(lowtopic, F_(custom))) { return DeviceType::CUSTOM; } if (!strcmp(lowtopic, F_(temperaturesensor))) { if (!strcmp(lowtopic, F_(custom))) {
return DeviceType::CUSTOM;
}
if (!strcmp(lowtopic, F_(temperaturesensor))) {
return DeviceType::TEMPERATURESENSOR; return DeviceType::TEMPERATURESENSOR;
} if (!strcmp(lowtopic, F_(analogsensor))) { return DeviceType::ANALOGSENSOR; } if (!strcmp(lowtopic, F_(scheduler))) { }
if (!strcmp(lowtopic, F_(analogsensor))) {
return DeviceType::ANALOGSENSOR;
}
if (!strcmp(lowtopic, F_(scheduler))) {
return DeviceType::SCHEDULER; return DeviceType::SCHEDULER;
} if (!strcmp(lowtopic, F_(system))) { return DeviceType::SYSTEM; } }
if (!strcmp(lowtopic, F_(system))) {
return DeviceType::SYSTEM;
}
return DeviceType::UNKNOWN; return DeviceType::UNKNOWN;
} }

View File

@@ -48,6 +48,8 @@ MAKE_WORD(send)
MAKE_WORD(telegram) MAKE_WORD(telegram)
MAKE_WORD(bus_id) MAKE_WORD(bus_id)
MAKE_WORD(tx_mode) MAKE_WORD(tx_mode)
MAKE_WORD(showertimer)
MAKE_WORD(showeralert)
MAKE_WORD(ems) MAKE_WORD(ems)
MAKE_WORD(devices) MAKE_WORD(devices)
MAKE_WORD(shower) MAKE_WORD(shower)
@@ -88,7 +90,7 @@ MAKE_WORD(coldshot)
// device types - lowercase, used in MQTT // device types - lowercase, used in MQTT
MAKE_WORD(boiler) MAKE_WORD(boiler)
MAKE_WORD(thermostat) MAKE_WORD(thermostat)
MAKE_WORD(switch) MAKE_WORD_CUSTOM(switcher, "switch")
MAKE_WORD(solar) MAKE_WORD(solar)
MAKE_WORD(mixer) MAKE_WORD(mixer)
MAKE_WORD(gateway) MAKE_WORD(gateway)

View File

@@ -79,6 +79,8 @@ MAKE_WORD_TRANSLATION(commands_response, "get response", "Hole Antwort", "Verzoe
MAKE_WORD_TRANSLATION(coldshot_cmd, "send a cold shot of water", "Zugabe einer Menge kalten Wassers", "", "", "uruchom tryśnięcie zimnej wody", "", "", "soğuk su gönder", "", "pošlite studenú dávku vody", "poslat studenou vodu") // TODO translate MAKE_WORD_TRANSLATION(coldshot_cmd, "send a cold shot of water", "Zugabe einer Menge kalten Wassers", "", "", "uruchom tryśnięcie zimnej wody", "", "", "soğuk su gönder", "", "pošlite studenú dávku vody", "poslat studenou vodu") // TODO translate
MAKE_WORD_TRANSLATION(message_cmd, "send a message", "Eine Nachricht senden", "", "", "", "", "", "", "", "poslať správu", "odeslat zprávu") // TODO translate MAKE_WORD_TRANSLATION(message_cmd, "send a message", "Eine Nachricht senden", "", "", "", "", "", "", "", "poslať správu", "odeslat zprávu") // TODO translate
MAKE_WORD_TRANSLATION(values_cmd, "list all values", "Liste alle Werte auf", "", "", "", "", "", "", "", "vypísať všetky hodnoty", "vypsat všechny hodnoty") // TODO translate MAKE_WORD_TRANSLATION(values_cmd, "list all values", "Liste alle Werte auf", "", "", "", "", "", "", "", "vypísať všetky hodnoty", "vypsat všechny hodnoty") // TODO translate
MAKE_WORD_TRANSLATION(showertimer_cmd, "enable shower timer", "aktiviere Duschzeitmessung", "", "", "", "", "", "", "", "", "") // TODO translate
MAKE_WORD_TRANSLATION(showeralert_cmd, "enable shower alert", "aktiviere Duschzeitwarnung", "", "", "", "", "", "", "", "", "") // TODO translate
// tags // tags
MAKE_WORD_TRANSLATION(tag_hc1, "hc1", "HK1", "hc1", "VK1", "OG1", "hc1", "hc1", "ID1", "hc1", "hc1", "hc1") MAKE_WORD_TRANSLATION(tag_hc1, "hc1", "HK1", "hc1", "VK1", "OG1", "hc1", "hc1", "ID1", "hc1", "hc1", "hc1")

View File

@@ -984,6 +984,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
break; break;
default: default:
// plain old sensor // plain old sensor
snprintf(topic, sizeof(topic), "sensor/%s", config_topic);
break; break;
} }
} else { } else {

View File

@@ -51,6 +51,48 @@ void Shower::start() {
FL_(coldshot_cmd), FL_(coldshot_cmd),
CommandFlag::ADMIN_ONLY); CommandFlag::ADMIN_ONLY);
Command::add(
EMSdevice::DeviceType::SYSTEM,
F_(showertimer),
[&](const char * value, const int8_t id, JsonObject output) {
bool b;
if (!Helpers::value2bool(value, b)) {
return false;
}
shower_timer_ = b;
EMSESP::webSettingsService.update([&](WebSettings & settings) {
if (settings.shower_timer != b) {
settings.shower_timer = b;
return StateUpdateResult::CHANGED;
}
return StateUpdateResult::UNCHANGED;
});
return true;
},
FL_(showertimer_cmd),
CommandFlag::ADMIN_ONLY);
Command::add(
EMSdevice::DeviceType::SYSTEM,
F_(showeralert),
[&](const char * value, const int8_t id, JsonObject output) {
bool b;
if (!Helpers::value2bool(value, b)) {
return false;
}
shower_alert_ = b;
EMSESP::webSettingsService.update([&](WebSettings & settings) {
if (settings.shower_alert != b) {
settings.shower_alert = b;
return StateUpdateResult::CHANGED;
}
return StateUpdateResult::UNCHANGED;
});
return true;
},
FL_(showeralert_cmd),
CommandFlag::ADMIN_ONLY);
if (shower_timer_) { if (shower_timer_) {
set_shower_state(false, true); // turns shower to off and creates HA topic if not already done set_shower_state(false, true); // turns shower to off and creates HA topic if not already done
} }

View File

@@ -148,7 +148,7 @@ void RxService::add(uint8_t * data, uint8_t length) {
// validate the CRC. if it fails then increment the number of corrupt/incomplete telegrams and only report to console/syslog // validate the CRC. if it fails then increment the number of corrupt/incomplete telegrams and only report to console/syslog
uint8_t crc = calculate_crc(data, length - 1); uint8_t crc = calculate_crc(data, length - 1);
if (data[length - 1] != crc) { if (data[length - 1] != crc) {
if ((data[0] & 0x7F) != ems_bus_id()) { // do not count echos as errors if (data[0] != EMSuart::last_tx_src()) { // do not count echos as errors
telegram_error_count_++; telegram_error_count_++;
LOG_WARNING("Incomplete Rx: %s", Helpers::data_to_hex(data, length).c_str()); // include CRC LOG_WARNING("Incomplete Rx: %s", Helpers::data_to_hex(data, length).c_str()); // include CRC
} else { } else {

View File

@@ -31,6 +31,7 @@
#include "emsesp.h" #include "emsesp.h"
namespace emsesp { namespace emsesp {
uint8_t EMSuart::last_tx_src_ = 0;
static QueueHandle_t uart_queue; static QueueHandle_t uart_queue;
uint8_t tx_mode_ = 0xFF; uint8_t tx_mode_ = 0xFF;
@@ -144,6 +145,8 @@ uint16_t EMSuart::transmit(const uint8_t * buf, const uint8_t len) {
return EMS_TX_STATUS_OK; return EMS_TX_STATUS_OK;
} }
last_tx_src_ = len < 4 ? 0 : buf[0];
if (tx_mode_ == EMS_TXMODE_HW) { // hardware controlled mode if (tx_mode_ == EMS_TXMODE_HW) { // hardware controlled mode
uart_write_bytes_with_break(EMSUART_NUM, buf, len, 10); uart_write_bytes_with_break(EMSUART_NUM, buf, len, 10);
return EMS_TX_STATUS_OK; return EMS_TX_STATUS_OK;

View File

@@ -65,10 +65,14 @@ class EMSuart {
static void send_poll(const uint8_t data); static void send_poll(const uint8_t data);
static void stop(); static void stop();
static uint16_t transmit(const uint8_t * buf, const uint8_t len); static uint16_t transmit(const uint8_t * buf, const uint8_t len);
static uint8_t last_tx_src() {
return last_tx_src_;
}
private: private:
static void IRAM_ATTR uart_gen_break(uint32_t length_us); static void IRAM_ATTR uart_gen_break(uint32_t length_us);
static void uart_event_task(void * pvParameters); static void uart_event_task(void * pvParameters);
static uint8_t last_tx_src_;
}; };
} // namespace emsesp } // namespace emsesp