Skip to content

Instantly share code, notes, and snippets.

@emorydunn

emorydunn/led_strip_1.yaml

Last active Apr 13, 2021
Embed
What would you like to do?
Sonoff L1 ESPHome Component
esphome:
name: led_strip_1
platform: ESP8266
board: esp8285
includes:
- custom_components/sonoff_l1.h
wifi:
captive_portal:
# Logging must be disabled in order for the ESP to comunicate with the Nuvotron
# logger:
# hardware_uart: UART0_SWAP
# level: VERBOSE
# Enable Home Assistant API
api:
ota:
light:
- platform: custom
lambda: |-
auto light_out = new SonoffL1();
App.register_component(light_out);
return {light_out};
lights:
- name: "LED Strip 1"
effects:
- lambda:
name: Colorful Gradient (Smooth)
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeGradient();
- lambda:
name: Colorful Breath (Fade)
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeBreath();
- lambda:
name: RGB Gradient
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeRGBGradient();
- lambda:
name: RGB Pulse (Strobe)
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeRGBPulse();
- lambda:
name: RGB Breath
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeRGBBreath();
- lambda:
name: RGB Strobe (Flash)
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeRGBStrobe();
- lambda:
name: Sound Reactive
lambda: |-
auto light_out = new SonoffL1();
light_out->setModeSync();
#include "esphome.h"
class SonoffL1 : public Component, public LightOutput {
#define SONOFF_L1_MODE_COLORFUL 1 // [Color key] Colorful (static color)
#define SONOFF_L1_MODE_COLORFUL_GRADIENT 2 // [SMOOTH] Colorful Gradient
#define SONOFF_L1_MODE_COLORFUL_BREATH 3 // [FADE] Colorful Breath
#define SONOFF_L1_MODE_DIY_GRADIENT 4 // DIY Gradient (fade in and out) [Speed 1- 100, color]
#define SONOFF_L1_MODE_DIY_PULSE 5 // DIY Pulse (faster fade in and out) [Speed 1- 100, color]
#define SONOFF_L1_MODE_DIY_BREATH 6 // DIY Breath (toggle on/off) [Speed 1- 100, color]
#define SONOFF_L1_MODE_DIY_STROBE 7 // DIY Strobe (faster toggle on/off) [Speed 1- 100, color]
#define SONOFF_L1_MODE_RGB_GRADIENT 8 // RGB Gradient
#define SONOFF_L1_MODE_RGB_PULSE 9 // [STROBE] RGB Pulse
#define SONOFF_L1_MODE_RGB_BREATH 10 // RGB Breath
#define SONOFF_L1_MODE_RGB_STROBE 11 // [FLASH] RGB strobe
#define SONOFF_L1_MODE_SYNC_TO_MUSIC 12 // Sync to music [Speed 1- 100, sensitivity 1 - 10]
public:
int mode = SONOFF_L1_MODE_COLORFUL;
void setup() override {
// nothing to do here
Serial.begin(19200);
}
LightTraits get_traits() override {
// return the traits this light supports
auto traits = LightTraits();
traits.set_supports_brightness(true);
traits.set_supports_rgb(true);
traits.set_supports_rgb_white_value(false);
traits.set_supports_color_temperature(false);
return traits;
}
void write_state(LightState *state) override {
// This will be called by the light to get a new state to be written.
float red, green, blue;
// use any of the provided current_values methods
state->current_values_as_rgb(&red, &green, &blue);
// Convert to 0-255
int redValue, greenValue, blueValue;
redValue = floor(red * 255);
greenValue = floor(green * 255);
blueValue = floor(blue * 255);
bool ledState;
state->current_values_as_binary(&ledState);
float brightnessPercent;
state->current_values_as_brightness(&brightnessPercent);
// Convert to 0-100
int brightness = floor(brightnessPercent * 100);
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"switch\":\"%s\",\"light_type\":1,\"colorR\":%d,\"colorG\":%d,\"colorB\":%d,\"bright\":%d,\"mode\":%d"),
millis(), millis()%1000,
ledState ? "on" : "off",
redValue, greenValue, blueValue,
brightness,
SONOFF_L1_MODE_COLORFUL);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_COLORFUL_GRADIENT
void setModeGradient() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_COLORFUL_GRADIENT
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_COLORFUL_BREATH
void setModeBreath() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_COLORFUL_BREATH
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_RGB_GRADIENT
void setModeRGBGradient() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_RGB_GRADIENT
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_RGB_PULSE
void setModeRGBPulse() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_RGB_PULSE
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_RGB_BREATH
void setModeRGBBreath() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_RGB_BREATH
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_RGB_STROBE
void setModeRGBStrobe() {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_RGB_STROBE
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
// SONOFF_L1_MODE_SYNC_TO_MUSIC
void setModeSync(int sensitive = 10, int speed = 50) {
char buffer[140];
snprintf_P(buffer, sizeof(buffer), PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"mode\":%d,\"sensitive\":%d,\"speed\":%d"),
millis(), millis()%1000,
SONOFF_L1_MODE_SYNC_TO_MUSIC,
sensitive,
speed
);
Serial.print(buffer);
Serial.write(0x1B);
Serial.flush();
}
};
@hans99

This comment has been minimized.

Copy link

@hans99 hans99 commented Sep 6, 2020

Really good, thanks! Any chance you started working on the "effects"? (or am I just not understanding something?)

@emorydunn

This comment has been minimized.

Copy link
Owner Author

@emorydunn emorydunn commented Sep 12, 2020

Really good, thanks! Any chance you started working on the "effects"? (or am I just not understanding something?)

As it happens, I have! Not all of them seem to work correctly, and there's probably a better way to implement them, but I'll put everything up.

@hans99

This comment has been minimized.

Copy link

@hans99 hans99 commented Sep 13, 2020

Really good, thanks! Any chance you started working on the "effects"? (or am I just not understanding something?)

As it happens, I have! Not all of them seem to work correctly, and there's probably a better way to implement them, but I'll put everything up.

Great! Yes, there must be a better way but your working implementation is better than mine non-working ;)
I also see some problem using them as you state - so I will just use SW-effects, works fine for me.

@rickalm

This comment has been minimized.

Copy link

@rickalm rickalm commented Sep 18, 2020

This is great, do you have any information on how to put the Spider Z (Sonoff L1) into programming mode other than mashing the chip pins to ground GPIO0 at PowerOn ?

I was going to try the Swim or Res pads when I get a working image

@emorydunn

This comment has been minimized.

Copy link
Owner Author

@emorydunn emorydunn commented Sep 18, 2020

Unfortunately you have to short the pin on the chip to ground, it’s kind of a pain. One thing I did find is that I needed to keep the pin shorted for the entire flashing sequence.

There’s a bit more info on my blog post about it.

@ShonP40

This comment has been minimized.

Copy link

@ShonP40 ShonP40 commented Apr 13, 2021

Hey, first of all, great work on this! But, will there be any updates in the future to add receiving support from the remote?

@emorydunn

This comment has been minimized.

Copy link
Owner Author

@emorydunn emorydunn commented Apr 13, 2021

Thanks, I'm glad people are finding it useful! I don't use the remote, so I probably won't be making any updates.

@ShonP40

This comment has been minimized.

Copy link

@ShonP40 ShonP40 commented Apr 13, 2021

I’ve used this in the past but then decided to see if Tasmota’s integration is any better.
Ended up sticking with Tasmota for a couple months.
Decided to move back today due to the fact that I can setup software effects easier.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment