1
0
mirror of https://github.com/esphome/esphome.git synced 2025-02-21 20:38:16 +00:00
Pascal Vizeli 6236db1a27
Add uFire ISE sensor (#3789)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
2022-09-14 16:51:20 +12:00

96 lines
3.0 KiB
C++

#pragma once
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
#include "esphome/core/hal.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/i2c/i2c.h"
namespace esphome {
namespace ufire_ise {
static const float PROBE_MV_TO_PH = 59.2;
static const float PROBE_TMP_CORRECTION = 0.03;
static const uint8_t CONFIG_TEMP_COMPENSATION = 0x02;
static const uint8_t REGISTER_VERSION = 0;
static const uint8_t REGISTER_MV = 1;
static const uint8_t REGISTER_TEMP = 5;
static const uint8_t REGISTER_REFHIGH = 13;
static const uint8_t REGISTER_REFLOW = 17;
static const uint8_t REGISTER_READHIGH = 21;
static const uint8_t REGISTER_READLOW = 25;
static const uint8_t REGISTER_SOLUTION = 29;
static const uint8_t REGISTER_CONFIG = 38;
static const uint8_t REGISTER_TASK = 39;
static const uint8_t COMMAND_CALIBRATE_HIGH = 8;
static const uint8_t COMMAND_CALIBRATE_LOW = 10;
static const uint8_t COMMAND_MEASURE_TEMP = 40;
static const uint8_t COMMAND_MEASURE_MV = 80;
class UFireISEComponent : public PollingComponent, public i2c::I2CDevice {
public:
void setup() override;
void update() override;
void dump_config() override;
void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; }
void set_temperature_sensor_external(sensor::Sensor *temperature_sensor) {
this->temperature_sensor_external_ = temperature_sensor;
}
void set_ph_sensor(sensor::Sensor *ph_sensor) { this->ph_sensor_ = ph_sensor; }
void calibrate_probe_low(float solution);
void calibrate_probe_high(float solution);
void reset_board();
protected:
float measure_temperature_();
float measure_mv_();
float measure_ph_(float temperature);
void set_solution_(float solution);
float read_data_(uint8_t reg);
void write_data_(uint8_t reg, float data);
void update_internal_();
sensor::Sensor *temperature_sensor_{nullptr};
sensor::Sensor *temperature_sensor_external_{nullptr};
sensor::Sensor *ph_sensor_{nullptr};
};
template<typename... Ts> class UFireISECalibrateProbeLowAction : public Action<Ts...> {
public:
UFireISECalibrateProbeLowAction(UFireISEComponent *parent) : parent_(parent) {}
TEMPLATABLE_VALUE(float, solution)
void play(Ts... x) override { this->parent_->calibrate_probe_low(this->solution_.value(x...)); }
protected:
UFireISEComponent *parent_;
};
template<typename... Ts> class UFireISECalibrateProbeHighAction : public Action<Ts...> {
public:
UFireISECalibrateProbeHighAction(UFireISEComponent *parent) : parent_(parent) {}
TEMPLATABLE_VALUE(float, solution)
void play(Ts... x) override { this->parent_->calibrate_probe_high(this->solution_.value(x...)); }
protected:
UFireISEComponent *parent_;
};
template<typename... Ts> class UFireISEResetAction : public Action<Ts...> {
public:
UFireISEResetAction(UFireISEComponent *parent) : parent_(parent) {}
void play(Ts... x) override { this->parent_->reset_board(); }
protected:
UFireISEComponent *parent_;
};
} // namespace ufire_ise
} // namespace esphome