1technophile / OpenMQTTGateway

MQTT gateway for ESP8266 or ESP32 with bidirectional 433mhz/315mhz/868mhz, Infrared communications, BLE, Bluetooth, beacons detection, mi flora, mi jia, LYWSD02, LYWSD03MMC, Mi Scale, TPMS, BBQ thermometer compatibility & LoRa.
https://docs.openmqttgateway.com
GNU General Public License v3.0
3.51k stars 776 forks source link

how to get 315 amd 433mhz working together with one OpenMQTTGateway? #140

Closed jxjhheric closed 6 years ago

jxjhheric commented 6 years ago

is it possible?

1technophile commented 6 years ago

I will try first to connect both emitter data pins together. Regarding receiver i think you will have to duplicate the gateway and connect each receiver to different pins; produve several instance of myswitch depending on the pin. Do you feel confident on doing that or do you want some draft sketch ?

jxjhheric commented 6 years ago

If there is some draft sketches, that is the best!

1technophile commented 6 years ago

Add a file called ZgatewayRF315 with the content below

/*  
  OpenMQTTGateway  - ESP8266 or Arduino program for home automation 

   Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal  and a MQTT broker 
   Send and receiving command by MQTT

  This gateway enables to:
 - receive MQTT data from a topic and send RF 433Mhz signal corresponding to the received MQTT data
 - publish MQTT data to a different topic related to received 433Mhz signal

    Copyright: (c)Florian ROBERT

    This file is part of OpenMQTTGateway.

    OpenMQTTGateway is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    OpenMQTTGateway is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef ZgatewayRF315

#include <RCSwitch.h> // library for controling Radio frequency switch

RCSwitch mySwitch315 = RCSwitch();

void setupRF315(){

  //RF init parameters
  mySwitch315.enableTransmit(RF_EMITTER_PIN315);
  trc(F("RF_EMITTER_PIN 315"));
  trc(String(RF_EMITTER_PIN315));
  mySwitch315.setRepeatTransmit(RF_EMITTER_REPEAT315); 
  mySwitch315.enableReceive(RF_RECEIVER_PIN315); 
  trc(F("RF_RECEIVER_PIN 315"));
  trc(String(RF_RECEIVER_PIN315));
}

boolean RF315toMQTT(){

  if (mySwitch315.available()){
    trc(F("Rcv. RF"));
    unsigned long MQTTvalue = 0;
    String MQTTprotocol;
    String MQTTbits;
    String MQTTlength;
    MQTTvalue = mySwitch315.getReceivedValue();
    MQTTprotocol = String(mySwitch315.getReceivedProtocol());
    MQTTbits = String(mySwitch315.getReceivedBitlength());
    MQTTlength = String(mySwitch315.getReceivedDelay());
    mySwitch315.resetAvailable();
    if (!isAduplicate(MQTTvalue) && MQTTvalue!=0) {// conditions to avoid duplications of RF -->MQTT
        trc(F("Adv data RFtoMQTT"));
        client.publish(subjectRF315toMQTTprotocol,(char *)MQTTprotocol.c_str());
        client.publish(subjectRF315toMQTTbits,(char *)MQTTbits.c_str());    
        client.publish(subjectRF315toMQTTlength,(char *)MQTTlength.c_str());    
        trc(F("Sending RF315toMQTT"));
        String value = String(MQTTvalue);
        trc(value);
        boolean result = client.publish(subjectRF315toMQTT,(char *)value.c_str());
        if (repeatRF315wMQTT){
            trc(F("Publish RF for repeat"));
            client.publish(subjectMQTTtoRF315,(char *)value.c_str());
        }
        return result;
    } 
  }
  return false;
}

void MQTTtoRF315(char * topicOri, char * datacallback) {

  unsigned long data = strtoul(datacallback, NULL, 10); // we will not be able to pass values > 4294967295

  // RF DATA ANALYSIS
  //We look into the subject to see if a special RF protocol is defined 
  String topic = topicOri;
  int valuePRT = 0;
  int valuePLSL  = 0;
  int valueBITS  = 0;
  int pos = topic.lastIndexOf(RF315protocolKey);       
  if (pos != -1){
    pos = pos + +strlen(RF315protocolKey);
    valuePRT = (topic.substring(pos,pos + 1)).toInt();
    trc(F("RF 315 Protocol:"));
    trc(String(valuePRT));
  }
  //We look into the subject to see if a special RF pulselength is defined 
  int pos2 = topic.lastIndexOf(RF315pulselengthKey);
  if (pos2 != -1) {
    pos2 = pos2 + strlen(RF315pulselengthKey);
    valuePLSL = (topic.substring(pos2,pos2 + 3)).toInt();
    trc(F("RF 315 Pulse Lgth:"));
    trc(String(valuePLSL));
  }
  int pos3 = topic.lastIndexOf(RF315bitsKey);       
  if (pos3 != -1){
    pos3 = pos3 + strlen(RF315bitsKey);
    valueBITS = (topic.substring(pos3,pos3 + 2)).toInt();
    trc(F("Bits nb:"));
    trc(String(valueBITS));
  }

  if ((topic == subjectMQTTtoRF315) && (valuePRT == 0) && (valuePLSL  == 0) && (valueBITS == 0)){
    trc(F("MQTTtoRF315 dflt"));
    mySwitch315.setProtocol(1,350);
    mySwitch315.send(data, 24);
    // Acknowledgement to the GTWRF topic
    boolean result = client.publish(subjectGTWRF315toMQTT, datacallback);
    if (result)trc(F("Ack pub."));

  } else if ((valuePRT != 0) || (valuePLSL  != 0)|| (valueBITS  != 0)){
    trc(F("MQTTtoRF usr par."));
    if (valuePRT == 0) valuePRT = 1;
    if (valuePLSL == 0) valuePLSL = 350;
    if (valueBITS == 0) valueBITS = 24;
    trc(String(valuePRT));
    trc(String(valuePLSL));
    trc(String(valueBITS));
    mySwitch315.setProtocol(valuePRT,valuePLSL);
    mySwitch315.send(data, valueBITS);
    // Acknowledgement to the GTWRF topic 
    boolean result = client.publish(subjectGTWRF315toMQTT, datacallback);// we acknowledge the sending by publishing the value to an acknowledgement topic, for the moment even if it is a signal repetition we acknowledge also
    if (result){
      trc(F("MQTTtoRF315 ack pub."));
      trc(String(data));
      };
  }

}
#endif

And a file called config_RF315.h with the content below (change the pin definitions according your 315mhz device wiring:

/*  
  OpenMQTTGateway  - ESP8266 or Arduino program for home automation 

   Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal  and a MQTT broker 
   Send and receiving command by MQTT

   This files enables to set your parameter for the radiofrequency gateways (ZgatewayRF and ZgatewayRF2) with RCswitch and newremoteswitch library

    Copyright: (c)Florian ROBERT

    This file is part of OpenMQTTGateway.

    OpenMQTTGateway is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    OpenMQTTGateway is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*-------------------RF topics & parameters----------------------*/
//433Mhz MQTT Subjects and keys
#define subjectMQTTtoRF315 "home/commands/MQTTto315"
#define subjectRF315toMQTT "home/315toMQTT"
#define subjectGTWRF315toMQTT "home/315toMQTT"
#define subjectRF315toMQTTprotocol "home/315toMQTT/protocol"
#define subjectRF315toMQTTbits "home/315toMQTT/bits"
#define subjectRF315toMQTTlength "home/315toMQTT/length"
#define RF315protocolKey "315_" // protocol will be defined if a subject contains RFprotocolKey followed by a value of 1 digit
#define RF315bitsKey "RF315BITS_" // bits  will be defined if a subject contains RFbitsKey followed by a value of 2 digits
#define repeatRF315wMQTT false // do we repeat a received signal by using mqtt
/*
RF supported protocols
433_1
433_2
433_3
433_4
433_5
433_6
*/
#define RF315pulselengthKey "315PLSL_" // pulselength will be defined if a subject contains RFprotocolKey followed by a value of 3 digits
// subject monitored to listen traffic processed by other gateways to store data and avoid ntuple
#define subjectMultiGTWRF315 "+/315toMQTT"
//RF number of signal repetition
#define RF315_EMITTER_REPEAT 20

/*-------------------PIN DEFINITIONS----------------------*/
#ifdef ESP8266
    #define RF315_RECEIVER_PIN 0 // D3 on nodemcu
    #define RF315_EMITTER_PIN 3 // RX on nodemcu
#elif defined(ESP32)
    #define RF315_RECEIVER_PIN 13 // D13 on DOIT ESP32
    #define RF315_EMITTER_PIN 12 // D12 on DOIT ESP32
#else
    //IMPORTANT NOTE: On arduino UNO connect IR emitter pin to D9 , comment #define IR_USE_TIMER2 and uncomment #define IR_USE_TIMER1 on library <library>IRremote/IRremoteInt.h so as to free pin D3 for RF RECEIVER PIN
    //RF PIN definition
    #define RF315_RECEIVER_PIN 1 //1 = D3 on arduino
    #define RF315_EMITTER_PIN 4 //4 = D4 on arduino
#endif

Add the call to these functions into OpenMQTTGateway.ino Into the setup function

  #ifdef ZgatewayRF315
    setupRF315();
  #endif

Into the loop function

    #ifdef ZgatewayRF315
      if(RF315toMQTT())
      trc(F("RF315toMQTT OK"));
    #endif

And finally add the ZgatewayRF315 activation into user_config.h below ZgatewayRF

  #define ZgatewayRF315
  #include "config_RF315.h"
jxjhheric commented 6 years ago

@1technophile thanks

NeoMatrixJR commented 6 years ago

I followed the above...changed the e/r pins a bit, but now I'm running into an issue where RX on 315 comes across as 433toMQTT in topics and issuing commands to 315 via MQTT isn't working either trying to TX. I'm thinking this may have something to do with mySwitch and mySwitch315 in the zgateways are = RCSwitch(); and are not instances so they're overlapping somehow? has anyone else experienced this?

NeoMatrixJR commented 6 years ago

@1technophile - Do the emitters have to remain on the same pin? Won't that generate unnecessary transmissions on the opposite other frequency for every command?

1technophile commented 6 years ago

@NeoMatrixJR nop It is better to have them on separate pin, same things for the receivers

NeoMatrixJR commented 6 years ago

@1technophile - I put everything on separate pins (see previous comment...sorry I didn't tag you on it). There seems to be an issue where all RX gets reported via 433toMQTT even if it's 315, and 315 tx doesn't seem to work. I'm wondering if there's an issue that RCSwitch isn't running 2 instances and understanding that there's 2 sets of pins?