Oui il faut apprendre un minimum l’anglais mister @VieuxZebre plutôt que d’interpréter en n’importe quoi
Sinon un exemple perso d’utilisation des polices dans ESPHome (le sketch de mon écran Inkplate), les fameux fichiers de polices ont été mis dans le dossier config/esphome/fonts soit via le gestionnaire de fichier de hassio ou le partage samba si tu as activé l’extension dans hassio !
substitutions:
friendly_name: inkplate display
partial_update: 10s
full_update: "360"
esphome:
name: inkplate
platform: ESP32
board: esp-wrover-kit
wifi:
networks:
- ssid: !secret wifi
password: !secret wifi_passwd
#deep_sleep:
# run_duration: 120s
# sleep_duration: 10min
logger:
api:
switch:
- platform: restart
name: "Inkplate Reboot"
id: reboot
- platform: gpio
id: battery_read_mosfet
pin:
mcp23xxx: mcp23017_hub
number: 9
inverted: true
- platform: template
name: "Inkplate Partial Updating"
lambda: return id(inkplate_display).get_partial_updating();
turn_on_action:
- lambda: id(inkplate_display).set_partial_updating(true);
turn_off_action:
- lambda: id(inkplate_display).set_partial_updating(false);
text_sensor:
- platform: wifi_info
ip_address:
name: $friendly_name IP Address
# - platform: homeassistant
# id: garage_1
# name: Garage 1
# entity_id: cover.garage_1_door
# - platform: homeassistant
# id: garage_2
# name: Garage 2
# entity_id: cover.garage_2_door
- platform: homeassistant
id: current_weather
entity_id: weather.lausanne
- platform: homeassistant
id: current_weather_bayonne
entity_id: weather.bayonne
- platform: homeassistant
id: current_weather_espezel
entity_id: weather.espezel
- platform: homeassistant
id: current_weather_rabat
entity_id: weather.rabat
- platform: homeassistant
entity_id: sensor.ligne_1_depart
id: ligne_1_depart
internal: true
- platform: homeassistant
entity_id: sensor.ligne_1_depart_depart
id: ligne_1_depart_depart
internal: true
- platform: homeassistant
entity_id: sensor.ligne_1_depart_depart_depart
id: ligne_1_depart_depart_depart
internal: true
- platform: homeassistant
entity_id: sensor.ligne_21_depart
id: ligne_21_depart
internal: true
- platform: homeassistant
entity_id: sensor.ligne_21_depart_depart
id: ligne_21_depart_depart
internal: true
- platform: homeassistant
entity_id: sensor.ligne_21_depart_depart_depart
id: ligne_21_depart_depart_depart
internal: true
sensor:
- platform: adc
id: battery_voltage
update_interval: never
attenuation: 11db
pin: 35
- platform: template
name: "Inkplate Battery Voltage"
lambda: |-
id(battery_read_mosfet).turn_on();
delay(1);
float adc = id(battery_voltage).sample();
id(battery_read_mosfet).turn_off();
return adc;
filters:
- multiply: 2
- platform: wifi_signal
name: $friendly_name WiFi Strength
update_interval: 60s
- platform: uptime
name: $friendly_name "Uptime"
- platform: homeassistant
id: temp_lausanne
name: "Lausanne"
entity_id: sensor.temp_ext_lausanne
internal: true
- platform: homeassistant
id: temp_int_lausanne
name: "Lausanne Int."
entity_id: sensor.temperature_2
internal: true
- platform: homeassistant
id: temp_bayonne
name: "Bayonne"
entity_id: sensor.temp_ext_bayonne
internal: true
- platform: homeassistant
id: hum_bayonne
name: "Bayonne"
entity_id: sensor.hum_ext_bayonne
internal: true
- platform: homeassistant
id: temp_espezel
name: "Espezel"
entity_id: sensor.temp_ext_espezel
internal: true
- platform: homeassistant
id: hum_espezel
name: "Espezel"
entity_id: sensor.hum_ext_espezel
internal: true
- platform: homeassistant
id: temp_rabat
name: "Rabat"
entity_id: sensor.temp_ext_rabat
internal: true
- platform: homeassistant
id: hum_rabat
name: "Rabat"
entity_id: sensor.hum_ext_rabat
internal: true
- platform: homeassistant
id: hum_lausanne
name: "Humidité"
entity_id: sensor.hum_2
- platform: homeassistant
id: co2_lausanne
name: "Humidité"
entity_id: sensor.co2_value
internal: true
- platform: homeassistant
entity_id: sensor.plex_lausanne
id: plex_users
internal: true
- platform: homeassistant
entity_id: binary_sensor.internet
id: internet
internal: true
- platform: homeassistant
entity_id: binary_sensor.remote_ui
id: remote_ui
internal: true
- platform: homeassistant
entity_id: binary_sensor.rpi_power_status
id: rpi_power_status
internal: true
- platform: homeassistant
entity_id: binary_sensor.pro_3_ipv4
id: pro_3
internal: true
- platform: homeassistant
entity_id: binary_sensor.ns1_ams_ipv4
id: ns1
internal: true
- platform: homeassistant
entity_id: binary_sensor.ns4_waw_ipv4
id: ns4
internal: true
- platform: homeassistant
entity_id: sensor.hp_laserjet_200_colormfp_m276nw_cyan_cartridge_hp_cf211a
id: printer_cyan
internal: true
- platform: homeassistant
entity_id: sensor.hp_laserjet_200_colormfp_m276nw_magenta_cartridge_hp_cf213a
id: printer_magenta
internal: true
- platform: homeassistant
entity_id: sensor.hp_laserjet_200_colormfp_m276nw_yellow_cartridge_hp_cf212a
id: printer_yellow
internal: true
- platform: homeassistant
entity_id: sensor.hp_laserjet_200_colormfp_m276nw_black_cartridge_hp_cb540a
id: printer_black
internal: true
i2c:
mcp23017:
- id: mcp23017_hub
address: 0x20
binary_sensor:
- platform: status
name: "Inkplate Status"
id: system_status
- platform: gpio
name: "Inkplate Touch Pad 1"
pin:
mcp23xxx: mcp23017_hub
number: 10
- platform: gpio
name: "Inkplate Touch Pad 2"
pin:
mcp23xxx: mcp23017_hub
number: 11
- platform: gpio
name: "Inkplate Touch Pad 3"
pin:
mcp23xxx: mcp23017_hub
number: 12
time:
- platform: sntp
id: esptime
timezone: Europe/Zurich
font:
- file: "fonts/BebasNeue-Regular.ttf"
id: helvetica_96
size: 96
glyphs: '!"%()+,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/'
- file: "fonts/BebasNeue-Regular.ttf"
id: helvetica_85
size: 85
glyphs: '!"%()+,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/'
- file: "fonts/BebasNeue-Regular.ttf"
id: helvetica_48
size: 48
glyphs: '!"%()+,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/'
- file: "fonts/BebasNeue-Regular.ttf"
id: helvetica_36
size: 36
glyphs: '!"%()+,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/'
- file: "fonts/BebasNeue-Regular.ttf"
id: helvetica_25
size: 25
glyphs: '!"%()+,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/'
image:
- file: "images/0-default.png"
id: wpng_0
type: BINARY
- file: "images/1-clear-night.png"
id: wpng_1
type: BINARY
- file: "images/2-cloudy.png"
id: wpng_2
type: BINARY
- file: "images/3-fog.png"
id: wpng_3
type: BINARY
- file: "images/4-hail.png"
id: wpng_4
type: BINARY
- file: "images/5-lightning.png"
id: wpng_5
type: BINARY
- file: "images/6-lightning-rainy.png"
id: wpng_6
type: BINARY
- file: "images/7-partlycloudy.png"
id: wpng_7
type: BINARY
- file: "images/8-pouring.png"
id: wpng_8
type: BINARY
- file: "images/9-rainy.png"
id: wpng_9
type: BINARY
- file: "images/10-snowy.png"
id: wpng_10
type: BINARY
- file: "images/11-snowy-rainy.png"
id: wpng_11
type: BINARY
- file: "images/12-sunny.png"
id: wpng_12
type: BINARY
- file: "images/13-windy.png"
id: wpng_13
type: BINARY
- file: "images/14-windy-variant.png"
id: wpng_14
type: BINARY
- file: "images/15-exceptional.png"
id: wpng_15
type: BINARY
display:
- platform: inkplate6
id: inkplate_display
greyscale: false
partial_updating: true
update_interval: $partial_update
full_update_every: $full_update # When partial updating is enabled, forces a full screen update after chosen number of updates
ckv_pin: 32
sph_pin: 33
gmod_pin:
mcp23xxx: mcp23017_hub
number: 1
gpio0_enable_pin:
mcp23xxx: mcp23017_hub
number: 8
oe_pin:
mcp23xxx: mcp23017_hub
number: 0
spv_pin:
mcp23xxx: mcp23017_hub
number: 2
powerup_pin:
mcp23xxx: mcp23017_hub
number: 4
wakeup_pin:
mcp23xxx: mcp23017_hub
number: 3
vcom_pin:
mcp23xxx: mcp23017_hub
number: 5
pages:
- id: page1
lambda: |-
it.fill(COLOR_ON);
// Icones meteo Lausanne
if (id(current_weather).state == "clear-night")
{
it.image(25, 25, id(wpng_1));
}
else if (id(current_weather).state == "cloudy")
{
it.image(25, 25, id(wpng_2));
}
else if (id(current_weather).state == "fog")
{
it.image(25, 25, id(wpng_3));
}
else if (id(current_weather).state == "hail")
{
it.image(25, 25, id(wpng_4));
}
else if (id(current_weather).state == "lightning")
{
it.image(25, 25, id(wpng_5));
}
else if (id(current_weather).state == "lightning-rainy")
{
it.image(25, 25, id(wpng_6));
}
else if (id(current_weather).state == "partlycloudy")
{
it.image(25, 25, id(wpng_7));
}
else if (id(current_weather).state == "pouring")
{
it.image(25, 25, id(wpng_8));
}
else if (id(current_weather).state == "rainy")
{
it.image(25, 25, id(wpng_9));
}
else if (id(current_weather).state == "snowy")
{
it.image(25, 25, id(wpng_10));
}
else if (id(current_weather).state == "snowy-rainy'")
{
it.image(25, 25, id(wpng_11));
}
else if (id(current_weather).state == "sunny")
{
it.image(25, 25, id(wpng_12));
}
else if (id(current_weather).state == "windy")
{
it.image(25, 25, id(wpng_13));
}
else if (id(current_weather).state == "windy-variant")
{
it.image(25, 25, id(wpng_14));
}
else if (id(current_weather).state == "exceptional")
{
it.image(25, 25, id(wpng_15));
}
else
{
it.image(25, 25, id(wpng_0));
}
// icones Meteo Bayonne
if (id(current_weather_bayonne).state == "clear-night")
{
it.image(175, 25, id(wpng_1));
}
else if (id(current_weather_bayonne).state == "cloudy")
{
it.image(175, 25, id(wpng_2));
}
else if (id(current_weather_bayonne).state == "fog")
{
it.image(175, 25, id(wpng_3));
}
else if (id(current_weather_bayonne).state == "hail")
{
it.image(175, 25, id(wpng_4));
}
else if (id(current_weather_bayonne).state == "lightning")
{
it.image(175, 25, id(wpng_5));
}
else if (id(current_weather_bayonne).state == "lightning-rainy")
{
it.image(175, 25, id(wpng_6));
}
else if (id(current_weather_bayonne).state == "partlycloudy")
{
it.image(175, 25, id(wpng_7));
}
else if (id(current_weather_bayonne).state == "pouring")
{
it.image(175, 25, id(wpng_8));
}
else if (id(current_weather_bayonne).state == "rainy")
{
it.image(175, 25, id(wpng_9));
}
else if (id(current_weather_bayonne).state == "snowy")
{
it.image(175, 25, id(wpng_10));
}
else if (id(current_weather_bayonne).state == "snowy-rainy'")
{
it.image(175, 25, id(wpng_11));
}
else if (id(current_weather_bayonne).state == "sunny")
{
it.image(175, 25, id(wpng_12));
}
else if (id(current_weather_bayonne).state == "windy")
{
it.image(175, 25, id(wpng_13));
}
else if (id(current_weather_bayonne).state == "windy-variant")
{
it.image(175, 25, id(wpng_14));
}
else if (id(current_weather_bayonne).state == "exceptional")
{
it.image(175, 25, id(wpng_15));
}
else
{
it.image(175, 25, id(wpng_0));
}
// icones Meteo Espezel
if (id(current_weather_espezel).state == "clear-night")
{
it.image(325, 25, id(wpng_1));
}
else if (id(current_weather_espezel).state == "cloudy")
{
it.image(325, 25, id(wpng_2));
}
else if (id(current_weather_espezel).state == "fog")
{
it.image(325, 25, id(wpng_3));
}
else if (id(current_weather_espezel).state == "hail")
{
it.image(325, 25, id(wpng_4));
}
else if (id(current_weather_espezel).state == "lightning")
{
it.image(325, 25, id(wpng_5));
}
else if (id(current_weather_espezel).state == "lightning-rainy")
{
it.image(325, 25, id(wpng_6));
}
else if (id(current_weather_espezel).state == "partlycloudy")
{
it.image(325, 25, id(wpng_7));
}
else if (id(current_weather_espezel).state == "pouring")
{
it.image(325, 25, id(wpng_8));
}
else if (id(current_weather_espezel).state == "rainy")
{
it.image(325, 25, id(wpng_9));
}
else if (id(current_weather_espezel).state == "snowy")
{
it.image(325, 25, id(wpng_10));
}
else if (id(current_weather_espezel).state == "snowy-rainy'")
{
it.image(325, 25, id(wpng_11));
}
else if (id(current_weather_espezel).state == "sunny")
{
it.image(325, 25, id(wpng_12));
}
else if (id(current_weather_espezel).state == "windy")
{
it.image(325, 25, id(wpng_13));
}
else if (id(current_weather_espezel).state == "windy-variant")
{
it.image(325, 25, id(wpng_14));
}
else if (id(current_weather_espezel).state == "exceptional")
{
it.image(325, 25, id(wpng_15));
}
else
{
it.image(325, 25, id(wpng_0));
}
// icones Meteo Rabat
if (id(current_weather_rabat).state == "clear-night")
{
it.image(475, 25, id(wpng_1));
}
else if (id(current_weather_rabat).state == "cloudy")
{
it.image(475, 25, id(wpng_2));
}
else if (id(current_weather_rabat).state == "fog")
{
it.image(475, 25, id(wpng_3));
}
else if (id(current_weather_rabat).state == "hail")
{
it.image(475, 25, id(wpng_4));
}
else if (id(current_weather_rabat).state == "lightning")
{
it.image(475, 25, id(wpng_5));
}
else if (id(current_weather_rabat).state == "lightning-rainy")
{
it.image(475, 25, id(wpng_6));
}
else if (id(current_weather_rabat).state == "partlycloudy")
{
it.image(475, 25, id(wpng_7));
}
else if (id(current_weather_rabat).state == "pouring")
{
it.image(475, 25, id(wpng_8));
}
else if (id(current_weather_rabat).state == "rainy")
{
it.image(475, 25, id(wpng_9));
}
else if (id(current_weather_rabat).state == "snowy")
{
it.image(475, 25, id(wpng_10));
}
else if (id(current_weather_rabat).state == "snowy-rainy'")
{
it.image(475, 25, id(wpng_11));
}
else if (id(current_weather_rabat).state == "sunny")
{
it.image(475, 25, id(wpng_12));
}
else if (id(current_weather_rabat).state == "windy")
{
it.image(475, 25, id(wpng_13));
}
else if (id(current_weather_rabat).state == "windy-variant")
{
it.image(475, 25, id(wpng_14));
}
else if (id(current_weather_rabat).state == "exceptional")
{
it.image(475, 25, id(wpng_15));
}
else
{
it.image(475, 25, id(wpng_0));
}
// Time
// Weekday
it.strftime(620, 25, id(helvetica_48), COLOR_OFF, TextAlign::TOP_LEFT, "%A", id(esptime).now());
it.strftime(620, 100, id(helvetica_48), COLOR_OFF, TextAlign::TOP_LEFT, "%d/%m/%y", id(esptime).now());
it.strftime(620, 150, id(helvetica_96), COLOR_OFF, TextAlign::TOP_LEFT, "%H:%M", id(esptime).now());
// Temperature
if (id(temp_lausanne).has_state()) {
it.print(25, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Lau. ");
it.printf(65, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.1f°C", id(temp_lausanne).state);
}
if (id(hum_lausanne).has_state()) {
it.print(25, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Hum. ");
it.printf(65, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0f%%", id(hum_lausanne).state);
}
if (id(temp_int_lausanne).has_state()) {
it.print(25, 225, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Int. ");
it.printf(65, 225, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0f°C", id(temp_int_lausanne).state);
}
if (id(co2_lausanne).has_state()) {
it.print(25, 255, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Co2. ");
it.printf(65, 255, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0fppm", id(co2_lausanne).state);
}
if (id(temp_bayonne).has_state()) {
it.print(175, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Bay. ");
it.printf(215, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.1f°C", id(temp_bayonne).state);
}
if (id(hum_bayonne).has_state()) {
it.print(175, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Hum. ");
it.printf(215, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0f%%", id(hum_bayonne).state);
}
if (id(temp_espezel).has_state()) {
it.print(325, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Esp. ");
it.printf(365, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.1f°C", id(temp_espezel).state);
}
if (id(hum_espezel).has_state()) {
it.print(325, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Hum. ");
it.printf(365, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0f%%", id(hum_espezel).state);
}
if (id(temp_rabat).has_state()) {
it.print(475, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Rab. ");
it.printf(515, 165, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.1f°C", id(temp_rabat).state);
}
if (id(hum_rabat).has_state()) {
it.print(475, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Hum. ");
it.printf(515, 195, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%.0f%%", id(hum_rabat).state);
}
// Line x=10, y=180 to x=590, y=180
it.line(10, 290, 790, 290, COLOR_OFF);
it.print(25, 310, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Bus 6");
it.printf(25, 350, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_1_depart).state.c_str());
it.printf(25, 380, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_1_depart_depart).state.c_str());
it.printf(25, 410, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_1_depart_depart_depart).state.c_str());
it.print(120, 310, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "M2)");
it.printf(120, 350, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_21_depart).state.c_str());
it.printf(120, 380, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_21_depart_depart).state.c_str());
it.printf(120, 410, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "%s", id(ligne_21_depart_depart_depart).state.c_str());
// Status
it.print(25, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "PLEX");
it.printf(30, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT , "%.0f", id(plex_users).state);
it.print(75, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "NET");
if (id(internet).state == true) {
it.print(75, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
} else {
it.print(75, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "DN");
}
it.print(125, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "REM.");
if (id(remote_ui).state == true) {
it.print(125, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
} else {
it.print(125, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "DN");
}
it.print(175, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "POW.");
if (id(rpi_power_status).state == false) {
it.print(175, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Dn");
} else {
it.print(175, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
}
it.print(225, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Pro3");
if (id(pro_3).state == false) {
it.print(225, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Dn");
} else {
it.print(225, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
}
it.print(275, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Ns1");
if (id(ns1).state == false) {
it.print(275, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Dn");
} else {
it.print(275, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
}
it.print(325, 500, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT, "Ns4");
if (id(ns4).state == false) {
it.print(325, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Dn");
} else {
it.print(325, 540, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "OK");
}
// Printer
it.print(620, 310, id(helvetica_36), COLOR_OFF, TextAlign::TOP_LEFT, "Printer");
it.printf(640, 350, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT , "Cyan: %.0f%%", id(printer_cyan).state);
it.printf(640, 380, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT , "Mag.: %.0f%%", id(printer_magenta).state);
it.printf(640, 410, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT , "Yel.: %.0f%%", id(printer_yellow).state);
it.printf(640, 440, id(helvetica_25), COLOR_OFF, TextAlign::TOP_LEFT , "Blk.: %.0f%%", id(printer_black).state);