Home Assistant requests in a task, progress bar, Plex page, bitmap cache

- net/ha_api: the HTTP requests run in a FreeRTOS task on core 0; loop()
  only hands over copies through queues. The web UI's test button polls.
  No more 3-4 s loop() stalls once a minute; timeout raised to 5 s.
- Progress bar page element (page format 4, v3 pages are converted)
- Plex user setting (settings v6): {plex_user} in entity ids
- Plex page (examples): watchers, play/pause icon, title, progress
- Bitmaps cached in RAM: a LittleFS read took ~100 ms on every render
  and web preview; long JSON lists sent in 2 KB pieces
- Backup includes the refresh settings and the Plex user

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-10-16 16:17:23 +02:00
1 parent 090c2bf8ae
commit 490cefc360
42 files changed
+1074 -175

No files matched your search

+268 -31
View File
@@ -1,8 +1,8 @@
{
"format": "flipdot-backup",
"version": 1,
"firmware": "2.5.0",
"exported": "2026-10-15T00:00:00Z",
"firmware": "2.9.0",
"exported": "2026-10-16T00:00:00Z",
"bitmaps": [
{
"name": "weer sunny",
@@ -107,6 +107,22 @@
{
"name": "bg vol",
"data": "fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0fffffffffffffffffffff0"
},
{
"name": "plex logo",
"data": "0000000000000000000000f800000000000000000000f8000000000000000000007c000000000000000000007c000000000000000000003e000000000000000000003e000000000000000000001f000000000000000000001f000000000000000000000f800000000000000000001f000000000000000000001f000000000000000000003e000000000000000000003e000000000000000000007c000000000000000000007c00000000000000000000f800000000000000000000f8000000000000000000000000000000000000000000"
},
{
"name": "plex playing",
"data": "8000000000000000000000c000000000000000000000e000000000000000000000c000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
},
{
"name": "plex paused",
"data": "d800000000000000000000d800000000000000000000d800000000000000000000d800000000000000000000d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
},
{
"name": "plex buffering",
"data": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}
],
"pages": [
@@ -132,7 +148,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "image",
@@ -151,7 +171,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -170,7 +194,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -189,7 +217,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -225,7 +257,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "date",
@@ -244,7 +280,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -276,7 +316,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -295,7 +339,11 @@
"factor": 0.001,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "clock",
@@ -314,7 +362,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -346,7 +398,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -365,7 +421,11 @@
"factor": 0.016666666666666666,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -384,7 +444,11 @@
"factor": 1,
"scroll_width": 46,
"scroll_speed": 6,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -403,7 +467,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -435,7 +503,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "image",
@@ -454,7 +526,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -473,7 +549,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -492,7 +572,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -511,7 +595,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -543,7 +631,11 @@
"factor": 1000,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -562,7 +654,11 @@
"factor": 0.001,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "clock",
@@ -581,7 +677,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
@@ -600,7 +700,11 @@
"factor": 0.001,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -636,7 +740,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -668,7 +776,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "date",
@@ -687,7 +799,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "clock",
@@ -706,7 +822,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -738,7 +858,11 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "countdown",
@@ -757,7 +881,11 @@
"factor": 1,
"scroll_width": 70,
"scroll_speed": 8,
"target": "2026-12-25T00:00"
"target": "2026-12-25T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
@@ -784,7 +912,116 @@
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00"
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}
},
{
"name": "Plex",
"page": {
"slots": [
{
"start": "00:00",
"bitmap": "plex logo"
}
],
"elements": [
{
"type": "ha",
"x": 13,
"y": 0,
"align": "left",
"overlay": "top",
"font": "Normal",
"format": 0,
"language": "nl",
"decimals": -1,
"text": "",
"suffix": " watching",
"entity": "sensor.mangavalkserver",
"attribute": "",
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "image",
"x": 13,
"y": 9,
"align": "left",
"overlay": "top",
"font": "Normal",
"format": 0,
"language": "nl",
"decimals": -1,
"text": "plex ",
"suffix": "",
"entity": "sensor.{plex_user}_state",
"attribute": "",
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "ha",
"x": 19,
"y": 9,
"align": "left",
"overlay": "top",
"font": "Small",
"format": 0,
"language": "nl",
"decimals": -1,
"text": "",
"suffix": "",
"entity": "sensor.{plex_user}_full_title",
"attribute": "",
"factor": 1,
"scroll_width": 65,
"scroll_speed": 8,
"target": "2000-01-01T00:00",
"bar_width": 40,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
},
{
"type": "bar",
"x": 13,
"y": 16,
"align": "left",
"overlay": "top",
"font": "Normal",
"format": 0,
"language": "nl",
"decimals": -1,
"text": "",
"suffix": "",
"entity": "sensor.{plex_user}_progress",
"attribute": "",
"factor": 1,
"scroll_width": 0,
"scroll_speed": 8,
"target": "2000-01-01T00:00",
"bar_width": 71,
"bar_height": 3,
"bar_max": 100,
"bar_frame": true
}
]
}