Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Statistics.koplugin: Calendar day with custom start time #10254

Merged
merged 10 commits into from
Apr 1, 2023

Conversation

weijiuqiao
Copy link
Contributor

@weijiuqiao weijiuqiao commented Mar 27, 2023

Closes #10250.

Made two commits, one is on the calendar day view and the other the calendar weeks view. The latter is quite ugly because in the sql commands, the offset is inserted in multiple places.

I tried another way with the sqls though, something like:select *** from (select start_time - offset as start_time, *** from page_stat) as page_stat *** so the start_time is first modified then compared but somehow it doesn't work.

Still, I find it too confusing to just leave it if the two views are out of sync. Maybe there's a better way to do the sqls?


This change is Reviewable

@weijiuqiao weijiuqiao requested a review from poire-z March 27, 2023 16:02
@poire-z
Copy link
Contributor

poire-z commented Mar 27, 2023

That was fast :)
Tried it. The day view is really nice, and just what #10250 requested.

Still, I find it too confusing to just leave it if the two views are out of sync.

I wouldn't find that confusing.
I do find what I got confusing because of your second commit :) I'd rather leave the monthly view as it-is, true to what it shows (a day really start at 0h00). Having March 26 starts at 4h00, and seeing March 25 and March 27 squares, is odd and really not natural when appreciating the black bars.
I don't think they need to be synced at all: when you tap on a day, you don't need to see the black bars in sync, nobody will really be able to twist 90° their representation of what they remember in the month view to what they get in the daily view :) I just want to see some other kind of details for that day, and there, I'm on a single day, so I have no other visual part to anchor it to in my mind. A day would start at 04:00, and your first commit shows that really well. Then, swipe left/right to see previous/next days, all starting at 04:00, and everything feels consistent.

I would drop the 2nd commit and forget about complexifying that. (And if you don't, I want a setting to disable "day start at" in monthly view, because I may then end up sticking with day start at 00:00 just to avoid my monthly view to be messed up :)

I also don't think we would really need minutes (ie 4h30 - anybody would be fine with 04:00 or 05:00 I guess), but as you wish.

Pinging @jonnyl2 for more thoughts.

@poire-z
Copy link
Contributor

poire-z commented Mar 27, 2023

Btw, a little odd thing I just noticed today is the ordering of the books at the top of the day timeline view: it is stable but felt random, I couldn't pinpoint the logic looking at a few days, only by looking at the code and confirming when looking at a lot more days.
They seem sorted by:
T(N_("%1 (1 page)", "%1 (%2 pages)", tonumber(result_book[2][i])), datetime.secondsToClockDuration(user_duration_format...
So:

8mn
5h43
5m12
4h21
3m

I would expect either by longer reading time, amount of pages read, or by first page read time this day.

@weijiuqiao
Copy link
Contributor Author

8mn
5h43
5m12
4h21
3m

Do I need to set some custom format to get these results? I tried English and French, they are all in the format of 02:42:30 (125 pages) and 00:46:59 (61 pages) so the ranking is by reading duration.

@poire-z
Copy link
Contributor

poire-z commented Mar 28, 2023

Do I need to set some custom format to get these results?

Oh right, I changed the duration format on my device some weeks ago, so I did not notice anything before.
It's changeable in Gear > Device > Time and date > Duration format > Modern/letters.
The code uses the formatted & translated result strings for sorting, I guess we need to add a plain integer value to what getBooksFromPeriod() returns so the sort() is done on that.

@weijiuqiao
Copy link
Contributor Author

Made a few changes:

  1. Sorting is fixed, with a plain integer value for duration.
  2. Minute step is set to 10, so that the vertical bars in daily view will still make sense.
  3. User can choose whether to apply the offset to calendar or not.
  4. Cleaner sql with time offset.

Copy link
Contributor

@poire-z poire-z left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hour shift in the month view feels really odd to me, and would not be needed.
But if you intuitively felt it is needed to have the shift synced, others may feel the same way, so ok, the SQL ended up not too ugly.

plugins/statistics.koplugin/main.lua Outdated Show resolved Hide resolved
Comment on lines 1050 to 1051
start_of_day_widget = DoubleSpinWidget:new{
left_text = C_("Time", "h"),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

May be it could look a bit more like the Device> Set time > widget?:
image

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

plugins/statistics.koplugin/main.lua Outdated Show resolved Hide resolved
Comment on lines +2798 to +2799
FROM (
SELECT start_time-? as start_time, duration, page_stat.id_book, book.title
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Wondered a few minutes over this substraction start_time-offset, but I think it's right.)
No noticable performance drop with this intermediate query ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The WHERE and JOIN clauses are inside the intermediate query so theoretically the heavy lifting should only happen once (just like before). But I'm no expert of the inner workings of SQL. So I'm not really sure how the subtraction in the SELECT clause as well as the separation of GROUP BY and ORDER from the WHERE clause will affect the overall performance.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe someone with better knowledge someday can drop in here, but no noticeable performance drop now :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The keyword is SQLite ftr, not SQL. ;-)

You can always run the query with EXPLAIN and see the impact.
Screenshot_20230329_182736

Also here's a link I once saved: http://www.visophyte.org/blog/2010/04/06/performance-annotated-sqlite-explaination-visualizations-using-systemtap/

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, I could have been more accurate, SQLite it is :)

I tried adding explain in front of the two commands with and without the modification, the results are only 2 and 3 more operations respectively. Does this count alone mean something or do I need to read into the details? @Frenzie (apologizing for not fully doing my research..)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know SQLite that well either, which is indirectly what I was trying to say. 😄

That being said, even if this query were super slow (which I doubt it is; it looks simple enough and what you said about explain seems to confirm that indeed it is) it probably still wouldn't really be noticeable.

There are some scenarios along these lines involving joins where SQLite might make something seemingly simple (for the likes of Postgres/MariaDB) into something much more complex and slower.

Copy link
Contributor

@poire-z poire-z Mar 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reference, using sqlite> explain query plan SELECT...:

Before:

QUERY PLAN
|--SEARCH TABLE page_stat_data USING INDEX page_stat_data_start_time (start_time>? AND start_time<?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE numbers USING INTEGER PRIMARY KEY (rowid<?)
|--USE TEMP B-TREE FOR GROUP BY
`--USE TEMP B-TREE FOR ORDER BY

After (with starttime-0 harcoded - dunno how to use bind variables on the command line):

QUERY PLAN
|--SEARCH TABLE page_stat_data USING INDEX page_stat_data_start_time (start_time>? AND start_time<?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE numbers USING INTEGER PRIMARY KEY (rowid<?)
|--USE TEMP B-TREE FOR GROUP BY
`--USE TEMP B-TREE FOR ORDER BY

After (with startime-7200 harcoded):

QUERY PLAN
|--SEARCH TABLE page_stat_data USING INDEX page_stat_data_start_time (start_time>? AND start_time<?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE book USING INTEGER PRIMARY KEY (rowid=?)
|--SEARCH TABLE numbers USING INTEGER PRIMARY KEY (rowid<?)
|--USE TEMP B-TREE FOR GROUP BY
`--USE TEMP B-TREE FOR ORDER BY

So, they look all identical to me, so sqlite must optimize that (or do what it can with that :), and we can keep our readable version.

Also, I did not notice any slowdown when using it.

plugins/statistics.koplugin/main.lua Outdated Show resolved Hide resolved
@weijiuqiao
Copy link
Contributor Author

But if you intuitively felt it is needed to have the shift synced, others may feel the same way

I'm thinking if we put the settings inside the daily timeline view, like a button on the top left, it would be very clear that this only affects the timeline. Then there's no need to change the calendar. What do you think?

@poire-z
Copy link
Contributor

poire-z commented Mar 29, 2023

I'm thinking if we put the settings inside the daily timeline view, like a button on the top left

Like I did recently for Book map and Page browser I guess?
Well, all the statistics views already have their settings in a menu, so splitting some of them in a top left menu in the view feels a bit inconsistent (although the monthly view could benefit from having them here so we can see them applied live, but well, we lived without that).
Also, statistics views have their title text left aligned, so a top left icon doesn't feel welcome.

it would be very clear that this only affects the timeline. Then there's no need to change the calendar. What do you think?

So, you're ready to give up on monthly view day start shift ?! :) It was just because of the wording of the setting ? Then, you can just name it "Timeline day start at 04:00" with separators above and below :)

@weijiuqiao
Copy link
Contributor Author

So, you're ready to give up on monthly view day start shift ?! :)

If the wording's not within the timeline view, then I'd still want the calendar days' black bars synchronized with the timeline :) Because I don't want surprises when I tap on a day with black bars say at the beginning but find nothing when the timeline opens.

plugins/statistics.koplugin/main.lua Outdated Show resolved Hide resolved
plugins/statistics.koplugin/main.lua Outdated Show resolved Hide resolved
@poire-z
Copy link
Contributor

poire-z commented Mar 29, 2023

Tested on my Kobo, and there's something wrong: I didn't set any "day starts", so still the default of 00:00, untouched (no settings) , and I have many reading spans during the night (when I was sleeping :) (and blank afternoons) when I use swipe left/right , but not when going directly to a day from calendar view.

(I don't have very regular reading periods - and bad memory :) - so it's hard for me to tell if all is good and the same as before. Except by doing screenshots with/without the patch, which is tedious, but I guess I'll do that if you ack and can fix the above issue.)

@poire-z
Copy link
Contributor

poire-z commented Mar 29, 2023

Minor thought: should the horizontal line between 23:00 and 00:00 be thicker ? Or would that be distracting, and we can assume the users that starts his day at 04:00 won't care distinguishing reading before and after 00:00 ?

@weijiuqiao
Copy link
Contributor Author

but not when going directly to a day from calendar view.

I can't reproduce it. Can you show screenshots of the same day when entered directly and by swiping?

@poire-z
Copy link
Contributor

poire-z commented Mar 30, 2023

I also can reproduce that on the emulator, so these screenshots are from it:

image

(28 and 27 are after the DST change of 26, so probably nothing related to that.)
(In case it's needed: I'm UTC/GMT+2 for the 28 and 27, was GMT+1 the 25, switch happened the 26 where after 01:59, time becamse 03:00.)

28, 27 and 26 when entered directly with tap on the squares:

image

image

image

Then, tap on 28 then swipe to 27 > 26 > 27 > 28:

image

image

image

image

image

Tell me if you need me to add logger.warn(day_ts or something) here and there.

@weijiuqiao
Copy link
Contributor Author

There's a peculiar twelve hour shift backward when swiping. Possible cause:current_day_length in CalendarDayView:onNextPage() and previous_day_length in function CalendarDayView:onPrevPage() not correctly calculated.

Maybe you can log them to see if they are 86400?

@poire-z
Copy link
Contributor

poire-z commented Mar 30, 2023

tap on 28, swipe to 27:
03/30/23-10:03:09 WARN  AAA self.day_ts 1679954400 current_day_ts 1679954400 previous_day_ts 1679878800
03/30/23-10:03:09 WARN  BBB self.day_ts 1679954400 current_day_ts 1679954400 previous_day_length 43200
03/30/23-10:03:09 WARN  CCC fixed self.day_ts 1679911200

Swipe to 26
03/30/23-10:03:41 WARN  AAA self.day_ts 1679911200 current_day_ts 1679911200 previous_day_ts 1679835600
03/30/23-10:03:41 WARN  BBB self.day_ts 1679911200 current_day_ts 1679911200 previous_day_length 86400
03/30/23-10:03:41 WARN  CCC fixed self.day_ts 1679824800

Tap on 29, swipe to 28:
03/30/23-10:04:34 WARN  AAA self.day_ts 1680040800 current_day_ts 1680040800 previous_day_ts 1679965200
03/30/23-10:04:34 WARN  BBB self.day_ts 1680040800 current_day_ts 1680040800 previous_day_length 43200
03/30/23-10:04:34 WARN  CCC fixed self.day_ts 1679997600

With these logger.warn added:

function CalendarDayView:onPrevPage()
    if not self:prevPage() and self.day_ts - 82800 >= self.min_ts then
        local current_day_ts = self.day_ts - (self.reader_statistics.settings.calendar_day_start_hour or 0) * 3600
                                           - (self.reader_statistics.settings.calendar_day_start_minute or 0) * 60
        local previous_day_ts = current_day_ts - 86400 + 10800 -- make sure it's the previous day
+       local logger = require("logger")
+       logger.warn("AAA self.day_ts", self.day_ts, "current_day_ts", current_day_ts, "previous_day_ts", previous_day_ts)
        local previous_day_date = os.date("*t", previous_day_ts)
        previous_day_ts = os.time({
            year = previous_day_date.year,
            month = previous_day_date.month,
            day = previous_day_date.day,
        })
        local previous_day_length = current_day_ts - previous_day_ts
+       logger.warn("BBB self.day_ts", self.day_ts, "current_day_ts", current_day_ts, "previous_day_length", previous_day_length)
        if self.day_ts - previous_day_length >= self.min_ts then
            -- go to previous day
            self.day_ts = self.day_ts - previous_day_length
+           logger.warn("CCC fixed self.day_ts", self.day_ts)
            self:setupView()
        end
    end
    return true
end

@weijiuqiao
Copy link
Contributor Author

I can't reproduce it.

My bad. I tested on my daytime computer without pulling the last commit. I am reproducing it now.

@weijiuqiao
Copy link
Contributor Author

Fixed by specifying the hour and min to be 0.

@poire-z
Copy link
Contributor

poire-z commented Mar 30, 2023

Seems fine now.
What would be the default values for hour & min if we don't specify them ? (I think I may have seen other places where we don't specify them ?)

@weijiuqiao
Copy link
Contributor Author

What would be the default values for hour & min if we don't specify them ?

Judging by the behavior, it's 12:00 by default.

Copy link
Contributor

@poire-z poire-z left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Frenzie : fine with the English strings?

min = self.settings.calendar_day_start_minute or 0,
hour_max = 6,
ok_text = _("Set time"),
title_text = _("Set starting time of a day"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe

Day starts at

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can Daily timeline starts at do?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup!

info_text =_([[
Set the time when the day timeline should start.

If you read past midnight, and wish this reading to appear with the previous evening's reading, you can set this to 04:00 for example.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you read past midnight, and wish this reading to appear with the previous evening's reading, you can set this to 04:00 for example.
If you read past midnight, and wish this reading session to be considered part of the previous evening, use a value such as 04:00.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You misinterpreted that, or "reading session" is not clear, or confusing.
May be then:
If you read past midnight, and wish this reading to be displayed on the same screen with your previous evening reading, use a value such as 04:00.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I probably did, but "reading" feels ungrammatical in any case.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, may be "reading session(s)" (it feels the second part needs plural):
If you read past midnight, and wish this reading session to be displayed on the same screen with your previous evening reading sessions, use a value such as 04:00.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you read past midnight, and would like this reading session to be displayed on the same screen with your previous evening reading sessions, use a value such as 04:00.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wording updated :)

@Frenzie Frenzie added the Plugin label Apr 1, 2023
@Frenzie Frenzie added this to the 2023.04 milestone Apr 1, 2023
@poire-z poire-z merged commit 5648c94 into koreader:master Apr 1, 2023
@poire-z
Copy link
Contributor

poire-z commented Apr 1, 2023

Any real reason to limit start hour from 0 to 6 ?
People having a nightwatcher job and reading at work might want it to start at 18:00 ?:
image

I'll add that thicker separator at 00:00 if nobody is against it - and force minutes in the picker to be multiple of 10, so our vertical separators keep some sense.

@weijiuqiao
Copy link
Contributor Author

weijiuqiao commented Apr 2, 2023

Any real reason to limit start hour from 0 to 6 ?

No. So long as it's at least 3 hours away from midnight (maybe 4 in case of DST?) it should be alright.

Edit: This limit actually shouldn't matter since it's subtracted when going to another day.

...if nobody is against it ...

I'm sure nobody would :)

@mergen3107
Copy link
Contributor

@weijiuqiao
I enjoy this new feature! Thank you :)
I some times read past through midnight.

@poire-z
Copy link
Contributor

poire-z commented Apr 2, 2023

Something we didn't think about I guess:
I have set "start at 05:00". It's now 00:30, and when I launch "Today's timeline", I get the blank timeline of tomorrow (starting at 05:00). We should probably show the previous day when it's not yet 05:00.

@weijiuqiao
Copy link
Contributor Author

@mergen3107 You're welcome :)

@poire-z

Something we didn't think about I guess:

Right. in function CalendarView:showCalendarDayView we need to check if we should still be in the previous day, and also in function ReaderStatistics:onShowCalendarDayView we also need to make sure the title_callback gives back the correct title.

@weijiuqiao weijiuqiao deleted the calendar_day_start_time branch April 3, 2023 07:17
@poire-z
Copy link
Contributor

poire-z commented Apr 3, 2023

(Had a quick look around, didn't dare touching it - and as I'm off soon, I won't make any PR).
There's something odd with the title_callback. It feels there is no real purpose to provide that from the outside, all could be self contained in CalendarView.
I see you may have made that to get as title "Today" when invoked from "Time spent reading today". But as from there, we can browse prev pages, we get a sticky "Today (monday...)" even when browsing previous days.
So, I guess this "Today" should better go, and we should just stick to showing the day date - the first one you get being implicitely today.

Frenzie pushed a commit that referenced this pull request Apr 7, 2023
TranHHoang added a commit to TranHHoang/koreader that referenced this pull request May 26, 2023
KOReader 2023.04 "Solar Panel"

![koreader-2023-04-fs8](https://user-images.githubusercontent.com/202757/234975122-d7739c71-74aa-4cb0-a086-72a4bba70f52.png)

It's been another busy month squashing many bugs. Our Mac users will be happy to hear that I told macOS we've supported HiDPI since long before anyone came up with such terminology (koreader#10341), and that the program can now natively build on M1 devices (koreader#10291).

Solar panel credit: <https://openclipart.org/detail/294030/solar-energy> by gnokii

We'd like to thank all contributors for their efforts. Some highlights since the previous release include:

* Readerzooming: fix use of default settings (koreader#10205) @hius07
* ButtonDialog/ButtonDialogTitle: consistent 'width' handling (koreader#10230) @poire-z
* MovableContainer: add support for anchoring initial position (koreader#10230) @poire-z
* Book map, Page browser: add top left menu (koreader#10230) @poire-z
* Book style tweak: add button with CSS suggestions (koreader#10230) @poire-z
* crengine: fix parsing of multibytes encodings (koreader#10230) @poire-z
* readerstyletweak: update profiles on unregistering in dispatcher (koreader#10247) @hius07
* Filesearcher: add search in book metadata (koreader#10198) @hius07
* Fix: Updated legacy directory, which crashed the program (koreader#10260) @Mochitto
* ReaderLink: allow a forward location stack (koreader#10228) @yparitcher
* BookInfo: add page information (koreader#10255) @hius07
* Center pdf manual zoom mode (koreader#10246) @nairyosangha
* File browser: add Folder Menu (koreader#10275) @hius07
* Calendar view: add options to change start time of days (koreader#10254) @weijiuqiao
* filechooser: fix crash on "unreadable content" (koreader#10283) @hius07
* Sync book statistics: add to dispatcher (koreader#10285) @ptrm
* [plugin] Exporter: use util.getSafeFilename() to remove illegal characters from output filename (koreader#10282) @Mochitto
* readerbookmark: fix writing pdf annotation (koreader#10287) @hius07
* Folder Menu: sign for Home folder (koreader#10288) @hius07
* ListMenu: show mark for books with highlights (koreader#10276) @hius07
* Calendar view's day view: thicker separator at 00:00 (koreader#10289) @poire-z
* PageBrowser: tweak scrolling behaviour at book start/end (koreader#10289) @poire-z
* Make `kodev check` feature complete (koreader#8682) @yparitcher
* macOS: support for M1 building (koreader#10291) @ptrm
* Reader: do not apply font size and spacing out of range (koreader#10295, koreader#10307) @hius07
* File browser: show Folder Menu on long-press on Home icon (koreader#10298) @hius07
* SSH.koplugin: fix cant stop SSH server bug when pid file's stale (koreader#10300) @weijiuqiao
* PM: Optimize task queue handling around standby (koreader#10203) @zwim
* statistic.koplugin: fix today's timeline showing next day when within custom offset (koreader#10299) @weijiuqiao
* ReaderThumbnails: update cached page thumbnail on bookmark note change (koreader#10303) @hius07
* SDL: add multitouch support (koreader#10334) @Frenzie
* SDL: add HiDPI support (koreader#10341) @Frenzie
* BookInfo: fix crash on show cover (koreader#10315) @hius07
* Deal with table.pack corner-cases properly (koreader#10350) @NiLuJe
* Android: add Tagus Gea support (<koreader/android-luajit-launcher#412>) @Alfedi

[Full changelog](koreader/koreader@v2023.03...v2023.04) — [closed milestone issues](https://github.com/koreader/koreader/milestone/63?closed=1)

---

Installation instructions: [Android](https://github.com/koreader/koreader/wiki/Installation-on-Android-devices) • [Cervantes](https://github.com/koreader/koreader/wiki/Installation-on-BQ-devices) • [ChromeOS](https://github.com/koreader/koreader/wiki/Installation-on-Chromebook-devices) • [Kindle](https://github.com/koreader/koreader/wiki/Installation-on-Kindle-devices) • [Kobo](https://github.com/koreader/koreader/wiki/Installation-on-Kobo-devices) • [PocketBook](https://github.com/koreader/koreader/wiki/Installation-on-PocketBook-devices) • [ReMarkable](https://github.com/koreader/koreader/wiki/Installation-on-ReMarkable) • [Desktop Linux](https://github.com/koreader/koreader/wiki/Installation-on-desktop-linux) • [MacOS](https://github.com/koreader/koreader/wiki/Installation-on-MacOS)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

FR: Change daily hourly range for reading statistics
4 participants