add usb_device

This commit is contained in:
Tomasz Duda 2024-10-01 14:46:57 +02:00
parent 68928aee7c
commit 2b6ddd9d04
6 changed files with 141 additions and 0 deletions

View file

@ -0,0 +1,43 @@
import esphome.config_validation as cv
import esphome.codegen as cg
from esphome.core import CORE
from esphome.const import (
CONF_ID,
)
from esphome.components.esp32.const import (
KEY_ESP32,
KEY_VARIANT,
VARIANT_ESP32S2,
VARIANT_ESP32S3,
)
import esphome.final_validate as fv
CODEOWNERS = ["@tomaszduda23"]
CONF_USB_DEVICE_ID = "usb_device_id"
def _validate_variant(value):
variant = CORE.data[KEY_ESP32][KEY_VARIANT]
if variant not in [VARIANT_ESP32S2, VARIANT_ESP32S3]:
raise cv.Invalid(f"USB device is unsupported by ESP32 variant {variant}")
return value
CONF_USB_DEVICE = "usb_device"
usb_device_ns = cg.esphome_ns.namespace(CONF_USB_DEVICE)
UsbDevice = usb_device_ns.class_("UsbDevice", cg.PollingComponent)
CONFIG_SCHEMA = cv.All(
cv.Schema(
{
cv.GenerateID(): cv.declare_id(UsbDevice),
}
).extend(cv.polling_component_schema("10s")),
cv.only_with_arduino,
cv.only_on_esp32,
_validate_variant,
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)

View file

@ -0,0 +1,32 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import binary_sensor
from . import CONF_USB_DEVICE_ID, UsbDevice, CONF_USB_DEVICE
AUTO_LOAD = [CONF_USB_DEVICE]
CONF_CONFIGURED = "configured"
TYPES = [
CONF_CONFIGURED,
]
CONFIG_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_USB_DEVICE_ID): cv.use_id(UsbDevice),
cv.Optional(CONF_CONFIGURED): binary_sensor.binary_sensor_schema(),
}
).extend(cv.COMPONENT_SCHEMA)
async def setup_conf(config, key, hub):
if key in config:
conf = config[key]
var = await binary_sensor.new_binary_sensor(conf)
cg.add(getattr(hub, f"set_{key}_binary_sensor")(var))
async def to_code(config):
hub = await cg.get_variable(config[CONF_USB_DEVICE_ID])
for key in TYPES:
await setup_conf(config, key, hub)

View file

@ -0,0 +1,32 @@
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
#include "usb_device.h"
#include "esphome/core/log.h"
#include "USB.h"
namespace esphome {
namespace usb_device {
static const char *const TAG = "usb_device";
void UsbDevice::update() {
#ifdef USE_BINARY_SENSOR
if (configured_ != nullptr) {
bool configured = USB;
configured_->publish_state(configured);
}
#endif
}
void UsbDevice::dump_config() {
bool configured = USB;
ESP_LOGCONFIG(TAG, "USB device - configured: %s", YESNO(configured));
}
#ifdef USE_BINARY_SENSOR
void UsbDevice::set_configured_binary_sensor(binary_sensor::BinarySensor *sensor) { configured_ = sensor; };
#endif
} // namespace usb_device
} // namespace esphome
#endif

View file

@ -0,0 +1,26 @@
#pragma once
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
#include "esphome/core/component.h"
#include "esphome/core/defines.h"
#ifdef USE_BINARY_SENSOR
#include "esphome/components/binary_sensor/binary_sensor.h"
#endif
namespace esphome {
namespace usb_device {
class UsbDevice : public PollingComponent {
public:
void update() override;
void dump_config() override;
#ifdef USE_BINARY_SENSOR
void set_configured_binary_sensor(binary_sensor::BinarySensor *sensor);
#endif
protected:
#ifdef USE_BINARY_SENSOR
binary_sensor::BinarySensor *configured_;
#endif
};
} // namespace usb_device
} // namespace esphome
#endif

View file

@ -0,0 +1,4 @@
binary_sensor:
- platform: usb_device
configured:
name: USB is configured

View file

@ -0,0 +1,4 @@
binary_sensor:
- platform: usb_device
configured:
name: USB is configured