Skip to content

Commit

Permalink
allow to set idle HBWDeltaT output manually
Browse files Browse the repository at this point in the history
added option for error state
  • Loading branch information
loetmeister committed Jun 30, 2021
1 parent 245723d commit e1587fe
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 12 deletions.
5 changes: 4 additions & 1 deletion HBW-CC-DT3-T6/HBW-CC-DT3-T6.ino
Expand Up @@ -20,10 +20,13 @@
// - add config for output change frequency (CYCLE_TIME)
// v0.45
// - using config LED for Tx & Rx indicator
// v0.50
// - allow to set HBWDeltaT output when mode is IDLE/inactive (no temperature received)
// - option for error state (set OFF/ON), when error_temperature is received


#define HARDWARE_VERSION 0x01
#define FIRMWARE_VERSION 0x002D
#define FIRMWARE_VERSION 0x0032
#define HMW_DEVICETYPE 0x9C //device ID (make sure to import .xml into FHEM)

#define NUMBER_OF_TEMP_CHAN 6 // input channels - 1-wire temperature sensors
Expand Down
18 changes: 16 additions & 2 deletions HBW-CC-DT3-T6/HBWDeltaT.cpp
Expand Up @@ -96,6 +96,17 @@ uint8_t HBWDeltaTx::get(uint8_t* data)
};


void HBWDeltaT::set(HBWDevice* device, uint8_t length, uint8_t const * const data)
{
// allow to set manually, only when 'mode' is inactive (i.e. no T1 & T2 temperature received)
// output will change not faster than "output_change_wait_time"
if (!stateFlags.element.mode)
{
nextState = *data == 0 ? OFF : ON;
}
};


/* standard public function - returns length of data array. Data array contains current channel reading */
uint8_t HBWDeltaT::get(uint8_t* data)
{
Expand Down Expand Up @@ -188,8 +199,11 @@ bool HBWDeltaT::calculateNewState()
int16_t t2 = deltaT2->currentTemperature;

// check if valid temps are available
if (t1 <= ERROR_TEMP || t2 <= ERROR_TEMP) {
nextState = OFF;
if (t1 == DEFAULT_TEMP || t2 == DEFAULT_TEMP) { // don't overwrite 'nextState' (keep manual state) if no temp was ever received
return false;
}
if (t1 == ERROR_TEMP || t2 == ERROR_TEMP) { // set output to error state, when sensor got lost (error_temperature is received)
nextState = config->error_state ? OFF : ON;
return false;
}

Expand Down
5 changes: 3 additions & 2 deletions HBW-CC-DT3-T6/HBWDeltaT.h
Expand Up @@ -42,7 +42,8 @@ struct hbw_config_DeltaT {
uint8_t n_enableHysMaxT1:1; // apply hysteresis on maxT1, 1=off (default) 0=on
uint8_t n_enableHysMinT2:1; // apply hysteresis on minT2, 1=off (default) 0=on
uint8_t n_enableHysOFF:1; // apply hysteresis on OFF transition, too. 1=off (default) 0=on
uint8_t :2; //fillup
uint8_t error_state:1; // set output OFF or ON at error state (defaut OFF)
uint8_t :1; //fillup
};

// config of one DeltaTx channel, address step 1
Expand Down Expand Up @@ -74,7 +75,7 @@ class HBWDeltaT : public HBWChannel {
HBWDeltaT(uint8_t _pin, HBWDeltaTx* _delta_t1, HBWDeltaTx* _delta_t2, hbw_config_DeltaT* _config);
virtual void loop(HBWDevice*, uint8_t channel);
virtual uint8_t get(uint8_t* data);
//virtual void set(HBWDevice*, uint8_t length, uint8_t const * const data); //TODO: allow to set when mode inactive?
virtual void set(HBWDevice*, uint8_t length, uint8_t const * const data);
virtual void afterReadConfig();

private:
Expand Down
11 changes: 10 additions & 1 deletion HBW-CC-DT3-T6/HBW_CC_DT3_T6.xml
Expand Up @@ -4,7 +4,7 @@
<type name="RS485 3 Channel Delta Temperature and 6 One Wire Channel Temperature Module" id="HBW-CC-DT3-T6" priority="2">
<parameter index="0" size="1" const_value="0x9C"/><!--HMW_DEVICETYPE-->
<parameter index="1" size="1" const_value="1"/><!--HARDWARE_VERSION-->
<parameter const_value="0x001E" size="2" cond_op="GE" index="2"/><!--min FIRMWARE_VERSION-->
<parameter const_value="0x0028" size="2" cond_op="GE" index="2"/><!--min FIRMWARE_VERSION-->
</type>
</supported_types>

Expand Down Expand Up @@ -297,6 +297,15 @@
<value_map to_device="false" from_device="true" parameter_value="5" device_value="0x7"/>
</conversion>
</parameter>
<parameter id="ERROR_STATE">
<logical type="option">
<option id="ON"/>
<option id="OFF" default="true"/>
</logical>
<physical type="integer" size="0.1" interface="eeprom">
<address index="+6.6"/>
</physical>
</parameter>
</paramset>
<paramset type="LINK" id="hmw_deltat_ch_link" peer_param="ACTUATOR" channel_param="CHANNEL" count="32" address_start="0x100" address_step="6">
<parameter id="CHANNEL" operations="none" hidden="true">
Expand Down
13 changes: 7 additions & 6 deletions HBW-CC-DT3-T6/readme.txt
Expand Up @@ -15,8 +15,8 @@ DS18B20 Ger
DS1822 Ger�tecode 0x22

Direktes Peering:
Die tempsensor Kan�le k�nnen mit delta_t1, delta_t2 verkn�pft werden, oder anderen externen Kan�len. (delta_t1/delta_t2 sollte nur jeweils ein Sensor zugewiesen werden!)
Der delta_t Kanaltyp kann mit Aktor Kan�len verkn�pft werden, z.B. externe Relais. (delta_t sendet short/long keyEvents)
Die tempsensor Kan�le k�nnen mit delta_t1, delta_t2 verkn�pft werden, oder anderen externen Kan�len. (delta_t1/delta_t2 sollte nur jeweils ein Temperatursensor zugewiesen werden!)
Der delta_t Kanaltyp kann mit Aktor Kan�len verkn�pft werden, z.B. externe Relais, Display, o.�.. (delta_t sendet short/long keyEvents)


Kan�le:
Expand All @@ -27,10 +27,11 @@ Kan


DeltaT Konfiguration:
HYSTERESIS: 0.0 - 3.0�C
DELTA_TEMP: 0.0 - 25.4�C
T1_MAX: -200.0 - 200.0�C
T2_MIN: -200.0 - 200.0�C
* HYSTERESIS: 0.0 - 3.0�C
* DELTA_TEMP: 0.0 - 25.4�C
* T1_MAX: -200.0 - 200.0�C
* T2_MIN: -200.0 - 200.0�C
* CYCLE_TIME: 5 - 40 Sekunden

* DeltaT wird berechnet als T2 - T1. Die Hysterese wird vom delta Wert subtrahiert, wenn die Temperaturdifferenz unterhalb von DELTA_TEMP liegt, ansonsten addiert (Als Option zuschaltbar). Der Ausgang wechselt sofort auf "Aus", wenn T1_MAX �berschritten oder T2_MIN unterschritten wird. Alternativ kann hier auch die Hysterese angewendet werden.

Expand Down

0 comments on commit e1587fe

Please sign in to comment.