# Alternative firmware for Luna Hexagon, christmas-themed. # Just flash it instead of hexagon.yaml. # Contains christmas songs and the section colors are gold and red. # ----------------------------------------------------------------- # ESP8266 connections: # D8 -> speaker + # RX -> neopixel leds data pin # D0 -> switch # A0 -> voltage divider between VCC and ground (VCC->10kΩ->A0->10kΩ->GND) # Please see the complete elecric scheme esphome: name: luna-hexagon on_boot: - priority: 600 # Initial status initialization then: - light.turn_on: hexagon_sections - priority: -100 # When all is set up. Start the show. then: - script.execute: game_ready_animation # Variables globals: - id: game_selected_section type: int restore_value: no initial_value: '0' web_server: port: 80 version: 3 log: False ota: False esp8266: board: d1_mini_lite # Enable logging (for development) # logger: api: reboot_timeout: 0s ota: - platform: esphome password: "" wifi: reboot_timeout: 0s networks: # Normal connection, for use with home assistant - ssid: !secret wifi_ssid_1 password: !secret wifi_password_1 # Static IP connection, to use with browser: # in the following example, head to http://192.168.0.42 to see the control interface. # Modify according to your home wifi configuration. - ssid: !secret wifi_ssid_2 password: !secret wifi_password_2 manual_ip: static_ip: 192.168.0.42 gateway: 192.168.0.1 subnet: 255.255.255.0 button: - platform: template name: Color wheel id: color_wheel_button icon: "mdi:hexagon-slice-6" on_press: - script.execute: game_ready_animation binary_sensor: # Buttons (connect to a button that shorts to 3v3) - platform: gpio pin: number: D0 mode: input: true pulldown: true id: "pull_cord" internal: True # Debouncing filters: - settle: 10ms - autorepeat: time_off: 100ms time_on: 100ms on_press: then: - script.execute: game_advance_section on_release: then: - script.execute: game_play_section sensor: # Battery level sensor: 500 is less than 4.0v (battery flat), 850 is 5,4v (battery full) # Check with your batteries and change the values accordingly - platform: adc pin: A0 name: "Battery level" icon: 'mdi:battery' update_interval: 1min unit_of_measurement: "%" raw: true filters: - clamp: min_value: 500.0 max_value: 850.0 - calibrate_linear: - 500.0 -> 0.0 - 850.0 -> 100.0 - min: send_first_at: 3 output: - platform: esp8266_pwm pin: D8 id: speaker light: - platform: neopixelbus variant: WS2812 method: type: esp8266_dma pin: GPIO3 # "RX" pin: see https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods#dma-i2s on why this does not break serial logging num_leds: 12 name: "Hexagon Sections" id: hexagon_sections # Component to play Ring Tone Text Transfer Language # (Nokia ringtone format) on a digital pin rtttl: output: speaker on_finished_playback: # - script.execute: game_ready_animation - script.execute: id: set_section_color section: !lambda return id(game_selected_section); r: 1.0 g: 1.0 b: 1.0 # ---- Scripts ---- script: # Set section color. Section is 0-5 - id: set_section_color parameters: section: int r: float g: float b: float then: - light.addressable_set: id: hexagon_sections range_from: !lambda return section * 2; range_to: !lambda return section * 2 + 1; red: !lambda return r; green: !lambda return g; blue: !lambda return b; #transition_length: 1s; - id: game_ready_animation then: - script.execute: id: set_section_color section: 0 r: 1.0 g: 0.0 b: 0.0 - delay: 200ms - script.execute: id: set_section_color section: 1 r: 0.0 g: 1.0 b: 0.0 - delay: 200ms - script.execute: id: set_section_color section: 2 r: 0.0 g: 0.0 b: 1.0 - delay: 200ms - script.execute: id: set_section_color section: 3 r: 1.0 g: 1.0 b: 0.0 - delay: 200ms - script.execute: id: set_section_color section: 4 r: 1.0 g: 0.0 b: 1.0 - delay: 200ms - script.execute: id: set_section_color section: 5 r: 0.0 g: 1.0 b: 1.0 - delay: 200ms - id: game_advance_section then: # Stop playback - rtttl.stop # Turn off all sections - repeat: count: 6 then: lambda: |- id(set_section_color).execute(iteration, 0, 0, 0); # Increment section counter - lambda: if (id(game_selected_section) >= 5) id(game_selected_section) = 0; else id(game_selected_section) += 1; # Turn on corresponding section - script.execute: id: set_section_color section: !lambda return id(game_selected_section); r: 1.0 g: !lambda if (id(game_selected_section) % 2 == 0) return 1.0; else return 0.0; b: 0.0 - logger.log: format: "Selected section %d" args: [ 'id(game_selected_section)' ] - id: game_play_section then: - rtttl.play: rtttl: !lambda |- switch(id(game_selected_section)) { case 0: return "Silent:d=4,o=5,b=160:g.,8a,g,2e.,g.,8a,g,2e.,2d6,d6,2b.,2c6,c6,2g."; case 1: return "Jingle:d=4,o=5,b=112:8a,8a,a,8a,8a,a,8a,8c6,8f.,16g,2a,8a#,8a#,8a#.,16a#,8a#,8a,8a.,16a,8a,8g,8g,8a,g,c6"; case 2: return "XmasTree:d=4,o=5,b=100:c,8f.,16f,f.,8g,8a.,16a,a.,8a,8g,8a,a#,e,g,f,8p,8c6,8c6,8a,d.6,8c6,8c6,8a#,a#.,8a#,8a#,8g,c.6,8a#,8a#,8a,a,8p,8c,8f.,8f,f,8g,8a.,16a,a.,8a,8g,8a,a#,e,g,f,p"; case 3: return "O Come:d=4,o=5,b=160:g,2g,d,g,2a,2d,b,a,b,c6,2b,a,g,2g,f#,e,f#,g,a,b,2f#,e.,8d,2d."; case 4: return "Rudolf:d=4,o=5,b=160:8g,a,8g,e,c6,a,2g.,8g.,16a,8g.,16a,g,c6,1b,8f,g,8f,d,b,a,2g.,8g.,16a,8g.,16a,g,d6,2c.6"; case 5: default: return "We Wish:d=4,o=5,b=140:d,g,8g,8a,8g,8f#,e,c,e,a,8a,8b,8a,8g,f#,d,f#,b,8b,8c6,8b,8a,g,e,8d,8d,e,a,f#,2g."; }