mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-09 09:19:51 +03:00
DS18S20 fix, sensors right align with 1 decimal, telegram counter 32 bit
This commit is contained in:
@@ -286,7 +286,7 @@ void EMSESP::show_sensor_values(uuid::console::Shell & shell) {
|
||||
char valuestr[8] = {0}; // for formatting temp
|
||||
shell.printfln(F("Dallas temperature sensors:"));
|
||||
for (const auto & device : sensor_devices()) {
|
||||
shell.printfln(F(" ID: %s, Temperature: %s°C"), device.to_string().c_str(), Helpers::render_value(valuestr, device.temperature_c, 2));
|
||||
shell.printfln(F(" ID: %s, Temperature: %s°C"), device.to_string().c_str(), Helpers::render_value(valuestr, device.temperature_c, 1));
|
||||
}
|
||||
shell.println();
|
||||
}
|
||||
|
||||
@@ -183,27 +183,27 @@ float Sensors::get_temperature_c(const uint8_t addr[]) {
|
||||
|
||||
int16_t raw_value = ((int16_t)scratchpad[SCRATCHPAD_TEMP_MSB] << 8) | scratchpad[SCRATCHPAD_TEMP_LSB];
|
||||
|
||||
// Adjust based on device resolution
|
||||
int resolution = 9 + ((scratchpad[SCRATCHPAD_CONFIG] >> 5) & 0x3);
|
||||
switch (resolution) {
|
||||
case 9:
|
||||
raw_value &= ~0x1;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
raw_value &= ~0x3;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
raw_value &= ~0x7;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
break;
|
||||
if (addr[0] == TYPE_DS18S20) {
|
||||
raw_value = (raw_value << 3) + 12 - scratchpad[SCRATCHPAD_CNT_REM];
|
||||
} else {
|
||||
// Adjust based on device resolution
|
||||
int resolution = 9 + ((scratchpad[SCRATCHPAD_CONFIG] >> 5) & 0x3);
|
||||
switch (resolution) {
|
||||
case 9:
|
||||
raw_value &= ~0x7;
|
||||
break;
|
||||
case 10:
|
||||
raw_value &= ~0x3;
|
||||
break;
|
||||
case 11:
|
||||
raw_value &= ~0x1;
|
||||
break;
|
||||
case 12:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t raw = (raw_value * 625) / 100; // round to 0.01
|
||||
return (float)raw / 100;
|
||||
uint32_t raw = (raw_value * 625 + 500) / 1000; // round to 0.1
|
||||
return (float)raw / 10;
|
||||
#else
|
||||
return NAN;
|
||||
#endif
|
||||
@@ -254,7 +254,7 @@ void Sensors::publish_values() {
|
||||
StaticJsonDocument<100> doc;
|
||||
for (const auto & device : devices_) {
|
||||
char s[7]; // sensorrange -55.00 to 125.00
|
||||
doc["temp"] = Helpers::render_value(s, device.temperature_c, 2);
|
||||
doc["temp"] = Helpers::render_value(s, device.temperature_c, 1);
|
||||
char topic[60]; // sensors{1-n}
|
||||
strlcpy(topic, "sensor_", 50); // create topic, e.g. home/ems-esp/sensor_28-EA41-9497-0E03-5F
|
||||
strlcat(topic, device.to_string().c_str(), 60);
|
||||
@@ -264,20 +264,13 @@ void Sensors::publish_values() {
|
||||
return;
|
||||
}
|
||||
|
||||
// const size_t capacity = num_devices * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(num_devices);
|
||||
DynamicJsonDocument doc(100 * num_devices);
|
||||
uint8_t i = 1; // sensor count
|
||||
for (const auto & device : devices_) {
|
||||
char s[7];
|
||||
|
||||
if (mqtt_format_ == MQTT_format::CUSTOM) {
|
||||
doc[device.to_string()] = Helpers::render_value(s, device.temperature_c, 2);
|
||||
} else if (mqtt_format_ == MQTT_format::SINGLE) {
|
||||
doc["id"] = device.to_string();
|
||||
doc["temp"] = Helpers::render_value(s, device.temperature_c, 2);
|
||||
std::string topic(100, '\0');
|
||||
snprintf_P(&topic[0], 50, PSTR("sensor%d"), i);
|
||||
Mqtt::publish(topic, doc);
|
||||
doc[device.to_string()] = Helpers::render_value(s, device.temperature_c, 1);
|
||||
} else if ((mqtt_format_ == MQTT_format::NESTED) || (mqtt_format_ == MQTT_format::HA)) {
|
||||
// e.g. {"sensor1":{"id":"28-EA41-9497-0E03-5F","temp":"23.30"},"sensor2":{"id":"28-233D-9497-0C03-8B","temp":"24.0"}}
|
||||
char sensorID[10]; // sensor{1-n}
|
||||
@@ -285,7 +278,7 @@ void Sensors::publish_values() {
|
||||
strlcat(sensorID, Helpers::itoa(s, i), 10);
|
||||
JsonObject dataSensor = doc.createNestedObject(sensorID);
|
||||
dataSensor["id"] = device.to_string();
|
||||
dataSensor["temp"] = Helpers::render_value(s, device.temperature_c, 2);
|
||||
dataSensor["temp"] = Helpers::render_value(s, device.temperature_c, 1);
|
||||
}
|
||||
|
||||
// special for HA
|
||||
|
||||
@@ -74,12 +74,13 @@ class Sensors {
|
||||
static constexpr size_t SCRATCHPAD_TEMP_MSB = 1;
|
||||
static constexpr size_t SCRATCHPAD_TEMP_LSB = 0;
|
||||
static constexpr size_t SCRATCHPAD_CONFIG = 4;
|
||||
static constexpr size_t SCRATCHPAD_CNT_REM = 6;
|
||||
|
||||
// dallas chips
|
||||
static constexpr uint8_t TYPE_DS18B20 = 0x28;
|
||||
static constexpr uint8_t TYPE_DS18S20 = 0x10;
|
||||
static constexpr uint8_t TYPE_DS1822 = 0x22;
|
||||
static constexpr uint8_t TYPE_DS1825 = 0x3B;
|
||||
static constexpr uint8_t TYPE_DS1825 = 0x3B; // also DS1826
|
||||
|
||||
static constexpr uint32_t READ_INTERVAL_MS = 5000; // 5 seconds
|
||||
static constexpr uint32_t CONVERSION_MS = 1000; // 1 seconds
|
||||
|
||||
@@ -219,6 +219,7 @@ void RxService::add(uint8_t * data, uint8_t length) {
|
||||
// check if queue is full, if so remove top item to make space
|
||||
if (rx_telegrams_.size() >= MAX_RX_TELEGRAMS) {
|
||||
rx_telegrams_.pop_front();
|
||||
increment_telegram_error_count();
|
||||
}
|
||||
|
||||
rx_telegrams_.emplace_back(rx_telegram_id_++, std::move(telegram)); // add to queue
|
||||
|
||||
@@ -201,7 +201,7 @@ class RxService : public EMSbus {
|
||||
void loop();
|
||||
void add(uint8_t * data, uint8_t length);
|
||||
|
||||
uint16_t telegram_count() const {
|
||||
uint32_t telegram_count() const {
|
||||
return telegram_count_;
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ class RxService : public EMSbus {
|
||||
telegram_count_++;
|
||||
}
|
||||
|
||||
uint16_t telegram_error_count() const {
|
||||
uint32_t telegram_error_count() const {
|
||||
return telegram_error_count_;
|
||||
}
|
||||
|
||||
@@ -235,8 +235,8 @@ class RxService : public EMSbus {
|
||||
|
||||
private:
|
||||
uint8_t rx_telegram_id_ = 0; // queue counter
|
||||
uint16_t telegram_count_ = 0; // # Rx received
|
||||
uint16_t telegram_error_count_ = 0; // # Rx CRC errors
|
||||
uint32_t telegram_count_ = 0; // # Rx received
|
||||
uint32_t telegram_error_count_ = 0; // # Rx CRC errors
|
||||
std::shared_ptr<const Telegram> rx_telegram; // the incoming Rx telegram
|
||||
|
||||
std::list<QueuedRxTelegram> rx_telegrams_; // the Rx Queue
|
||||
@@ -288,7 +288,7 @@ class TxService : public EMSbus {
|
||||
telegram_last_post_send_query_ = type_id;
|
||||
}
|
||||
|
||||
uint16_t telegram_read_count() const {
|
||||
uint32_t telegram_read_count() const {
|
||||
return telegram_read_count_;
|
||||
}
|
||||
|
||||
@@ -300,7 +300,7 @@ class TxService : public EMSbus {
|
||||
telegram_read_count_++;
|
||||
}
|
||||
|
||||
uint16_t telegram_fail_count() const {
|
||||
uint32_t telegram_fail_count() const {
|
||||
return telegram_fail_count_;
|
||||
}
|
||||
|
||||
@@ -312,7 +312,7 @@ class TxService : public EMSbus {
|
||||
telegram_fail_count_++;
|
||||
}
|
||||
|
||||
uint16_t telegram_write_count() const {
|
||||
uint32_t telegram_write_count() const {
|
||||
return telegram_write_count_;
|
||||
}
|
||||
|
||||
@@ -355,9 +355,9 @@ class TxService : public EMSbus {
|
||||
private:
|
||||
std::list<QueuedTxTelegram> tx_telegrams_; // the Tx queue
|
||||
|
||||
uint16_t telegram_read_count_ = 0; // # Tx successful reads
|
||||
uint16_t telegram_write_count_ = 0; // # Tx successful writes
|
||||
uint16_t telegram_fail_count_ = 0; // # Tx unsuccessful transmits
|
||||
uint32_t telegram_read_count_ = 0; // # Tx successful reads
|
||||
uint32_t telegram_write_count_ = 0; // # Tx successful writes
|
||||
uint32_t telegram_fail_count_ = 0; // # Tx unsuccessful transmits
|
||||
|
||||
std::shared_ptr<Telegram> telegram_last_;
|
||||
uint16_t telegram_last_post_send_query_; // which type ID to query after a successful send, to read back the values just written
|
||||
|
||||
Reference in New Issue
Block a user