rubyraspberry-pi3ip-cameradashing

snapshot.jpg of Camera IP(D-LINK DSC 4201) not refresh in Dashing


Thanks for click on this post, I have a Dashboard powered by Dashing on my RPI 3 where I have add a widget for my camera IP (D-link DSC 4201).

Camera-widget Link

There is the ruby jobs who catch the snapshot.jpeg of my camera :

require 'net/http'

@cameraDelay = 1 # Needed for image sync. 
@fetchNewImageEvery = '3s'

@camera1Host = "192.168.0.20"  ## CHANGE
@camera1Port = "80"  ## CHANGE
@camera1Username = 'admin' ## CHANGE
@camera1Password ='*****'
@camera1URL = "/dms?nowprofileid=1&"
@newFile1 = "assets/images/cameras/snapshot1_new.jpg"
@oldFile1 = "assets/images/cameras/snapshot1_old.jpg"


def fetch_image(host,old_file,new_file, cam_user, cam_pass, cam_url)
    `rm #{old_file}` 
    `mv #{new_file} #{old_file}`    
    Net::HTTP.start(host) do |http|
        req = Net::HTTP::Get.new(cam_url)
        if cam_user != "None" ## if username for any particular camera is set to 'None' then assume auth not required.
            req.basic_auth cam_user, cam_pass
        end
        response = http.request(req)
        open(new_file, "wb") do |file|
            file.write(response.body)
        end

        end
    new_file
end

def make_web_friendly(file)
  "/" + File.basename(File.dirname(file)) + "/" + File.basename(file)
end

SCHEDULER.every @fetchNewImageEvery do

        new_file1 = fetch_image(@camera1Host,@oldFile1,@newFile1,@camera1Username,@camera1Password,@camera1URL)

    if not File.exists?(@newFile1)
        warn "Failed to Get Camera Image"
    end
    send_event('camera1', image: make_web_friendly(@oldFile1))
    sleep(@cameraDelay)
    send_event('camera1', image: make_web_friendly(new_file1))

end

Actually my jobs display only the first two images (in @oldFile1,@newFile1) and after he was stock in a loop where he display only the first two images catch on my dashing dashboard.

So, I have looked in the /assets and I see my two snapshots.jpg refresh in real time like my jobs as to did it, But the dashing dashboard doesn't display it.

So why the dashboard don't took the refresh image..?


Solution

  • just ran into this issue today. Ended up rewriting things a bit. Pretty sure this is a browser caching issue in that the file name is the same. Just appended the datetime and pushing it seemed to work.

    require 'net/http'
    require 'open-uri'
    
    @url = 'http://172.1.1.16/image.jpg'
    
    SCHEDULER.every '4s', :first_in => 0 do |job|
    
        `find '/dashing/f12dash/assets/images/cameras/' -type f -mmin +1 -print0 | xargs -0 rm -f`
    
        @currentTime = Time.now.strftime("%Y-%m-%d_%H-%M-%S")
        @newFile1 = "assets/images/cameras/snapshot-" + @currentTime + "_new.jpeg"
    
        open(@url, :http_basic_authentication => ['root', 'CamPW']) do |f|
          open(@newFile1,'wb') do |file|
            file.puts f.read
          end
        end
    
        send_event('camera1', image: ("/" + File.basename(File.dirname(@newFile1)) + "/" + File.basename(@newFile1)))
    
    end