mirror of
https://github.com/randybb/esphome-configs.git
synced 2026-10-14 08:35:12 +02:00
Compare commits
21
Commits
3f9a8c3117
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3374ed6ad8 | ||
|
|
e5f9c5813e | ||
|
|
2b66f1a60d | ||
|
|
05060756e3 | ||
|
|
7cc90187d1 | ||
|
|
26a09b37bc | ||
|
|
4c45ebdc4a | ||
|
|
2ad74b9d05 | ||
|
|
b1b57818df | ||
|
|
1a83052d90 | ||
|
|
8eae480253 | ||
|
|
5fdacb82df | ||
|
|
9eb5cd9155 | ||
|
|
b8f8649833 | ||
|
|
5fdea643a7 | ||
|
|
4bbf26fc87 | ||
|
|
427e9ac136 | ||
|
|
005c9903bf | ||
|
|
db57574497 | ||
|
|
fd7a4c98b5 | ||
|
|
2e8b678072 |
No files matched your search
+28781
File diff suppressed because it is too large.
Load diff
+86576
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
# ESP8266 core with LEAmDNS announcing the IPv6 addresses (AAAA, ff02::fb) from
|
||||||
|
# randybb/Arduino@mdns-ipv6-aaaa (esp8266/Arduino#9068); add next to common_esp8266.yaml.
|
||||||
|
# The device must not set 'toolchain: arduino' (no custom framework source there).
|
||||||
|
# Drop once it's upstream and in an ESPHome release.
|
||||||
|
esp8266:
|
||||||
|
toolchain: platformio
|
||||||
|
framework:
|
||||||
|
version: 3.1.2
|
||||||
|
source: https://github.com/randybb/Arduino.git#mdns-ipv6-aaaa
|
||||||
+3
-23
@@ -3,32 +3,12 @@
|
|||||||
# packages:
|
# packages:
|
||||||
# common: !include common/common.yaml
|
# common: !include common/common.yaml
|
||||||
# ipv6_only: !include common/ipv6_only.yaml
|
# ipv6_only: !include common/ipv6_only.yaml
|
||||||
external_components:
|
# Ethernet devices use common/ipv6_only_eth.yaml (this without the WiFi part)
|
||||||
# network enable_ipv4 + audio HTTP reader over IPv6 (esphome/esphome#19750), drop once merged
|
packages:
|
||||||
- source: github://pr#19750
|
base: !include ipv6_only_eth.yaml
|
||||||
components: [const, network, wifi, audio]
|
|
||||||
|
|
||||||
wifi:
|
wifi:
|
||||||
networks:
|
networks:
|
||||||
- id: !extend wifi_iot
|
- id: !extend wifi_iot
|
||||||
ssid: !secret wifi_ssid_ipv6
|
ssid: !secret wifi_ssid_ipv6
|
||||||
password: !secret wifi_password_ipv6
|
password: !secret wifi_password_ipv6
|
||||||
|
|
||||||
esp32:
|
|
||||||
framework:
|
|
||||||
components:
|
|
||||||
# mdns 1.12.0 + fix for "A 0.0.0.0" without IPv4 (espressif/esp-protocols PR pending), drop once released
|
|
||||||
- name: espressif/mdns
|
|
||||||
source: https://github.com/randybb/esp-protocols.git
|
|
||||||
ref: mdns-v1.12.0-zero-ipv4-test
|
|
||||||
path: components/mdns
|
|
||||||
# IDF v5.5.5 lwip + .local resolution over IPv6 (espressif/esp-lwip#94), drop once in IDF
|
|
||||||
- name: lwip
|
|
||||||
source: https://github.com/randybb/esp-lwip.git
|
|
||||||
ref: idf-v5.5.5-lwip-component
|
|
||||||
path: lwip
|
|
||||||
|
|
||||||
network:
|
|
||||||
enable_ipv6: true
|
|
||||||
enable_ipv4: false
|
|
||||||
min_ipv6_addr_count: 1
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
# IPv6-only IoT network (SLAAC, no DHCPv4) for ethernet devices; add next to a common package:
|
||||||
|
# packages:
|
||||||
|
# common_eth: !include common/common_eth.yaml
|
||||||
|
# ipv6_only: !include common/ipv6_only_eth.yaml
|
||||||
|
# WiFi devices use common/ipv6_only.yaml (this + the IPv6 SSID)
|
||||||
|
external_components:
|
||||||
|
# network enable_ipv4 + audio HTTP reader over IPv6 (esphome/esphome#19750), drop once merged
|
||||||
|
- source: github://pr#19750
|
||||||
|
components: [const, network, wifi, ethernet, audio]
|
||||||
|
refresh: 1h
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
framework:
|
||||||
|
components:
|
||||||
|
# mdns 1.14.0: no "A 0.0.0.0" without IPv4 + IPv6 on ETH-only builds (espressif/esp-protocols#1156, #1161),
|
||||||
|
# drop once on ESPHome 2026.10.0 (esphome/esphome#20383 bumps the pin from 1.12.0)
|
||||||
|
- name: espressif/mdns
|
||||||
|
ref: 1.14.0
|
||||||
|
# IDF v5.5.5 lwip + .local resolution over IPv6 (espressif/esp-lwip#94), drop once in IDF
|
||||||
|
- name: lwip
|
||||||
|
source: https://github.com/randybb/esp-lwip.git
|
||||||
|
ref: idf-v5.5.5-lwip-component
|
||||||
|
path: lwip
|
||||||
|
|
||||||
|
network:
|
||||||
|
enable_ipv6: true
|
||||||
|
enable_ipv4: false
|
||||||
|
min_ipv6_addr_count: 1
|
||||||
@@ -9,3 +9,4 @@ wifi:
|
|||||||
enable_btm: true
|
enable_btm: true
|
||||||
enable_rrm: true
|
enable_rrm: true
|
||||||
min_auth_mode: WPA3
|
min_auth_mode: WPA3
|
||||||
|
power_save_mode: none
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
#pragma once
|
||||||
|
// Moonraker client for mcu-cnc-pendant on its own FreeRTOS task: esp_http_client blocks
|
||||||
|
// (DNS is not bounded by timeout_ms), so the main loop only queues commands and reads
|
||||||
|
// the last polled status. An unreachable Klipper shows as "offline" instead of starving
|
||||||
|
// the loop into the task watchdog.
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "esp_http_client.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
|
||||||
|
#include "esphome/components/json/json_util.h"
|
||||||
|
#include "esphome/core/hal.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
|
|
||||||
|
namespace moonraker {
|
||||||
|
|
||||||
|
struct Status {
|
||||||
|
float pos[3]{};
|
||||||
|
std::string homed;
|
||||||
|
std::string state{"offline"};
|
||||||
|
};
|
||||||
|
|
||||||
|
class Client {
|
||||||
|
public:
|
||||||
|
void start(const char *base) {
|
||||||
|
this->base_ = base;
|
||||||
|
xTaskCreate(task, "moonraker", 6144, this, 1, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run G-code; dropped when Klipper is not keeping up.
|
||||||
|
void gcode(const std::string &script) {
|
||||||
|
JsonDocument doc;
|
||||||
|
doc["script"] = script;
|
||||||
|
std::string body;
|
||||||
|
serializeJson(doc, body);
|
||||||
|
this->post("/printer/gcode/script", body);
|
||||||
|
}
|
||||||
|
|
||||||
|
// urgent: throw away everything queued and send this first (emergency stop)
|
||||||
|
void post(const std::string &path, const std::string &body = "", bool urgent = false) {
|
||||||
|
std::lock_guard<std::mutex> lock(this->mutex_);
|
||||||
|
if (urgent) {
|
||||||
|
this->queue_.clear();
|
||||||
|
} else if (this->queue_.size() >= MAX_QUEUE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->queue_.emplace_back(path, body);
|
||||||
|
}
|
||||||
|
|
||||||
|
Status status() {
|
||||||
|
std::lock_guard<std::mutex> lock(this->mutex_);
|
||||||
|
return this->status_;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static constexpr size_t MAX_QUEUE = 8;
|
||||||
|
static constexpr uint32_t POLL_MS = 250;
|
||||||
|
static constexpr int TIMEOUT_MS = 1000;
|
||||||
|
|
||||||
|
static void task(void *arg) {
|
||||||
|
auto *self = static_cast<Client *>(arg);
|
||||||
|
uint32_t last_poll = 0;
|
||||||
|
for (;;) {
|
||||||
|
std::pair<std::string, std::string> cmd;
|
||||||
|
bool have_cmd = false;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(self->mutex_);
|
||||||
|
if (!self->queue_.empty()) {
|
||||||
|
cmd = std::move(self->queue_.front());
|
||||||
|
self->queue_.pop_front();
|
||||||
|
have_cmd = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (have_cmd) {
|
||||||
|
int code = self->request(cmd.first, &cmd.second, nullptr);
|
||||||
|
if (code != 200)
|
||||||
|
ESP_LOGW("moonraker", "POST %s failed (%d): %s", cmd.first.c_str(), code, cmd.second.c_str());
|
||||||
|
continue; // drain commands before the next poll
|
||||||
|
}
|
||||||
|
if (esphome::millis() - last_poll >= POLL_MS) {
|
||||||
|
last_poll = esphome::millis();
|
||||||
|
self->poll();
|
||||||
|
}
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void poll() {
|
||||||
|
std::string body;
|
||||||
|
Status s;
|
||||||
|
if (this->request("/printer/objects/query?gcode_move=gcode_position&toolhead=homed_axes&print_stats=state",
|
||||||
|
nullptr, &body) == 200) {
|
||||||
|
auto doc = esphome::json::parse_json(body);
|
||||||
|
JsonObject st = doc["result"]["status"];
|
||||||
|
JsonArray p = st["gcode_move"]["gcode_position"];
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
s.pos[i] = p[i];
|
||||||
|
s.homed = st["toolhead"]["homed_axes"].as<std::string>();
|
||||||
|
s.state = st["print_stats"]["state"].as<std::string>();
|
||||||
|
} else {
|
||||||
|
std::lock_guard<std::mutex> lock(this->mutex_);
|
||||||
|
s.pos[0] = this->status_.pos[0]; // keep the last position, only flag offline
|
||||||
|
s.pos[1] = this->status_.pos[1];
|
||||||
|
s.pos[2] = this->status_.pos[2];
|
||||||
|
}
|
||||||
|
std::lock_guard<std::mutex> lock(this->mutex_);
|
||||||
|
this->status_ = std::move(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// POST when body is set, GET otherwise; returns the HTTP status or -1
|
||||||
|
int request(const std::string &path, const std::string *body, std::string *out) {
|
||||||
|
std::string url = this->base_ + path;
|
||||||
|
esp_http_client_config_t cfg{};
|
||||||
|
cfg.url = url.c_str();
|
||||||
|
cfg.timeout_ms = TIMEOUT_MS;
|
||||||
|
cfg.method = body ? HTTP_METHOD_POST : HTTP_METHOD_GET;
|
||||||
|
esp_http_client_handle_t c = esp_http_client_init(&cfg);
|
||||||
|
if (c == nullptr)
|
||||||
|
return -1;
|
||||||
|
int code = -1;
|
||||||
|
int len = body ? body->size() : 0;
|
||||||
|
if (len > 0)
|
||||||
|
esp_http_client_set_header(c, "Content-Type", "application/json");
|
||||||
|
if (esp_http_client_open(c, len) == ESP_OK && (len == 0 || esp_http_client_write(c, body->data(), len) == len)) {
|
||||||
|
esp_http_client_fetch_headers(c);
|
||||||
|
code = esp_http_client_get_status_code(c);
|
||||||
|
char buf[256];
|
||||||
|
int n;
|
||||||
|
while (out != nullptr && (n = esp_http_client_read(c, buf, sizeof(buf))) > 0)
|
||||||
|
out->append(buf, n);
|
||||||
|
}
|
||||||
|
esp_http_client_cleanup(c);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string base_;
|
||||||
|
std::mutex mutex_;
|
||||||
|
std::deque<std::pair<std::string, std::string>> queue_;
|
||||||
|
Status status_;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline Client client;
|
||||||
|
|
||||||
|
} // namespace moonraker
|
||||||
@@ -25,6 +25,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
status_led:
|
status_led:
|
||||||
pin:
|
pin:
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
globals:
|
globals:
|
||||||
- id: aerator_auto
|
- id: aerator_auto
|
||||||
|
|||||||
@@ -0,0 +1,235 @@
|
|||||||
|
---
|
||||||
|
# Hardware: M5Stack M5Stamp S3 in the ESPendant case (github.com/positron96/ESP32_CNC_Pendant),
|
||||||
|
# talks to Klipper over Moonraker HTTP API
|
||||||
|
# Pinout:
|
||||||
|
# GPIO0 Stamp button (boot) -> stamp_button (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO1 Handwheel A -> handwheel (sensor rotary_encoder pin_a)
|
||||||
|
# GPIO2 Handwheel B -> handwheel (sensor rotary_encoder pin_b)
|
||||||
|
# GPIO4 Axis encoder A -> axis_encoder (sensor rotary_encoder pin_a)
|
||||||
|
# GPIO5 Axis encoder B -> axis_encoder (sensor rotary_encoder pin_b)
|
||||||
|
# GPIO6 Axis encoder push -> axis_button (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO7 Step encoder A -> step_encoder (sensor rotary_encoder pin_a)
|
||||||
|
# GPIO8 Step encoder B -> step_encoder (sensor rotary_encoder pin_b)
|
||||||
|
# GPIO9 Step encoder push -> step_button (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO10 BT1 -> bt1 (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO11 BT2 -> bt2 (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO12 BT3 -> bt3 (binary_sensor gpio) (inverted)
|
||||||
|
# GPIO13 LCD E (SCK) -> spi (spi clk_pin)
|
||||||
|
# GPIO14 LCD R/W (MOSI) -> spi (spi mosi_pin)
|
||||||
|
# GPIO15 LCD RS (CS) -> lcd (display st7920 cs_pin)
|
||||||
|
# GPIO21 RGB LED -> status_rgb (light esp32_rmt_led_strip)
|
||||||
|
# GPIO39-44 free (BT4-BT6 later)
|
||||||
|
# LCD RST: RC to 3.3 V, PSB to GND (serial mode)
|
||||||
|
substitutions:
|
||||||
|
device: cnc-pendant
|
||||||
|
name: CNC Pendant
|
||||||
|
area: Workshop
|
||||||
|
comment: Klipper CNC pendant
|
||||||
|
moonraker: http://klipper.local:7125
|
||||||
|
max_feed: "3000" # mm/min, handwheel jog feed cap
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: mcu-${device}
|
||||||
|
friendly_name: ${name}
|
||||||
|
area: ${area}
|
||||||
|
comment: ${comment}
|
||||||
|
includes:
|
||||||
|
- include/moonraker.h
|
||||||
|
on_boot:
|
||||||
|
- lambda: 'moonraker::client.start("${moonraker}");'
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
variant: esp32s3
|
||||||
|
flash_size: 8MB
|
||||||
|
toolchain: esp-idf
|
||||||
|
framework:
|
||||||
|
type: esp-idf
|
||||||
|
|
||||||
|
packages:
|
||||||
|
common: !include common/common.yaml
|
||||||
|
# ipv6_only: !include common/ipv6_only.yaml
|
||||||
|
status_led: !include
|
||||||
|
file: common/status_led.yaml
|
||||||
|
vars:
|
||||||
|
light_id: status_rgb
|
||||||
|
|
||||||
|
light:
|
||||||
|
- platform: esp32_rmt_led_strip
|
||||||
|
id: status_rgb
|
||||||
|
name: LED
|
||||||
|
pin: 21
|
||||||
|
num_leds: 1
|
||||||
|
chipset: ws2812
|
||||||
|
rgb_order: GRB
|
||||||
|
restore_mode: ALWAYS_OFF
|
||||||
|
|
||||||
|
# only links esp_http_client for include/moonraker.h, which runs requests on its own task
|
||||||
|
http_request:
|
||||||
|
|
||||||
|
globals:
|
||||||
|
- id: axis
|
||||||
|
type: int
|
||||||
|
initial_value: "0" # 0 X, 1 Y, 2 Z
|
||||||
|
- id: step
|
||||||
|
type: int
|
||||||
|
initial_value: "1" # index into steps[] in the jog interval
|
||||||
|
- id: wheel_sent
|
||||||
|
type: float
|
||||||
|
initial_value: "0"
|
||||||
|
|
||||||
|
interval:
|
||||||
|
# handwheel: send the counts since the last jog as one relative move
|
||||||
|
- interval: 100ms
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
static const float steps[] = {0.01f, 0.1f, 1.0f};
|
||||||
|
float delta = id(handwheel).state - id(wheel_sent);
|
||||||
|
if (delta == 0 || std::isnan(delta)) return;
|
||||||
|
id(wheel_sent) = id(handwheel).state;
|
||||||
|
float dist = delta * steps[id(step)];
|
||||||
|
// feed so the move takes ~100 ms, i.e. about one interval
|
||||||
|
// ponytail: capped feed lets fast spins queue moves that keep running after the wheel stops; drop excess counts if that bites
|
||||||
|
float feed = std::min(std::max(std::fabs(dist) * 600.0f, 60.0f), ${max_feed}.0f);
|
||||||
|
moonraker::client.gcode(str_sprintf("G91\nG1 %c%.3f F%.0f\nG90", "XYZ"[id(axis)], dist, feed));
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: rotary_encoder
|
||||||
|
id: handwheel
|
||||||
|
pin_a:
|
||||||
|
number: 1
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
pin_b:
|
||||||
|
number: 2
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
resolution: 1 # calibration: counts per detent, flip pin_a/pin_b if direction is wrong
|
||||||
|
- platform: rotary_encoder
|
||||||
|
id: axis_encoder
|
||||||
|
pin_a:
|
||||||
|
number: 4
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
pin_b:
|
||||||
|
number: 5
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
on_clockwise:
|
||||||
|
- lambda: 'id(axis) = std::min(id(axis) + 1, 2);'
|
||||||
|
on_anticlockwise:
|
||||||
|
- lambda: 'id(axis) = std::max(id(axis) - 1, 0);'
|
||||||
|
- platform: rotary_encoder
|
||||||
|
id: step_encoder
|
||||||
|
pin_a:
|
||||||
|
number: 7
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
pin_b:
|
||||||
|
number: 8
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
on_clockwise:
|
||||||
|
- lambda: 'id(step) = std::min(id(step) + 1, 2);'
|
||||||
|
on_anticlockwise:
|
||||||
|
- lambda: 'id(step) = std::max(id(step) - 1, 0);'
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- platform: gpio
|
||||||
|
id: stamp_button
|
||||||
|
name: Stamp Button
|
||||||
|
pin:
|
||||||
|
number: 0
|
||||||
|
inverted: true
|
||||||
|
# axis push: zero the selected axis in work coordinates
|
||||||
|
- platform: gpio
|
||||||
|
id: axis_button
|
||||||
|
name: Axis Button
|
||||||
|
pin:
|
||||||
|
number: 6
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
inverted: true
|
||||||
|
filters:
|
||||||
|
- delayed_on_off: 20ms
|
||||||
|
on_press:
|
||||||
|
- lambda: 'moonraker::client.gcode(str_sprintf("G92 %c0", "XYZ"[id(axis)]));'
|
||||||
|
- platform: gpio
|
||||||
|
id: step_button
|
||||||
|
name: Step Button
|
||||||
|
pin:
|
||||||
|
number: 9
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
inverted: true
|
||||||
|
filters:
|
||||||
|
- delayed_on_off: 20ms
|
||||||
|
# BT1: home all
|
||||||
|
- platform: gpio
|
||||||
|
id: bt1
|
||||||
|
name: BT1
|
||||||
|
pin:
|
||||||
|
number: 10
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
inverted: true
|
||||||
|
filters:
|
||||||
|
- delayed_on_off: 20ms
|
||||||
|
on_press:
|
||||||
|
- lambda: 'moonraker::client.gcode("G28");'
|
||||||
|
# BT2: pause / resume
|
||||||
|
- platform: gpio
|
||||||
|
id: bt2
|
||||||
|
name: BT2
|
||||||
|
pin:
|
||||||
|
number: 11
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
inverted: true
|
||||||
|
filters:
|
||||||
|
- delayed_on_off: 20ms
|
||||||
|
on_press:
|
||||||
|
- lambda: 'moonraker::client.post(moonraker::client.status().state == "paused" ? "/printer/print/resume" : "/printer/print/pause");'
|
||||||
|
# BT3: hold 1 s for emergency stop (Klipper needs FIRMWARE_RESTART afterwards)
|
||||||
|
- platform: gpio
|
||||||
|
id: bt3
|
||||||
|
name: BT3
|
||||||
|
pin:
|
||||||
|
number: 12
|
||||||
|
mode: INPUT_PULLUP
|
||||||
|
inverted: true
|
||||||
|
filters:
|
||||||
|
- delayed_on_off: 20ms
|
||||||
|
on_multi_click:
|
||||||
|
- timing:
|
||||||
|
- ON for at least 1s
|
||||||
|
then:
|
||||||
|
- lambda: 'moonraker::client.post("/printer/emergency_stop", "", true);'
|
||||||
|
|
||||||
|
font:
|
||||||
|
# X11 misc-fixed bitmap fonts (as in u8g2 / Marlin), 6 px wide: axis letter + "-123.456" fits 64 px
|
||||||
|
- file: assets/fonts/6x13.bdf
|
||||||
|
id: font_big
|
||||||
|
- file: assets/fonts/6x10.bdf
|
||||||
|
id: font_small
|
||||||
|
|
||||||
|
spi:
|
||||||
|
clk_pin: 13
|
||||||
|
mosi_pin: 14
|
||||||
|
|
||||||
|
display:
|
||||||
|
- platform: st7920
|
||||||
|
id: lcd
|
||||||
|
cs_pin:
|
||||||
|
number: 15
|
||||||
|
inverted: true # ST7920 RS/CS is active high
|
||||||
|
data_rate: 1MHz # default 200kHz takes ~220 ms per frame; drop back if the picture garbles
|
||||||
|
width: 128
|
||||||
|
height: 64
|
||||||
|
rotation: 90 # mounted portrait, 270 if upside down
|
||||||
|
update_interval: 200ms
|
||||||
|
lambda: |-
|
||||||
|
static const char *steps[] = {"0.01", "0.1", "1"};
|
||||||
|
auto s = moonraker::client.status();
|
||||||
|
it.printf(0, 0, id(font_small), "%s", s.state.c_str());
|
||||||
|
it.printf(0, 10, id(font_small), "H:%s", s.homed.empty() ? "-" : s.homed.c_str());
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
int y = 22 + i * 14;
|
||||||
|
Color c = COLOR_ON;
|
||||||
|
if (i == id(axis)) {
|
||||||
|
it.filled_rectangle(0, y, 64, 13);
|
||||||
|
c = COLOR_OFF;
|
||||||
|
}
|
||||||
|
it.printf(1, y + 1, id(font_big), c, "%c", "XYZ"[i]);
|
||||||
|
it.printf(63, y + 1, id(font_big), c, TextAlign::TOP_RIGHT, "%.3f", s.pos[i]);
|
||||||
|
}
|
||||||
|
it.printf(0, 118, id(font_small), "%s mm", steps[id(step)]);
|
||||||
+2
-2
@@ -148,10 +148,10 @@ media_player:
|
|||||||
buffer_size: 14000
|
buffer_size: 14000
|
||||||
media_pipeline:
|
media_pipeline:
|
||||||
speaker: media_spk_resampling_input
|
speaker: media_spk_resampling_input
|
||||||
format: NONE
|
format: WAV # no PSRAM: HA transcodes to WAV, decoding MP3/FLAC here runs the heap out
|
||||||
announcement_pipeline:
|
announcement_pipeline:
|
||||||
speaker: announcement_spk_resampling_input
|
speaker: announcement_spk_resampling_input
|
||||||
format: NONE
|
format: WAV # no PSRAM: HA transcodes to WAV, decoding MP3/FLAC here runs the heap out
|
||||||
|
|
||||||
rtttl:
|
rtttl:
|
||||||
id: my_rtttl
|
id: my_rtttl
|
||||||
|
|||||||
+7
-47
@@ -37,56 +37,26 @@ esp32:
|
|||||||
flash_chip: gd
|
flash_chip: gd
|
||||||
type: esp-idf
|
type: esp-idf
|
||||||
|
|
||||||
external_components:
|
|
||||||
# - source: github://pr#12717
|
|
||||||
# components: [ds248x]
|
|
||||||
# refresh: 1h
|
|
||||||
- source: github://pr#13534
|
|
||||||
components: [ds2482, ds2484, ds248x_base]
|
|
||||||
refresh: 1h
|
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common.yaml
|
common: !include common/common.yaml
|
||||||
ipv6_only: !include common/ipv6_only.yaml
|
ipv6_only: !include common/ipv6_only.yaml
|
||||||
status_led: !include common/status_led_atom.yaml
|
status_led: !include common/status_led_atom.yaml
|
||||||
|
|
||||||
|
|
||||||
i2c:
|
i2c:
|
||||||
# - id: i2c0
|
|
||||||
# sda: 26
|
|
||||||
# scl: 32
|
|
||||||
# scan: true #false
|
|
||||||
# - id: i2c1
|
|
||||||
sda: 25
|
sda: 25
|
||||||
scl: 21
|
scl: 21
|
||||||
scan: true #false
|
scan: true #false
|
||||||
|
|
||||||
# ds248x:
|
ds248x:
|
||||||
# # i2c_id: i2c_main
|
id: ds2484_module
|
||||||
# address: 0x18 # should be the default
|
type: ds2482-100
|
||||||
# # sleep_pin: 32 # remove if not needed, if set the ds248x sleeps when no transaction is in progress
|
address: 0x18
|
||||||
# active_pullup: true # adds a active pullup which should improve signal integrity
|
active_pullup: true
|
||||||
# strong_pullup: false # enables a strong pullup used to provide the needed current for temperature reading without vcc connected
|
|
||||||
# bus_sleep: true # power down the bus when no transaction is in progres
|
|
||||||
|
|
||||||
# one_wire:
|
|
||||||
# id: one_wire_bus
|
|
||||||
# platform: ds2484
|
|
||||||
# active_pullup: true
|
|
||||||
|
|
||||||
# ds248x:
|
|
||||||
# id: ds2484_module
|
|
||||||
# address: 0x18
|
|
||||||
|
|
||||||
# one_wire:
|
|
||||||
# - platform: ds248x
|
|
||||||
# ds248x_id: ds2484_module
|
|
||||||
# id: one_wire_bus
|
|
||||||
|
|
||||||
one_wire:
|
one_wire:
|
||||||
|
- platform: ds248x
|
||||||
|
ds248x_id: ds2484_module
|
||||||
id: one_wire_bus
|
id: one_wire_bus
|
||||||
platform: ds2482
|
|
||||||
active_pullup: true
|
|
||||||
|
|
||||||
pca9554:
|
pca9554:
|
||||||
- id: pca9554_module
|
- id: pca9554_module
|
||||||
@@ -133,16 +103,6 @@ sensor:
|
|||||||
# index: 0
|
# index: 0
|
||||||
name: Temperature
|
name: Temperature
|
||||||
id: 'heating_fireplace_temperature'
|
id: 'heating_fireplace_temperature'
|
||||||
# - platform: dht
|
|
||||||
# pin: 14
|
|
||||||
# temperature:
|
|
||||||
# name: "Kitchen Temperature"
|
|
||||||
# id: 'kitchen_temperature'
|
|
||||||
# humidity:
|
|
||||||
# name: "Kitchen Humidity"
|
|
||||||
# id: 'kitchen_humidity'
|
|
||||||
# update_interval: 60s
|
|
||||||
# model: si7021
|
|
||||||
|
|
||||||
bluetooth_proxy:
|
bluetooth_proxy:
|
||||||
active: true
|
active: true
|
||||||
@@ -60,6 +60,7 @@ external_components:
|
|||||||
packages:
|
packages:
|
||||||
# common: !include common/common.yaml
|
# common: !include common/common.yaml
|
||||||
common_eth: !include common/common_eth.yaml
|
common_eth: !include common/common_eth.yaml
|
||||||
|
ipv6_only: !include common/ipv6_only_eth.yaml
|
||||||
|
|
||||||
i2c:
|
i2c:
|
||||||
sda: 13
|
sda: 13
|
||||||
|
|||||||
+8
-37
@@ -47,26 +47,11 @@ esp32:
|
|||||||
flash_chip: gd
|
flash_chip: gd
|
||||||
type: esp-idf
|
type: esp-idf
|
||||||
|
|
||||||
external_components:
|
|
||||||
# - source: github://pr#12717
|
|
||||||
# components: [ds248x]
|
|
||||||
# refresh: 1h
|
|
||||||
- source: github://pr#13534
|
|
||||||
components: [ds2482, ds2484, ds248x_base]
|
|
||||||
refresh: 1h
|
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common.yaml
|
common: !include common/common.yaml
|
||||||
ipv6_only: !include common/ipv6_only.yaml
|
ipv6_only: !include common/ipv6_only.yaml
|
||||||
status_led: !include common/status_led_atom.yaml
|
status_led: !include common/status_led_atom.yaml
|
||||||
|
|
||||||
#logger:
|
|
||||||
# level: VERBOSE
|
|
||||||
# logs:
|
|
||||||
# dallas.component: ERROR
|
|
||||||
# uart.component: ERROR
|
|
||||||
# i2c.component: VERBOSE
|
|
||||||
|
|
||||||
# Heating / Hot water Controller
|
# Heating / Hot water Controller
|
||||||
# temp_1: Solar Collector
|
# temp_1: Solar Collector
|
||||||
# temp_2: Cylinder Bottom (solar)
|
# temp_2: Cylinder Bottom (solar)
|
||||||
@@ -170,36 +155,22 @@ climate:
|
|||||||
default_target_temperature_high: 40 °C
|
default_target_temperature_high: 40 °C
|
||||||
|
|
||||||
i2c:
|
i2c:
|
||||||
# - id: i2c0
|
|
||||||
# sda: 26
|
|
||||||
# scl: 32
|
|
||||||
# scan: true #false
|
|
||||||
# - id: i2c1
|
|
||||||
sda: 25
|
sda: 25
|
||||||
scl: 21
|
scl: 21
|
||||||
scan: true #false
|
scan: true #false
|
||||||
|
|
||||||
# one_wire:
|
|
||||||
# id: one_wire_bus
|
|
||||||
# # i2c_id: i2c_main
|
|
||||||
# platform: ds2484
|
|
||||||
# active_pullup: true
|
|
||||||
|
|
||||||
# ds248x:
|
ds248x:
|
||||||
# id: ds2484_module
|
id: ds2482_module
|
||||||
# address: 0x18
|
type: ds2482-100
|
||||||
# active_pullup: true
|
address: 0x18
|
||||||
|
active_pullup: true
|
||||||
# one_wire:
|
|
||||||
# - platform: ds248x
|
|
||||||
# ds248x_id: ds2484_module
|
|
||||||
# id: one_wire_bus
|
|
||||||
|
|
||||||
one_wire:
|
one_wire:
|
||||||
|
- platform: ds248x
|
||||||
|
ds248x_id: ds2482_module
|
||||||
id: one_wire_bus
|
id: one_wire_bus
|
||||||
# i2c_id: i2c_main
|
|
||||||
platform: ds2482
|
|
||||||
active_pullup: true
|
|
||||||
|
|
||||||
modbus:
|
modbus:
|
||||||
uart_id: uart_modbus
|
uart_id: uart_modbus
|
||||||
|
|||||||
+2
-2
@@ -58,8 +58,8 @@ packages:
|
|||||||
ipv6_only: !include common/ipv6_only.yaml
|
ipv6_only: !include common/ipv6_only.yaml
|
||||||
status_led: !include common/status_led_atom.yaml
|
status_led: !include common/status_led_atom.yaml
|
||||||
|
|
||||||
api:
|
# api:
|
||||||
reboot_timeout: 300s
|
# reboot_timeout: 300s
|
||||||
|
|
||||||
i2c:
|
i2c:
|
||||||
# - id: i2c0
|
# - id: i2c0
|
||||||
|
|||||||
+5
-6
@@ -4,8 +4,8 @@
|
|||||||
# P0.06 UART0 TX -> logger (J-Link VCOM)
|
# P0.06 UART0 TX -> logger (J-Link VCOM)
|
||||||
# P0.13 LED 1 (active low) -> ANT+ Connected (a configured device is received)
|
# P0.13 LED 1 (active low) -> ANT+ Connected (a configured device is received)
|
||||||
# P0.14 LED 2 (active low) -> ANT+ Unknown Device (an unconfigured one is in range)
|
# P0.14 LED 2 (active low) -> ANT+ Unknown Device (an unconfigured one is in range)
|
||||||
# P1.01 UART1 TX -> mcu-nrf-dk UART1 RX (P1.01), packet_transport; plus GND
|
# P1.01 UART1 RX <- mcu-nrf-dk UART1 TX (P1.02), packet_transport
|
||||||
# P1.02 UART1 RX (unused)
|
# P1.02 UART1 TX -> mcu-nrf-dk UART1 RX (P1.01), packet_transport; plus GND
|
||||||
# Radio: ANT+ receiver (RadiANT), no network of its own; values go to mcu-nrf-dk
|
# Radio: ANT+ receiver (RadiANT), no network of its own; values go to mcu-nrf-dk
|
||||||
# ANT+ devices:
|
# ANT+ devices:
|
||||||
# 655730 Garmin HRM-Pro heart rate
|
# 655730 Garmin HRM-Pro heart rate
|
||||||
@@ -147,10 +147,9 @@ ant_plus:
|
|||||||
uart:
|
uart:
|
||||||
id: link
|
id: link
|
||||||
port: UART1
|
port: UART1
|
||||||
tx_pin: P1.01
|
# the DK's default UART1 pins, same on both boards, wires crossed
|
||||||
# unused, but must be set: the fork otherwise keeps the board's default RX, which on
|
tx_pin: P1.02
|
||||||
# the DK is P1.01 too, and the UART hears its own transmissions
|
rx_pin: P1.01
|
||||||
rx_pin: P1.02
|
|
||||||
baud_rate: 115200
|
baud_rate: 115200
|
||||||
|
|
||||||
packet_transport:
|
packet_transport:
|
||||||
|
|||||||
+4
-1
@@ -9,7 +9,8 @@
|
|||||||
# P0.16 LED 4 (active low) -> LED 4 (light binary)
|
# P0.16 LED 4 (active low) -> LED 4 (light binary)
|
||||||
# P0.24 Button 3 (active low) -> Button 3 (binary_sensor gpio)
|
# P0.24 Button 3 (active low) -> Button 3 (binary_sensor gpio)
|
||||||
# P0.25 Button 4 (active low) -> Button 4 (binary_sensor gpio)
|
# P0.25 Button 4 (active low) -> Button 4 (binary_sensor gpio)
|
||||||
# P1.01 UART1 RX <- mcu-nrf-ant UART1 TX (P1.01), packet_transport; plus GND
|
# P1.01 UART1 RX <- mcu-nrf-ant UART1 TX (P1.02), packet_transport; plus GND
|
||||||
|
# P1.02 UART1 TX -> mcu-nrf-ant UART1 RX (P1.01), packet_transport
|
||||||
# ANT+ values (Garmin HRM-Pro, Concept2 PM5, Garmin Tempe, Garmin Varia RTL515) come from mcu-nrf-ant
|
# ANT+ values (Garmin HRM-Pro, Concept2 PM5, Garmin Tempe, Garmin Varia RTL515) come from mcu-nrf-ant
|
||||||
esphome:
|
esphome:
|
||||||
name: mcu-nrf-dk
|
name: mcu-nrf-dk
|
||||||
@@ -41,7 +42,9 @@ api:
|
|||||||
uart:
|
uart:
|
||||||
id: ant_link
|
id: ant_link
|
||||||
port: UART1
|
port: UART1
|
||||||
|
# the DK's default UART1 pins, same on both boards, wires crossed
|
||||||
rx_pin: P1.01
|
rx_pin: P1.01
|
||||||
|
tx_pin: P1.02
|
||||||
baud_rate: 115200
|
baud_rate: 115200
|
||||||
|
|
||||||
packet_transport:
|
packet_transport:
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
remote_receiver:
|
remote_receiver:
|
||||||
pin: 4
|
pin: 4
|
||||||
|
|||||||
@@ -0,0 +1,285 @@
|
|||||||
|
---
|
||||||
|
# Hardware: M5Stack M5Stamp S3 + PN5180 module (5 V and 3.3 V both needed)
|
||||||
|
# Pinout:
|
||||||
|
# GPIO0 Button
|
||||||
|
# GPIO3 (external RFID LED, not fitted yet; notify_led uses the onboard RGB for now)
|
||||||
|
# GPIO4 Buzzer -> buzzer (output ledc)
|
||||||
|
# GPIO5 -> spi (spi miso_pin) PN5180 MISO
|
||||||
|
# GPIO6 -> spi (spi mosi_pin) PN5180 MOSI
|
||||||
|
# GPIO7 -> spi (spi clk_pin) PN5180 SCK
|
||||||
|
# GPIO8 -> pn5180 (cs_pin) PN5180 NSS
|
||||||
|
# GPIO9 -> pn5180 (busy_pin) PN5180 BUSY
|
||||||
|
# GPIO10 -> pn5180 (reset_pin) PN5180 RST
|
||||||
|
# GPIO11 -> pn5180 (irq_pin) PN5180 IRQ
|
||||||
|
# GPIO19 U-
|
||||||
|
# GPIO20 U+
|
||||||
|
# GPIO21 RGB -> notify_led (light esp32_rmt_led_strip), also status_led
|
||||||
|
# PN5180 REQ, AUX, GPIO left open (REQ high at reset = firmware download mode)
|
||||||
|
substitutions:
|
||||||
|
device: rfid-openprinttag
|
||||||
|
name: OpenPrintTag
|
||||||
|
area: DEV
|
||||||
|
comment: Filament spool reader (OpenPrintTag, Creality CFS)
|
||||||
|
|
||||||
|
esphome:
|
||||||
|
name: mcu-${device}
|
||||||
|
friendly_name: ${name}
|
||||||
|
area: ${area}
|
||||||
|
comment: ${comment}
|
||||||
|
|
||||||
|
esp32:
|
||||||
|
variant: esp32s3
|
||||||
|
toolchain: esp-idf
|
||||||
|
framework:
|
||||||
|
advanced:
|
||||||
|
flash_chip: gd
|
||||||
|
type: esp-idf
|
||||||
|
|
||||||
|
packages:
|
||||||
|
common: !include common/common.yaml
|
||||||
|
ipv6_only: !include common/ipv6_only.yaml
|
||||||
|
status_led: !include
|
||||||
|
file: common/status_led.yaml
|
||||||
|
vars:
|
||||||
|
light_id: notify_led
|
||||||
|
show_errors: "true"
|
||||||
|
|
||||||
|
external_components:
|
||||||
|
- source: github://randybb/esphome-components
|
||||||
|
components: [pn5180, openprinttag, creality_cfs]
|
||||||
|
refresh: 1h
|
||||||
|
|
||||||
|
# Called by the OpenPrintTag integration (openprinttag.update) to update the aux region
|
||||||
|
api:
|
||||||
|
actions:
|
||||||
|
- action: openprinttag_write_aux
|
||||||
|
variables:
|
||||||
|
uid: string
|
||||||
|
aux: string
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: led_enabled
|
||||||
|
then:
|
||||||
|
- light.turn_on:
|
||||||
|
id: notify_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 100%
|
||||||
|
green: 0%
|
||||||
|
blue: 0%
|
||||||
|
flash_length: 500ms
|
||||||
|
- lambda: id(spool).write_aux(uid, aux);
|
||||||
|
# Writes a Creality CFS record (48 characters, optionally 48 more for sector 2) to the
|
||||||
|
# Creality tag on the reader
|
||||||
|
- action: creality_cfs_write
|
||||||
|
variables:
|
||||||
|
uid: string
|
||||||
|
data: string
|
||||||
|
then:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: led_enabled
|
||||||
|
then:
|
||||||
|
- light.turn_on:
|
||||||
|
id: notify_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 100%
|
||||||
|
green: 0%
|
||||||
|
blue: 0%
|
||||||
|
flash_length: 500ms
|
||||||
|
- lambda: id(creality).write(uid, data);
|
||||||
|
|
||||||
|
spi:
|
||||||
|
clk_pin: GPIO7
|
||||||
|
mosi_pin: GPIO6
|
||||||
|
miso_pin: GPIO5
|
||||||
|
|
||||||
|
pn5180:
|
||||||
|
id: pn5180_reader
|
||||||
|
cs_pin: GPIO8
|
||||||
|
busy_pin: GPIO9
|
||||||
|
reset_pin: GPIO10
|
||||||
|
irq_pin: GPIO11
|
||||||
|
on_tag:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: led_enabled
|
||||||
|
then:
|
||||||
|
- light.turn_on:
|
||||||
|
id: notify_led
|
||||||
|
brightness: 100%
|
||||||
|
red: 0%
|
||||||
|
green: 100%
|
||||||
|
blue: 0%
|
||||||
|
flash_length: 500ms
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: buzzer_enabled
|
||||||
|
then:
|
||||||
|
- rtttl.play: "success:d=32,o=5,b=100:c,g,b"
|
||||||
|
- homeassistant.tag_scanned: !lambda return x;
|
||||||
|
on_tag_removed:
|
||||||
|
- if:
|
||||||
|
condition:
|
||||||
|
switch.is_on: buzzer_enabled
|
||||||
|
then:
|
||||||
|
- rtttl.play: "removed:d=16,o=5,b=100:b"
|
||||||
|
|
||||||
|
openprinttag:
|
||||||
|
id: spool
|
||||||
|
# Raw tag record for the OpenPrintTag integration (randybb/ha-openprinttag), empty when removed
|
||||||
|
on_openprinttag:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.openprinttag
|
||||||
|
data:
|
||||||
|
uid: !lambda return uid;
|
||||||
|
payload: !lambda return payload;
|
||||||
|
|
||||||
|
creality_cfs:
|
||||||
|
id: creality
|
||||||
|
# The Creality record (ASCII) for Home Assistant, empty when removed
|
||||||
|
on_creality:
|
||||||
|
- homeassistant.event:
|
||||||
|
event: esphome.creality_cfs
|
||||||
|
data:
|
||||||
|
uid: !lambda return uid;
|
||||||
|
data: !lambda return data;
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: creality_cfs
|
||||||
|
name: Creality length
|
||||||
|
- platform: openprinttag
|
||||||
|
type: remaining_weight
|
||||||
|
name: Remaining weight
|
||||||
|
- platform: openprinttag
|
||||||
|
type: consumed_weight
|
||||||
|
name: Consumed weight
|
||||||
|
- platform: openprinttag
|
||||||
|
type: actual_weight
|
||||||
|
name: Full weight
|
||||||
|
- platform: openprinttag
|
||||||
|
type: min_print_temperature
|
||||||
|
name: Min print temperature
|
||||||
|
- platform: openprinttag
|
||||||
|
type: max_print_temperature
|
||||||
|
name: Max print temperature
|
||||||
|
- platform: openprinttag
|
||||||
|
type: max_bed_temperature
|
||||||
|
name: Max bed temperature
|
||||||
|
- platform: openprinttag
|
||||||
|
type: drying_temperature
|
||||||
|
name: Drying temperature
|
||||||
|
- platform: openprinttag
|
||||||
|
type: drying_time
|
||||||
|
name: Drying time
|
||||||
|
|
||||||
|
text_sensor:
|
||||||
|
- platform: pn5180
|
||||||
|
name: Tag UID
|
||||||
|
- platform: creality_cfs
|
||||||
|
type: material_id
|
||||||
|
name: Creality material ID
|
||||||
|
- platform: creality_cfs
|
||||||
|
type: color
|
||||||
|
name: Creality color
|
||||||
|
id: creality_color
|
||||||
|
on_value:
|
||||||
|
- script.execute: show_filament_color
|
||||||
|
- platform: creality_cfs
|
||||||
|
type: serial
|
||||||
|
name: Creality serial
|
||||||
|
- platform: openprinttag
|
||||||
|
type: material_type
|
||||||
|
name: Material
|
||||||
|
- platform: openprinttag
|
||||||
|
type: material_name
|
||||||
|
name: Material name
|
||||||
|
- platform: openprinttag
|
||||||
|
type: brand_name
|
||||||
|
name: Brand
|
||||||
|
- platform: openprinttag
|
||||||
|
type: primary_color
|
||||||
|
name: Color
|
||||||
|
id: openprinttag_color
|
||||||
|
on_value:
|
||||||
|
- script.execute: show_filament_color
|
||||||
|
|
||||||
|
script:
|
||||||
|
# The filament color on the filament_color light: the OpenPrintTag's, else the Creality tag's
|
||||||
|
- id: show_filament_color
|
||||||
|
then:
|
||||||
|
- lambda: |-
|
||||||
|
std::string x = id(openprinttag_color).state;
|
||||||
|
if (x.size() < 7)
|
||||||
|
x = id(creality_color).state;
|
||||||
|
if (x.size() < 7) {
|
||||||
|
id(filament_color).turn_off().set_transition_length(0).perform();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint32_t c = strtoul(x.c_str() + 1, nullptr, 16);
|
||||||
|
if (x.size() > 7)
|
||||||
|
c >>= 8; // #rrggbbaa
|
||||||
|
// ESPHome scales the strongest channel to 100 %, the darkness goes to the brightness
|
||||||
|
const float r = ((c >> 16) & 0xFF) / 255.0f, g = ((c >> 8) & 0xFF) / 255.0f, b = (c & 0xFF) / 255.0f;
|
||||||
|
const float m = std::max({r, g, b});
|
||||||
|
if (m == 0.0f) {
|
||||||
|
id(filament_color).turn_off().set_transition_length(0).perform(); // black
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
id(filament_color).turn_on()
|
||||||
|
.set_rgb(r, g, b)
|
||||||
|
.set_brightness(m)
|
||||||
|
.set_transition_length(0)
|
||||||
|
.perform();
|
||||||
|
|
||||||
|
light:
|
||||||
|
# Onboard RGB for now: tag feedback and status. With the external LED fitted, move
|
||||||
|
# notify_led to pin 3 and give the onboard one back to status_led (as on mcu-rfid-reader)
|
||||||
|
- platform: esp32_rmt_led_strip
|
||||||
|
id: notify_led
|
||||||
|
name: Notify LED
|
||||||
|
channel_colors: GRB
|
||||||
|
pin: 21
|
||||||
|
num_leds: 1
|
||||||
|
chipset: ws2812
|
||||||
|
restore_mode: ALWAYS_OFF
|
||||||
|
rmt_symbols: 96
|
||||||
|
|
||||||
|
# Shows the filament color in Home Assistant; drives nothing, the next tag read overwrites it
|
||||||
|
- platform: rgb
|
||||||
|
id: filament_color
|
||||||
|
name: Filament color
|
||||||
|
icon: mdi:printer-3d-nozzle
|
||||||
|
red: color_none
|
||||||
|
green: color_none
|
||||||
|
blue: color_none
|
||||||
|
restore_mode: ALWAYS_OFF
|
||||||
|
default_transition_length: 0s
|
||||||
|
|
||||||
|
output:
|
||||||
|
- platform: ledc
|
||||||
|
pin: 4
|
||||||
|
id: buzzer
|
||||||
|
- platform: template
|
||||||
|
id: color_none
|
||||||
|
type: float
|
||||||
|
write_action: []
|
||||||
|
|
||||||
|
rtttl:
|
||||||
|
output: buzzer
|
||||||
|
|
||||||
|
switch:
|
||||||
|
- platform: template
|
||||||
|
name: Buzzer Enabled
|
||||||
|
id: buzzer_enabled
|
||||||
|
icon: mdi:volume-high
|
||||||
|
optimistic: true
|
||||||
|
restore_mode: RESTORE_DEFAULT_ON
|
||||||
|
entity_category: config
|
||||||
|
- platform: template
|
||||||
|
name: LED enabled
|
||||||
|
id: led_enabled
|
||||||
|
icon: mdi:alarm-light-outline
|
||||||
|
optimistic: true
|
||||||
|
restore_mode: RESTORE_DEFAULT_ON
|
||||||
|
entity_category: config
|
||||||
+11
-11
@@ -28,7 +28,7 @@ esphome:
|
|||||||
# - wait_until:
|
# - wait_until:
|
||||||
# api.connected:
|
# api.connected:
|
||||||
# - logger.log: API is connected!
|
# - logger.log: API is connected!
|
||||||
# - rtttl.play: "success:d=24,o=5,b=100:c,g,b"
|
# - rtttl.play: "success:d=32,o=5,b=100:c,g,b"
|
||||||
# - light.turn_on:
|
# - light.turn_on:
|
||||||
# id: notify_led
|
# id: notify_led
|
||||||
# brightness: 100%
|
# brightness: 100%
|
||||||
@@ -91,13 +91,13 @@ api:
|
|||||||
uri += tag_id;
|
uri += tag_id;
|
||||||
message->add_uri_record(uri);
|
message->add_uri_record(uri);
|
||||||
id(pn532_module).write_mode(message);
|
id(pn532_module).write_mode(message);
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b"
|
- rtttl.play: "write:d=32,o=5,b=100:b"
|
||||||
- wait_until:
|
- wait_until:
|
||||||
not:
|
not:
|
||||||
pn532.is_writing:
|
pn532.is_writing:
|
||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: notify_led
|
id: notify_led
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
- rtttl.play: "write:d=32,o=5,b=100:b,b"
|
||||||
|
|
||||||
- action: write_music_tag
|
- action: write_music_tag
|
||||||
variables:
|
variables:
|
||||||
@@ -123,13 +123,13 @@ api:
|
|||||||
message->add_text_record(text);
|
message->add_text_record(text);
|
||||||
}
|
}
|
||||||
id(pn532_module).write_mode(message);
|
id(pn532_module).write_mode(message);
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b"
|
- rtttl.play: "write:d=32,o=5,b=100:b"
|
||||||
- wait_until:
|
- wait_until:
|
||||||
not:
|
not:
|
||||||
pn532.is_writing:
|
pn532.is_writing:
|
||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: notify_led
|
id: notify_led
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
- rtttl.play: "write:d=32,o=5,b=100:b,b"
|
||||||
|
|
||||||
globals:
|
globals:
|
||||||
- id: source
|
- id: source
|
||||||
@@ -271,7 +271,7 @@ pn532_i2c:
|
|||||||
condition:
|
condition:
|
||||||
switch.is_on: buzzer_enabled
|
switch.is_on: buzzer_enabled
|
||||||
then:
|
then:
|
||||||
- rtttl.play: "success:d=24,o=5,b=100:c,g,b"
|
- rtttl.play: "success:d=32,o=5,b=100:c,g,b"
|
||||||
on_tag_removed:
|
on_tag_removed:
|
||||||
then:
|
then:
|
||||||
- homeassistant.event:
|
- homeassistant.event:
|
||||||
@@ -313,13 +313,13 @@ button:
|
|||||||
message->add_uri_record(uri);
|
message->add_uri_record(uri);
|
||||||
ESP_LOGD("tagreader", "Writing payload: %s", uri.c_str());
|
ESP_LOGD("tagreader", "Writing payload: %s", uri.c_str());
|
||||||
id(pn532_module).write_mode(message);
|
id(pn532_module).write_mode(message);
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b"
|
- rtttl.play: "write:d=32,o=5,b=100:b"
|
||||||
- wait_until:
|
- wait_until:
|
||||||
not:
|
not:
|
||||||
pn532.is_writing:
|
pn532.is_writing:
|
||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: notify_led
|
id: notify_led
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
- rtttl.play: "write:d=32,o=5,b=100:b,b"
|
||||||
- platform: template
|
- platform: template
|
||||||
name: Clean Tag
|
name: Clean Tag
|
||||||
id: clean_tag
|
id: clean_tag
|
||||||
@@ -333,13 +333,13 @@ button:
|
|||||||
green: 64.7%
|
green: 64.7%
|
||||||
blue: 0%
|
blue: 0%
|
||||||
- lambda: 'id(pn532_module).clean_mode();'
|
- lambda: 'id(pn532_module).clean_mode();'
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b"
|
- rtttl.play: "write:d=32,o=5,b=100:b"
|
||||||
- wait_until:
|
- wait_until:
|
||||||
not:
|
not:
|
||||||
pn532.is_writing:
|
pn532.is_writing:
|
||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: notify_led
|
id: notify_led
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
- rtttl.play: "write:d=32,o=5,b=100:b,b"
|
||||||
- platform: template
|
- platform: template
|
||||||
name: Cancel writing
|
name: Cancel writing
|
||||||
id: cancel_writing
|
id: cancel_writing
|
||||||
@@ -349,7 +349,7 @@ button:
|
|||||||
- lambda: 'id(pn532_module).read_mode();'
|
- lambda: 'id(pn532_module).read_mode();'
|
||||||
- light.turn_off:
|
- light.turn_off:
|
||||||
id: notify_led
|
id: notify_led
|
||||||
- rtttl.play: "write:d=24,o=5,b=100:b,b"
|
- rtttl.play: "write:d=32,o=5,b=100:b,b"
|
||||||
|
|
||||||
light:
|
light:
|
||||||
- platform: esp32_rmt_led_strip
|
- platform: esp32_rmt_led_strip
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
binary_sensor:
|
binary_sensor:
|
||||||
- platform: gpio
|
- platform: gpio
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
binary_sensor:
|
binary_sensor:
|
||||||
- platform: gpio
|
- platform: gpio
|
||||||
|
|||||||
@@ -30,11 +30,13 @@ esphome:
|
|||||||
friendly_name: ${name}
|
friendly_name: ${name}
|
||||||
area: ${area}
|
area: ${area}
|
||||||
comment: ${comment}
|
comment: ${comment}
|
||||||
|
|
||||||
esp8266:
|
esp8266:
|
||||||
board: esp01_1m
|
board: esp01_1m
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
binary_sensor:
|
binary_sensor:
|
||||||
- platform: gpio
|
- platform: gpio
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ esphome:
|
|||||||
esp32:
|
esp32:
|
||||||
variant: esp32s3
|
variant: esp32s3
|
||||||
flash_size: 16MB
|
flash_size: 16MB
|
||||||
|
flash_frequency: 40MHz # the IDF 5.5.5 bootloader reads garbage from this flash (mfr 0x46) at 80MHz
|
||||||
toolchain: esp-idf
|
toolchain: esp-idf
|
||||||
framework:
|
framework:
|
||||||
advanced:
|
advanced:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
# wifi:
|
# wifi:
|
||||||
# use_address: mcu-mini-04.local
|
# use_address: mcu-mini-04.local
|
||||||
@@ -53,8 +54,18 @@ binary_sensor:
|
|||||||
entity_id: binary_sensor.zigbee_staircase_pir_occupancy
|
entity_id: binary_sensor.zigbee_staircase_pir_occupancy
|
||||||
on_state:
|
on_state:
|
||||||
if:
|
if:
|
||||||
condition:
|
condition: &no_motion
|
||||||
binary_sensor.is_off: motion
|
and:
|
||||||
|
- binary_sensor.is_off: motion
|
||||||
|
- binary_sensor.is_off: motion_2
|
||||||
|
then:
|
||||||
|
- light.turn_off: light_relay
|
||||||
|
- platform: homeassistant
|
||||||
|
id: motion_2
|
||||||
|
entity_id: binary_sensor.zigbee_staircase_2_pir_occupancy
|
||||||
|
on_state:
|
||||||
|
if:
|
||||||
|
condition: *no_motion
|
||||||
then:
|
then:
|
||||||
- light.turn_off: light_relay
|
- light.turn_off: light_relay
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
light:
|
light:
|
||||||
- platform: status_led
|
- platform: status_led
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ esp8266:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
common: !include common/common_esp8266.yaml
|
common: !include common/common_esp8266.yaml
|
||||||
|
mdns_ipv6: !include common/esp8266_mdns_ipv6.yaml
|
||||||
|
|
||||||
binary_sensor:
|
binary_sensor:
|
||||||
- platform: gpio
|
- platform: gpio
|
||||||
|
|||||||
Reference in new issue
Block a user