diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
deleted file mode 100644
index 17c7c71..0000000
--- a/.devcontainer/devcontainer.json
+++ /dev/null
@@ -1,78 +0,0 @@
-// For format details, see https://aka.ms/devcontainer.json. For config options, see the
-// README at: https://github.com/devcontainers/templates/tree/main/src/python
-{
-	"name": "Python 3",
-	// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
-	"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm",
-
-	// Features to add to the dev container. More info: https://containers.dev/features.
-	// "features": {},
-	"features": {
-		"ghcr.io/devcontainers-contrib/features/apt-get-packages:1": {
-			"packages": "usbutils,libusb-1.0,texinfo,libftdi1,libtinfo5,gdb-arm-none-eabi,gcc-arm-none-eabi,cmake"
-		}
-	},
-
-	// Use 'forwardPorts' to make a list of ports inside the container available locally.
-	// "forwardPorts": [],
-	
-	"runArgs": [
-		"-v", "/dev/bus/usb:/dev/bus/usb", 
-		"-v", "/usr/lib/udev/hwdb.bin:/usr/lib/udev/hwdb.bin:ro", 
-		"-v", "/lib/udev/hwdb.bin:/lib/udev/hwdb.bin:ro", 
-		"-v", "/usr/share/hwdata/usb.ids:/usr/share/hwdata/usb.ids:ro", 
-		"-v", "/run/udev:/run/udev", 
-		"-v", "/sys:/sys:ro",
-		"--privileged",
-		"--device-cgroup-rule", "c 188:* rmw",
-		"--device-cgroup-rule", "c 166:* rmw"
-	],
-
-	"mounts": [
-		{
-			"source": "${localWorkspaceFolder}/../esphome",
-			"target": "${containerWorkspaceFolder}/../esphome",
-			"type": "bind"
-		},
-		{
-			"source": "${localEnv:HOME}/.platformio",
-			"target": "/home/vscode/.platformio",
-			"type": "bind"
-		},
-		{
-			"source": "${localWorkspaceFolder}/../rp2040",
-			"target": "${containerWorkspaceFolder}/../rp2040",
-			"type": "bind"
-		},
-		{
-			"source": "/opt/openocd-rp2040",
-			"target": "/opt/openocd-rp2040",
-			"type": "bind"
-		}
-	],
-
-	// Use 'postCreateCommand' to run commands after the container is created.
-	"postCreateCommand": "pip3 install -r requirements.txt",
-
-	// Configure tool-specific properties.
-	"customizations": {
-		"vscode": {
-			"extensions": [
-				"ms-vscode.cpptools-extension-pack",
-				"jbenden.c-cpp-flylint",
-				"ESPHome.esphome-vscode",
-				"ms-python.vscode-pylance",
-				"marus25.cortex-debug",
-				"ms-vscode.cpptools",
-				"ms-vscode.cmake-tools",
-				"mikestead.dotenv",
-				"ZixuanWang.linkerscript",
-				"alefragnani.Bookmarks",
-				"ciprianelies.arm-assembly-syntax"
-			]
-		}
-	},
-
-	// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
-	// "remoteUser": "root"
-}
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index b639a65..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# Gitignore settings for ESPHome
-# This is an example and may include too much for your use-case.
-# You can modify this file to suit your needs.
-/.esphome/
-/secrets.yaml
-*.py[ocd]
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
deleted file mode 100644
index 5239be6..0000000
--- a/.vscode/c_cpp_properties.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-    "configurations": [
-        {
-            "name": "Linux",
-            "includePath": [
-                "${workspaceFolder}/**",
-                "${workspaceFolder}/../esphome/"
-            ],
-            "defines": ["USE_RP2040"],
-            "compilerPath": "/usr/bin/gcc",
-            "cStandard": "c11",
-            "cppStandard": "gnu++14",
-            "intelliSenseMode": "linux-gcc-x64"
-        }
-    ],
-    "version": 4
-}
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 7a62736..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-    // Use IntelliSense to learn about possible attributes.
-    // Hover to view descriptions of existing attributes.
-    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "name": "Pico Debug (Cortex-Debug)",
-            "cwd": "${workspaceRoot}",
-            "executable": "${workspaceRoot}/.esphome/build/enviro-weather/.pioenvs/enviro-weather/firmware.elf",
-            "request": "launch",
-            "type": "cortex-debug",
-            "servertype": "openocd",
-            "device": "RP2040",
-            "runToEntryPoint": "main",
-            "configFiles": [
-                "interface/cmsis-dap.cfg",
-                "target/rp2040.cfg"
-            ],
-            "openOCDLaunchCommands": [
-                "adapter speed 5000"
-            ],
-            "searchDir": ["/opt/openocd-rp2040/share/openocd/scripts"],
-            "svdFile": "/workspaces/rp2040/pico-sdk/src/rp2040/hardware_regs/rp2040.svd",
-            "gdbPath": "gdb-multiarch"
-        },
-        {
-            "name": "Pico Debug (Cortex-Debug with external OpenOCD)",
-            "cwd": "${workspaceRoot}",
-            "executable": "${workspaceRoot}/.esphome/build/enviro-weather/.pioenvs/enviro-weather/firmware.elf",
-            "request": "launch",
-            "type": "cortex-debug",
-            "servertype": "external",
-            "gdbTarget": "localhost:3333",
-            "device": "RP2040",
-            "runToEntryPoint": "main",
-            "svdFile": "/workspaces/rp2040/pico-sdk/src/rp2040/hardware_regs/rp2040.svd",
-            "showDevDebugOutput": "raw"
-        },
-    ]
-}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index a3b08b1..0000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "search.exclude": {
-        "**/node_modules": true,
-        "**/bower_components": true,
-        "**/*.code-search": true,
-        ".esphome": true,
-    },
-}
\ No newline at end of file
diff --git a/components/pcf85063/pcf85063.h b/components/pcf85063/pcf85063.h
deleted file mode 100644
index c5e3272..0000000
--- a/components/pcf85063/pcf85063.h
+++ /dev/null
@@ -1,187 +0,0 @@
-#pragma once
-
-#include "esphome/core/component.h"
-#include "esphome/components/i2c/i2c.h"
-#include "esphome/components/time/real_time_clock.h"
-
-namespace esphome {
-namespace pcf85063 {
-
-enum PCF85063ATimerInterruptMode_t : bool {
-  TIMER_INTERRUPT_MODE_FLAG = 0,
-  TIMER_INTERRUPT_MODE_PULSE = 1,
-};
-
-enum PCF85063ATimerClockFrequency_t : uint8_t {
-  TIMER_CLOCK_4096HZ = 0,
-  TIMER_CLOCK_64HZ = 1,
-  TIMER_CLOCK_SECOND = 2,
-  TIMER_CLOCK_MINUTE = 3,
-};
-
-class PCF85063Component : public time::RealTimeClock, public i2c::I2CDevice {
- public:
-  void setup() override;
-  void update() override;
-  void dump_config() override;
-  float get_setup_priority() const override;
-  void read_time();
-  void write_time();
-  void write_nvram(uint8_t);
-  uint8_t read_nvram();
-
-  //bool set_timer_interval_us(uint64_t interval_us);
-  bool write_timer_interval(uint16_t interval);
-  bool clear_timer_flag();
-  bool clear_alarm_flag();
-  bool stop_timer();
-  bool write_clockout_frequency(uint8_t freq);
-  void set_timer_interrupt_enable_(bool state);
-  void set_timer_interrupt_mode_(PCF85063ATimerInterruptMode_t mode);
-
-
- protected:
-  bool write_timer_();
-  bool read_rtc_();
-  bool write_rtc_();
-  union PCF85063Reg {
-    struct {
-      // Control_1 register
-      bool cap_12pf : 1;
-      bool am_pm : 1;
-      bool correction_int_enable : 1;
-      bool : 1;
-      bool soft_reset : 1;
-      bool stop : 1;
-      bool : 1;
-      bool ext_test : 1;
-
-      // Control_2 register
-      uint8_t clkout_control : 3;
-      bool timer_flag : 1;
-      bool halfminute_int : 1;
-      bool minute_int : 1;
-      bool alarm_flag : 1;
-      bool alarm_int : 1;
-
-      // Offset register
-      uint8_t offset : 7;
-      bool coarse_mode : 1;
-
-      // nvRAM register
-      uint8_t nvram : 8;
-
-      // Seconds register
-      uint8_t second : 4;
-      uint8_t second_10 : 3;
-      bool osc_stop : 1;
-
-      // Minutes register
-      uint8_t minute : 4;
-      uint8_t minute_10 : 3;
-      uint8_t : 1;
-
-      // Hours register
-      uint8_t hour : 4;
-      uint8_t hour_10 : 2;
-      uint8_t : 2;
-
-      // Days register
-      uint8_t day : 4;
-      uint8_t day_10 : 2;
-      uint8_t : 2;
-
-      // Weekdays register
-      uint8_t weekday : 3;
-      uint8_t : 5;
-
-      // Months register
-      uint8_t month : 4;
-      uint8_t month_10 : 1;
-      uint8_t : 3;
-
-      // Years register
-      uint8_t year : 4;
-      uint8_t year_10 : 4;
-
-      // PCF85063A Additional registers
-      // Second alarm
-      uint8_t alarm_second : 4;
-      uint8_t alarm_second_10 : 3;
-      bool alarm_second_enabled : 1;
-
-      // Minute alarm
-      uint8_t alarm_minute : 4;
-      uint8_t alarm_minute_10 : 3;
-      bool alarm_minute_enabled : 1;
-
-      // Hour alarm
-      uint8_t alarm_hour : 4;
-      uint8_t alarm_hour_10 : 2;
-      uint8_t : 1;
-      bool alarm_hour_enabled : 1;
-
-      // Day alarm
-      uint8_t alarm_day : 4;
-      uint8_t alarm_day_10 : 2;
-      uint8_t : 1;
-      bool alarm_day_enabled : 1;
-
-      // Weekday alarm
-      uint8_t alarm_weekday : 3;
-      uint8_t : 4;
-      bool alarm_weekday_enabled : 1;
-
-      // Timer value
-      uint8_t timer_value : 8;
-
-      // Timer mode
-      PCF85063ATimerInterruptMode_t timer_interrupt_mode : 1;
-      bool timer_interrupt_enable : 1;
-      bool timer_enable : 1;
-      PCF85063ATimerClockFrequency_t timer_clock_frequency : 2;
-      uint8_t : 3;
-    } reg;
-    mutable uint8_t raw[sizeof(reg)];
-  } pcf85063_;
-};
-
-template<typename... Ts> class StartTimerAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  TEMPLATABLE_VALUE(uint16_t, timer_seconds);
-  void play(Ts... x) override {
-    this->parent_->set_timer_interrupt_enable_(true);
-    this->parent_->set_timer_interrupt_mode_(TIMER_INTERRUPT_MODE_FLAG);
-    this->parent_->write_timer_interval(this->timer_seconds_.value(x...));
-  }
-};
-
-template<typename... Ts> class SetClockoutFrequencyAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  TEMPLATABLE_VALUE(uint8_t, freq);
-  void play(Ts... x) override {
-    this->parent_->write_clockout_frequency(this->freq_.value(x...));
-  }
-};
-
-template<typename... Ts> class ClearTimerFlagAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  void play(Ts... x) override { this->parent_->clear_timer_flag(); }
-};
-
-template<typename... Ts> class ClearAlarmFlagAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  void play(Ts... x) override { this->parent_->clear_alarm_flag(); }
-};
-
-template<typename... Ts> class WriteAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  void play(Ts... x) override { this->parent_->write_time(); }
-};
-
-template<typename... Ts> class ReadAction : public Action<Ts...>, public Parented<PCF85063Component> {
- public:
-  void play(Ts... x) override { this->parent_->read_time(); }
-};
-}  // namespace pcf85063
-}  // namespace esphome
diff --git a/components/pcf85063/time.py b/components/pcf85063/time.py
deleted file mode 100644
index 14c7637..0000000
--- a/components/pcf85063/time.py
+++ /dev/null
@@ -1,159 +0,0 @@
-import esphome.config_validation as cv
-import esphome.codegen as cg
-from esphome import automation
-from esphome.components import i2c, time
-from esphome.const import CONF_ID, CONF_INTERVAL, CONF_VALUE
-
-
-CODEOWNERS = ["@brogon"]
-DEPENDENCIES = ["i2c"]
-pcf85063_ns = cg.esphome_ns.namespace("pcf85063")
-PCF85063Component = pcf85063_ns.class_(
-    "PCF85063Component", time.RealTimeClock, i2c.I2CDevice
-)
-WriteAction = pcf85063_ns.class_("WriteAction", automation.Action)
-ReadAction = pcf85063_ns.class_("ReadAction", automation.Action)
-StartTimerAction = pcf85063_ns.class_("StartTimerAction", automation.Action)
-ClearTimerFlagAction = pcf85063_ns.class_("ClearTimerFlagAction", automation.Action)
-ClearAlarmFlagAction = pcf85063_ns.class_("ClearAlarmFlagAction", automation.Action)
-SetClockoutFrequencyAction = pcf85063_ns.class_("SetClockoutFrequencyAction", automation.Action)
-
-CONFIG_SCHEMA = time.TIME_SCHEMA.extend(
-    {
-        cv.GenerateID(): cv.declare_id(PCF85063Component),
-    }
-).extend(i2c.i2c_device_schema(0x51))
-
-#####
-
-@automation.register_action(
-    "pcf85063.write_time",
-    WriteAction,
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-        }
-    ),
-)
-async def pcf85063_write_time_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-@automation.register_action(
-    "pcf85063.read_time",
-    ReadAction,
-    automation.maybe_simple_id(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-        }
-    ),
-)
-async def pcf85063_read_time_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-def validate_timer_seconds(value):
-    value: cv.TimePeriodSeconds = cv.positive_time_period_seconds(value)
-    min_interval = cv.TimePeriod(seconds=1)
-    max_interval = cv.TimePeriod(minutes=255)
-
-    if value < min_interval:
-        raise cv.Invalid(
-            f"This timer interval is not possible, please choose a larger interval (at least {min_interval})"
-        )
-    if value > max_interval:
-        raise cv.Invalid(
-            f"This timer interval is not possible, please choose a lower interval (at most {max_interval})"
-        )
-    return value
-
-@automation.register_action(
-    "pcf85063.start_timer",
-    StartTimerAction,
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-            cv.Required(CONF_INTERVAL): cv.templatable(validate_timer_seconds),
-        }
-    ),
-)
-async def pcf85063_start_timer_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-
-    template_ = await cg.templatable(config[CONF_INTERVAL], args, cv.TimePeriodSeconds)
-    cg.add(var.set_timer_seconds(template_))
-
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-def validate_clockout_frequency(value):
-    value = cv.int_range(0b000, 0b111)(value)
-    return value
-
-@automation.register_action(
-    "pcf85063.clockout_frequency",
-    SetClockoutFrequencyAction,
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-            cv.Required(CONF_VALUE): cv.templatable(validate_clockout_frequency),
-        }
-    ),
-)
-async def pcf85063_clockout_frequency_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-
-    template_ = await cg.templatable(config[CONF_VALUE], args, type(int))
-    cg.add(var.set_freq(template_))
-
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-@automation.register_action(
-    "pcf85063.clear_timer_flag",
-    ClearTimerFlagAction,
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-        }
-    ),
-)
-async def pcf85063_clear_timer_flag_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-@automation.register_action(
-    "pcf85063.clear_alarm_flag",
-    ClearAlarmFlagAction,
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.use_id(PCF85063Component),
-        }
-    ),
-)
-async def pcf85063_clear_alarm_flag_to_code(config, action_id, template_arg, args):
-    var = cg.new_Pvariable(action_id, template_arg)
-    await cg.register_parented(var, config[CONF_ID])
-    return var
-
-#####
-
-async def to_code(config):
-    var = cg.new_Pvariable(config[CONF_ID])
-
-    await cg.register_component(var, config)
-    await i2c.register_i2c_device(var, config)
-    await time.register_time(var, config)
diff --git a/components/pcf85063/__init__.py b/esphome/components/pcf85063/__init__.py
similarity index 100%
rename from components/pcf85063/__init__.py
rename to esphome/components/pcf85063/__init__.py
diff --git a/components/pcf85063/pcf85063.cpp b/esphome/components/pcf85063/pcf85063.cpp
similarity index 59%
rename from components/pcf85063/pcf85063.cpp
rename to esphome/components/pcf85063/pcf85063.cpp
index 102f329..debc007 100644
--- a/components/pcf85063/pcf85063.cpp
+++ b/esphome/components/pcf85063/pcf85063.cpp
@@ -81,97 +81,6 @@ void PCF85063Component::write_time() {
   this->write_rtc_();
 }
 
-void PCF85063Component::write_nvram(uint8_t data) {
-  pcf85063_.reg.nvram = data;
-  this->write_bytes(0x03, &pcf85063_.raw[0x03], 1);
-}
-
-uint8_t PCF85063Component::read_nvram() {
-  this->read_bytes(0x03, &pcf85063_.raw[0x03], 1);
-  return pcf85063_.reg.nvram;
-}
-
-/*
-  TIMER_CLOCK_MINUTE      60    15300     1m     4h15m
-  TIMER_CLOCK_SECOND       1      255     1s     4m15s
-*/
-bool PCF85063Component::write_timer_interval(uint16_t interval_seconds) {
-  if (interval_seconds < 256) {
-    pcf85063_.reg.timer_clock_frequency = TIMER_CLOCK_SECOND;
-    pcf85063_.reg.timer_value = interval_seconds;
-    pcf85063_.reg.timer_enable = true;
-    return this->write_timer_();
-  } else if (interval_seconds > 15300) {
-    ESP_LOGE(TAG, "Specified interval is longer than max allowed, clamping to 4h15m.");
-    interval_seconds = 15300;
-  }
-  div_t dm = div(interval_seconds, 60);
-  if (dm.rem) {
-    ESP_LOGI(TAG, "Interval out of seconds range, rounding down to closest whole minute.");
-  }
-  
-  pcf85063_.reg.timer_clock_frequency = TIMER_CLOCK_MINUTE;
-  pcf85063_.reg.timer_value = dm.quot;
-  pcf85063_.reg.timer_enable = true;
-  return this->write_timer_();
-}
-
-#define PCF85063_READ_REG(reg, len) \
-  if (!this->read_bytes(reg, &this->pcf85063_.raw[reg], len)) { \
-    ESP_LOGE(TAG, "Can't read I2C data."); \
-    return false; \
-  }
-
-#define PCF85063_WRITE_REG(reg, len) \
-  if (!this->write_bytes(reg, &this->pcf85063_.raw[reg], len)) { \
-    ESP_LOGE(TAG, "Can't write I2C data."); \
-    return false; \
-  }
-
-bool PCF85063Component::clear_timer_flag() {
-  PCF85063_READ_REG(0x01, 1);
-  this->pcf85063_.reg.timer_flag = 0;
-  PCF85063_WRITE_REG(0x01, 1);
-  return true;
-}
-
-bool PCF85063Component::stop_timer() {
-  PCF85063_READ_REG(0x11, 1);
-  this->pcf85063_.reg.timer_enable = false;
-  PCF85063_WRITE_REG(0x11, 1);
-  return true;
-}
-
-bool PCF85063Component::clear_alarm_flag() {
-  PCF85063_READ_REG(0x01, 1);
-  this->pcf85063_.reg.alarm_flag = 0;
-  PCF85063_WRITE_REG(0x01, 1);
-  return true;
-}
-
-bool PCF85063Component::write_clockout_frequency(uint8_t freq) {
-  PCF85063_READ_REG(0x01, 1);
-  this->pcf85063_.reg.clkout_control = freq & 0b111;
-  PCF85063_WRITE_REG(0x01, 1);
-  return true;
-}
-
-void PCF85063Component::set_timer_interrupt_enable_(bool state) {
-  pcf85063_.reg.timer_interrupt_enable = state;
-}
-
-void PCF85063Component::set_timer_interrupt_mode_(PCF85063ATimerInterruptMode_t mode) {
-  pcf85063_.reg.timer_interrupt_mode = mode;
-}
-
-bool PCF85063Component::write_timer_() {
-  PCF85063_WRITE_REG(0x10, 2);
-  ESP_LOGD(TAG, "Write timer %s %0u CLOCK=%0u IR=%s %0u",
-           ONOFF(pcf85063_.reg.timer_enable), pcf85063_.reg.timer_value, pcf85063_.reg.timer_clock_frequency,
-           ONOFF(pcf85063_.reg.timer_interrupt_enable), pcf85063_.reg.timer_interrupt_mode);
-  return true;
-}
-
 bool PCF85063Component::read_rtc_() {
   if (!this->read_bytes(0, this->pcf85063_.raw, sizeof(this->pcf85063_.raw))) {
     ESP_LOGE(TAG, "Can't read I2C data.");
diff --git a/esphome/components/pcf85063/pcf85063.h b/esphome/components/pcf85063/pcf85063.h
new file mode 100644
index 0000000..1a3fd70
--- /dev/null
+++ b/esphome/components/pcf85063/pcf85063.h
@@ -0,0 +1,96 @@
+#pragma once
+
+#include "esphome/core/component.h"
+#include "esphome/components/i2c/i2c.h"
+#include "esphome/components/time/real_time_clock.h"
+
+namespace esphome {
+namespace pcf85063 {
+
+class PCF85063Component : public time::RealTimeClock, public i2c::I2CDevice {
+ public:
+  void setup() override;
+  void update() override;
+  void dump_config() override;
+  float get_setup_priority() const override;
+  void read_time();
+  void write_time();
+
+ protected:
+  bool read_rtc_();
+  bool write_rtc_();
+  union PCF85063Reg {
+    struct {
+      // Control_1 register
+      bool cap_12pf : 1;
+      bool am_pm : 1;
+      bool correction_int_enable : 1;
+      bool : 1;
+      bool soft_reset : 1;
+      bool stop : 1;
+      bool : 1;
+      bool ext_test : 1;
+
+      // Control_2 register
+      uint8_t clkout_control : 3;
+      bool timer_flag : 1;
+      bool halfminute_int : 1;
+      bool minute_int : 1;
+      bool alarm_flag : 1;
+      bool alarm_int : 1;
+
+      // Offset register
+      uint8_t offset : 7;
+      bool coarse_mode : 1;
+
+      // nvRAM register
+      uint8_t nvram : 8;
+
+      // Seconds register
+      uint8_t second : 4;
+      uint8_t second_10 : 3;
+      bool osc_stop : 1;
+
+      // Minutes register
+      uint8_t minute : 4;
+      uint8_t minute_10 : 3;
+      uint8_t : 1;
+
+      // Hours register
+      uint8_t hour : 4;
+      uint8_t hour_10 : 2;
+      uint8_t : 2;
+
+      // Days register
+      uint8_t day : 4;
+      uint8_t day_10 : 2;
+      uint8_t : 2;
+
+      // Weekdays register
+      uint8_t weekday : 3;
+      uint8_t unused_3 : 5;
+
+      // Months register
+      uint8_t month : 4;
+      uint8_t month_10 : 1;
+      uint8_t : 3;
+
+      // Years register
+      uint8_t year : 4;
+      uint8_t year_10 : 4;
+    } reg;
+    mutable uint8_t raw[sizeof(reg)];
+  } pcf85063_;
+};
+
+template<typename... Ts> class WriteAction : public Action<Ts...>, public Parented<PCF85063Component> {
+ public:
+  void play(Ts... x) override { this->parent_->write_time(); }
+};
+
+template<typename... Ts> class ReadAction : public Action<Ts...>, public Parented<PCF85063Component> {
+ public:
+  void play(Ts... x) override { this->parent_->read_time(); }
+};
+}  // namespace pcf85063
+}  // namespace esphome
diff --git a/esphome/components/pcf85063/time.py b/esphome/components/pcf85063/time.py
new file mode 100644
index 0000000..67ec230
--- /dev/null
+++ b/esphome/components/pcf85063/time.py
@@ -0,0 +1,60 @@
+import esphome.config_validation as cv
+import esphome.codegen as cg
+from esphome import automation
+from esphome.components import i2c, time
+from esphome.const import CONF_ID
+
+
+CODEOWNERS = ["@brogon"]
+DEPENDENCIES = ["i2c"]
+pcf85063_ns = cg.esphome_ns.namespace("pcf85063")
+PCF85063Component = pcf85063_ns.class_(
+    "PCF85063Component", time.RealTimeClock, i2c.I2CDevice
+)
+WriteAction = pcf85063_ns.class_("WriteAction", automation.Action)
+ReadAction = pcf85063_ns.class_("ReadAction", automation.Action)
+
+
+CONFIG_SCHEMA = time.TIME_SCHEMA.extend(
+    {
+        cv.GenerateID(): cv.declare_id(PCF85063Component),
+    }
+).extend(i2c.i2c_device_schema(0x51))
+
+
+@automation.register_action(
+    "pcf85063.write_time",
+    WriteAction,
+    cv.Schema(
+        {
+            cv.GenerateID(): cv.use_id(PCF85063Component),
+        }
+    ),
+)
+async def pcf85063_write_time_to_code(config, action_id, template_arg, args):
+    var = cg.new_Pvariable(action_id, template_arg)
+    await cg.register_parented(var, config[CONF_ID])
+    return var
+
+
+@automation.register_action(
+    "pcf85063.read_time",
+    ReadAction,
+    automation.maybe_simple_id(
+        {
+            cv.GenerateID(): cv.use_id(PCF85063Component),
+        }
+    ),
+)
+async def pcf85063_read_time_to_code(config, action_id, template_arg, args):
+    var = cg.new_Pvariable(action_id, template_arg)
+    await cg.register_parented(var, config[CONF_ID])
+    return var
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+
+    await cg.register_component(var, config)
+    await i2c.register_i2c_device(var, config)
+    await time.register_time(var, config)
diff --git a/openshell-components.code-workspace b/openshell-components.code-workspace
deleted file mode 100644
index 808e0f9..0000000
--- a/openshell-components.code-workspace
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-	"folders": [
-		{
-			"path": "."
-		},
-		{
-			"path": "../rp2040"
-		},
-		{
-			"path": "../esphome"
-		}
-	],
-	"settings": {
-		"c-cpp-flylint.flexelint.enable": false,
-		"c-cpp-flylint.lizard.enable": false,
-		"c-cpp-flylint.flawfinder.enable": false,
-		"files.associations": {
-			"*.tmpl": "jinja",
-			"*.txt": "plaintext",
-			"memory": "cpp",
-			"istream": "cpp",
-			"ostream": "cpp"
-		},
-		"cortex-debug.openocdPath": "/opt/openocd-rp2040/bin/openocd",
-		//"cortex-debug.gdbPath": "/workspaces/rp2040/system/arm-none-eabi/bin/arm-none-eabi-gdb",
-	}
-}
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index c8d0acb..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
--e ../esphome
\ No newline at end of file