/*
OpenMQTTGateway - ESP8266 or Arduino program for home automation
Act as a gateway between your 433mhz, infrared IR, BLE, LoRa signal and one interface like an MQTT broker
Send and receiving command by MQTT
This gateway enables to:
- publish MQTT data, which are received from RF433Mhz signal (based on WeatherStationDataRx)
Library for read weather data from Venus W174/W132, Auriol H13726, Hama EWS 1500, Meteoscan W155/W160
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 ZgatewayWeatherStation
# include
# include "TheengsCommon.h"
# include "config_WeatherStation.h"
WeatherStationDataRx wsdr(RF_WS_RECEIVER_GPIO, true);
void PairedDeviceAdded(byte newID) {
Serial.printf("gatewayWeatherStation: New device paired %d\r\n", newID);
StaticJsonDocument RFdataBuffer;
JsonObject RFdata = RFdataBuffer.to();
RFdata["sensor"] = newID;
RFdata["action"] = "paired";
RFdata["origin"] = subjectRFtoMQTT;
enqueueJsonObject(RFdata);
wsdr.pair(NULL, PairedDeviceAdded);
}
void setupWeatherStation() {
THEENGS_LOG_NOTICE(F("RF_WS_RECEIVER_GPIO %d" CR), RF_WS_RECEIVER_GPIO);
wsdr.begin();
wsdr.pair(NULL, PairedDeviceAdded);
THEENGS_LOG_TRACE(F("gatewayWeatherStation setup done " CR));
}
void sendWindSpeedData(byte id, float wind_speed, byte battery_status) {
unsigned long MQTTvalue = 10000 + round(wind_speed);
if (!isAduplicateSignal(MQTTvalue)) { // conditions to avoid duplications of RF -->MQTT
StaticJsonDocument RFdataBuffer;
JsonObject RFdata = RFdataBuffer.to();
RFdata["sensor"] = id;
RFdata["wind_speed"] = wind_speed;
RFdata["battery"] = bitRead(battery_status, 0) == 0 ? "OK" : "Low";
RFdata["origin"] = subjectRFtoMQTT;
enqueueJsonObject(RFdata);
THEENGS_LOG_TRACE(F("Store wind speed val: %lu" CR), MQTTvalue);
storeSignalValue(MQTTvalue);
}
}
void sendRainData(byte id, float rain_volume, byte battery_status) {
unsigned long MQTTvalue = 11000 + round(rain_volume * 10.0);
if (!isAduplicateSignal(MQTTvalue)) { // conditions to avoid duplications of RF -->MQTT
StaticJsonDocument RFdataBuffer;
JsonObject RFdata = RFdataBuffer.to();
RFdata["sensor"] = id;
RFdata["rain_volume"] = rain_volume;
RFdata["battery"] = bitRead(battery_status, 1) == 0 ? "OK" : "Low";
RFdata["origin"] = subjectRFtoMQTT;
enqueueJsonObject(RFdata);
THEENGS_LOG_TRACE(F("Store rain_volume: %lu" CR), MQTTvalue);
storeSignalValue(MQTTvalue);
}
}
void sendWindData(byte id, int wind_direction, float wind_gust, byte battery_status) {
unsigned long MQTTvalue = 20000 + round(wind_gust * 10.0) + wind_direction;
if (!isAduplicateSignal(MQTTvalue)) { // conditions to avoid duplications of RF -->MQTT
StaticJsonDocument RFdataBuffer;
JsonObject RFdata = RFdataBuffer.to();
RFdata["sensor"] = id;
RFdata["wind_direction"] = wind_direction;
RFdata["wind_gust"] = wind_gust;
RFdata["battery"] = bitRead(battery_status, 0) == 0 ? "OK" : "Low";
RFdata["origin"] = subjectRFtoMQTT;
enqueueJsonObject(RFdata);
THEENGS_LOG_TRACE(F("Store wind data val: %lu" CR), MQTTvalue);
storeSignalValue(MQTTvalue);
}
}
void sendTemperatureData(byte id, float temperature, int humidity, byte battery_status) {
unsigned long MQTTvalue = 40000 + abs(round(temperature * 100.0)) + humidity;
if (!isAduplicateSignal(MQTTvalue)) { // conditions to avoid duplications of RF -->MQTT
StaticJsonDocument RFdataBuffer;
JsonObject RFdata = RFdataBuffer.to();
RFdata["sensor"] = id;
RFdata["tempc"] = temperature;
RFdata["tempf"] = wsdr.convertCtoF(temperature);
RFdata["humidity"] = humidity;
RFdata["battery"] = bitRead(battery_status, 0) == 0 ? "OK" : "Low";
RFdata["origin"] = subjectRFtoMQTT;
enqueueJsonObject(RFdata);
THEENGS_LOG_TRACE(F("Store temp val: %lu" CR), MQTTvalue);
storeSignalValue(MQTTvalue);
}
}
void ZgatewayWeatherStationtoX() {
char newData = wsdr.readData();
switch (newData) {
case 'T':
THEENGS_LOG_TRACE(F("Temperature" CR));
sendTemperatureData(wsdr.sensorID(), wsdr.readTemperature(), wsdr.readHumidity(), wsdr.batteryStatus());
break;
case 'S':
THEENGS_LOG_TRACE(F("Wind speed" CR));
sendWindSpeedData(wsdr.sensorID(), wsdr.readWindSpeed(), wsdr.batteryStatus());
break;
case 'G':
THEENGS_LOG_TRACE(F("Wind direction" CR));
sendWindData(wsdr.sensorID(), wsdr.readWindDirection(), wsdr.readWindGust(), wsdr.batteryStatus());
break;
case 'R':
THEENGS_LOG_TRACE(F("Rain volume" CR));
sendRainData(wsdr.sensorID(), wsdr.readRainVolume(), wsdr.batteryStatus());
break;
default:
break;
}
}
#endif