Smart Finance #2: Screener de Bolsa con ESP32 y CYD por 12€

⚠️ Aviso importante antes de continuar Este artículo refleja exclusivamente mi experiencia personal montando este proyecto y tiene una finalidad meramente informativa y divulgativa. No soy asesor financiero ni gestor de patrimonios. Los datos que muestra el dispositivo (cotizaciones, PER, dividendos) no constituyen asesoramiento financiero ni recomendación de inversión de ningún tipo. Invertir conlleva riesgos, incluida la posible pérdida del capital invertido. Trabajar con electrónica y microcontroladores también conlleva sus propios riesgos (cortocircuitos, mal uso de la alimentación, etc.); síguelo bajo tu responsabilidad. Antes de tomar cualquier decisión financiera, consulta con un profesional cualificado.

En el primer artículo de Smart Finance sentamos las bases de nuestro ecosistema financiero inteligente: conectamos el mercado global a Home Assistant mediante la integración de Yahoo Finance y creamos automatizaciones para el refresco eficiente de datos y alertas de compra cuando una acción tocaba nuestro precio objetivo.

Hoy damos el salto que prometimos: materializar toda esa información en un screener de bolsa físico, encima de tu mesa.

Olvídate de desbloquear el teléfono cada diez minutos para ver cómo abre Wall Street o de tener pestañas de TradingView consumiendo recursos en segundo plano. En este tutorial vamos a montar un screener bursátil de escritorio autónomo, táctil y de bajo consumo utilizando una placa CYD (Cheap Yellow Display) basada en ESP32 por apenas 10-14€.

👇 Así se ve funcionando en directo, con el carrusel de tickers y la pantalla de detalle al tocarla:

This content is blocked because it would connect to YouTube.

El dispositivo mostrará en tiempo real:

  • Cotizaciones en vivo de 30 empresas clave con logotipos vectoriales, precios y variación diaria en verde/rojo.
  • Métricas fundamentales y de valoración: Ratios P/E (Price-to-Earnings) y Forward P/E.
  • Barra dinámica del rango del día: Un deslizador gráfico animado que indica en qué punto entre el mínimo y máximo de la sesión está cotizando el activo.
  • Indicador de estado del mercado: Un punto luminoso animado que parpadea si el mercado está abierto (Regular, Pre-market o Post-market) y se apaga en gris fuera de horas.
  • Filtros dinámicos en tiempo real: Controlados desde Home Assistant para ciclar solo las acciones que están en positivo, en negativo, o cerca de sus mínimos/máximos anuales de 52 semanas.
  • Pantalla de detalle táctil interactiva: Al tocar la pantalla, la rotación se pausa y revela datos de dividendos (Yield, Rate y fecha Ex-Div) y el rango de 52 semanas con la distancia porcentual al suelo y al techo del año.

Todo ello gestionado con la potencia de ESPHome y el motor gráfico profesional LVGL.

🎞️ Así funciona por dentro (resumen rápido)

Antes de meternos en el hardware y el código, vale la pena entender el flujo completo del programa, porque todo lo que viene después (pantallas, scripts, temporizadores) está construido alrededor de esta lógica tan simple:

  1. Modo carrusel (por defecto): la pantalla principal va rotando sola por las acciones que cumplen el filtro activo, mostrando precio, variación, PER y la barra del rango del día de cada una durante 5 segundos antes de pasar a la siguiente.
  2. Tocas la pantalla → pantalla de detalle: el carrusel se pausa al instante y aparece una segunda pantalla con los datos que no caben en la vista principal: dividendos (yield, rate y fecha ex-dividendo) y el rango de 52 semanas con la distancia porcentual al máximo y al mínimo anual.
  3. Tocas otra vez → vuelves al carrusel: si vuelves a tocar la pantalla de detalle, se cancela el temporizador de vuelta automática y el carrusel se reanuda inmediatamente, siguiendo por donde lo dejaste.
  4. No tocas nada → vuelve sola a los 60 segundos: si te olvidas la pantalla de detalle abierta, hay un temporizador de seguridad que a los 60 segundos la cierra automáticamente y retoma el carrusel, para que el dispositivo nunca se quede "colgado" mostrando el detalle de una sola acción.

Con esto en la cabeza, el resto del artículo (el montaje del hardware, las entidades de Home Assistant y el firmware completo) tiene mucho más sentido.

Doy por hecho que si estás leyendo esto ya tienes Home Assistant funcionando en casa, con HACS (Home Assistant Community Store) instalado. Si no es tu caso, hay guías de sobra para desplegarlo en una Raspberry Pi o un Mini PC en cuestión de minutos.

La pieza que hace posible todo lo que viene ahora es la integración comunitaria Yahoo Finance para Home Assistant, desarrollada por iprak.


🟨 1. ¿Qué es la CYD y qué modelo exacto necesitas?

El acrónimo CYD (Cheap Yellow Display) es el apodo cariñoso que la comunidad maker dio a una placa de desarrollo china extremadamente económica: la ESP32-2432S028R.

Se trata de un módulo "todo en uno" que integra en una sola placa de circuito impreso (PCB de color amarillo característico en sus primeras versiones):

  • Microcontrolador: ESP32-D0WDQ6 (dual-core Xtensa de 32 bits a 240 MHz con Wi-Fi de 2.4 GHz y Bluetooth).
  • Pantalla: Panel TFT LCD a color de 2.8 pulgadas con resolución de 320x240 píxeles, controlado por el chip ILI9341 a través de bus SPI de alta velocidad.
  • Panel Táctil: Resistivo de 4 hilos gestionado por el controlador XPT2046 (en bus SPI independiente).
  • Control de brillo: Retroiluminación LED conectada al pin GPIO21 mediante modulación por ancho de pulsos (PWM/LEDC), lo que permite apagarla o regular su intensidad por software.
  • Conectividad: Ranura para tarjeta MicroSD, conector de alimentación Micro-USB o USB-C (según revisión), altavoz con amplificador y puertos de expansión I/O.

🛒 ¿Dónde comprarla y qué versión elegir?

Puedes encontrarla en AliExpress, Amazon o Banggood buscando "ESP32-2432S028R" o "ESP32 2.8 inch touch screen".

💡 Consejo de compra

Asegúrate de elegir el modelo con pantalla de 2.8 pulgadas y panel táctil resistivo (referencia acabada en R). Si compras una revisión con uno o dos puertos USB-C, facilitará la conexión a tu ordenador sin necesidad de cables antiguos Micro-USB. Su precio suele rondar entre 10€ y 15€.


🔌 2. Anatomía del Hardware y Pinout en ESPHome

Para comunicarnos con la pantalla y el panel táctil, el archivo YAML define dos buses SPI independientes para evitar colisiones entre el refresco de vídeo y la lectura del digitalizador táctil:

PeriféricoFunciónPin GPIO
Pantalla (ILI9341)SPI Clock (CLK)GPIO14
SPI Data (MOSI)GPIO13
Chip Select (CS)GPIO15
Data/Command (DC)GPIO2
Backlight (Brillo)GPIO21 (PWM LEDC)
Táctil (XPT2046)SPI Clock (CLK)GPIO25
SPI Data (MOSI)GPIO32
SPI Data (MISO)GPIO39
Chip Select (CS)GPIO33
Interrupción (IRQ)GPIO36

⚙️ 3. Preparación de Home Assistant: Configuraciones Auxiliares

Antes de compilar el firmware en tu CYD, debemos preparar Home Assistant para que le suministre exactamente los datos y el control que el dispositivo espera.


📈 A. Los 30 Tickers en configuration.yaml

En el artículo anterior configuramos la integración de Yahoo Finance. Para que la CYD pueda consultar el P/E, dividendos y rangos de 52 semanas, tu bloque yahoofinance debe tener activados los atributos extendidos:

configuration.yaml (Extracto)
yahoofinance:
  include_post_values: false
  include_pre_values: false
  include_dividend_values: true         # IMPRESCINDIBLE: activa dividendYield, dividendRate y dividendDate
  include_fifty_two_week_values: true   # IMPRESCINDIBLE: activa 52w High, Low y sus variaciones
  decimal_places: 2
  scan_interval: manual                 # Controlado por la automatización de refresco inteligente
  symbols:
    - HRL
    - TSLA
    - BABA
    - PFE
    - INTC
    - CSCO
    - GOOGL
    - QCOM
    - LMT
    - MSFT
    - BMY
    - GD
    - LEVI
    - NKE
    - NTR
    - PYPL
    - GIS
    - KMB
    - NVO
    - ORCL
    - ADBE
    - UNH
    - MDT
    - MRK
    - ABT
    - ACN
    - TROW
    - CVS
    - AMZN
    - BRK-B

💡 Nota sobre Berkshire Hathaway

En Yahoo Finance el ticker es BRK-B, lo que genera en Home Assistant el sensor sensor.yahoofinance_brk_b.

💡 ¿Puedo poner mis propios tickers?

Sí, sin problema — cambia la lista de symbols: por las empresas que sigas tú. Eso sí, dos cosas a tener en cuenta:

  • Esta configuración concreta del firmware está pensada para 30 tickers exactos. Cada símbolo no solo aparece aquí en la lista de Home Assistant, también está referenciado a mano en varios arrays de C++ dentro del script (vals[], pcts[], l52s[]...). Si quieres sustituir un ticker por otro, es tan simple como cambiar el símbolo en todos esos sitios manteniendo la posición. Si quieres añadir más de 30, tienes que ampliar cada uno de esos arrays a mano — no es automático.
  • Y aunque lo amplíes a mano, hay un techo real: el ESP32 de la CYD tiene una RAM bastante limitada, que se reparte entre los buffers de la pantalla LVGL, los 30 logos cargados en memoria como RGB565 y la pila de WiFi/API. En mis pruebas, alrededor de 30 tickers la placa va sobrada; si te vas muy por encima de esa cifra, es fácil quedarte sin RAM y que el dispositivo se cuelgue o entre en bucle de reinicios. Si quieres probar con más, ve subiendo poco a poco y vigila los logs de ESPHome por si empieza a fallar.

🎛️ B. El Ayudante Selector de Filtro (input_select.filtro_ticker_cyd)

El código C++ embebido en la CYD consulta en tiempo real el estado de una entidad input_select para decidir qué acciones mostrar en el bucle de rotación.

Debes crear este ayudante con los nombres literales exactos que evalúa el microcontrolador:

  1. Ve a Ajustes > Dispositivos y servicios > Ayudantes.
  2. Pulsa + Crear ayudante > Desplegable (Dropdown / Input Select).
  3. Configúralo así:
    • Nombre: Filtro Ticker CYD
    • ID de entidad: input_select.filtro_ticker_cyd
    • Opciones (añade una a una respetando mayúsculas y acentos):
      • Todas las acciones
      • En Positivo Hoy
      • En Negativo Hoy
      • Cerca Minimos 52w (+25%)
      • Cerca Maximos 52w (-25%)
      • En Minimos 52w (+10%)
      • En Maximos 52w (-10%)
    • Icono: mdi:filter-menu

Si prefieres crearlo por YAML en tu configuration.yaml:

configuration.yaml (input_select)
input_select:
  filtro_ticker_cyd:
    name: Filtro Ticker CYD
    icon: mdi:filter-menu
    options:
      - "Todas las acciones"
      - "En Positivo Hoy"
      - "En Negativo Hoy"
      - "Cerca Minimos 52w (+25%)"
      - "Cerca Maximos 52w (-25%)"
      - "En Minimos 52w (+10%)"
      - "En Maximos 52w (-10%)"

🌙 C. Automatización 1: Modo Noche y Ahorro de Energía (Sleep Mode)

La CYD expone a Home Assistant una entidad de luz llamada light.display_backlight (o light.fuego_screener_display_backlight, según cómo hayas nombrado tu dispositivo). Podemos regular su brillo o apagarla por completo durante la noche para no iluminar la habitación ni desgastar el panel TFT:

modo-noche-cyd.yaml
alias: "Finanzas: Modo Noche CYD Display"
description: "Apaga la pantalla por la noche y la enciende por la mañana a brillo adecuado"
trigger:
  - trigger: time
    at: "23:30:00"
    id: apagar
  - trigger: time
    at: "08:00:00"
    id: encender
action:
  - choose:
      - conditions:
          - condition: trigger
            id: apagar
        sequence:
          - action: light.turn_off
            target:
              entity_id: light.display_backlight
      - conditions:
          - condition: trigger
            id: encender
        sequence:
          - action: light.turn_on
            target:
              entity_id: light.display_backlight
            data:
              brightness_pct: 80
mode: single

🔄 D. Automatización 2: Cambio Dinámico de Filtro según la Jornada

Podemos hacer que la CYD sea aún más proactiva programando qué tipo de información nos muestra según la hora del día:

  • Por la mañana (antes de abrir Wall Street): Filtra acciones en mínimos anuales para preparar órdenes de compra.
  • Durante la sesión activa de bolsa: Muestra las acciones que están en movimiento o en positivo hoy.
  • Al cierre de la sesión: Vuelve a mostrar todas las acciones.
programacion-filtro-cyd.yaml
alias: "Finanzas: Programación Automática Filtro CYD"
description: "Alterna el filtro del screener físico según la fase del mercado"
trigger:
  - trigger: time
    at: "09:00:00"
    id: manana_radar
  - trigger: time
    at: "15:30:00"
    id: apertura_wall_street
  - trigger: time
    at: "22:15:00"
    id: cierre_mercado
action:
  - choose:
      - conditions:
          - condition: trigger
            id: manana_radar
        sequence:
          - action: input_select.select_option
            target:
              entity_id: input_select.filtro_ticker_cyd
            data:
              option: "Cerca Minimos 52w (+25%)"
      - conditions:
          - condition: trigger
            id: apertura_wall_street
        sequence:
          - action: input_select.select_option
            target:
              entity_id: input_select.filtro_ticker_cyd
            data:
              option: "Todas las acciones"
      - conditions:
          - condition: trigger
            id: cierre_mercado
        sequence:
          - action: input_select.select_option
            target:
              entity_id: input_select.filtro_ticker_cyd
            data:
              option: "Todas las acciones"
mode: single

💡 ¿Y si no quiero programarlo por horas?

Esta automatización es completamente opcional. El input_select.filtro_ticker_cyd que creamos en el punto B es, en el fondo, un desplegable normal — puedes añadirlo a cualquier panel de tu dashboard de Home Assistant y elegir el filtro tú mismo, a mano, cuando te apetezca mirar solo las que están en positivo o las que están cerca de mínimos. La automatización de arriba simplemente hace ese cambio por ti según la hora, pero si prefieres tener el control manual (o combinar ambas cosas, dejando que la automatización decida y anulándola tú puntualmente desde el desplegable), no hace falta tocar una sola línea de YAML más.

🧩 E. Tarjeta Lovelace de Control para tu Dashboard

Para cambiar el filtro o el brillo con un solo clic desde tu panel principal de Home Assistant:

dashboard-lovelace-cyd.yaml
type: entities
title: 🖥️ Screener Físico CYD
show_header_toggle: false
entities:
  - entity: input_select.filtro_ticker_cyd
    name: Filtro Activo
  - entity: light.display_backlight
    name: Brillo Pantalla

🎨 4. Recursos previos en ESPHome: Logotipos y Fuentes

El firmware utiliza dos elementos visuales clave:

  1. Fuentes tipográficas: Usamos la fuente Montserrat de Google Fonts en varios tamaños (14, 16, 18, 24, 30 y 45 px). ESPHome la descarga y compila automáticamente gracias a la directiva gfonts://Montserrat.
  2. Logos de empresas (PNG): En el código se definen 30 imágenes locales (logos/hrl.png, logos/tsla.png, etc.).
    • Debes crear una subcarpeta llamada logos dentro del directorio de configuración de tu ESPHome (normalmente /config/esphome/logos/).
    • Guarda allí los iconos cuadrados transparentes (50x50 píxeles) nombrados exactamente en minúsculas: hrl.png, tsla.png, baba.png, etc.
    • ESPHome los convertirá internamente al formato optimizado RGB565 para renderizado ultra rápido en memoria RAM.

💡 ¿De dónde saco los logos?

Un par de sitios que me han funcionado bien:

  • Wikipedia / Wikimedia Commons — en la ficha de casi cualquier empresa cotizada tienes el logo oficial en SVG o PNG, normalmente ya con transparencia real.
  • worldvectorlogo.com — biblioteca enorme de logos vectoriales (SVG) de marcas; los exportas a PNG en el tamaño que quieras y prácticamente todos llevan transparencia de serie.

Sea cual sea la fuente, es clave que el fondo sea transparente de verdad (canal alfa), no un blanco que solo "parece" transparente. Con la pantalla en negro (bg_color: 0x000000), un logo sin transparencia real se ve con un recuadro blanco o gris feo alrededor en vez de fundirse con el fondo. Al exportar desde tu editor de imágenes, asegúrate de guardar como PNG-24 con transparencia y no aplanarlo sobre un color de fondo.


💻 5. El Código Completo del Firmware (fuego-screener.yaml)

A continuación tienes el código íntegro y funcional listo para flashear en tu ESPHome.

⚠️ Seguridad

Recuerda almacenar tu clave Wi-Fi en el archivo secrets.yaml (wifi_ssid y wifi_password) y generar tus propias claves para api.encryption y ota.password.

fuego-screener.yaml
esphome:
  name: fuego-screener
  friendly_name: Fuego Screener
  on_boot:
    priority: -10
    then:
      - script.execute: pulse_loop
      - script.execute: ticker_loop

esp32:
  board: esp32dev
  framework: { type: arduino }

api:
  encryption: { key: "!secret api_encryption_key" }

ota:
  - platform: esphome
    password: "!secret ota_password"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

logger:
web_server:
  port: 80

time:
  - platform: sntp
    id: my_time
    timezone: "Europe/Madrid"

interval:
  - interval: 1s
    then:
      - lambda: |-
          if (id(intro_time) != nullptr) {
              auto time = id(my_time).now();
              if (time.is_valid()) {
                  char t_buf[16];
                  char d_buf[16];
                  snprintf(t_buf, sizeof(t_buf), "%02d:%02d:%02d", time.hour, time.minute, time.second);
                  snprintf(d_buf, sizeof(d_buf), "%02d/%02d/%02d", time.day_of_month, time.month, time.year % 100);
                  lv_label_set_text(id(intro_time), t_buf);
                  lv_label_set_text(id(intro_date), d_buf);
              }
          }

# --- HARDWARE ---
spi:
  - { id: tft_bus, clk_pin: GPIO14, mosi_pin: GPIO13 }
  - { id: touch_bus, clk_pin: GPIO25, mosi_pin: GPIO32, miso_pin: GPIO39 }

display:
  - platform: mipi_spi
    id: my_display
    model: ILI9341
    spi_id: tft_bus
    cs_pin: GPIO15
    dc_pin: GPIO2
    dimensions: { width: 320, height: 240 }
    color_order: rgb
    invert_colors: false 
    auto_clear_enabled: false 
    update_interval: never

touchscreen:
  id: my_touch
  platform: xpt2046
  spi_id: touch_bus
  cs_pin: GPIO33
  interrupt_pin: GPIO36
  calibration: { x_min: 280, x_max: 3860, y_min: 340, y_max: 3860 }

# --- IMÁGENES (30 TICKERS) ---
image:
  - { file: "logos/hrl.png", id: img_hrl, resize: 50x50, type: RGB565 }
  - { file: "logos/tsla.png", id: img_tsla, resize: 50x50, type: RGB565 }
  - { file: "logos/baba.png", id: img_baba, resize: 50x50, type: RGB565 }
  - { file: "logos/pfe.png", id: img_pfe, resize: 50x50, type: RGB565 }
  - { file: "logos/intc.png", id: img_intc, resize: 50x50, type: RGB565 }
  - { file: "logos/csco.png", id: img_csco, resize: 50x50, type: RGB565 }
  - { file: "logos/googl.png", id: img_googl, resize: 50x50, type: RGB565 }
  - { file: "logos/qcom.png", id: img_qcom, resize: 50x50, type: RGB565 }
  - { file: "logos/lmt.png", id: img_lmt, resize: 50x50, type: RGB565 }
  - { file: "logos/msft.png", id: img_msft, resize: 50x50, type: RGB565 }
  - { file: "logos/bmy.png", id: img_bmy, resize: 50x50, type: RGB565 }
  - { file: "logos/gd.png", id: img_gd, resize: 50x50, type: RGB565 }
  - { file: "logos/levi.png", id: img_levi, resize: 50x50, type: RGB565 }
  - { file: "logos/nke.png", id: img_nke, resize: 50x50, type: RGB565 }
  - { file: "logos/ntr.png", id: img_ntr, resize: 50x50, type: RGB565 }
  - { file: "logos/pypl.png", id: img_pypl, resize: 50x50, type: RGB565 }
  - { file: "logos/gis.png", id: img_gis, resize: 50x50, type: RGB565 }
  - { file: "logos/kmb.png", id: img_kmb, resize: 50x50, type: RGB565 }
  - { file: "logos/nvo.png", id: img_nvo, resize: 50x50, type: RGB565 }
  - { file: "logos/orcl.png", id: img_orcl, resize: 50x50, type: RGB565 }
  - { file: "logos/adbe.png", id: img_adbe, resize: 50x50, type: RGB565 }
  - { file: "logos/unh.png", id: img_unh, resize: 50x50, type: RGB565 }
  - { file: "logos/mdt.png", id: img_mdt, resize: 50x50, type: RGB565 }
  - { file: "logos/mrk.png", id: img_mrk, resize: 50x50, type: RGB565 }
  - { file: "logos/abt.png", id: img_abt, resize: 50x50, type: RGB565 }
  - { file: "logos/acn.png", id: img_acn, resize: 50x50, type: RGB565 }
  - { file: "logos/trow.png", id: img_trow, resize: 50x50, type: RGB565 }
  - { file: "logos/cvs.png", id: img_cvs, resize: 50x50, type: RGB565 }
  - { file: "logos/amzn.png", id: img_amzn, resize: 50x50, type: RGB565 }
  - { file: "logos/brkb.png", id: img_brkb, resize: 50x50, type: RGB565 }

# --- FUENTES ---
font:
  - { file: "gfonts://Montserrat", id: font_huge, size: 45 }
  - { file: "gfonts://Montserrat", id: font_ticker, size: 30 }
  - { file: "gfonts://Montserrat", id: font_change, size: 24 }
  - { file: "gfonts://Montserrat", id: font_name, size: 18 }
  - { file: "gfonts://Montserrat", id: font_small, size: 16 }
  - { file: "gfonts://Montserrat", id: font_tiny, size: 14 }

globals:
  - id: ticker_index
    type: int
    initial_value: "0"
  - id: total_matches
    type: int
    initial_value: "0"
  - id: items_shown
    type: int
    initial_value: "0"
  - id: is_paused
    type: bool
    initial_value: "false"
  - id: dot_opa
    type: int
    initial_value: "255"
  - id: dot_dir
    type: int
    initial_value: "-15"
  - id: arc_angle
    type: int
    initial_value: "0"
  - id: arc_dir
    type: int
    initial_value: "5"

# --- INTERFAZ LVGL ---
lvgl:
  id: my_lvgl
  displays: [my_display]
  touchscreens: [my_touch]
  rotation: 270
  buffer_size: 25%
  bg_color: 0x000000

  pages:
    - id: intro_page
      bg_color: 0x000000
      border_width: 0
      pad_all: 0
      radius: 0
      scrollable: false
      widgets:
        - label:
            id: intro_time
            text: "--:--:--"
            align: TOP_MID
            y: 5
            text_color: 0xAAAAAA
            text_font: font_change
        - label:
            id: intro_date
            text: "--/--/--"
            align: TOP_MID
            y: 32
            text_color: 0x666666
            text_font: font_name
        - arc:
            id: intro_arc
            align: CENTER
            y: -30
            width: 100
            height: 100
            bg_opa: 0
            border_width: 0
            value: 0
            min_value: 0
            max_value: 360
        - label: 
            id: intro_symbol
            text: "ALL"
            align: CENTER
            y: -30
            text_font: font_ticker
            text_color: 0xFFFFFF
        - label: 
            id: intro_title
            text: "Filtrando..."
            align: CENTER
            y: 45
            text_color: 0xFFFFFF
            text_font: font_name
        - label: 
            id: intro_count
            text: "Calculando..."
            align: CENTER
            y: 75
            text_color: 0x888888
            text_font: font_small

    - id: main_page
      bg_color: 0x000000
      border_width: 0
      pad_all: 0
      radius: 0
      scrollable: false
      widgets:
        - obj:
            align: TOP_MID
            y: 5
            width: 260
            height: 65
            bg_opa: 0
            border_width: 0
            pad_all: 0
            layout: { type: FLEX, flex_flow: ROW, flex_align_main: CENTER, flex_align_cross: CENTER, pad_column: 12 }
            widgets:
              - image: { id: ticker_logo, src: img_tsla, radius: 15, clip_corner: true }
              - label: { id: ticker_name, text: "---", text_color: 0xFFFFFF, text_font: font_ticker }
        
        - label: { id: company_name, text: "Cargando...", align: TOP_MID, y: 62, text_color: 0x888888, text_font: font_name }
        
        - obj: { id: filter_dot_main, width: 34, height: 34, radius: 0, align: TOP_LEFT, x: -17, y: -17, bg_color: 0x555555, border_width: 0 }
        - obj: { id: market_dot_main, width: 10, height: 10, radius: 5, align: TOP_RIGHT, x: -15, y: 27, bg_color: 0x555555, border_width: 0 }

        - label: { id: stock_price, text: "---", align: CENTER, y: -30, text_color: 0xFFFFFF, text_font: font_huge }
        - label: { id: stock_change, text: "+0.00 (+0.00%)", align: CENTER, y: 15, text_color: 0x888888, text_font: font_change }
        - label: { id: stock_pe_info, text: "PE: --- | FPE: ---", align: CENTER, y: 52, text_color: 0x666666, text_font: font_small }
        
        - label: { id: stock_low, text: "L: ---", align: BOTTOM_LEFT, x: 20, y: -40, text_color: 0x666666, text_font: font_tiny }
        - label: { id: stock_high, text: "H: ---", align: BOTTOM_RIGHT, x: -20, y: -40, text_color: 0x666666, text_font: font_tiny }
        - obj: { id: range_track, align: BOTTOM_LEFT, x: 20, y: -20, width: 200, height: 2, bg_color: 0x333333, border_width: 0, radius: 0 }
        - obj: { id: range_marker, align: BOTTOM_LEFT, x: 20, y: -25, width: 6, height: 12, bg_color: 0xFFFFFF, border_width: 0, radius: 1 }

        - obj: { id: page_dot_1_main, width: 6, height: 6, radius: 3, align: BOTTOM_MID, x: -8, y: -5, bg_color: 0xFFFFFF, border_width: 0 }
        - obj: { id: page_dot_2_main, width: 6, height: 6, radius: 3, align: BOTTOM_MID, x: 8, y: -5, bg_color: 0x444444, border_width: 0 }

        - obj:
            width: 100%
            height: 100%
            bg_opa: 0
            border_width: 0
            on_click:
              then:
                - lambda: 'id(is_paused) = true;'
                - lvgl.page.show: detail_page
                - script.execute: detail_timeout 

    - id: detail_page
      bg_color: 0x000000
      border_width: 0
      pad_all: 0
      radius: 0
      scrollable: false
      widgets:
        - obj:
            align: TOP_MID
            y: 10
            width: 260
            height: 65
            bg_opa: 0
            border_width: 0
            pad_all: 0
            layout: { type: FLEX, flex_flow: ROW, flex_align_main: CENTER, flex_align_cross: CENTER, pad_column: 12 }
            widgets:
              - image: { id: det_logo, src: img_tsla, radius: 15, clip_corner: true }
              - label: { id: det_ticker, text: "---", text_color: 0xFFFFFF, text_font: font_ticker }
              
        - obj: { id: market_dot_det, width: 10, height: 10, radius: 5, align: TOP_LEFT, x: 15, y: 32, bg_color: 0x555555, border_width: 0 }

        - label: { id: det_div_title, text: "DIVIDENDOS", align: TOP_MID, y: 90, text_color: 0x888888, text_font: font_small }
        - label: { id: det_div_info, text: "Yield: --- | Rate: ---", align: TOP_MID, y: 115, text_color: 0x00FF00, text_font: font_name } 
        - label: { id: det_div_date, text: "Ex-Div: ---", align: TOP_MID, y: 140, text_color: 0xFFFFFF, text_font: font_small }

        - label: { id: det_52w_title, text: "RANGO 52 SEMANAS", align: BOTTOM_MID, y: -95, text_color: 0x888888, text_font: font_small }
        
        - label: { id: det_52w_chg_l, text: "---", align: BOTTOM_LEFT, x: 5, y: -72, text_color: 0x00FF00, text_font: font_tiny }
        - label: { id: det_52w_chg_h, text: "---", align: BOTTOM_RIGHT, x: -5, y: -72, text_color: 0xFF0000, text_font: font_tiny }

        - label: { id: det_52w_low, text: "L: ---", align: BOTTOM_LEFT, x: 20, y: -40, text_color: 0x666666, text_font: font_tiny }
        - label: { id: det_52w_high, text: "H: ---", align: BOTTOM_RIGHT, x: -20, y: -40, text_color: 0x666666, text_font: font_tiny }
        
        - obj: { id: det_52w_track, align: BOTTOM_LEFT, x: 20, y: -20, width: 200, height: 2, bg_color: 0x333333, border_width: 0, radius: 0 }
        - obj: { id: det_52w_marker, align: BOTTOM_LEFT, x: 20, y: -25, width: 6, height: 12, bg_color: 0xFFFFFF, border_width: 0, radius: 1 }

        - obj: { id: page_dot_1_det, width: 6, height: 6, radius: 3, align: BOTTOM_MID, x: -8, y: -5, bg_color: 0x444444, border_width: 0 }
        - obj: { id: page_dot_2_det, width: 6, height: 6, radius: 3, align: BOTTOM_MID, x: 8, y: -5, bg_color: 0xFFFFFF, border_width: 0 }

        - obj:
            width: 100%
            height: 100%
            bg_opa: 0
            border_width: 0
            on_click:
              then:
                - script.stop: detail_timeout
                - lambda: 'id(is_paused) = false;'
                - lvgl.page.show: main_page
                - script.execute: ticker_loop

# --- SCRIPTS ---
script:
  - id: detail_timeout
    mode: restart
    then:
      - delay: 60s
      - lambda: 'id(is_paused) = false;'
      - lvgl.page.show: main_page
      - script.execute: ticker_loop

  - id: pulse_loop
    mode: restart
    then:
      - lambda: |-
          lv_obj_set_style_arc_width(id(intro_arc), 2, LV_PART_MAIN);
          lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0x333333), LV_PART_MAIN);
          lv_obj_set_style_arc_width(id(intro_arc), 8, LV_PART_INDICATOR);
      - while:
          condition: { lambda: 'return true;' }
          then:
            - lambda: |-
                text_sensor::TextSensor* m_stats[] = {id(hrl_market), id(tsla_market), id(baba_market), id(pfe_market), id(intc_market), id(csco_market), id(googl_market), id(qcom_market), id(lmt_market), id(msft_market), id(bmy_market), id(gd_market), id(levi_market), id(nke_market), id(ntr_market), id(pypl_market), id(gis_market), id(kmb_market), id(nvo_market), id(orcl_market), id(adbe_market), id(unh_market), id(mdt_market), id(mrk_market), id(abt_market), id(acn_market), id(trow_market), id(cvs_market), id(amzn_market), id(brkb_market)};
                std::string ms = m_stats[id(ticker_index)]->state;
                if (ms == "REGULAR" || ms == "PRE" || ms == "POST") {
                  int opa = id(dot_opa); opa += id(dot_dir);
                  if (opa <= 50) { opa = 50; id(dot_dir) = 15; }
                  if (opa >= 255) { opa = 255; id(dot_dir) = -15; }
                  id(dot_opa) = opa;
                  lv_obj_set_style_bg_opa(id(market_dot_main), opa, 0);
                  lv_obj_set_style_bg_color(id(market_dot_main), lv_color_hex(0x00FF00), 0);
                  lv_obj_set_style_bg_opa(id(market_dot_det), opa, 0);
                  lv_obj_set_style_bg_color(id(market_dot_det), lv_color_hex(0x00FF00), 0);
                } else {
                  lv_obj_set_style_bg_opa(id(market_dot_main), 255, 0);
                  lv_obj_set_style_bg_color(id(market_dot_main), lv_color_hex(0x555555), 0);
                  lv_obj_set_style_bg_opa(id(market_dot_det), 255, 0);
                  lv_obj_set_style_bg_color(id(market_dot_det), lv_color_hex(0x555555), 0);
                }
                
                int angle = id(arc_angle);
                angle += id(arc_dir);
                if (angle >= 360) { angle = 360; id(arc_dir) = -10; }
                if (angle <= 0) { angle = 0; id(arc_dir) = 10; }
                id(arc_angle) = angle;
                lv_arc_set_value(id(intro_arc), angle);
            - delay: 50ms

  - id: ticker_loop
    mode: restart
    then:
      - while:
          condition: { lambda: 'return !id(is_paused);' }
          then:
            - lambda: |-
                std::string f = id(active_filter).state;
                int matches = 0;
                
                sensor::Sensor* vals[] = {id(hrl_val), id(tsla_val), id(baba_val), id(pfe_val), id(intc_val), id(csco_val), id(googl_val), id(qcom_val), id(lmt_val), id(msft_val), id(bmy_val), id(gd_val), id(levi_val), id(nke_val), id(ntr_val), id(pypl_val), id(gis_val), id(kmb_val), id(nvo_val), id(orcl_val), id(adbe_val), id(unh_val), id(mdt_val), id(mrk_val), id(abt_val), id(acn_val), id(trow_val), id(cvs_val), id(amzn_val), id(brkb_val)};
                sensor::Sensor* pcts[] = {id(hrl_pct), id(tsla_pct), id(baba_pct), id(pfe_pct), id(intc_pct), id(csco_pct), id(googl_pct), id(qcom_pct), id(lmt_pct), id(msft_pct), id(bmy_pct), id(gd_pct), id(levi_pct), id(nke_pct), id(ntr_pct), id(pypl_pct), id(gis_pct), id(kmb_pct), id(nvo_pct), id(orcl_pct), id(adbe_pct), id(unh_pct), id(mdt_pct), id(mrk_pct), id(abt_pct), id(acn_pct), id(trow_pct), id(cvs_pct), id(amzn_pct), id(brkb_pct)};
                sensor::Sensor* l52s[] = {id(hrl_52l), id(tsla_52l), id(baba_52l), id(pfe_52l), id(intc_52l), id(csco_52l), id(googl_52l), id(qcom_52l), id(lmt_52l), id(msft_52l), id(bmy_52l), id(gd_52l), id(levi_52l), id(nke_52l), id(ntr_52l), id(pypl_52l), id(gis_52l), id(kmb_52l), id(nvo_52l), id(orcl_52l), id(adbe_52l), id(unh_52l), id(mdt_52l), id(mrk_52l), id(abt_52l), id(acn_52l), id(trow_52l), id(cvs_52l), id(amzn_52l), id(brkb_52l)};
                sensor::Sensor* h52s[] = {id(hrl_52h), id(tsla_52h), id(baba_52h), id(pfe_52h), id(intc_52h), id(csco_52h), id(googl_52h), id(qcom_52h), id(lmt_52h), id(msft_52h), id(bmy_52h), id(gd_52h), id(levi_52h), id(nke_52h), id(ntr_52h), id(pypl_52h), id(gis_52h), id(kmb_52h), id(nvo_52h), id(orcl_52h), id(adbe_52h), id(unh_52h), id(mdt_52h), id(mrk_52h), id(abt_52h), id(acn_52h), id(trow_52h), id(cvs_52h), id(amzn_52h), id(brkb_52h)};

                for(int i=0; i<30; i++) {
                  float p = vals[i]->state; float pct = pcts[i]->state;
                  float l = l52s[i]->state; float h = h52s[i]->state;
                  if (f == "Todas las acciones") matches++;
                  else if (f == "En Positivo Hoy" && pct > 0) matches++;
                  else if (f == "En Negativo Hoy" && pct < 0) matches++;
                  else if (f == "Cerca Minimos 52w (+25%)" && !std::isnan(p) && !std::isnan(l) && l > 0 && (p-l)/l <= 0.25) matches++;
                  else if (f == "Cerca Maximos 52w (-25%)" && !std::isnan(p) && !std::isnan(h) && h > 0 && (h-p)/h <= 0.25) matches++;
                  else if (f == "En Minimos 52w (+10%)" && !std::isnan(p) && !std::isnan(l) && l > 0 && (p-l)/l <= 0.10) matches++;
                  else if (f == "En Maximos 52w (-10%)" && !std::isnan(p) && !std::isnan(h) && h > 0 && (h-p)/h <= 0.10) matches++;
                }
                id(total_matches) = matches;
                id(ticker_index) = 0;
                id(items_shown) = 0;

            - lvgl.page.show: intro_page
            
            - lambda: |-
                std::string f = id(active_filter).state;
                int matches = id(total_matches);
                if (matches == 0) {
                  lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0x555555), LV_PART_INDICATOR);
                  lv_label_set_text(id(intro_symbol), "!");
                  lv_label_set_text(id(intro_title), "Sin coincidencias");
                  lv_label_set_text(id(intro_count), "Selecciona otro filtro");
                } else {
                  if (f.find("Positivo") != std::string::npos) {
                      lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0x00FF00), LV_PART_INDICATOR);
                      lv_label_set_text(id(intro_symbol), "+");
                  } else if (f.find("Negativo") != std::string::npos) {
                      lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0xFF0000), LV_PART_INDICATOR);
                      lv_label_set_text(id(intro_symbol), "-");
                  } else if (f.find("Minimos") != std::string::npos) {
                      lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0xFFA500), LV_PART_INDICATOR);
                      lv_label_set_text(id(intro_symbol), "MIN");
                  } else if (f.find("Maximos") != std::string::npos) {
                      lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0xFFA500), LV_PART_INDICATOR);
                      lv_label_set_text(id(intro_symbol), "MAX");
                  } else {
                      lv_obj_set_style_arc_color(id(intro_arc), lv_color_hex(0x8A2BE2), LV_PART_INDICATOR);
                      lv_label_set_text(id(intro_symbol), "ALL");
                  }
                  
                  lv_label_set_text(id(intro_title), f.c_str());
                  char b[64]; snprintf(b, sizeof(b), "Mostrando %d de 30 acciones", matches);
                  lv_label_set_text(id(intro_count), b);
                }
            - delay: 5s
            
            - while:
                condition: { lambda: 'return id(total_matches) > 0 && !id(is_paused);' }
                then:
                  - if:
                      condition: { lambda: 'return id(items_shown) >= id(total_matches);' }
                      then:
                        - lambda: 'id(total_matches) = 0;'
                  
                  - if:
                      condition: { lambda: 'return id(total_matches) > 0;' }
                      then:
                        - lambda: |-
                            std::string f = id(active_filter).state;
                            int start = id(ticker_index);
                            bool found = false;
                            sensor::Sensor* pcts[] = {id(hrl_pct), id(tsla_pct), id(baba_pct), id(pfe_pct), id(intc_pct), id(csco_pct), id(googl_pct), id(qcom_pct), id(lmt_pct), id(msft_pct), id(bmy_pct), id(gd_pct), id(levi_pct), id(nke_pct), id(ntr_pct), id(pypl_pct), id(gis_pct), id(kmb_pct), id(nvo_pct), id(orcl_pct), id(adbe_pct), id(unh_pct), id(mdt_pct), id(mrk_pct), id(abt_pct), id(acn_pct), id(trow_pct), id(cvs_pct), id(amzn_pct), id(brkb_pct)};
                            sensor::Sensor* vals[] = {id(hrl_val), id(tsla_val), id(baba_val), id(pfe_val), id(intc_val), id(csco_val), id(googl_val), id(qcom_val), id(lmt_val), id(msft_val), id(bmy_val), id(gd_val), id(levi_val), id(nke_val), id(ntr_val), id(pypl_val), id(gis_val), id(kmb_val), id(nvo_val), id(orcl_val), id(adbe_val), id(unh_val), id(mdt_val), id(mrk_val), id(abt_val), id(acn_val), id(trow_val), id(cvs_val), id(amzn_val), id(brkb_val)};
                            sensor::Sensor* l52s[] = {id(hrl_52l), id(tsla_52l), id(baba_52l), id(pfe_52l), id(intc_52l), id(csco_52l), id(googl_52l), id(qcom_52l), id(lmt_52l), id(msft_52l), id(bmy_52l), id(gd_52l), id(levi_52l), id(nke_52l), id(ntr_52l), id(pypl_52l), id(gis_52l), id(kmb_52l), id(nvo_52l), id(orcl_52l), id(adbe_52l), id(unh_52l), id(mdt_52l), id(mrk_52l), id(abt_52l), id(acn_52l), id(trow_52l), id(cvs_52l), id(amzn_52l), id(brkb_52l)};
                            sensor::Sensor* h52s[] = {id(hrl_52h), id(tsla_52h), id(baba_52h), id(pfe_52h), id(intc_52h), id(csco_52h), id(googl_52h), id(qcom_52h), id(lmt_52h), id(msft_52h), id(bmy_52h), id(gd_52h), id(levi_52h), id(nke_52h), id(ntr_52h), id(pypl_52h), id(gis_52h), id(kmb_52h), id(nvo_52h), id(orcl_52h), id(adbe_52h), id(unh_52h), id(mdt_52h), id(mrk_52h), id(abt_52h), id(acn_52h), id(trow_52h), id(cvs_52h), id(amzn_52h), id(brkb_52h)};

                            for(int i=0; i<30; i++){
                              int idx = (start + i) % 30;
                              float p = vals[idx]->state; float pct = pcts[idx]->state;
                              float l = l52s[idx]->state; float h = h52s[idx]->state;
                              bool is_v = false;
                              if (f == "Todas las acciones") is_v = true;
                              else if (f == "En Positivo Hoy" && pct > 0) is_v = true;
                              else if (f == "En Negativo Hoy" && pct < 0) is_v = true;
                              else if (f == "Cerca Minimos 52w (+25%)" && !std::isnan(p) && !std::isnan(l) && l > 0 && (p-l)/l <= 0.25) is_v = true;
                              else if (f == "Cerca Maximos 52w (-25%)" && !std::isnan(p) && !std::isnan(h) && h > 0 && (h-p)/h <= 0.25) is_v = true;
                              else if (f == "En Minimos 52w (+10%)" && !std::isnan(p) && !std::isnan(l) && l > 0 && (p-l)/l <= 0.10) is_v = true;
                              else if (f == "En Maximos 52w (-10%)" && !std::isnan(p) && !std::isnan(h) && h > 0 && (h-p)/h <= 0.10) is_v = true;
                              
                              if(is_v){ id(ticker_index) = idx; found = true; break; }
                            }
                            if (found) { id(items_shown) += 1; }
                            else { id(total_matches) = 0; }

                        - if:
                            condition: { lambda: 'return id(total_matches) > 0;' }
                            then:
                              - lvgl.page.show: main_page
                              - if: { condition: { lambda: 'return id(ticker_index) == 0;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_hrl}}, {lvgl.image.update: {id: det_logo, src: img_hrl}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 1;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_tsla}}, {lvgl.image.update: {id: det_logo, src: img_tsla}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 2;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_baba}}, {lvgl.image.update: {id: det_logo, src: img_baba}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 3;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_pfe}}, {lvgl.image.update: {id: det_logo, src: img_pfe}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 4;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_intc}}, {lvgl.image.update: {id: det_logo, src: img_intc}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 5;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_csco}}, {lvgl.image.update: {id: det_logo, src: img_csco}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 6;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_googl}}, {lvgl.image.update: {id: det_logo, src: img_googl}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 7;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_qcom}}, {lvgl.image.update: {id: det_logo, src: img_qcom}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 8;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_lmt}}, {lvgl.image.update: {id: det_logo, src: img_lmt}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 9;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_msft}}, {lvgl.image.update: {id: det_logo, src: img_msft}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 10;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_bmy}}, {lvgl.image.update: {id: det_logo, src: img_bmy}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 11;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_gd}}, {lvgl.image.update: {id: det_logo, src: img_gd}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 12;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_levi}}, {lvgl.image.update: {id: det_logo, src: img_levi}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 13;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_nke}}, {lvgl.image.update: {id: det_logo, src: img_nke}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 14;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_ntr}}, {lvgl.image.update: {id: det_logo, src: img_ntr}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 15;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_pypl}}, {lvgl.image.update: {id: det_logo, src: img_pypl}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 16;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_gis}}, {lvgl.image.update: {id: det_logo, src: img_gis}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 17;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_kmb}}, {lvgl.image.update: {id: det_logo, src: img_kmb}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 18;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_nvo}}, {lvgl.image.update: {id: det_logo, src: img_nvo}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 19;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_orcl}}, {lvgl.image.update: {id: det_logo, src: img_orcl}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 20;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_adbe}}, {lvgl.image.update: {id: det_logo, src: img_adbe}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 21;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_unh}}, {lvgl.image.update: {id: det_logo, src: img_unh}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 22;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_mdt}}, {lvgl.image.update: {id: det_logo, src: img_mdt}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 23;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_mrk}}, {lvgl.image.update: {id: det_logo, src: img_mrk}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 24;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_abt}}, {lvgl.image.update: {id: det_logo, src: img_abt}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 25;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_acn}}, {lvgl.image.update: {id: det_logo, src: img_acn}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 26;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_trow}}, {lvgl.image.update: {id: det_logo, src: img_trow}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 27;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_cvs}}, {lvgl.image.update: {id: det_logo, src: img_cvs}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 28;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_amzn}}, {lvgl.image.update: {id: det_logo, src: img_amzn}} ] }
                              - if: { condition: { lambda: 'return id(ticker_index) == 29;' }, then: [ {lvgl.image.update: {id: ticker_logo, src: img_brkb}}, {lvgl.image.update: {id: det_logo, src: img_brkb}} ] }

                              - lvgl.label.update: 
                                  id: ticker_name
                                  text: !lambda |-
                                    const char* tks[]={"HRL","TSLA","BABA","PFE","INTC","CSCO","GOOGL","QCOM","LMT","MSFT","BMY","GD","LEVI","NKE","NTR","PYPL","GIS","KMB","NVO","ORCL","ADBE","UNH","MDT","MRK","ABT","ACN","TROW","CVS","AMZN","BRK-B"};
                                    return tks[id(ticker_index)];
                              - lvgl.label.update: 
                                  id: det_ticker
                                  text: !lambda |-
                                    const char* tks[]={"HRL","TSLA","BABA","PFE","INTC","CSCO","GOOGL","QCOM","LMT","MSFT","BMY","GD","LEVI","NKE","NTR","PYPL","GIS","KMB","NVO","ORCL","ADBE","UNH","MDT","MRK","ABT","ACN","TROW","CVS","AMZN","BRK-B"};
                                    return tks[id(ticker_index)];
                              - lvgl.label.update: 
                                  id: company_name
                                  text: !lambda |-
                                    const char* nms[]={"Hormel Foods","Tesla Inc.","Alibaba Group","Pfizer Inc.","Intel Corp.","Cisco Systems","Alphabet Inc.","Qualcomm Inc.","Lockheed Martin","Microsoft Corp.","Bristol-Myers","General Dynamics","Levi Strauss","Nike Inc.","Nutrien Ltd.","PayPal Holdings","General Mills","Kimberly-Clark","Novo Nordisk","Oracle Corp.","Adobe Inc.","UnitedHealth","Medtronic","Merck & Co.","Abbott Labs","Accenture","T. Rowe Price","CVS Health","Amazon.com","Berkshire H."};
                                    return nms[id(ticker_index)];

                              - lvgl.label.update:
                                  id: stock_price
                                  text: !lambda |-
                                    sensor::Sensor* vs[] = {id(hrl_val), id(tsla_val), id(baba_val), id(pfe_val), id(intc_val), id(csco_val), id(googl_val), id(qcom_val), id(lmt_val), id(msft_val), id(bmy_val), id(gd_val), id(levi_val), id(nke_val), id(ntr_val), id(pypl_val), id(gis_val), id(kmb_val), id(nvo_val), id(orcl_val), id(adbe_val), id(unh_val), id(mdt_val), id(mrk_val), id(abt_val), id(acn_val), id(trow_val), id(cvs_val), id(amzn_val), id(brkb_val)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float p = vs[id(ticker_index)]->state; if (std::isnan(p)) return std::string("---");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char buf[32]; snprintf(buf, sizeof(buf), "%s%.2f", sym.c_str(), p); return std::string(buf);

                              - lvgl.label.update:
                                  id: stock_change
                                  text: !lambda |-
                                    sensor::Sensor* ps[] = {id(hrl_pct), id(tsla_pct), id(baba_pct), id(pfe_pct), id(intc_pct), id(csco_pct), id(googl_pct), id(qcom_pct), id(lmt_pct), id(msft_pct), id(bmy_pct), id(gd_pct), id(levi_pct), id(nke_pct), id(ntr_pct), id(pypl_pct), id(gis_pct), id(kmb_pct), id(nvo_pct), id(orcl_pct), id(adbe_pct), id(unh_pct), id(mdt_pct), id(mrk_pct), id(abt_pct), id(acn_pct), id(trow_pct), id(cvs_pct), id(amzn_pct), id(brkb_pct)};
                                    sensor::Sensor* ch[] = {id(hrl_chg), id(tsla_chg), id(baba_chg), id(pfe_chg), id(intc_chg), id(csco_chg), id(googl_chg), id(qcom_chg), id(lmt_chg), id(msft_chg), id(bmy_chg), id(gd_chg), id(levi_chg), id(nke_chg), id(ntr_chg), id(pypl_chg), id(gis_chg), id(kmb_chg), id(nvo_chg), id(orcl_chg), id(adbe_chg), id(unh_chg), id(mdt_chg), id(mrk_chg), id(abt_chg), id(acn_chg), id(trow_chg), id(cvs_chg), id(amzn_chg), id(brkb_chg)};
                                    float pct = ps[id(ticker_index)]->state; float c = ch[id(ticker_index)]->state;
                                    if (std::isnan(pct)) return std::string("---");
                                    char buf[32]; snprintf(buf, sizeof(buf), "%+.2f (%+.2f%%)", c, pct);
                                    lv_obj_set_style_text_color(id(stock_change), lv_color_hex(pct >= 0 ? 0x00FF00 : 0xFF0000), 0);
                                    lv_obj_set_style_bg_color(id(range_marker), lv_color_hex(pct >= 0 ? 0x00FF00 : 0xFF0000), 0);
                                    return std::string(buf);

                              - lvgl.label.update:
                                  id: stock_pe_info
                                  text: !lambda |-
                                    sensor::Sensor* pe[] = {id(hrl_pe), id(tsla_pe), id(baba_pe), id(pfe_pe), id(intc_pe), id(csco_pe), id(googl_pe), id(qcom_pe), id(lmt_pe), id(msft_pe), id(bmy_pe), id(gd_pe), id(levi_pe), id(nke_pe), id(ntr_pe), id(pypl_pe), id(gis_pe), id(kmb_pe), id(nvo_pe), id(orcl_pe), id(adbe_pe), id(unh_pe), id(mdt_pe), id(mrk_pe), id(abt_pe), id(acn_pe), id(trow_pe), id(cvs_pe), id(amzn_pe), id(brkb_pe)};
                                    sensor::Sensor* fp[] = {id(hrl_fpe), id(tsla_fpe), id(baba_fpe), id(pfe_fpe), id(intc_fpe), id(csco_fpe), id(googl_fpe), id(qcom_fpe), id(lmt_fpe), id(msft_fpe), id(bmy_fpe), id(gd_fpe), id(levi_fpe), id(nke_fpe), id(ntr_fpe), id(pypl_fpe), id(gis_fpe), id(kmb_fpe), id(nvo_fpe), id(orcl_fpe), id(adbe_fpe), id(unh_fpe), id(mdt_fpe), id(mrk_fpe), id(abt_fpe), id(acn_fpe), id(trow_fpe), id(cvs_fpe), id(amzn_fpe), id(brkb_fpe)};
                                    float v_p = pe[id(ticker_index)]->state; float v_f = fp[id(ticker_index)]->state;
                                    char b[48]; snprintf(b, sizeof(b), "PE: %.1f | FPE: %.1f", std::isnan(v_p) ? 0.0 : v_p, std::isnan(v_f) ? 0.0 : v_f); return std::string(b);

                              - lvgl.label.update:
                                  id: stock_high
                                  text: !lambda |-
                                    sensor::Sensor* hs[] = {id(hrl_high), id(tsla_high), id(baba_high), id(pfe_high), id(intc_high), id(csco_high), id(googl_high), id(qcom_high), id(lmt_high), id(msft_high), id(bmy_high), id(gd_high), id(levi_high), id(nke_high), id(ntr_high), id(pypl_high), id(gis_high), id(kmb_high), id(nvo_high), id(orcl_high), id(adbe_high), id(unh_high), id(mdt_high), id(mrk_high), id(abt_high), id(acn_high), id(trow_high), id(cvs_high), id(amzn_high), id(brkb_high)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float h = hs[id(ticker_index)]->state; if (std::isnan(h)) return std::string("H: ---");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char b[32]; snprintf(b, sizeof(b), "H: %s%.2f", sym.c_str(), h); return std::string(b);

                              - lvgl.label.update:
                                  id: stock_low
                                  text: !lambda |-
                                    sensor::Sensor* ls[] = {id(hrl_low), id(tsla_low), id(baba_low), id(pfe_low), id(intc_low), id(csco_low), id(googl_low), id(qcom_low), id(lmt_low), id(msft_low), id(bmy_low), id(gd_low), id(levi_low), id(nke_low), id(ntr_low), id(pypl_low), id(gis_low), id(kmb_low), id(nvo_low), id(orcl_low), id(adbe_low), id(unh_low), id(mdt_low), id(mrk_low), id(abt_low), id(acn_low), id(trow_low), id(cvs_low), id(amzn_low), id(brkb_low)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float l = ls[id(ticker_index)]->state; if (std::isnan(l)) return std::string("L: ---");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char b[32]; snprintf(b, sizeof(b), "L: %s%.2f", sym.c_str(), l); return std::string(b);

                              - lvgl.label.update:
                                  id: det_div_info
                                  text: !lambda |-
                                    sensor::Sensor* ylds[] = {id(hrl_divy), id(tsla_divy), id(baba_divy), id(pfe_divy), id(intc_divy), id(csco_divy), id(googl_divy), id(qcom_divy), id(lmt_divy), id(msft_divy), id(bmy_divy), id(gd_divy), id(levi_divy), id(nke_divy), id(ntr_divy), id(pypl_divy), id(gis_divy), id(kmb_divy), id(nvo_divy), id(orcl_divy), id(adbe_divy), id(unh_divy), id(mdt_divy), id(mrk_divy), id(abt_divy), id(acn_divy), id(trow_divy), id(cvs_divy), id(amzn_divy), id(brkb_divy)};
                                    sensor::Sensor* rats[] = {id(hrl_divr), id(tsla_divr), id(baba_divr), id(pfe_divr), id(intc_divr), id(csco_divr), id(googl_divr), id(qcom_divr), id(lmt_divr), id(msft_divr), id(bmy_divr), id(gd_divr), id(levi_divr), id(nke_divr), id(ntr_divr), id(pypl_divr), id(gis_divr), id(kmb_divr), id(nvo_divr), id(orcl_divr), id(adbe_divr), id(unh_divr), id(mdt_divr), id(mrk_divr), id(abt_divr), id(acn_divr), id(trow_divr), id(cvs_divr), id(amzn_divr), id(brkb_divr)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float y = ylds[id(ticker_index)]->state; float r = rats[id(ticker_index)]->state;
                                    if (std::isnan(y) || y == 0) return std::string("Yield: N/A | Rate: N/A");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char b[48]; snprintf(b, sizeof(b), "Yield: %.2f%% | Rate: %s%.2f", y, sym.c_str(), r);
                                    return std::string(b);

                              - lvgl.label.update:
                                  id: det_div_date
                                  text: !lambda |-
                                    text_sensor::TextSensor* dates[] = {id(hrl_divd), id(tsla_divd), id(baba_divd), id(pfe_divd), id(intc_divd), id(csco_divd), id(googl_divd), id(qcom_divd), id(lmt_divd), id(msft_divd), id(bmy_divd), id(gd_divd), id(levi_divd), id(nke_divd), id(ntr_divd), id(pypl_divd), id(gis_divd), id(kmb_divd), id(nvo_divd), id(orcl_divd), id(adbe_divd), id(unh_divd), id(mdt_divd), id(mrk_divd), id(abt_divd), id(acn_divd), id(trow_divd), id(cvs_divd), id(amzn_divd), id(brkb_divd)};
                                    std::string d = dates[id(ticker_index)]->state; if (d.length() >= 10 && d[4] == '-' && d[7] == '-') {
                                      std::string yr = d.substr(2, 2); std::string mo = d.substr(5, 2); std::string dy = d.substr(8, 2);
                                      return "Ex-Div: " + dy + "/" + mo + "/" + yr;
                                    } return "Ex-Div: N/A";

                              - lvgl.label.update:
                                  id: det_52w_chg_l
                                  text: !lambda |-
                                    sensor::Sensor* lcs[] = {id(hrl_52lc), id(tsla_52lc), id(baba_52lc), id(pfe_52lc), id(intc_52lc), id(csco_52lc), id(googl_52lc), id(qcom_52lc), id(lmt_52lc), id(msft_52lc), id(bmy_52lc), id(gd_52lc), id(levi_52lc), id(nke_52lc), id(ntr_52lc), id(pypl_52lc), id(gis_52lc), id(kmb_52lc), id(nvo_52lc), id(orcl_52lc), id(adbe_52lc), id(unh_52lc), id(mdt_52lc), id(mrk_52lc), id(abt_52lc), id(acn_52lc), id(trow_52lc), id(cvs_52lc), id(amzn_52lc), id(brkb_52lc)};
                                    sensor::Sensor* lcps[] = {id(hrl_52lcp), id(tsla_52lcp), id(baba_52lcp), id(pfe_52lcp), id(intc_52lcp), id(csco_52lcp), id(googl_52lcp), id(qcom_52lcp), id(lmt_52lcp), id(msft_52lcp), id(bmy_52lcp), id(gd_52lcp), id(levi_52lcp), id(nke_52lcp), id(ntr_52lcp), id(pypl_52lcp), id(gis_52lcp), id(kmb_52lcp), id(nvo_52lcp), id(orcl_52lcp), id(adbe_52lcp), id(unh_52lcp), id(mdt_52lcp), id(mrk_52lcp), id(abt_52lcp), id(acn_52lcp), id(trow_52lcp), id(cvs_52lcp), id(amzn_52lcp), id(brkb_52lcp)};
                                    float c = lcs[id(ticker_index)]->state; float cp = lcps[id(ticker_index)]->state;
                                    if (std::isnan(c) || std::isnan(cp)) return std::string("---");
                                    char buf[32]; snprintf(buf, sizeof(buf), "%+.2f (%+.2f%%)", c, cp);
                                    return std::string(buf);

                              - lvgl.label.update:
                                  id: det_52w_chg_h
                                  text: !lambda |-
                                    sensor::Sensor* hcs[] = {id(hrl_52hc), id(tsla_52hc), id(baba_52hc), id(pfe_52hc), id(intc_52hc), id(csco_52hc), id(googl_52hc), id(qcom_52hc), id(lmt_52hc), id(msft_52hc), id(bmy_52hc), id(gd_52hc), id(levi_52hc), id(nke_52hc), id(ntr_52hc), id(pypl_52hc), id(gis_52hc), id(kmb_52hc), id(nvo_52hc), id(orcl_52hc), id(adbe_52hc), id(unh_52hc), id(mdt_52hc), id(mrk_52hc), id(abt_52hc), id(acn_52hc), id(trow_52hc), id(cvs_52hc), id(amzn_52hc), id(brkb_52hc)};
                                    sensor::Sensor* hcps[] = {id(hrl_52hcp), id(tsla_52hcp), id(baba_52hcp), id(pfe_52hcp), id(intc_52hcp), id(csco_52hcp), id(googl_52hcp), id(qcom_52hcp), id(lmt_52hcp), id(msft_52hcp), id(bmy_52hcp), id(gd_52hcp), id(levi_52hcp), id(nke_52hcp), id(ntr_52hcp), id(pypl_52hcp), id(gis_52hcp), id(kmb_52hcp), id(nvo_52hcp), id(orcl_52hcp), id(adbe_52hcp), id(unh_52hcp), id(mdt_52hcp), id(mrk_52hcp), id(abt_52hcp), id(acn_52hcp), id(trow_52hcp), id(cvs_52hcp), id(amzn_52hcp), id(brkb_52hcp)};
                                    float c = hcs[id(ticker_index)]->state; float cp = hcps[id(ticker_index)]->state;
                                    if (std::isnan(c) || std::isnan(cp)) return std::string("---");
                                    char buf[32]; snprintf(buf, sizeof(buf), "%+.2f (%+.2f%%)", c, cp);
                                    return std::string(buf);

                              - lvgl.label.update:
                                  id: det_52w_high
                                  text: !lambda |-
                                    sensor::Sensor* hs[] = {id(hrl_52h), id(tsla_52h), id(baba_52h), id(pfe_52h), id(intc_52h), id(csco_52h), id(googl_52h), id(qcom_52h), id(lmt_52h), id(msft_52h), id(bmy_52h), id(gd_52h), id(levi_52h), id(nke_52h), id(ntr_52h), id(pypl_52h), id(gis_52h), id(kmb_52h), id(nvo_52h), id(orcl_52h), id(adbe_52h), id(unh_52h), id(mdt_52h), id(mrk_52h), id(abt_52h), id(acn_52h), id(trow_52h), id(cvs_52h), id(amzn_52h), id(brkb_52h)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float h = hs[id(ticker_index)]->state; if (std::isnan(h)) return std::string("H: ---");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char b[32]; snprintf(b, sizeof(b), "H: %s%.2f", sym.c_str(), h); return std::string(b);

                              - lvgl.label.update:
                                  id: det_52w_low
                                  text: !lambda |-
                                    sensor::Sensor* ls[] = {id(hrl_52l), id(tsla_52l), id(baba_52l), id(pfe_52l), id(intc_52l), id(csco_52l), id(googl_52l), id(qcom_52l), id(lmt_52l), id(msft_52l), id(bmy_52l), id(gd_52l), id(levi_52l), id(nke_52l), id(ntr_52l), id(pypl_52l), id(gis_52l), id(kmb_52l), id(nvo_52l), id(orcl_52l), id(adbe_52l), id(unh_52l), id(mdt_52l), id(mrk_52l), id(abt_52l), id(acn_52l), id(trow_52l), id(cvs_52l), id(amzn_52l), id(brkb_52l)};
                                    text_sensor::TextSensor* cs[] = {id(hrl_curr), id(tsla_curr), id(baba_curr), id(pfe_curr), id(intc_curr), id(csco_curr), id(googl_curr), id(qcom_curr), id(lmt_curr), id(msft_curr), id(bmy_curr), id(gd_curr), id(levi_curr), id(nke_curr), id(ntr_curr), id(pypl_curr), id(gis_curr), id(kmb_curr), id(nvo_curr), id(orcl_curr), id(adbe_curr), id(unh_curr), id(mdt_curr), id(mrk_curr), id(abt_curr), id(acn_curr), id(trow_curr), id(cvs_curr), id(amzn_curr), id(brkb_curr)};
                                    float l = ls[id(ticker_index)]->state; if (std::isnan(l)) return std::string("L: ---");
                                    std::string sym = cs[id(ticker_index)]->state; if (sym.empty() || sym=="unknown") sym="$";
                                    char b[32]; snprintf(b, sizeof(b), "L: %s%.2f", sym.c_str(), l); return std::string(b);

                              - lambda: |-
                                  sensor::Sensor* vs[] = {id(hrl_val), id(tsla_val), id(baba_val), id(pfe_val), id(intc_val), id(csco_val), id(googl_val), id(qcom_val), id(lmt_val), id(msft_val), id(bmy_val), id(gd_val), id(levi_val), id(nke_val), id(ntr_val), id(pypl_val), id(gis_val), id(kmb_val), id(nvo_val), id(orcl_val), id(adbe_val), id(unh_val), id(mdt_val), id(mrk_val), id(abt_val), id(acn_val), id(trow_val), id(cvs_val), id(amzn_val), id(brkb_val)};
                                  sensor::Sensor* dls[] = {id(hrl_low), id(tsla_low), id(baba_low), id(pfe_low), id(intc_low), id(csco_low), id(googl_low), id(qcom_low), id(lmt_low), id(msft_low), id(bmy_low), id(gd_low), id(levi_low), id(nke_low), id(ntr_low), id(pypl_low), id(gis_low), id(kmb_low), id(nvo_low), id(orcl_low), id(adbe_low), id(unh_low), id(mdt_low), id(mrk_low), id(abt_low), id(acn_low), id(trow_low), id(cvs_low), id(amzn_low), id(brkb_low)};
                                  sensor::Sensor* dhs[] = {id(hrl_high), id(tsla_high), id(baba_high), id(pfe_high), id(intc_high), id(csco_high), id(googl_high), id(qcom_high), id(lmt_high), id(msft_high), id(bmy_high), id(gd_high), id(levi_high), id(nke_high), id(ntr_high), id(pypl_high), id(gis_high), id(kmb_high), id(nvo_high), id(orcl_high), id(adbe_high), id(unh_high), id(mdt_high), id(mrk_high), id(abt_high), id(acn_high), id(trow_high), id(cvs_high), id(amzn_high), id(brkb_high)};
                                  sensor::Sensor* wls[] = {id(hrl_52l), id(tsla_52l), id(baba_52l), id(pfe_52l), id(intc_52l), id(csco_52l), id(googl_52l), id(qcom_52l), id(lmt_52l), id(msft_52l), id(bmy_52l), id(gd_52l), id(levi_52l), id(nke_52l), id(ntr_52l), id(pypl_52l), id(gis_52l), id(kmb_52l), id(nvo_52l), id(orcl_52l), id(adbe_52l), id(unh_52l), id(mdt_52l), id(mrk_52l), id(abt_52l), id(acn_52l), id(trow_52l), id(cvs_52l), id(amzn_52l), id(brkb_52l)};
                                  sensor::Sensor* whs[] = {id(hrl_52h), id(tsla_52h), id(baba_52h), id(pfe_52h), id(intc_52h), id(csco_52h), id(googl_52h), id(qcom_52h), id(lmt_52h), id(msft_52h), id(bmy_52h), id(gd_52h), id(levi_52h), id(nke_52h), id(ntr_52h), id(pypl_52h), id(gis_52h), id(kmb_52h), id(nvo_52h), id(orcl_52h), id(adbe_52h), id(unh_52h), id(mdt_52h), id(mrk_52h), id(abt_52h), id(acn_52h), id(trow_52h), id(cvs_52h), id(amzn_52h), id(brkb_52h)};

                                  float p = vs[id(ticker_index)]->state;
                                  float dl = dls[id(ticker_index)]->state; float dh = dhs[id(ticker_index)]->state;
                                  float wl = wls[id(ticker_index)]->state; float wh = whs[id(ticker_index)]->state;

                                  if (!std::isnan(p) && !std::isnan(dl) && !std::isnan(dh) && (dh-dl)>0.001) { 
                                    float dpct=(p-dl)/(dh-dl); 
                                    if(dpct < 0.0) dpct = 0.0; if(dpct > 1.0) dpct = 1.0;
                                    int target_x = 20+(int)(dpct*194);
                                    lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, id(range_marker));
                                    lv_anim_set_time(&a, 600);
                                    lv_anim_set_values(&a, lv_obj_get_x(id(range_marker)), target_x);
                                    lv_anim_set_exec_cb(&a, [](void* var, int32_t v) { lv_obj_set_x((lv_obj_t*)var, v); });
                                    lv_anim_start(&a); 
                                  } else {
                                    lv_obj_set_x(id(range_marker), 20 + 97);
                                  }

                                  if (!std::isnan(p) && !std::isnan(wl) && !std::isnan(wh) && (wh-wl)>0.001) { 
                                    float wpct=(p-wl)/(wh-wl); 
                                    if(wpct < 0.0) wpct = 0.0; if(wpct > 1.0) wpct = 1.0;
                                    int target_x = 20+(int)(wpct*194);
                                    lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, id(det_52w_marker));
                                    lv_anim_set_time(&a, 600);
                                    lv_anim_set_values(&a, lv_obj_get_x(id(det_52w_marker)), target_x);
                                    lv_anim_set_exec_cb(&a, [](void* var, int32_t v) { lv_obj_set_x((lv_obj_t*)var, v); });
                                    lv_anim_start(&a);
                                  } else {
                                    lv_obj_set_x(id(det_52w_marker), 20 + 97);
                                  }

                                  std::string f_state = id(active_filter).state;
                                  uint32_t color = 0x555555;
                                  bool blink = false;
                                  if (f_state.find("Positivo") != std::string::npos) { color = 0x00FF00; blink = true; }
                                  else if (f_state.find("Negativo") != std::string::npos) { color = 0xFF0000; blink = true; }
                                  else if (f_state.find("Cerca Minimos") != std::string::npos) { color = 0xFF6666; blink = false; }
                                  else if (f_state.find("En Minimos") != std::string::npos) { color = 0xFF0000; blink = false; }
                                  else if (f_state.find("Cerca Maximos") != std::string::npos) { color = 0x66FF66; blink = false; }
                                  else if (f_state.find("En Maximos") != std::string::npos) { color = 0x00FF00; blink = false; }
                                  else { color = 0x8A2BE2; blink = false; }
                                  
                                  lv_obj_set_style_bg_color(id(filter_dot_main), lv_color_hex(color), 0);
                                  lv_obj_set_style_transform_angle(id(filter_dot_main), 450, 0); /* 45 grados */
                                  
                                  lv_anim_del(id(filter_dot_main), nullptr);
                                  if (blink) {
                                      lv_anim_t a;
                                      lv_anim_init(&a);
                                      lv_anim_set_var(&a, id(filter_dot_main));
                                      lv_anim_set_values(&a, LV_OPA_TRANSP, LV_OPA_COVER);
                                      lv_anim_set_time(&a, 600);
                                      lv_anim_set_playback_time(&a, 600);
                                      lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
                                      lv_anim_set_exec_cb(&a, [](void * var, int32_t v) {
                                          lv_obj_set_style_bg_opa((lv_obj_t *)var, v, 0);
                                      });
                                      lv_anim_start(&a);
                                  } else {
                                      lv_obj_set_style_bg_opa(id(filter_dot_main), LV_OPA_COVER, 0);
                                  }

                              - delay: 5s
                              - lambda: 'id(ticker_index) = (id(ticker_index) + 1) % 30;'

# --- SENSORES IMPORTADOS DE HOME ASSISTANT ---
text_sensor:
  - platform: homeassistant
    id: active_filter
    entity_id: input_select.filtro_ticker_cyd
    on_value:
      then:
        - script.execute: ticker_loop

  - { platform: homeassistant, id: hrl_market, entity_id: sensor.yahoofinance_hrl, attribute: marketState }
  - { platform: homeassistant, id: hrl_divd, entity_id: sensor.yahoofinance_hrl, attribute: dividendDate }
  - { platform: homeassistant, id: hrl_curr, entity_id: sensor.yahoofinance_hrl, attribute: currencySymbol }
  - { platform: homeassistant, id: tsla_market, entity_id: sensor.yahoofinance_tsla, attribute: marketState }
  - { platform: homeassistant, id: tsla_divd, entity_id: sensor.yahoofinance_tsla, attribute: dividendDate }
  - { platform: homeassistant, id: tsla_curr, entity_id: sensor.yahoofinance_tsla, attribute: currencySymbol }
  - { platform: homeassistant, id: baba_market, entity_id: sensor.yahoofinance_baba, attribute: marketState }
  - { platform: homeassistant, id: baba_divd, entity_id: sensor.yahoofinance_baba, attribute: dividendDate }
  - { platform: homeassistant, id: baba_curr, entity_id: sensor.yahoofinance_baba, attribute: currencySymbol }
  - { platform: homeassistant, id: pfe_market, entity_id: sensor.yahoofinance_pfe, attribute: marketState }
  - { platform: homeassistant, id: pfe_divd, entity_id: sensor.yahoofinance_pfe, attribute: dividendDate }
  - { platform: homeassistant, id: pfe_curr, entity_id: sensor.yahoofinance_pfe, attribute: currencySymbol }
  - { platform: homeassistant, id: intc_market, entity_id: sensor.yahoofinance_intc, attribute: marketState }
  - { platform: homeassistant, id: intc_divd, entity_id: sensor.yahoofinance_intc, attribute: dividendDate }
  - { platform: homeassistant, id: intc_curr, entity_id: sensor.yahoofinance_intc, attribute: currencySymbol }
  - { platform: homeassistant, id: csco_market, entity_id: sensor.yahoofinance_csco, attribute: marketState }
  - { platform: homeassistant, id: csco_divd, entity_id: sensor.yahoofinance_csco, attribute: dividendDate }
  - { platform: homeassistant, id: csco_curr, entity_id: sensor.yahoofinance_csco, attribute: currencySymbol }
  - { platform: homeassistant, id: googl_market, entity_id: sensor.yahoofinance_googl, attribute: marketState }
  - { platform: homeassistant, id: googl_divd, entity_id: sensor.yahoofinance_googl, attribute: dividendDate }
  - { platform: homeassistant, id: googl_curr, entity_id: sensor.yahoofinance_googl, attribute: currencySymbol }
  - { platform: homeassistant, id: qcom_market, entity_id: sensor.yahoofinance_qcom, attribute: marketState }
  - { platform: homeassistant, id: qcom_divd, entity_id: sensor.yahoofinance_qcom, attribute: dividendDate }
  - { platform: homeassistant, id: qcom_curr, entity_id: sensor.yahoofinance_qcom, attribute: currencySymbol }
  - { platform: homeassistant, id: lmt_market, entity_id: sensor.yahoofinance_lmt, attribute: marketState }
  - { platform: homeassistant, id: lmt_divd, entity_id: sensor.yahoofinance_lmt, attribute: dividendDate }
  - { platform: homeassistant, id: lmt_curr, entity_id: sensor.yahoofinance_lmt, attribute: currencySymbol }
  - { platform: homeassistant, id: msft_market, entity_id: sensor.yahoofinance_msft, attribute: marketState }
  - { platform: homeassistant, id: msft_divd, entity_id: sensor.yahoofinance_msft, attribute: dividendDate }
  - { platform: homeassistant, id: msft_curr, entity_id: sensor.yahoofinance_msft, attribute: currencySymbol }
  - { platform: homeassistant, id: bmy_market, entity_id: sensor.yahoofinance_bmy, attribute: marketState }
  - { platform: homeassistant, id: bmy_divd, entity_id: sensor.yahoofinance_bmy, attribute: dividendDate }
  - { platform: homeassistant, id: bmy_curr, entity_id: sensor.yahoofinance_bmy, attribute: currencySymbol }
  - { platform: homeassistant, id: gd_market, entity_id: sensor.yahoofinance_gd, attribute: marketState }
  - { platform: homeassistant, id: gd_divd, entity_id: sensor.yahoofinance_gd, attribute: dividendDate }
  - { platform: homeassistant, id: gd_curr, entity_id: sensor.yahoofinance_gd, attribute: currencySymbol }
  - { platform: homeassistant, id: levi_market, entity_id: sensor.yahoofinance_levi, attribute: marketState }
  - { platform: homeassistant, id: levi_divd, entity_id: sensor.yahoofinance_levi, attribute: dividendDate }
  - { platform: homeassistant, id: levi_curr, entity_id: sensor.yahoofinance_levi, attribute: currencySymbol }
  - { platform: homeassistant, id: nke_market, entity_id: sensor.yahoofinance_nke, attribute: marketState }
  - { platform: homeassistant, id: nke_divd, entity_id: sensor.yahoofinance_nke, attribute: dividendDate }
  - { platform: homeassistant, id: nke_curr, entity_id: sensor.yahoofinance_nke, attribute: currencySymbol }
  - { platform: homeassistant, id: ntr_market, entity_id: sensor.yahoofinance_ntr, attribute: marketState }
  - { platform: homeassistant, id: ntr_divd, entity_id: sensor.yahoofinance_ntr, attribute: dividendDate }
  - { platform: homeassistant, id: ntr_curr, entity_id: sensor.yahoofinance_ntr, attribute: currencySymbol }
  - { platform: homeassistant, id: pypl_market, entity_id: sensor.yahoofinance_pypl, attribute: marketState }
  - { platform: homeassistant, id: pypl_divd, entity_id: sensor.yahoofinance_pypl, attribute: dividendDate }
  - { platform: homeassistant, id: pypl_curr, entity_id: sensor.yahoofinance_pypl, attribute: currencySymbol }
  - { platform: homeassistant, id: gis_market, entity_id: sensor.yahoofinance_gis, attribute: marketState }
  - { platform: homeassistant, id: gis_divd, entity_id: sensor.yahoofinance_gis, attribute: dividendDate }
  - { platform: homeassistant, id: gis_curr, entity_id: sensor.yahoofinance_gis, attribute: currencySymbol }
  - { platform: homeassistant, id: kmb_market, entity_id: sensor.yahoofinance_kmb, attribute: marketState }
  - { platform: homeassistant, id: kmb_divd, entity_id: sensor.yahoofinance_kmb, attribute: dividendDate }
  - { platform: homeassistant, id: kmb_curr, entity_id: sensor.yahoofinance_kmb, attribute: currencySymbol }
  - { platform: homeassistant, id: nvo_market, entity_id: sensor.yahoofinance_nvo, attribute: marketState }
  - { platform: homeassistant, id: nvo_divd, entity_id: sensor.yahoofinance_nvo, attribute: dividendDate }
  - { platform: homeassistant, id: nvo_curr, entity_id: sensor.yahoofinance_nvo, attribute: currencySymbol }
  - { platform: homeassistant, id: orcl_market, entity_id: sensor.yahoofinance_orcl, attribute: marketState }
  - { platform: homeassistant, id: orcl_divd, entity_id: sensor.yahoofinance_orcl, attribute: dividendDate }
  - { platform: homeassistant, id: orcl_curr, entity_id: sensor.yahoofinance_orcl, attribute: currencySymbol }
  - { platform: homeassistant, id: adbe_market, entity_id: sensor.yahoofinance_adbe, attribute: marketState }
  - { platform: homeassistant, id: adbe_divd, entity_id: sensor.yahoofinance_adbe, attribute: dividendDate }
  - { platform: homeassistant, id: adbe_curr, entity_id: sensor.yahoofinance_adbe, attribute: currencySymbol }
  - { platform: homeassistant, id: unh_market, entity_id: sensor.yahoofinance_unh, attribute: marketState }
  - { platform: homeassistant, id: unh_divd, entity_id: sensor.yahoofinance_unh, attribute: dividendDate }
  - { platform: homeassistant, id: unh_curr, entity_id: sensor.yahoofinance_unh, attribute: currencySymbol }
  - { platform: homeassistant, id: mdt_market, entity_id: sensor.yahoofinance_mdt, attribute: marketState }
  - { platform: homeassistant, id: mdt_divd, entity_id: sensor.yahoofinance_mdt, attribute: dividendDate }
  - { platform: homeassistant, id: mdt_curr, entity_id: sensor.yahoofinance_mdt, attribute: currencySymbol }
  - { platform: homeassistant, id: mrk_market, entity_id: sensor.yahoofinance_mrk, attribute: marketState }
  - { platform: homeassistant, id: mrk_divd, entity_id: sensor.yahoofinance_mrk, attribute: dividendDate }
  - { platform: homeassistant, id: mrk_curr, entity_id: sensor.yahoofinance_mrk, attribute: currencySymbol }
  - { platform: homeassistant, id: abt_market, entity_id: sensor.yahoofinance_abt, attribute: marketState }
  - { platform: homeassistant, id: abt_divd, entity_id: sensor.yahoofinance_abt, attribute: dividendDate }
  - { platform: homeassistant, id: abt_curr, entity_id: sensor.yahoofinance_abt, attribute: currencySymbol }
  - { platform: homeassistant, id: acn_market, entity_id: sensor.yahoofinance_acn, attribute: marketState }
  - { platform: homeassistant, id: acn_divd, entity_id: sensor.yahoofinance_acn, attribute: dividendDate }
  - { platform: homeassistant, id: acn_curr, entity_id: sensor.yahoofinance_acn, attribute: currencySymbol }
  - { platform: homeassistant, id: trow_market, entity_id: sensor.yahoofinance_trow, attribute: marketState }
  - { platform: homeassistant, id: trow_divd, entity_id: sensor.yahoofinance_trow, attribute: dividendDate }
  - { platform: homeassistant, id: trow_curr, entity_id: sensor.yahoofinance_trow, attribute: currencySymbol }
  - { platform: homeassistant, id: cvs_market, entity_id: sensor.yahoofinance_cvs, attribute: marketState }
  - { platform: homeassistant, id: cvs_divd, entity_id: sensor.yahoofinance_cvs, attribute: dividendDate }
  - { platform: homeassistant, id: cvs_curr, entity_id: sensor.yahoofinance_cvs, attribute: currencySymbol }
  - { platform: homeassistant, id: amzn_market, entity_id: sensor.yahoofinance_amzn, attribute: marketState }
  - { platform: homeassistant, id: amzn_divd, entity_id: sensor.yahoofinance_amzn, attribute: dividendDate }
  - { platform: homeassistant, id: amzn_curr, entity_id: sensor.yahoofinance_amzn, attribute: currencySymbol }
  - { platform: homeassistant, id: brkb_market, entity_id: sensor.yahoofinance_brk_b, attribute: marketState }
  - { platform: homeassistant, id: brkb_divd, entity_id: sensor.yahoofinance_brk_b, attribute: dividendDate }
  - { platform: homeassistant, id: brkb_curr, entity_id: sensor.yahoofinance_brk_b, attribute: currencySymbol }

sensor:
  - { platform: homeassistant, id: hrl_val, entity_id: sensor.yahoofinance_hrl }
  - { platform: homeassistant, id: hrl_pct, entity_id: sensor.yahoofinance_hrl, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: hrl_chg, entity_id: sensor.yahoofinance_hrl, attribute: regularMarketChange }
  - { platform: homeassistant, id: hrl_high, entity_id: sensor.yahoofinance_hrl, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: hrl_low, entity_id: sensor.yahoofinance_hrl, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: hrl_pe, entity_id: sensor.yahoofinance_hrl, attribute: trailingPE }
  - { platform: homeassistant, id: hrl_fpe, entity_id: sensor.yahoofinance_hrl, attribute: forwardPE }
  - { platform: homeassistant, id: hrl_divy, entity_id: sensor.yahoofinance_hrl, attribute: dividendYield }
  - { platform: homeassistant, id: hrl_divr, entity_id: sensor.yahoofinance_hrl, attribute: dividendRate }
  - { platform: homeassistant, id: hrl_52h, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: hrl_52l, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: hrl_52lc, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: hrl_52lcp, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: hrl_52hc, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: hrl_52hcp, entity_id: sensor.yahoofinance_hrl, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: tsla_val, entity_id: sensor.yahoofinance_tsla }
  - { platform: homeassistant, id: tsla_pct, entity_id: sensor.yahoofinance_tsla, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: tsla_chg, entity_id: sensor.yahoofinance_tsla, attribute: regularMarketChange }
  - { platform: homeassistant, id: tsla_high, entity_id: sensor.yahoofinance_tsla, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: tsla_low, entity_id: sensor.yahoofinance_tsla, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: tsla_pe, entity_id: sensor.yahoofinance_tsla, attribute: trailingPE }
  - { platform: homeassistant, id: tsla_fpe, entity_id: sensor.yahoofinance_tsla, attribute: forwardPE }
  - { platform: homeassistant, id: tsla_divy, entity_id: sensor.yahoofinance_tsla, attribute: dividendYield }
  - { platform: homeassistant, id: tsla_divr, entity_id: sensor.yahoofinance_tsla, attribute: dividendRate }
  - { platform: homeassistant, id: tsla_52h, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: tsla_52l, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: tsla_52lc, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: tsla_52lcp, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: tsla_52hc, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: tsla_52hcp, entity_id: sensor.yahoofinance_tsla, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: baba_val, entity_id: sensor.yahoofinance_baba }
  - { platform: homeassistant, id: baba_pct, entity_id: sensor.yahoofinance_baba, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: baba_chg, entity_id: sensor.yahoofinance_baba, attribute: regularMarketChange }
  - { platform: homeassistant, id: baba_high, entity_id: sensor.yahoofinance_baba, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: baba_low, entity_id: sensor.yahoofinance_baba, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: baba_pe, entity_id: sensor.yahoofinance_baba, attribute: trailingPE }
  - { platform: homeassistant, id: baba_fpe, entity_id: sensor.yahoofinance_baba, attribute: forwardPE }
  - { platform: homeassistant, id: baba_divy, entity_id: sensor.yahoofinance_baba, attribute: dividendYield }
  - { platform: homeassistant, id: baba_divr, entity_id: sensor.yahoofinance_baba, attribute: dividendRate }
  - { platform: homeassistant, id: baba_52h, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: baba_52l, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: baba_52lc, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: baba_52lcp, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: baba_52hc, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: baba_52hcp, entity_id: sensor.yahoofinance_baba, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: pfe_val, entity_id: sensor.yahoofinance_pfe }
  - { platform: homeassistant, id: pfe_pct, entity_id: sensor.yahoofinance_pfe, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: pfe_chg, entity_id: sensor.yahoofinance_pfe, attribute: regularMarketChange }
  - { platform: homeassistant, id: pfe_high, entity_id: sensor.yahoofinance_pfe, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: pfe_low, entity_id: sensor.yahoofinance_pfe, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: pfe_pe, entity_id: sensor.yahoofinance_pfe, attribute: trailingPE }
  - { platform: homeassistant, id: pfe_fpe, entity_id: sensor.yahoofinance_pfe, attribute: forwardPE }
  - { platform: homeassistant, id: pfe_divy, entity_id: sensor.yahoofinance_pfe, attribute: dividendYield }
  - { platform: homeassistant, id: pfe_divr, entity_id: sensor.yahoofinance_pfe, attribute: dividendRate }
  - { platform: homeassistant, id: pfe_52h, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: pfe_52l, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: pfe_52lc, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: pfe_52lcp, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: pfe_52hc, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: pfe_52hcp, entity_id: sensor.yahoofinance_pfe, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: intc_val, entity_id: sensor.yahoofinance_intc }
  - { platform: homeassistant, id: intc_pct, entity_id: sensor.yahoofinance_intc, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: intc_chg, entity_id: sensor.yahoofinance_intc, attribute: regularMarketChange }
  - { platform: homeassistant, id: intc_high, entity_id: sensor.yahoofinance_intc, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: intc_low, entity_id: sensor.yahoofinance_intc, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: intc_pe, entity_id: sensor.yahoofinance_intc, attribute: trailingPE }
  - { platform: homeassistant, id: intc_fpe, entity_id: sensor.yahoofinance_intc, attribute: forwardPE }
  - { platform: homeassistant, id: intc_divy, entity_id: sensor.yahoofinance_intc, attribute: dividendYield }
  - { platform: homeassistant, id: intc_divr, entity_id: sensor.yahoofinance_intc, attribute: dividendRate }
  - { platform: homeassistant, id: intc_52h, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: intc_52l, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: intc_52lc, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: intc_52lcp, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: intc_52hc, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: intc_52hcp, entity_id: sensor.yahoofinance_intc, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: csco_val, entity_id: sensor.yahoofinance_csco }
  - { platform: homeassistant, id: csco_pct, entity_id: sensor.yahoofinance_csco, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: csco_chg, entity_id: sensor.yahoofinance_csco, attribute: regularMarketChange }
  - { platform: homeassistant, id: csco_high, entity_id: sensor.yahoofinance_csco, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: csco_low, entity_id: sensor.yahoofinance_csco, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: csco_pe, entity_id: sensor.yahoofinance_csco, attribute: trailingPE }
  - { platform: homeassistant, id: csco_fpe, entity_id: sensor.yahoofinance_csco, attribute: forwardPE }
  - { platform: homeassistant, id: csco_divy, entity_id: sensor.yahoofinance_csco, attribute: dividendYield }
  - { platform: homeassistant, id: csco_divr, entity_id: sensor.yahoofinance_csco, attribute: dividendRate }
  - { platform: homeassistant, id: csco_52h, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: csco_52l, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: csco_52lc, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: csco_52lcp, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: csco_52hc, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: csco_52hcp, entity_id: sensor.yahoofinance_csco, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: googl_val, entity_id: sensor.yahoofinance_googl }
  - { platform: homeassistant, id: googl_pct, entity_id: sensor.yahoofinance_googl, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: googl_chg, entity_id: sensor.yahoofinance_googl, attribute: regularMarketChange }
  - { platform: homeassistant, id: googl_high, entity_id: sensor.yahoofinance_googl, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: googl_low, entity_id: sensor.yahoofinance_googl, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: googl_pe, entity_id: sensor.yahoofinance_googl, attribute: trailingPE }
  - { platform: homeassistant, id: googl_fpe, entity_id: sensor.yahoofinance_googl, attribute: forwardPE }
  - { platform: homeassistant, id: googl_divy, entity_id: sensor.yahoofinance_googl, attribute: dividendYield }
  - { platform: homeassistant, id: googl_divr, entity_id: sensor.yahoofinance_googl, attribute: dividendRate }
  - { platform: homeassistant, id: googl_52h, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: googl_52l, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: googl_52lc, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: googl_52lcp, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: googl_52hc, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: googl_52hcp, entity_id: sensor.yahoofinance_googl, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: qcom_val, entity_id: sensor.yahoofinance_qcom }
  - { platform: homeassistant, id: qcom_pct, entity_id: sensor.yahoofinance_qcom, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: qcom_chg, entity_id: sensor.yahoofinance_qcom, attribute: regularMarketChange }
  - { platform: homeassistant, id: qcom_high, entity_id: sensor.yahoofinance_qcom, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: qcom_low, entity_id: sensor.yahoofinance_qcom, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: qcom_pe, entity_id: sensor.yahoofinance_qcom, attribute: trailingPE }
  - { platform: homeassistant, id: qcom_fpe, entity_id: sensor.yahoofinance_qcom, attribute: forwardPE }
  - { platform: homeassistant, id: qcom_divy, entity_id: sensor.yahoofinance_qcom, attribute: dividendYield }
  - { platform: homeassistant, id: qcom_divr, entity_id: sensor.yahoofinance_qcom, attribute: dividendRate }
  - { platform: homeassistant, id: qcom_52h, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: qcom_52l, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: qcom_52lc, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: qcom_52lcp, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: qcom_52hc, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: qcom_52hcp, entity_id: sensor.yahoofinance_qcom, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: lmt_val, entity_id: sensor.yahoofinance_lmt }
  - { platform: homeassistant, id: lmt_pct, entity_id: sensor.yahoofinance_lmt, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: lmt_chg, entity_id: sensor.yahoofinance_lmt, attribute: regularMarketChange }
  - { platform: homeassistant, id: lmt_high, entity_id: sensor.yahoofinance_lmt, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: lmt_low, entity_id: sensor.yahoofinance_lmt, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: lmt_pe, entity_id: sensor.yahoofinance_lmt, attribute: trailingPE }
  - { platform: homeassistant, id: lmt_fpe, entity_id: sensor.yahoofinance_lmt, attribute: forwardPE }
  - { platform: homeassistant, id: lmt_divy, entity_id: sensor.yahoofinance_lmt, attribute: dividendYield }
  - { platform: homeassistant, id: lmt_divr, entity_id: sensor.yahoofinance_lmt, attribute: dividendRate }
  - { platform: homeassistant, id: lmt_52h, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: lmt_52l, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: lmt_52lc, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: lmt_52lcp, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: lmt_52hc, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: lmt_52hcp, entity_id: sensor.yahoofinance_lmt, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: msft_val, entity_id: sensor.yahoofinance_msft }
  - { platform: homeassistant, id: msft_pct, entity_id: sensor.yahoofinance_msft, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: msft_chg, entity_id: sensor.yahoofinance_msft, attribute: regularMarketChange }
  - { platform: homeassistant, id: msft_high, entity_id: sensor.yahoofinance_msft, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: msft_low, entity_id: sensor.yahoofinance_msft, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: msft_pe, entity_id: sensor.yahoofinance_msft, attribute: trailingPE }
  - { platform: homeassistant, id: msft_fpe, entity_id: sensor.yahoofinance_msft, attribute: forwardPE }
  - { platform: homeassistant, id: msft_divy, entity_id: sensor.yahoofinance_msft, attribute: dividendYield }
  - { platform: homeassistant, id: msft_divr, entity_id: sensor.yahoofinance_msft, attribute: dividendRate }
  - { platform: homeassistant, id: msft_52h, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: msft_52l, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: msft_52lc, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: msft_52lcp, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: msft_52hc, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: msft_52hcp, entity_id: sensor.yahoofinance_msft, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: bmy_val, entity_id: sensor.yahoofinance_bmy }
  - { platform: homeassistant, id: bmy_pct, entity_id: sensor.yahoofinance_bmy, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: bmy_chg, entity_id: sensor.yahoofinance_bmy, attribute: regularMarketChange }
  - { platform: homeassistant, id: bmy_high, entity_id: sensor.yahoofinance_bmy, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: bmy_low, entity_id: sensor.yahoofinance_bmy, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: bmy_pe, entity_id: sensor.yahoofinance_bmy, attribute: trailingPE }
  - { platform: homeassistant, id: bmy_fpe, entity_id: sensor.yahoofinance_bmy, attribute: forwardPE }
  - { platform: homeassistant, id: bmy_divy, entity_id: sensor.yahoofinance_bmy, attribute: dividendYield }
  - { platform: homeassistant, id: bmy_divr, entity_id: sensor.yahoofinance_bmy, attribute: dividendRate }
  - { platform: homeassistant, id: bmy_52h, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: bmy_52l, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: bmy_52lc, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: bmy_52lcp, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: bmy_52hc, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: bmy_52hcp, entity_id: sensor.yahoofinance_bmy, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: gd_val, entity_id: sensor.yahoofinance_gd }
  - { platform: homeassistant, id: gd_pct, entity_id: sensor.yahoofinance_gd, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: gd_chg, entity_id: sensor.yahoofinance_gd, attribute: regularMarketChange }
  - { platform: homeassistant, id: gd_high, entity_id: sensor.yahoofinance_gd, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: gd_low, entity_id: sensor.yahoofinance_gd, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: gd_pe, entity_id: sensor.yahoofinance_gd, attribute: trailingPE }
  - { platform: homeassistant, id: gd_fpe, entity_id: sensor.yahoofinance_gd, attribute: forwardPE }
  - { platform: homeassistant, id: gd_divy, entity_id: sensor.yahoofinance_gd, attribute: dividendYield }
  - { platform: homeassistant, id: gd_divr, entity_id: sensor.yahoofinance_gd, attribute: dividendRate }
  - { platform: homeassistant, id: gd_52h, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: gd_52l, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: gd_52lc, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: gd_52lcp, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: gd_52hc, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: gd_52hcp, entity_id: sensor.yahoofinance_gd, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: levi_val, entity_id: sensor.yahoofinance_levi }
  - { platform: homeassistant, id: levi_pct, entity_id: sensor.yahoofinance_levi, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: levi_chg, entity_id: sensor.yahoofinance_levi, attribute: regularMarketChange }
  - { platform: homeassistant, id: levi_high, entity_id: sensor.yahoofinance_levi, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: levi_low, entity_id: sensor.yahoofinance_levi, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: levi_pe, entity_id: sensor.yahoofinance_levi, attribute: trailingPE }
  - { platform: homeassistant, id: levi_fpe, entity_id: sensor.yahoofinance_levi, attribute: forwardPE }
  - { platform: homeassistant, id: levi_divy, entity_id: sensor.yahoofinance_levi, attribute: dividendYield }
  - { platform: homeassistant, id: levi_divr, entity_id: sensor.yahoofinance_levi, attribute: dividendRate }
  - { platform: homeassistant, id: levi_52h, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: levi_52l, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: levi_52lc, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: levi_52lcp, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: levi_52hc, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: levi_52hcp, entity_id: sensor.yahoofinance_levi, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: nke_val, entity_id: sensor.yahoofinance_nke }
  - { platform: homeassistant, id: nke_pct, entity_id: sensor.yahoofinance_nke, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: nke_chg, entity_id: sensor.yahoofinance_nke, attribute: regularMarketChange }
  - { platform: homeassistant, id: nke_high, entity_id: sensor.yahoofinance_nke, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: nke_low, entity_id: sensor.yahoofinance_nke, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: nke_pe, entity_id: sensor.yahoofinance_nke, attribute: trailingPE }
  - { platform: homeassistant, id: nke_fpe, entity_id: sensor.yahoofinance_nke, attribute: forwardPE }
  - { platform: homeassistant, id: nke_divy, entity_id: sensor.yahoofinance_nke, attribute: dividendYield }
  - { platform: homeassistant, id: nke_divr, entity_id: sensor.yahoofinance_nke, attribute: dividendRate }
  - { platform: homeassistant, id: nke_52h, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: nke_52l, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: nke_52lc, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: nke_52lcp, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: nke_52hc, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: nke_52hcp, entity_id: sensor.yahoofinance_nke, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: ntr_val, entity_id: sensor.yahoofinance_ntr }
  - { platform: homeassistant, id: ntr_pct, entity_id: sensor.yahoofinance_ntr, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: ntr_chg, entity_id: sensor.yahoofinance_ntr, attribute: regularMarketChange }
  - { platform: homeassistant, id: ntr_high, entity_id: sensor.yahoofinance_ntr, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: ntr_low, entity_id: sensor.yahoofinance_ntr, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: ntr_pe, entity_id: sensor.yahoofinance_ntr, attribute: trailingPE }
  - { platform: homeassistant, id: ntr_fpe, entity_id: sensor.yahoofinance_ntr, attribute: forwardPE }
  - { platform: homeassistant, id: ntr_divy, entity_id: sensor.yahoofinance_ntr, attribute: dividendYield }
  - { platform: homeassistant, id: ntr_divr, entity_id: sensor.yahoofinance_ntr, attribute: dividendRate }
  - { platform: homeassistant, id: ntr_52h, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: ntr_52l, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: ntr_52lc, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: ntr_52lcp, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: ntr_52hc, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: ntr_52hcp, entity_id: sensor.yahoofinance_ntr, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: pypl_val, entity_id: sensor.yahoofinance_pypl }
  - { platform: homeassistant, id: pypl_pct, entity_id: sensor.yahoofinance_pypl, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: pypl_chg, entity_id: sensor.yahoofinance_pypl, attribute: regularMarketChange }
  - { platform: homeassistant, id: pypl_high, entity_id: sensor.yahoofinance_pypl, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: pypl_low, entity_id: sensor.yahoofinance_pypl, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: pypl_pe, entity_id: sensor.yahoofinance_pypl, attribute: trailingPE }
  - { platform: homeassistant, id: pypl_fpe, entity_id: sensor.yahoofinance_pypl, attribute: forwardPE }
  - { platform: homeassistant, id: pypl_divy, entity_id: sensor.yahoofinance_pypl, attribute: dividendYield }
  - { platform: homeassistant, id: pypl_divr, entity_id: sensor.yahoofinance_pypl, attribute: dividendRate }
  - { platform: homeassistant, id: pypl_52h, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: pypl_52l, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: pypl_52lc, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: pypl_52lcp, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: pypl_52hc, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: pypl_52hcp, entity_id: sensor.yahoofinance_pypl, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: gis_val, entity_id: sensor.yahoofinance_gis }
  - { platform: homeassistant, id: gis_pct, entity_id: sensor.yahoofinance_gis, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: gis_chg, entity_id: sensor.yahoofinance_gis, attribute: regularMarketChange }
  - { platform: homeassistant, id: gis_high, entity_id: sensor.yahoofinance_gis, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: gis_low, entity_id: sensor.yahoofinance_gis, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: gis_pe, entity_id: sensor.yahoofinance_gis, attribute: trailingPE }
  - { platform: homeassistant, id: gis_fpe, entity_id: sensor.yahoofinance_gis, attribute: forwardPE }
  - { platform: homeassistant, id: gis_divy, entity_id: sensor.yahoofinance_gis, attribute: dividendYield }
  - { platform: homeassistant, id: gis_divr, entity_id: sensor.yahoofinance_gis, attribute: dividendRate }
  - { platform: homeassistant, id: gis_52h, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: gis_52l, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: gis_52lc, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: gis_52lcp, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: gis_52hc, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: gis_52hcp, entity_id: sensor.yahoofinance_gis, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: kmb_val, entity_id: sensor.yahoofinance_kmb }
  - { platform: homeassistant, id: kmb_pct, entity_id: sensor.yahoofinance_kmb, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: kmb_chg, entity_id: sensor.yahoofinance_kmb, attribute: regularMarketChange }
  - { platform: homeassistant, id: kmb_high, entity_id: sensor.yahoofinance_kmb, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: kmb_low, entity_id: sensor.yahoofinance_kmb, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: kmb_pe, entity_id: sensor.yahoofinance_kmb, attribute: trailingPE }
  - { platform: homeassistant, id: kmb_fpe, entity_id: sensor.yahoofinance_kmb, attribute: forwardPE }
  - { platform: homeassistant, id: kmb_divy, entity_id: sensor.yahoofinance_kmb, attribute: dividendYield }
  - { platform: homeassistant, id: kmb_divr, entity_id: sensor.yahoofinance_kmb, attribute: dividendRate }
  - { platform: homeassistant, id: kmb_52h, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: kmb_52l, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: kmb_52lc, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: kmb_52lcp, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: kmb_52hc, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: kmb_52hcp, entity_id: sensor.yahoofinance_kmb, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: nvo_val, entity_id: sensor.yahoofinance_nvo }
  - { platform: homeassistant, id: nvo_pct, entity_id: sensor.yahoofinance_nvo, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: nvo_chg, entity_id: sensor.yahoofinance_nvo, attribute: regularMarketChange }
  - { platform: homeassistant, id: nvo_high, entity_id: sensor.yahoofinance_nvo, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: nvo_low, entity_id: sensor.yahoofinance_nvo, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: nvo_pe, entity_id: sensor.yahoofinance_nvo, attribute: trailingPE }
  - { platform: homeassistant, id: nvo_fpe, entity_id: sensor.yahoofinance_nvo, attribute: forwardPE }
  - { platform: homeassistant, id: nvo_divy, entity_id: sensor.yahoofinance_nvo, attribute: dividendYield }
  - { platform: homeassistant, id: nvo_divr, entity_id: sensor.yahoofinance_nvo, attribute: dividendRate }
  - { platform: homeassistant, id: nvo_52h, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: nvo_52l, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: nvo_52lc, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: nvo_52lcp, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: nvo_52hc, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: nvo_52hcp, entity_id: sensor.yahoofinance_nvo, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: orcl_val, entity_id: sensor.yahoofinance_orcl }
  - { platform: homeassistant, id: orcl_pct, entity_id: sensor.yahoofinance_orcl, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: orcl_chg, entity_id: sensor.yahoofinance_orcl, attribute: regularMarketChange }
  - { platform: homeassistant, id: orcl_high, entity_id: sensor.yahoofinance_orcl, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: orcl_low, entity_id: sensor.yahoofinance_orcl, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: orcl_pe, entity_id: sensor.yahoofinance_orcl, attribute: trailingPE }
  - { platform: homeassistant, id: orcl_fpe, entity_id: sensor.yahoofinance_orcl, attribute: forwardPE }
  - { platform: homeassistant, id: orcl_divy, entity_id: sensor.yahoofinance_orcl, attribute: dividendYield }
  - { platform: homeassistant, id: orcl_divr, entity_id: sensor.yahoofinance_orcl, attribute: dividendRate }
  - { platform: homeassistant, id: orcl_52h, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: orcl_52l, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: orcl_52lc, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: orcl_52lcp, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: orcl_52hc, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: orcl_52hcp, entity_id: sensor.yahoofinance_orcl, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: adbe_val, entity_id: sensor.yahoofinance_adbe }
  - { platform: homeassistant, id: adbe_pct, entity_id: sensor.yahoofinance_adbe, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: adbe_chg, entity_id: sensor.yahoofinance_adbe, attribute: regularMarketChange }
  - { platform: homeassistant, id: adbe_high, entity_id: sensor.yahoofinance_adbe, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: adbe_low, entity_id: sensor.yahoofinance_adbe, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: adbe_pe, entity_id: sensor.yahoofinance_adbe, attribute: trailingPE }
  - { platform: homeassistant, id: adbe_fpe, entity_id: sensor.yahoofinance_adbe, attribute: forwardPE }
  - { platform: homeassistant, id: adbe_divy, entity_id: sensor.yahoofinance_adbe, attribute: dividendYield }
  - { platform: homeassistant, id: adbe_divr, entity_id: sensor.yahoofinance_adbe, attribute: dividendRate }
  - { platform: homeassistant, id: adbe_52h, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: adbe_52l, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: adbe_52lc, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: adbe_52lcp, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: adbe_52hc, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: adbe_52hcp, entity_id: sensor.yahoofinance_adbe, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: unh_val, entity_id: sensor.yahoofinance_unh }
  - { platform: homeassistant, id: unh_pct, entity_id: sensor.yahoofinance_unh, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: unh_chg, entity_id: sensor.yahoofinance_unh, attribute: regularMarketChange }
  - { platform: homeassistant, id: unh_high, entity_id: sensor.yahoofinance_unh, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: unh_low, entity_id: sensor.yahoofinance_unh, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: unh_pe, entity_id: sensor.yahoofinance_unh, attribute: trailingPE }
  - { platform: homeassistant, id: unh_fpe, entity_id: sensor.yahoofinance_unh, attribute: forwardPE }
  - { platform: homeassistant, id: unh_divy, entity_id: sensor.yahoofinance_unh, attribute: dividendYield }
  - { platform: homeassistant, id: unh_divr, entity_id: sensor.yahoofinance_unh, attribute: dividendRate }
  - { platform: homeassistant, id: unh_52h, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: unh_52l, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: unh_52lc, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: unh_52lcp, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: unh_52hc, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: unh_52hcp, entity_id: sensor.yahoofinance_unh, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: mdt_val, entity_id: sensor.yahoofinance_mdt }
  - { platform: homeassistant, id: mdt_pct, entity_id: sensor.yahoofinance_mdt, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: mdt_chg, entity_id: sensor.yahoofinance_mdt, attribute: regularMarketChange }
  - { platform: homeassistant, id: mdt_high, entity_id: sensor.yahoofinance_mdt, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: mdt_low, entity_id: sensor.yahoofinance_mdt, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: mdt_pe, entity_id: sensor.yahoofinance_mdt, attribute: trailingPE }
  - { platform: homeassistant, id: mdt_fpe, entity_id: sensor.yahoofinance_mdt, attribute: forwardPE }
  - { platform: homeassistant, id: mdt_divy, entity_id: sensor.yahoofinance_mdt, attribute: dividendYield }
  - { platform: homeassistant, id: mdt_divr, entity_id: sensor.yahoofinance_mdt, attribute: dividendRate }
  - { platform: homeassistant, id: mdt_52h, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: mdt_52l, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: mdt_52lc, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: mdt_52lcp, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: mdt_52hc, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: mdt_52hcp, entity_id: sensor.yahoofinance_mdt, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: mrk_val, entity_id: sensor.yahoofinance_mrk }
  - { platform: homeassistant, id: mrk_pct, entity_id: sensor.yahoofinance_mrk, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: mrk_chg, entity_id: sensor.yahoofinance_mrk, attribute: regularMarketChange }
  - { platform: homeassistant, id: mrk_high, entity_id: sensor.yahoofinance_mrk, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: mrk_low, entity_id: sensor.yahoofinance_mrk, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: mrk_pe, entity_id: sensor.yahoofinance_mrk, attribute: trailingPE }
  - { platform: homeassistant, id: mrk_fpe, entity_id: sensor.yahoofinance_mrk, attribute: forwardPE }
  - { platform: homeassistant, id: mrk_divy, entity_id: sensor.yahoofinance_mrk, attribute: dividendYield }
  - { platform: homeassistant, id: mrk_divr, entity_id: sensor.yahoofinance_mrk, attribute: dividendRate }
  - { platform: homeassistant, id: mrk_52h, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: mrk_52l, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: mrk_52lc, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: mrk_52lcp, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: mrk_52hc, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: mrk_52hcp, entity_id: sensor.yahoofinance_mrk, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: abt_val, entity_id: sensor.yahoofinance_abt }
  - { platform: homeassistant, id: abt_pct, entity_id: sensor.yahoofinance_abt, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: abt_chg, entity_id: sensor.yahoofinance_abt, attribute: regularMarketChange }
  - { platform: homeassistant, id: abt_high, entity_id: sensor.yahoofinance_abt, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: abt_low, entity_id: sensor.yahoofinance_abt, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: abt_pe, entity_id: sensor.yahoofinance_abt, attribute: trailingPE }
  - { platform: homeassistant, id: abt_fpe, entity_id: sensor.yahoofinance_abt, attribute: forwardPE }
  - { platform: homeassistant, id: abt_divy, entity_id: sensor.yahoofinance_abt, attribute: dividendYield }
  - { platform: homeassistant, id: abt_divr, entity_id: sensor.yahoofinance_abt, attribute: dividendRate }
  - { platform: homeassistant, id: abt_52h, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: abt_52l, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: abt_52lc, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: abt_52lcp, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: abt_52hc, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: abt_52hcp, entity_id: sensor.yahoofinance_abt, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: acn_val, entity_id: sensor.yahoofinance_acn }
  - { platform: homeassistant, id: acn_pct, entity_id: sensor.yahoofinance_acn, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: acn_chg, entity_id: sensor.yahoofinance_acn, attribute: regularMarketChange }
  - { platform: homeassistant, id: acn_high, entity_id: sensor.yahoofinance_acn, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: acn_low, entity_id: sensor.yahoofinance_acn, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: acn_pe, entity_id: sensor.yahoofinance_acn, attribute: trailingPE }
  - { platform: homeassistant, id: acn_fpe, entity_id: sensor.yahoofinance_acn, attribute: forwardPE }
  - { platform: homeassistant, id: acn_divy, entity_id: sensor.yahoofinance_acn, attribute: dividendYield }
  - { platform: homeassistant, id: acn_divr, entity_id: sensor.yahoofinance_acn, attribute: dividendRate }
  - { platform: homeassistant, id: acn_52h, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: acn_52l, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: acn_52lc, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: acn_52lcp, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: acn_52hc, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: acn_52hcp, entity_id: sensor.yahoofinance_acn, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: trow_val, entity_id: sensor.yahoofinance_trow }
  - { platform: homeassistant, id: trow_pct, entity_id: sensor.yahoofinance_trow, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: trow_chg, entity_id: sensor.yahoofinance_trow, attribute: regularMarketChange }
  - { platform: homeassistant, id: trow_high, entity_id: sensor.yahoofinance_trow, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: trow_low, entity_id: sensor.yahoofinance_trow, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: trow_pe, entity_id: sensor.yahoofinance_trow, attribute: trailingPE }
  - { platform: homeassistant, id: trow_fpe, entity_id: sensor.yahoofinance_trow, attribute: forwardPE }
  - { platform: homeassistant, id: trow_divy, entity_id: sensor.yahoofinance_trow, attribute: dividendYield }
  - { platform: homeassistant, id: trow_divr, entity_id: sensor.yahoofinance_trow, attribute: dividendRate }
  - { platform: homeassistant, id: trow_52h, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: trow_52l, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: trow_52lc, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: trow_52lcp, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: trow_52hc, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: trow_52hcp, entity_id: sensor.yahoofinance_trow, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: cvs_val, entity_id: sensor.yahoofinance_cvs }
  - { platform: homeassistant, id: cvs_pct, entity_id: sensor.yahoofinance_cvs, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: cvs_chg, entity_id: sensor.yahoofinance_cvs, attribute: regularMarketChange }
  - { platform: homeassistant, id: cvs_high, entity_id: sensor.yahoofinance_cvs, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: cvs_low, entity_id: sensor.yahoofinance_cvs, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: cvs_pe, entity_id: sensor.yahoofinance_cvs, attribute: trailingPE }
  - { platform: homeassistant, id: cvs_fpe, entity_id: sensor.yahoofinance_cvs, attribute: forwardPE }
  - { platform: homeassistant, id: cvs_divy, entity_id: sensor.yahoofinance_cvs, attribute: dividendYield }
  - { platform: homeassistant, id: cvs_divr, entity_id: sensor.yahoofinance_cvs, attribute: dividendRate }
  - { platform: homeassistant, id: cvs_52h, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: cvs_52l, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: cvs_52lc, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: cvs_52lcp, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: cvs_52hc, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: cvs_52hcp, entity_id: sensor.yahoofinance_cvs, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: amzn_val, entity_id: sensor.yahoofinance_amzn }
  - { platform: homeassistant, id: amzn_pct, entity_id: sensor.yahoofinance_amzn, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: amzn_chg, entity_id: sensor.yahoofinance_amzn, attribute: regularMarketChange }
  - { platform: homeassistant, id: amzn_high, entity_id: sensor.yahoofinance_amzn, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: amzn_low, entity_id: sensor.yahoofinance_amzn, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: amzn_pe, entity_id: sensor.yahoofinance_amzn, attribute: trailingPE }
  - { platform: homeassistant, id: amzn_fpe, entity_id: sensor.yahoofinance_amzn, attribute: forwardPE }
  - { platform: homeassistant, id: amzn_divy, entity_id: sensor.yahoofinance_amzn, attribute: dividendYield }
  - { platform: homeassistant, id: amzn_divr, entity_id: sensor.yahoofinance_amzn, attribute: dividendRate }
  - { platform: homeassistant, id: amzn_52h, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: amzn_52l, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: amzn_52lc, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: amzn_52lcp, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: amzn_52hc, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: amzn_52hcp, entity_id: sensor.yahoofinance_amzn, attribute: fiftyTwoWeekHighChangePercent }

  - { platform: homeassistant, id: brkb_val, entity_id: sensor.yahoofinance_brk_b }
  - { platform: homeassistant, id: brkb_pct, entity_id: sensor.yahoofinance_brk_b, attribute: regularMarketChangePercent }
  - { platform: homeassistant, id: brkb_chg, entity_id: sensor.yahoofinance_brk_b, attribute: regularMarketChange }
  - { platform: homeassistant, id: brkb_high, entity_id: sensor.yahoofinance_brk_b, attribute: regularMarketDayHigh }
  - { platform: homeassistant, id: brkb_low, entity_id: sensor.yahoofinance_brk_b, attribute: regularMarketDayLow }
  - { platform: homeassistant, id: brkb_pe, entity_id: sensor.yahoofinance_brk_b, attribute: trailingPE }
  - { platform: homeassistant, id: brkb_fpe, entity_id: sensor.yahoofinance_brk_b, attribute: forwardPE }
  - { platform: homeassistant, id: brkb_divy, entity_id: sensor.yahoofinance_brk_b, attribute: dividendYield }
  - { platform: homeassistant, id: brkb_divr, entity_id: sensor.yahoofinance_brk_b, attribute: dividendRate }
  - { platform: homeassistant, id: brkb_52h, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekHigh }
  - { platform: homeassistant, id: brkb_52l, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekLow }
  - { platform: homeassistant, id: brkb_52lc, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekLowChange }
  - { platform: homeassistant, id: brkb_52lcp, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekLowChangePercent }
  - { platform: homeassistant, id: brkb_52hc, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekHighChange }
  - { platform: homeassistant, id: brkb_52hcp, entity_id: sensor.yahoofinance_brk_b, attribute: fiftyTwoWeekHighChangePercent }

# --- RETROILUMINACIÓN CONTROLABLE POR PWM ---
output:
  - platform: ledc
    pin: GPIO21
    id: backlight_pwm
light:
  - platform: monochromatic
    output: backlight_pwm
    name: "Display Backlight"
    id: backlight
    restore_mode: ALWAYS_ON

🔥 ¿Merece la pena montarlo?

Por 12-15€ y un par de tardes de trastear con YAML, tienes en la mesa un panel que te dice, sin abrir el móvil ni el ordenador, si tus 30 posiciones están en verde o en rojo, a qué PER cotizan y a qué distancia están de sus máximos o mínimos anuales. Para mí ese es justo el punto: quitar fricción entre "quiero mirar cómo va el mercado" y "tengo que desbloquear el teléfono, abrir la app, esperar a que cargue".

No es imprescindible. Nadie necesita esto para invertir bien. Pero si te gusta la domótica tanto como las finanzas, este es de los proyectos que más satisfacción dan por lo barato que sale.

Si te animas a montarlo, cuéntame en los comentarios cómo te ha ido o qué le cambiarías.


⚠️ Aviso legal Este artículo tiene una finalidad exclusivamente informativa y divulgativa, basada en mi experiencia personal. No constituye asesoramiento financiero, recomendación de inversión ni oferta de ningún producto financiero. No soy asesor financiero registrado. La inversión en mercados financieros conlleva riesgos significativos, incluida la posible pérdida total del capital invertido. Los resultados pasados no garantizan rendimientos futuros. El código y las instrucciones de montaje se ofrecen "tal cual", sin garantía de funcionamiento en tu configuración concreta; trabajar con electrónica conlleva sus propios riesgos. Consulta siempre los documentos oficiales de cada herramienta mencionada y, si lo necesitas, busca el asesoramiento de un profesional cualificado antes de tomar cualquier decisión de inversión.

🔥 ¿Cómo tengo montada mi cartera ahora mismo?

Lo cuento en el boletín, sin filtros: qué tengo, cuánto, y por qué. Sin humo, sin afiliados ocultos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *