⚠️ 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:
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:
- 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.
- 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.
- 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.
- 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érico | Función | Pin 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:
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:
- Ve a Ajustes > Dispositivos y servicios > Ayudantes.
- Pulsa + Crear ayudante > Desplegable (Dropdown / Input Select).
- 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 accionesEn Positivo HoyEn Negativo HoyCerca Minimos 52w (+25%)Cerca Maximos 52w (-25%)En Minimos 52w (+10%)En Maximos 52w (-10%)
- Icono:
mdi:filter-menu
- Nombre:
Si prefieres crearlo por YAML en tu configuration.yaml:
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:
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.
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:
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:
- 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. - 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
logosdentro 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
RGB565para renderizado ultra rápido en memoria RAM.
- Debes crear una subcarpeta llamada
💡 ¿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.
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.

