mathoudebine / turing-smart-screen-python

Unofficial Python system monitor and library for small IPS USB-C displays like Turing Smart Screen or XuanFang
GNU General Public License v3.0
1.05k stars 174 forks source link

Additional/Custom date/time Options #397

Open CaraesNaur opened 9 months ago

CaraesNaur commented 9 months ago

Is your feature request related to a problem? If so, please describe the problem.
Only two predefined date/time stats are available: DAY and HOUR.

Describe the feature / solution to your problem you'd like
The ability to define additional date/time stats entries.

Describe alternatives you've considered / and or tested
Could be implemented via custom stats, however native support would be appreciated.

Screenshots / photos & mockups of the Turing screen
In the simulator screenshot below, DAY is displaying "day month year" at the top left, HOUR is at the top right. This has been achieved by following the Babel date formatting according to this comment: https://github.com/mathoudebine/turing-smart-screen-python/issues/99#issuecomment-1825394507

Below DAY is shown the "current" weekday as static text: "Wednesday" (would be FORMAT: "EEEE").

image

(Note: I don't know Python, but was able to modify the simulator to use the current date. Everything else are the STATIC values.)

Environment:

Additional context
This would open a lot of theme formatting flexibility.

Based on the errors I've seen playing with the Babel date formatting, each custom DATE entry would probably need to declare whether it instantiates a datetime.time or datetime.date object internally, i.e

OBJECT: date # date (day/week/month/year, etc) / time (hour/minute/second, etc)

Thus, the DATE entry I faked in the screenshot above could be achieved via:

DATE:
  WKDAY:locale
    TEXT:
      OBJECT: date
      FORMAT: "EEEE"
      SHOW: True
      X: 40
      Y: 75
      FONT: simply-mono/SimplyMono-Bold.ttf
      FONT_SIZE: 32
      FONT_COLOR: 204, 0, 0
      BACKGROUND_IMAGE: background_grid_color.png
CaraesNaur commented 9 months ago

I managed to implement this via sensors_custom.py:

from datetime import datetime
import tzlocal

# Custom data class to display day of the week
class CustomDayOfWeek(CustomDataSource):
    def as_numeric(self) -> float:
        # If there is no numeric value, keep this function empty
        pass

    def as_string(self) -> str:
        # If a custom data class only has text values, it won't be possible to display graph or radial bars
        return datetime.now(tzlocal.get_localzone()).strftime('%A')