diff --git a/hexagon-christmas-edition.yaml b/hexagon-christmas-edition.yaml new file mode 100644 index 0000000..132f8ee --- /dev/null +++ b/hexagon-christmas-edition.yaml @@ -0,0 +1,253 @@ +# 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."; + }