30f8fab67c
- Clarified where the log is
132 lines
3.8 KiB
Markdown
132 lines
3.8 KiB
Markdown
# flashair uploader
|
|
|
|
|
|
## Installation requirements
|
|
|
|
|
|
* systemd (otherwise the timer have to be changed (crond is not able to operate at 7 second intervals)
|
|
* git
|
|
* python3, python3-pip
|
|
`sudo apt install python3-pip`
|
|
* libcurl4-openssl-dev libssl-dev
|
|
`sudo apt install libcurl4-openssl-dev libssl-dev`
|
|
|
|
|
|
## Setup
|
|
|
|
Get the code with
|
|
`git clone https://code.ungleich.ch/rouxdo/flashair-uploader.git`
|
|
Move the `flashairup` directory to the desired place (e.g. `/home/<USER>/`), referred now as WORKDIR
|
|
|
|
Install the required python packages:
|
|
```
|
|
cd WORKDIR
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Systemd setup
|
|
|
|
Change in the WORKDIR the `flashairup.systemd` file and
|
|
move the file to `/etc/systemd/system/`.
|
|
Move the `flashairup.timer` file to the same location.
|
|
The files can be found in the `scripts` directory.
|
|
|
|
After move the files to the correct directories, enable the timer with the following statement:
|
|
```
|
|
sudo systemctl enable --now flashairup.timer
|
|
```
|
|
|
|
### Configuration and Directory hierarchy
|
|
|
|
|
|
Create the following directory structure inside the WORKDIR:
|
|
|
|
```
|
|
├── flashairup
|
|
│ ├── data
|
|
│ │ ├── cam1
|
|
│ │ │ ├── last.txt
|
|
│ │ │ └── pictures
|
|
│ │ └── ...
|
|
│ ├── flashairup.conf
|
|
│ └── ...
|
|
└── ...
|
|
```
|
|
where `cam1` is only an example for the name of a cam.
|
|
The `last.txt` is needed for keeping track of the index of the last synchronised pictures.
|
|
If the card gets formatted, the counter in this file needs to be reset as well.
|
|
The `flashairup.conf` should at least contain the `DEFAULT` section:
|
|
|
|
```
|
|
[DEFAULT]
|
|
ftp_srv = FTP-SERVER
|
|
ftp_path = PATH
|
|
ftp_user = USER
|
|
ftp_pwd = PASSWORD
|
|
db = new
|
|
# Set the logger level (DEBUG, INFO, WARNING, ERROR)
|
|
log_level = DEBUG
|
|
```
|
|
|
|
Add a cam section to the config file:
|
|
|
|
```
|
|
[cam1] # cam name
|
|
ip = CAM-IP
|
|
location = LOCATION-OF-THE-PICTURES-ON-CAM
|
|
```
|
|
|
|
Example config:
|
|
|
|
```
|
|
[DEFAULT]
|
|
ftp_srv = my.ftp.server.org
|
|
ftp_path = media/pictures
|
|
ftp_user = ftpuser
|
|
ftp_pwd = strongpassword1
|
|
# Decide if the pictures are going to be uploaded in the new db or in the old db
|
|
db = new
|
|
# Set the logger level (DEBUG, INFO, WARNING, ERROR)
|
|
log_level = DEBUG
|
|
|
|
[cam1]
|
|
ip = 10.0.0.10
|
|
location = DCIM/101NIKON
|
|
```
|
|
|
|
|
|
|
|
## Troubleshooting
|
|
|
|
### Log
|
|
|
|
You can examine the log with the following command:
|
|
|
|
```
|
|
journalctl -lfu flashairup
|
|
```
|
|
|
|
### FlashAir SD-Card is not connecting to the WLAN
|
|
|
|
First, there may be a configuration error, check the [FlashAir Configuration](#flashair-configuration) for a correct configuration
|
|
|
|
Second, the Access Point might run on a channel which is not reachable by the FlashAir card.
|
|
Ensure that the configured channel is between 1 and 10.
|
|
|
|
|
|
## Knowledge Base
|
|
|
|
The configuration on the Flashair cards was taken from [here](https://mattshub.com/blog/2017/04/11/flashair-sd-card)
|
|
|
|
### Short concept of the python program
|
|
|
|
Since the Flashair cards create a small webserver on which the pictures are served, one is able to get them via curl.
|
|
The python program therefore uses curl to download the pictures.
|
|
With another curl command it is possible to get a list of files on the cam.
|
|
The program gets this list and compare the number of the last image with the number on the corresponding `last.txt`.
|
|
If the number is higher on the Flashair card, the picture gets processed.
|
|
By processing, it is meant that the curl command for downloading a file is issued, then the file gets uploaded via FTP
|
|
to the remote server and finally the counter in `last.txt` gets updated.
|
|
This is important, because if there were some mistakes in the processing, the counter will stay the same and therefore,
|
|
the picture is downloaded again in the next run.
|
|
The job of each python function and object is documented inside the code
|