1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-24 22:22:22 +01:00

🏗 Merge C++ into python codebase (#504)

## Description:

Move esphome-core codebase into esphome (and a bunch of other refactors). See https://github.com/esphome/feature-requests/issues/97

Yes this is a shit ton of work and no there's no way to automate it :( But it will be worth it 👍

Progress:
- Core support (file copy etc): 80%
- Base Abstractions (light, switch): ~50%
- Integrations: ~10%
- Working? Yes, (but only with ported components).

Other refactors:
- Moves all codegen related stuff into a single class: `esphome.codegen` (imported as `cg`)
- Rework coroutine syntax
- Move from `component/platform.py` to `domain/component.py` structure as with HA
- Move all defaults out of C++ and into config validation.
- Remove `make_...` helpers from Application class. Reason: Merge conflicts with every single new integration.
- Pointer Variables are stored globally instead of locally in setup(). Reason: stack size limit.

Future work:
- Rework const.py - Move all `CONF_...` into a conf class (usage `conf.UPDATE_INTERVAL` vs `CONF_UPDATE_INTERVAL`). Reason: Less convoluted import block
- Enable loading from `custom_components` folder.

**Related issue (if applicable):** https://github.com/esphome/feature-requests/issues/97

**Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs#<esphome-docs PR number goes here>

## Checklist:
  - [ ] The code change is tested and works locally.
  - [ ] Tests have been added to verify that the new code works (under `tests/` folder).

If user exposed functionality or configuration variables are added/changed:
  - [ ] Documentation added/updated in [esphomedocs](https://github.com/OttoWinter/esphomedocs).
This commit is contained in:
Otto Winter
2019-04-17 12:06:00 +02:00
committed by GitHub
parent 049807e3ab
commit 6682c43dfa
817 changed files with 54156 additions and 10830 deletions

View File

@@ -0,0 +1,22 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import i2c
from esphome.const import CONF_ID
DEPENDENCIES = ['i2c']
AUTO_LOAD = ['binary_sensor']
CONF_TTP229_ID = 'ttp229_id'
ttp229_ns = cg.esphome_ns.namespace('ttp229')
TTP229LSFComponent = ttp229_ns.class_('TTP229LSFComponent', cg.Component)
CONFIG_SCHEMA = cv.Schema({
cv.GenerateID(): cv.declare_variable_id(TTP229LSFComponent),
}).extend(cv.COMPONENT_SCHEMA).extend(i2c.i2c_device_schema(0x57))
def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
yield cg.register_component(var, config)
yield i2c.register_i2c_device(var, config)

View File

@@ -0,0 +1,21 @@
from esphome.components import binary_sensor
import esphome.config_validation as cv
import esphome.codegen as cg
from esphome.const import CONF_CHANNEL, CONF_NAME, CONF_ID
from . import ttp229_ns, TTP229LSFComponent, CONF_TTP229_ID
DEPENDENCIES = ['ttp229_lsf']
TTP229Channel = ttp229_ns.class_('TTP229Channel', binary_sensor.BinarySensor)
CONFIG_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_SCHEMA.extend({
cv.GenerateID(): cv.declare_variable_id(TTP229Channel),
cv.GenerateID(CONF_TTP229_ID): cv.use_variable_id(TTP229LSFComponent),
cv.Required(CONF_CHANNEL): cv.All(cv.Coerce(int), cv.Range(min=0, max=15))
}))
def to_code(config):
hub = yield cg.get_variable(config[CONF_TTP229_ID])
var = cg.new_Pvariable(config[CONF_ID], config[CONF_NAME], config[CONF_CHANNEL])
yield binary_sensor.register_binary_sensor(var, config)
cg.add(hub.register_channel(var))

View File

@@ -0,0 +1,43 @@
#include "ttp229.h"
#include "esphome/core/log.h"
namespace esphome {
namespace ttp229 {
static const char *TAG = "ttp229";
void TTP229LSFComponent::setup() {
ESP_LOGCONFIG(TAG, "Setting up ttp229...");
if (!this->parent_->raw_request_from(this->address_, 2)) {
this->error_code_ = COMMUNICATION_FAILED;
this->mark_failed();
return;
}
}
void TTP229LSFComponent::dump_config() {
ESP_LOGCONFIG(TAG, "ttp229:");
LOG_I2C_DEVICE(this);
switch (this->error_code_) {
case COMMUNICATION_FAILED:
ESP_LOGE(TAG, "Communication with TTP229 failed!");
break;
case NONE:
default:
break;
}
}
void TTP229LSFComponent::loop() {
uint16_t touched = 0;
if (!this->parent_->raw_receive_16(this->address_, &touched, 1)) {
this->status_set_warning();
return;
}
this->status_clear_warning();
touched = reverse_bits_16(touched);
for (auto *channel : this->channels_) {
channel->process(touched);
}
}
} // namespace ttp229
} // namespace esphome

View File

@@ -0,0 +1,36 @@
#pragma once
#include "esphome/core/component.h"
#include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/i2c/i2c.h"
namespace esphome {
namespace ttp229 {
class TTP229Channel : public binary_sensor::BinarySensor {
public:
TTP229Channel(const std::string &name, int channel) : BinarySensor(name), channel_(channel) {}
void process(uint16_t data) { this->publish_state(data & (1 << this->channel_)); }
protected:
int channel_;
};
class TTP229LSFComponent : public Component, public i2c::I2CDevice {
public:
void register_channel(TTP229Channel *channel) { this->channels_.push_back(channel); }
void setup() override;
void dump_config() override;
float get_setup_priority() const override { return setup_priority::DATA; }
void loop() override;
protected:
std::vector<TTP229Channel *> channels_{};
enum ErrorCode {
NONE = 0,
COMMUNICATION_FAILED,
} error_code_{NONE};
};
} // namespace ttp229
} // namespace esphome