From 185c469dfd0a5aabc0a10e4bf436c8cf01a3000c Mon Sep 17 00:00:00 2001 From: Cyberes Date: Fri, 13 Sep 2024 18:22:15 -0600 Subject: [PATCH] add files --- README.md | 14 ++++ components/geiger_counter_sensor/__init__.py | 0 .../geiger_counter_sensor.cpp | 68 +++++++++++++++++++ .../geiger_counter_sensor.h | 22 ++++++ components/geiger_counter_sensor/sensor.py | 28 ++++++++ geiger_counter.yaml | 16 +++++ 6 files changed, 148 insertions(+) create mode 100644 components/geiger_counter_sensor/__init__.py create mode 100644 components/geiger_counter_sensor/geiger_counter_sensor.cpp create mode 100644 components/geiger_counter_sensor/geiger_counter_sensor.h create mode 100644 components/geiger_counter_sensor/sensor.py create mode 100644 geiger_counter.yaml diff --git a/README.md b/README.md index 19c8d54..d6c5fde 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,16 @@ # esphome-geiger-counter +- Wired/UART logs don't work. Use wireless logs. +- Only uSv is sent. + +## Example HA Config for Statistics + +```yaml +- platform: statistics + name: "Radiation (μSv)" + unique_id: geiger_counter + entity_id: sensor.geiger_counter_raw + state_characteristic: mean + max_age: + minutes: 1 +``` diff --git a/components/geiger_counter_sensor/__init__.py b/components/geiger_counter_sensor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/components/geiger_counter_sensor/geiger_counter_sensor.cpp b/components/geiger_counter_sensor/geiger_counter_sensor.cpp new file mode 100644 index 0000000..1cadb14 --- /dev/null +++ b/components/geiger_counter_sensor/geiger_counter_sensor.cpp @@ -0,0 +1,68 @@ +#include "geiger_counter_sensor.h" +#include "esphome/core/log.h" +#include "esphome.h" + +namespace esphome { +namespace geiger_counter_sensor { + +static const char *TAG = "geiger_counter_sensor.sensor"; + + +void GeigerCounterSensor::setup() { + ESP_LOGCONFIG(TAG, "Setting up Geiger Counter Sensor..."); +} + +void GeigerCounterSensor::loop() { + const int max_line_length = 80; + static char buffer[max_line_length]; + while (available()) { + if(readline(read(), buffer, max_line_length) > 0) { + int cpm = atof(buffer); + float usv = cpm * 0.0057; + ESP_LOGCONFIG(TAG, "Received radiation level: %d cpm, %.2f μSv", cpm, usv); + this->publish_state(usv); + } + } +} + + +void GeigerCounterSensor::dump_config() { + LOG_SENSOR("", "Geiger Counter Sensor", this); +} + +void GeigerCounterSensor::update() { + +} + +} // namespace geiger_counter_sensor +} // namespace esphome + +int readline(int readch, char *buffer, int len) { + static int pos = 0; + int rpos; + + if (readch > 0) { + switch (readch) { + case '\n': + case '\r': // Return on CR or newline + buffer[pos] = 0; // Just to be sure, set last character 0 + rpos = pos; + pos = 0; // Reset position index ready for next time + return rpos; + default: + if ((pos < len-1) && ( readch < 127 )) { // Filter on <127 to make sure it is a character + buffer[pos++] = readch; + buffer[pos] = 0; + } + else + { + buffer[pos] = 0; // Just to be sure, set last character 0 + rpos = pos; + pos = 0; // Reset position index ready for next time + return rpos; + } + } + } + // No end of line has been found, so return -1. + return -1; +} diff --git a/components/geiger_counter_sensor/geiger_counter_sensor.h b/components/geiger_counter_sensor/geiger_counter_sensor.h new file mode 100644 index 0000000..26468cf --- /dev/null +++ b/components/geiger_counter_sensor/geiger_counter_sensor.h @@ -0,0 +1,22 @@ +#pragma once +#include "esphome/core/component.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/uart/uart.h" + + +namespace esphome { +namespace geiger_counter_sensor { + + +class GeigerCounterSensor : public sensor::Sensor, public PollingComponent, public uart::UARTDevice { + public: + void setup() override; + void update() override; + void loop() override; + void dump_config() override; +}; + +} // namespace geiger_counter_sensor +} // namespace esphome + +int readline(int readch, char *buffer, int len); diff --git a/components/geiger_counter_sensor/sensor.py b/components/geiger_counter_sensor/sensor.py new file mode 100644 index 0000000..1ba3fa3 --- /dev/null +++ b/components/geiger_counter_sensor/sensor.py @@ -0,0 +1,28 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import uart, sensor +from esphome.const import ICON_RADIATOR, UNIT_EMPTY + +DEPENDENCIES = ["uart"] + +geiger_counter_sensor_ns = cg.esphome_ns.namespace("geiger_counter_sensor") +GeigerCounterSensor = geiger_counter_sensor_ns.class_( + "GeigerCounterSensor", cg.PollingComponent, uart.UARTDevice +) + +CONFIG_SCHEMA = ( + sensor.sensor_schema( + GeigerCounterSensor, + unit_of_measurement="μSv", + icon='mdi:radioactive-circle', + accuracy_decimals=2, + ) + .extend(cv.polling_component_schema("60s")) + .extend(uart.UART_DEVICE_SCHEMA) +) + + +async def to_code(config): + var = await sensor.new_sensor(config) + await cg.register_component(var, config) + await uart.register_uart_device(var, config) diff --git a/geiger_counter.yaml b/geiger_counter.yaml new file mode 100644 index 0000000..f443a18 --- /dev/null +++ b/geiger_counter.yaml @@ -0,0 +1,16 @@ +external_components: + - source: + type: git + url: https://git.evulid.cc/cyberes/esphome-geiger-counter.git + ref: master + refresh: 0s + +uart: + tx_pin: GPIO1 + rx_pin: GPIO3 + baud_rate: 9600 + +sensor: + - platform: geiger_counter_sensor + name: geiger-counter + # safe_rads: 55