Że pi zdrożało nieprzyzwoicie przypomniałem sobie, że mam jeszcze trzy egzemplarze modelu zero w wersji bez wbudowanego w płytkę Wi-Fi
Pi ma mieć tylko kamerę i termometr DS18B20, ale karta Wi-Fi wymaga przejściówki USB-Mini USB żeby ją wsadzić. Kupiłem coś takiego za 3 PLN na Allegro. Teraz mogą instalować system:
snap install rpi-imager
Instaluje program do instalowania systemu na kartach SD. Instalacja idzie błyskiem.
W /boot
dodaję plik ssh (może być pusty)
żeby przy starcie uruchomił się demon SSH
Podobnie żeby przy starcie system połączył się z siecią Wi-FI
plik /etc/wpa_supplicant/wpa_supplicant.conf
powinien zawierać coś w rodzaju:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=US network={ ssid="NETWORK_NAME" psk="password" key_mgmt=WPA-PSK }
Teraz się okazało, że i tak się nie połączy,
bo nie ma normalnego użytkownika w systemie. Takiego użytkownika można
utworzyć na etapie tworzenia karty systemowej (czyli
za pomocą rpi-imager
; tam zresztą też można podać
namiary na sieć WiFi a nie grzebać w pliku
wpa_supplicant.conf
.) No ale ja tego nie zrobiłem.
Na szczęście nie trzeba uruchamiać rpi-imager
powtórnie. Wystarczy znowu dłubnąć w plikach konfiguracyjnych, konkretnie
Należy utworzyć plik
userconf.txt
w katalogu /boot
.
W tym pliku wpisać (jeden wiersz):
pi:$6$/XOZsG1X0IAbhXB0$wYZHRkvib0SUKQA3KVAxofPR.JsFAbI2NCue2znGvhRsQobVdllFXyQZ7fMSvAoyEj8MfHtkMeSZT7IRIixg01
No to jest hasło raspberry
dla użytkownika pi
Teraz już zadziała
ssh -l pi 192.168.1.cośtam
Teraz:
sudo raspi-config ## uaktywniam kamerę i 1Wire sudo apt update sudo apt upgrade
Kamera działa. Termometr działa
Dodaję niezbędne pakiety. Nie za dużo bo to wolny komputer. Ma robić zdjęcia, mierzyć temperaturę i wysyłać na Twittera i githuba.
apt -y install ncftp sshfs vim mc \ imagemagick imagemagick-6-common imagemagick-6.q16 \ python3-tweepy
Kopiuję niezbędne skrypty konfiguracyjne .netrc
oraz .gitconfig
żeby móc zapisywać do repozytoriów githuba.
## .netrc machine github.com login hrpunio password ghp_###### ## .gitconfig [user] name = tomasz przechlewski email = rudolf.von.ems@gmail.com [github] user = hrpunio token = 650000000000000000000000 [credential] helper = cache
Ten pierwszy to chyba niepotrzebny.
Wszystko zamykam w puszce pn Puszka elektryczna natynkowa Elektro-Plast 0251-00 135x135x42mm, która mieści płytkę, i kamerę. Robię w niej dziurę na kamerę oraz drugą na przewody. Dla Rpi-Zero jest miejsca aż nadto; Rpi-3 też się zmieści BTW, nawet z kamerą OV5647/5MP/175 stopni, która ma znacznie większy obiektyw (wystaje z puszki.)
Mam na działce trzy raspberry pi, każde wyposażone w standardową kamerę oraz czujnik BME 280 (temperatura/ciśnienie/wilgotność/.)
Ponieważ czujnik czasami szwankował co być może było spowodowane kiepskim montażem, a kamera robiła zdjęcia kiepskiej jakości, to sobie wymyśliłem upgrade. Konkretnie, że zmienię kamerę na OV5647/5MP z szerokokątnym obiektywem (175 stopni), a do BME 280 dodam niezawodny DS18B20, który wprawdzie mierzy tylko temperaturę ale za to dokładnie.
Połączenia wtyki czujników/GPIO są następujące:
Podłączyłem wszystko tym razem porządniej (a przynajmniej tak mi się wydaje.) Nowa kamera wymagała większej dziury i innego sposobu umocowania na pokrywie obudowy.
Dla przypomnienia: BME 280 testuje się czy działa wydając polecenie:
i2cdetect -y 1
Co powinno skutkować wypisaniem kilkudziesięciu kresek i liczby 76. Jeżeli są same kreski coś nie działa.
Czujnik DS18B20 z kolei powinien być widoczny tutaj:
ls -l /sys/bus/w1/devices/w1_bus_master1/
Tam powinien być numer czujnika, moim przypadku
jest to 28-4680e30264ff
. Temperaturę się czyta
po prostu
#!/bin/bash # Odczyt temperatury z zapisem do loga LOG_DIR=/home/pi/Logs/Digitemp SENS="28-4680e30264ff" TIME="`date "+%Y%m%d%H%M%S"`" TEMP="`cat /sys/bus/w1/devices/${S1}/w1_slave | tr '\n' ' '`" echo "$TIME;$SENS;$TEMP" >> $LOG_DIR/digitemp.log
Przy okazji przetestowałem też AHT10 (temperatura/wilgotność), który
działa ale z obsługą jest już słabo.
Znalazłem mianowicie skrypt w Pythonie drukujący temperaturę
z dokładnością do stopnia a innych skryptów, które by podawały dokładniej, nie udało mi się
uruchomić. W google zresztą podejrzanie mało informacji na temat
AHT10+raspberry
.
Przy okazji też przetestowałem patent na skonfigurowanie rpi z wieloma sieciami WiFi:
/etc/wpa_supplicant/wpa_supplicant.conf ##==== ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="network1" psk="password1" id_str="id-string1" } network={ ssid="network2" psk="password2" id_str="id-string2" }
Teraz mogę sobie przynieść pi z działki, włączyć i mi się połączy z WiFi w domu też:-)
Zainstalowałem wreszcie WP na raspberry (celem testowania) i to od razu z dostępem z zewnątrz nie żadne tam localhost. Że mam dwa komputerki, które robią za serwery WWW (a router jeden), to sobie wymyśliłem, że będę je rozpoznawał po porcie. W tym celu w Tomato dopisałem jeden wiersz w części port forwarding:
## nafisa.blogsite.org:8080 ## Dopisać linijkę w tomato (port forwarding) ## Najpierw: systemctl stop nginx ## Potem wg: https://www.makeuseof.com/tag/host-wordpress-raspberry-pi/ apt install apache2 -y apt install php -y apt install mariadb-server-10.0 php-mysql -y wget http://wordpress.org/latest.tar.gz
Teraz konfigurowanie apache'a: dodane nafisa_blogsite.conf (musi być .conf!)
do katalogu /etc/apache2/sites-available/
. Następnie:
ln -s /etc/apache2/sites-available/nafisa_blogsite.conf \ /etc/apache2/sites-enabled/nafisa_blogsite.conf ## wpisanie Listen 8080 do vi /etc/apache2/ports.conf systemctl start apache2
Instalowanie mysql/mariadb:
sudo mysql_secure_installation sudo mysql -uroot -p create database wordpress; GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' IDENTIFIED BY 'PASSWORD'; FLUSH PRIVILEGES;
Teraz mi to beznadziejnie zawisło i nie mogłem się zalogować; do tego
nie mogłem też zatrzymać demona mysql
.
W końcu zabiłem dziada za pomocą kill -9
,
a po starcie magicznie wszystko zadziałało.
Konfigurowanie WP
Wpisałem z palca do wp-config.php define( 'DB_NAME', 'wordpress' ); define( 'DB_USER', 'root' ); define( 'DB_PASSWORD', '????' );
Potem uruchomiłem http://nafisa.blogsite.org:8080/wp-admin
:
Nazwa bloga: pinkaccordions User: tomek ## Plugins ## NextGen do tworzenia galerii zdjęć https://pluginarchive.com/wordpress/nextgen-gallery https://downloads.wordpress.org/plugin/nextgen-gallery.3.5.0.zip ## Nie podoba mi się ten Gutenberg ## Classic editor vs Gutenberg https://downloads.wordpress.org/plugin/classic-editor.1.6.zip
Nextgen nie działa (dokładniej upload z dysku nie działa), bo brakuje mu dwóch modułów:
sudo apt-get install php-xml php-gd sudo service apache2 restart
Gotowe i działa tutaj
Czujnik ten jest fragmentem większej całości, że tak powiem tajemniczo.
Do jego uruchomienia wykorzystałem doskonały opis ze strony
https://twojpomyslna.wordpress.com/2019/02/18/raspberry-pi-bme280-i2c-domoticz/
.
Zresztą jest to ekstremalnie proste...
BME 280 występuje w kilku wariantach. Na stronie
twojpomyslna.wordpress.com
pokazany jest czujnik
z czterema stykami, a ja kupiłem z sześcioma i też działa.
Styki podłączamy następująco: VCC→#P1, GND→#P6, SCL→#P5,
SDA→#P3.
Potem należy zainstalować stosowny software:
sudo apt-get install -y python-smbus i2c-tools ## Sprawdzamy czy działa ## ls -l /dev/i2c* ## crw-rw---- 1 root i2c 89, 1 mar 29 15:41 /dev/i2c-1 i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Teraz ściągam/uruchamiam skrypt bme280.py
:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bme280.py python bme280.py
Wydruk jest dość rozwlekły i bez daty/czasu więc modyfikuję skrypt, tak aby całość była drukowana w jednym wierszu. Dodaję stosowany wpis do crontaba.
Czujnik jest lepszy od DHT22 nie tylko dlatego, że oprócz temperatury/wilgotności, jeszcze mierzy ciśnienie, ale także działa podłączony kilkumetrowym przewodem a DHT22 odmawiał wtedy współpracy.
Stare Pi usiłuję zamienić na kamerę w ogródku:
## co to za wersja Pi? less /proc/cpuinfo ... Model : Raspberry Pi Model A Rev 2
Problemem jest zasięg WiFi (od routera do kamery jest jakieś 8 metrów przez szybę, żadnych murów). Do tego Pi ma tylko jedno złącze USB co utrudnia sprawę, bo ujawnia się złośliwość przedmiotów martwych (ZPM): z dwóch moich rezerwowych hubów żaden nie działa z tym konkretnym RPi. Podłączam hub z PCeta--ten działa...
Żeby było lepiej (z łącznością) zakupiłem TP-Link TL-WN722N (v2), ale okazało się że akurat wersja 2 nie jest rozpoznawana przez fabryczny Raspbian. Pech albo ZPM2.
Najpierw usiłowałem zainstalować stosowny sterownik
wg wskazówek ze strony https://github.com/lwfinger/rtl8188eu
:
git clone https://github.com/lwfinger/rtl8188eu.git sudo apt-get install raspberrypi-kernel-headers sudo ln -s /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build cd rtl8188eu/ make all sudo make install sudo reboot
Nie działa dalej, a moduł się skompilował, zainstalował i nawet jest ładowany...
Zadziałał ten przepis (https://www.raspberrypi.org/forums/viewtopic.php?t=250911#p1532103
):
You can download the driver from http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/
.
Choose the driver that matches the output of command uname -a
for the correct kernel version:
uname -a # Linux aisara 4.19.97+ #1294 Thu Jan 30 13:10:54 GMT 2020 armv6l GNU/Linux mkdir Temp && cd Temp wget http://downloads.fars-robotics.net/wifi-drivers/8188eu-drivers/8188eu-4.19.97-1294.tar.gz tar -zxvf 8188eu-4.19.97-1294.tar.gz ./install.sh
BTW Installing my driver will disable the built in r8188eu driver. To re-enable the built in driver you will need to run the following commands:
sudo rm /etc/modprobe.d/8188eu.conf sudo rm /lib/modules/4.19.69-v7l+/kernel/drivers/net/wireless/8188eu.ko sudo depmod -a
Miałem już ze starych czasów puszkę z Raspberry w środku, z kamerą przyczepioną do ścianki, zrobioną dziurą na obiektyw i kablem doprowadzającym zasilanie przez piny P2+P6 (też tak można). Zasilacz w domu, poza oknem już 5V. Na wszelki wypadek -- żeby mi kogoś nie zabiło przez przypadek (a nawet czegoś, bo teraz czasy takie że jakby dzika poraziło, to też by była afera) -- wolałem nie ciągnąć 230V z mieszkania. Dlatego też zasilanie jest po zwykłym dwużyłowym kablu a nie przez USB (bo tak mi się wydawało prościej).
Znowu coś nie tak od pierwszego strzału (ZPM3):
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
Ze starych czasów pamiętam, że problem może być z połączeniem/uszkodzeniem (taśmy na przykład). Zmieniłem kamerę i taśmę na inną. Działa. Musiała być uszkodzone widocznie.
Kamerą będę fotografował mój blok od tyłu, że tak powiem. Z drzewkiem brzoskiwni na pierwszym planie. Zdjęcia wysyłał na Twittera co 3 godziny na przykład:
0 6,9,12,15,18,21 * * * /home/pi/bin/mk1photo.sh
Na zdjęciu widać czujnik ruchu, bo faktycznie takowy też dokleiłem do obudowy. Że niby miał zdjęcia robić jak ruch wykryje, ale ponieważ to w zasadzie nie działało, więc teraz ten czujnik wprawdzie jest, ale nie podłączony. Atrapa...
Dla przypomnienia moja nowa stacja to konsola WiFi o symbolu
DP1500 kupiona u Niemca (czyli w sklepie froggit.de): ze standardowym
zestawem czujników + czujnik pyłu zawieszonego DP200 (też
Froggita). BTW DP1500 to to samo co GW1000 firmy Ecowitt.
Zaś DP 200 Froggita to WH41 Ecowitta
(http://www.ecowitt.com/wifi_weather/83.html
), albo nawet
PM25 firmy AcuWeather
(https://www.ambientweather.com/ampm25.html
)
Zamiast konsoli kupiłem na OLX 5 calowy ekran (110 PLN) i podłączyłem do Raspberry Pi (bezproblemowo).
# konfiguruję (logowanie bez hasła) Boot Options -> Desktop/CLI -> Desktop Autologin/Desktop GUI # # start chromium-browser załadowanie pliku vi ~/.config/lxsession/LXDE-pi/autostart ## wpisuję @/usr/bin/chromium-browser --disable-restore-session-state \ file:///var/www/html/DP1500_live.html
Ekran jest dotykowy. Jak chcę obejrzeć dane pogodowe to dotykam i się wyświetla.
Że jednak brakowało konsoli, to w końcu jednak kupiłem Froggit HP 1000SE PRO (która jest klonem Ecowitt HP 2551). Froggit sprzedaje konsolę jako ersatz, bez niezbędnego specjalnego czujnika temperatury/wilgotności/ciśnienia. Sama stacja jest bowiem dumb -- nic nie mierzy. Ja miałem czujnik temperatury/wilgotności DP50, ale on nie mierzy ciśnienia. Musiałem dokupić oddzielnie ten specjalny, bo się nie dogadałem a dokumentacja/informacja jest w tym aspekcie mało jasna.
Konfigurowanie HP 1000SE PRO to już nie był żaden problem, bo stacja ma aż 8 klawiszy. Połączyłem ją z routerem a potem z dwoma serwisami: ecowitt.net (www.ecowitt.net; oglądanie wymaga zarejestrowania się w sieci ecowitt.net) oraz z WOW ( wow.metoffice.gov.uk)
Kiedyś kupiłem też inny czujnik pyłu zawieszonego (Nova SDS011) i też go podłączyłem do raspberry (bezproblemowo). Teraz przykręciłem go na ścianie obok DP 200 z zamiarem porównania odczytów.
Reasumując posiadam: starą stację WH 2080 działającą od +10 lat.
Nową stację DP1500/WH1000SE PRO oraz czujnik SDS101.
WH 2080 podłączona jest przez kabel USB
do Sheevaplug (to też zaszłość, planuję docelowo przejść na Raspberry)
a obsługiwania jest przez pywws
.
DP1500/WH1000SE podłączona jest przez router, przy czym DP1500 skonfigurowana
jest na serwer lokalny/weewx, a WH1000SE wysyła dane od razu do WOW/ecowitt.net.
Całość kosztował ponad 2500 PLN (wliczając starą stację WH2080). W sumie mogłem kupić HP1000SE PRO + DP200 za 330 EUR, a kupiłem na raty powyższe plus dodatkowy czujnik DP50/DP200 za 450 EUR. Przepłaciłem...
Po długich namysłach kupiłem nową stację (trzeba się rozwijać) pn DP 1500 SmartHub wifi Gateway (za 50 EUR). Jest to konsola bez ekranu z czujnikiem temperatury/ciśnienia i wilgotności (na metrowym kablu); przedmiot wielkości dużego pudełka od zapałek. Do tego pudełka dokupiłem:
Cenowo to wyszło tak (por www.froggit.de), że maszt + DP 1500 jest w zestawie za 135 EUR (czyli sam maszt kosztuje 85 EUR); czujnik DP 50 to następne 13 EUR (kupiłem dwa na wszelki wypadek); czujnik DP 200 aż 90 EUR. Razem wyszło około 250EUR czyli ponad 1100 PLN z wysyłką i płatnością przez PayPal, bo innej opcji nie ma (nikt nie mówił że będzie tanio)
Wszystko w niemieckiej firmie Froggit. BTW Froggit to klon produktów bardziej znanej firmy Ecowitt. To co Froggit sprzedaje jako DP1500 u Ecowitta nazywa się GW 1000. Są jeszcze inne firmy, które robią ten sprzęt pod inną marką.
W stacjach pogodowych standardem jest teraz wysyłanie danych
w chmurę. Nie ma natomiast możliwości bezpośredniego pobierania danych
z urządzenia. Co najwyżej można wysłać na własną chmurę.
Do tego konfiguruje się urządzenie przez smartfona za pomocą dedykowanej
aplikacji pn. WSView
.
Ot tak to sobie branża wymyśliła.
Średnio mi się to podoba, ale
po prostu urządzeń, z których można pobrać bezpośrednio dane w starym stylu
się nie produkuje (no nie do końca jest to prawdą: produkuje się to co
mam od 10 lat, ale
ja nie chę kupować jeszcze raz tej samej stacji). Skoro trzeba mieć własną chmurę, to trzeba ją założyć.
Na szczęście ponieważ potrzeba jest matką wynalazków, to w tej
sprawie inni ludzie już przygotowali stosowne rozwiązania.
Program weewx
, który tradycyjnie obsługiwał stacje,
że tak powiem
kablowe został uzupełniony o weewx-interceptor
,
który przechwytuje dane
wysyłane na (pseudo) własną chmurę.
No więc rozpakowałem to co przyszło z Niemiec. Skręciłem maszt z czujnikami wiatru/deszczu, nasłonecznienia. Czujnik PM2.5 przykręciłem do ściany we wnęce okiennej, żeby deszcz na niego nie kapał. Czujnik DP 50 wstawiłem do klatki meteo. Maszt umieściłem na dachu budynku 3 kondygnacyjnego (nie ma żadnych problemów z zasięgiem, a mieszkam na parterze.)
Ściągnąłem przez Google Play
aplikację WSView
.
Postępując zgodnie z procedurą
(opisaną w podręczniku) połączyłem się z konsolą, która zaczęła
pokazywać dane z czujników (na smartfonie). Uwaga: WSView
dość wolno się
łączy i na dokładkę wysyła mylące komunikaty o odrzuconych
połączeniach, co powoduje pewien niepokój. Nie należy w tym momencie
wykonywać nerwowych ruchów, tylko poczekać...
weeWX
(na RaspberryPi)Mając ustawione połączenie konsola-router można pójść dalej. Znowu jest to dokładnie opisane i co więcej opis jest zgodny ze stanem faktycznym (cf github.com/weewx/weewx/wiki/gw1000-recipe):
Instalujemy weeWX
(wybierając 'Simulator' jako 'station type').
Później należy zmienić 'station type' na 'Interceptor' uruchamiając wee_config --reconfigure
:
wget -qO - http://weewx.com/keys.html | sudo apt-key add - wget -qO - http://weewx.com/apt/weewx.list | sudo tee /etc/apt/sources.list.d/weewx.list sudo apt-get update sudo apt-get install weewx # shut down weeWX sudo /etc/init.d/weewx stop # install weewx-interceptor extension and enable the driver git clone https://github.com/matthewwall/weewx-interceptor.git sudo wee_extension --install weewx-interceptor sudo wee_config --reconfigure
Sprawdzenie czy interceptor
przechwytuje dane.
W oknie terminala uruchamiamy interceptor.py
ze wskazaniem
na port 8000:
PYTHONPATH=/usr/share/weewx python /usr/share/weewx/user/interceptor.py \ --device=fineoffset-bridge --port 8000 --debug
Uruchamiamy przeglądarkę, wpisujemy następujący URL (192.168.xx.xx to IP komputera z weeWXem):
http://192.168.xx.xx:8000/data/report?PASSKEY=XXX&stationtype=GW1000B_V1.5.5 &dateutc=2019-12-29+16:27:27&tempinf=67.1&humidityin=39 &baromrelin=30.138&baromabsin=30.138&freq=915M&model=GW1000
W oknie terminala z uruchomionym interceptor.py
powinno się
pojawić:
raw data: PASSKEY=XXX&stationtype=GW1000B_V1.5.5&dateutc=2019-12-29+16:27:27&tempinf=67.1 &humidityin=39&baromrelin=30.138&baromabsin=30.138&freq=915M&model=GW1000 raw packet: {'humidity_in': 39.0, 'temperature_in': 67.1, 'barometer': 30.138, 'usUnits': 1, 'dateTime': 1577636847} mapped packet: {'inHumidity': 39.0, 'barometer': 30.138, 'inTemp': 67.1, 'usUnits': 1, 'dateTime': 1577636847}
W aplikacji WSView
przechodzimy do strony 'Weather Services'.
Klikamy 'Next' aż wyświetli się 'Customized'. Na tej stronie wpisujemy IP komputera
z zainstalowanym weeWXem jako wartość pola 'Server IP/Hostname'.
Wpisujemy '/' jako wartość pola 'Path' oraz 8000 jako wartość pola 'Port'.
Domyślny upload jest ustawiony na 60 sekund (zmieniłem na 300).
Ustawienia weeWX są w pliku /etc/weewx/weewx.conf
. W szczególności
sekcja Interceptor
powinna wyglądać następująco:
[Interceptor] driver = user.interceptor device_type = fineoffset-bridge port = 8000
Uruchamianie/zatrzymanie/sprawdzanie usługi:
# Start weewx (as daemon) sudo /etc/init.d/weewx start # Stop weewx # sudo /etc/init.d/weewx stop # Check status # /etc/init.d/weewx status # systemctl status -l weewx # ls -l /etc/rc2.d
WeeWX zapisuje dane do bazy /var/lib/weewx/weewx.sdb
.
Można je oglądać uruchamiając:
sqlite3 /var/lib/weewx.sdb ## wyświetl wszystkie tabele .tables ## wyświetl schemat tabeli archive .schema archive PRAGMA table_info(archive); ## zawartość archive select * from archive; ## zakończ .q
Główną tabelą danych weeWXa
jest archive
:
sqlite> PRAGMA table_info(archive); select * from archive 0|dateTime|INTEGER|1||1 1|usUnits|INTEGER|1||0 2|interval|INTEGER|1||0 3|barometer|REAL|0||0 4|pressure|REAL|0||0 5|altimeter|REAL|0||0 6|inTemp|REAL|0||0 7|outTemp|REAL|0||0 8|inHumidity|REAL|0||0 9|outHumidity|REAL|0||0 10|windSpeed|REAL|0||0 11|windDir|REAL|0||0 12|windGust|REAL|0||0 13|windGustDir|REAL|0||0 14|rainRate|REAL|0||0 15|rain|REAL|0||0 16|dewpoint|REAL|0||0 17|windchill|REAL|0||0 18|heatindex|REAL|0||0 19|ET|REAL|0||0 20|radiation|REAL|0||0 21|UV|REAL|0||0 22|extraTemp1|REAL|0||0 23|extraTemp2|REAL|0||0 24|extraTemp3|REAL|0||0 25|soilTemp1|REAL|0||0 26|soilTemp2|REAL|0||0 27|soilTemp3|REAL|0||0 28|soilTemp4|REAL|0||0 29|leafTemp1|REAL|0||0 30|leafTemp2|REAL|0||0 31|extraHumid1|REAL|0||0 32|extraHumid2|REAL|0||0 33|soilMoist1|REAL|0||0 34|soilMoist2|REAL|0||0 35|soilMoist3|REAL|0||0 36|soilMoist4|REAL|0||0 37|leafWet1|REAL|0||0 38|leafWet2|REAL|0||0 39|rxCheckPercent|REAL|0||0 40|txBatteryStatus|REAL|0||0 41|consBatteryVoltage|REAL|0||0 42|hail|REAL|0||0 43|hailRate|REAL|0||0 44|heatingTemp|REAL|0||0 45|heatingVoltage|REAL|0||0 46|supplyVoltage|REAL|0||0 47|referenceVoltage|REAL|0||0 48|windBatteryStatus|REAL|0||0 49|rainBatteryStatus|REAL|0||0 50|outTempBatteryStatus|REAL|0||0 51|inTempBatteryStatus|REAL|0||0
Nie ma kolumny PM2.5 w szczególności.
To się samo robi. Trzeba tylko zarejestrować stację na ecowitt.net
podając MAC-adres urządzenia, ale ecowitt.net
nie udostępnia danych
publicznie.
Żeby oglądać zawartość ecowitt.net
trzeba się zalogować.
No a żeby się zalogować, to trzeba mieć konto. Inna sprawa że nie trzeba mieć stacji, żeby
mieć konto. Jest też stronka
pod adresem www.weewx.com/stations.html
z wykazem zarejestrowanych stacji obsługiwanych przez WeeWX.
Żeby tam zaistnieć trzeba
wstawić do /etc/weewx/weewx.conf
:
register_this_station = True station_url = http://pinkaccordions.homelinux.org/
Co jest opisane w dokumentacji WeeWXhttp://www.weewx.com/docs/usersguide.htm#station_registry
Nie ma kolumny PM2.5, ale interceptor.py
pobiera co trzeba bo na
ecowitt.net
są dane dotyczące PM2.5 tylko lokalnie nie są rejestrowane
w bazie. Wychodzi na to, że to WeeWx 'nie widzi' ekstra danych.
Jest oficjalny sposób na rozszerzenie schematu bazy
(http://www.weewx.com/docs/customizing.htm#add_archive_type
) ale ja póki co
zrobiłem to na szybko w ten sposób, że zmodyfikowałem działanie
/usr/share/weewx/user/interceptor.py
, który nie tylko wypisuje co przechwycił
(co zapewne przetwarza dalej weeWX), ale także zapisuje przechwycony
rekord do pliku tekstowego. W tym celu dodałem takie coś:
def genLoopPackets(self): last_ts = 0 while True: try: data = self._device.get_queue().get(True, self._queue_timeout) logdbg('raw data: %s' % data) ## LOG every 15 minutes nowMM = time.strftime("%M", time.gmtime()) if (nowMM == '00' or nowMM == "15" or nowMM == "30" or nowMM == "45"): ffex = open("/var/log/weewx_exlog.txt", "a+") ffex.write ('[WEEWX#RAW] %s\n' % data) ffex.close() ##loginf('[WEEWX#RAW]: %s' % data)
Co 15 minut, a dokładniej w 15/30/45 oraz zerowej minucie każdej godziny
zapisywany jest rekord danych do pliku /var/log/weewx_exlog.txt
.
cp interceptor.py interceptor_orig.py ## po zmodyfikowaniu interceptor.py w wyżej opisany sposób python -m py_compile interceptor.py
Standardowe raporty WeeWXa są w katalogu: /var/www/html/weewx
.
W sumie z nich nie korzystam, robię raport po swojemu
z pliku /var/log/weewx_exlog.txt
Dokładniej raport jest tworzony na komputerku bez dostępu do internetu a następnie co godzinę kopiowany na ten, który dostęp ma czyli na pinkaccordions.homelinux.org
W planach jest zakup ekranu LCD 5--7 cali do raspberry co będzie robił za wyświetlacz mojej stacji.
Minimalizowanie liczby zapisów (przeciwdziałanie zużyciu się karty SDHC)
https://github.com/weewx/weewx/wiki/Minimize-writes-on-SD-cards
.
W moim rpi mam Debiana w wersji Buster:
$sudo apt install python-selenium python3-selenium chromium-browser
Uruchamiam prosty skrypt, którego używam do pobierania zasobów z Internetu:
$selenium_get_www_page.py https://www.google.pl chrome not reachable
Po konsultacji z google znalazłem (radykalne) rozwiązanie. Należy zrobić downgrade relewantnych pakietów:
# Jakie są wersje dostępne: apt-cache madison chromium-chromedriver chromium-browser
Nie ma żadnych innych poza tymi, które mam zainstalowane, więc trzeba doinstalować z wersji Stretch:
# Należy dodać deb http://archive.raspberrypi.org/debian/ stretch main # do /etc/apt/sources.list apt-get update # Jakie są wersje dostępne teraz: apt-cache madison chromium-chromedriver chromium-browser chromium-chromedriver | 74.0.3729.157-rpt5 | \ http://archive.raspberrypi.org/debian buster/main armhf Packages ...
Instaluję stare wersje:
apt-get install chromium-chromedriver=72.0.3626.121-0+rpt4 chromium-browser=72.0.3626.121-0+rpt4 chromium-codecs-ffmpeg-extra=72.0.3626.121-0+rpt4 chromium-browser-l10n=72.0.3626.121-0+rpt4 apt-mark hold chromium-chromedriver chromium-browser chromium-codecs-ffmpeg-extra chromium-browser-l10n
Teraz skrypt selenium_get_www_page.py
działa.
Nafisa to arabskie imię żeńskie (i restauracja uzbecka w Elblągu, którą polecam) oraz nazwa mojego nowego serwerka uruchomionego na Raspberry Pi 3.
Do tej pory moje domowe serwery działały (od lat prawie 10) na sheevaPlug i cechowały się wysoką niezawodnością (uptime idący w setki dni; rekord 650 dni). Kiedyś już chciałem je przenieść na RPi, ale ówczesne modele RPi okazały się niedostatecznie reliable. Po nastu dniach następował zwis albo coś w tym stylu, więc dałem sobie spokój. Daję teraz RPi drugą szansę mając nadzieję, że nowe modele są bardziej niezawodne.
Instalacja przebiegła standardowo: ze strony
https://www.raspberrypi.org/downloads/raspbian/
pobieram Raspbian
Buster with desktop and recommended software. Pobieram też zalecany
program balenaEtcher
(https://www.raspberrypi.org/documentation/installation/installing-images/README.md
)
do utworzenia bootowalnej karty SDHC. Klikam, wybieram, zapisuje się.
Nawet szybko. Teraz teoretycznie jak się utworzy plik (z dowolną zawartością)
o nazwie ssh
w partycji boot to można już wkładać kartę do komputerka
i startować, ale ja chcę po WiFi więc i tak muszę hasło podać (też
można pewnie podać grzebiąc w plikach na karcie ale ja nie wiem jak),
więc podłączam RPi do telewizora, łączę z ruterem, zmieniam hasło
i włączam SSH (które jest domyślnie zablokowane)
Konfiguruję router i wszystko działa. Teraz standardowo apt update
.
Pora na zaistalowanie wszystkiego co używam na starym serwerze, więc sprawdzam co ja tam zainstalowałem:
sudo dpkg-query -l | awk '{print $2}'
Wybieram z listy te, które wyglądają na doinstalowane:
apt-get install sshfs vim mc ## Digitemp bo planuję podłączyć termometry 18B20 apt-get install digitemp flickcurl-utils \ flickrbackup fonts-texgyre fuse gpsbabel gphotofs apt-get install r-base r-base-core r-base-dev \ r-base-html r-cran-boot r-cran-class r-cran-cluster \ r-cran-codetools r-cran-foreign r-cran-kernsmooth r-cran-lattice r-cran-mass r-cran-matrix r-cran-mgcv r-cran-nlme r-cran-nnet \ r-cran-rpart r-cran-spatial r-cran-survival r-doc-html r-recommended apt-get install imagemagick imagemagick-6-common \ imagemagick-6.q16 ## tweepy używam do zdalnego wysłania twitów apt install python3-tweepy python-tweepy ## net::twitter używam do pobierania twitów apt install libnet-twitter-perl apt install texlive-base texlive-binaries \ texlive-extra-utils texlive-font-utils \ texlive-fonts-recommended texlive-generic-extra \ texlive-generic-recommended texlive-latex-base texlive-latex-extra \ texlive-latex-recommended texlive-xetex
Potem się okazuje, że jeszcze trzeba doinstalować
apt install apache2 apt install r-cran-gg1plot2 r-cran-reshape2 r-cran-reshape apt install libgeo-distance-perl libjson-perl libgeo-distance-perl
Sprawdzam czy apache działa (łącząc się z nafisa/). Działa... Kopiuję skrypty ze starego serwera. Modyfikuję. Testuję niektóre i nawet działają...
Plan jest taki żeby teraz mocno potestować RPi i zobaczyć czy działa niezawodnie (BTW testowana z pewnym skryptem w R okazała się prawie 2 razy szybsza.)
From time to time internet connection to my Raspberry Pi disappears (AFAIK it is well known feature of Pi). Removing and reconnecting the ethernet cables did not work, so one has to reboot by pulling the plug (risking to corrupt file systems from improper shutdown).
To reconnect I use the following bash script (found here):
#!/bin/bash # Check if Internet connection is still alive *** # Insert into crontab at *.16 LOGLOG="/home/pi/Logs/Cron/Reboot.log" WLAN=eth0 if /sbin/ifconfig $WLAN | grep -q "inet addr:" ; then echo "Network connection up!" else echo "Attempting reconnect [`date +%Y%m%d%H%M`]" >> $LOGLOG /usr/bin/sudo /sbin/ifup --force $WLAN fi
Note: use ifconfig -a
to identify relevant interface (WLAN
):
pi@raspberryberrystar ~ $ ifconfig -a ifconfig -a eth0 Link encap:Ethernet HWaddr b8:27:eb:f5:9a:d7 inet addr:192.168.1.146 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
My other Pi is connected to internet not through a cable but with WiFi dongle. The relevant interface is:
pi@blackberrystar ~ $ ifconfig -a wlan2 Link encap:Ethernet HWaddr 10:fe:ed:12:ef:2c inet addr:192.168.1.144 Bcast:192.168.1.255 Mask:255.255.255.0
The connection is checked every 20 minutes with the following crontab entry:
## Check Internet connection every 7th, 27th, 47th minute: 7,27,47 * * * * /home/pi/bin/chk_www_alive.sh > /dev/null 2>&1
I am using Raspberry Pi version A (256 Mb) for more than a year and now I bought one Pi more--model B (512 Mb) this time. I bought a TP-Link WiFi card (TL-WN725N) and a camera as well. The plan is:
Attaching everything to one single Pi is not an option--I want the camera-equipped Pi to be more portable.
Also I did not want to install a new system but just to use what I use so far (ie the system used on the old Pi):
uname-a Raspberrystar.pinkaccordions.org Linux 3.2.27 + # 174 PREEMPT ...
Simple inserting the card from the old Pi into the new one did not work (the system did not start). An upgrade is needed probably:
sudo apt-get update sudo rpi-update uname-a Raspberrystar.pinkaccordions.org Linux 3.10.18 +
Now 1-Wire bus stopped working. I also can not start the WiFi adapter TP-Link TL-WN725N. Inspecting Internet forums I discovered that version 3.6.11+ of the kernel may be less problematic in this respect. Therefore, I try to downgrade:
sudo rpi-update 8234d5148aded657760e9ecd622f324d140ae891
The above means to downgrade to the latest of 3.6.11+ versions:
pi @ raspberrystar ~ $ uname-a Linux 3.6.11 + raspberrystar.pinkaccordions.org # 557 PREEMPT
Now the 1-Wire bus magically started to work. Sensors DHT-22 also work. The program I have used to read data from pressure sensor BMP085 required minor modifications and recompilation (as GPIO layout is different on Pi model B).
WiFi card also works, but require to download an appropriate driver. This one works for me (a copy is here). Other drivers, such as available here or here do not work. Compilation from sources as described here (in Polish is here) ends with an error as well.
Module 8188eu.ko
can be installed as follows:
wget http://www.mendrugox.net/downloads/13 -O 818188eu.ko ## albo https://dl.dropboxusercontent.com/u/61315145/PiStuff/8188eu.ko.gz ## after download: gunzip 8188eu.ko.gz sudo install -p -m 644 8188eu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless sudo depmod -a sudo modprobe 8188eu
The contents of the file /etc/network/interfaces
should look like:
auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 auto wlan0 iface wlan0 inet dhcp wpa-ssid "NAME OF-NETWORK" wpa-psk "PASSWORD"
One have to provide correct values for the NAME-NET and PASSWORD of course. The above settings will automatically establish a connection when the system starts.
Minor thing, but I want to know easily which Pi is which:
## in the last line of /etc/hosts change host name sudo vi /etc/hosts ## insert host name (this file contains only 1 line with a host name:) sudo vi /etc/hostname sudo /etc/init.d/hostname.sh sudo reboot
The file /etc/hosts looks something like this:
127.0.0.1 localhost :: 1 localhost ip6-localhost ip6-loopback fe00 :: 0 ip6-localnet ff00 :: 0 ip6-mcastprefix ff02 :: 1 ip6-allnodes ff02 :: 2 ip6-allrouters 127.0.1.1 blackberrystar
Updated system was cloned on a second card (Btw. for years I use Toshiba SDHC 8GB Class 10. This card is advertised as SLC but on card packaging/casing there is no word about it. SLC or not SLC I had never any problem with this card.)
How to connect a camera to the Pi can be seen at one of the many videos on YouTube.
I followed instructions from How to set up the camera hardware.
Since I have not done this before:
pi@blackberrystar ~ $ sudo apt-get update pi@blackberrystar ~ $ sudo apt-get upgrade
Now:
pi@blackberrystar ~ $ sudo raspi-config
I Choose Enable/Disable camera addon support and Memory split. I have not decided on the suggested 128 Mb for the GPU, bearing in mind that all the memory in my Pi is 256 Mb. Perhaps I am wrong and recommended 128MBs is better.
Test if it works:
pi@blackberrystar ~ $ mkdir picam pi@blackberrystar ~ $ cd picam pi@blackberrystar ~ $ raspistill -o image.jpg
The result (the first picture taken) is shown on the picture.
Do posiadanego Raspberry Pi w wersji A (256 Mb) dokupiłem parę dni temu drugi egzemplarz, tym razem w wersji B (512 Mb). Kupiłem też kartę WiFi TP-link TL-WN725N oraz kamerę. Plan jest taki:
Doczepienie wszystkiego do jednego komputerka nie wchodzi w grę bo docelowo kamera ma być mobilna.
Nie chciałem instalować nowego systemu tylko skorzystać z tego co używam do tej pory (tj. system używany na starym Pi):
uname -a Linux raspberrystar.pinkaccordions.org 3.2.27+ #174 PREEMPT ...
Prosta wymiana karty nie działa (system się nie uruchamia). Potrzebny jest zapewne upgrade:
sudo apt-get update sudo rpi-update uname -a Linux raspberrystar.pinkaccordions.org 3.10.18+
Teraz przestała działać magistrala 1-Wire. Nie mogę też uruchomić karty WiFi TP-link TL-WN725N. Gdzieś na forach doczytałem, że wersja 3.6.11+ może być pod tym względem mniej problematyczna. Zatem próbuję:
sudo rpi-update 8234d5148aded657760e9ecd622f324d140ae891
Powyższe oznacza cofnięcie się do najstarszej wersji oznaczonej symbolem 3.6.11+:
pi@raspberrystar ~ $ uname -a Linux raspberrystar.pinkaccordions.org 3.6.11+ #557 PREEMPT
Teraz magistrala 1-Wire magicznie zaczęła działać. Czujniki DHT-22 też działają. Czujnik ciśnienia BMP085, obsługiwany przez program opisany tutaj, wymagał drobnej modyfikacji i przekompilowania, bo zmienił się układ wejść GPIO.
Karta WiFi też działa, ale wymagała ściągnięcia stosownego sterownika. U mnie działa ten (kopia jest tutaj). Natomiast inne, np. udostępniane tu albo tutaj nie działają. Także kompilacja wg. sposobu opisanego tutaj (po polsku jest tutaj) kończy się błędem.
Moduł 8188eu.ko
należy zainstalować w następujący sposób:
wget http://www.mendrugox.net/downloads/13 -O 818188eu.ko ## albo https://dl.dropboxusercontent.com/u/61315145/PiStuff/8188eu.ko.gz ## po ściągnięciu: gunzip 8188eu.ko.gz sudo install -p -m 644 8188eu.ko /lib/modules/`uname -r`/kernel/drivers/net/wireless sudo depmod -a sudo modprobe 8188eu
Zawartość pliku /etc/network/interfaces
powinna wyglądać następująco:
auto lo iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 auto wlan0 iface wlan0 inet dhcp wpa-ssid "NAZWA-SIECI" wpa-psk "HASŁO"
Należy oczywiście podać prawidłowe wartości dla NAZWY-SIECI oraz HASŁA. Takie ustawienie powoduje automatyczne ustanowienie połączenia po uruchomieniu systemu.
Sprawa drobna ale potrzebna żeby wiedzieć który jest który:
## w ostatnim wierszu /etc/hosts zmień nazwę hosta sudo vi /etc/hosts ## wpisz nazwę hosta (ten plik zawiera jeden wiesz, nazwę hosta): sudo vi /etc/hostname sudo /etc/init.d/hostname.sh sudo reboot
W rezultacie mój plik /etc/hosts
wygląda jakoś tak:
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.1.1 blackberrystar
Uaktualniony i działający na nowym Pi system sklonowałem na drugą kartę (BTW. Od lat używam kart Toshiba SDHC 8GB Class 10. Karta ta jest reklamowana jako typu SLC aczkolwiek na opakowaniu/karcie nie ma o tym ani słowa. SLC czy nie SLC nigdy nie miałem z tą kartą żadnych problemów.)
Jak podłączyć kamerę do komputerka można obejrzeć na jednym z licznych filmów na YouTube.
Dalej postępowałem wg. instrukcji na stronie How to set up the camera hardware.
Ponieważ wcześniej tego nie robiłem:
pi@blackberrystar ~ $ sudo apt-get update # na wszelki wypadek pi@blackberrystar ~ $ sudo apt-get upgrade
teraz:
pi@blackberrystar ~ $ sudo raspi-config
Wybieram Enable/Disable camera addon support a następnie Memory split. Nie zdecydowałem się na sugerowane wydzielenie 128 Mb na GPU, mając na uwadze, że cała pamięć w moim Pi to raptem 256 Mb. Być może niepotrzebnie się spłoszyłem -- doczytam jeszcze na ten temat.
Test czy działa:
pi@blackberrystar ~ $ mkdir picam pi@blackberrystar ~ $ cd picam pi@blackberrystar ~ $ raspistill -o image.jpg
Wynik (pierwsze wykonane zdjęcie) jest zamieszczony obok.
Because my tomatoes are growing unexpectedly fast I had to stop capturing pictures quicker than I have planned as they do not fit in the frame.
So 2664 pictures was taken from 16.03 to 23.04 at 20 minutes interval. The video size is about 715 Mb and the video length is 3min 43 seconds (at 12 fps or 1:47 at 25 fps).
Ustaliłem empirycznie w jaki sposób podłączyć aparat do Raspberry Pi (do SheevaPlug zresztą też) żeby nic się nie zacinało. W skrócie:
Używam kompakta Nikon S3000 (Canon A620 się zacinał/odłączał--sprzedałem go na Allegro).
Podłączam aparat poprzez aktywny USB hub (kupiłem w tym celu cztero-portowy HUB firmy Vivanco).
Po każdym zdjęciu wykonuję reset stosownego portu USB za pomocą programiku pn. usb_reset
(zobacz tutaj
oraz tutaj).
Używam dwóch aparatów Nikon S3000 (kupionych na Allegro oczywiście), więc jest problem z ustaleniem który jest który:
$gphoto2 --auto-detect Model Port ---------------------------------------------------------- Nikon Coolpix S3000 (PTP mode) usb:001,022 Nikon Coolpix S3000 (PTP mode) usb:001,021
Można użyć opcji --port usb:001,022
aby wykonać coś
z ,,pierwszym'' aparatem oraz --port usb:001,021
, aby dostać się do drugiego.
Oczywiście umieszczenie numerów portów na-zicher w skryptach byłoby kiepskim pomysłem
ponieważ nie są one ustalone, ale się zmienią jeżeli urządzenie zostanie odłączone/przyłączone ponownie.
Lepszym sposobem zidentyfikowania aparatów jest wykorzystanie numeru seryjnego:
## $gphoto2 --get-config serialnumber --port PORT ## example $gphoto2 --get-config serialnumber --port usb:001,022 Label: Serial Number Type: TEXT Current: 000047514512
Mam czarnego Nikona o numerze 000041076602 oraz różowego o numerze 000047514512. Używam następującego skryptu do wykonania zdjęcia określonym aparatem:
#!/bin/bash PINK_CAM_ID='000047514512' BLACK_CAM_ID='000041076602' while test $# -gt 0; do case "$1" in -b|--black) REQ_CAM="$BLACK_CAM_ID";; -p|--pink) REQ_CAM="$PINK_CAM_ID";; esac shift done ## Nazwa pliku ze zdjęciem: FILENAME="NIK`date +"%Y%m%d%H%M"`.jpg" ## Przejrzyj wszystkie podłączone aparaty: while read PORT_ID do ##echo $PORT_ID ## -n means string is non-empty if [ -n "$PORT_ID" ] ; then CAM_ID=`gphoto2 --get-config serialnumber --port $PORT_ID | awk '/Current:/ { print $2 }' ` if [ $CAM_ID = "$REQ_CAM" ] ; then REQ_CAM_PORT="$PORT_ID" ##echo "*** Req Camera ID: #$CAM_ID." fi fi done <<< "`gphoto2 --auto-detect | grep usb | awk '{ print $6}'`" # Na wypadek błędu wyślij alarmowego SMSa if [ -z "$REQ_CAM_PORT" ] ; then echo "*** Error: Camera $REQ_CAM not found ***" ## sent a SMS cf http://pinkaccordions.homelinux.org/wblog/sms_alerts_with_google_calendar.html sms_reminder.sh exit 1 fi ## reset USB REQ_CAM_PORT_DEVNAME=`echo $REQ_CAM_PORT | sed 's/^.*://' | sed 's/,/\//'` usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME} LANG=C gphoto2 --port "$REQ_CAM_PORT" --force-overwrite --set-config flashmode=1 \ --set-config d002=4 \ --capture-image-and-download --filename "$FILENAME" ## reset USB (powtórny) usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME}
Właściwość d002
ustawia rozdzielczość zdjęcia (4 oznacza 2592x1944).
Wartość 1 właściwościflashmode
wyłącza flash.
Z moich eksperymentów wynika, że bez wykonania
usb_reset
bateria aparatu nie jest doładowywana (czemu?) i po
pewnym czasie z powodu braku zasilania aparat odłącza się.
Po czterech tygodniach mam wystarczająco dużo zdjęć aby spróbować zrobić pierwszy film.
Najpierw konwertuję wszystkie zdjęcia do rozdzielczości 1920x1080 za pomocą
programu convert
(z zestawu ImageMagick)
uruchamianego z ,,wewnątrz'' prostego skryptu Perla. Ponieważ nazwy plików wejściowych są
konstruowane wg schematu NIKYYYYMMDDHHMM.jpg
(gdzie YYY to rok, MM oznacza miesiąc, itd.)
sortowanie alfabetyczne oznacza ustawienie ich także we właściwym porządku chronologicznym.
Nazwy plików wynikowych są zaś konstruowane jako:
hd1920_00001.jpg
, hd1920_00002.jpg
, itd.
#!/usr/bin/perl opendir (DIR, "."); my @files = sort { $a cmp $b } readdir(DIR); while (my $file = shift @files ) { if ($file =~ /.jpg$/) { $fileNo++; $file_out = sprintf "hd1920_%05d.jpg", $fileNo; print "$file -> $file_out\n"; system ("convert", $file, "-geometry", "1920x1080", "$file_out"); } }
Okazało się, że jest dokładnie 1784 zdjęć:
$ls -l hd1920_0* | wc -l 1784
Konwersja trwała około 30 min na moim przeciętnym zupełnie PC-cie. Każdy plik wynikowy miał około 0,5Mb; wszystkie razem zajmowały około 0,85Gb:
$ls -l hd1920_0* | awk '{t+=$5}; END{print t}' 853332231
Film został wykonany za pomocą programu ffmpeg
:
ffmpeg -r 12 -qscale 2 -i hd1920_%05d.jpg Tomato_12.mp4
Gdzie -r 12
oznacza liczbę klatek na sekundę (12 fps)
a -qscale
określa jakość (1 oznacza najlepszą,
32 najgorszą jakość).
Film ma około 450 Mb. Konwersja zajmuje około 3min (on my decent PC) a długość filmu to 2min i 29 sekundy.
Film przedstawia sadzonkę pomidora (Pinkaccordion oczywiście :-). Zdjęcia były robione co 20 minut od 16 marca do 11 kwietnia.
After almost 4 weeks I have enough pictures to create my first video production. (How to capture images with a still camera attached to Raspberry Pi is described here and here.)
I started from converting all pictures to 1920x1080 resolution with convert
run from a simple Perl script. As the input file
names are constructed as NIKYYYYMMDDHHMM.jpg
(where YYY denotes year, MM denotes month etc)
alphabetic sorting is OK. The resulting files
are named as hd1920_00001.jpg
, hd1920_00002.jpg
, etc.
#!/usr/bin/perl opendir (DIR, "."); my @files = sort { $a cmp $b } readdir(DIR); while (my $file = shift @files ) { if ($file =~ /.jpg$/) { $fileNo++; $file_out = sprintf "hd1920_%05d.jpg", $fileNo; print "$file -> $file_out\n"; system ("convert", $file, "-geometry", "1920x1080", "$file_out"); } }
There are exactly 1784 pictures:
$ls -l hd1920_0* | wc -l 1784
Conversion of all images lasted circa half an hour on my decent PC. Each picture size is about 0,5Mb, while the total size is 0,85Gb:
$ls -l hd1920_0* | awk '{t+=$5}; END{print t}' 853332231
To create a video from the images I run ffmpeg
now:
ffmpeg -r 12 -qscale 2 -i hd1920_%05d.jpg Tomato_12.mp4
Where -r 12
means frames ratio (12 fps) and -qscale
determines
video quality (1 denotes best quality and 32 is the lowest one).
The video size is about 450 Mb. The conversion takes circa 3min (on my decent PC) and the video length is 2min 29 seconds.
The movie's subject is a growing tomato (Pinkaccordion variety of course:-). The photographs were taken every 20 minutes from March 16th to April 11th.
I have made some progress in accessing still camera with gphoto2
(cf. here).
The detailed description of my set-up will be disclosed within a few weeks (as I am still not sure
if it is 100% success:-). In short:
I changed camera from Canon A620 to Nikon S3000.
I connected camera with active USB hub.
On every capture USB port is reset with usb_reset
utility
(cf here
and here)
I use two Nikon S3000 compact cameras so there is a problem how to identify which is which.
$gphoto2 --auto-detect Model Port ---------------------------------------------------------- Nikon Coolpix S3000 (PTP mode) usb:001,022 Nikon Coolpix S3000 (PTP mode) usb:001,021
So one can use --port usb:001,022
option to access first attached
camera and --port usb:001,021
to access the second one. Of
course hard-coded port numbers are troublesome as they are not fixed and change
if the device is disconnected/connected again.
Better way to identify the camera is to use it's serial number:
## $gphoto2 --get-config serialnumber --port PORT ## example $gphoto2 --get-config serialnumber --port usb:001,022 Label: Serial Number Type: TEXT Current: 000047514512
I have black Nikon with 000041076602 serial number and pink one with 000047514512 serial number. I use the following bash script to access the cameras:
#!/bin/bash PINK_CAM_ID='000047514512' BLACK_CAM_ID='000041076602' while test $# -gt 0; do case "$1" in -b|--black) REQ_CAM="$BLACK_CAM_ID";; -p|--pink) REQ_CAM="$PINK_CAM_ID";; esac shift done ## Picture filename: FILENAME="NIK`date +"%Y%m%d%H%M"`.jpg" ## Scan all attached cameras: while read PORT_ID do ##echo $PORT_ID ## -n means string is non-empty if [ -n "$PORT_ID" ] ; then CAM_ID=`gphoto2 --get-config serialnumber --port $PORT_ID | awk '/Current:/ { print $2 }' ` if [ $CAM_ID = "$REQ_CAM" ] ; then REQ_CAM_PORT="$PORT_ID" ##echo "*** Req Camera ID: #$CAM_ID." fi fi done <<< "`gphoto2 --auto-detect | grep usb | awk '{ print $6}'`" if [ -z "$REQ_CAM_PORT" ] ; then echo "*** Error: Camera $REQ_CAM not found ***" ## sent a SMS cf http://pinkaccordions.homelinux.org/wblog/sms_alerts_with_google_calendar.html sms_reminder.sh exit 1 fi ## reset the USB device REQ_CAM_PORT_DEVNAME=`echo $REQ_CAM_PORT | sed 's/^.*://' | sed 's/,/\//'` usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME} LANG=C gphoto2 --port "$REQ_CAM_PORT" --force-overwrite --set-config flashmode=1 \ --set-config d002=4 \ --capture-image-and-download --filename "$FILENAME" ## reset the USB device again usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME}
Property d002
sets picture resolution (4 means 2592x1944).
Value 1 of flashmode
turns-off flash.
It seems that without usb_reset
there are problems with battery charging (why?)
I would like to remote control a still camera via gphoto2
.
After consulting a list of supported cameras I bought (used) Canon A620
from Allegro (local Internet auction site, sort of E-bay).
This camera has many great features (I suspect even too great as Canon stop producing cheap cameras of this sort):
viewfinder, retractable LCD and can be powered with Compact Power Adapter CA-PS500 instead of batteries
(an important feature in my project).
The plan was simple: connect camera via USB cable to computer and power it with PSU. Capture photos periodically with
gphoto2
:
gphoto2 --auto-detect pi@raspberrystar ~/bin $ gphoto2 --auto-detect Model Port ---------------------------------------------------------- Canon PowerShot A620 (PTP mode) usb:001,006
So far, so good.
Now, I tried to capture a photo:
# one shot without flash, download the file and store in a file named as: GPHyyyymmddhhmm.jpg LANG=C gphoto2 --set-config flashmode=0 --capture-image-and-download --filename "GPH%Y%m%d%H%M.jpg"
As the creation time is wrong (due to camera wrong clock) I modified
the above as follows (note that touch
is used to adjust file's timestamp):
#!/bin/basg FILENAME="GPH`date +"%Y%m%d%H%M"`.jpg" LANG=C gphoto2 --set-config flashmode=0 --capture-image-and-download --filename "$FILENAME" touch "$FILENAME"
Unfortunately there are problems: I am able to remotely capture only one photo. Next remote capture try results in an error and the camera has to be hard reset (with power on/off button). The problem is reported by others too.
BTW: when I connected the camera to my PC the reliability is much better (but seems not perfect---I experienced camera disconnection too.)
My first try to resolve the problems was to update gphoto2
(raspbian contains version 2.4.14 of gphoto2
).
## optionally remove old version (there are no dependencies) apt-get remove gphoto2
There is no need to remove gphoto2
as compiled one
will be installed in another directory (/usr/local/
vs
/usr/
).
First install/compile the necessary packages:
apt-get install -y libltdl-dev libusb-dev libexif-dev libpopt-dev ## Download and install newer version of libusb 1.0.11 wget http://ftp.de.debian.org/debian/pool/main/libu/libusbx/libusbx_1.0.11.orig.tar.bz2 tar xjvf libusbx_1.0.11.orig.tar.bz2 cd libusbx-1.0.11/ ./configure && make && sudo make install ## Download and install newer version of libgphoto wget http://garr.dl.sourceforge.net/project/gphoto/libgphoto/2.5.1.1/libgphoto2-2.5.1.1.tar.bz2 tar xjf libgphoto2-2.5.0.tar.bz2 cd libgphoto2-2.5.1.1 ./configure && make && sudo make install
Download and install newer version of gphoto2
wget http://downloads.sourceforge.net/project/gphoto/gphoto/2.5.1/gphoto2-2.5.1.tar.gz tar xzvf gphoto2-2.5.1.tar.gz cd gphoto2-2.5.1 ./configure && make && sudo make install ## run ldconfig sudo ldconfig gphoto2 --version gphoto2 2.5.1 Copyright (c) 2000-2013 Lutz Mueller i inni
BTW compiling gphoto2
on my fedora 14 box requires
to install libtool-ltdl-devel
popt-devel
first:
#configure: error: cannot compile and link against libltdl #libgphoto2 requires libltdl (the libtool dl* library), #but cannot compile and link against it. yum -y install libtool-ltdl-devel popt-devel
Upon installing above two packages, the compilation of
libusb
, libgphoto
and gphoto2
proceeds smoothly.
Unfortunately installing new version of gphoto2
did not help.
The problem will be further examined...
The script: 1) suspend capturing images at night for obvious reason
and 2) writes images to files named as:
image_<odd-or-even-week><day-of-week>_<hour><minute>.jpg
Thus only images from the last two weeks are stored and the older ones are deleted ``automatically''.
#!/bin/bash OUTPUT_DIR=/var/www/cam/fswebcam-output # Max resolution for C270 webcam is 1280x720 RESOLUTION="1280x720" QUALITY="85" MINUTE=`date +%M` HOUR=`date +%H` MONTH=`date +%m` DAY_OF_WEEK=`date +%u` WEEK=`date +%U` FILE_OUT=`date +%d%H%M` TODAY=`date +%Y/%m/%d` ## Suspend capturing pictures at night DAY_START=`sun_calc.py -date "$TODAY" -city Sopot -param dawn` DAY_STOP=`sun_calc.py -date "$TODAY" -city Sopot -param dusk` if [ "$DAY_START" = "False" -o "$DAY_STOP" = "True" ] ; then NIGHT="YES"; exit; fi fswebcam -r $RESOLUTION -S 11 --jpeg $QUALITY \ --title "Sopot/Abrahama Street (PL)" \ --subtitle "View from my window" \ --info "Logitech_Webcam_C270@raspberryPi ($RESOLUTION)" \ --save $OUTPUT_DIR/image.jpg -q ## Rotate photos every two weeks ## Week number modulo 2 (0 or 1) WEEK_NO=$(($WEEK % 2)) FILE_OUT="${WEEK_NO}${DAY_OF_WEEK}_$HOUR$MINUTE" ## Wundergound expects the file is `image.jpg'. ## To preserve from overwriting rename: cd $OUTPUT_DIR && cp image.jpg image_$FILE_OUT.jpg
./sun_calc.py
is a Python script (I am not
Python programmer BTW):
#!/usr/bin/python import datetime import argparse import pytz from astral import Astral city_name = 'Sopot' parser = argparse.ArgumentParser() parser.add_argument("-date", type=str, help="Date as yyyy/mm/dd") parser.add_argument("-city", type=str, help="City name") parser.add_argument("-param", type=str, help="dusk sunrise sunset or dawn") parser.add_argument("-verbose", help="Icrease verbosity", action="store_true") args = parser.parse_args() dat = args.date city_name = args.city param = args.param verb_level = args.verbose [year, month, day] = dat.split("/"); year = int(year) month = int(month) day = int(day) a = Astral() city = a[city_name] a.solar_depression = 6 ## sd can be: 6, 12, 18 timezone = city.timezone sun = city.sun(date=datetime.date(year, month, day), local=False) sun_local = city.sun(date=datetime.date(year, month, day), local=True) time_now = datetime.datetime.utcnow().replace(tzinfo = pytz.utc) if verb_level > 0: print('solar_depressions: ' + str(a.solar_depression)) print city_name + " " + str(time_now) + " " + str(sun[param]) \ + " (" + str(sun_local[param]) + ")" print time_now > sun[param]
The script based on astral
package can compute
dusk/dawn time (among other things) and compares it to the current time.
If current time is past dusk/dawn (specified as a command line parameter)
./sun_calc.py
returns True
.
Otherwise it returns False
.
The astral
package does not contains Sopot but it is easy
to add it just
by editing astral.py
(before installation of course):
Sopot,Poland,54°44'N,18°55'E,Europe/Warsaw
A short test demonstrating that for Sopot and Warsow the script returns significantly different results:
./sun_calc.py -date 2013/01/21 -city Sopot -param dawn -verbose solar_depressions: 6.0 Sopot 2013-01-21 09:17:11.368979+00:00 2013-01-21 06:09:47+00:00 (2013-01-21 07:09:47+01:00) ./sun_calc.py -date 2013/01/21 -city Warsaw -param dawn -verbose solar_depressions: 6.0 Warsaw 2013-01-21 09:17:46.172157+00:00 2013-01-21 05:53:22+00:00 (2013-01-21 06:53:22+01:00) True
So there is circa 15 minutes difference between Sopot which is some 300 km to the North from Warsaw.
Yesterday I have got a letter containing BMP085 pressure sensor which I bought on ebay on November 20th 2012 (yes the post made a history with +50 days delivery from China).
To connect BMP085 to RPI first one has to install (in case both packages are not installed yet):
pi@raspberrystar ~ $ sudo apt-get install i2c-tools pi@raspberrystar ~ $ sudo apt-get install python-smbus
Now one has to enable i2c in raspbian. First one has to add the user pi to the group i2c:
pi@raspberrystar ~ $ sudo adduser pi i2c
Next one has to check the contents of
/etc/modprobe.d/raspi-blacklist.conf
and /etc/modules
:
pi@raspberrystar ~ $ less /etc/modprobe.d/raspi-blacklist.conf # blacklist spi and i2c by default (many users don't need them) blacklist spi-bcm2708 blacklist i2c-bcm2708 pi@raspberrystar ~ $ less /etc/modules ... i2c-dev i2c-bcm2708
Some users advocate to remove i2c-bcm2708 from blacklisted modules but this seems unneccessary as:
pi@raspberrystar ~ $ lsmod | grep i2c i2c_bcm2708 3542 0 i2c_dev 5587 0
so I have i2c_bcm270
w/o modifying
/etc/modprobe.d/raspi-blacklist.conf
Reboot now to activate the new settings
The board my sensor came on has eight pins. There are boards
with 6 pins as well which seems to be more popular.
Only four out of 8 pins are used and the connections
are as follows (see pictures):
GND goes to Ground on the Pi (P1-05)
3.3 goes to 3V3 on the Pi (P1-01)
SDA goes to SDA on the Pi (P1-02)
SCL goes to SCL on the Pi (P1-03)
In Reading data from a Bosch BMP085 with a Raspberry Pi 6-ping sensor is used and the pins connections are different. I have tried but it does not work for my sensor.
I connect sensor to RPI using wires with female jumpers on both ends.
To check if the sensor (or other i2c device) is connected correctly,
one can run i2cdetect
:
pi@raspberrystar ~ $ i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77
77 in the last row indicates that sensor is connected properly (otherwise the output will consists of rows of '--' only).
To get data from the sensor one has to install Adafruit-Raspberry-Pi-Python-Code or compile small C program available here:
## Download john.geek's C application: wget http://www.john.geek.nz/wp-content/uploads/2012/08/testBMP085.c wget http://www.john.geek.nz/wp-content/uploads/2012/12/smbus.c wget http://www.john.geek.nz/wp-content/uploads/2012/12/smbus.h ## Compile & run it gcc -Wall -o testBMP085 ./smbus.c ./testBMP085.c ./testBMP085 ## Download >Adafruit's one: git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git cd Adafruit-Raspberry-Pi-Python-Code cd Adafruit_BMP085 ## Run python Adafruit_BMP085_example.py
Note: testBMP085
works with sensor connected to RPi as described in this post
(not as described by
john geek).
BTW: the pressure is identical as reported by my WH 2080 weather station. Perhaphs WH 2080 use exactly the same sensor!
Dziś uruchomiłem starą kamerę Logitech Webcam C200 na Raspberry Pi (bez
żadnych problemów--wystarczy wsadzić kabel USB). Chcę cyklicznie
robić zdjęcia tego co widzę z mojego okna i publikować je na wunderground.com
.
Spróbowałem zastosować do tego celu program fswebcam
.
BTW dobry opis kilku popularnych programów służących do obsługi kamer video jest tutaj.
Aby zainstalować fswebcam
należy wykonać:
# apt-get install fswebcam
Uruchamiam fswebcam
za pomocą następującego skryptu
(cf. Raspberry Pi --
Webcam streaming):
#!/bin/bash OUTPUT_DIR=/var/www/cam/fswebcam-output fswebcam -r 640x480 -S 11 --jpeg 95 \ --title "Sopot/Abrahama Street (PL)" \ --subtitle "View from my window" \ --info "Hardware: Logitech_Webcam_C200@raspberryPi" \ --save $OUTPUT_DIR/image.jpg -q
Aby publikować obrazki na wunderground.com
należy
kamerę zarejestrować do czego służy prosty formularz. Obrazki mogą być
wysyłane na konto ftp na wunderground.com
albo pobierane
z udostępnionego publicznego konta (w tym drugim przypadku należy
podczas rejestracji podać adres URL tegoż konta).
Ja wybrałem ftp
i rejestracja zakończyła się podaniem nazwy serwera ftp + nazwy
użytkownika. Hasło jest takie samo jak to używane do logowania się na
konto WWW na wunderground.com
.
Do ładowania obrazków używam skryptu (cf. tutaj):
REMOTE='webcam.wunderground.com' USER='hrpunioCAM1' PASSWORD='#####' FTPLOG='/tmp/ftplog' date >> $FTPLOG ftp -n $REMOTE <<_FTP>>$FTPLOG quote USER $USER quote PASS $PASSWORD bin lcd /var/www/cam/fswebcam-output put image.jpg quit _FTP
Obrazki są generowane i wysyłane co kilka minut dzięki stosownemu
wpisowi w pliku crontab
.
Link do obrazków z mojej kamery wunderground.com
jest tutaj.
Today I connected old Logitech Webcam C200 to my Raspberry Pi.
I just wanted to capture single
frames (at a specified time interval, say every 10 minutes) and upload
resulting images to wunderground.com
.
I tried to use fswebcam
for that purpose.
BTW a good description of available software for WebCams can be found here.
To install fswebcam
one have to execute:
# apt-get install fswebcam
I run fswebcam
with the following bash
script (borrowed from
Raspberry Pi --
Webcam streaming):
#!/bin/bash OUTPUT_DIR=/var/www/cam/fswebcam-output fswebcam -r 640x480 -S 11 --jpeg 95 \ --title "Sopot/Abrahama Street (PL)" \ --subtitle "View from my window" \ --info "Hardware: Logitech_Webcam_C200@raspberryPi" \ --save $OUTPUT_DIR/image.jpg -q
To display one's images at wunderground.com
one have to
register the camera with a simple form.
The images can be uploaded to ftp account at
wunderground.com
or they can be retrieved from the
public URL. As I have decided to upload them I have got ftp
account credentials upon sucessfull registration
(server and user name). The password is the same as for my
wunderground.com
WWW account.
I upload images withe following bash script borrowed from here:
REMOTE='webcam.wunderground.com' USER='hrpunioCAM1' PASSWORD='#####' FTPLOG='/tmp/ftplog' date >> $FTPLOG ftp -n $REMOTE <<_FTP>>$FTPLOG quote USER $USER quote PASS $PASSWORD bin lcd /var/www/cam/fswebcam-output put image.jpg quit _FTP
Images are produced and uploaded every few minutes---the scripts are executed with appropriate crontab entries.
A link to my webcam at wunderground.com
is here.