DuetLapse3
-
@stuartofmt I'd like some guidance before I head off in the wrong direction.
I've set up (but not yet started):
/etc/systemd/system/StartDuetLapse3.service
which calls:
/opt/DuetLapse/StartDuetLapse3.py
which calls:
/opt/DuetLapse/DuetLapse3.py
Now -- when I've been testing this over the last few days manually (without the systemd service, and without using StartDuetLapse3) I've used the following command line:
python3 /opt/DuetLapse/DuetLapse3.py -duet railcore.localdomain -camera1 web -weburl1 http://octocore.localdomain:8081/snapshot -detect layer -extratime 4
So switching to this service-initiated launch, do I put all the arguments in the systemd service file like this?
ExecStart=python3 /opt/DuetLapse/StartDuetLapse3.py -port 8082 -args="-duet railcore.localdomain -camera1 web -weburl1 http://octocore.localdomain:8081/snapshot -detect layer -extratime 4"
Thanks for your review!
John
-
@JohnOCFII said in DuetLapse3:
So switching to this service-initiated launch, do I put all the arguments in the systemd service file like this?
ExecStart=python3 /opt/DuetLapse/StartDuetLapse3.py -port 8082 -args="-duet railcore.localdomain -camera1 web -weburl1 http://octocore.localdomain:8081/snapshot -detect layer -extratime 4"
Essentially - yes but note:
(1) it looks like you have capitalized startDuetLapse3.py
(2) startDuetLapse3 does not directly call DuetLapse3. Its a browser accessed service that provides various controls. The "args=" option sets a default string (that you can edit) in the browser interface. For example my startDuetLapse3.service file looks like this:[Unit] Description=duetLapse3 Service After=multi-user.target [Service] WorkingDirectory=/home/pi/Lapse User=pi Type=idle ExecStart=python3 /home/pi/Lapse/startDuetLapse3.py -port 8082 -topdir /home/pi/Lapse/Captures -args=" -duet 192.168.86.235 -port 8083 -basedir /home/pi/Lapse/Captures -dontwait -seconds 15 -detect none -weburl1 http://192.168.86.230:8081/stream.mjpg -camera1 other -camparam1="'ffmpeg' +ffmpegquiet + ' -y -i ' +weburl+ ' -vframes 1 ' +fn+debug"" Restart=always [Install] WantedBy=multi-user.target
and results in the browser showing this (when start is pressed).
The text above the second start is what is extracted from args=. It's editable (or you could leave out args= and type / copy / paste into that field.
The important thing is its not until the second "start" is pressed that DUetLapse3 is started. In this manner you can easily manage multiple instances if you wish.
Hope this helps.
P.S. I've made a few tweaks. likely out in a day or two. Mainly the ability to create video from startDuetLapse3 (if the dir still exists).
-
@stuartofmt Thanks for the review.
Checking status now, I get the following message:
pi@octocore:/etc/systemd/system $ sudo systemctl status startDuetLapse3.service ● startDuetLapse3.service - DuetLapse3 timelapse launch script Loaded: loaded (/etc/systemd/system/startDuetLapse3.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-03-25 19:51:17 CDT; 13h ago Main PID: 471 (python3) Tasks: 2 (limit: 2062) CGroup: /system.slice/startDuetLapse3.service └─471 /usr/bin/python3 /opt/DuetLapse/startDuetLapse3.py -port 8082 Mar 26 04:10:03 octocore python3[471]: method() Mar 26 04:10:03 octocore python3[471]: File "/opt/DuetLapse/startDuetLapse3.py", line 198, in do_GET Mar 26 04:10:03 octocore python3[471]: split_referer = referer.split(":", 1) Mar 26 04:10:03 octocore python3[471]: AttributeError: 'NoneType' object has no attribute 'split' Mar 26 04:10:03 octocore python3[471]: ---------------------------------------- Mar 26 04:10:03 octocore python3[471]: Exception happened during processing of request from ('192.168.88.1', 40405) Mar 26 04:10:03 octocore python3[471]: Traceback (most recent call last): Mar 26 04:10:03 octocore python3[471]: File "/usr/lib/python3.7/socketserver.py", line 650, in process_request_thread Mar 26 04:10:03 octocore python3[471]: self.finish_request(request, client_address) Mar 26 09:38:44 octocore systemd[1]: startDuetLapse3.service: Current command vanished from the unit file, execution of the command list won't be resumed. pi@octocore:/etc/systemd/system $
Looking at that line 198 in startDuetLapse3.py it looks like it has something to do with parsing the URL.
Here is the ExecStart line from the service file:
ExecStart=python3 /opt/DuetLapse/startDuetLapse3.py -port 8082 -args="-duet railcore.localdomain -camera1 web -weburl1 http://octocore.localdomain:8081/snapshot -detect layer -extratime 4"
Thoughts?
John
-
Feature suggestion: add an option to create a symbolic link that always points to the second-most-recent photo for a currently-running timelapse. For example, the current directory for captured images on one of my printers is: /mnt/remote/KosselXT/duet/21439_CFFFP_Riser_191x25_links
An option to have a symbolic link at /mnt/remote/KosselXT/current.jpg that always points to the second-most-recent image would allow us to add it to the DWC interface as a webcam image by serving that file over http. The symbolic link would have to be updated every frame. The reason I'm specifically referring to the second-most-recent image is that sometimes the current image isn't complete yet when DWC tries to display it. Pointing the link to the second-most-recent image would always display a complete image, at the expense of being a few seconds behind. -
@johnocfii said in DuetLapse3:
I’ve found that it’s important / helpful to prove the command independently of systemctl first. What do you get from the log file when you use the same command with -verbose ?
-
@goremanx
Not sure what this has to do with DWC and Duet Lapse3. Why not just point DWC to the same camera source as DuetLapse3? -
@stuartofmt Because DWC's "webcam" feature only supports a url pointing to a specific image over http. I used to generate that image with my pi camera, but now the camera is monopolized by the timelapse. Since the image I want to see has already been taken for the timelapse, it seems like a good way to kill two birds with one stone. That image could also be used to show the most recent frame on the timelapse status page.
-
@goremanx said in DuetLapse3:
but now the camera is monopolized by the timelapse.
What software are you using to serve up the images from the pi camera ? If its raspistill - yes, it (and some others) only accept a single connection?
Here is what I use - simple and effective: I often have multiple DuetLapse3's, a separate browser and DWC (be sure to enable webcam image in an iframe) - all connected to the one instance.
line 75 can be edited for the port number, line 70 for rotation.
-
@johnocfii said in DuetLapse3:
referer = self.headers['Host'] split_referer = referer.split(":", 1)
What this is saying is that the request (from the browser) did not contain a well formed header url (what you would normally see in the first part of the address bar) E.g. localhost:port ..... or ipaddress:port ......
Just why I cannot say.Does it generally work ? Was this a transient ? Is it repeatable in any way ?
I'm about to release a small upgrade and might be able to include some checks / mitigation but don't really know what to do if it fails. Any verbose logs or other info would be especially helpful.
-
@stuartofmt Greetings!
I added -verbose and ran from the command line with no issues. So -- I added verbose into the systemctl script, and it ALSO ran without issue. Then I removed the -verbose tag, and things continued to work.
I blame it on the Moderna vaccine I received the other day.
I have no idea what my issue was... Sorry if I caused you to rack your brain.
John
pi@octocore:/opt/DuetLapse $ pi@octocore:/opt/DuetLapse $ python3 /opt/DuetLapse/startDuetLapse3.py -port 8082 -args="-duet railcore.localdomain -camera1 web -weburl1 http://octocore.localdomain:8081/snapshot -detect layer -extratime 4 -verbose" ***** Started http listener ***** Cleaning up phase: startup railcore.localdomain railcore.localdomain ################### Options selected for this run ##################### railcore.localdomain #Environment Settings: railcore.localdomain # printer = railcore.localdomain railcore.localdomain # basedir = /opt/DuetLapse railcore.localdomain # poll = 5 railcore.localdomain # logtype = both railcore.localdomain # verbose = True railcore.localdomain # os = Linux railcore.localdomain # host = 0.0.0.0 railcore.localdomain # port = 0 railcore.localdomain # pid = 5350 railcore.localdomain # keeplogs = False railcore.localdomain # novideo = False railcore.localdomain # deletepics = False railcore.localdomain # maxffmpeg = 2 railcore.localdomain #Execution Setings: railcore.localdomain # dontwait = False railcore.localdomain # seconds = 0 railcore.localdomain # detect = layer railcore.localdomain # pause = no railcore.localdomain # standby = False railcore.localdomain #Camera1 Settings: railcore.localdomain # camera1 = web railcore.localdomain # weburl1 = http://octocore.localdomain:8081/snapshot railcore.localdomain # Video Settings: railcore.localdomain # extratime = 4.0 railcore.localdomain ################################################################### railcore.localdomain ffmpeg version git-2020-12-24-29cef1b Copyright (c) 2000-2020 the FFmpeg developers built with gcc 8 (Raspbian 8.3.0-6+rpi1) configuration: --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --extra-libs='-lpthread -lm -latomic' --arch=armel --enable-gmp --enable-gpl --enable-libass --enable-libdrm --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-mmal --enable-nonfree --enable-omx --enable-omx-rpi --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables libavutil 56. 62.100 / 56. 62.100 libavcodec 58.115.102 / 58.115.102 libavformat 58. 65.100 / 58. 65.100 libavdevice 58. 11.103 / 58. 11.103 libavfilter 7. 94.100 / 7. 94.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 ... tpad V->V Temporarily pad video frames. railcore.localdomain railcore.localdomain ############################################################### railcore.localdomain Connected to printer at railcore.localdomain using Duet version 3.2.2 and API access using rr_model railcore.localdomain ############################################################### railcore.localdomain railcore.localdomain railcore.localdomain ########################################################## railcore.localdomain Will start capturing images on first layer change railcore.localdomain ########################################################## railcore.localdomain railcore.localdomain railcore.localdomain ########################################################## railcore.localdomain Video will be created when printing ends. railcore.localdomain On Linux - press Ctrl+C one time to stop capture and create video. railcore.localdomain On Windows - Ctrl+C will NOT create a video. You must use the http listener railcore.localdomain ########################################################## railcore.localdomain railcore.localdomain ++++++ Entering start state ++++++ railcore.localdomain ++++++ Entering start state ++++++ railcore.localdomain ****** Duet status changed to: idle ***** railcore.localdomain ****** Print State changed to: Capturing ***** railcore.localdomain !!!!!! Stopped by SIGINT or CTL+C - Post Processing !!!!!! railcore.localdomain ++++++ Entering terminate state ++++++ railcore.localdomain Working directory created at: /opt/DuetLapse/octocore/railcore-localdomain/5350 2021-03-28 15:02:21 URL:http://octocore.localdomain:8081/snapshot [128008/128008] -> "/opt/DuetLapse/octocore/railcore-localdomain/5350/Camera1_00000001.jpeg" [1] railcore.localdomain Camera1: Cannot create video with only 1 frames Cleaning up phase: terminate railcore.localdomain Program Terminated ^C!!!!!! Stopped by SIGINT or CTL+C !!!!!! Killed pi@octocore:/opt/DuetLapse $
-
Some fairly small but useful additions. Personally - I am tending to use -keepfiles in all instances and using startDuetLapse3 to manually tidy up etc. as I need to.
###Version 3.4.2###
Changes to DuetLapse3
-[1] Added a new options: -keepfiles to prevent file deletion on startup and shutdown.
-[2] Terminate (from the UI) now offers two options: Graceful and Forces. Graceful is the same as in prior versions. Forced does a quick shutdown with no image capture.
-[3] Added an optional argument (-maxffmpeg) that limits the number of concurrent ffmpeg instances. Ffmpeg can fail due to lack of resources - the default is 2 instances.
Note that this only applies to video creation. Image capture, because it is transient, is not limited.Changes to startDuetLapse3
[1] Can now delete empty directories (provided they are not in use). This allows a complete cleanup of the directory tree.
[2] Added file function to create a Video on directories containing jpeg files (provided they are not in use).
[3] Added an optional argument (-maxffmpeg) that limits the number of concurrent ffmpeg instances. Ffmpgeg can fail due to lack of resources - the default is 2 instances.
Note that this only applies to video creation. -
Hi all,
I have installed DuetLapse3 and verified it's running well (it does).
But with me being a newbie at all Linux-things, I'm not sure about some basic things...- What would be the best way to have DuetLapse3 start at boot? I have added this line to rc.local but not sure if it would work:
/home/pi/duetlapse/duetlapse.sh start &
If I run "duetlapse.sh start" it works.
- Is it ok if I keep DuetLapse3 running at all times? Would it start capturing automatically, every time I start a print, and stop capturing when print is finished? I have DWC, uStreamer and DuetLapse3 on the same RPi (RPi 4 4 GB).
3 (LE). One more thing. I have noticed that DuetLapse3 terminates itself after a print is finished and a video is created. I would like to automate video capture and not worry about whether DuetLapse3 is started or not when I start a job. This means I'm fine with DuetLapse3 being active all the time and capturing all my prints. Question is, how would I go about automating that? Keep DuetLapse3 idle and waiting all the time, start capturing when print starts, save video and go back to idle, waiting for a new job to start.
-
Greetings -- My last couple of prints, I noticed that I wasn't getting my "extratime". The log told me that my version of ffmpeg didn't support it, even though it was the version I built locally on my Pi last December.
pi@octocore:/opt/DuetLapse/octocore/railcore-localdomain $ more 15379_21-05-17T16˸40˸44.log 2021-05-17 16:40:45,112 - 2021-05-17 16:40:45,114 - ################### Options selected for this run ##################### 2021-05-17 16:40:45,114 - #Environment Settings: 2021-05-17 16:40:45,115 - # printer = railcore.localdomain 2021-05-17 16:40:45,116 - # basedir = /opt/DuetLapse 2021-05-17 16:40:45,116 - # poll = 5 2021-05-17 16:40:45,117 - # logtype = both 2021-05-17 16:40:45,118 - # verbose = False 2021-05-17 16:40:45,118 - # os = Linux 2021-05-17 16:40:45,119 - # host = 0.0.0.0 2021-05-17 16:40:45,119 - # port = 0 2021-05-17 16:40:45,120 - # pid = 15379 2021-05-17 16:40:45,120 - # keeplogs = False 2021-05-17 16:40:45,121 - # novideo = False 2021-05-17 16:40:45,122 - # deletepics = False 2021-05-17 16:40:45,122 - # maxffmpeg = 2 2021-05-17 16:40:45,123 - # keepfiles = False 2021-05-17 16:40:45,123 - #Execution Setings: 2021-05-17 16:40:45,124 - # dontwait = False 2021-05-17 16:40:45,125 - # seconds = 0 2021-05-17 16:40:45,126 - # detect = layer 2021-05-17 16:40:45,127 - # pause = no 2021-05-17 16:40:45,128 - # standby = False 2021-05-17 16:40:45,128 - #Camera1 Settings: 2021-05-17 16:40:45,129 - # camera1 = web 2021-05-17 16:40:45,130 - # weburl1 = http://octocore.localdomain:8081/snapshot 2021-05-17 16:40:45,131 - # Video Settings: 2021-05-17 16:40:45,132 - # extratime = 4.0 2021-05-17 16:40:45,133 - ################################################################### 2021-05-17 16:40:45,133 - 2021-05-17 16:40:45,432 - 2021-05-17 16:40:45,433 - ************************************************************************************ 2021-05-17 16:40:45,434 - Warning: This version of ffmpeg does not support -extratime 2021-05-17 16:40:45,434 - -extratime has been set to 0 2021-05-17 16:40:45,435 - ************************************************************************************ 2021-05-17 16:40:45,758 - 2021-05-17 16:40:45,759 - ############################################################### 2021-05-17 16:40:45,760 - Connected to printer at railcore.localdomain using Duet version 3.3RC2 and API access using rr_model 2021-05-17 16:40:45,761 - ############################################################### 2021-05-17 16:40:45,761 - 2021-05-17 16:40:45,762 - 2021-05-17 16:40:45,763 - ########################################################## 2021-05-17 16:40:45,764 - Will start capturing images on first layer change 2021-05-17 16:40:45,764 - ########################################################## 2021-05-17 16:40:45,765 - 2021-05-17 16:40:45,766 - 2021-05-17 16:40:45,767 - ########################################################## 2021-05-17 16:40:45,767 - Video will be created when printing ends. 2021-05-17 16:40:45,768 - On Linux - press Ctrl+C one time to stop capture and create video. 2021-05-17 16:40:45,769 - On Windows - Ctrl+C will NOT create a video. You must use the http listener 2021-05-17 16:40:45,769 - ########################################################## 2021-05-17 16:40:45,770 -
even though the filter showing tpad was there:
pi@octocore:/opt/DuetLapse $ ffmpeg -filters | grep tpad ffmpeg version git-2020-12-24-29cef1b Copyright (c) 2000-2020 the FFmpeg developers built with gcc 8 (Raspbian 8.3.0-6+rpi1) configuration: --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib --extra-libs='-lpthread -lm -latomic' --arch=armel --enable-gmp --enable-gpl --enable-libass --enable-libdrm --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-mmal --enable-nonfree --enable-omx --enable-omx-rpi --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables libavutil 56. 62.100 / 56. 62.100 libavcodec 58.115.102 / 58.115.102 libavformat 58. 65.100 / 58. 65.100 libavdevice 58. 11.103 / 58. 11.103 libavfilter 7. 94.100 / 7. 94.100 libswscale 5. 8.100 / 5. 8.100 libswresample 3. 8.100 / 3. 8.100 libpostproc 55. 8.100 / 55. 8.100 ... tpad V->V Temporarily pad video frames. pi@octocore:/opt/DuetLapse $
I rebuilt ffmpeg again following the instructions in the GitHub pages, but other than seeing that I do have the new version, the log still shows that "Warning: This version of ffmpeg does not support -extratime"
The extra time feature was working fine a couple of months ago.
Any ideas, or places to check?
Thanks,
John
-
@johnocfii said in DuetLapse3:
The extra time feature was working fine a couple of months ago.
Any ideas, or places to check?Let me take a look later today / tomorrow. Its entirely possible that I introduced some logic error in a later version. I did do some 'tidy up' so it could easily 'no good deed goes un-punuished'
What version of DuetLapse3 are you on ? Sorry that you had to rebuild ffmpeg.
-
@war4peace said in DuetLapse3:
But with me being a newbie at all Linux-things, I'm not sure about some basic things...
Sorry - for some reason I did not get notification of your post (or I fat fingered it) and only now just saw your question.
I'm tied up all day - but will give you a considered answer later today (if I can ) but more likely tomorrow. The good news is that its all possible and pretty straightforward BUT there are options
-
@stuartofmt said in DuetLapse3:
What version of DuetLapse3 are you on ? Sorry that you had to rebuild ffmpeg.
I'm running 3.4.2. I was on 3.4.1 before that.
John
-
@johnocfii said in DuetLapse3:
I'm running 3.4.2. I was on 3.4.1 before that.
Do you mind trying 3.4.3. Looks like it was a silly mistake - but I do not have time to rigorously test at the moment.
-
@stuartofmt sure - I'll try that soon.
-
@stuartofmt Worked great! https://youtu.be/vvtMgD2nNE0
-
@stuartofmt
No rush, I am still tuning and polishing a lot of things with my printer. Take your time