Chmura jako katalog w Raspberry PI

Większość z Nas posiada konto z przestrzenią dyskową w chmurze. Jest to często GoogleDrive, Onedrive lub podobne. Myślę, że warto wykorzystać taką przestrzeń udostępniając ją dla Naszego Raspberry PI aby „zwiększyć” dostępną powierzchnię karty SD lub małego dysku SSD.

Przedstawię tutaj sposób „zamontowania” zdalnego katalogu z GoogleDrive jako katalogu na Raspberry PI. Dzięki temu będziemy mogli kopiować do niego lub z niego pliki, kopiować pliki kopii zapasowych (na przykład bazy domoticz) czy współdzielić pliki z innymi systemami.

Wykorzystam do tego uniwersalne narzędzie o nazwie rclone.

Przystępujemy więc do instalacji:

W celu zachowania higieny wykonujemy standardowo polecenie

sudo apt update
sudo apt upgrade

następnie polecenie, które zainstaluje program rclone

curl https://rclone.org/install.sh | sudo bash

po poprawnej instalacji musimy zalogować się do środowiska graficznego Raspberry Pi gdyż podczas konfiguracji zostanie uruchomiona przeglądarka internetowa, w której potwierdzimy dostęp do Naszego konta Google. Zatem w trybie graficznym uruchamiamy terminal i wydajemy komendę

rclone config

w trybie tekstowym uruchomi się konfigurator, w którym kolejno wybieramy  opcje kreatora (aby nie pisać krok po kroku załączam listing z konsoli, w którym dodałem komentarze aby było wiadomo co wybierać):

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n # wybieramy "n" aby utworzyć nowy.

#------------------------
name> gdrive # podajemy nazwę dla zdalnego zasobu

#------------------------
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / A stackable unification remote, which can appear to merge the contents of several remotes
   \ "union"
 2 / Alias for a existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
 4 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
   \ "s3"
 5 / Backblaze B2
   \ "b2"
 6 / Box
   \ "box"
 7 / Cache a remote
   \ "cache"
 8 / Dropbox
   \ "dropbox"
 9 / Encrypt/Decrypt a remote
   \ "crypt"
10 / FTP Connection
   \ "ftp"
11 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
12 / Google Drive
   \ "drive"
13 / Hubic
   \ "hubic"
14 / JottaCloud
   \ "jottacloud"
15 / Local Disk
   \ "local"
16 / Mega
   \ "mega"
17 / Microsoft Azure Blob Storage
   \ "azureblob"
18 / Microsoft OneDrive
   \ "onedrive"
19 / OpenDrive
   \ "opendrive"
20 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
21 / Pcloud
   \ "pcloud"
22 / QingCloud Object Storage
   \ "qingstor"
23 / SSH/SFTP Connection
   \ "sftp"
24 / Webdav
   \ "webdav"
25 / Yandex Disk
   \ "yandex"
26 / http Connection
   \ "http"
Storage> 12 # spośród wielu opcji wybieramy 12 dla google drive

#------------------------
** See help for drive backend at: https://rclone.org/drive/ **

Google Application Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id> # akceptujemy wartość domyślną wciskając ENTER

#------------------------
Google Application Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret> # akceptujemy wartość domyślną wciskając ENTER

#------------------------
Scope that rclone should use when requesting access from drive.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Full access all files, excluding Application Data Folder.
   \ "drive"
 2 / Read-only access to file metadata and file contents.
   \ "drive.readonly"
   / Access to files created by rclone only.
 3 | These are visible in the drive website.
   | File authorization is revoked when the user deauthorizes the app.
   \ "drive.file"
   / Allows read and write access to the Application Data folder.
 4 | This is not visible in the drive website.
   \ "drive.appfolder"
   / Allows read-only access to file metadata but
 5 | does not allow any access to read or download file content.
   \ "drive.metadata.readonly"
scope> 1 # wybieramy 1 aby mieć uprawnienia do odczytu i zapisu

#------------------------
ID of the root folder
Leave blank normally.
Fill in to access "Computers" folders. (see docs).
Enter a string value. Press Enter for the default ("").
root_folder_id> # akceptujemy wartość domyślną wciskając ENTER

#------------------------
Service Account Credentials JSON file path 
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Enter a string value. Press Enter for the default ("").
service_account_file> # akceptujemy wartość domyślną wciskając ENTER

#------------------------
Edit advanced config? (y/n)
y) Yes
n) No
y/n> 
y/n> n # wybieramy n bo nie chcemy konfigurować zaawansowanych opcji

#------------------------
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> y # potwierdzamy, autokonfigurację i czekamy na otwarcie przeglądarki w której wprowadzamy poświadczenia dla konta google.

#------------------------
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Configure this as a team drive?
y) Yes
n) No
y/n> n # odpowiadamy n

#------------------------
--------------------
[gdrive]
type = drive
scope = drive
token = {"access_token":"...wycięte dane prywatne..."}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y # potwierdzamy, że wszystko OK

#------------------------
Current remotes:

Name                 Type
====                 ====
gdrive               drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q # wychodzimy lub konfigurujemy nowy zasób
pi@domoticz:~ $

teraz testujemy czy działa poleceniem:

rclone lsd gdrive:/

polecenie powinno wylistować nam zawartość katalogu głównego naszej chmury.

Właściwie na tym moglibyśmy zakończyć bo wpisując polecenie

rclone --help

otrzymamy pomoc do programu rclone i dzięki temu będziemy wiedzieć jak się nim posługiwać.

Jednak na początku napisałem, że podłączymy GoogleDrive pod jeden z katalogów w Naszym Raspberry PI, opisuję więc dalej jak to zrobić.

Tworzymy katalog /home/pi/gdrive i wykonujemy następujące polecenie

rclone mount gdrive:/ /home/pi/gdrive/ --daemon

i mamy zamontowany cały GoogleDrive pod katalogiem /home/pi/gdrive

A co jeśli chcemy aby GoogleDrive automatycznie montował się do wybranego przez Nas katalogu podczas startu systemu?

Wykorzystamy do tego fstab:

Pobieramy potrzebny nam plik z GitHuba DomoticzPolska i nadajemy odpowiednie uprawnienia kolejno poleceniami:

sudo wget -O /usr/local/bin/rclonefs https://raw.githubusercontent.com/DomoticzPolska/Scripts/master/bash/rclonefs
cd /usr/local/bin
sudo chown pi:pi rclonefs
sudo chmod +x rclonefs

dodajemy poniższą linijkę w pliku /etc/fstab (na końcu) i zapisujemy go.

rclonefs#gdrive:/ /home/pi/gdrive fuse config=/home/pi/.config/rclone/rclone.conf,allow-other,default-permissions,max-read-ahead=16M,vfs-cache-mode=writes,cache-dir=/home/pi/.cache/rclone,users 0 0

Otwieramy plik /etc/fuse.conf i zdejmujemy komentarz z linii user_allow_other i zapisujemy.

Restartujemy Raspberry PI i jeśli wszystko poszło dobrze w katalogu /home/pi/gdrive mamy zawartość Naszej chmury.

Przykład opisałem dla GoogleDrive jednak jak zauważyłeś, rclone daje nam więcej opcji, z których możesz skorzystać analogicznie.

Zamiast katalogu /home/pi/gdrive można użyć innego pustego katalogu. Ja u siebie zgodnie ze sztuką używam /mnt/gdrive 😉

Wystawiamy Domoticz na Świat nie mając publicznego adresu IP

Często znajduję w sieci pytania związane z problemem nieposiadania przez użytkowników publicznego adresu IP. Często też „brak publicznego adresu IP” jest mylony ze „zmiennym adresem IP” a to nie jest ten sam problem.

Często te pytania pojawiają się, gdy ktoś chce wystawić swojego Domoticza na szeroki internet.

Różnica między IP prywatnym a publicznym: http://ictprofessional.pl/prywatne-ip-vs-publiczne-ip/

To, że nie mamy publicznego adresu IP oznacza, że od dostawcy internetu dostajemy adres prywatny  (na przykład adres w postaci 192.168.3.11 lub 10.14.0.14) do interfejsu WAN routera, do którego mamy dostęp jako administrator. Zmienne IP to IP publiczne jakie dostajemy na interfejs WAN swojego routera ale zmieniające się co jakiś czas.

Znając IP w danym czasie i przy odpowiednim skonfigurowaniu naszego routera możemy z zewnątrz sieci (czyt. z internetu) dostać się do maszyn w naszej sieci lokalnej. Przy braku adresu publicznego jest to wprost niemożliwe gdyż nie możemy dokonać przekierowań portów na routerach dostawcy internetu.

Sposobem na rozwiązanie problemu  zmiennego IP jest zastosowanie serwisów typu Dynamic DNS, śledzących zmienne IP i przypisywanie go jakiejś stałej nazwie domenowej. Takie serwisy to między innymi „DynDNS”, „No-IP” itp. Działa to tak, że jakiś serwis uruchomiony w naszej sieci prywatnej raportuje do serwisu Dynamic DNS aktualnie przydzielony adres IP a serwis przypisuje jakąś nazwę domeny (na przykład kowalski12.dyndns.com) do aktualnego IP. Zatem gdy odwołamy się do tego adresu to serwis Dynamic DNS odeśle nas pod nasz aktualny adres IP.

Z brakiem publicznego IP już nie jest tak łatwo i tu trzeba zastosować inne tricki.

Jednym z rozwiązań, które właśnie postanowiłem opisać jest wykorzystanie maszyny z linuxem, działającym gdzieś w internecie, posiadającym publiczny i stały adres IP jako „drzwi” do naszej prywatnej sieci. Teraz pewnie wiele osób zapyta:

– no tak, ale skąd wziąć taką maszynę? Przecież to musi dużo kosztować!

Otóż nie, nie kosztuje to dużo i bardzo łatwo taką maszynę zdobyć. Istnieje bardzo dużo firm, które oferują serwery wirtualne (VPS) za kilka złotych miesięcznie w systemie pre-paid, czyli doładowujemy sobie konto za kilkadziesiąt złotych i mamy VPS na rok lub więcej. Taki VPS możemy wykorzystać do bardzo wielu zadań. Od postawienia swojej strony internetowej, serwera pocztowego do… i tu „sky is the limit”…

Jeśli chodzi o firmy oferujące serwery wirtualne to osobiście polecam https://tiktalik.com/pl/ ze względu na prostotę obsługi panelu zarządzania. Serwer wirtualny jaki potrzebujemy kosztuje tam około 9 zł miesięcznie. Są firmy, gdzie to może kosztować nawet około 5 złotych lub nawet można poszukać czegoś za free. Oczywiście wybór firmy należy do Ciebie.

Nie będę tu opisywał jak utworzyć VPS gdyż takie operacje wykonuje się za pomocą kreatorów w panelach zarządzania dostawców, gdzie krok po kroku „wyklikujemy” taką maszynę.

Jeśli posiadamy już swój VPS, znamy jego IP publiczne oraz nazwę rozwiązywaną przez DNSy, to przystępujemy do opracowania koncepcji wdrożenia ominięcia braku publicznego adresu IP. Koncepcja ta rozwiązuje przy okazji także problem zmiennego adresu IP.

Przyjmujemy że publiczny adres IP VPS to 212.54.180.3 (losowy, przykładowy IP), natomiast adres naszego Raspberry PI, na którym zainstalowaliśmy Domoticz to prywatny adres 192.168.1.17 w sieci domowej.

Normalnie nie mamy żadnej możliwości aby z adresu 212.54.180.3 ustanowić połączenia z naszym Raspberry bez użycia specjalistycznych narzędzi pomijających NAT i zabezpieczenia.

Jednym z naszych celów jest taka konfiguracja aby po wpisaniu w przeglądarkę adresu publicznego 212.54.180.3 i powiedzmy domyślnego portu dla http, VPS przekierował nas do sieci wewnętrznej na adres Raspberry PI i port 8080 by wyświetlić stronę naszego Domoticza.

Żeby jednak było to możliwe, musimy w jakiś „bezpośredni” sposób połączyć VPS z Raspberry PI. Robimy to poprzez bardzo lekki VPN P2P jakim jest N2N. Teraz wiele osób zapewne z oburzeniem zapyta, dlaczego jakieś N2N, o którym nigdy nie słyszałem, jak mamy inne wspaniałe VPNy?… Otóż dlatego, że N2N jest bardzo prosty do skonfigurowania i świetnie spełnia swoje zadanie, nie potrzebuje też ciężkich klientów a jeśli ktoś odkryje zasadę całego rozwiązania to będzie sobie mógł podmienić w każdej chwili N2N na jakiś swój ulubiony VPN. Zaletą N2N jest też to, że działa on na zasadzie P2P czyli coś podobnie jak hamachi ale nie korzysta przy tym z „negocjatorów” połączenia firm trzecich  tylko z naszego zainstalowanego na VPS.

Załóżmy zatem, że mamy już swoją maszynę VPS i potrafimy się do niej zalogować przez SSH. Przystępujemy więc do instalacji N2N na VPS wykonując następujące polecenia:

sudo apt update
sudo apt install n2n

po zainstalowaniu pakietów uruchamiamy usługę poleceniem:

supernode -l 82 &

co spowoduje, utworzenie węzła sieci p2p, do którego będą się łączyć klienci: VPS i Raspberry PI – jest to nasz prywatny węzeł i możemy do niego podłączyć wiele klientów N2N.

Musimy zadbać aby usługa startowała wraz z systemem, umieszczając na przykład odpowiedni wpis w pliku /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

supernode -l 82

exit 0

Zapisujemy plik rc.local.

Teraz odszukujemy na VPS plik konfiguracyjny klienta N2N w lokalizacji /etc/default/ o nazwie n2n i edytujemy go następująco:

# Config file for the n2n edge node daemon.

# Sets the n2n community name. All edges within the same community appear on
# the same LAN (layer 2 network segment). Community name is 16 bytes in length.
N2N_COMMUNITY="MyNetworkName" # tu spisujemy wymyśloną przez siebie nazwę.

# Sets the twofish encryption key from ASCII text. All edges communicating must
# use the same key and community name.
N2N_KEY="MyPassW0rd" # tu wymyślamy hasło zabezpieczające naszą sieć N2N

# Sets the n2n supernode IP address and port to register to.
N2N_SUPERNODE="212.54.180.3" # tu wpisujemy adres IP naszego VPSa
N2N_SUPERNODE_PORT="82"

# Sets the n2n virtual LAN IP address being claimed. This is a private IP
# address. All IP addresses in an n2n community typical belong to the same /24
# net‐ work (ie. only the last octet of the IP addresses varies).
N2N_IP="192.168.2.1" # tu nadajemy adres IP sieci N2N naszemu VPS

N2N_DAEMON_OPTS=""

# Uncomment this to get edge node started.
N2N_EDGE_CONFIG_DONE="yes"

#TODO
# add routing option
#sudo ip route add 192.168.2.0/24 via 192.168.2.1

Czyli zmieniamy następujące zmienne:

  • N2N_COMMUNITY – nadajemy swoją przyjazną nazwę sieci N2N
  • N2N_KEY – hasło zabezpieczające sieć N2N
  • N2N_SUPERNODE – adres IP supernode, który uruchomiliśmy na początku, czyli nasz przykładowy adres 212.54.180.3
  • N2N_SUPERNODE_PORT – port na którym działa nasz supernode czyli tak jak go uruchomiliśmy wcześniej z opcją -l wskazując na port 82.
  • N2N_IP – adres wirtualnego interfejsu sieciowego sieci N2N na naszym VPS.
  • N2N_EDGE_CONFIG_DONE=”yes” – to musimy odkomentować aby N2N startowało jako usługa wraz z systemem.

Po zapisaniu pliku wykonujemy start usługi N2N:

sudo /etc/init.d/n2n start

Jeśli usługa uruchomiła się bez błędów to wykonujemy sprawdzenie połączenia poprzez ping:

ping 192.168.2.1

Jeśli adres pinguje to jest OK, jeśli nie, to sprawdzamy czy nie zostały popełnione błędy w pliku konfiguracyjnym, poprawiamy i sprawdzamy jeszcze raz.

Teraz logujemy się do naszego Raspberry PI przez SSH i instalujemy N2N tak samo jak na VPS czyli:

sudo apt update
sudo apt install n2n

Na Raspberry już nie uruchamiamy supernode bo potrzebujemy go tylko na VPS.

Dokonujemy na Raspberry, podobnie jak na VPS, konfiguracji w pliku /etc/default/n2n w następujący sposób:

# Config file for the n2n edge node daemon.

# Sets the n2n community name. All edges within the same community appear on
# the same LAN (layer 2 network segment). Community name is 16 bytes in length.
N2N_COMMUNITY="MyNetworkName" # tu wpisujemy tą samą nazwę co w VPS.

# Sets the twofish encryption key from ASCII text. All edges communicating must
# use the same key and community name.
N2N_KEY="MyPassW0rd" # to samo hasło co w VPS, zabezpieczające naszą sieć N2N

# Sets the n2n supernode IP address and port to register to.
N2N_SUPERNODE="212.54.180.3" # tu wpisujemy adres IP naszego VPSa
N2N_SUPERNODE_PORT="82"

# Sets the n2n virtual LAN IP address being claimed. This is a private IP
# address. All IP addresses in an n2n community typical belong to the same /24
# net‐ work (ie. only the last octet of the IP addresses varies).
N2N_IP="192.168.2.2" # tu nadajemy adres IP sieci N2N naszemu Raspberry PI

N2N_DAEMON_OPTS=""

# Uncomment this to get edge node started.
N2N_EDGE_CONFIG_DONE="yes"

#TODO
# add routing option
#sudo ip route add 192.168.2.0/24 via 192.168.2.2

Zapisujemy plik i uruchamiamy usługę N2N na Raspberry PI.

sudo /etc/init.d/n2n start

Ponownie wchodzimy na konsolę VPSa i sprawdzamy czy działa połączenie do Raspberry Pi:

ping 192.168.2.2

Jeśli ping działa poprawnie to oznacza, że udało nam się zestawić połączenie z odległym, spoza naszej prywatnej sieci VPSem, czyli dołączyliśmy go do naszej domowej sieci a on się nam odwdzięczy publicznym adresem IP :).

Połączenie powinno działać w obie strony czyli ping z Raspberry PI na adres 192.168.2.1 też powinien działać.

Jeszcze żeby się upewnić, że wszystko działa jak trzeba to z poziomu VPS spróbujmy się zalogować przez SSH do Raspberry PI:

ssh [email protected]

Jeśli się udało, to już powinniśmy być uśmiechnięci bo wyobraźnia podpowiada nam nowe możliwości, które były wcześniej niedostępne 🙂

Teraz musimy zadbać o to, żeby VPS wiedział, jak zareagować na żądanie w postaci:

http://212.54.180.3 lub http://<domena_vps>

i wyświetlił stronę naszego Domoticza (oczywiście wcześniej zabezpieczoną odpowiednio długim i skomplikowanym hasłem w konfiguracji Domoticz). Aby to zrobić, musimy dodać reguły iptables przekierowujące port 80 serwera VPS na adres 192.168.2.2 i port 8080 oraz zdefiniować odpowiedni routing ruchu między interfejsami sieciowymi VPS.

W tym celu musimy wykonać szereg poleceń, ale żeby nie robić tego za każdym razem gdy zrestartujemy VPS, to w katalogu /etc/init.d na VPS tworzymy plik o nazwie „firewall” i wrzucamy do niego zawartość:

#!/bin/bash

## przekazywanie pakietów
sysctl net.ipv4.ip_forward=1

## czyszczenie tablic iptables
iptables -F
iptables -X
iptables -F -t filter
iptables -X -t filter

## Routing n2n na local network
ip route add 192.168.2.0/24 via 192.168.2.1

## Maskarada
iptables -t nat -A POSTROUTING -j MASQUERADE

## Port forwarding
# domoticz pi
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.2:8080

ustawiamy mu odpowiednie uprawnienia aby uczynić go wykonywalnym:

sudo chmod +x /etc/init.d/firewall

Uruchamiamy pierwszy raz skrypt poleceniem:

sudo /etc/init.d/firewall

Teraz możemy przetestować czy po wpisaniu w przeglądarce adresu http://<domena_vps> pojawi się strona logowania naszego Domoticza.

Istnieje klient sieci N2N na Windows, więc jeśli jest potrzeba, to można się też z komputera „wbić” na Raspberry spoza lokalnej sieci.

Osobiście mocno rekomenduję odpowiednio zabezpieczyć Domoticz wystawiony na zewnątrz, w tym rozwiązaniu, najlepiej poprzez zainstalowanie na VPS nginxa i wykonaniu na nim proxy_pass a następnie podpięcie do VPS swojej domeny i po uzyskaniu certyfikatów zabezpieczyć połączenie SSL – to jest na prawdę ekskluzywne zabezpieczenie.

Przy ustawieniu odpowiedniego routingu na Raspberry można spowodować, że VPS będzie widział wszystkie IP z naszej sieci lokalnej.

To już jednak tematy na następne artykuły.

Korekta błędnej temperatury w bazie danych Domoticz

Jakiś czas temu zorientowałem się, że odczytywana temperatura ze sterownika Vaillant jest zaniżona o 1,5℃ ponieważ sam kiedyś ustawiłem taką korektę i o tym zapomniałem. Przez jakiś czas Domoticz zapisywał w bazie zaniżoną temperaturę co spowodowało u mnie dyskomfort psychiczny.

Znalazłem sposób na poprawę tej sytuacji poprzez edycję zapisanej temperatury bezpośrednio na bazie danych systemu Domoticz.

Sposób edycji bazy danych opisałem wcześniej w artykule pod tytułem Łatwa edycja bazy danych systemu Domoticz

Przedstawie tu, jak w określonym zakresie czasu „podnieść” w bazie danych temperaturę o 1,5℃.

Zaczynamy od zrobienia kopii zapasowej bazy danych aby mieć szansę cofnąć się do momentu przed potencjalnym zepsuciem sobie bazy danych 😉

Według tej instrukcji otwieramy bazę danych do edycji.

Potrzebujemy idx urządzenia, odpowiedzialnego za temperaturę. Można go wyszukać na liście urządzeń w Domoticz w menu Konfiguracja > Urządzenia lub odszukując go w tabeli bazy danych o nazwie „Temperature” filtrując pole „Name” i odczytując pole „DeviceRowId”

W moim przypadku idx=201 a data i godzina do której chcę skorygować temperaturę to 2018-07-10 22:40:01.

Mając te dane mogę teraz napisać zapytanie SQL, które taką zmianę wykona hurtowo na wszystkich rekordach do daty 2018-07-10 22:40:01.

Będziemy modyfikować (podnosić o 1,5℃) pole tabeli „Temperature” o tej samej nazwie „Temperature”  gdzie DeviceRowID=201 (DeviceRowID to idx) i „Date” < 2018-07-10 22:40:01

Takie zapytanie powinno wyglądać tak:

UPDATE Temperature
SET Temperature = Temperature + 1.5
WHERE DeviceRowID = 201 AND Date < '2018-07-10 22:40:01'

Wklejamy go teraz do programu DB Browser for SQLite w zakładce Execute SQL

i wykonujemy go za pomocą przycisku „Play”.

Poprawnie wykonane zapytanie w okienku poniżej powinno zwrócić odpowiednie informacje:

Query executed successfully: UPDATE Temperature
SET Temperature = Temperature + 1.5
WHERE DeviceRowID = 201 AND Date < '2018-07-10 22:40:01' (took 1ms, 51 rows affected)

Tym sposobem zmieniliśmy dane w dziennych raportach. Jeśli chcemy zmienić także w historycznych zapisach tygodniowych, miesięcznych i rocznych to musimy wykonać dodatkowe zapytanie na innej tabeli, o nazwie „Temperature_Calendar”. Tu musimy zmodyfikować kilka wartości, gdyż ta tabela przechowuje temperaturę minimalną, średnią i maksymalną – wszystkie te wartości musimy podnieść o 1,5℃.

UPDATE Temperature_Calendar
SET Temp_min = Temp_min + 1.5, Temp_max = Temp_max + 1.5, Temp_avg = Temp_avg + 1.5 
WHERE DeviceRowID = 201 AND Date < '2018-07-10 22:40:01'

Wykonujemy to zapytanie tak samo jak poprzednie i gotowe, zrobiliśmy korektę temperatury z błędnie raportującego czujnika i możemy być dumni z prawidłowych wartości w bazie danych Domoticz i na wykresach.

Łatwa edycja bazy danych systemu Domoticz

Konfiguracja systemu Domoticz, oraz wszelkie zgromadzone dane z czujników, zdarzenia, itp. znajdują się w pliku bazy danych o nazwie domoticz.db. Jest to relacyjna baza danych w popularnym formacie SQLite.

Poniżej przedstawię jak za pomocą wygodnego narzędzia o nazwie DB Browser for SQLite edytować dane w bazie Domoticz.

Uwaga! Zmiany bezpośrednio na bazie danych mogą wywołać nieoczekiwane błędy w działaniu systemu Domoticz. Zmiany na bazie są nieodwracalne i zawsze przed edycją zrób kopię pliku domoticz.db!

1. Instalujemy na Raspberry Pi program DB Browser for SQLite poleceniami w konsoli:

sudo apt update
sudo apt install sqlitebrowser

2. Wchodzimy w środowisko graficzne Raspbiana (podpięty monitor lub zdalnie przez VNC).
3. Wybieramy z menu Akcesoria > DB Browser for SQLite.

4. Tak wygląda uruchomiony program DB Browser for SQLite.

5. Otwieramy plik bazy danych poprzez menu File > Open Database i odszukanie go w systemie plików. Najczęściej instalacja jest w /home/pi/domoticz (moja instalacja Domoticz jest w /opt/domoticz, stąd różnica na obrazku). Klikamy „Otwórz”

6. Plik zostaje otwarty i widzimy tabele bazy danych. Wybieramy zakładkę „Browse Data” aby przejść do widoku zawartości tabeli.

7. Wybieramy tabelę, którą chcemy przeglądać lub edytować.

8. Edytujemy w sposób przedstawiony kolejno strzałkami poniżej.

Edycja z poziomu bazy danych może być niebezpieczna, dlatego zalecam ostrożność. Ten sposób daje nam jednak możliwość edycji danych, których z poziomu Domoticza nie można zmienić. Bardziej zaawansowani użytkownicy znający się na bazach danych mogą odkryć kolejny system zdarzeń i automatyzacji gdyż SQLite wspiera triggery 😉