/* OpenMQTTGateway - ESP8266 or Arduino program for home automation Act as a wifi or ethernet gateway between your 433mhz/infrared IR/BLE signal and a MQTT broker Send and receiving command by MQTT This gateway enables to: - receive MQTT data from a topic and send LORA signal corresponding to the received MQTT data - publish MQTT data to a different topic related to received LORA 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 . */ #include "User_config.h" #ifdef ZgatewayLORA # include # include # include void setupLORA() { SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS); LoRa.setPins(LORA_SS, LORA_RST, LORA_DI0); if (!LoRa.begin(LORA_BAND)) { Log.error(F("ZgatewayLORA setup failed!" CR)); while (1) ; } LoRa.receive(); Log.notice(F("LORA_SCK: %d" CR), LORA_SCK); Log.notice(F("LORA_MISO: %d" CR), LORA_MISO); Log.notice(F("LORA_MOSI: %d" CR), LORA_MOSI); Log.notice(F("LORA_SS: %d" CR), LORA_SS); Log.notice(F("LORA_RST: %d" CR), LORA_RST); Log.notice(F("LORA_DI0: %d" CR), LORA_DI0); Log.trace(F("ZgatewayLORA setup done" CR)); } void LORAtoMQTT() { int packetSize = LoRa.parsePacket(); if (packetSize) { StaticJsonBuffer jsonBuffer; JsonObject& LORAdata = jsonBuffer.createObject(); Log.trace(F("Rcv. LORA" CR)); # ifdef ESP32 String taskMessage = "LORA Task running on core "; taskMessage = taskMessage + xPortGetCoreID(); //trc(taskMessage); # endif String packet; packet = ""; for (int i = 0; i < packetSize; i++) { packet += (char)LoRa.read(); } LORAdata.set("rssi", (int)LoRa.packetRssi()); LORAdata.set("snr", (float)LoRa.packetSnr()); LORAdata.set("pferror", (float)LoRa.packetFrequencyError()); LORAdata.set("packetSize", (int)packetSize); LORAdata.set("message", (char*)packet.c_str()); pub(subjectLORAtoMQTT, LORAdata); if (repeatLORAwMQTT) { Log.trace(F("Pub LORA for rpt" CR)); pub(subjectMQTTtoLORA, LORAdata); } } } # ifdef jsonReceiving void MQTTtoLORA(char* topicOri, JsonObject& LORAdata) { // json object decoding if (cmpToMainTopic(topicOri, subjectMQTTtoLORA)) { Log.trace(F("MQTTtoLORA json" CR)); const char* message = LORAdata["message"]; int txPower = LORAdata["txpower"] | LORA_TX_POWER; int spreadingFactor = LORAdata["spreadingfactor"] | LORA_SPREADING_FACTOR; long int frequency = LORAdata["frequency "] | LORA_BAND; long int signalBandwidth = LORAdata["signalbandwidth"] | LORA_SIGNAL_BANDWIDTH; int codingRateDenominator = LORAdata["codingrate"] | LORA_CODING_RATE; int preambleLength = LORAdata["preamblelength"] | LORA_PREAMBLE_LENGTH; byte syncWord = LORAdata["syncword"] | LORA_SYNC_WORD; bool Crc = LORAdata["enablecrc"] | DEFAULT_CRC; if (message) { LoRa.setTxPower(txPower); LoRa.setFrequency(frequency); LoRa.setSpreadingFactor(spreadingFactor); LoRa.setSignalBandwidth(signalBandwidth); LoRa.setCodingRate4(codingRateDenominator); LoRa.setPreambleLength(preambleLength); LoRa.setSyncWord(syncWord); if (Crc) LoRa.enableCrc(); LoRa.beginPacket(); LoRa.print(message); LoRa.endPacket(); Log.trace(F("MQTTtoLORA OK" CR)); pub(subjectGTWLORAtoMQTT, LORAdata); // 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 } else { Log.error(F("MQTTtoLORA Fail json" CR)); } } } # endif # ifdef simpleReceiving void MQTTtoLORA(char* topicOri, char* LORAdata) { // json object decoding if (cmpToMainTopic(topicOri, subjectMQTTtoLORA)) { LoRa.beginPacket(); LoRa.print(LORAdata); LoRa.endPacket(); Log.notice(F("MQTTtoLORA OK" CR)); pub(subjectGTWLORAtoMQTT, LORAdata); // 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 } } # endif #endif