├── firmware ├── common_components │ └── arduino_dimmer │ │ ├── __init__.py │ │ ├── output.py │ │ └── arduino_dimmer.h ├── dimmer.yaml ├── esp32_test │ └── esp32_test.ino └── stm32_dimmer │ └── stm32_dimmer.ino ├── .gitignore ├── md_pic ├── 1.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 19.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg ├── 7.jpg ├── 8.jpg ├── 9.jpg └── backup │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ ├── 8.jpg │ ├── 9.jpg │ ├── 10.jpg │ ├── 11.jpg │ ├── 12.jpg │ ├── 13.jpg │ ├── 14.jpg │ ├── 15.jpg │ ├── 16.jpg │ ├── 17.jpg │ ├── 18.jpg │ ├── 19.jpg │ ├── 20.jpg │ └── 21.jpg ├── hardware └── AC Dimmer For Home Assistant V1.0-Gerber.rar ├── README.md └── example └── ESP32_Serial └── ESP32_serial.ino /firmware/common_components/arduino_dimmer/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | sdkconfig 3 | sdkconfig.old 4 | .venv 5 | __pycache__/ 6 | .vscode/ -------------------------------------------------------------------------------- /md_pic/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/1.jpg -------------------------------------------------------------------------------- /md_pic/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/10.jpg -------------------------------------------------------------------------------- /md_pic/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/11.jpg -------------------------------------------------------------------------------- /md_pic/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/12.jpg -------------------------------------------------------------------------------- /md_pic/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/13.jpg -------------------------------------------------------------------------------- /md_pic/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/14.jpg -------------------------------------------------------------------------------- /md_pic/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/15.jpg -------------------------------------------------------------------------------- /md_pic/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/16.jpg -------------------------------------------------------------------------------- /md_pic/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/17.jpg -------------------------------------------------------------------------------- /md_pic/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/19.jpg -------------------------------------------------------------------------------- /md_pic/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/2.jpg -------------------------------------------------------------------------------- /md_pic/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/3.jpg -------------------------------------------------------------------------------- /md_pic/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/4.jpg -------------------------------------------------------------------------------- /md_pic/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/5.jpg -------------------------------------------------------------------------------- /md_pic/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/6.jpg -------------------------------------------------------------------------------- /md_pic/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/7.jpg -------------------------------------------------------------------------------- /md_pic/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/8.jpg -------------------------------------------------------------------------------- /md_pic/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/9.jpg -------------------------------------------------------------------------------- /md_pic/backup/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/1.jpg -------------------------------------------------------------------------------- /md_pic/backup/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/2.jpg -------------------------------------------------------------------------------- /md_pic/backup/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/3.jpg -------------------------------------------------------------------------------- /md_pic/backup/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/4.jpg -------------------------------------------------------------------------------- /md_pic/backup/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/5.jpg -------------------------------------------------------------------------------- /md_pic/backup/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/6.jpg -------------------------------------------------------------------------------- /md_pic/backup/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/7.jpg -------------------------------------------------------------------------------- /md_pic/backup/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/8.jpg -------------------------------------------------------------------------------- /md_pic/backup/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/9.jpg -------------------------------------------------------------------------------- /md_pic/backup/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/10.jpg -------------------------------------------------------------------------------- /md_pic/backup/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/11.jpg -------------------------------------------------------------------------------- /md_pic/backup/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/12.jpg -------------------------------------------------------------------------------- /md_pic/backup/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/13.jpg -------------------------------------------------------------------------------- /md_pic/backup/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/14.jpg -------------------------------------------------------------------------------- /md_pic/backup/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/15.jpg -------------------------------------------------------------------------------- /md_pic/backup/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/16.jpg -------------------------------------------------------------------------------- /md_pic/backup/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/17.jpg -------------------------------------------------------------------------------- /md_pic/backup/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/18.jpg -------------------------------------------------------------------------------- /md_pic/backup/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/19.jpg -------------------------------------------------------------------------------- /md_pic/backup/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/20.jpg -------------------------------------------------------------------------------- /md_pic/backup/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/md_pic/backup/21.jpg -------------------------------------------------------------------------------- /hardware/AC Dimmer For Home Assistant V1.0-Gerber.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Makerfabs/Home-Assistant-AC-Dimmer/HEAD/hardware/AC Dimmer For Home Assistant V1.0-Gerber.rar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Home Assistant AC Dimmer 2 | 3 | ```c++ 4 | /* 5 | Version: V1.0 6 | Author: Makerfabs 7 | Create Date: 2025/8/21 8 | Note: 9 | 10 | 11 | */ 12 | ``` 13 | 14 | ## Intruduce 15 | 16 | [Product Link](https://www.makerfabs.com/ac-dimmer-for-home-assistant.html) 17 | 18 | [Wiki Link](https://wiki.makerfabs.com/How_to_use_AC_Dimmer_for_Home_Assistant.html) -------------------------------------------------------------------------------- /example/ESP32_Serial/ESP32_serial.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include 4 | 5 | HardwareSerial mySerial2(2); 6 | 7 | #define AT_RX 16 8 | #define AT_TX 17 9 | 10 | void setup() 11 | { 12 | // put your setup code here, to run once: 13 | Serial.begin(115200); 14 | mySerial2.begin(115200, SERIAL_8N1, AT_RX, AT_TX); 15 | } 16 | void loop() 17 | { 18 | // put your main code here, to run repeatedly: 19 | while (Serial.available() > 0) 20 | { 21 | mySerial2.write(Serial.read()); 22 | yield(); 23 | } 24 | while (mySerial2.available() > 0) 25 | { 26 | Serial.write(mySerial2.read()); 27 | yield(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /firmware/common_components/arduino_dimmer/output.py: -------------------------------------------------------------------------------- 1 | import esphome.codegen as cg 2 | import esphome.config_validation as cv 3 | from esphome.components import output 4 | from esphome.const import CONF_ID 5 | 6 | arduino_dimmer_ns = cg.esphome_ns.namespace('arduino_dimmer') 7 | ArduinoDimmer = arduino_dimmer_ns.class_('ArduinoDimmer', cg.Component, output.FloatOutput) 8 | 9 | CONFIG_SCHEMA = output.FLOAT_OUTPUT_SCHEMA.extend( 10 | { 11 | cv.Required(CONF_ID): cv.declare_id(ArduinoDimmer), 12 | } 13 | ).extend(cv.COMPONENT_SCHEMA) 14 | 15 | async def to_code(config): 16 | var = cg.new_Pvariable(config[CONF_ID]) 17 | await cg.register_component(var, config) 18 | await output.register_output(var, config) 19 | -------------------------------------------------------------------------------- /firmware/common_components/arduino_dimmer/arduino_dimmer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "esphome/core/component.h" 4 | #include "esphome/components/output/float_output.h" 5 | #include "esphome/core/log.h" 6 | 7 | 8 | namespace esphome { 9 | namespace arduino_dimmer { 10 | 11 | 12 | class ArduinoDimmer : public esphome::Component, public esphome::output::FloatOutput 13 | { 14 | public: 15 | void setup() override 16 | { 17 | Serial2.begin(115200, SERIAL_8N1, 16, 17); 18 | } 19 | 20 | void write_state(float state) override 21 | { 22 | int percent = (int)(100 * state); 23 | String command = "AT D"; 24 | command = command + percent; 25 | 26 | Serial2.println(command); 27 | } 28 | }; 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /firmware/dimmer.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: dimmeradruino 3 | friendly_name: dimmerAdruino 4 | 5 | external_components: 6 | - source: 7 | type: local 8 | path: common_components 9 | 10 | esp32: 11 | board: esp32dev 12 | framework: 13 | type: arduino 14 | 15 | # Enable logging 16 | logger: 17 | level: INFO 18 | 19 | # Enable Home Assistant API 20 | api: 21 | encryption: 22 | key: "ID95Wb5V982+bpnhQKAgReCRPJOW1v3NB1KdAHoHel8=" 23 | 24 | ota: 25 | - platform: esphome 26 | password: "b7e39ba79c1205fafee50d253dbb0054" 27 | 28 | wifi: 29 | ssid: !secret wifi_ssid 30 | password: !secret wifi_password 31 | 32 | # Enable fallback hotspot (captive portal) in case wifi connection fails 33 | ap: 34 | ssid: "dimmerAdruino Fallback Hotspot" 35 | password: "FC0heLveyPgf" 36 | 37 | captive_portal: 38 | 39 | 40 | output: 41 | - platform: arduino_dimmer 42 | id: arduino_dimmer_1 43 | 44 | fan: 45 | - platform: speed 46 | name: "Kitchen Lights" 47 | output: arduino_dimmer_1 48 | icon: "mdi:lightbulb" 49 | 50 | -------------------------------------------------------------------------------- /firmware/esp32_test/esp32_test.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include 4 | 5 | HardwareSerial mySerial2(2); 6 | 7 | #define AT_RX 16 8 | #define AT_TX 17 9 | 10 | void setup() 11 | { 12 | // put your setup code here, to run once: 13 | Serial.begin(115200); 14 | mySerial2.begin(115200, SERIAL_8N1, AT_RX, AT_TX); 15 | } 16 | void loop() 17 | { 18 | sendData("AT D100", 2000); 19 | sendData("AT D30", 2000); 20 | sendData("AT D10", 2000); 21 | sendData("AT D0", 2000); 22 | } 23 | 24 | String sendData(String command, const int timeout) 25 | { 26 | String response = ""; 27 | // command = command + "\r\n"; 28 | 29 | Serial.println(command); 30 | mySerial2.println(command); // send the read character to the Serial 31 | 32 | long int time = millis(); 33 | 34 | delay(timeout); 35 | while (mySerial2.available()) 36 | { 37 | 38 | // The esp has data so display its output to the serial window 39 | char c = mySerial2.read(); // read the next character. 40 | response += c; 41 | } 42 | 43 | return response; 44 | } -------------------------------------------------------------------------------- /firmware/stm32_dimmer/stm32_dimmer.ino: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | 5 | #define SCR_Pin PA7 6 | #define RELAY_PIN PC15 7 | #define LED_PIN PA6 8 | #define ZCD_PIN PA0 9 | 10 | #define DIM_MAX 10 11 | #define DIM_MIN 90 12 | 13 | #define AC_CTRL_OFF digitalWrite(SCR_Pin, LOW) 14 | #define AC_CTRL_ON digitalWrite(SCR_Pin, HIGH) 15 | 16 | #define RELAY_OFF digitalWrite(RELAY_PIN, LOW) 17 | #define RELAY_ON digitalWrite(RELAY_PIN, HIGH) 18 | 19 | #define LED_OFF digitalWrite(LED_PIN, HIGH) 20 | #define LED_ON digitalWrite(LED_PIN, LOW) 21 | 22 | unsigned char dim = 0; 23 | 24 | volatile bool count_hz_flag = false; 25 | volatile uint32_t count_hz = 0; 26 | volatile unsigned long zc_samples[10]; 27 | volatile uint8_t zc_index = 0; 28 | uint8_t dim_delay = 0; 29 | 30 | uint32_t local_hz = 0; 31 | 32 | HardwareTimer timer(TIM14); 33 | HardwareSerial mySerial(PB7, PB6); 34 | int led_flag = 0; 35 | 36 | 37 | 38 | void onTimer() { 39 | if(zc_index < 10 && count_hz > 0) { 40 | zc_samples[zc_index++] = count_hz / 2; 41 | count_hz = 0; 42 | } 43 | } 44 | 45 | 46 | void setup() 47 | { 48 | pinMode(LED_PIN, OUTPUT); 49 | pinMode(RELAY_PIN, OUTPUT); 50 | pinMode(SCR_Pin, OUTPUT); 51 | pinMode(ZCD_PIN, INPUT); 52 | LED_OFF; 53 | RELAY_OFF; 54 | AC_CTRL_OFF; 55 | 56 | mySerial.begin(115200); 57 | delay(1000); 58 | mySerial.println("Start"); 59 | 60 | timer.setOverflow(1000000, MICROSEC_FORMAT); 61 | timer.attachInterrupt(onTimer); 62 | timer.setInterruptPriority(1, 0); 63 | timer.resume(); 64 | 65 | attachInterrupt(ZCD_PIN, zero_cross_int, RISING); // CHANGE FALLING RISING 66 | } 67 | 68 | void loop() 69 | { 70 | if (led_flag % 2 == 0) 71 | LED_ON; 72 | else 73 | LED_OFF; 74 | 75 | led_flag++; 76 | 77 | char c; 78 | String str = ""; 79 | while (mySerial.available() > 0) 80 | { 81 | c = mySerial.read(); 82 | if (c == '\n') 83 | { 84 | mySerial.println("Get line:"); 85 | mySerial.println(str); 86 | at_explain(str); 87 | } 88 | else 89 | str = str + c; 90 | } 91 | 92 | 93 | if(zc_index == 10) { 94 | timer.pause(); 95 | 96 | for (uint8_t i = 1; i < zc_index; i++) 97 | { 98 | unsigned long key = zc_samples[i]; 99 | int j = i - 1; 100 | while (j >= 0 && zc_samples[j] > key) 101 | { 102 | zc_samples[j + 1] = zc_samples[j]; 103 | j--; 104 | } 105 | zc_samples[j + 1] = key; 106 | } 107 | 108 | uint32_t sum = 0; 109 | for(uint8_t i = 1; i < zc_index - 1; i++) { 110 | sum += zc_samples[i]; 111 | } 112 | local_hz = sum / (zc_index - 2); 113 | 114 | if(local_hz > 47 && local_hz < 53) { 115 | dim_delay = 100; 116 | } else if(local_hz >= 57 && local_hz < 63) { 117 | dim_delay = 80; 118 | } 119 | } 120 | 121 | delay(1000); 122 | } 123 | 124 | // AT D50 125 | void at_explain(String command) 126 | { 127 | if (command.startsWith("AT")) 128 | { 129 | int var_1 = 0; 130 | 131 | sscanf(command.c_str(), "AT D%d", &var_1); 132 | mySerial.println(var_1); 133 | 134 | set_power(var_1); 135 | } 136 | } 137 | 138 | void set_power(int level) 139 | { 140 | dim = map(level, 0, 100, DIM_MIN, DIM_MAX); 141 | if (level == 0) 142 | { 143 | RELAY_OFF; 144 | } 145 | else 146 | RELAY_ON; 147 | } 148 | 149 | void zero_cross_int() // function to be fired at the zero crossing to dim the light 150 | { 151 | 152 | if(zc_index < 10) { 153 | count_hz++; 154 | } 155 | 156 | if (dim <= DIM_MAX) 157 | return; 158 | // if (dim >= DIM_MIN) 159 | // return; 160 | 161 | AC_CTRL_OFF; 162 | 163 | int dimtime = (dim_delay * dim); 164 | delayMicroseconds(dimtime); // Off cycle 165 | AC_CTRL_ON; // triac firing 166 | // delayMicroseconds(500); // triac On propagation delay 167 | // triac Off 168 | } --------------------------------------------------------------------------------