devices.esphome.io
Milfra MFA05
Milfra MFA05
Device Type: switchElectrical Standard: usBoard: esp8266
Initial Install
When taking the device apart, there are no headers for RX/TX. You must solder them on. They are labeled on the board.
There are headers for ground and 5v. You can use these to power the device while flashing. Press and hold the button while powering on the device to put it into flash mode.
This device is also sold and marketed as the CloudFree SWM1.
GPIO Pinout
| Pin | Function | 
|---|---|
| GPIO0 | button | 
| GPIO5 | motion | 
| GPIO12 | relay | 
| GPIO13 | blue led | 
| GPIO14 | light sensor | 
| GPIO16 | green led | 
Example Configuration
Courtesy of rootnegativ1 on the Home Assistant forums: https://community.home-assistant.io/t/milfra-motion-sensor-light-switch-mfa05/439857/8
# https://templates.blakadder.com/cloudfree_SWM1.html# https://templates.blakadder.com/milfra_MFA05.html
# GPIO16 boots HIGH which means the green led is ON.# This is an issue because of the green led takes precendence over the blue led# To deal with this, GPIO16 must be set LOW after boot which is done using the output component.# This component defaults to OFF so the user DOES NOT need to use#    (I) output.turn_off#     or (II) digitalWrite(16, LOW) after boot
substitutions:  node_name: milfra-motion-light-switch  friendly_name: Milfra MFA05 Motion Light Switch
esphome:  name: ${node_name}  build_path: ./build/${node_name}  comment: Milfra MFA05 Motion Light Switch  name_add_mac_suffix: true
esp8266:  board: esp01_1m
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password  ap:    ssid: ${node_name}_AP    password: !secret wifi_password    ap_timeout: 3min
api:  encryption:    key: !secret esphome_encryption_key  reboot_timeout: 0s
captive_portal:
improv_serial:
logger:
ota:
button:  - platform: restart    id: restart_button    name: "${friendly_name} Restart"
  - platform: safe_mode    id: restart_button_safe_mode    name: "${friendly_name} Restart (Safe Mode)"
text_sensor:  - platform: version    name: "${friendly_name} ESPHome Version"
  - platform: wifi_info    ip_address:      name: "${friendly_name} IP Address"    mac_address:      name: "${friendly_name} MAC Address"
number:  - platform: template # time the relay is ON when triggered by motion    id: motion_delay    name: ${friendly_name} Motion Delay    optimistic: true    restore_value: true    entity_category: config    step: 5    min_value: 15    max_value: 300    initial_value: 30    mode: box    unit_of_measurement: s
  - platform: template # time the relay is ON when triggered by button    id: button_delay    name: ${friendly_name} Button Delay    optimistic: true    restore_value: true    entity_category: config    step: 5    min_value: 60    max_value: 600    initial_value: 180    mode: box    unit_of_measurement: s
  - platform: template # cooldown time when physical button is pressed    id: motion_cooldown    name: ${friendly_name} Motion Cooldown    optimistic: true    restore_value: true    entity_category: config    step: 5    min_value: 10    max_value: 300    initial_value: 60    mode: box    unit_of_measurement: s
output:  - platform: gpio # green LED    id: green_led    pin: GPIO16
light:  - platform: status_led # blue LED    id: blue_status    name: ${friendly_name} Blue LED    pin:      number: GPIO13      inverted: true    effects:      - strobe:          name: Fast Flash          colors:            - state: true              duration: 250ms            - state: false              duration: 250ms
binary_sensor:  - platform: gpio # physical button    id: relay_button    pin:      number: GPIO0      mode: INPUT_PULLUP      inverted: True    on_multi_click:      - timing: # toggle relay & motion / button timeouts          - ON for at most 1s          - OFF for at least 0.2s        then:          - switch.toggle: relay          - if:              condition:                - switch.is_on: motion_enabled              then:                - script.execute: cooldown              else:                if:                  condition:                    not:                      - script.is_running: cooldown                  then:                    - script.execute: button_timeout          - delay: 100ms          - wait_until:              condition:                - not:                    script.is_running: cooldown                - not:                    script.is_running: button_timeout          - if:              condition:                - binary_sensor.is_off: motion              then:                - switch.turn_off: relay      - timing: # enable / disable motion          - ON for 2s to 5s        then:          - script.execute: motion_toggle      - timing: # software restart          - ON for 6s to 9s        then:          - button.press: restart_button      - timing: # software restart into safe mode          - ON for at least 10s        then:          - button.press: restart_button_safe_mode
  - platform: gpio # motion sensor    id: motion    name: ${friendly_name} Motion    pin:      number: GPIO5      inverted: true    device_class: motion    filters:      - delayed_off: 5s    on_press:      - script.stop: motion_timeout      - if:          condition:            - switch.is_on: motion_enabled          then:            - switch.turn_on: relay    on_release:      - script.execute: motion_timeout
  - platform: gpio # light sensor    id: daylight    name: ${friendly_name} Daylight    pin: GPIO14    device_class: light    filters:      - delayed_on: 5s      - delayed_off: 5s    on_press:      - if:          condition:            - switch.is_on: nightlight_enabled          then:            - light.turn_off: blue_status    on_release:      - if:          condition:            - switch.is_on: nightlight_enabled          then:            - light.turn_on: blue_status
switch:  - platform: gpio # relay    id: relay    name: ${friendly_name}    pin: GPIO12
  - platform: template # enable / disable motion - Default to ON    id: motion_enabled    name: ${friendly_name} Motion Enabled    optimistic: true    entity_category: config    device_class: switch    restore_mode: RESTORE_DEFAULT_ON
  - platform: template # enable / disable nightlight - Default to OFF    id: nightlight_enabled    name: ${friendly_name} Nightlight Enabled    optimistic: true    entity_category: config    device_class: switch    restore_mode: RESTORE_DEFAULT_OFF
script:  # not in motion sensor on_release because of an issue with on_press not cancelling the delay  - id: motion_timeout    mode: restart    then:      # subtract 5 for the delayed_off of the motion sensor      - delay:  !lambda 'return (id(motion_delay).state - 5) * 1000;'      - if:          condition:            - switch.is_on: motion_enabled          then:            - switch.turn_off: relay
  - id: motion_toggle    mode: queued    then:      - switch.toggle: motion_enabled      - if:          condition:            - switch.is_off: relay          then:            - light.turn_on:                id: blue_status                effect: Fast Flash            - delay: 1600ms            - light.turn_off: blue_status
  # if mode: restart, this causes motion to not be re-enabled  - id: cooldown    mode: single    then:      - switch.turn_off: motion_enabled      - delay: !lambda 'return id(motion_cooldown).state * 1000;'      - switch.turn_on: motion_enabled
  - id: button_timeout    mode: restart    then:      - delay: !lambda 'return id(button_delay).state * 1000;'