From 970d02496bb4e56663d3e68d39b96f393f5afe19 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Mon, 24 Feb 2020 20:55:26 +0200 Subject: [PATCH 1/9] initial checkin --- .vscode/launch.json | 25 +++++++++++++++++++ .../demandshaper_controller.php | 2 +- demandshaper-module/general.js | 6 +++-- demandshaper-module/general.php | 6 +++++ demandshaper-module/scheduler.js | 7 +++++- demandshaper_run.php | 2 +- devices/Control/openevse.json | 6 +++++ readme.md | 2 ++ scheduler.php | 11 +++++--- 9 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..50e6a95 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Listen for XDebug", + "type": "php", + "request": "launch", + "port": 9000, + "xdebugSettings": { + "max_children": 999, + } + }, + { + "name": "Launch currently open script", + "type": "php", + "request": "launch", + "program": "${file}", + "cwd": "${fileDirname}", + "port": 9000 + } + ] +} \ No newline at end of file diff --git a/demandshaper-module/demandshaper_controller.php b/demandshaper-module/demandshaper_controller.php index 58d0d5d..dc991b6 100644 --- a/demandshaper-module/demandshaper_controller.php +++ b/demandshaper-module/demandshaper_controller.php @@ -109,7 +109,7 @@ function demandshaper_controller() if ($schedule->settings->ctrlmode=="smart") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); - $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone); + $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone,$schedule->settings->rununtilcompleteby); $schedule_log_output = "smart ".($schedule->runtime->timeleft/3600)." ".$schedule->settings->end; } else if ($schedule->settings->ctrlmode=="timer") { diff --git a/demandshaper-module/general.js b/demandshaper-module/general.js index 14d43ec..afed970 100644 --- a/demandshaper-module/general.js +++ b/demandshaper-module/general.js @@ -23,6 +23,7 @@ function load_device(device_id, device_name, device_type) period:3, end:8, interruptible:0, + rununtilcompleteby:0, // Timer mode timer_start1:0, timer_stop1:0, @@ -166,7 +167,7 @@ function load_device(device_id, device_name, device_type) if (js_calc) { if (schedule.settings.ctrlmode=="smart") { - schedule.runtime.periods = schedule_smart(forecast,schedule.settings.period*3600,schedule.settings.end,schedule.settings.interruptible,resolution) + schedule.runtime.periods = schedule_smart(forecast,schedule.settings.period*3600,schedule.settings.end,schedule.settings.interruptible,resolution,schedule.settings.rununtilcompleteby) } else if (schedule.settings.ctrlmode=="timer") { schedule.runtime.periods = schedule_timer(forecast,schedule.settings.timer_start1,schedule.settings.timer_stop1,schedule.settings.timer_start2,schedule.settings.timer_stop2,resolution) } else { @@ -252,7 +253,8 @@ function load_device(device_id, device_name, device_type) $(".weekly-scheduler[day="+i+"]").attr("val",schedule.settings.repeat[i]); } - $(".scheduler-checkbox[name='interruptible']").attr("state",schedule.settings.interruptible); + $(".scheduler-checkbox[name='interruptible']").attr("state", schedule.settings.interruptible); + $(".scheduler-checkbox[name='rununtilcompleteby']").attr("state",schedule.settings.rununtilcompleteby); draw_forecast_category_select(); draw_forecast_select(forecast_list[schedule.settings.signal].category); diff --git a/demandshaper-module/general.php b/demandshaper-module/general.php index 7ef4066..03f314d 100644 --- a/demandshaper-module/general.php +++ b/demandshaper-module/general.php @@ -52,10 +52,16 @@ + +

Ok to interrupt:

+
+

Run until Complete by:

+
+

diff --git a/demandshaper-module/scheduler.js b/demandshaper-module/scheduler.js index c869de1..af457f7 100644 --- a/demandshaper-module/scheduler.js +++ b/demandshaper-module/scheduler.js @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------------- // SMART SCHEDULE // ------------------------------------------------------------------------------------------------------- -function schedule_smart(forecast,timeleft,end,interruptible,resolution) +function schedule_smart(forecast,timeleft,end,interruptible,resolution,rununtilcompleteby) { var MIN = 0 var MAX = 1 @@ -110,6 +110,11 @@ function schedule_smart(forecast,timeleft,end,interruptible,resolution) } let end_hour = start_hour let tend = tstart + + if(rununtilcompleteby) { + // if selected to run until complete by, let end time loop run until complete by + period=24; + } for (let i=0; isettings->ctrlmode=="smart") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); - $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone); + $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone,$schedule->settings->rununtilcompleteby); } else if ($schedule->settings->ctrlmode=="timer") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); diff --git a/devices/Control/openevse.json b/devices/Control/openevse.json index 8a10dd9..39befbf 100644 --- a/devices/Control/openevse.json +++ b/devices/Control/openevse.json @@ -19,6 +19,11 @@ "description": "interruptible", "processList": [] }, + { + "name": "rununtilcompleteby", + "description": "rununtilcompleteby", + "processList": [] + }, { "name": "status", "description": "status", @@ -35,6 +40,7 @@ "end": {"name":"Complete by", "type":"time","default":0,"resolution":0.5}, "repeat": {"type":"weekly-scheduler","default":[1,1,1,1,1,0,0]}, "interruptible": {"name":"Ok to interrupt schedule","type":"checkbox","default":0}, + "rununtilcompleteby": {"name":"Run until Complete by","type":"checkbox","default":0}, "runonce": {"type":"","default":true}, "basic": {"type":"","default":0} } diff --git a/readme.md b/readme.md index a408652..1b46ef6 100644 --- a/readme.md +++ b/readme.md @@ -127,6 +127,7 @@ Submit schedule: "end":16, "repeat":[1,1,1,1,1,1,1], "interruptible":0, + "rununtilcompleteby":0, "runonce":false, "basic":0, "signal":"carbonintensity", @@ -142,6 +143,7 @@ Response: "end":16, "repeat":[1,1,1,1,1,1,1], "interruptible":0, + "rununtilcompleteby":0, "runonce":false, "basic":0, "signal":"carbonintensity", diff --git a/scheduler.php b/scheduler.php index cbef9fa..1bddffa 100644 --- a/scheduler.php +++ b/scheduler.php @@ -235,7 +235,7 @@ function get_forecast($redis,$signal,$timezone) { // SCHEDULE // ------------------------------------------------------------------------------------------------------- -function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$timezone) +function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$timezone,$rununtilcompleteby) { $debug = 0; @@ -343,7 +343,12 @@ function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$tim } $end_hour = $start_hour; $tend = $tstart; - + + if($rununtilcompleteby) { + // if selected to run until complete by, let end time loop run until complete by + $period=24; + } + for ($i=0; $i<$period*($divisions/24); $i++) { $profile[$pos+$i][3] = 1; $end_hour+=$resolution/3600; @@ -352,7 +357,7 @@ function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$tim // dont allow to run past end time if ($tend==$end_timestamp) break; } - + $periods = array(); if ($period>0) { $periods[] = array("start"=>array($tstart,$start_hour), "end"=>array($tend,$end_hour)); From b37a3bb75e9657498b1b3a77b4aa852b29168c12 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Mon, 24 Feb 2020 22:09:19 +0200 Subject: [PATCH 2/9] add check for property --- demandshaper-module/demandshaper_controller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/demandshaper-module/demandshaper_controller.php b/demandshaper-module/demandshaper_controller.php index dc991b6..2823dbc 100644 --- a/demandshaper-module/demandshaper_controller.php +++ b/demandshaper-module/demandshaper_controller.php @@ -73,6 +73,7 @@ function demandshaper_controller() if (!isset($schedule->settings->end)) return array("content"=>"Missing end parameter in schedule object"); if (!isset($schedule->settings->period)) return array("content"=>"Missing period parameter in schedule object"); if (!isset($schedule->settings->interruptible)) return array("content"=>"Missing interruptible parameter in schedule object"); + if (!isset($schedule->settings->rununtilcompleteby)) return array("content"=>"Missing rununtilcompleteby parameter in schedule object"); if (!isset($schedule->settings->runonce)) return array("content"=>"Missing runonce parameter in schedule object"); if ($schedule->settings->runonce) $schedule->settings->runonce = time(); $device = $schedule->settings->device; From ba9adbae78ef794d23f4dea725f9ad9ef6a9e44b Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Mon, 24 Feb 2020 22:18:20 +0200 Subject: [PATCH 3/9] Delete launch.json --- .vscode/launch.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 50e6a95..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Listen for XDebug", - "type": "php", - "request": "launch", - "port": 9000, - "xdebugSettings": { - "max_children": 999, - } - }, - { - "name": "Launch currently open script", - "type": "php", - "request": "launch", - "program": "${file}", - "cwd": "${fileDirname}", - "port": 9000 - } - ] -} \ No newline at end of file From 4f47c42794fb3f43461b5ee004020d3bac5d3466 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Mon, 24 Feb 2020 22:09:19 +0200 Subject: [PATCH 4/9] add check for property --- .vscode/launch.json | 25 ------------------- .../demandshaper_controller.php | 1 + 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 50e6a95..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Listen for XDebug", - "type": "php", - "request": "launch", - "port": 9000, - "xdebugSettings": { - "max_children": 999, - } - }, - { - "name": "Launch currently open script", - "type": "php", - "request": "launch", - "program": "${file}", - "cwd": "${fileDirname}", - "port": 9000 - } - ] -} \ No newline at end of file diff --git a/demandshaper-module/demandshaper_controller.php b/demandshaper-module/demandshaper_controller.php index dc991b6..2823dbc 100644 --- a/demandshaper-module/demandshaper_controller.php +++ b/demandshaper-module/demandshaper_controller.php @@ -73,6 +73,7 @@ function demandshaper_controller() if (!isset($schedule->settings->end)) return array("content"=>"Missing end parameter in schedule object"); if (!isset($schedule->settings->period)) return array("content"=>"Missing period parameter in schedule object"); if (!isset($schedule->settings->interruptible)) return array("content"=>"Missing interruptible parameter in schedule object"); + if (!isset($schedule->settings->rununtilcompleteby)) return array("content"=>"Missing rununtilcompleteby parameter in schedule object"); if (!isset($schedule->settings->runonce)) return array("content"=>"Missing runonce parameter in schedule object"); if ($schedule->settings->runonce) $schedule->settings->runonce = time(); $device = $schedule->settings->device; From 082e1f77c0d160144a15fc56f28c076987eed526 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Mon, 24 Feb 2020 22:09:19 +0200 Subject: [PATCH 5/9] add check for property add check for property Delete launch.json --- .vscode/launch.json | 25 ------------------- .../demandshaper_controller.php | 1 + 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 50e6a95..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Listen for XDebug", - "type": "php", - "request": "launch", - "port": 9000, - "xdebugSettings": { - "max_children": 999, - } - }, - { - "name": "Launch currently open script", - "type": "php", - "request": "launch", - "program": "${file}", - "cwd": "${fileDirname}", - "port": 9000 - } - ] -} \ No newline at end of file diff --git a/demandshaper-module/demandshaper_controller.php b/demandshaper-module/demandshaper_controller.php index dc991b6..2823dbc 100644 --- a/demandshaper-module/demandshaper_controller.php +++ b/demandshaper-module/demandshaper_controller.php @@ -73,6 +73,7 @@ function demandshaper_controller() if (!isset($schedule->settings->end)) return array("content"=>"Missing end parameter in schedule object"); if (!isset($schedule->settings->period)) return array("content"=>"Missing period parameter in schedule object"); if (!isset($schedule->settings->interruptible)) return array("content"=>"Missing interruptible parameter in schedule object"); + if (!isset($schedule->settings->rununtilcompleteby)) return array("content"=>"Missing rununtilcompleteby parameter in schedule object"); if (!isset($schedule->settings->runonce)) return array("content"=>"Missing runonce parameter in schedule object"); if ($schedule->settings->runonce) $schedule->settings->runonce = time(); $device = $schedule->settings->device; From c82f608f15cc170330501ff2bd369f3b3bcb0c6c Mon Sep 17 00:00:00 2001 From: jpalo Date: Fri, 6 Mar 2020 13:01:05 +0200 Subject: [PATCH 6/9] Update demandshaper_run.php --- demandshaper_run.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demandshaper_run.php b/demandshaper_run.php index a808bc4..fee4db5 100644 --- a/demandshaper_run.php +++ b/demandshaper_run.php @@ -356,7 +356,7 @@ if ($schedule->settings->ctrlmode=="smart") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); - $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone,$schedule->settings->rununtilcompleteby); + $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezoney); } else if ($schedule->settings->ctrlmode=="timer") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); From a3024e737f2d2451d95b080ae88bb8223bd9fb9d Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Sat, 21 Mar 2020 11:16:35 +0200 Subject: [PATCH 7/9] Fix Smart schedule setting if there is less than 24 readings --- demandshaper-module/scheduler.js | 20 ++++++++++---------- scheduler.php | 4 +++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/demandshaper-module/scheduler.js b/demandshaper-module/scheduler.js index 312ea1f..618c480 100644 --- a/demandshaper-module/scheduler.js +++ b/demandshaper-module/scheduler.js @@ -113,18 +113,18 @@ function schedule_smart(forecast,timeleft,end,interruptible,resolution,rununtilc if(rununtilcompleteby) { // if selected to run until complete by, let end time loop run until complete by - period=24; + period = 24; } - for (let i=0; i=24) end_hour -= 24 - // dont allow to run past end time - if (tend==end_timestamp) break - } + for (let i = 0; i < period * (divisions / 24); i++) { + if (!profile[pos + i]) break + + profile[pos+i][3] = 1 + end_hour+=resolution/3600 + tend+=resolution + if (end_hour>=24) end_hour -= 24 + // dont allow to run past end time + if (tend==end_timestamp) break } let periods = [] diff --git a/scheduler.php b/scheduler.php index 3835a1c..ee6130d 100644 --- a/scheduler.php +++ b/scheduler.php @@ -352,10 +352,12 @@ function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$tim if($rununtilcompleteby) { // if selected to run until complete by, let end time loop run until complete by - $period=24; + $period = 24; } for ($i=0; $i<$period*($divisions/24); $i++) { + if (!$profile[$pos+$i]) break; + $profile[$pos+$i][3] = 1; $end_hour+=$resolution/3600; $tend+=$resolution; From 5b892c61f93d28c5935aa687bd3dc96be645d3b0 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Wed, 1 Apr 2020 10:05:49 +0300 Subject: [PATCH 8/9] Fix scheduler from crashing demandshaper_run and making it restart every minute --- scheduler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scheduler.php b/scheduler.php index ee6130d..0a772be 100644 --- a/scheduler.php +++ b/scheduler.php @@ -356,7 +356,7 @@ function schedule_smart($forecast,$timeleft,$end,$interruptible,$resolution,$tim } for ($i=0; $i<$period*($divisions/24); $i++) { - if (!$profile[$pos+$i]) break; + if (!isset($profile[$pos+$i])) break; $profile[$pos+$i][3] = 1; $end_hour+=$resolution/3600; From b35b950aa0980d44bc85f62674a177a8abf32d86 Mon Sep 17 00:00:00 2001 From: Jussi Palo Date: Thu, 23 Apr 2020 14:04:58 +0300 Subject: [PATCH 9/9] Fix invalid parameter --- demandshaper_run.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/demandshaper_run.php b/demandshaper_run.php index fee4db5..a2cda73 100644 --- a/demandshaper_run.php +++ b/demandshaper_run.php @@ -193,7 +193,9 @@ if (isset($schedule->settings->device_type)) $device_type = $schedule->settings->device_type; $ctrlmode = false; if (isset($schedule->settings->ctrlmode)) $ctrlmode = $schedule->settings->ctrlmode; - + $rununtilcompleteby = false; + if (isset($schedule->settings->rununtilcompleteby)) $rununtilcompleteby = $schedule->settings->rununtilcompleteby; + if ($device_type && $ctrlmode) { $log->info(date("Y-m-d H:i:s")." Schedule:$device ".$schedule->settings->ctrlmode); @@ -356,7 +358,7 @@ if ($schedule->settings->ctrlmode=="smart") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone); - $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezoney); + $schedule->runtime->periods = schedule_smart($forecast,$schedule->runtime->timeleft,$schedule->settings->end,$schedule->settings->interruptible,900,$timezone,$rununtilcompleteby); } else if ($schedule->settings->ctrlmode=="timer") { $forecast = get_forecast($redis,$schedule->settings->signal,$timezone);