diff --git a/OpenMQTTGateway.ino b/OpenMQTTGateway.ino index 24fe45a..ef6c36d 100644 --- a/OpenMQTTGateway.ino +++ b/OpenMQTTGateway.ino @@ -173,6 +173,9 @@ void setup() #ifdef ZgatewayRF setupRF(); #endif + #ifdef ZgatewayRF2 + setupRF2(); + #endif #ifdef ZgatewayBT setupBT(); #endif @@ -249,6 +252,11 @@ void loop() if(resultRF) trc(F("RFtoMQTT OK")); #endif + #ifdef ZgatewayRF2 + boolean resultRF2 = RF2toMQTT(); + if(resultRF2) + trc(F("RF2toMQTT OK")); + #endif #ifdef ZgatewayIR boolean resultIR = IRtoMQTT(); if(resultIR) diff --git a/User_config.h b/User_config.h index 6e96087..7190548 100644 --- a/User_config.h +++ b/User_config.h @@ -95,7 +95,7 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress #else // for arduino + W5100 #define ZgatewayRF #include "config_RF.h" - #define ZgatewayRF2 + //#define ZgatewayRF2 // too big for UNO #ifdef RFM69_Wiring //#define ZgatewayRFM69 not tested //#include "config_RFM69.h" diff --git a/ZgatewayRF2.ino b/ZgatewayRF2.ino index 467fc4f..fda7be5 100644 --- a/ZgatewayRF2.ino +++ b/ZgatewayRF2.ino @@ -39,6 +39,68 @@ sudo mosquitto_pub -t home/commands/MQTTtoRF2/CODE_8233372/UNIT_0/PERIOD_272 -m #ifdef ZgatewayRF2 #include +#include + +struct RF2rxd +{ + unsigned int period; + unsigned long address; + unsigned long groupBit; + unsigned long unit; + unsigned long switchType; + bool hasNewData; +}; + +RF2rxd rf2rd; + +void setupRF2(){ + #ifdef ESP8266 + NewRemoteReceiver::init(5, 2, rf2Callback); + #else + NewRemoteReceiver::init(0, 2, rf2Callback); + #endif + trc(F("Receiver RF2 initialized")); + pinMode(RF_EMITTER_PIN, OUTPUT); + digitalWrite(RF_EMITTER_PIN, LOW); + trc(F("Transmitter RF2 initialized")); +} + +boolean RF2toMQTT(){ +//Serial.println("entra rf2tomqtt"); + if(rf2rd.hasNewData){ + rf2rd.hasNewData=false; + + trc(F("Rcv. RF2")); + String MQTTAddress; + String MQTTperiod; + String MQTTunit; + String MQTTgroupBit; + String MQTTswitchType; + + MQTTAddress = String(rf2rd.address); + MQTTperiod = String(rf2rd.period); + MQTTunit = String(rf2rd.unit); + MQTTgroupBit = String(rf2rd.groupBit); + MQTTswitchType = String(rf2rd.switchType); + String MQTTRF2string; + MQTTRF2string = subjectRF2toMQTT+String("/")+RF2codeKey+MQTTAddress+String("/")+RF2unitKey+MQTTunit+String("/")+RF2groupKey+MQTTgroupBit+String("/")+RF2periodKey+MQTTperiod; + trc(F("Adv data RF2toMQTT")); + client.publish((char *)MQTTRF2string.c_str(),(char *)MQTTswitchType.c_str()); + return true; + } + return false; +} + +void rf2Callback(unsigned int period, unsigned long address, unsigned long groupBit, unsigned long unit, unsigned long switchType) { + + rf2rd.period=period; + rf2rd.address=address; + rf2rd.groupBit=groupBit; + rf2rd.unit=unit; + rf2rd.switchType=switchType; + rf2rd.hasNewData=true; + +} void MQTTtoRF2(char * topicOri, char * datacallback) { @@ -51,11 +113,13 @@ void MQTTtoRF2(char * topicOri, char * datacallback) { long valueCODE = 0; int valueUNIT = -1; int valuePERIOD = 0; + int valueGROUP = 0; + int valueDIM = -1; int pos = topic.lastIndexOf(RF2codeKey); if (pos != -1){ pos = pos + +strlen(RF2codeKey); - valueCODE = (topic.substring(pos,pos + 7)).toInt(); + valueCODE = (topic.substring(pos,pos + 8)).toInt(); trc(F("RF2 code:")); trc(String(valueCODE)); } @@ -69,10 +133,24 @@ void MQTTtoRF2(char * topicOri, char * datacallback) { int pos3 = topic.lastIndexOf(RF2unitKey); if (pos3 != -1){ pos3 = pos3 + strlen(RF2unitKey); - valueUNIT = (topic.substring(pos3,pos3 + 1)).toInt(); + valueUNIT = (topic.substring(pos3, topic.indexOf("/", pos3))).toInt(); trc(F("Unit:")); trc(String(valueUNIT)); } + int pos4 = topic.lastIndexOf(RF2groupKey); + if (pos4 != -1) { + pos4 = pos4 + strlen(RF2groupKey); + valueGROUP = (topic.substring(pos4,pos4 + 1)).toInt(); + trc(F("RF2 Group:")); + trc(String(valueGROUP)); + } + int pos5 = topic.lastIndexOf(RF2dimKey); + if (pos5 != -1) { + pos5 = pos5 + strlen(RF2dimKey); + valueDIM = (topic.substring(pos5, topic.indexOf("/", pos5))).toInt(); + trc(F("RF2 Dim:")); + trc(String(valueDIM)); + } if ((topic == subjectMQTTtoRF2) || (valueCODE != 0) || (valueUNIT != -1)|| (valuePERIOD != 0)){ trc(F("MQTTtoRF2")); @@ -82,12 +160,48 @@ void MQTTtoRF2(char * topicOri, char * datacallback) { trc(String(valueCODE)); trc(String(valueUNIT)); trc(String(valuePERIOD)); + trc(String(valueGROUP)); trc(String(boolSWITCHTYPE)); + trc(String(valueDIM)); + NewRemoteReceiver::disable(); trc(F("Creating transmitter")); NewRemoteTransmitter transmitter(valueCODE, RF_EMITTER_PIN, valuePERIOD); trc(F("Sending data")); - transmitter.sendUnit(valueUNIT, boolSWITCHTYPE); + if (valueGROUP) { + if (valueDIM >= 0) { + transmitter.sendGroupDim(valueDIM); + } + else { + transmitter.sendGroup(boolSWITCHTYPE); + } + } + else { + if (valueDIM >= 0) { + transmitter.sendDim(valueUNIT, valueDIM); + } + else { + transmitter.sendUnit(valueUNIT, boolSWITCHTYPE); + } + } trc(F("Data sent")); + NewRemoteReceiver::enable(); + + // Publish state change back to MQTT + String MQTTAddress; + String MQTTperiod; + String MQTTunit; + String MQTTgroupBit; + String MQTTswitchType; + + MQTTAddress = String(valueCODE); + MQTTperiod = String(valuePERIOD); + MQTTunit = String(valueUNIT); + MQTTgroupBit = String(rf2rd.groupBit); + MQTTswitchType = String(boolSWITCHTYPE); + String MQTTRF2string; + MQTTRF2string = subjectRF2toMQTT+String("/")+RF2codeKey+MQTTAddress+String("/")+RF2unitKey+MQTTunit+String("/")+RF2groupKey+MQTTgroupBit+String("/")+RF2periodKey+MQTTperiod; + trc(F("Adv data MQTTtoRF2 push state via RF2toMQTT")); + client.publish((char *)MQTTRF2string.c_str(),(char *)MQTTswitchType.c_str()); } } diff --git a/config_RF.h b/config_RF.h index bb9a109..a875361 100644 --- a/config_RF.h +++ b/config_RF.h @@ -56,9 +56,12 @@ RF supported protocols /*-------------------RF2 topics & parameters----------------------*/ //433Mhz newremoteswitch MQTT Subjects and keys #define subjectMQTTtoRF2 "home/commands/MQTTtoRF2" +#define subjectRF2toMQTT "home/RF2toMQTT" #define RF2codeKey "CODE_" // code will be defined if a subject contains RF2codeKey followed by a value of 7 digits #define RF2periodKey "PERIOD_" // period will be defined if a subject contains RF2periodKey followed by a value of 3 digits -#define RF2unitKey "UNIT_" // number of your unit value will be defined if a subject contains RF2unitKey followed by a value of 1 digit +#define RF2unitKey "UNIT_" // number of your unit value will be defined if a subject contains RF2unitKey followed by a value of 1-2 digits +#define RF2groupKey "GROUP_" // number of your group value will be defined if a subject contains RF2groupKey followed by a value of 1 digit +#define RF2dimKey "DIM_" // number of your dim value will be defined if a subject contains RF2dimKey followed by a value of 1-3 digits /*-------------------PIN DEFINITIONS----------------------*/ #ifdef I2C_Wiring // With Support for I2C Modules