From 5b772985bb2f456ee18d5ca64fd6993edc98bae1 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 12 Sep 2020 17:52:41 +0200 Subject: [PATCH] merge dallas from #494, add mqtt response for raw telegrams, add read to root, watch-command flexible --- .../src/project/EMSESPSettingsController.tsx | 50 +++++++++---------- src/console.cpp | 23 +++++++-- src/emsesp.cpp | 20 ++++++++ src/emsesp.h | 1 + src/sensors.cpp | 11 ++-- src/telegram.cpp | 10 ++-- 6 files changed, 73 insertions(+), 42 deletions(-) diff --git a/interface/src/project/EMSESPSettingsController.tsx b/interface/src/project/EMSESPSettingsController.tsx index 631843ce0..e728a8356 100644 --- a/interface/src/project/EMSESPSettingsController.tsx +++ b/interface/src/project/EMSESPSettingsController.tsx @@ -184,6 +184,17 @@ function EMSESPSettingsControllerForm(props: EMSESPSettingsControllerFormProps) Syslog Settings + INFO DEBUG - {data.syslog_level !== -1 && - - - - - } + } variant="contained" color="primary" type="submit"> Save diff --git a/src/console.cpp b/src/console.cpp index 83eaa1bda..43e09f96e 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -244,6 +244,17 @@ void EMSESPShell::add_console_commands() { }); }); + commands->add_command(ShellContext::MAIN, + CommandFlags::ADMIN, + flash_string_vector{F_(read)}, + flash_string_vector{F_(deviceid_mandatory) ,F_(typeid_mandatory)}, + [=](Shell & shell __attribute__((unused)), const std::vector & arguments) { + uint8_t device_id = Helpers::hextoint(arguments.front().c_str()); + uint16_t type_id = Helpers::hextoint(arguments.back().c_str()); + EMSESP::set_read_id(type_id); + EMSESP::send_read_request(type_id, device_id); + }); + /* * add all the submenu contexts... */ @@ -397,7 +408,7 @@ void Console::load_standard_commands(unsigned int context) { flash_string_vector{F_(watch)}, flash_string_vector{F_(watch_format_optional), F_(watchid_optional)}, [](Shell & shell, const std::vector & arguments) { - uint16_t watch_id; + uint16_t watch_id = WATCH_ID_NONE; if (!arguments.empty()) { // get raw/pretty @@ -407,16 +418,16 @@ void Console::load_standard_commands(unsigned int context) { emsesp::EMSESP::watch(EMSESP::WATCH_ON); // on } else if (arguments[0] == read_flash_string(F_(off))) { emsesp::EMSESP::watch(EMSESP::WATCH_OFF); // off - } else { + } else if (emsesp::EMSESP::watch() == EMSESP::WATCH_OFF) { shell.printfln(F_(invalid_watch)); return; + } else { + watch_id = Helpers::hextoint(arguments[0].c_str()); } if (arguments.size() == 2) { // get the watch_id if its set watch_id = Helpers::hextoint(arguments[1].c_str()); - } else { - watch_id = WATCH_ID_NONE; } emsesp::EMSESP::watch_id(watch_id); @@ -440,7 +451,9 @@ void Console::load_standard_commands(unsigned int context) { } watch_id = emsesp::EMSESP::watch_id(); - if (watch_id != WATCH_ID_NONE) { + if (watch_id > 0x80) { + shell.printfln(F("Filtering only telegrams that match a telegram type of 0x%02X"), watch_id); + } else if (watch_id != WATCH_ID_NONE) { shell.printfln(F("Filtering only telegrams that match a device ID or telegram type of 0x%02X"), watch_id); } }); diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 0fa44f27c..ac4ed0dac 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -316,6 +316,25 @@ void EMSESP::publish_sensor_values(const bool force) { } } +void EMSESP::publish_response(std::shared_ptr telegram) { + StaticJsonDocument doc; + char buffer[100]; + doc["src"] = Helpers::hextoa(buffer, telegram->src); + doc["dest"] = Helpers::hextoa(buffer, telegram->dest); + doc["type"] = Helpers::hextoa(buffer, telegram->type_id); + doc["offset"] = Helpers::hextoa(buffer, telegram->offset); + strcpy(buffer, Helpers::data_to_hex(telegram->message_data, telegram->message_length).c_str()); + doc["data"] = buffer; + if (telegram->message_length <= 4) { + uint32_t value = 0; + for (uint8_t i = 0; i < telegram->message_length; i++) { + value = (value << 8) + telegram->message_data[i]; + } + doc["value"] = value; + } + Mqtt::publish("response", doc); +} + // search for recognized device_ids : Me, All, otherwise print hex value std::string EMSESP::device_tostring(const uint8_t device_id) { if ((device_id & 0x7F) == rxservice_.ems_bus_id()) { @@ -484,6 +503,7 @@ bool EMSESP::process_telegram(std::shared_ptr telegram) { // if watching... if (telegram->type_id == read_id_) { LOG_NOTICE(pretty_telegram(telegram).c_str()); + publish_response(telegram); read_id_ = WATCH_ID_NONE; } else if (watch() == WATCH_ON) { if ((watch_id_ == WATCH_ID_NONE) || (telegram->type_id == watch_id_) diff --git a/src/emsesp.h b/src/emsesp.h index 0f19d8701..479a4c35a 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -176,6 +176,7 @@ class EMSESP { static void process_UBADevices(std::shared_ptr telegram); static void process_version(std::shared_ptr telegram); + static void publish_response(std::shared_ptr telegram); static constexpr uint32_t EMS_FETCH_FREQUENCY = 60000; // check every minute static uint32_t last_fetch_; diff --git a/src/sensors.cpp b/src/sensors.cpp index 43d9efdcd..bdd08fa75 100644 --- a/src/sensors.cpp +++ b/src/sensors.cpp @@ -67,7 +67,7 @@ void Sensors::loop() { if (state_ == State::IDLE) { if (time_now - last_activity_ >= READ_INTERVAL_MS) { // LOG_DEBUG(F("Read sensor temperature")); // uncomment for debug - if (bus_.reset()) { + if (bus_.reset() || parasite_) { YIELD; bus_.skip(); bus_.write(CMD_CONVERT_TEMP, parasite_ ? 1 : 0); @@ -97,8 +97,9 @@ void Sensors::loop() { uint8_t addr[ADDR_LEN] = {0}; if (bus_.search(addr)) { - bus_.depower(); - + if (!parasite_) { + bus_.depower(); + } if (bus_.crc8(addr, ADDR_LEN - 1) == addr[ADDR_LEN - 1]) { switch (addr[0]) { case TYPE_DS18B20: @@ -125,7 +126,9 @@ void Sensors::loop() { LOG_ERROR(F("Invalid sensor %s"), Device(addr).to_string().c_str()); } } else { - bus_.depower(); + if (!parasite_) { + bus_.depower(); + } if ((found_.size() >= devices_.size()) || (retrycnt_ > 5)) { if (found_.size() == devices_.size()) { for (uint8_t i = 0; i < devices_.size(); i++) { diff --git a/src/telegram.cpp b/src/telegram.cpp index 92e16f0e5..7ae63d7eb 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -95,7 +95,7 @@ std::string Telegram::to_string() const { data[2] = this->type_id; length = 5; } - } else if (this->operation == Telegram::Operation::TX_WRITE) { + } else { data[1] = this->dest; if (this->type_id > 0xFF) { data[2] = 0xFF; @@ -109,10 +109,6 @@ std::string Telegram::to_string() const { for (uint8_t i = 0; i < this->message_length; i++) { data[length++] = this->message_data[i]; } - } else { - for (uint8_t i = 0; i < this->message_length; i++) { - data[length++] = this->message_data[i]; - } } return Helpers::data_to_hex(data, length); @@ -473,7 +469,9 @@ void TxService::add(uint8_t operation, const uint8_t * data, const uint8_t lengt operation = Telegram::Operation::TX_READ; } else { operation = Telegram::Operation::TX_WRITE; + set_post_send_query(type_id); } + EMSESP::set_read_id(type_id); } auto telegram = std::make_shared(operation, src, dest, type_id, offset, message_data, message_length); // operation is TX_WRITE or TX_READ @@ -536,7 +534,7 @@ void TxService::send_raw(const char * telegram_data) { return; // nothing to send } - add(Telegram::Operation::TX_RAW, data, count + 1); // add to Tx queue + add(Telegram::Operation::TX_RAW, data, count + 1, true); // add to front of Tx queue } // add last Tx to tx queue and increment count