Advertisement
TuXaMaT

ESPHome striplight

Sep 29th, 2023
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 9.61 KB | Source Code | 0 0
  1. substitutions:
  2.   num_leds: "300"
  3.  
  4. light:
  5.   - platform: neopixelbus
  6.     variant: WS2812X
  7.     pin: GPIO23
  8.     num_leds: ${num_leds}
  9.     type: GRB
  10.     color_correct: [50%, 50%, 50%]
  11.     default_transition_length: 1s
  12.     restore_mode: always_off
  13.     name: "Striplight"
  14.     id: "Striplight"    
  15.     effects:                    
  16.       - addressable_lambda:
  17.           name: "Exit"
  18.           update_interval: 10ms
  19.           lambda: |-
  20.             static Color led[${num_leds}];
  21.             static uint16_t progress = 0;
  22.  
  23.             const uint8_t speed = 15;
  24.             const uint8_t steps = 290;
  25.  
  26.             const bool revers = false;
  27.             const bool twoside = false;
  28.  
  29.             if (initial_run)
  30.             {
  31.               ESP_LOGD("effect", "Rise light x%i / %i", speed, steps);
  32.  
  33.               for (int i = 0; i < it.size(); i++)
  34.               {
  35.                 led[i] = Color::BLACK;
  36.               }
  37.               progress = 0;
  38.             }
  39.  
  40.             uint8_t r = max(1, current_color.r / steps);
  41.             uint8_t g = max(1, current_color.g / steps);
  42.             uint8_t b = max(1, current_color.b / steps);
  43.    
  44.             bool complete = true;
  45.  
  46.             // Increase the brightness of those already burning.
  47.             for (int i = 0; i < it.size(); i++)
  48.             {
  49.               if (led[i].r != 0 && led[i].r != current_color.r && led[i].g != 0 && led[i].g != current_color.g && led[i].b != 0 && led[i].b != current_color.b)
  50.               {
  51.                 led[i].r = min(led[i].r + r, (int) current_color.r);
  52.                 led[i].g = min(led[i].g + g, (int) current_color.g);
  53.                 led[i].b = min(led[i].b + b, (int) current_color.b);
  54.  
  55.                 complete = false;
  56.               }
  57.             }
  58.  
  59.             // Let's light up the ones who got their turn.
  60.             for (int i = 0; i < speed; i++)
  61.             {
  62.               if (twoside)
  63.               {
  64.                 int middle = it.size() / 2;
  65.                 if (progress < middle)
  66.                 {
  67.                   if ((revers && progress == middle - 1) || (progress == 0 && !revers))
  68.                   {
  69.                     led[middle] = Color(r,g,b);
  70.                   }
  71.                   led[revers ? max(0, (int) progress) : min((int) (middle + progress + 1), (int) it.size())] = Color(r,g,b);
  72.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : max(0, (int) (middle - progress - 1))] = Color(r,g,b);
  73.                   complete = false;
  74.                 }
  75.               }
  76.               else
  77.               {
  78.                 if (progress < it.size())
  79.                 {
  80.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : min((int) progress, (int) it.size())] = Color(r,g,b);
  81.                   complete = false;
  82.                 }
  83.               }
  84.               progress++;
  85.             }
  86.  
  87.             // Everyone's already on burn, mission over
  88.             if (complete)
  89.             {
  90.               it.all() = current_color;
  91.      
  92.               auto call = id(Striplight).turn_on();
  93.               call.set_effect("None");
  94.               call.perform();
  95.  
  96.               ESP_LOGD("effect", "Rise light x%i / %i - Complete", speed, steps);
  97.             }
  98.             else // Transfer the current state to the led strip
  99.             {
  100.               for (int i = 0; i < it.size(); i++)
  101.               {
  102.                 it[i] = led[i];
  103.               }
  104.             }
  105.       - addressable_lambda:
  106.           name: "Enter"
  107.           update_interval: 10ms
  108.           lambda: |-
  109.             static Color led[${num_leds}];
  110.             static uint16_t progress = 0;
  111.  
  112.             const uint8_t speed = 2;
  113.             const uint8_t steps = 50;
  114.  
  115.             const bool revers = true;
  116.             const bool twoside = false;
  117.  
  118.             if (initial_run)
  119.             {
  120.               ESP_LOGD("effect", "Rise light x%i / %i", speed, steps);
  121.  
  122.               for (int i = 0; i < it.size(); i++)
  123.               {
  124.                 led[i] = Color::BLACK;
  125.               }
  126.               progress = 0;
  127.             }
  128.  
  129.             uint8_t r = max(1, current_color.r / steps);
  130.             uint8_t g = max(1, current_color.g / steps);
  131.             uint8_t b = max(1, current_color.b / steps);
  132.    
  133.             bool complete = true;
  134.  
  135.             // Increase the brightness of those already burning.
  136.             for (int i = 0; i < it.size(); i++)
  137.             {
  138.               if (led[i].r != 0 && led[i].r != current_color.r && led[i].g != 0 && led[i].g != current_color.g && led[i].b != 0 && led[i].b != current_color.b)
  139.               {
  140.                 led[i].r = min(led[i].r + r, (int) current_color.r);
  141.                 led[i].g = min(led[i].g + g, (int) current_color.g);
  142.                 led[i].b = min(led[i].b + b, (int) current_color.b);
  143.  
  144.                 complete = false;
  145.               }
  146.             }
  147.  
  148.             // Let's light up the ones who got their turn.
  149.             for (int i = 0; i < speed; i++)
  150.             {
  151.               if (twoside)
  152.               {
  153.                 int middle = it.size() / 2;
  154.                 if (progress < middle)
  155.                 {
  156.                   if ((revers && progress == middle - 1) || (progress == 0 && !revers))
  157.                   {
  158.                     led[middle] = Color(r,g,b);
  159.                   }
  160.                   led[revers ? max(0, (int) progress) : min((int) (middle + progress + 1), (int) it.size())] = Color(r,g,b);
  161.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : max(0, (int) (middle - progress - 1))] = Color(r,g,b);
  162.                   complete = false;
  163.                 }
  164.               }
  165.               else
  166.               {
  167.                 if (progress < it.size())
  168.                 {
  169.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : min((int) progress, (int) it.size())] = Color(r,g,b);
  170.                   complete = false;
  171.                 }
  172.               }
  173.               progress++;
  174.             }
  175.  
  176.             // Everyone's already on burn, mission over
  177.             if (complete)
  178.             {
  179.               it.all() = current_color;
  180.      
  181.               auto call = id(Striplight).turn_on();
  182.               call.set_effect("None");
  183.               call.perform();
  184.  
  185.               ESP_LOGD("effect", "Rise light x%i / %i - Complete", speed, steps);
  186.             }
  187.             else // Transfer the current state to the led strip
  188.             {
  189.               for (int i = 0; i < it.size(); i++)
  190.               {
  191.                 it[i] = led[i];
  192.               }
  193.             }
  194.       - addressable_lambda:
  195.           name: "Side"
  196.           update_interval: 10ms
  197.           lambda: |-
  198.             static Color led[${num_leds}];
  199.             static uint16_t progress = 0;
  200.  
  201.             const uint8_t speed = 20;
  202.             const uint8_t steps = 140;
  203.  
  204.             const bool revers = false;
  205.             const bool twoside = true;
  206.  
  207.             if (initial_run)
  208.             {
  209.               ESP_LOGD("effect", "Rise light x%i / %i", speed, steps);
  210.  
  211.               for (int i = 0; i < it.size(); i++)
  212.               {
  213.                 led[i] = Color::BLACK;
  214.               }
  215.               progress = 0;
  216.             }
  217.  
  218.             uint8_t r = max(1, current_color.r / steps);
  219.             uint8_t g = max(1, current_color.g / steps);
  220.             uint8_t b = max(1, current_color.b / steps);
  221.    
  222.             bool complete = true;
  223.  
  224.             // Increase the brightness of those already burning.
  225.             for (int i = 0; i < it.size(); i++)
  226.             {
  227.               if (led[i].r != 0 && led[i].r != current_color.r && led[i].g != 0 && led[i].g != current_color.g && led[i].b != 0 && led[i].b != current_color.b)
  228.               {
  229.                 led[i].r = min(led[i].r + r, (int) current_color.r);
  230.                 led[i].g = min(led[i].g + g, (int) current_color.g);
  231.                 led[i].b = min(led[i].b + b, (int) current_color.b);
  232.  
  233.                 complete = false;
  234.               }
  235.             }
  236.  
  237.             // Let's light up the ones who got their turn.
  238.             for (int i = 0; i < speed; i++)
  239.             {
  240.               if (twoside)
  241.               {
  242.                 int middle = it.size() / 2;
  243.                 if (progress < middle)
  244.                 {
  245.                   if ((revers && progress == middle - 1) || (progress == 0 && !revers))
  246.                   {
  247.                     led[middle] = Color(r,g,b);
  248.                   }
  249.                   led[revers ? max(0, (int) progress) : min((int) (middle + progress + 1), (int) it.size())] = Color(r,g,b);
  250.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : max(0, (int) (middle - progress - 1))] = Color(r,g,b);
  251.                   complete = false;
  252.                 }
  253.               }
  254.               else
  255.               {
  256.                 if (progress < it.size())
  257.                 {
  258.                   led[revers ? max(0, (int) (it.size() - progress - 1)) : min((int) progress, (int) it.size())] = Color(r,g,b);
  259.                   complete = false;
  260.                 }
  261.               }
  262.               progress++;
  263.             }
  264.  
  265.             // Everyone's already on burn, mission over
  266.             if (complete)
  267.             {
  268.               it.all() = current_color;
  269.      
  270.               auto call = id(Striplight).turn_on();
  271.               call.set_effect("None");
  272.               call.perform();
  273.  
  274.               ESP_LOGD("effect", "Rise light x%i / %i - Complete", speed, steps);
  275.             }
  276.             else // Transfer the current state to the led strip
  277.             {
  278.               for (int i = 0; i < it.size(); i++)
  279.               {
  280.                 it[i] = led[i];
  281.               }
  282.             }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement