Without this (and without sending an initial MQTT message to the gateway to configure it) messages are not necessarily received if parameters are different from firmware defaults. This patch helped at least two users: - https://community.home-assistant.io/t/awesome-lora-soil-sensor/304351/23 - https://community.home-assistant.io/t/awesome-lora-soil-sensor/304351/18 Change-Id: Ia65ee5780b56f81fc73662c8779b79083805009b Co-authored-by: Grégoire Seux <grego_openmqttgateway@familleseux.net>
136 lines
4.9 KiB
Arduino
136 lines
4.9 KiB
Arduino
/*
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "User_config.h"
|
|
|
|
#ifdef ZgatewayLORA
|
|
|
|
# include <LoRa.h>
|
|
# include <SPI.h>
|
|
# include <Wire.h>
|
|
|
|
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);
|
|
LoRa.setTxPower(LORA_TX_POWER);
|
|
LoRa.setSpreadingFactor(LORA_SPREADING_FACTOR);
|
|
LoRa.setSignalBandwidth(LORA_SIGNAL_BANDWIDTH);
|
|
LoRa.setCodingRate4(LORA_CODING_RATE);
|
|
LoRa.setPreambleLength(LORA_PREAMBLE_LENGTH);
|
|
LoRa.setSyncWord(LORA_SYNC_WORD);
|
|
Log.trace(F("ZgatewayLORA setup done" CR));
|
|
}
|
|
|
|
void LORAtoMQTT() {
|
|
int packetSize = LoRa.parsePacket();
|
|
if (packetSize) {
|
|
StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer;
|
|
JsonObject LORAdata = jsonBuffer.to<JsonObject>();
|
|
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["rssi"] = (int)LoRa.packetRssi();
|
|
LORAdata["snr"] = (float)LoRa.packetSnr();
|
|
LORAdata["pferror"] = (float)LoRa.packetFrequencyError();
|
|
LORAdata["packetSize"] = (int)packetSize;
|
|
LORAdata["message"] = (char*)packet.c_str();
|
|
pub(subjectLORAtoMQTT, LORAdata);
|
|
if (repeatLORAwMQTT) {
|
|
Log.trace(F("Pub LORA for rpt" CR));
|
|
pub(subjectMQTTtoLORA, LORAdata);
|
|
}
|
|
}
|
|
}
|
|
|
|
# if 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
|
|
# if 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
|