I’ve done this using a NodeMCU and an LED strip. I’ve extended the concept with a PIR for motion detection and an IR blaster to control a nearby A/V receiver.
When the PIR senses motion, the strip updates with a colour depending on the weather from DarkSky. It also has a night-light mode, and a blinking red mode so it looks like a security sensor when there is no one home.
- alias: Weather light
trigger:
- platform: state
entity_id: binary_sensor.bookcase_pir
to: 'on'
action:
- service: mqtt.publish
data:
topic: "bookcase/strip/set"
qos: 1
retain: true
payload_template: >-
{%- if is_state("sensor.dark_sky_icon", "snow") -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 255, 'g': 255, 'b': 150}, 'brightness': 255}
{%- elif is_state("sensor.dark_sky_icon", "sleet") -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 192, 'g': 192, 'b': 255}, 'brightness': 255}
{%- elif is_state("sensor.dark_sky_icon", "rain") -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 64, 'g': 64, 'b': 255}, 'brightness': 255}
{%- elif is_state("sensor.dark_sky_icon", "fog") -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 128, 'g': 255, 'b': 64}, 'brightness': 255}
{%- elif is_state("sensor.dark_sky_icon", "clear-day") or is_state("sensor.dark_sky_icon", "clear-night") -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 255, 'g': 150, 'b': 16}, 'brightness': 255}
{%- else -%}
{'state': 'ON', 'effect': 'glitter', 'color': {'r': 255, 'g': 0, 'b': 255}, 'brightness': 255}
{%- endif -%}
The only usability issue is that if you make the patterns too complicated people will have a hard time remembering their meanings.