merged in Dallas changes from JewelZB

This commit is contained in:
proddy
2019-03-15 21:12:00 +01:00
parent 5df9f14494
commit d3885f735d
5 changed files with 73 additions and 13 deletions

View File

@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- system command to show ESP stats
- crash command to see stack of last system crash, with .py files to track stack dump
- publish dallas external temp sensors to MQTT (Thanks @JewelZB)
### Fixed

View File

@@ -25,10 +25,11 @@ DS18::~DS18() {
}
// init
uint8_t DS18::setup(uint8_t gpio) {
uint8_t DS18::setup(uint8_t gpio, bool parasite) {
uint8_t count;
_gpio = gpio;
_gpio = gpio;
_parasite = (parasite ? 1 : 0);
// OneWire
if (_wire)
@@ -62,8 +63,7 @@ void DS18::loop() {
// Start conversion
_wire->reset();
_wire->skip();
_wire->write(DS18_CMD_START_CONVERSION, DS18_PARASITE);
_wire->write(DS18_CMD_START_CONVERSION, _parasite);
} else {
// Read scratchpads
for (unsigned char index = 0; index < _devices.size(); index++) {
@@ -161,7 +161,7 @@ double DS18::getValue(unsigned char index) {
uint8_t * data = _devices[index].data;
if (OneWire::crc8(data, DS18_DATA_SIZE - 1) != data[DS18_DATA_SIZE - 1]) {
return 0;
return DS18_CRC_ERROR;
}
int16_t raw = (data[1] << 8) | data[0];
@@ -182,9 +182,6 @@ double DS18::getValue(unsigned char index) {
}
double value = (float)raw / 16.0;
if (value == DS18_DISCONNECTED) {
return 0;
}
return value;
}

View File

@@ -20,8 +20,8 @@
#define DS18_CHIP_DS1825 0x3B
#define DS18_DATA_SIZE 9
#define DS18_PARASITE 1
#define DS18_DISCONNECTED -127
#define DS18_CRC_ERROR -126
#define GPIO_NONE 0x99
#define DS18_READ_INTERVAL 2000 // Force sensor read & cache every 2 seconds
@@ -39,7 +39,7 @@ class DS18 {
DS18();
~DS18();
uint8_t setup(uint8_t gpio);
uint8_t setup(uint8_t gpio, bool parasite);
void loop();
char * getDeviceString(char * s, unsigned char index);
double getValue(unsigned char index);
@@ -50,6 +50,7 @@ class DS18 {
uint8_t loadDevices();
OneWire * _wire;
uint8_t _count; // # devices
uint8_t _gpio; // the sensor pin
uint8_t _count; // # devices
uint8_t _gpio; // the sensor pin
uint8_t _parasite; // parasite mode
};

View File

@@ -35,6 +35,9 @@ DS18 ds18;
#define PUBLISHVALUES_TIME 120 // every 2 minutes publish MQTT values
Ticker publishValuesTimer;
#define PUBLISHSENSORVALUES_TIME 180 // every 3 minutes publish MQTT sensor values
Ticker publishSensorValuesTimer;
#define SYSTEMCHECK_TIME 20 // every 20 seconds check if Boiler is online
Ticker systemCheckTimer;
@@ -67,6 +70,7 @@ typedef struct {
uint8_t dallas_sensors; // count of dallas sensors
uint8_t led_gpio;
uint8_t dallas_gpio;
uint8_t dallas_parasite;
} _EMSESP_Status;
typedef struct {
@@ -414,6 +418,32 @@ void showInfo() {
}
}
// send all dallas sensor values as a JSON package to MQTT
void publishSensorValues() {
StaticJsonDocument<MQTT_MAX_SIZE> doc;
bool hasdata = false;
// see if the sensor values have changed, if so send
//JsonObject & sensors = jsonBuffer.createObject();
JsonObject sensors = doc.to<JsonObject>();
for (uint8_t i = 0; i < EMSESP_Status.dallas_sensors; i++) {
double sensorValue = ds18.getValue(i);
if(sensorValue != DS18_DISCONNECTED && sensorValue != DS18_CRC_ERROR) {
char label[8] = {0};
char valuestr[8] = {0}; // for formatting temp
sprintf(label,"temp_%d",(i+1));
sensors[label] = _float_to_char(valuestr, sensorValue);
hasdata = true;
}
}
if (hasdata) {
char data[MQTT_MAX_SIZE] = {0};
serializeJson(doc, data, sizeof(data));
myESP.mqttPublish(TOPIC_EXTERNAL_SENSORS, data);
}
}
// send values via MQTT
// a json object is created for the boiler and one for the thermostat
// CRC check is done to see if there are changes in the values since the last send to avoid too much wifi traffic
@@ -607,6 +637,11 @@ bool FSCallback(MYESP_FSACTION action, const JsonObject json) {
EMSESP_Status.dallas_gpio = EMSESP_DALLAS_GPIO; // default value
}
// dallas_gpio
if (!(EMSESP_Status.dallas_gpio = json["dallas_parasite"])) {
EMSESP_Status.dallas_parasite = EMSESP_DALLAS_PARASITE; // default value
}
// thermostat_type
if (!(EMS_Thermostat.type_id = json["thermostat_type"])) {
EMS_Thermostat.type_id = EMSESP_THERMOSTAT_TYPE; // set default
@@ -629,6 +664,7 @@ bool FSCallback(MYESP_FSACTION action, const JsonObject json) {
json["led"] = EMSESP_Status.led_enabled;
json["led_gpio"] = EMSESP_Status.led_gpio;
json["dallas_gpio"] = EMSESP_Status.dallas_gpio;
json["dallas_parasite"] = EMSESP_Status.dallas_parasite;
json["thermostat_type"] = EMS_Thermostat.type_id;
json["boiler_type"] = EMS_Boiler.type_id;
json["test_mode"] = EMSESP_Status.test_mode;
@@ -686,6 +722,17 @@ bool SettingsCallback(MYESP_FSACTION action, uint8_t wc, const char * setting, c
ok = true;
}
// dallas_parasite
if ((strcmp(setting, "dallas_parasite") == 0) && (wc == 2)) {
if (strcmp(value, "true") == 0) {
EMSESP_Status.dallas_parasite = true;
ok = true;
} else if (strcmp(value, "false") == 0) {
EMSESP_Status.dallas_parasite = false;
ok = true;
}
}
// thermostat_type
if (strcmp(setting, "thermostat_type") == 0) {
EMS_Thermostat.type_id = ((wc == 2) ? (uint8_t)strtol(value, 0, 16) : EMS_ID_NONE);
@@ -704,6 +751,7 @@ bool SettingsCallback(MYESP_FSACTION action, uint8_t wc, const char * setting, c
myDebug(" led=%s", EMSESP_Status.led_enabled ? "on" : "off");
myDebug(" led_gpio=%d", EMSESP_Status.led_gpio);
myDebug(" dallas_gpio=%d", EMSESP_Status.dallas_gpio);
myDebug(" dallas_parasite=%s", EMSESP_Status.dallas_parasite ? "on" : "off");
if (EMS_Thermostat.type_id == EMS_ID_NONE) {
myDebug(" thermostat_type=<not set>");
@@ -997,6 +1045,13 @@ void initEMSESP() {
EMSESP_Shower.doingColdShot = false;
}
// publish external dallas sensor temperature values to MQTT
void do_publishSensorValues() {
if (EMSESP_Status.dallas_sensors != 0) {
publishSensorValues();
}
}
// call PublishValues without forcing, so using CRC to see if we really need to publish
void do_publishValues() {
// don't publish if we're not connected to the EMS bus
@@ -1177,6 +1232,7 @@ void setup() {
if (!EMSESP_Status.test_mode) {
publishValuesTimer.attach(PUBLISHVALUES_TIME, do_publishValues); // post MQTT values
regularUpdatesTimer.attach(REGULARUPDATES_TIME, do_regularUpdates); // regular reads from the EMS
publishSensorValuesTimer.attach(PUBLISHSENSORVALUES_TIME, do_publishSensorValues); // post MQTT sensor values
}
// set pin for LED
@@ -1187,7 +1243,8 @@ void setup() {
}
// check for Dallas sensors
EMSESP_Status.dallas_sensors = ds18.setup(EMSESP_Status.dallas_gpio); // returns #sensors
EMSESP_Status.dallas_sensors = ds18.setup(EMSESP_Status.dallas_gpio, EMSESP_Status.dallas_parasite); // returns #sensors
}
//

View File

@@ -49,6 +49,9 @@
#define BOILER_SHOWER_ALERT 0 // enable (1) to send alert of cold water when shower time limit has exceeded
#define SHOWER_MAX_DURATION 420000 // in ms. 7 minutes, before trigger a shot of cold water
// MQTT for EXTERNAL SENSORS
#define TOPIC_EXTERNAL_SENSORS "sensors" // for sending sensor values to MQTT
////////////////////////////////////////////////////////////////////////////////////////////////////
// THESE DEFAULT VALUES CAN ALSO BE SET AND STORED WITHTIN THE APPLICATION (see 'set' command) //
// ALTHOUGH YOU MAY ALSO HARDCODE THEM HERE BUT THEY WILL BE OVERWRITTEN WITH NEW RELEASE UPDATES //
@@ -64,6 +67,7 @@
// set this if using an external temperature sensor like a DS18B20
// D5 is the default on bbqkees' board
#define EMSESP_DALLAS_GPIO D5
#define EMSESP_DALLAS_PARASITE false
// By default the EMS bus will be scanned for known devices based on product ids in ems_devices.h
// You can override the Thermostat and Boiler types here