Using an Inky Display
Home Assistant General
I have wanted a display in the kitchen for a while, just to show the time remaining on the alexa timer, or when the bins need to go out.
When setting up a Pi zero for Room Assistant it seemed like a good idea to add a small screen, so I purchased an Inky Phat. I also got a 3d printed stand based on one from AdaFruit
After installing the standard software using the instructions here, I wrote a short script to set the screen contents when ever a json message was received on MQTT.
The timer value for the Alexa is the time the timer will go off, so to get a changing value for the number of minutes left I used a template sensor as shown below.
- platform: template
sensors:
kitchen_time_remaining:
friendly_name: Kitchen Timer Time Remaining
value_template: >
{%set v= states('sensor.kitchen_sonos_next_timer')%}
{% if v =='unavailable' %}
-1
{% else %}
{{((states('sensor.kitchen_sonos_next_timer')|as_timestamp -
utcnow()|as_timestamp)/60)|round}}
{% endif %}
Next I created an automation to create a json string to send down. This contains the number of minutes the next timer, or -1 for no timer, a message text from a input-text helper, and a quote from another helper, which changes every hour on another automation.
If the timer is running that is displayed, if not if there is a message that is displayed, if there are items on the shopping list (calendar) those are displayed.
alias: Kitchen Alarm and Messages
description: >-
Monitor for the Alexa Timer or for messages to be sent to the Inky Pi in the
Kitchen and send to it.
trigger:
- platform: state
entity_id: sensor.kitchen_time_remaining
- platform: state
entity_id: calendar.alexa_shopping_list
- platform: state
entity_id: input_text.kitchen_message
- platform: state
entity_id: input_text.current_quote
condition: []
action:
- service: mqtt.publish
data:
topic: rapiz2/message
payload_template: |
{ {%if states.calendar.alexa_shopping_list.attributes.all_tasks %}
"shopping":
{{states.calendar.alexa_shopping_list.attributes.all_tasks | tojson() }}, {% endif %}
"timer":
{{states.sensor.kitchen_time_remaining.state}},
"quote":
"{{states.input_text.current_quote.state}}" {%if states.input_text.kitchen_message.state != ''%},
"message": "{{states.input_text.kitchen_message.state}}" {% endif %}
}
mode: single
Script for Pi
I have removed the ip for my Pi and the user and password for the MTQQ but the rest is as used.
# mqtt callbacks
def on_connect(client, userdata, flags, rc):
if rc == 0:
logging.info("connected OK")
client.subscribe(topic)
logging.info("subscribed to " + topic )
else:
logging.warning("Bad connection Returned code=", rc)
def on_publish(client, userdata, mid):
print("mid: " + str(mid))
def on_message(client, userdata, message):
msg = str(message.payload.decode("utf-8"))
font_size = 18
payload = json.loads(msg)
output = 'Smile Nothing to do'
if 'quote' in payload:
output = (payload['quote'])
if 'message' in payload:
output = (payload['message'])
elif 'shopping' in payload:
output = 'Buy: '
for item in payload['shopping']:
output = output + item + ', '
if 'timer' in payload:
if payload['timer'] > -1:
if payload['timer'] > 1:
output = str(payload['timer']) + ' mins'
elif payload['timer'] == 1:
output = str(payload['timer']) + ' min'
else:
output = '<1 min'
font_size = 50
display_message(output,font_size)
logging.info("display =" + output)
# ---------------------------------------------- Main Logic
broker_address="xxxxxxxx"
topic = "rapiz2/message"
client = mqtt.Client("P2") #create new instance
client.username_pw_set("xxxx", "xxx")
client.on_connect = on_connect
client.on_publish = on_publish
client.on_message=on_message
client.connect(broker_address) #connect to broker
client.loop_forever()
The service config is very simple.
[Unit] Description=Inky MQTT Message Display After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/enviroplus-python/mtqq-message-inky.py WorkingDirectory=/home/pi/enviroplus-python StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target
