hallo,
Ik ben bezig met een project met een opentherm thermostaat en ik heb een thermostaat nodig waarvan ik het setpoint kan veranderen met code. Ik gebruik hiervoor een esp2866 en een honeywell round modulation thermostaat. Ik denk dat ik het setpoint heb veranderd met deze code maar het setpoint veranderde niet op de thermostaat. Dus is mijn code niet goed of gebruik ik de verkeerde thermostaat?
dit is mijn code:
#include <opentherm.h>
//#include <OpenTherm.h>
// Arduino UNO
#define THERMOSTAT_IN D6
#define THERMOSTAT_OUT D7
OpenthermData message;
float RoomT=0.0;
float RTsetpointT=0.0;
float FlowTempSetpoint=0.0;
float DHWSetpoint=0.0;
float MaxRelModLevelSetting=0.0;
void setup() {
pinMode(THERMOSTAT_IN, INPUT);
digitalWrite(THERMOSTAT_IN, HIGH); // pull up
digitalWrite(THERMOSTAT_OUT, HIGH);
pinMode(THERMOSTAT_OUT, OUTPUT); // low output = high current, high output = low current
Serial.begin(115200);
}
/**
* Loop will act as boiler (slave) connected to Opentherm thermostat.
*/
void loop() {
if (OPENTHERM::getMessage(message)) {
//Serial.print(F("-> "));
//OPENTHERM::printToSerial(message);
//Serial.println();
delay(100); // Opentherm defines delay between request and response
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 0) {
// Serial.println(message.valueHB, BIN);
// byte val = message.valueHB;
// for (int i = 0; i < 8; i++){
// bool b = val & 0x80;
// Serial.print(b);
// val = val << 1;
// }
if (bitRead(message.valueHB, 0)){ //bitwise operation check if most right bit (CH enable) is 1
Serial.println("Enable heat");
}
// if (bitRead(message.valueHB, 1)){ //bitwise operation check if second right bit (DHW enable) is 1
// Serial.println("Enable hot water");
// }
message.type= OT_MSGTYPE_READ_ACK;
// message.valueLB = B00000001; // Gifes fault indication on thermostat
// message.valueLB = B00001000; // Flame on thermostat
message.valueLB = B00000000 ;
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 1) {
FlowTempSetpoint = message.f88();
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 2) {
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 3) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B11110100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 5) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = 100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 6) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 9) {
message.type= OT_MSGTYPE_READ_ACK;
message.f88(0);// remove override setpoint, 0 = no override
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 14) {
message.type= OT_MSGTYPE_WRITE_ACK;
MaxRelModLevelSetting = message.f88();
message.valueLB = 100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 16) {
RTsetpointT= 20.0; // Current room temperature setpoint (°C)
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = 0 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 17) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000001 ;//
message.f88(25); // set modulation to 25%
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 24) {
RoomT=message.f88(); // Current actual room temperature (°C)
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = 0 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 25) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = 0x27C5 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 56) {
DHWSetpoint = message.f88(); //DHW setpoint
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 126) {
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 127) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
Serial.print(F("message.id "));
Serial.print(message.id);
Serial.print(F(" , message.type "));
Serial.print(message.type);
Serial.print(F(" , Roomtemp: "));
Serial.print(RoomT);
Serial.print(F(" ,RTsetpointT: "));
//Serial.print(F(" "));
Serial.print(RTsetpointT);
Serial.println();
}
if (message.type == OT_MSGTYPE_WRITE_DATA){ //IW
Serial.print("-> "); //IW
Serial.println( "... Response Sent to Master OT_MSGTYPE_UNKNOWN_DATAID" ); //IW
OPENTHERM::printToSerial(message);
delay(100); // Opentherm defines delay between request and response //IW
message.type = OT_MSGTYPE_UNKNOWN_DATAID; // construct fake response //IW
message.valueHB = 0; //IW
message.valueLB = 0; //IW
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse); // send some response and wait for antoher request from thermostat set by callback//IW
}
if (message.type == OT_MSGTYPE_READ_DATA){ //IW
Serial.print("-> "); //IW
Serial.println( "... Response Sent to Master OT_MSGTYPE_UNKNOWN_DATAID" ); //IW
OPENTHERM::printToSerial(message);
delay(100); // Opentherm defines delay between request and response //IW
message.type = OT_MSGTYPE_UNKNOWN_DATAID; // construct fake response //IW
message.valueHB = 0; //IW
message.valueLB = 0; //IW
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse); // send some response and wait for antoher request from thermostat set by callback//IW
}
else if (OPENTHERM::isSent() || OPENTHERM::isIdle() || OPENTHERM::isError()) { // wait for request from thermostat
OPENTHERM::listen(THERMOSTAT_IN, -1);
}
}
void listenAfterResponse() {
//Serial.print(F("<- "));
//OPENTHERM::printToSerial(message);
//Serial.println();
//Serial.println();
OPENTHERM::listen(THERMOSTAT_IN, -1);
}
Ik ben bezig met een project met een opentherm thermostaat en ik heb een thermostaat nodig waarvan ik het setpoint kan veranderen met code. Ik gebruik hiervoor een esp2866 en een honeywell round modulation thermostaat. Ik denk dat ik het setpoint heb veranderd met deze code maar het setpoint veranderde niet op de thermostaat. Dus is mijn code niet goed of gebruik ik de verkeerde thermostaat?
dit is mijn code:
#include <opentherm.h>
//#include <OpenTherm.h>
// Arduino UNO
#define THERMOSTAT_IN D6
#define THERMOSTAT_OUT D7
OpenthermData message;
float RoomT=0.0;
float RTsetpointT=0.0;
float FlowTempSetpoint=0.0;
float DHWSetpoint=0.0;
float MaxRelModLevelSetting=0.0;
void setup() {
pinMode(THERMOSTAT_IN, INPUT);
digitalWrite(THERMOSTAT_IN, HIGH); // pull up
digitalWrite(THERMOSTAT_OUT, HIGH);
pinMode(THERMOSTAT_OUT, OUTPUT); // low output = high current, high output = low current
Serial.begin(115200);
}
/**
* Loop will act as boiler (slave) connected to Opentherm thermostat.
*/
void loop() {
if (OPENTHERM::getMessage(message)) {
//Serial.print(F("-> "));
//OPENTHERM::printToSerial(message);
//Serial.println();
delay(100); // Opentherm defines delay between request and response
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 0) {
// Serial.println(message.valueHB, BIN);
// byte val = message.valueHB;
// for (int i = 0; i < 8; i++){
// bool b = val & 0x80;
// Serial.print(b);
// val = val << 1;
// }
if (bitRead(message.valueHB, 0)){ //bitwise operation check if most right bit (CH enable) is 1
Serial.println("Enable heat");
}
// if (bitRead(message.valueHB, 1)){ //bitwise operation check if second right bit (DHW enable) is 1
// Serial.println("Enable hot water");
// }
message.type= OT_MSGTYPE_READ_ACK;
// message.valueLB = B00000001; // Gifes fault indication on thermostat
// message.valueLB = B00001000; // Flame on thermostat
message.valueLB = B00000000 ;
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 1) {
FlowTempSetpoint = message.f88();
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 2) {
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 3) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B11110100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 5) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = 100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 6) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 9) {
message.type= OT_MSGTYPE_READ_ACK;
message.f88(0);// remove override setpoint, 0 = no override
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 14) {
message.type= OT_MSGTYPE_WRITE_ACK;
MaxRelModLevelSetting = message.f88();
message.valueLB = 100 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 16) {
RTsetpointT= 20.0; // Current room temperature setpoint (°C)
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = 0 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 17) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000001 ;//
message.f88(25); // set modulation to 25%
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 24) {
RoomT=message.f88(); // Current actual room temperature (°C)
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = 0 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 25) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = 0x27C5 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 56) {
DHWSetpoint = message.f88(); //DHW setpoint
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_WRITE_DATA && message.id == 126) {
message.type= OT_MSGTYPE_WRITE_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
if (message.type == OT_MSGTYPE_READ_DATA && message.id == 127) {
message.type= OT_MSGTYPE_READ_ACK;
message.valueLB = B00000000 ;//
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse);
}
Serial.print(F("message.id "));
Serial.print(message.id);
Serial.print(F(" , message.type "));
Serial.print(message.type);
Serial.print(F(" , Roomtemp: "));
Serial.print(RoomT);
Serial.print(F(" ,RTsetpointT: "));
//Serial.print(F(" "));
Serial.print(RTsetpointT);
Serial.println();
}
if (message.type == OT_MSGTYPE_WRITE_DATA){ //IW
Serial.print("-> "); //IW
Serial.println( "... Response Sent to Master OT_MSGTYPE_UNKNOWN_DATAID" ); //IW
OPENTHERM::printToSerial(message);
delay(100); // Opentherm defines delay between request and response //IW
message.type = OT_MSGTYPE_UNKNOWN_DATAID; // construct fake response //IW
message.valueHB = 0; //IW
message.valueLB = 0; //IW
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse); // send some response and wait for antoher request from thermostat set by callback//IW
}
if (message.type == OT_MSGTYPE_READ_DATA){ //IW
Serial.print("-> "); //IW
Serial.println( "... Response Sent to Master OT_MSGTYPE_UNKNOWN_DATAID" ); //IW
OPENTHERM::printToSerial(message);
delay(100); // Opentherm defines delay between request and response //IW
message.type = OT_MSGTYPE_UNKNOWN_DATAID; // construct fake response //IW
message.valueHB = 0; //IW
message.valueLB = 0; //IW
OPENTHERM::send(THERMOSTAT_OUT, message, listenAfterResponse); // send some response and wait for antoher request from thermostat set by callback//IW
}
else if (OPENTHERM::isSent() || OPENTHERM::isIdle() || OPENTHERM::isError()) { // wait for request from thermostat
OPENTHERM::listen(THERMOSTAT_IN, -1);
}
}
void listenAfterResponse() {
//Serial.print(F("<- "));
//OPENTHERM::printToSerial(message);
//Serial.println();
//Serial.println();
OPENTHERM::listen(THERMOSTAT_IN, -1);
}