Skip to content
This repository has been archived by the owner on Sep 27, 2023. It is now read-only.

Add MQTT Subscribe Sensor #193

Merged
merged 1 commit into from Oct 14, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/esphomelib/application.cpp
Expand Up @@ -1157,6 +1157,17 @@ display::Nextion *Application::make_nextion(UARTComponent *parent, uint32_t upda
}
#endif

#ifdef USE_MQTT_SUBSCRIBE_SENSOR
Application::MakeMQTTSubscribeSensor Application::make_mqtt_subscribe_sensor(const std::string &name, std::string topic) {
auto *sensor = this->register_component(new sensor::MQTTSubscribeSensor(name, std::move(topic)));

return MakeMQTTSubscribeSensor {
.sensor = sensor,
.mqtt = this->register_sensor(sensor),
};
}
#endif

Application App; // NOLINT

ESPHOMELIB_NAMESPACE_END
11 changes: 11 additions & 0 deletions src/esphomelib/application.h
Expand Up @@ -92,6 +92,7 @@
#include "esphomelib/sensor/ms5611.h"
#include "esphomelib/sensor/tcs34725.h"
#include "esphomelib/sensor/hlw8012.h"
#include "esphomelib/sensor/mqtt_subscribe_sensor.h"
#include "esphomelib/switch_/mqtt_switch_component.h"
#include "esphomelib/switch_/restart_switch.h"
#include "esphomelib/switch_/shutdown_switch.h"
Expand Down Expand Up @@ -881,6 +882,16 @@ class Application {
sensor::HLW8012Component *make_hlw8012(const GPIOOutputPin &sel_pin, uint8_t cf_pin, uint8_t cf1_pin, uint32_t update_interval = 15000);
#endif

#ifdef USE_MQTT_SUBSCRIBE_SENSOR
struct MakeMQTTSubscribeSensor {
sensor::MQTTSubscribeSensor *sensor;
sensor::MQTTSensorComponent *mqtt;
};

MakeMQTTSubscribeSensor make_mqtt_subscribe_sensor(const std::string &name, std::string topic);
#endif





Expand Down
6 changes: 6 additions & 0 deletions src/esphomelib/defines.h
Expand Up @@ -113,6 +113,7 @@
#define USE_SNTP_COMPONENT
#define USE_NEXTION
#define USE_HLW8012
#define USE_MQTT_SUBSCRIBE_SENSOR
#endif

#ifdef USE_REMOTE_RECEIVER
Expand Down Expand Up @@ -521,5 +522,10 @@
#define USE_UART
#endif
#endif
#ifdef USE_MQTT_SUBSCRIBE_SENSOR
#ifndef USE_SENSOR
#define USE_SENSOR
#endif
#endif

#endif //ESPHOMELIB_DEFINES_H
55 changes: 55 additions & 0 deletions src/esphomelib/sensor/mqtt_subscribe_sensor.cpp
@@ -0,0 +1,55 @@
//
// mqtt_subscribe_sensor.cpp
// esphomelib
//
// Created by Otto Winter on 2018/10/10.
// Copyright © 2018 Otto Winter. All rights reserved.
//


#include "esphomelib/defines.h"

#ifdef USE_MQTT_SUBSCRIBE_SENSOR

#include "esphomelib/sensor/mqtt_subscribe_sensor.h"
#include "esphomelib/mqtt/mqtt_client_component.h"
#include "esphomelib/log.h"
#include <utility>
#include <cstdlib>

ESPHOMELIB_NAMESPACE_BEGIN

namespace sensor {

static const char *TAG = "sensor.mqtt_subscribe";

MQTTSubscribeSensor::MQTTSubscribeSensor(const std::string &name, std::string topic)
: Sensor(name), topic_(std::move(topic)) {

}
void MQTTSubscribeSensor::setup() {
mqtt::global_mqtt_client->subscribe(this->topic_, [this](std::string payload) {
char *end;
float value = ::strtof(payload.c_str(), &end);
if (end == nullptr) {
ESP_LOGW(TAG, "Can't convert '%s' to number!", payload.c_str());
this->push_new_value(NAN);
return;
}

this->push_new_value(value);
}, this->qos_);
}

float MQTTSubscribeSensor::get_setup_priority() const {
return setup_priority::HARDWARE_LATE;
}
void MQTTSubscribeSensor::set_qos(uint8_t qos) {
this->qos_ = qos;
}

} // namespace sensor

ESPHOMELIB_NAMESPACE_END

#endif //USE_MQTT_SUBSCRIBE_SENSOR
43 changes: 43 additions & 0 deletions src/esphomelib/sensor/mqtt_subscribe_sensor.h
@@ -0,0 +1,43 @@
//
// mqtt_subscribe_sensor.h
// esphomelib
//
// Created by Otto Winter on 2018/10/10.
// Copyright © 2018 Otto Winter. All rights reserved.
//

#ifndef ESPHOMELIB_SENSOR_MQTT_SUBSCRIBE_SENSOR_H
#define ESPHOMELIB_SENSOR_MQTT_SUBSCRIBE_SENSOR_H

#include "esphomelib/defines.h"

#ifdef USE_MQTT_SUBSCRIBE_SENSOR

#include "esphomelib/component.h"
#include "esphomelib/sensor/sensor.h"

ESPHOMELIB_NAMESPACE_BEGIN

namespace sensor {

class MQTTSubscribeSensor : public Sensor, public Component {
public:
MQTTSubscribeSensor(const std::string &name, std::string topic);

void setup() override;
float get_setup_priority() const override;

void set_qos(uint8_t qos);

protected:
std::string topic_;
uint8_t qos_{0};
};

} // namespace sensor

ESPHOMELIB_NAMESPACE_END

#endif //USE_MQTT_SUBSCRIBE_SENSOR

#endif //ESPHOMELIB_SENSOR_MQTT_SUBSCRIBE_SENSOR_H