Git Product home page Git Product logo

photoframe's Introduction

photoframe

A Raspberry Pi (Zero, 1 or 3) software which automatically pulls photos from Google Photos and displays them on the attached screen, just like a photoframe. No need to upload photos to 3rd party service or fiddle with local storage or SD card.

why use this as opposed to buying one?

Unlike most other frames out there, this one will automatically refresh and grab content from your photo collection, making it super simple to have a nice photo frame. Also uses keywords so you can make sure the relevant photos are shown and not the reciepts for your expense report.

It also has more unique features like ambient color temperature adjustments which allows the images to meld better with the room where it's running.

features

  • Simple web interface for configuration
  • Google Photo search integration for more interesting images
  • Blanking of screen (ie, off hours)
  • Simple OAuth2.0 even though behind firewall (see further down)
  • Shows error messages on screen
  • Supports ambient room color temperature adjustments
  • Uses ambient sensor to improve powersave
  • Power control via GPIO (turn RPi on/off)
  • Non-HDMI displays (SPI, DPI, etc)

requirements

  • Raspberry Pi 1, 3 or Zero
  • Display of some sort (HDMI or SPI/DPI displays)
  • Google Photos account
  • Internet

installation

On the release page, you'll find prepared raspbian image(s) for RaspberryPi 1, 3 or Zero

To use these (and I really recommend that to doing the manual steps), here's how:

  1. Download the image from the release page
  2. Use your favorite tool to load image onto a SD card, I recommend https://etcher.io/ which works on Windows, OSX and Linux
  3. Open the new drive called boot and edit the file called wifi-config.txt Change the two fields to point out your wifi and the password needed for it
  4. Save the file
  5. Place SDcard in your RPi3 which is connected to a monitor/TV
  6. Start the RPi
  7. Wait (takes up to a minute depending on card and the fact that it's expanding to use the entire SDcard ... slower still on non-RPi3)
  8. Follow instructions shown on the display, it will have the address for your frame shown (hosted on port 7777)

The default username/password for the web page is photoframe and password. This can be changed by editing the file called http-auth.json on the boot drive

tl;dr

Flash image to SDcard, edit wifi-config.txt and boot the RPi3 with the SDcard and follow instructions. Username and password is above this paragraph.

The web interface is hosted on port 7777 and the exact IP needed to access it should show up on the display connected to your device. If not, look on your router for any new device. If you're lucky, your router might actually say what kind of device it is, but your mileage will vary on this.

Once inside the web interface, select GooglePhotos from dropdown list in bottom-left corner and press Add photo service.

color temperature?

Yes, photoframe can actually adjust the temperature of the image to suit the light in the room. For this to work, you need to install a TCS34725, see https://www.adafruit.com/product/1334 . This should be hooked up to the I2C bus, using this:

3.3V -> Pin 1 (3.3V)
SDA -> Pin 3 (GPIO 0)
SCL -> Pin 5 (GPIO 1)
GND -> Pin 9 (GND)

You also need to tell your RPi3 to enable the I2C bus, start the raspi-config and go to submenu 5 (interfaces) and select I2C and enable it.

Once all this is done, you have one more thing left to do before rebooting, you need to download the imagemagick script that will adjust the image, please visit http://www.fmwconcepts.com/imagemagick/colortemp/index.php and download and store it as colortemp.sh inside /root/photoframe_config.

Don't forget to make it executable by chmod +x /root/photoframe_config/colortemp.sh or it will still not work.

You're done! Reboot your RPi3 (So I2C gets enabled) and from now on, all images will get adjusted to match the ambient color temperature.

If photoframe is unable to use the sensor, it "usually" gives you helpful hints. Check the /var/log/syslog file for frame.py entries.

Note

The sensor is automatically detected as long as it is a TCS34725 device and it's connected correctly to the I2C bus of the raspberry pi. Once detected you'll get a new read-out in the web interface which details both white balance (kelvin) and light (lux).

If you don't get this read-out, look at your logfile. There will be hints like sensor not found or sensor not being the expected one, etc.

Annoyed with the LED showing on the TCS34725 board from Adafruit?

Just ground the LED pin on the Adafruit board (for example by connecting it to Pin 9 on your RPi3)

Ambient powersave?

Yes, using the same sensor, you can set a threshold and duration, if the ambient light is below said threshold for the duration, it will trigger powersave on the display. If the ambient brightness is above the threshold for same duration, it will wake up the display.

However, if you're combining this with the scheduler, the scheduler takes priority and will keep the display in powersave during the scheduled hours, regardless of what the sensor says. The sensor is only used to extend the periods, it cannot power on the display during the off hours.

Power on/off?

Photoframe listens to GPIO 26 (default, can be changed) to power off (and also power on). If you connect a switch between pin 37 (GPIO 26) and pin 39 (GND), you'll be able to do a graceful shutdown as well as power on.

How come you contact photoframe.sensenet.nu ???

Since Google doesn't approve of OAuth with dynamic redirect addresses, this project makes use of a lightweight service which allows registration of desired redirect (as long as it's a LAN address) and then when Google redirects, this service will make another redirect back to your raspberry. The registered addresses are only kept for 10min and is only stored in RAM, so nothing is kept.

User                 RPi3                    Google            Sensenet
 |--[Start linking]--->|                         |                 |
 |                     |                         |                 |
 |                     |-------[Register LAN address]------------->|
 |                     |                         |                 |
 |                     |<---------[Unique ID to use]---------------|
 |                     |                         |                 |
 |<--[OAuth2.0 begin]--|                         |                 |
 |                     |                         |                 |
 |<-[OAuth2.0 exchange, state holds unique ID]-->|                 |
 |                     |                         |                 |
 |<---[Redirect to photoframe.sensenet.nu]-------|                 |
 |                     |                         |                 |
 |----[Load photoframe.sensenet.nu with unique ID]---------------->|
 |                     |                         |                 |
 |<---[New redirect to registered LAN address from earlier]--------|
 |                     |                         |                 |
 |--[Load local web]-->|                         |                 |
 |                     |                         |                 |

It's somewhat simplified, but shows the extra step taken to register your LAN address so redirection works.

If you want to see how it works and/or run your own, you'll find the code for this service under extras and requires php with memcached. Ideally you use a SSL endpoint as well.

faq

Can I avoid photoframe.sensenet.nu ?

You could run the same service yourself (see extras/). It requires a DNS name which doesn't change and HTTPS support. You'll also need to change the relevant parts of this guide and the frame.py file so all references are correct. You might also be able to use server tokens instead, but that would require you to do more invasive changes. I don't have any support for this at this time.

I want to build my own ready-made image of this

Check out the photoframe branch on https://github.com/mrworf/pi-gen ... It contains all the changes and patches needed to create the image. Starting with v1.1.1 it will match tags.

How do I get ssh access?

Place a file called ssh on the boot drive and the ssh daemon will be enabled. Login is pi/raspberry (just like raspbian). Beware that if you start changing files inside /root/photoframe/ the automatic update will no longer function as expected.

Are there any logs?

By default, it logs very little and what it logs can be found under /var/log/syslog, just look for frame entries

What if I want more logs?

If you're having issues and you want more details, do the following as root:

service frame stop
/root/photoframe/frame.py --debug

This will cause photoframe to run in the foreground and provide tons of debug information

How do I run USB provider when emulated?

Add the following to your /etc/sudoers

<your username>      ALL=(root) NOPASSWD: /bin/mount

But please note that this will enable your user to use mount via sudo WITHOUT PASSWORD PROMPTING

How do I test and develop on a desktop?

Start frame.py with --emulate to run without a RPi

I can't seem to use some USB sticks?

You might be missing exFAT support. If you used this on RPi, it comes preinstalled, but if you're running this manually, please install the following (assumes ubuntu distro)

sudo apt install exfat-fuse exfat-utils

After this, you should be able to use exFAT

How does "Refresh keywords" option work?

By default, most photo providers will fetch a list of available photos for a given keyword. This list isn't refreshed until one of the following events happen:

  • No more photos are available from ANY photo provider in your frame
  • User presses "Forget Memory" in web UI
  • The age of the downloaded index exceeds the hours specified by "Refresh keywords" option

To disable the last item on that list, set the "Refresh keywords" to 0 (zero). This effectively disables this and now the frame will only refresh if no more photos are available or if user presses the forget memory item.

Why isn't it showing all my photos?

Given you haven't set any options to limit based on orientation or a refresh which is too short to show them all, it should walk through the provided list from your provider.

however

Not all content is supported. To help troubleshoot why some content is missing, you can press "Details" for any keyword (given that the provider supports it) and the frame will let you know what content it has found. It should also give you an indication if there's a lot of content which is currently unsupported.

photoframe's People

Contributors

jlrgraham avatar leogaube avatar me-ayush avatar merlynkline avatar mrworf avatar tester-testsson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

photoframe's Issues

Move shutdown GPIO or make configurable?

First off, thanks for the work on this!

Would love to see the GPIO for the power off switch be made configurable via the interface.

I built using an original RPi with stretch lite. I'm using the original instead of the 3 due to the lower power reqs (and I had a couple lying around). With a USB Nano WiFi adapter the USB port on my monitor (HP E221i) seems to power it without issue. (Note: I tried several Dell models, none of the USB ports provide power.) I have a model 3 that definitely does not like the lower power output from the monitor and I get undervoltage errors overwriting the display and causing issues. The original might not like it either, but it doesn't seem to be complaining. Just REALLY slow to start displaying pictures after first boot, and the fastest it seems to switch between photos is ~1:30 regardless of setting. Not having a second power cord is worth it though, IMO.

Anyways, because I'm using an original RPi, I don't have GPIO 26. I will use another GPIO and modify "shutdown.py" accordingly, however I would also like to use the update feature (especially if you plan to add flickr support). I expect my manual change will get overwritten sooner or later though. It would be much easier if this were a configurable option in the browser.

Again, thanks for the awesome app!

Build OS in Buildroot (to write protect the OS).

Hi, this is not an issue, it's a suggestion. It's always a "problem" when you pull the power from a Linux machine. You risk breaking the OS. To avoid that you can make a "Read Only" version of the OS with BuildRoot. I have not done this myself, but I'm using a system called "MotionEyeOS" that uses this and it's working really well.
Then you don't need to worry about breaking stuff when you loose power. :)
As I said, it's just a suggestion. :)

Select albums to display

Selection to display all images from an album or list of albums. This would make it easier to create a specifically curated set of pictures to show on the frame.

500 Internal Server Error

I'm getting a 500 "Internal Server Error" at the end of the OAuth process (after I authorize in Google) connecting to Google Photos, after following the directions listed. Any idea where I might be going wrong?

I am on release 1.2.0 on Raspberry Pi 3 B+.

Thanks!

-Mike

Compatibility with Raspberry Pi Zero (WH)?

Hi,
I want to know if photoframe is compatible also with Raspberry Pi Zero? Has someone tried it? Or is there something in this build that makes it exclusively available for Raspberry Pi 3?

Edit: I should add I am also referring to the ready build under releases.

Rotate the "slideshow"...

Hi! Thank you for this nice setup!
I'm currently trying to set up my second frame. But I want to use it in portrait mode.
I have rotated the display in the config.txt. I know that it's correct. I have other RPis with the same function but not using them as a photoframes (rotating the display 270 degrees with "display_rotate=3").

However the "slideshow" still displays the picture as if it where in landscape mode.
Is there a way to define a new "screen mode" (720x1280) somehow?
All options available in the WebGUI is in landscape mode.

Best regards Erik

Add transitions

First of all, thanks for such a great photoframe software. Was super-easy to set up and now I can finish my photoframe build. I have a current photoframe that I am using with windows XP and an ancient google screensaver. I have kept using it because it has the 'Ken Burns effect' -dissolve between pictures, zoom and pan-as a transition which is a really elegant way to deal with multiple resolutions and aspect rations.

I am not sure a Raspberry Pi has enough video processing oomph to do that but even a simple dissolve would be a nice addition.

My frame got black screen again!

Hello,
I dont know why but my frame got black screen again.
I got the debug screen here, please take a look.
Thank you very much.
log

Show slideshow on SPI LCD?

Hello, just wondering if you have any ideas about how to make the slideshow appear on an SPI LCD? I have a 3.5" waveshare LCD. I've tried your pre-built image and also installing manually on raspbian, but the slideshow will only show on HDMI either way. LXDE shows on the LCD, which is on TTY7, and when i SSH in and use 'chvt 1' to switch the LCD to TTY1 it just shows console text.

Show IP on boot

Once the frame has booted up and network is available, the frame should show the local IP for 30s before beginning the slideshow. Solves the issue of not knowing where to connect when using WiFi and having configured it :)

Problem with new GooglePhotos Provider

I went through your (very well documented!) "How to create an authorization file" for GooglePhotos and added the authorization to PhotoFrame, but nothing was displayed. No pictures were found:
DebugTrace.txt

Thanks for your great app and your help!

Remotely Update Keywords

Is there any semi-API functionality already in place where I could send new keywords to the frame via web request? That way I could perhaps contact the frame without having to load the settings in a browser.

Slideshow should immediately reflect major changes

Today when a major change is done in settings, it may take as long as the slideshow timer to take effect, preferably it should happen more or less directly.

This is tricky due to the multithreaded behavior of photo frame so it will not happen anytime soon.

Image pool

I have 4 keywords that return images from Google Photos.
Have around 50k photos to pick from.
Refresh list of photos every 1 hours

I see very minimal change in the image pool. Despite running all day, rebooting, ./update/force, etc.
Am I missing something?

Is there a single pool, comprised of all the keywords or does each keyword have its own pool?

Photos from Google not really random

Thanks for the enhancement. I've played around adding some albums and it really looks great.

When I'm just using the "latest"-keyword, the infinite wisdom of Google's AI keeps repeating some images instead of showing all of them just once in a random order. I'm not sure, if you have any chance to change this behaviour.

Maybe there's a way to configure Google to display just all photos independent of any album assocication? That could be the PhotoFrame default configuration, if no album name is given.

issues with Google Photo Api

Hi ! Thanks for the update ! I moved to google photo api, however, there are some issues occurs, sometimes the frame stuck on an image, and some time it stuck on a black screen, then I have to reboot and after that awhile happens again.

I have around 25 albums , each one have around 200 photos (some photos shared in multiple albums) , I tried to remove some of them and stays on fewer albums but it still happening ? Are there any specific rules for the albums using this api ? I used these albums on the previous api with no problems.

Thanks again

Pi on 4K

I've tried connecting Pi3 to 2 different 4K screens.
When the frame runs, I get a black border around the image - maybe 150px, all 4 sides.
Is this a Pi/4K issue or is that part of the image rending logic?

Photoframe configuration page not loading

New to GitHub. Love this project idea! Attempting it on a Raspberry Pi 1 with Edimax WiFi dongle. Followed all the steps and everything works up until I click "Allow" to allow sensenet.nu access to my google account. I am directed to a static page (https://photoframe.sensenet.nu/?state=<?php%.......etc) that loads the attached code. I'm not a php developer so I can't make a lot of sense of it. Not sure if this is where I post this problem because it sounds like a niche issue, but I would love to get this running! Any advice?

Thanks!

photoframe.sensenet.nu.txt

Connection Issue

Seems to be the same as Issue #22. I suppose going into the FAQ to setup my own service would get around this problem?

Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint
File "/usr/lib/python2.7/dist-packages/flask_httpauth.py", line 93, in decorated
return f(*args, **kwargs)
File "./frame.py", line 414, in oauth_step1
return redirect(oauth.initiate())
File "/root/photoframe/modules/oauth.py", line 89, in initiate
self.rid = self.getRedirectId()
File "/root/photoframe/modules/oauth.py", line 85, in getRedirectId
r = requests.get('%s/?register' % self.ridURI)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 487, in send
raise ConnectionError(e, request=request)
ConnectionError: HTTPSConnectionPool(host='photoframe.sensenet.nu', port=443): Max retries exceeded with url: /?register (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused',))

Simplify adding a new service

Today you need to make many changes to the service manager in order to successfully add a new service. This needs to be simplified so there's essentially only one or two lines of work (or even better, autodetect new services... hmmm...)

SSLError when run from systemd

If i run photoframe.sh from terminal, everything works as expected. When systemd starts it after a reboot, though, it freezes and the log shows the errors below:

-- Logs begin at Tue 2018-12-25 18:35:03 GMT, end at Tue 2018-12-25 18:35:55 GMT. --
Dec 25 18:35:11 raspberrypi systemd[1]: Started Photo Frame.
Dec 25 18:35:29 raspberrypi photoframe[499]: 2018-12-25 18:35:29,926 - INFO - No http-auth.json found, disabling http authentication
Dec 25 18:35:30 raspberrypi photoframe[499]: 2018-12-25 18:35:30,038 - INFO - No SMB subsystem, color sensor unavailable
Dec 25 18:35:53 raspberrypi photoframe[499]: 2018-12-25 18:35:53,255 - INFO - Starting presentation
Dec 25 18:35:53 raspberrypi photoframe[499]: 2018-12-25 18:35:53,264 - ERROR - No result returned!
Dec 25 18:35:54 raspberrypi photoframe[499]: 2018-12-25 18:35:54,842 - ERROR - Issues downloading
Dec 25 18:35:54 raspberrypi photoframe[499]: Traceback (most recent call last):
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/modules/oauth.py", line 64, in request
Dec 25 18:35:54 raspberrypi photoframe[499]: result = auth.get(uri, stream=stream, params=params)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 501, in get
Dec 25 18:35:54 raspberrypi photoframe[499]: return self.request('GET', url, **kwargs)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/dist-packages/requests_oauthlib/oauth2_session.py", line 358, in request
Dec 25 18:35:54 raspberrypi photoframe[499]: headers=headers, data=data, **kwargs)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
Dec 25 18:35:54 raspberrypi photoframe[499]: resp = self.send(prep, **send_kwargs)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
Dec 25 18:35:54 raspberrypi photoframe[499]: r = adapter.send(request, **kwargs)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 497, in send
Dec 25 18:35:54 raspberrypi photoframe[499]: raise SSLError(e, request=request)
Dec 25 18:35:54 raspberrypi photoframe[499]: SSLError: ("bad handshake: Error([('', 'osrandom_rand_bytes', 'getrandom() initialization failed.')],)",)
Dec 25 18:35:54 raspberrypi photoframe[499]: Exception in thread Thread-4:
Dec 25 18:35:54 raspberrypi photoframe[499]: Traceback (most recent call last):
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
Dec 25 18:35:54 raspberrypi photoframe[499]: self.run()
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/usr/lib/python2.7/threading.py", line 754, in run
Dec 25 18:35:54 raspberrypi photoframe[499]: self.__target(*self.__args, **self.__kwargs)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/modules/slideshow.py", line 101, in presentation
Dec 25 18:35:54 raspberrypi photoframe[499]: result = self.services.servicePrepareNextItem(svc, filename, ['image/jpeg'], {'width' : self.settings.getUser('width'), 'height'
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/modules/servicemanager.py", line 268, in servicePrepareNextItem
Dec 25 18:35:54 raspberrypi photoframe[499]: return svc.prepareNextItem(destinationFile, supportedMimeTypes, displaySize)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/services/svc_googlephotos.py", line 52, in prepareNextItem
Dec 25 18:35:54 raspberrypi photoframe[499]: result = self.fetchImage(destinationFile, supportedMimeTypes, displaySize)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/services/svc_googlephotos.py", line 86, in fetchImage
Dec 25 18:35:54 raspberrypi photoframe[499]: result = self.requestUrl(imageUrl, destination=destinationFile)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/services/base.py", line 286, in requestUrl
Dec 25 18:35:54 raspberrypi photoframe[499]: result = self._OAUTH.request(url, destination, params, data=data, usePost=usePost)
Dec 25 18:35:54 raspberrypi photoframe[499]: File "/root/photoframe/modules/oauth.py", line 94, in request
Dec 25 18:35:54 raspberrypi photoframe[499]: return {'status':result.status_code, 'content':result.content}
Dec 25 18:35:54 raspberrypi photoframe[499]: AttributeError: 'NoneType' object has no attribute 'status_code'

Did i miss something?
Merry Christmas!

Power saving with schedule only (without sensor)

I'm trying to make the frame turn Off at 2 A.M and On at 8 A.M without using the sensor, like this:

screen shot 2018-12-31 at 7 38 09 pm

However, the function doesn't work properly , I tried different times and sometimes it works fine. it looks like if the turn off time is at "A.M" (or maybe if both times in A.M) it won't work, would you please take a look on that. Thanks again :)

The "Open" button doesn't behave as expected

The "Open" button next to a keyword doesn't behave as one would expect when using the new google photos provider. It simply searches google photos instead of trying to open the album.

Expose rotation from config.txt

display orientation (or rotation as it were) should be exposed as a drop-down box to simplify the life of anyone trying to run a non-standard orientation ๐Ÿ˜„

Use OpenFace to do better zoom

Bluring the original image and placing it in the background is all well and fine when the image won't fill the screen. But it would be really awesome to detect faces and zoom while keeping them in-view whenever possible and thus avoid the blur logic if not needed.

So as long as the faces can be centered on the screen, zoom can be used to maximize screen space. If this still doesn't fill the screen, then use the blur method to cover the remaining space.

FR: Allow caching of images

One feature that would be useful is the option to cache images. Every set amount of time the photo frame would then compared the cached images with the latest list and either download new photos or delete photos that are no longer on the list.

This would come in handy for photo frames using a limited connection such as a cellular connection. This also adds another question does the software support a wired pi connection? Does it support the cellular CDMA or GSM hat on the pi?

Every other image not following

I have a weird issue we almost every other image pull I get a issue showing image check network or settings message. The the next image it pulls. I tried resetting the pi 3 b+ to default and reloaded the image and same result the raspberry pi is sitting like 8 ft from the access point so I am unsure what's going on. The syslog is filled with this message over and over.

Dec 30 21:52:01 photoframe photoframe[546]: 2018-12-30 21:52:01,789 - ERROR - Fail$Dec 30 21:52:01 photoframe photoframe[546]: Traceback (most recent call last): Dec 30 21:52:01 photoframe photoframe[546]: File "/root/photoframe/modules/slide$Dec 30 21:52:01 photoframe photoframe[546]: logging.debug('Loaded %d images in$Dec 30 21:52:01 photoframe photoframe[546]: KeyError: 'entry'

Issue with boot

Hi I'm really new to raspberry use. I found our picture frame project and it looked very easy for me to do. I have burned the image to my sd card and booted the pi zero W. I have let it run for upto 30 mins at the first boot i'm using a 32gb sd card. It powers on and my screen show that it's receiving data, but I'm not getting anything displayed on it. I can' proceed to the next step. Can you please help me?

Contributed photos do not appear

I created an Google Photo album called "TestPhotoFrame" for example. I then used the keyword "TestPhotoFrame" in your software, which was able to find all the photos i had put in the album. I then added a contributor to that album. The contributor added their own photos to that same album and yet they do not show up under that keyword. It appears google doesn't add that "tag" to photos contributed to an album.

Is there a way to either allow me to point the software to one specific album or to get the contributed photos to show up?

Also it would be nice to add a button to force it to sync with google photos.

Finally, is there a limit to the number of photos? I assume this downloads all the photos from the album and then displays them or does it load each photo from the web each time?

Getting errors this morning on my keywords.

Good morning! :)
I'm getting errors on all my frame this morning...
In the Log:
Jan 2 09:08:19 photoframe03 photoframe[539]: 2019-01-02 09:08:19,425 - INFO - Starting presentation Jan 2 09:08:19 photoframe03 photoframe[539]: 2019-01-02 09:08:19,439 - ERROR - Unable to create query the keyword "Fotoram Louise" Jan 2 09:08:20 photoframe03 photoframe[539]: 2019-01-02 09:08:20,632 - ERROR - Unable to create query the keyword "Fotoram Louise" Jan 2 09:08:22 photoframe03 photoframe[539]: 2019-01-02 09:08:22,546 - ERROR - Unable to create query the keyword "Fotoram Louise" Jan 2 09:08:23 photoframe03 photoframe[539]: 2019-01-02 09:08:23,814 - ERROR - Unable to create query the keyword "Fotoram Louise"

On screen:
image

The album name is correct: Fotoram Louise
image

The "Open" button now works by the way!

Happy New Year! :)

Error after OKing sensenet to access google photos

Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint
File "/usr/lib/python2.7/dist-packages/flask_httpauth.py", line 93, in decorated
return f(*args, **kwargs)
File "./frame.py", line 419, in oauth_step3
oauth.complete(request.url)
File "/root/photoframe/modules/oauth.py", line 109, in complete
client_secret=self.oauth['client_secret'],
KeyError: 'client_secret'

Can't find images

If I test key words, it goes to my photos, and allows me to search. I added a search parameter, and if i open it is successively searches my photos. I have authorized and reauthorized my account several times. The pictures still don't show up. if i use the default search that automatically goes to the last picture, and test it i get "Error 404 The requested URL was not found on this server." I also can't change the timezone. It always goes back to default.

Ambient Status Display...

Sensor is working, there are noticeable changes to the images displayed when the ambient light is changed. The status in the browser never changes though.

"Current ambient environment -.-- lux and ----K color temperature."

Any clues for troubleshooting would be appreciated! Would like to use ambient power save feature, but would be nice to see current readings when setting this up.

Thanks!

Enable selection of branch

It should be possible to select different branches to follow, allowing for testing development features without compromising master

Keyword only allows existing Albums

I have forced an update to get the most recent changes, clearly you have spent a great deal of time improving photoframe - Thank you.

It appears that the keywords now only accept album names that match the name (spelling, not case)of an existing album. In the prior version, with Picasa, any search word was possible. When there is no match the UI (browser) hangs until I do a refresh - which basically removes the entered search value and then the preview and the actual display show message indicating no albums were specified.

Logs:
~/photoframe# ./frame.py --debug
2019-01-08 09:24:16,662 - DEBUG - Found "/boot/http-auth.json", loading the data
2019-01-08 09:24:16,726 - DEBUG - Internal display: {'3d_modes': [], 'width': 8, 'rate': 60, 'code': 1, 'mode': 'INTERNAL', 'scan': '(internal)', 'aspect_ratio': '', 'reverse': True, 'depth': 16, 'height': 8}
2019-01-08 09:24:17,872 - INFO - ColorSensor not available
2019-01-08 09:24:17,875 - DEBUG - hourOn = 4, hourOff = 22
2019-01-08 09:24:17,876 - DEBUG - Powermode changed to 'none'
2019-01-08 09:24:32,417 - INFO - Starting presentation
2019-01-08 09:24:49,262 - DEBUG - Query Google Photos for album named "yellow"
2019-01-08 09:24:49,268 - DEBUG - Invoking 0 protected resource request hooks.
2019-01-08 09:24:49,270 - DEBUG - Adding token {u'access_token': u'xxxx', u'expires_in': 3600, u'expires_at': 1546958244.58698, u'token_type': u'Bearer', u'scope': [u'https://www.googleapis.com/auth/photoslibrary.readonly'], u'refresh_token': u'yyyy'} to request.
2019-01-08 09:24:49,271 - DEBUG - Requesting url https://photoslibrary.googleapis.com/v1/albums using method GET.
2019-01-08 09:24:49,272 - DEBUG - Supplying headers {u'Authorization': u'xxxxx'} and data None
2019-01-08 09:24:49,273 - DEBUG - Passing through key word arguments {'allow_redirects': True, 'params': {'pageSize': 50}, 'stream': False}.
2019-01-08 09:24:49,311 - DEBUG - Starting new HTTPS connection (1): photoslibrary.googleapis.com
2019-01-08 09:24:50,258 - DEBUG - https://photoslibrary.googleapis.com:443 "GET /v1/albums?pageSize=50 HTTP/1.1" 200 None
2019-01-08 09:24:50,287 - DEBUG - Album: Fireworks
2019-01-08 09:24:50,288 - DEBUG - Album: Utah
2019-01-08 09:24:50,288 - DEBUG - Album: SingleShot
2019-01-08 09:24:50,289 - DEBUG - Album: Vail Gold Club
2019-01-08 09:24:50,290 - DEBUG - Album: Vail 2010
2019-01-08 09:24:50,293 - DEBUG - Invoking 0 protected resource request hooks.
2019-01-08 09:24:50,294 - DEBUG - Adding token {u'access_token': u'xxxxxx', u'expires_in': 3600, u'expires_at': 1546958244.58698, u'token_type': u'Bearer', u'scope': [u'https://www.googleapis.com/auth/photoslibrary.readonly'], u'refresh_token': u'yyyyy'} to request.
2019-01-08 09:24:50,295 - DEBUG - Requesting url https://photoslibrary.googleapis.com/v1/sharedAlbums using method GET.
2019-01-08 09:24:50,296 - DEBUG - Supplying headers {u'Authorization': u'xxxx'} and data None
2019-01-08 09:24:50,297 - DEBUG - Passing through key word arguments {'allow_redirects': True, 'params': {'pageSize': 50}, 'stream': False}.
2019-01-08 09:24:50,307 - DEBUG - Starting new HTTPS connection (1): photoslibrary.googleapis.com
2019-01-08 09:24:50,878 - DEBUG - https://photoslibrary.googleapis.com:443 "GET /v1/sharedAlbums?pageSize=50 HTTP/1.1" 200 None

Note the search for "yellow" on the googlephotos webpage does show a few pictures.

Hopefully search using any keyword can be repaired. The ability to find a person across all albums is a nice feature

Connection Error

Just went through your setup guide twice and each time after i paste the OAUTH data and click the connect button i get this:

Uh oh, something went wrong...
Please go to github and see if this is a known issue, if not, feel free to file a new issue with the following information:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functionsrule.endpoint
File "/usr/lib/python2.7/dist-packages/flask_httpauth.py", line 93, in decorated
return f(*args, **kwargs)
File "./frame.py", line 414, in oauth_step1
return redirect(oauth.initiate())
File "/root/photoframe/modules/oauth.py", line 89, in initiate
self.rid = self.getRedirectId()
File "/root/photoframe/modules/oauth.py", line 85, in getRedirectId
r = requests.get('%s/?register' % self.ridURI)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 487, in send
raise ConnectionError(e, request=request)
ConnectionError: HTTPSConnectionPool(host='photoframe.sensenet.nu', port=443): Max retries exceeded with url: /?register (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused',))

Issue with slideshow freezing.

I'm still new to this and learning, but do not see any information about it on here. I am having an issue with the slideshow freezing when it goes through all the pictures.

Images sometimes resized incorrectly

Images are sometimes expanded and cropped unnecessarily. I have observed this in several cases, e.g. when the image retrieved is 1803x1080px for display on a 1920x1080px display.

I believe this is caused by a bug in the static method makeFullframe() in modules/helper.py, triggered when the retrieved image is very close to the size of the display. In the cited example, where the image is 1803x1080px, it is not true that adjHeight < displayHeight so we end up with padding between 20 and 60 so zoomOnly is forced to True, causing convert to be called with -resize ^1920x1080. This expresses minimum dimensions so the width is expanded to 1080 and the height is therefore expanded and then cropped to keep the aspect ratio.

I have noticed this because I am using my simpleUrl service to fetch images from my own local server, which delivers them pre-sized to fit the frame. It also writes some descriptive text in the top right corner of the image, which is cropped in these cases. Otherwise these minor crops would probably go unnoticed.

There is likely a better algorithm for resizing images to handle near-fits such as this more gracefully, probably just doing nothing. I intend to give this some thought and submit a patch when I get the opportunity, if nobody else gets there first.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.