360 Commits

Author SHA1 Message Date
439af298b7 Update Rust crate lazy-regex to 3.4.2
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-30 00:42:28 +00:00
4d46f9c52c Bump to version 1.0.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-10-29 18:01:00 +01:00
c90a05fcfd Auto-publish releases to Gitea
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-29 17:54:44 +01:00
abdca20a66 Can set relay forced state from UI
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-29 17:49:03 +01:00
88a24565b4 Add new engine tests for forced state
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-29 16:12:17 +01:00
3625188706 Can set forced state to relays 2025-10-29 15:49:05 +01:00
58eceeda2d Update project dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-29 14:53:29 +01:00
c44c6c3bf5 Remove redundant declaration with upgrade to ESP-IDF v5.5.1
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-29 14:38:18 +01:00
4ef714fdbd Merge pull request 'Update espressif/idf Docker tag to v5.5.1' (#344) from renovate/espressif-idf-5.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-29 00:41:41 +00:00
bab4525908 Update espressif/idf Docker tag to v5.5.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-28 00:52:20 +00:00
2ed4299032 Merge pull request 'Update Rust crate reqwest to 0.12.24' (#343) from renovate/reqwest-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-28 00:52:15 +00:00
bcc92da065 Update Rust crate reqwest to 0.12.24
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-27 00:42:22 +00:00
af83130b63 Merge pull request 'Update Rust crate actix-session to 0.11.0' (#342) from renovate/actix-session-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-26 00:42:55 +00:00
950b576373 Update Rust crate actix-session to 0.11.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-10-26 00:42:45 +00:00
2459b0cf99 Merge pull request 'Update Rust crate clap to 4.5.50' (#341) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-26 00:42:02 +00:00
814204b4ce Update Rust crate clap to 4.5.50
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-25 00:42:07 +00:00
de8fcfbcfb Merge pull request 'Update dependency typescript-eslint to ^8.46.2' (#340) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-25 00:41:33 +00:00
49a7011d84 Update dependency typescript-eslint to ^8.46.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-24 00:42:39 +00:00
39aff8054a Merge pull request 'Update dependency @typescript-eslint/parser to ^8.46.2' (#339) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-24 00:42:31 +00:00
850f828dca Update dependency @typescript-eslint/parser to ^8.46.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-23 00:41:26 +00:00
59383debd2 Merge pull request 'Update dependency vite to ^6.4.1' (#338) from renovate/vite-6.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-22 00:42:45 +00:00
58cf0a9614 Update dependency vite to ^6.4.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-22 00:42:40 +00:00
f30aaf71dd Merge pull request 'Update dependency eslint to ^9.38.0' (#337) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-22 00:42:37 +00:00
27ce9e9a96 Update dependency eslint to ^9.38.0
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-22 00:42:30 +00:00
903dd104f3 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.46.2' (#336) from renovate/typescript-eslint-eslint-plugin-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-21 00:43:01 +00:00
205981fbc8 Update dependency @typescript-eslint/eslint-plugin to ^8.46.2
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-21 00:42:57 +00:00
623b0a4671 Merge pull request 'Update Rust crate openssl-sys to 0.9.110' (#335) from renovate/openssl-sys-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-21 00:42:51 +00:00
fd25e71cf8 Update Rust crate openssl-sys to 0.9.110
Some checks failed
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is failing
2025-10-20 00:40:59 +00:00
842b48e782 Merge pull request 'Update react' (#331) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-20 00:40:53 +00:00
e8374a8ef7 Update react
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-19 00:42:05 +00:00
347c247285 Merge pull request 'Update dependency typescript-eslint to ^8.46.1' (#213) from renovate/typescript-eslint-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-19 00:41:57 +00:00
c59aeed4ab Merge pull request 'Update Rust crate openssl to 0.10.74' (#334) from renovate/openssl-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-19 00:41:57 +00:00
b7f1beb1b7 Merge pull request 'Update Rust crate clap to 4.5.49' (#333) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-19 00:41:51 +00:00
4bd700c2db Update dependency typescript-eslint to ^8.46.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-18 00:42:04 +00:00
3f1c5e4ac0 Update Rust crate openssl to 0.10.74
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-10-18 00:42:00 +00:00
f77506dc46 Update Rust crate clap to 4.5.49
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-10-18 00:41:58 +00:00
5b7554b6bf Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.24' (#332) from renovate/eslint-plugin-react-refresh-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-17 00:41:35 +00:00
8fdbcc4f3a Update dependency eslint-plugin-react-refresh to ^0.4.24
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-17 00:41:33 +00:00
9f4c2b0e35 Merge pull request 'Update dependency react-router-dom to ^7.9.4' (#329) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-16 00:42:44 +00:00
0a7138a82b Update dependency react-router-dom to ^7.9.4
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-16 00:42:39 +00:00
2ce09a94b1 Merge pull request 'Update dependency @typescript-eslint/parser to ^8.46.1' (#330) from renovate/typescript-eslint-parser-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-16 00:42:38 +00:00
355b2a71ce Update dependency @typescript-eslint/parser to ^8.46.1
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-10-16 00:42:36 +00:00
6b04bf4261 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.46.1' (#328) from renovate/typescript-eslint-eslint-plugin-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-10-15 01:12:06 +00:00
99c6963210 Update dependency @typescript-eslint/eslint-plugin to ^8.46.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-10-14 00:43:10 +00:00
89cfd3ce21 Merge pull request 'Update dependency typescript to ^5.9.3' (#327) from renovate/typescript-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-13 00:42:47 +00:00
0c40ff2750 Update dependency typescript to ^5.9.3
Some checks failed
renovate/artifacts Artifact file update failure
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is passing
2025-10-13 00:42:39 +00:00
75be1ed1d2 Merge pull request 'Update dependency globals to ^16.4.0' (#326) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-13 00:42:30 +00:00
6a2baca3f2 Update dependency globals to ^16.4.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-12 00:40:56 +00:00
4d0d20b424 Merge pull request 'Update dependency eslint to ^9.37.0' (#325) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-12 00:40:50 +00:00
05cf488be7 Update dependency eslint to ^9.37.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-11 00:40:53 +00:00
b8ecc83668 Merge pull request 'Update Rust crate libc to 0.2.177' (#324) from renovate/libc-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-11 00:40:45 +00:00
c1912717e4 Update Rust crate libc to 0.2.177
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-10 00:39:58 +00:00
a8780e60d3 Merge pull request 'Update dependency semver to ^7.7.3' (#323) from renovate/semver-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-10 00:39:51 +00:00
5005cf84f9 Update dependency semver to ^7.7.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-09 00:16:46 +00:00
561992010c Merge pull request 'Update dependency @typescript-eslint/parser to ^8.46.0' (#322) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-09 00:16:39 +00:00
4725e67ee1 Update dependency @typescript-eslint/parser to ^8.46.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-08 00:16:47 +00:00
fbb55628be Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.46.0' (#321) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-08 00:16:39 +00:00
79e49ed5a9 Update dependency @typescript-eslint/eslint-plugin to ^8.46.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-07 00:17:12 +00:00
138b9d2dbe Merge pull request 'Update materialui to ^7.3.4' (#219) from renovate/materialui into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-07 00:17:05 +00:00
3413a1ee21 Update materialui to ^7.3.4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-06 00:18:40 +00:00
64055568e0 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.45.0' (#320) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-06 00:18:25 +00:00
af71b574cc Update dependency @typescript-eslint/eslint-plugin to ^8.45.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-05 00:18:58 +00:00
6088237b79 Merge pull request 'Update Rust crate thiserror to 2.0.17' (#319) from renovate/thiserror-2.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-05 00:18:50 +00:00
05a033b51c Update Rust crate thiserror to 2.0.17
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-04 00:41:16 +00:00
3d3ccf5242 Merge pull request 'Update Rust crate serde_json to 1.0.145' (#318) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-04 00:41:09 +00:00
68521c238c Update Rust crate serde_json to 1.0.145
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-03 00:41:45 +00:00
f03278f8c5 Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.23' (#317) from renovate/eslint-plugin-react-refresh-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-03 00:41:38 +00:00
a63d1f17de Update dependency eslint-plugin-react-refresh to ^0.4.23
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-02 00:40:56 +00:00
bb6d8a8be1 Merge pull request 'Update Rust crate serde to 1.0.228' (#316) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-02 00:40:49 +00:00
693414b1eb Update Rust crate serde to 1.0.228
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-10-01 00:39:51 +00:00
f74e86a8db Merge pull request 'Update Rust crate libc to 0.2.176' (#315) from renovate/libc-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-10-01 00:39:40 +00:00
53d4cb1de7 Update Rust crate libc to 0.2.176
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-30 00:39:28 +00:00
498ca3925a Merge pull request 'Update dependency @types/react to ^19.1.15' (#314) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-30 00:39:21 +00:00
155806df78 Update dependency @types/react to ^19.1.15
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-29 00:40:04 +00:00
79f3668021 Merge pull request 'Update dependency eslint-plugin-react-refresh to ^0.4.22' (#313) from renovate/eslint-plugin-react-refresh-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-29 00:39:58 +00:00
660e6e8a5b Update dependency eslint-plugin-react-refresh to ^0.4.22
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-28 00:39:53 +00:00
0e3182434f Merge pull request 'Update dependency @types/react to ^19.1.14' (#312) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-28 00:39:47 +00:00
cf2f034e6c Update dependency @types/react to ^19.1.14
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-27 00:41:27 +00:00
ddd27519a9 Merge pull request 'Update dependency @typescript-eslint/parser to ^8.44.1' (#311) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-27 00:41:21 +00:00
e8d2e8b318 Update dependency @typescript-eslint/parser to ^8.44.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-26 00:39:55 +00:00
0dfc25a918 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.44.1' (#310) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-26 00:39:47 +00:00
3078b3c645 Update dependency @typescript-eslint/eslint-plugin to ^8.44.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-24 00:43:54 +00:00
9d3bed68af Merge pull request 'Update Rust crate serde to 1.0.226' (#309) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-24 00:43:32 +00:00
9fe00f149c Update Rust crate serde to 1.0.226
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-22 00:44:39 +00:00
65164055d6 Merge pull request 'Update Rust crate clap to 4.5.48' (#308) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-22 00:44:23 +00:00
08680122f2 Update Rust crate clap to 4.5.48
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-21 00:45:22 +00:00
642366540e Merge pull request 'Update Rust crate anyhow to 1.0.100' (#307) from renovate/anyhow-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-21 00:45:07 +00:00
482da63a3b Update Rust crate anyhow to 1.0.100
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-20 00:41:46 +00:00
cade9dc02b Merge pull request 'Update Rust crate serde to 1.0.225' (#306) from renovate/serde-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-20 00:41:31 +00:00
9b87025b27 Update Rust crate serde to 1.0.225
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-19 00:39:44 +00:00
46d3f3580c Merge pull request 'Update dependency @fontsource/roboto to ^5.2.8' (#305) from renovate/fontsource-roboto-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-19 00:39:36 +00:00
bda9f6a9c9 Update dependency @fontsource/roboto to ^5.2.8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-18 00:40:56 +00:00
41380a103f Merge pull request 'Update Rust crate semver to 1.0.27' (#304) from renovate/semver-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-18 00:40:50 +00:00
2573778b82 Update Rust crate semver to 1.0.27
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-17 00:40:21 +00:00
527126d926 Merge pull request 'Update Rust crate egui to 0.32.3' (#303) from renovate/egui-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-17 00:40:14 +00:00
9a1104c57b Update Rust crate egui to 0.32.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-16 00:40:23 +00:00
bf3e703bb1 Merge pull request 'Update dependency @fontsource/roboto to ^5.2.7' (#302) from renovate/fontsource-roboto-5.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-16 00:40:15 +00:00
d7607bc483 Update dependency @fontsource/roboto to ^5.2.7
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-15 00:40:22 +00:00
306be8272a Merge pull request 'Update Rust crate eframe to 0.32.3' (#301) from renovate/eframe-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-15 00:40:16 +00:00
742bb8e2ed Update Rust crate eframe to 0.32.3
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-14 00:40:52 +00:00
e10d7ef478 Merge pull request 'Update dependency @types/react to ^19.1.13' (#300) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-14 00:40:43 +00:00
18ba6c60d6 Update dependency @types/react to ^19.1.13
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-13 00:41:05 +00:00
d70562f97a Merge pull request 'Update Rust crate thiserror to 2.0.16' (#299) from renovate/thiserror-2.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-13 00:40:59 +00:00
b0d192a9aa Update Rust crate thiserror to 2.0.16
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-12 00:40:22 +00:00
99f6b17f4e Merge pull request 'Update Rust crate serde_json to 1.0.143' (#298) from renovate/serde_json-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-12 00:40:14 +00:00
3fff4d624e Update Rust crate serde_json to 1.0.143
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-11 00:38:58 +00:00
e2f6212a75 Merge pull request 'Update Rust crate chrono to 0.4.42' (#297) from renovate/chrono-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-11 00:38:50 +00:00
bff1c88da8 Update Rust crate chrono to 0.4.42
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-10 00:39:13 +00:00
7933c2dae3 Merge pull request 'Update dependency vite to ^6.3.6' (#296) from renovate/vite-6.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-10 00:39:06 +00:00
15b8a69700 Update dependency vite to ^6.3.6
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-09 00:39:21 +00:00
157c77142a Merge pull request 'Update Rust crate reqwest to 0.12.23' (#295) from renovate/reqwest-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-09 00:39:14 +00:00
25f6e808ed Update Rust crate reqwest to 0.12.23
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-08 00:40:15 +00:00
6f298d3238 Merge pull request 'Update Rust crate log to 0.4.28' (#294) from renovate/log-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-08 00:40:07 +00:00
b75e868cc3 Update Rust crate log to 0.4.28
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-07 00:40:29 +00:00
6a2b5e320d Merge pull request 'Update Rust crate egui to 0.32.2' (#293) from renovate/egui-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-07 00:40:18 +00:00
52637fc401 Update Rust crate egui to 0.32.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-06 00:40:20 +00:00
8ea9da9443 Merge pull request 'Update Rust crate eframe to 0.32.2' (#292) from renovate/eframe-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-06 00:40:09 +00:00
b1b4eaa341 Update Rust crate eframe to 0.32.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-05 00:25:56 +00:00
94652a82fe Merge pull request 'Update dependency @types/semver to ^7.7.1' (#291) from renovate/semver-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-05 00:25:47 +00:00
832ab86536 Update dependency @types/semver to ^7.7.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-04 00:33:25 +00:00
32dbbf4678 Merge pull request 'Update Rust crate clap to 4.5.47' (#290) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-04 00:33:19 +00:00
1f48203564 Update Rust crate clap to 4.5.47
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-03 00:32:03 +00:00
0b6526f901 Merge pull request 'Update Rust crate libc to 0.2.175' (#289) from renovate/libc-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-03 00:31:53 +00:00
741db9e13b Update Rust crate libc to 0.2.175
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-02 00:32:19 +00:00
061ae8c208 Merge pull request 'Update Rust crate clap to 4.5.46' (#288) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-02 00:32:11 +00:00
4a68800907 Update Rust crate clap to 4.5.46
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-09-01 00:31:05 +00:00
6738d47507 Merge pull request 'Update dependency dayjs to ^1.11.18' (#287) from renovate/dayjs-1.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-09-01 00:30:56 +00:00
acbce81b46 Update dependency dayjs to ^1.11.18
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-31 00:30:49 +00:00
1615531d67 Fix improper label in OTA deployment dialog
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-30 13:27:48 +00:00
5355b351d1 Merge pull request 'Update react' (#286) from renovate/react into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-30 00:30:32 +00:00
ad10df3e7f Update react
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-29 00:32:24 +00:00
edf70cb8fc Merge pull request 'Update dependency @typescript-eslint/parser to ^8.41.0' (#265) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-29 00:32:16 +00:00
8af3018b34 Update dependency @typescript-eslint/parser to ^8.41.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-08-28 00:32:18 +00:00
dd96cc4bf3 Fix cargo clippy issues
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-27 08:28:45 +02:00
9e9a227332 Fix issue with asn1 crate update
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-27 08:25:46 +02:00
d701c406d6 Merge pull request 'Update Rust crate egui to 0.32.1' (#285) from renovate/egui-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-26 00:30:54 +00:00
74915f109d Update Rust crate egui to 0.32.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-25 00:30:47 +00:00
40af167c1a Merge pull request 'Update dependency @types/react to ^19.1.11' (#284) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-24 00:30:48 +00:00
124fc71c9a Update dependency @types/react to ^19.1.11
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-23 00:31:40 +00:00
ac6f93dd4a Merge pull request 'Update Rust crate eframe to 0.32.1' (#283) from renovate/eframe-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-22 00:31:16 +00:00
695fa1fcf4 Update Rust crate eframe to 0.32.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-21 00:31:48 +00:00
3131c757a9 Merge pull request 'Update Rust crate clap to 4.5.45' (#282) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-20 00:31:30 +00:00
60d5be58e1 Update Rust crate clap to 4.5.45
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-19 00:31:23 +00:00
4b90e0ede1 Merge pull request 'Update Rust crate anyhow to 1.0.99' (#281) from renovate/anyhow-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-18 00:30:24 +00:00
d351aebce4 Update Rust crate anyhow to 1.0.99
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-17 00:31:50 +00:00
24d95fff89 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.39.1' (#280) from renovate/typescript-eslint-eslint-plugin-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-16 00:30:22 +00:00
11e536fee0 Update dependency @typescript-eslint/eslint-plugin to ^8.39.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-15 00:31:43 +00:00
e2328b47e5 Merge pull request 'Update dependency @types/react to ^19.1.10' (#279) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-14 00:31:26 +00:00
bc790df8e6 Update dependency @types/react to ^19.1.10
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-13 00:31:57 +00:00
104e4f2c15 Merge pull request 'Update dependency eslint to ^9.33.0' (#278) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-12 00:31:07 +00:00
709671c35d Update dependency eslint to ^9.33.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-11 00:31:14 +00:00
e769b2d83b Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.39.0' (#277) from renovate/typescript-eslint-eslint-plugin-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-10 00:30:19 +00:00
33c3769818 Update dependency @typescript-eslint/eslint-plugin to ^8.39.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-09 00:30:41 +00:00
7c5eeaeaa0 Merge pull request 'Update Rust crate clap to 4.5.43' (#276) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-08 00:18:59 +00:00
bcdb72e217 Update Rust crate clap to 4.5.43
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-07 00:19:29 +00:00
7173d206f2 Merge pull request 'Update Rust crate tokio to 1.47.1' (#275) from renovate/tokio-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-06 00:18:40 +00:00
74a8d3ffbf Update Rust crate tokio to 1.47.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-05 00:18:26 +00:00
31bc7898ee Merge pull request 'Update Rust crate serde_json to 1.0.142' (#274) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-04 00:18:39 +00:00
27a6d8f7ed Update Rust crate serde_json to 1.0.142
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-03 00:21:42 +00:00
43c988b80e Merge pull request 'Update Rust crate clap to 4.5.42' (#273) from renovate/clap-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-02 00:20:39 +00:00
9531281fd2 Update Rust crate clap to 4.5.42
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-08-01 00:23:15 +00:00
e589e2e80c Merge pull request 'Update react' (#272) from renovate/react into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-31 00:18:34 +00:00
36c127a9c9 Update react
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-30 00:17:50 +00:00
f0b9683519 Merge pull request 'Update Rust crate uuid to 1.17.0' (#271) from renovate/uuid-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-28 00:19:56 +00:00
2e793770f1 Update Rust crate uuid to 1.17.0
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-28 00:19:53 +00:00
ceac6a2683 Merge pull request 'Update Rust crate tokio to 1.47.0' (#270) from renovate/tokio-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-27 00:19:24 +00:00
f232a63496 Update Rust crate tokio to 1.47.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-27 00:19:23 +00:00
adfe006270 Merge pull request 'Update dependency eslint to ^9.32.0' (#269) from renovate/eslint-9.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-26 00:19:07 +00:00
aa6ca82edd Update dependency eslint to ^9.32.0
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-26 00:19:04 +00:00
d939752aed Merge pull request 'Update dependency react-router-dom to ^7.7.1' (#268) from renovate/react-router-dom-7.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-25 00:20:02 +00:00
ca6532aee3 Update dependency react-router-dom to ^7.7.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-25 00:19:59 +00:00
bd5fc18bab Merge pull request 'Update Rust crate tokio to 1.46.1' (#267) from renovate/tokio-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-24 00:20:13 +00:00
80023ddee3 Update Rust crate tokio to 1.46.1
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-24 00:20:09 +00:00
d48094aca6 Merge pull request 'Update Rust crate rust-embed to 8.7.2' (#266) from renovate/rust-embed-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 00:19:38 +00:00
47e59b7035 Update Rust crate rust-embed to 8.7.2
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-23 00:19:35 +00:00
6eb9e3df09 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.38.0' (#264) from renovate/typescript-eslint-eslint-plugin-8.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-22 00:23:12 +00:00
0d5f2b90eb Update dependency @typescript-eslint/eslint-plugin to ^8.38.0
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-22 00:23:07 +00:00
8f181ec485 Merge pull request 'Update Rust crate egui to 0.32.0' (#263) from renovate/egui-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-21 00:20:42 +00:00
7bb92f7e05 Update Rust crate egui to 0.32.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-21 00:20:37 +00:00
2f2a77f780 Merge pull request 'Update Rust crate rand to 0.9.2' (#262) from renovate/rand-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-21 00:20:27 +00:00
789c30faf8 Update Rust crate rand to 0.9.2
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-21 00:20:24 +00:00
2a9bc65f54 Merge pull request 'Update Rust crate eframe to 0.32.0' (#261) from renovate/eframe-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-20 00:17:57 +00:00
2b96e2a294 Update Rust crate eframe to 0.32.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-20 00:17:53 +00:00
0092d09ff9 Merge pull request 'Update dependency @vitejs/plugin-react to ^4.7.0' (#260) from renovate/vitejs-plugin-react-4.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-20 00:17:38 +00:00
4bdda28ebf Update dependency @vitejs/plugin-react to ^4.7.0
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-20 00:17:36 +00:00
83e130d232 Merge pull request 'Update Rust crate serde_json to 1.0.141' (#259) from renovate/serde_json-1.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-19 00:21:31 +00:00
15c394a797 Update Rust crate serde_json to 1.0.141
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-07-19 00:21:28 +00:00
66257b2866 Merge pull request 'Update Rust crate asn1 to 0.22.0' (#258) from renovate/asn1-0.x into master
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-19 00:21:22 +00:00
140f1449a7 Merge pull request 'Update Rust crate libc to 0.2.174' (#235) from renovate/libc-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-19 00:21:15 +00:00
71b0e54529 Update Rust crate asn1 to 0.22.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-07-18 00:18:44 +00:00
4fff948382 Update Rust crate libc to 0.2.174
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-18 00:18:32 +00:00
13100a728f Merge pull request 'Update dependency react-router-dom to ^7.7.0' (#257) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-17 02:02:04 +00:00
de2fc4a62f Update dependency react-router-dom to ^7.7.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-17 00:18:57 +00:00
b5b883df46 Merge pull request 'Update dependency @typescript-eslint/parser to ^8.37.0' (#256) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-16 01:41:06 +00:00
285c80926b Update dependency @typescript-eslint/parser to ^8.37.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-16 00:18:22 +00:00
a4eb8f3465 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.37.0' (#255) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-15 01:44:36 +00:00
03b1dc1fd7 Update dependency @typescript-eslint/eslint-plugin to ^8.37.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-15 00:18:02 +00:00
b55215149f Merge pull request 'Update dependency globals to ^16.3.0' (#254) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-14 01:48:46 +00:00
ad02303a16 Update dependency globals to ^16.3.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-14 00:17:54 +00:00
a2de65d454 Merge pull request 'Update dependency eslint to ^9.31.0' (#253) from renovate/eslint-9.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-13 01:57:12 +00:00
2d8d1cf28d Update dependency eslint to ^9.31.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-13 00:17:47 +00:00
a8dd9fb08c Merge pull request 'Update dependency @vitejs/plugin-react to ^4.6.0' (#252) from renovate/vitejs-plugin-react-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-12 01:59:06 +00:00
317de38662 Update dependency @vitejs/plugin-react to ^4.6.0
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-12 00:17:55 +00:00
57f06690c4 Merge pull request 'Update Rust crate clap to 4.5.41' (#251) from renovate/clap-4.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-11 01:47:37 +00:00
93554d3719 Update Rust crate clap to 4.5.41
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-11 00:18:09 +00:00
56f119008b Merge pull request 'Update dependency @typescript-eslint/parser to ^8.36.0' (#250) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-10 02:06:32 +00:00
e1a82e205e Update dependency @typescript-eslint/parser to ^8.36.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-10 00:18:52 +00:00
2e3175505f Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.36.0' (#249) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-09 01:56:28 +00:00
6108a58919 Update dependency @typescript-eslint/eslint-plugin to ^8.36.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-09 00:18:19 +00:00
1e5762bb4f Merge pull request 'Update Rust crate reqwest to 0.12.22' (#248) from renovate/reqwest-0.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-08 02:08:49 +00:00
71ecf18a2f Update Rust crate reqwest to 0.12.22
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-08 00:18:20 +00:00
a7069fd0ec Merge pull request 'Update dependency react-router-dom to ^7.6.3' (#247) from renovate/react-router-dom-7.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-07 01:32:32 +00:00
5d44bb8a21 Update dependency react-router-dom to ^7.6.3
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-07 00:17:39 +00:00
78da2b181c Merge pull request 'Update dependency @typescript-eslint/parser to ^8.35.1' (#246) from renovate/typescript-eslint-parser-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-06 01:33:35 +00:00
9e1de0854d Update dependency @typescript-eslint/parser to ^8.35.1
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-07-06 00:17:54 +00:00
edb6279b74 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to ^8.35.1' (#245) from renovate/typescript-eslint-eslint-plugin-8.x into master
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-05 01:48:07 +00:00
fd00a87216 Update dependency @typescript-eslint/eslint-plugin to ^8.35.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-05 00:11:36 +00:00
00050c62c5 Update dependency @emotion/styled to ^11.14.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-07-04 00:11:30 +00:00
6824120652 Fix cargo clippy issue
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-03 08:31:07 +02:00
5ed4cc6fed Update dependency @typescript-eslint/parser to ^8.35.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-26 00:10:59 +00:00
c805b03370 Update dependency @typescript-eslint/eslint-plugin to ^8.35.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-25 00:11:01 +00:00
d97d6bfe56 Update espressif/idf Docker tag to v5.4.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-24 00:12:09 +00:00
7151b199f8 Update Rust crate actix-web to 4.11.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-23 00:23:26 +00:00
40f938efe7 Update react
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-22 00:22:08 +00:00
ffb8c25428 Update dependency globals to ^16.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-21 00:22:45 +00:00
593719e373 Update dependency eslint to ^9.29.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-20 00:23:24 +00:00
13a9905281 Update dependency @vitejs/plugin-react to ^4.5.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-19 00:22:21 +00:00
55b354228f Update dependency @typescript-eslint/parser to ^8.34.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-18 00:23:41 +00:00
d751ddc671 Update dependency @typescript-eslint/eslint-plugin to ^8.34.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-17 00:23:34 +00:00
c5061fdb4d Update dependency vite to ^6.3.5
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-16 00:23:53 +00:00
7adbafb831 Update Rust crate reqwest to 0.12.20
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-15 00:23:50 +00:00
02397d10f0 Update Rust crate libc to 0.2.173
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-14 00:24:08 +00:00
e3ae017279 Update Rust crate openssl-sys to 0.9.109
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-13 00:24:13 +00:00
30b5155a4d Update Rust crate openssl to 0.10.73
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-12 00:24:51 +00:00
0d04f5d7b2 Update Rust crate clap to 4.5.40
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-11 00:25:01 +00:00
a40dff2820 Update dependency react-router-dom to ^7.6.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-10 00:24:55 +00:00
6fbec9f0cd Update dependency @fontsource/roboto to ^5.2.6
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-09 00:24:18 +00:00
055e512f77 Update dependency @mui/x-date-pickers to ^7.29.4
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-07 00:23:55 +00:00
ee769f043f Update Rust crate asn1 to 0.21.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-06-06 00:23:39 +00:00
926b265f91 Fix cargo clippy issues
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-05 09:29:36 +00:00
b115ba9307 Update dependency semver to ^7.7.2
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2025-05-15 00:18:20 +00:00
8ada40a5ee Update dependency @typescript-eslint/parser to ^8.32.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-14 00:18:57 +00:00
100e42ec6d Update dependency @typescript-eslint/eslint-plugin to ^8.32.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-13 00:19:44 +00:00
cab51c9623 Update Rust crate clap to 4.5.38
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-12 00:18:49 +00:00
76df0ecf3e Update dependency react-router-dom to ^7.6.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-11 00:17:26 +00:00
85cb7d6a75 Update dependency globals to ^16.1.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-10 00:18:21 +00:00
69a51e11d3 Update dependency @mui/x-date-pickers to ^7.29.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-09 00:17:56 +00:00
0ff1d48b90 Update dependency eslint to ^9.26.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-08 00:26:57 +00:00
0d478a10f7 Update dependency @typescript-eslint/parser to ^8.32.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-07 00:26:51 +00:00
a8e2f2d7bf Update dependency @typescript-eslint/eslint-plugin to ^8.32.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-06 00:26:20 +00:00
e961ea0911 Update dependency @vitejs/plugin-react to ^4.4.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-05 00:26:15 +00:00
1c1eb53b6e Update dependency @typescript-eslint/parser to ^8.31.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-04 00:26:21 +00:00
1a2badc138 Update Rust crate asn1 to 0.21.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-03 00:26:12 +00:00
9323a4a3f5 Update dependency @mui/x-date-pickers to ^7.29.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-02 00:21:24 +00:00
35cfc73c9d Update Rust crate openssl-sys to 0.9.108
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-05-01 00:21:32 +00:00
dad54c638b Update Rust crate chrono to 0.4.41
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-30 00:21:32 +00:00
4f5be4d08c Update dependency @typescript-eslint/eslint-plugin to ^8.31.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-29 00:21:24 +00:00
b89aee2dcc Update dependency @mui/x-date-pickers to ^7.29.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-28 00:21:12 +00:00
bbe2c3ebc5 Update dependency @mui/x-charts to ^7.29.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-27 00:20:34 +00:00
62037db6e3 Update Rust crate uuid to 1.16.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-26 00:21:16 +00:00
0bf3bdbaea Update Rust crate tokio to 1.44.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-25 00:21:49 +00:00
f65df5f22a Update Rust crate rand to 0.9.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-24 00:21:40 +00:00
406a920d7e Update Rust crate libc to 0.2.172
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-23 00:21:18 +00:00
889ba9b85f Update dependency eslint-plugin-react-refresh to ^0.4.20
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-22 00:29:21 +00:00
12606ba336 Update Rust crate clap to 4.5.37
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-21 00:29:51 +00:00
cb2e17581a Update materialui to ^7.0.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-20 00:29:25 +00:00
4dd5fb4e55 Update dependency typescript to ^5.8.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-19 00:30:09 +00:00
0a162e4a78 Update dependency eslint-plugin-react-hooks to ^5.2.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-18 00:29:40 +00:00
ba45faf017 Update Rust crate anyhow to 1.0.98
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-17 00:28:53 +00:00
c4dedb946f Update dependency @mui/x-charts to ^7.28.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-16 00:29:00 +00:00
5004194567 Update dependency @emotion/styled to ^11.14.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-15 00:28:56 +00:00
768f8fc112 Update Rust crate thiserror to 2.0.12
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-14 00:28:53 +00:00
adf1477c4b Update Rust crate serde_json to 1.0.140
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-13 00:29:16 +00:00
7474e25209 Update Rust crate clap to 4.5.36
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-12 00:29:31 +00:00
f33c408c67 Update Rust crate serde to 1.0.219
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-11 00:29:14 +00:00
ccd4125500 Update Rust crate semver to 1.0.26
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-10 00:29:12 +00:00
9825f2628b Update Rust crate rust-embed to 8.6.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-09 00:29:25 +00:00
9e5797e4ca Update Rust crate openssl-sys to 0.9.107
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-08 00:29:26 +00:00
fb562f908c Update Rust crate openssl to 0.10.72
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-07 00:35:20 +00:00
ffb00ee668 Update Rust crate env_logger to 0.11.8
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-06 00:36:29 +00:00
3ad64e55b8 Update Rust crate clap to 4.5.35
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-05 00:36:00 +00:00
f01df2818c Update Rust crate reqwest to 0.12.15
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-04 00:37:23 +00:00
da60a57f53 Update Rust crate openssl-sys to 0.9.106
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-03 00:37:17 +00:00
0629bd60c3 Update Rust crate openssl to 0.10.71
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-02 00:37:48 +00:00
995977fd37 Update Rust crate log to 0.4.27
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-01 02:07:52 +00:00
9bf15f28b8 Update Rust crate libc to 0.2.171
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-31 20:53:03 +00:00
8941ec2aef Update Rust crate lazy-regex to 3.4.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-31 00:37:18 +00:00
b19961ed6a Update Rust crate jsonwebtoken to 9.3.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-30 02:23:29 +00:00
082efa367c Update Rust crate anyhow to 1.0.97
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 22:59:42 +00:00
3ffcdad666 Update Rust crate actix-web to 4.10.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 18:16:37 +00:00
65db36d097 Update renovate.json
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-29 17:31:13 +00:00
57bb552950 Update node Docker tag to v23
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 14:14:59 +00:00
1d9c539cd1 Update dependency react-dom to v19.1.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-03-29 12:55:01 +00:00
11d718cfe8 Merge pull request 'Update dependency globals to v16' (#163) from renovate/globals-16.x into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #163
2025-03-29 09:53:17 +00:00
0125b16177 Merge pull request 'Update espressif/idf Docker tag to v5.4.1' (#162) from renovate/espressif-idf-5.x into master
Some checks reported errors
continuous-integration/drone/push Build was killed
Reviewed-on: #162
2025-03-29 09:52:32 +00:00
d97dcddb96 Merge pull request 'Update dependency react-router-dom to v7.4.1' (#160) from renovate/react-router-dom-7.x-lockfile into master
Some checks reported errors
continuous-integration/drone/push Build was killed
Reviewed-on: #160
2025-03-29 09:49:43 +00:00
9eafbd8aeb Merge pull request 'Update dependency react to v19.1.0' (#161) from renovate/react-19.x-lockfile into master
Some checks reported errors
continuous-integration/drone/push Build was killed
Reviewed-on: #161
2025-03-29 09:49:35 +00:00
6aa7fc3a75 Update dependency globals to v16
Some checks reported errors
continuous-integration/drone/pr Build was killed
continuous-integration/drone/push Build is passing
2025-03-29 09:16:15 +00:00
345b3566ae Update espressif/idf Docker tag to v5.4.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-29 09:16:12 +00:00
22cd346330 Update renovate.json
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-29 09:04:45 +00:00
aee9303f91 Update dependency react to v19.1.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-29 00:33:23 +00:00
6462645d26 Update dependency react-router-dom to v7.4.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-29 00:33:09 +00:00
4bb76777db Update Vite configuration
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 20:14:29 +01:00
d79b55b86d Update frontend dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 19:33:30 +01:00
665a04c8a0 Update backend code to Rust Edition 2024
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 19:25:15 +01:00
658b10f5f8 Update Espressif to version 5.3.2
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 19:17:02 +01:00
c0374e35b1 Update custom consumption dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-28 19:15:41 +01:00
15f701668f Merge pull request 'Update dependency @mui/x-charts to v7.28.0' (#158) from renovate/mui-x-charts-7.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #158
2025-03-28 15:51:17 +00:00
8fdfa19806 Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to v8.28.0' (#159) from renovate/typescript-eslint-eslint-plugin-8.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #159
2025-03-28 15:51:11 +00:00
22d84e9464 Merge pull request 'Update dependency @types/react to v19.0.12' (#157) from renovate/react-19.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #157
2025-03-28 15:51:02 +00:00
a5c5663390 Update dependency @typescript-eslint/eslint-plugin to v8.28.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-25 00:27:41 +00:00
7878fb9686 Update dependency @mui/x-charts to v7.28.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-25 00:27:33 +00:00
b24642b10d Update dependency @types/react to v19.0.12
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-25 00:27:28 +00:00
ce45d841b2 Update dependency @typescript-eslint/eslint-plugin to v8.20.0
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-24 14:58:06 +00:00
1b4e5eda9d Update dependency @types/react to v19.0.5
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-24 14:51:27 +00:00
bb1917d1b4 Update dependency @mui/x-charts to v7.23.6
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-24 14:44:59 +00:00
b285323bd7 Merge pull request 'Update Rust crate semver to v1.0.26' (#154) from renovate/semver-1.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #154
2025-03-24 14:35:38 +00:00
ecb161ee82 Merge pull request 'Update dependency eslint-plugin-react-hooks to v5.2.0' (#156) from renovate/eslint-plugin-react-hooks-5.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #156
2025-03-24 09:57:39 +00:00
00c6ae338b Merge pull request 'Update Rust crate serde_json to v1.0.140' (#155) from renovate/serde_json-1.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #155
2025-03-24 09:57:27 +00:00
814046146c Update dependency eslint-plugin-react-hooks to v5.2.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-12 00:22:31 +00:00
f52e992d84 Merge pull request 'Update Rust crate thiserror to v2.0.11' (#148) from renovate/thiserror-2.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #148
2025-03-11 14:40:20 +00:00
dc73882347 Merge branch 'master' into renovate/thiserror-2.x-lockfile
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-11 14:28:40 +00:00
5ed8c42b99 Update Rust crate tokio to v1.43.0
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-11 14:24:46 +00:00
0fcb902e9e Update Rust crate uuid to v1.11.1 (#149)
All checks were successful
continuous-integration/drone/push Build is passing
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [uuid](https://github.com/uuid-rs/uuid) | dependencies | patch | `1.11.0` -> `1.11.1` |

---

### Release Notes

<details>
<summary>uuid-rs/uuid (uuid)</summary>

### [`v1.11.1`](https://github.com/uuid-rs/uuid/releases/tag/1.11.1)

[Compare Source](https://github.com/uuid-rs/uuid/compare/1.11.0...1.11.1)

#### What's Changed

-   Finish cut off docs by [@&#8203;KodrAus](https://github.com/KodrAus) in https://github.com/uuid-rs/uuid/pull/777
-   Fix links in CONTRIBUTING.md by [@&#8203;jacobggman](https://github.com/jacobggman) in https://github.com/uuid-rs/uuid/pull/778
-   Update rust toolchain before building by [@&#8203;KodrAus](https://github.com/KodrAus) in https://github.com/uuid-rs/uuid/pull/781
-   Prepare for 1.11.1 release by [@&#8203;KodrAus](https://github.com/KodrAus) in https://github.com/uuid-rs/uuid/pull/782

#### New Contributors

-   [@&#8203;jacobggman](https://github.com/jacobggman) made their first contribution in https://github.com/uuid-rs/uuid/pull/778

**Full Changelog**: https://github.com/uuid-rs/uuid/compare/1.11.0...1.11.1

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMDUuMSIsInVwZGF0ZWRJblZlciI6IjM5LjEwNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: #149
2025-03-11 14:09:22 +00:00
cfafbda77b Update Rust crate serde_json to v1.0.140
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-04 00:21:07 +00:00
dace42aef2 Update Rust crate semver to v1.0.26
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-03-04 00:21:02 +00:00
67401e8faf Fix cargo clippy issue
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-22 19:43:32 +01:00
77a278bd53 Update Rust crate thiserror to v2.0.11
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2025-01-11 00:23:17 +00:00
6df43fcc0e Update Rust crate clap to v4.5.26
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2025-01-10 00:23:11 +00:00
8add37fc42 Update dependency @types/react to v19.0.4
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-09 01:19:27 +00:00
bfde6531c2 Update Rust crate thiserror to v2.0.10
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-09 00:23:10 +00:00
5f6ac7bcfd Update Rust crate serde_json to v1.0.135
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-08 01:25:39 +00:00
c01f1ca484 Update Rust crate clap to v4.5.24
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-08 00:28:35 +00:00
c6975c2097 Update dependency @typescript-eslint/eslint-plugin to v8.19.1
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-07 01:00:20 +00:00
2d079403c5 Update dependency @types/react to v19.0.3
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-07 00:27:34 +00:00
2d408871ad Update dependency @mui/icons-material to v6.3.1
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-05 00:24:30 +00:00
22fd077380 Update dependency react-dom to v19
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-04 00:24:40 +00:00
0fba1caf62 Update dependency react to v19
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-03 00:49:17 +00:00
7e99cfc086 Update dependency vite to v6.0.7
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-03 00:23:48 +00:00
511011bb4b Update dependency eslint-plugin-react-hooks to v5.1.0
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-02 00:44:23 +00:00
dfca6a04bc Update dependency @typescript-eslint/parser to v8.19.0
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-02 00:23:46 +00:00
4f639522b9 Update dependency @typescript-eslint/eslint-plugin to v8.19.0
All checks were successful
continuous-integration/drone/push Build is passing
2025-01-01 00:58:34 +00:00
7d9af6af64 Update Rust crate reqwest to v0.12.12
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-01-01 00:24:03 +00:00
e1136926a1 Fix condition
All checks were successful
continuous-integration/drone/push Build is passing
2024-12-30 09:29:28 +01:00
4206d9529b Update frontend dependencies
All checks were successful
continuous-integration/drone/push Build is passing
2024-12-30 09:26:00 +01:00
b606aed10e Merge pull request 'Update dependency @typescript-eslint/eslint-plugin to v8.17.0' (#91) from renovate/typescript-eslint-eslint-plugin-8.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #91
2024-12-30 08:18:14 +00:00
9a2ceb9804 Merge pull request 'Update Rust crate zip to v2.2.2' (#115) from renovate/zip-2.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #115
2024-12-30 08:17:33 +00:00
f6bd7b1061 Merge pull request 'Update dependency @mui/icons-material to v6.2.1' (#117) from renovate/mui-icons-material-6.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #117
2024-12-30 08:17:25 +00:00
34460500a0 Update Rust crate thiserror to v2.0.9
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-30 00:23:52 +00:00
72afa3df62 Fix daily runtime calculation
All checks were successful
continuous-integration/drone/push Build is passing
2024-12-29 14:30:32 +01:00
e74f7d6f6d Update Rust crate serde to v1.0.217
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-29 00:23:53 +00:00
5b09aec93a Update Rust crate reqwest to v0.12.11
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-28 00:25:31 +00:00
9f93f76d8e Update Rust crate reqwest to v0.12.10
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-27 00:24:07 +00:00
211369a1b2 Update Rust crate serde_json to v1.0.134
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-26 00:23:33 +00:00
d7c4cd6635 Update Rust crate anyhow to v1.0.95
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2024-12-25 00:23:28 +00:00
4f78e99f65 Merge pull request 'Update Rust crate env_logger to v0.11.6' (#121) from renovate/env_logger-0.x-lockfile into master
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #121
2024-12-24 14:32:24 +00:00
541f7cbe95 Update Rust crate env_logger to v0.11.6
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-12-21 00:24:34 +00:00
fc5f9735bf Update dependency @mui/icons-material to v6.2.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-12-18 00:06:44 +00:00
ffbbd14ac3 Update Rust crate zip to v2.2.2
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2024-12-17 00:06:49 +00:00
4330e64489 Update dependency @typescript-eslint/eslint-plugin to v8.17.0
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
2024-12-03 00:23:08 +00:00
56 changed files with 4398 additions and 2589 deletions

View File

@@ -5,7 +5,7 @@ name: default
steps:
- name: web_build
image: node:21
image: node:23
volumes:
- name: web_app
path: /tmp/web_build
@@ -46,6 +46,11 @@ steps:
path: /usr/local/cargo/registry
- name: web_app
path: /tmp/web_build
- name: releases
path: /tmp/releases
when:
event:
- tag
depends_on:
- backend_check
- web_build
@@ -54,13 +59,41 @@ steps:
- mv /tmp/web_build/dist static
- cargo build --release
- ls -lah target/release/central_backend
- mv target/release/central_backend /tmp/releases/central_backend
# Build ESP32 program
- name: esp32_compile
image: espressif/idf:v5.3.1
image: espressif/idf:v5.5.1
volumes:
- name: releases
path: /tmp/releases
commands:
- cd esp32_device
- /opt/esp/entrypoint.sh idf.py build
- ls -lah build/main.bin
- cp build/main.bin /tmp/releases/wt32-eth01.bin
# Auto-release to Gitea
- name: gitea_release
image: plugins/gitea-release
depends_on:
- backend_compile
- esp32_compile
when:
event:
- tag
volumes:
- name: releases
path: /tmp/releases
environment:
PLUGIN_API_KEY:
from_secret: GITEA_API_KEY # needs permission write:repository
settings:
base_url: https://gitea.communiquons.org
files:
- /tmp/releases/central_backend
- /tmp/releases/wt32-eth01.bin
checksum: sha512
volumes:
@@ -68,3 +101,5 @@ volumes:
temp: {}
- name: web_app
temp: {}
- name: releases
temp: {}

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +1,46 @@
[package]
name = "central_backend"
version = "1.0.2"
edition = "2021"
version = "1.0.3"
edition = "2024"
[dependencies]
log = "0.4.22"
env_logger = "0.11.5"
log = "0.4.28"
env_logger = "0.11.8"
lazy_static = "1.5.0"
dotenvy = "0.15.7"
clap = { version = "4.5.20", features = ["derive", "env"] }
anyhow = "1.0.89"
thiserror = "2.0.3"
openssl = { version = "0.10.66" }
openssl-sys = "0.9.102"
libc = "0.2.159"
clap = { version = "4.5.50", features = ["derive", "env"] }
anyhow = "1.0.100"
thiserror = "2.0.17"
openssl = { version = "0.10.74" }
openssl-sys = "0.9.110"
libc = "0.2.177"
foreign-types-shared = "0.1.1"
asn1 = "0.20"
actix-web = { version = "4", features = ["openssl"] }
asn1 = "0.23.0"
actix-web = { version = "4.11.0", features = ["openssl"] }
futures = "0.3.31"
serde = { version = "1.0.215", features = ["derive"] }
reqwest = { version = "0.12.7", features = ["json"] }
serde_json = "1.0.131"
rand = "0.8.5"
serde = { version = "1.0.228", features = ["derive"] }
reqwest = { version = "0.12.24", features = ["json"] }
serde_json = "1.0.145"
rand = "0.10.0-rc.0"
actix = "0.13.5"
actix-identity = "0.8.0"
actix-session = { version = "0.10.1", features = ["cookie-session"] }
actix-cors = "0.7.0"
actix-identity = "0.9.0"
actix-session = { version = "0.11.0", features = ["cookie-session"] }
actix-cors = "0.7.1"
actix-multipart = { version = "0.7.2", features = ["derive"] }
actix-remote-ip = "0.1.0"
futures-util = "0.3.31"
uuid = { version = "1.11.0", features = ["v4", "serde"] }
semver = { version = "1.0.23", features = ["serde"] }
lazy-regex = "3.3.0"
tokio = { version = "1.40.0", features = ["full"] }
uuid = { version = "1.18.1", features = ["v4", "serde"] }
semver = { version = "1.0.27", features = ["serde"] }
lazy-regex = "3.4.2"
tokio = { version = "1.48.0", features = ["full"] }
tokio_schedule = "0.3.2"
mime_guess = "2.0.5"
rust-embed = "8.5.0"
jsonwebtoken = { version = "9.3.0", features = ["use_pem"] }
rust-embed = "8.8.0"
jsonwebtoken = { version = "10.1.0", features = ["use_pem", "rust_crypto"] }
prettytable-rs = "0.10.0"
chrono = "0.4.38"
chrono = "0.4.42"
serde_yml = "0.0.12"
bincode = "=2.0.0-rc.3"
fs4 = { version = "0.12.0", features = ["sync"] }
zip = { version = "2.2.0", features = ["bzip2"] }
walkdir = "2.5.0"
bincode = "2.0.1"
fs4 = { version = "0.13.1", features = ["sync"] }
zip = { version = "6.0.0", features = ["bzip2"] }
walkdir = "2.5.0"

View File

@@ -0,0 +1,33 @@
devices:
- id: dev1
info:
reference: A
version: 0.0.1
max_relays: 1
time_create: 1
time_update: 1
name: Dev1
description: Day1
validated: true
enabled: true
relays:
- id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72e9
name: R1
enabled: true
priority: 1
consumption: 100
minimal_uptime: 10
minimal_downtime: 10
depends_on: []
conflicts_with: []
on: false
for: 5000
forced_state:
type: Off
for_secs: 500
should_be_on: false
online: true
curr_consumption: -10000

View File

@@ -0,0 +1,49 @@
devices:
- id: dev1
info:
reference: A
version: 0.0.1
max_relays: 1
time_create: 1
time_update: 1
name: Dev1
description: Day1
validated: true
enabled: true
relays:
- id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72e9
name: R1
enabled: true
priority: 1
consumption: 100
minimal_uptime: 10
minimal_downtime: 10
depends_on: []
conflicts_with: []
on: false
for: 500
forced_state:
type: On
for_secs: 500
should_be_on: true
- id: dcb3fd91-bf9b-4de3-99e5-92c1c7dd72f0
name: R2
enabled: true
priority: 1
consumption: 100
minimal_uptime: 10
minimal_downtime: 10
depends_on: [ ]
conflicts_with: [ ]
on: false
for: 500
forced_state:
type: None
should_be_on: false
online: true
curr_consumption: 10000

View File

@@ -16,11 +16,13 @@ impl CRLDistributionPointExt {
let crl_bytes = asn1::write(|w| {
w.write_element(&asn1::SequenceWriter::new(&|w| {
w.write_element(&asn1::SequenceWriter::new(&|w| {
w.write_tlv(tag_a0, |w| {
w.write_tlv(tag_a0, None, |w: &mut asn1::WriteBuf| {
w.push_slice(&asn1::write(|w| {
w.write_tlv(tag_a0, |w| {
w.write_tlv(tag_a0, None, |w: &mut asn1::WriteBuf| {
w.push_slice(&asn1::write(|w| {
w.write_tlv(tag_86, |b| b.push_slice(self.url.as_bytes()))?;
w.write_tlv(tag_86, None, |b| {
b.push_slice(self.url.as_bytes())
})?;
Ok(())
})?)
})?;

View File

@@ -13,10 +13,10 @@ use openssl::pkey::{PKey, Private};
use openssl::x509::extension::{
BasicConstraints, ExtendedKeyUsage, KeyUsage, SubjectAlternativeName, SubjectKeyIdentifier,
};
use openssl::x509::{CrlStatus, X509Crl, X509Name, X509NameBuilder, X509Req, X509};
use openssl::x509::{CrlStatus, X509, X509Crl, X509Name, X509NameBuilder, X509Req};
use openssl_sys::{
X509_CRL_add0_revoked, X509_CRL_new, X509_CRL_set1_lastUpdate, X509_CRL_set1_nextUpdate,
X509_CRL_set_issuer_name, X509_CRL_set_version, X509_CRL_sign, X509_REVOKED_dup,
X509_CRL_add0_revoked, X509_CRL_new, X509_CRL_set_issuer_name, X509_CRL_set_version,
X509_CRL_set1_lastUpdate, X509_CRL_set1_nextUpdate, X509_CRL_sign, X509_REVOKED_dup,
X509_REVOKED_new, X509_REVOKED_set_revocationDate, X509_REVOKED_set_serialNumber,
};
@@ -174,17 +174,16 @@ fn gen_certificate(req: GenCertificateReq) -> anyhow::Result<(Option<Vec<u8>>, V
cert_builder.set_not_after(&not_after)?;
// Specify CRL URL
if let Some(issuer) = req.issuer {
if let Some(crl) = &issuer.crl {
let crl_url = format!(
"{}/pki/{}",
AppConfig::get().unsecure_origin(),
crl.file_name().unwrap().to_string_lossy()
);
if let Some(issuer) = req.issuer
&& let Some(crl) = &issuer.crl
{
let crl_url = format!(
"{}/pki/{}",
AppConfig::get().unsecure_origin(),
crl.file_name().unwrap().to_string_lossy()
);
cert_builder
.append_extension(CRLDistributionPointExt { url: crl_url }.as_extension()?)?;
}
cert_builder.append_extension(CRLDistributionPointExt { url: crl_url }.as_extension()?)?;
}
// If cert is a CA or not
@@ -424,12 +423,12 @@ fn refresh_crl(d: &CertData, new_cert: Option<&X509>) -> anyhow::Result<()> {
}
// Add old entries
if let Some(old_crl) = old_crl {
if let Some(entries) = old_crl.get_revoked() {
for entry in entries {
if X509_CRL_add0_revoked(crl, X509_REVOKED_dup(entry.as_ptr())) == 0 {
return Err(PKIError::GenCRLError("X509_CRL_add0_revoked").into());
}
if let Some(old_crl) = old_crl
&& let Some(entries) = old_crl.get_revoked()
{
for entry in entries {
if X509_CRL_add0_revoked(crl, X509_REVOKED_dup(entry.as_ptr())) == 0 {
return Err(PKIError::GenCRLError("X509_CRL_add0_revoked").into());
}
}
}

View File

@@ -325,9 +325,11 @@ mod tests {
..Default::default()
};
dep_cycle_1.depends_on = vec![dep_cycle_3.id];
assert!(dep_cycle_1
.error(&[dep_cycle_2.clone(), dep_cycle_3.clone()])
.is_some());
assert!(
dep_cycle_1
.error(&[dep_cycle_2.clone(), dep_cycle_3.clone()])
.is_some()
);
dep_cycle_1.depends_on = vec![];
assert!(dep_cycle_1.error(&[dep_cycle_2, dep_cycle_3]).is_none());
@@ -351,21 +353,29 @@ mod tests {
..Default::default()
};
assert!(target_relay
.error(&[other_dep.clone(), second_dep.clone()])
.is_some());
assert!(target_relay
.error(&[other_dep.clone(), second_dep.clone(), target_relay.clone()])
.is_some());
assert!(
target_relay
.error(&[other_dep.clone(), second_dep.clone()])
.is_some()
);
assert!(
target_relay
.error(&[other_dep.clone(), second_dep.clone(), target_relay.clone()])
.is_some()
);
second_dep.conflicts_with = vec![];
assert!(target_relay
.error(&[other_dep.clone(), second_dep.clone()])
.is_none());
assert!(target_relay
.error(&[other_dep.clone(), second_dep.clone(), target_relay.clone()])
.is_none());
assert!(
target_relay
.error(&[other_dep.clone(), second_dep.clone()])
.is_none()
);
assert!(
target_relay
.error(&[other_dep.clone(), second_dep.clone(), target_relay.clone()])
.is_none()
);
// self loop
let mut self_loop = DeviceRelay {

View File

@@ -4,7 +4,7 @@ use crate::devices::device::{
Device, DeviceGeneralInfo, DeviceId, DeviceInfo, DeviceRelay, DeviceRelayID,
};
use crate::utils::time_utils::time_secs;
use openssl::x509::{X509Req, X509};
use openssl::x509::{X509, X509Req};
use std::collections::HashMap;
#[derive(thiserror::Error, Debug)]

View File

@@ -1,5 +1,5 @@
use crate::app_config::{AppConfig, ConsumptionBackend};
use rand::{thread_rng, Rng};
use rand::{Rng, rng};
use std::num::ParseIntError;
use std::path::Path;
@@ -49,7 +49,7 @@ pub async fn get_curr_consumption() -> anyhow::Result<EnergyConsumption> {
match backend {
ConsumptionBackend::Constant { value } => Ok(*value),
ConsumptionBackend::Random { min, max } => Ok(thread_rng().gen_range(*min..*max)),
ConsumptionBackend::Random { min, max } => Ok(rng().random_range(*min..*max)),
ConsumptionBackend::File { path } => {
let path = Path::new(path);

View File

@@ -8,7 +8,7 @@ use crate::energy::consumption;
use crate::energy::consumption::EnergyConsumption;
use crate::energy::consumption_cache::ConsumptionCache;
use crate::energy::consumption_history_file::ConsumptionHistoryFile;
use crate::energy::engine::EnergyEngine;
use crate::energy::engine::{EnergyEngine, RelayForcedState};
use crate::utils::time_utils::time_secs;
use actix::prelude::*;
use openssl::x509::X509Req;
@@ -328,6 +328,19 @@ impl Handler<UpdateDeviceRelay> for EnergyActor {
}
}
#[derive(Message)]
#[rtype(result = "anyhow::Result<()>")]
pub struct SetRelayForcedState(pub DeviceRelayID, pub RelayForcedState);
impl Handler<SetRelayForcedState> for EnergyActor {
type Result = anyhow::Result<()>;
fn handle(&mut self, msg: SetRelayForcedState, _ctx: &mut Context<Self>) -> Self::Result {
self.engine.relay_state(msg.0).set_forced(msg.1);
Ok(())
}
}
/// Delete a device relay
#[derive(Message)]
#[rtype(result = "anyhow::Result<()>")]
@@ -408,6 +421,7 @@ pub struct ResRelayState {
pub id: DeviceRelayID,
pub on: bool,
pub r#for: usize,
pub forced_state: RelayForcedState,
}
/// Get the state of all relays
@@ -427,6 +441,7 @@ impl Handler<GetAllRelaysState> for EnergyActor {
id: d.id,
on: state.is_on(),
r#for: state.state_for(),
forced_state: state.actual_forced_state(),
})
}

View File

@@ -1,7 +1,7 @@
use std::collections::HashMap;
use crate::app_config::AppConfig;
use prettytable::{row, Table};
use prettytable::{Table, row};
use crate::constants;
use crate::devices::device::{Device, DeviceId, DeviceRelay, DeviceRelayID};
@@ -25,19 +25,83 @@ impl DeviceState {
}
}
#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type")]
pub enum SetRelayForcedStateReq {
#[default]
None,
Off {
for_secs: u64,
},
On {
for_secs: u64,
},
}
impl SetRelayForcedStateReq {
pub fn to_forced_state(&self) -> RelayForcedState {
match &self {
SetRelayForcedStateReq::None => RelayForcedState::None,
SetRelayForcedStateReq::Off { for_secs } => RelayForcedState::Off {
until: time_secs() + for_secs,
},
SetRelayForcedStateReq::On { for_secs } => RelayForcedState::On {
until: time_secs() + for_secs,
},
}
}
}
#[derive(Default, Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type")]
pub enum RelayForcedState {
#[default]
None,
Off {
until: u64,
},
On {
until: u64,
},
}
#[derive(Default, Clone)]
pub struct RelayState {
on: bool,
since: usize,
forced_state: RelayForcedState,
}
impl RelayState {
/// Get actual forced state (returns None if state is expired)
pub fn actual_forced_state(&self) -> RelayForcedState {
match self.forced_state {
RelayForcedState::Off { until } if until > time_secs() => {
RelayForcedState::Off { until }
}
RelayForcedState::On { until } if until > time_secs() => RelayForcedState::On { until },
_ => RelayForcedState::None,
}
}
pub fn is_on(&self) -> bool {
self.on
let forced_state = self.actual_forced_state();
(self.on || matches!(forced_state, RelayForcedState::On { .. }))
&& !matches!(forced_state, RelayForcedState::Off { .. })
}
fn is_off(&self) -> bool {
!self.on
!self.is_on()
}
/// Check if relay state is enforced
pub fn is_forced(&self) -> bool {
self.actual_forced_state() != RelayForcedState::None
}
pub fn set_forced(&mut self, s: RelayForcedState) {
self.since = time_secs() as usize;
self.forced_state = s;
}
pub fn state_for(&self) -> usize {
@@ -146,7 +210,11 @@ impl EnergyEngine {
r.name,
r.consumption,
format!("{} / {}", r.minimal_downtime, r.minimal_uptime),
status.is_on().to_string(),
status.is_on().to_string()
+ match status.is_forced() {
true => " (Forced)",
false => "",
},
status.since,
match dev_online {
true => "Online",
@@ -192,19 +260,28 @@ impl EnergyEngine {
let mut new_relays_state = self.relays_state.clone();
// Forcefully turn off relays that belongs to offline devices
// Forcefully turn off disabled relays
for d in devices {
if !self.device_state(&d.id).is_online() {
for r in &d.relays {
for r in &d.relays {
if !r.enabled || !d.enabled {
new_relays_state.get_mut(&r.id).unwrap().on = false;
}
}
}
// Forcefully turn off disabled relays
// Apply forced relays state
for d in devices {
for r in &d.relays {
if !r.enabled || !d.enabled {
if self.relay_state(r.id).is_forced() {
new_relays_state.get_mut(&r.id).unwrap().on = self.relay_state(r.id).is_on();
}
}
}
// Forcefully turn off relays that belongs to offline devices
for d in devices {
if !self.device_state(&d.id).is_online() {
for r in &d.relays {
new_relays_state.get_mut(&r.id).unwrap().on = false;
}
}
@@ -216,7 +293,9 @@ impl EnergyEngine {
for d in devices {
for r in &d.relays {
if new_relays_state.get(&r.id).unwrap().is_off() {
if new_relays_state.get(&r.id).unwrap().is_off()
|| new_relays_state.get(&r.id).unwrap().is_forced()
{
continue;
}
@@ -240,7 +319,7 @@ impl EnergyEngine {
for d in devices {
for r in &d.relays {
let state = new_relays_state.get(&r.id).unwrap();
if state.is_off() {
if state.is_off() || state.is_forced() {
continue;
}
@@ -271,7 +350,9 @@ impl EnergyEngine {
continue;
}
if new_relays_state.get(&r.id).unwrap().is_on() {
if new_relays_state.get(&r.id).unwrap().is_on()
|| new_relays_state.get(&r.id).unwrap().is_forced()
{
continue;
}
@@ -289,12 +370,16 @@ impl EnergyEngine {
continue;
}
log::info!("Forcefully turn on relay {} to catch up running constraints (only {}s this day)", r.name, total_runtime);
log::info!(
"Forcefully turn on relay {} to catch up running constraints (only {}s this day)",
r.name,
total_runtime
);
new_relays_state.get_mut(&r.id).unwrap().on = true;
}
}
// Order relays
// Order relays to select the ones with the most elevated priorities
let mut ordered_relays = devices
.iter()
.filter(|d| self.device_state(&d.id).is_online() && d.enabled)
@@ -304,10 +389,13 @@ impl EnergyEngine {
ordered_relays.sort_by_key(|r| r.priority);
ordered_relays.reverse();
// Select relays to start, starting with those with highest priorities
loop {
let mut changed = false;
for relay in &ordered_relays {
if new_relays_state.get(&relay.id).unwrap().is_on() {
if new_relays_state.get(&relay.id).unwrap().is_on()
|| new_relays_state.get(&relay.id).unwrap().is_forced()
{
continue;
}
@@ -379,7 +467,7 @@ impl EnergyEngine {
mod test {
use crate::devices::device::{Device, DeviceId, DeviceRelayID};
use crate::energy::consumption::EnergyConsumption;
use crate::energy::engine::EnergyEngine;
use crate::energy::engine::{EnergyEngine, SetRelayForcedStateReq};
use crate::utils::time_utils::time_secs;
use rust_embed::Embed;
@@ -388,6 +476,8 @@ mod test {
id: DeviceRelayID,
on: bool,
r#for: usize,
#[serde(default)]
forced_state: SetRelayForcedStateReq,
should_be_on: bool,
}
@@ -435,6 +525,7 @@ mod test {
let s = engine.relay_state(r.id);
s.on = r.on;
s.since = time_secs() as usize - r.r#for;
s.forced_state = r.forced_state.to_forced_state()
}
}

View File

@@ -1,7 +1,7 @@
use crate::app_config::AppConfig;
use crate::devices::device::{DeviceRelay, DeviceRelayID};
use crate::utils::files_utils;
use crate::utils::time_utils::{day_number, time_start_of_day};
use crate::utils::time_utils::{day_number, time_secs, time_start_of_day};
const TIME_INTERVAL: usize = 30;
@@ -128,15 +128,26 @@ pub fn relay_total_runtime_adjusted(relay: &DeviceRelay) -> usize {
.unwrap_or(0);
let time_start_day = time_start_of_day().unwrap_or(1726696800);
let start_time = time_start_day + reset_time as u64;
let end_time = time_start_day + 3600 * 24 + reset_time as u64;
relay_total_runtime(relay.id, start_time, end_time).unwrap_or(3600 * 24)
// Check if we have reached reset_time today yet or not
if time_start_day + reset_time as u64 <= time_secs() {
let start_time = time_start_day + reset_time as u64;
let end_time = time_start_day + 3600 * 24 + reset_time as u64;
relay_total_runtime(relay.id, start_time, end_time).unwrap_or(3600 * 24)
}
// If we have not reached reset time yet, we need to focus on previous day
else {
let time_start_yesterday = time_start_day - 3600 * 24;
let start_time = time_start_yesterday + reset_time as u64;
let end_time = time_start_day + reset_time as u64;
relay_total_runtime(relay.id, start_time, end_time).unwrap_or(3600 * 24)
}
}
#[cfg(test)]
mod tests {
use crate::devices::device::DeviceRelayID;
use crate::energy::relay_state_history::{relay_total_runtime, RelayStateHistory};
use crate::energy::relay_state_history::{RelayStateHistory, relay_total_runtime};
#[test]
fn test_relay_state_history() {

View File

@@ -35,7 +35,7 @@ pub fn save_log(
.as_bytes(),
)?;
file.flush()?;
file.unlock()?;
fs4::fs_std::FileExt::unlock(&file)?;
Ok(())
}

View File

@@ -5,7 +5,7 @@ use central_backend::energy::energy_actor::EnergyActor;
use central_backend::server::servers;
use central_backend::utils::files_utils::create_directory_if_missing;
use futures::future;
use tokio_schedule::{every, Job};
use tokio_schedule::{Job, every};
#[actix_web::main]
async fn main() -> std::io::Result<()> {

View File

@@ -1,5 +1,5 @@
use actix_identity::Identity;
use std::future::{ready, Ready};
use std::future::{Ready, ready};
use std::rc::Rc;
use crate::app_config::AppConfig;
@@ -7,8 +7,8 @@ use crate::constants;
use actix_web::body::EitherBody;
use actix_web::dev::Payload;
use actix_web::{
dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform},
Error, FromRequest, HttpResponse,
dev::{Service, ServiceRequest, ServiceResponse, Transform, forward_ready},
};
use futures_util::future::LocalBoxFuture;

View File

@@ -1,9 +1,8 @@
use actix_web::HttpResponse;
use actix_web::body::BoxBody;
use actix_web::http::StatusCode;
use actix_web::HttpResponse;
use std::error::Error;
use std::fmt::{Display, Formatter};
use std::io::ErrorKind;
use zip::result::ZipError;
/// Custom error to ease controller writing
@@ -32,7 +31,7 @@ impl actix_web::error::ResponseError for HttpErr {
}
}
fn error_response(&self) -> HttpResponse<BoxBody> {
log::error!("Error while processing request! {}", self);
log::error!("Error while processing request! {self}");
HttpResponse::InternalServerError().body("Failed to execute request!")
}
@@ -52,7 +51,7 @@ impl From<serde_json::Error> for HttpErr {
impl From<Box<dyn Error>> for HttpErr {
fn from(value: Box<dyn Error>) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
@@ -82,43 +81,43 @@ impl From<reqwest::header::ToStrError> for HttpErr {
impl From<actix_web::Error> for HttpErr {
fn from(value: actix_web::Error) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<actix::MailboxError> for HttpErr {
fn from(value: actix::MailboxError) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<actix_identity::error::GetIdentityError> for HttpErr {
fn from(value: actix_identity::error::GetIdentityError) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<actix_identity::error::LoginError> for HttpErr {
fn from(value: actix_identity::error::LoginError) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<openssl::error::ErrorStack> for HttpErr {
fn from(value: openssl::error::ErrorStack) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<ZipError> for HttpErr {
fn from(value: ZipError) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}
impl From<walkdir::Error> for HttpErr {
fn from(value: walkdir::Error) -> Self {
HttpErr::Err(std::io::Error::new(ErrorKind::Other, value.to_string()).into())
HttpErr::Err(std::io::Error::other(value.to_string()).into())
}
}

View File

@@ -1,11 +1,11 @@
use crate::logs::logs_manager;
use crate::logs::severity::LogSeverity;
use crate::server::WebEnergyActor;
use crate::server::custom_error::HttpResult;
use crate::server::devices_api::jwt_parser::JWTRequest;
use crate::server::WebEnergyActor;
use actix_web::{web, HttpResponse};
use actix_web::{HttpResponse, web};
#[derive(Debug, serde::Deserialize)]
#[derive(Debug, serde::Deserialize, Clone)]
pub struct LogRequest {
severity: LogSeverity,
message: String,

View File

@@ -1,7 +1,7 @@
use crate::ota::ota_manager;
use crate::ota::ota_update::OTAPlatform;
use crate::server::custom_error::HttpResult;
use actix_web::{web, HttpResponse};
use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)]
pub struct FirmwarePath {

View File

@@ -30,7 +30,7 @@ pub struct JWTRequest {
}
impl JWTRequest {
pub async fn parse_jwt<E: DeserializeOwned>(
pub async fn parse_jwt<E: DeserializeOwned + std::clone::Clone>(
&self,
actor: WebEnergyActor,
) -> anyhow::Result<(Device, E)> {

View File

@@ -4,10 +4,10 @@ use crate::energy::energy_actor;
use crate::energy::energy_actor::RelaySyncStatus;
use crate::ota::ota_manager;
use crate::ota::ota_update::OTAPlatform;
use crate::server::WebEnergyActor;
use crate::server::custom_error::HttpResult;
use crate::server::devices_api::jwt_parser::JWTRequest;
use crate::server::WebEnergyActor;
use actix_web::{web, HttpResponse};
use actix_web::{HttpResponse, web};
use openssl::nid::Nid;
use openssl::x509::X509Req;
use std::str::FromStr;
@@ -130,7 +130,7 @@ pub async fn get_certificate(query: web::Query<ReqWithDevID>, actor: WebEnergyAc
.body(cert))
}
#[derive(Debug, serde::Serialize, serde::Deserialize)]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
struct Claims {
info: DeviceInfo,
}
@@ -155,12 +155,11 @@ pub async fn sync_device(body: web::Json<JWTRequest>, actor: WebEnergyActor) ->
let mut available_update = None;
// Check if the version is available
if let Some(desired) = device.desired_version {
if claims.info.version < desired
&& ota_manager::update_exists(OTAPlatform::from_str(&claims.info.reference)?, &desired)?
{
available_update = Some(desired);
}
if let Some(desired) = device.desired_version
&& claims.info.version < desired
&& ota_manager::update_exists(OTAPlatform::from_str(&claims.info.reference)?, &desired)?
{
available_update = Some(desired);
}
Ok(HttpResponse::Ok().json(SyncResult {

View File

@@ -10,14 +10,14 @@ use crate::server::unsecure_server::*;
use crate::server::web_api::*;
use crate::server::web_app_controller;
use actix_cors::Cors;
use actix_identity::config::LogoutBehaviour;
use actix_identity::IdentityMiddleware;
use actix_identity::config::LogoutBehavior;
use actix_remote_ip::RemoteIPConfig;
use actix_session::storage::CookieSessionStore;
use actix_session::SessionMiddleware;
use actix_session::storage::CookieSessionStore;
use actix_web::cookie::{Key, SameSite};
use actix_web::middleware::Logger;
use actix_web::{web, App, HttpServer};
use actix_web::{App, HttpServer, web};
use openssl::ssl::{SslAcceptor, SslMethod};
use std::time::Duration;
@@ -84,7 +84,7 @@ pub async fn secure_server(energy_actor: EnergyActorAddr) -> anyhow::Result<()>
.build();
let identity_middleware = IdentityMiddleware::builder()
.logout_behaviour(LogoutBehaviour::PurgeSession)
.logout_behavior(LogoutBehavior::PurgeSession)
.visit_deadline(Some(Duration::from_secs(
constants::MAX_INACTIVITY_DURATION,
)))
@@ -231,6 +231,10 @@ pub async fn secure_server(energy_actor: EnergyActorAddr) -> anyhow::Result<()>
"/web_api/relay/{id}",
web::put().to(relays_controller::update),
)
.route(
"/web_api/relay/{id}/forced_state",
web::put().to(relays_controller::set_forced_state),
)
.route(
"/web_api/relay/{id}",
web::delete().to(relays_controller::delete),

View File

@@ -1,6 +1,6 @@
use crate::app_config::AppConfig;
use crate::server::custom_error::HttpResult;
use actix_web::{web, HttpResponse};
use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)]
pub struct ServeCRLPath {

View File

@@ -1,8 +1,8 @@
use crate::devices::device::DeviceRelayID;
use crate::energy::{energy_actor, relay_state_history};
use crate::server::custom_error::HttpResult;
use crate::server::WebEnergyActor;
use actix_web::{web, HttpResponse};
use crate::server::custom_error::HttpResult;
use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)]
pub struct LegacyStateRelay {

View File

@@ -2,7 +2,7 @@ use crate::app_config::AppConfig;
use crate::server::custom_error::HttpResult;
use actix_identity::Identity;
use actix_remote_ip::RemoteIP;
use actix_web::{web, HttpMessage, HttpRequest, HttpResponse};
use actix_web::{HttpMessage, HttpRequest, HttpResponse, web};
#[derive(serde::Deserialize)]
pub struct AuthRequest {
@@ -17,11 +17,11 @@ pub async fn password_auth(
remote_ip: RemoteIP,
) -> HttpResult {
if r.user != AppConfig::get().admin_username || r.password != AppConfig::get().admin_password {
log::error!("Failed login attempt from {}!", remote_ip.0.to_string());
log::error!("Failed login attempt from {}!", remote_ip.0);
return Ok(HttpResponse::Unauthorized().json("Invalid credentials!"));
}
log::info!("Successful login attempt from {}!", remote_ip.0.to_string());
log::info!("Successful login attempt from {}!", remote_ip.0);
Identity::login(&request.extensions(), r.user.to_string())?;
Ok(HttpResponse::Ok().finish())
}

View File

@@ -1,8 +1,8 @@
use crate::devices::device::{DeviceGeneralInfo, DeviceId};
use crate::energy::energy_actor;
use crate::server::custom_error::HttpResult;
use crate::server::WebEnergyActor;
use actix_web::{web, HttpResponse};
use crate::server::custom_error::HttpResult;
use actix_web::{HttpResponse, web};
/// Get the list of pending (not accepted yet) devices
pub async fn list_pending(actor: WebEnergyActor) -> HttpResult {

View File

@@ -2,8 +2,8 @@ use crate::app_config::ConsumptionHistoryType;
use crate::energy::consumption::EnergyConsumption;
use crate::energy::consumption_history_file::ConsumptionHistoryFile;
use crate::energy::{consumption, energy_actor};
use crate::server::custom_error::HttpResult;
use crate::server::WebEnergyActor;
use crate::server::custom_error::HttpResult;
use crate::utils::time_utils::time_secs;
use actix_web::HttpResponse;

View File

@@ -3,7 +3,7 @@ use crate::logs::logs_manager;
use crate::logs::severity::LogSeverity;
use crate::server::custom_error::HttpResult;
use crate::utils::time_utils::curr_day_number;
use actix_web::{web, HttpResponse};
use actix_web::{HttpResponse, web};
#[derive(serde::Deserialize)]
pub struct LogRequest {

View File

@@ -3,11 +3,11 @@ use crate::devices::device::DeviceId;
use crate::energy::energy_actor;
use crate::ota::ota_manager;
use crate::ota::ota_update::OTAPlatform;
use crate::server::custom_error::HttpResult;
use crate::server::WebEnergyActor;
use actix_multipart::form::tempfile::TempFile;
use crate::server::custom_error::HttpResult;
use actix_multipart::form::MultipartForm;
use actix_web::{web, HttpResponse};
use actix_multipart::form::tempfile::TempFile;
use actix_web::{HttpResponse, web};
pub async fn supported_platforms() -> HttpResult {
Ok(HttpResponse::Ok().json(OTAPlatform::supported_platforms()))
@@ -123,17 +123,17 @@ pub async fn set_desired_version(
for d in devices {
// Filter per platform
if let Some(p) = body.platform {
if d.info.reference != p.to_string() {
continue;
}
if let Some(p) = body.platform
&& d.info.reference != p.to_string()
{
continue;
}
// Filter per device
if let Some(ids) = &body.devices {
if !ids.contains(&d.id) {
continue;
}
if let Some(ids) = &body.devices
&& !ids.contains(&d.id)
{
continue;
}
actor

View File

@@ -1,8 +1,9 @@
use crate::devices::device::{DeviceId, DeviceRelay, DeviceRelayID};
use crate::energy::energy_actor;
use crate::server::custom_error::HttpResult;
use crate::energy::engine::SetRelayForcedStateReq;
use crate::server::WebEnergyActor;
use actix_web::{web, HttpResponse};
use crate::server::custom_error::HttpResult;
use actix_web::{HttpResponse, web};
/// Get the full list of relays
pub async fn get_list(actor: WebEnergyActor) -> HttpResult {
@@ -85,6 +86,29 @@ pub async fn update(
Ok(HttpResponse::Accepted().finish())
}
/// Set relay forced status
pub async fn set_forced_state(
actor: WebEnergyActor,
req: web::Json<SetRelayForcedStateReq>,
path: web::Path<RelayIDInPath>,
) -> HttpResult {
// Check if relay exists first
let list = actor.send(energy_actor::GetAllRelaysState).await?;
if !list.into_iter().any(|r| r.id == path.id) {
return Ok(HttpResponse::NotFound().json("Relay not found!"));
};
// Update relay forced state
actor
.send(energy_actor::SetRelayForcedState(
path.id,
req.to_forced_state(),
))
.await??;
Ok(HttpResponse::Accepted().finish())
}
/// Delete an existing relay
pub async fn delete(actor: WebEnergyActor, path: web::Path<RelayIDInPath>) -> HttpResult {
actor

View File

@@ -19,7 +19,7 @@ mod serve_static_debug {
#[cfg(not(debug_assertions))]
mod serve_static_release {
use actix_web::{web, HttpResponse, Responder};
use actix_web::{HttpResponse, Responder, web};
use rust_embed::RustEmbed;
#[derive(RustEmbed)]

View File

@@ -1,7 +1,7 @@
use chrono::prelude::*;
use std::time::{SystemTime, UNIX_EPOCH};
/// Get the current time since epoch
/// Get the current time since epoch, in seconds
pub fn time_secs() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)

View File

@@ -0,0 +1,28 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)

File diff suppressed because it is too large Load Diff

View File

@@ -6,38 +6,40 @@
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.13.0",
"@fontsource/roboto": "^5.1.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@fontsource/roboto": "^5.2.8",
"@mdi/js": "^7.4.47",
"@mdi/react": "^1.6.1",
"@mui/icons-material": "^6.1.4",
"@mui/material": "^6.1.4",
"@mui/x-charts": "^7.21.0",
"@mui/x-date-pickers": "^7.21.0",
"@types/semver": "^7.5.8",
"date-and-time": "^3.6.0",
"dayjs": "^1.11.13",
"filesize": "^10.1.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^7.0.0",
"semver": "^7.6.3"
"@mui/icons-material": "^7.3.4",
"@mui/material": "^7.3.4",
"@mui/x-charts": "^8.15.0",
"@mui/x-date-pickers": "^8.15.0",
"date-and-time": "^4.1.0",
"dayjs": "^1.11.18",
"filesize": "^11.0.13",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router-dom": "^7.9.4",
"semver": "^7.7.3"
},
"devDependencies": {
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
"@typescript-eslint/eslint-plugin": "^8.15.0",
"@typescript-eslint/parser": "^8.10.0",
"@vitejs/plugin-react": "^4.3.2",
"eslint": "^9.0.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.12",
"typescript": "^5.6.3",
"vite": "^5.4.9"
"@types/react": "^19.2.2",
"@types/react-dom": "^19.2.2",
"@types/semver": "^7.7.1",
"@typescript-eslint/eslint-plugin": "^8.46.2",
"@typescript-eslint/parser": "^8.46.2",
"@vitejs/plugin-react": "^5.1.0",
"eslint": "^9.38.0",
"eslint-plugin-react-hooks": "^7.0.1",
"eslint-plugin-react-refresh": "^0.4.24",
"globals": "^16.4.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.46.2",
"vite": "^7.1.12"
}
}

View File

@@ -1,10 +1,19 @@
import { APIClient } from "./ApiClient";
import { Device, DeviceRelay } from "./DeviceApi";
export type RelayForcedState =
| { type: "None" }
| { type: "Off" | "On"; until: number };
export type SetRelayForcedState =
| { type: "None" }
| { type: "Off" | "On"; for_secs: number };
export interface RelayStatus {
id: string;
on: boolean;
for: number;
forced_state: RelayForcedState;
}
export type RelaysStatus = Map<string, RelayStatus>;
@@ -48,6 +57,20 @@ export class RelayApi {
});
}
/**
* Set relay forced state
*/
static async SetForcedState(
relay: DeviceRelay,
forced: SetRelayForcedState
): Promise<void> {
await APIClient.exec({
method: "PUT",
uri: `/relay/${relay.id}/forced_state`,
jsonData: forced,
});
}
/**
* Delete a relay configuration
*/

View File

@@ -84,7 +84,7 @@ export function DeployOTAUpdateDialogProvider(p: {
</DialogContentText>
<FormControl>
<FormLabel>Gender</FormLabel>
<FormLabel>Deployment target</FormLabel>
<RadioGroup
name="radio-buttons-group"
value={allDevices}

View File

@@ -6,7 +6,7 @@ import {
DialogTitle,
Typography,
} from "@mui/material";
import Grid from "@mui/material/Grid2";
import Grid from "@mui/material/Grid";
import { TimePicker } from "@mui/x-date-pickers";
import React from "react";
import { Device, DeviceRelay } from "../api/DeviceApi";

View File

@@ -0,0 +1,53 @@
import {
Button,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
TextField,
} from "@mui/material";
import { DeviceRelay } from "../api/DeviceApi";
import React from "react";
export function SelectForcedStateDurationDialog(p: {
relay: DeviceRelay;
forcedState: string;
onCancel: () => void;
onSubmit: (duration: number) => void;
}): React.ReactElement {
const [duration, setDuration] = React.useState(60);
return (
<Dialog open onClose={p.onCancel}>
<DialogTitle>Set forced relay state</DialogTitle>
<DialogContent>
<DialogContentText>
Please specify the number of minutes the relay <i>{p.relay.name}</i>{" "}
will remain in forced state <i>{p.forcedState}</i>:
</DialogContentText>
<TextField
label="Duration (min)"
variant="standard"
value={Math.floor(duration / 60)}
onChange={(e) => {
const val = Number.parseInt(e.target.value);
setDuration((Number.isNaN(val) ? 1 : val) * 60);
}}
fullWidth
style={{ marginTop: "5px" }}
/>
<p>Equivalent in seconds: {duration} secs</p>
<p>Equivalent in hours: {duration / 3600} hours</p>
</DialogContent>
<DialogActions>
<Button onClick={p.onCancel}>Cancel</Button>
<Button onClick={() => p.onSubmit(duration)} autoFocus>
Start timer
</Button>
</DialogActions>
</Dialog>
);
}

View File

@@ -10,16 +10,16 @@ import {
} from "@mui/material";
import React from "react";
import { Device, DeviceRelay } from "../../api/DeviceApi";
import { RelayApi, RelayStatus } from "../../api/RelayApi";
import { EditDeviceRelaysDialog } from "../../dialogs/EditDeviceRelaysDialog";
import { DeviceRouteCard } from "./DeviceRouteCard";
import { useAlert } from "../../hooks/context_providers/AlertDialogProvider";
import { useConfirm } from "../../hooks/context_providers/ConfirmDialogProvider";
import { useLoadingMessage } from "../../hooks/context_providers/LoadingMessageProvider";
import { RelayApi, RelayStatus } from "../../api/RelayApi";
import { useSnackbar } from "../../hooks/context_providers/SnackbarProvider";
import { useAlert } from "../../hooks/context_providers/AlertDialogProvider";
import { AsyncWidget } from "../../widgets/AsyncWidget";
import { TimeWidget } from "../../widgets/TimeWidget";
import { BoolText } from "../../widgets/BoolText";
import { TimeWidget } from "../../widgets/TimeWidget";
import { DeviceRouteCard } from "./DeviceRouteCard";
export function DeviceRelays(p: {
device: Device;
@@ -145,7 +145,8 @@ function RelayEntryStatus(
errMsg="Failed to load relay status!"
build={() => (
<>
<BoolText val={state!.on} positive="ON" negative="OFF" /> for{" "}
<BoolText val={state!.on} positive="ON" negative="OFF" />{" "}
{state?.forced_state.type !== "None" && <b>Forced</b>} for{" "}
<TimeWidget diff time={state!.for} />
</>
)}

View File

@@ -1,7 +1,7 @@
import DeleteIcon from "@mui/icons-material/Delete";
import RefreshIcon from "@mui/icons-material/Refresh";
import { IconButton, Tooltip } from "@mui/material";
import Grid from "@mui/material/Grid2";
import Grid from "@mui/material/Grid";
import React from "react";
import { useNavigate, useParams } from "react-router-dom";
import { Device, DeviceApi } from "../../api/DeviceApi";

View File

@@ -1,6 +1,6 @@
import { Typography } from "@mui/material";
import { CurrConsumptionWidget } from "./HomeRoute/CurrConsumptionWidget";
import Grid from "@mui/material/Grid2";
import Grid from "@mui/material/Grid";
import { CachedConsumptionWidget } from "./HomeRoute/CachedConsumptionWidget";
import { RelayConsumptionWidget } from "./HomeRoute/RelayConsumptionWidget";
import { RelaysListRoute } from "./RelaysListRoute";

View File

@@ -11,7 +11,7 @@ import Typography from "@mui/material/Typography";
import * as React from "react";
import { useLoadingMessage } from "../hooks/context_providers/LoadingMessageProvider";
import { AuthApi } from "../api/AuthApi";
import Grid from "@mui/material/Grid2";
import Grid from "@mui/material/Grid";
function Copyright(props: any) {
return (

View File

@@ -16,12 +16,13 @@ import React from "react";
import { useNavigate } from "react-router-dom";
import { Device, DeviceApi, DeviceRelay, DeviceURL } from "../api/DeviceApi";
import { RelayApi, RelaysStatus } from "../api/RelayApi";
import { ServerApi } from "../api/ServerApi";
import { AsyncWidget } from "../widgets/AsyncWidget";
import { BoolText } from "../widgets/BoolText";
import { CopyToClipboard } from "../widgets/CopyToClipboard";
import { RelayForcedState } from "../widgets/RelayForcedState";
import { SolarEnergyRouteContainer } from "../widgets/SolarEnergyRouteContainer";
import { TimeWidget } from "../widgets/TimeWidget";
import { CopyToClipboard } from "../widgets/CopyToClipboard";
import { ServerApi } from "../api/ServerApi";
export function RelaysListRoute(p: {
homeWidget?: boolean;
@@ -104,6 +105,7 @@ function RelaysList(p: {
<TableCell>Priority</TableCell>
<TableCell>Consumption</TableCell>
<TableCell>Status</TableCell>
<TableCell>Forced state</TableCell>
<TableCell></TableCell>
</TableRow>
</TableHead>
@@ -129,6 +131,13 @@ function RelaysList(p: {
/>{" "}
for <TimeWidget diff time={p.status.get(row.id)!.for} />
</TableCell>
<TableCell>
<RelayForcedState
relay={row}
state={p.status.get(row.id)!}
onUpdated={p.onReload}
/>
</TableCell>
<TableCell>
<Tooltip title="Copy legacy api status">
<CopyToClipboard

View File

@@ -0,0 +1,79 @@
import { MenuItem, Select, SelectChangeEvent } from "@mui/material";
import { DeviceRelay } from "../api/DeviceApi";
import { RelayApi, RelayStatus, SetRelayForcedState } from "../api/RelayApi";
import { TimeWidget } from "./TimeWidget";
import { useLoadingMessage } from "../hooks/context_providers/LoadingMessageProvider";
import { useAlert } from "../hooks/context_providers/AlertDialogProvider";
import { useSnackbar } from "../hooks/context_providers/SnackbarProvider";
import React from "react";
import { SelectForcedStateDurationDialog } from "../dialogs/SelectForcedStateDurationDialog";
export function RelayForcedState(p: {
relay: DeviceRelay;
state: RelayStatus;
onUpdated: () => void;
}): React.ReactElement {
const loadingMessage = useLoadingMessage();
const alert = useAlert();
const snackbar = useSnackbar();
const [futureStateType, setFutureStateType] = React.useState<
string | undefined
>();
const handleChange = (event: SelectChangeEvent) => {
if (event.target.value == "None") {
submitChange({ type: "None" });
} else {
setFutureStateType(event.target.value);
}
};
const submitChange = async (state: SetRelayForcedState) => {
try {
loadingMessage.show("Setting forced state...");
await RelayApi.SetForcedState(p.relay, state);
p.onUpdated();
snackbar("Forced state successfully updated!");
} catch (e) {
console.error(`Failed to set relay forced state! ${e}`);
alert(`Failed to set loading state for relay! ${e}`);
} finally {
loadingMessage.hide();
}
};
return (
<>
<Select
value={p.state.forced_state.type}
onChange={handleChange}
size="small"
variant="standard"
>
<MenuItem value={"None"}>None</MenuItem>
<MenuItem value={"Off"}>Off</MenuItem>
<MenuItem value={"On"}>On</MenuItem>
</Select>
{p.state.forced_state.type !== "None" && (
<>
<TimeWidget future time={p.state.forced_state.until} /> left
</>
)}
{futureStateType !== undefined && (
<SelectForcedStateDurationDialog
{...p}
forcedState={futureStateType}
onCancel={() => setFutureStateType(undefined)}
onSubmit={(d) =>
submitChange({
type: futureStateType as any,
for_secs: d,
})
}
/>
)}
</>
);
}

View File

@@ -106,7 +106,7 @@ export default function StatCard({
<Box sx={{ width: "100%", height: 100 }}>
{data && interval && (
<SparkLineChart
colors={[chartColor]}
color={chartColor}
data={data}
area
showHighlight

View File

@@ -1,11 +1,11 @@
import { Tooltip } from "@mui/material";
import date from "date-and-time";
import { format } from "date-and-time";
import { time } from "../utils/DateUtils";
export function formatDate(time: number): string {
const t = new Date();
t.setTime(1000 * time);
return date.format(t, "DD/MM/YYYY HH:mm:ss");
return format(t, "DD/MM/YYYY HH:mm:ss");
}
export function timeDiff(a: number, b: number): string {
@@ -51,13 +51,14 @@ export function timeDiff(a: number, b: number): string {
return `${diffYears} years`;
}
export function timeDiffFromNow(t: number): string {
return timeDiff(t, time());
export function timeDiffFromNow(t: number, future?: boolean): string {
return future ? timeDiff(time(), t) : timeDiff(t, time());
}
export function TimeWidget(p: {
time?: number;
diff?: boolean;
future?: boolean;
}): React.ReactElement {
if (!p.time) return <></>;
return (
@@ -65,7 +66,9 @@ export function TimeWidget(p: {
title={formatDate(p.diff ? new Date().getTime() / 1000 - p.time : p.time)}
arrow
>
<span>{p.diff ? timeDiff(0, p.time) : timeDiffFromNow(p.time)}</span>
<span>
{p.diff ? timeDiff(0, p.time) : timeDiffFromNow(p.time, p.future)}
</span>
</Tooltip>
);
}

View File

@@ -1,6 +1,5 @@
{
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"target": "ES2020",
"useDefineForClassFields": true,
@@ -11,7 +10,6 @@
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
@@ -21,7 +19,8 @@
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"]
}

View File

@@ -1,11 +1,7 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.node.json"
}
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
]
}

View File

@@ -1,13 +1,24 @@
{
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"skipLibCheck": true,
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noEmit": true
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["vite.config.ts"]
}

View File

@@ -1,7 +1,7 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
})

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,12 @@
[package]
name = "custom_consumption"
version = "0.1.0"
edition = "2021"
edition = "2024"
[dependencies]
env_logger = "0.11.5"
log = "0.4.22"
clap = { version = "4.5.18", features = ["derive", "env"] }
egui = "0.29.1"
eframe = "0.29.1"
env_logger = "0.11.8"
log = "0.4.28"
clap = { version = "4.5.50", features = ["derive", "env"] }
egui = "0.32.3"
eframe = "0.32.3"
lazy_static = "1.5.0"

View File

@@ -1,5 +1,3 @@
#define CONFIG_ETH_USE_ESP32_EMAC
#include "esp_eth.h"
#include "esp_eth_mac.h"
#include "esp_eth_com.h"

View File

@@ -1 +1 @@
1.0.2
1.0.3

View File

@@ -1,9 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"packageRules": [
{
"matchUpdateTypes": ["major", "minor", "patch"],
"automerge": true
}
]
"extends": ["local>renovate/presets"]
}