Witam
Jestem 'nowy' w środowisku domotowicza i napotkałem na problem. Posiadam raspberry pi 4 i chciałbym dodać do niej kontaktron. Skorzystałem z tego poradnika (metoda 2ga) http://kostrzewinki.pl/podlaczenia-kontaktronu-raspberry-pi-systemie-domoticz/ i niestety po dodaniu wpisu w pliku domoticz.sh domoticz nie uruchamia się i wyrzuca w logu coś takiego:
2019-07-08 18:18:24.926 Status: Domoticz V4.10717 (c)2012-2019 GizMoCuz 2019-07-08 18:18:24.931 Status: Build Hash: b38b49e5, Date: 2019-05-09 13:04:08 2019-07-08 18:18:24.931 Status: Startup Path: /home/pi/domoticz/ 2019-07-08 18:18:25.055 Sunrise: 04:22:00 SunSet: 21:19:00 2019-07-08 18:18:25.055 Day length: 16:57:00 Sun at south: 12:50:00 2019-07-08 18:18:25.055 Civil twilight start: 03:29:00 Civil twilight end: 22:12:00 2019-07-08 18:18:25.055 Nautical twilight start: 01:53:00 Nautical twilight end: 23:48:00 2019-07-08 18:18:25.055 There is no astronomical twilight in the space of 24 hours 2019-07-08 18:18:25.058 Status: PluginSystem: Failed dynamic library load, install the latest libpython3.x library that is available for your platform. 2019-07-08 18:18:25.062 Status: Using 1-Wire support (kernel W1 module)... 2019-07-08 18:18:25.077 Active notification Subsystems: (0/13) 2019-07-08 18:18:25.101 Status: WebServer(HTTP) started on address: :: with port 8080 2019-07-08 18:18:25.118 Status: WebServer(SSL) started on address: :: with port 443 2019-07-08 18:18:25.170 Starting shared server on: :::6144 2019-07-08 18:18:25.171 Status: TCPServer: shared server started... 2019-07-08 18:18:25.171 Status: RxQueue: queue worker started... 2019-07-08 18:18:27.172 Status: 1Wire: Added Device: 28-000008f38c62 2019-07-08 18:18:28.067 Status: GPIO: This hardware is deprecated. Please transfer to the new SysFS hardware type! 2019-07-08 18:18:28.081 Status: GPIO: Interrupt handler for GPIO 3 started (TID: 641) 2019-07-08 18:18:28.082 Status: GPIO: This hardware is deprecated. Please transfer to the new SysFS hardware type! 2019-07-08 18:18:28.084 Error: Domoticz(pid:552, tid:586('MainWorker')) received fatal signal 6 (Aborted) 2019-07-08 18:18:28.084 Error: siginfo address=0x228, address=0xffffffff 2019-07-08 18:18:28.100 Status: GPIO: Interrupt handler for GPIO 3 started (TID: 644) 2019-07-08 18:18:29.068 (DS18B20#1) Temp (Temperatura dom) 2019-07-08 18:18:29.069 (DS18B20#1) Temp (Temperatura dom) 2019-07-08 18:18:31.027 Error: Thread 12 (Thread 0xb0cff220 (LWP 586)): 2019-07-08 18:18:31.027 Error: #0 __waitpid (options=0, stat_loc=0xb0cfdd78, pid=645) at ../sysdeps/unix/sysv/linux/waitpid.c:30 2019-07-08 18:18:31.027 Error: #1 __waitpid (pid=645, stat_loc=0xb0cfdd78, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:25 2019-07-08 18:18:31.027 Error: #2 0x002d8840 in dumpstack_gdb(bool) () 2019-07-08 18:18:31.027 Error: #3 0x002d8e2c in signal_handler(int, siginfo_t*, void*) () 2019-07-08 18:18:31.027 Error: #4 <signal handler called> 2019-07-08 18:18:31.027 Error: #5 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 2019-07-08 18:18:31.027 Error: #6 0xb6bb2230 in __GI_abort () at abort.c:79 2019-07-08 18:18:31.027 Error: #7 0x00a1ad7c in __gnu_cxx::__verbose_terminate_handler() () 2019-07-08 18:18:31.027 Error: #8 0x0097b45c in __cxxabiv1::__terminate(void (*)()) () 2019-07-08 18:18:31.027 Error: #9 0x0097b4d0 in std::terminate() () 2019-07-08 18:18:31.027 Error: #10 0x0026ca30 in std::_Sp_counted_ptr_inplace<std::thread, std::allocator<std::thread>, (__gnu_cxx::_Lock_policy)1>::_M_dispose() ()
Tak wygląda mój plik domoticz.sh:
#! /bin/sh ### BEGIN INIT INFO # Provides: domoticz # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Home Automation System # Description: This daemon will start the Domoticz Home Automation System ### END INIT INFO # Do NOT "set -e" PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin DESC="Domoticz Home Automation System" NAME=domoticz USERNAME=pi PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME DAEMON=/home/pi/domoticz/$NAME DAEMON_ARGS="-daemon" #DAEMON_ARGS="$DAEMON_ARGS -daemonname $NAME -pidfile $PIDFILE" DAEMON_ARGS="$DAEMON_ARGS -www 8080" DAEMON_ARGS="$DAEMON_ARGS -sslwww 443" DAEMON_ARGS="$DAEMON_ARGS -log /tmp/domoticz.txt" #DAEMON_ARGS="$DAEMON_ARGS -syslog" # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions pidof_domoticz() { # if there is actually a domoticz process whose pid is in PIDFILE, # print it and return 0. if [ -e "$PIDFILE" ]; then if pidof domoticz | tr ' ' '\n' | grep -w $(cat $PIDFILE); then return 0 fi fi return 1 } # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --chuid $USERNAME --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; reload) log_daemon_msg "Reloading $DESC" "$NAME" PID=$(pidof_domoticz) || true if [ "${PID}" ]; then kill -HUP $PID log_end_msg 0 else log_end_msg 1 fi ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload}" >&2 exit 3 ;; esac : /usr/bin/gpio export 2 out /usr/bin/gpio export 3 in /usr/bin/gpio edge 3 both
Może ktoś z was się z tym spotkał? Przeszukałem chyba cały internet, jednak nie znalazłem odpowiedzi 🙁
Z góry dziękuję za pomoc!
@marekm nie mam pewności bo nie mam RBPi 4 czy nowy system ( buster) toleruje starą metodę obsługi GPIO , ale jedno jest pewne źle deklarujesz te GPIO w pliku domoticza
powinno być
/usr/local/bin/gpio export 2 out /usr/local/bin/gpio export 3 in
/usr/local/bin/gpio edge 3 both
i oczywiście muszą być zainstalowane biblioteki wiringPi
I pamiętaj że po zmianie pliku konfigu domoticza trzeba albo zrestartować malinę albo chociaż domoticza
sudo /etc/init.d/domoticz.sh restart
Dzięki za odpowiedź,
Gdy wpisuje tak jak ty podałeś, to gdy wpiszę komendę 'gpio exports' to nie ma żadnego wyniku. Zrobiłem to zgodnie z wiki: https://www.domoticz.com/wiki/GPIO próbowałem również za pomocą 'echo 2 > ......' Rezultat niestety taki sam ;/
Masz nieprawidłową ścieżkę do polecenia gpio
masz
/usr/bin/gpio
powinno być
/usr/local/bin/gpio
Witam
Wychodzi na to że Domoticz ma wysypane stany "in", W swoim domoticzu (Raspbery ver 3.) tez mam z tym problem. Mogę zdeklarować wszystkie "out" ale po zdeklarowaniu "in" cały domoticz po reboocie nie wstaje. Nie wiem czy jest to wina Wiring Pi czy GPIO.
Czy komuś udało się rozwiązać problem ?
U mnie to działa. Mam na tym licznik wody zrobiony.
ja mam tak
/usr/local/bin/gpio export 1 in
/usr/local/bin/gpio edge 1 both
Przy czym 1 to jest numer pinu według WiringPi i odpowiadamu mu numer pinu 18 według BCM.
Jak pomylisz numery pinów to domoticz może po restarcie nie wstać.
To samo z wykorzystaniem numeracji BCM
/usr/local/bin/gpio export -g 18 in
/usr/local/bin/gpio edge -g 18 both
Możesz oczywiście nie dodawać koniecznych dla Ciebie wejść w domoticzu w pliku /etc/init.d/domoticz.sh
Po prostu napisz własny skrypt używający tego pinu który robi coś z domoticzem poprzez url.
Tu jest prosty przykład kodu odczytu impulsów z wodomierza i inkrementacji wirtualnego licznika w domoticzu.
https://github.com/darton/counters/blob/master/domoticz_counter.py
W przykładzie użyta jest bardzo fajna dla początkujących (i nie tylko) biblioteka gpiozero
U mnie jest tak że wystarczy ze dodam deklaracje "in" i zrobię reboot domoticza albo całej maliny i domoticz już nie wstaje, pokazuje jakiś daemon problem. Nigdzie w internecie nie udało mi się znaleźć rozwiązania. Pomysł z napisaniem skryptu w pythonie wydaje się być spoko, szkoda że pomijam domoticza w tym wszystkim w takim rozwiązaniu.
Chciałem aby kontaktron na drzwiach pokazywał mi kiedy były otwierane drzwi do mieszkania na wizualizacji domoticz. Bede kombinował, może jakoś się uda to rozwiązać.
Tu masz następny przykład skryptu wywołującego reakcję domoticza na zmianę stanu wielu wejść gpio Raspberry Pi.
Bez deklaracji gpio jako wejście w skrypcie startowym domoticza.
W domoticzu deklarujesz tylko wirtualne przełączniki, których numery idx wpisujesz do tego skryptu mapując dany numer idx na numer GPIO,
https://github.com/darton/4domoticz/blob/master/inputs.py
Przykład jest zrobiony dla 7 portów GPIO RPi ale może być ich więcej lub mniej.
Zaletą tego rozwiązania jest, że te wejścia mogą być na zupełnie innym Raspberry Pi (czy PC) choćby i na końcu świata.
Wystarczy zamiast 127.0.0.1 użyć adresu ip domoticza.
Skrypt powinien zostać dodany do /etc/rc.local tak by się uruchamiał po restarcie: dodając
su - pi -c '/home/pi/scripts/inputs.py &'
zaraz przed
exit 0
Mogę prosić o pomoc? U mnie ten scrypt ma ścieżkę home/pi/domoticz/scripts/kontaktron.py, ale nie potrafię tego dodać w etc/rc.local tak by się uruchamiał po restarcie.
Dziękuję za pomoc
W najnowszych wersjach Raspbiana czy Raspberry Pi OS lepiej zrobić to z wykorzystaniem natywnych sposobów dla systemd
https://www.raspberrypi.org/documentation/linux/usage/systemd.md
tutaj przykład gdzie korzystam właśnie z tej metody:
https://github.com/darton/RPiMS/blob/master/rpims.service
Przykładowo niech Twój skrypt uruchamiany przez systemd nazywa się np kontaktron.service
a jego zawartość to:
[Unit]
Description=Kontraktron Service
After=network.target
Conflicts=getty@tty1.service
[Service]
Type=simple
User=pi
Group=pi
ExecStart=/usr/bin/python3 /home/pi/domoticz/scripts/kontaktron.py
StandardInput=tty-force
[Install]
WantedBy=multi-user.target
Po stworzeniu takiego pliku kopiujemy go we właściwe miejsce:
sudo mv ./kontaktron.service /lib/systemd/system/kontaktron.service
a następnie wykonujemy reload:
sudo systemctl daemon-reload
oraz włączamy usługę:
sudo systemctl enable kontaktron.service
po restarcie skrypt powinien się uruchomić
sudo reboot
Wtedy jeśli zajdzie potrzeba można elegancko ręcznie zatrzymać działania skryptu:
sudo systemctl stop kontraktron.service
lub wznowić jego działanie:
sudo systemctl start kontraktron.service
Jest to dużo przyjemniejszy sposób niż kilowanie procesu 🙂
Dzięki takiemu podejściu, skrypt także zostanie zatrzymany przez systemd podczas wyłączenia systemu.
@darton@ bardzo dziękuję za podpowiedź. Wszystko działa jak należy. Niestety nie obyło się bez problemu. Skopiowałem skrypt ze strony, wszystko zrobiłem jak jest napisane i nie działa...... Próbowałem na wszystkie sposoby. Przepisałem skrypt ręcznie bo to różnie jest z tym kopiowaniem i niestety nie działa.... Trochę się z tym męczyłem i na koniec zmieniłem wersję Pythona na 2 i dopiero zaskoczyło. Dziwne bo 3 też jest zainstalowana. Mam najnowszą wersję Bustera na rpi 3b +.
Mam jeszcze jedno małe pytanie. Miałem ten właśnie skrypt w katalogu domoticz.sh, żeby się odpalał na starcie programu. Gdy sprawdzałem status domoticza to pokazywał Failed, mimo, że wszystko działało normalnie, tak przynajmniej mnie się wydawało. Gdy usunąłem go to status jest Active running. Dlaczego tak się stało?
Pozdrawiam i dziękuję
Trochę się z tym męczyłem i na koniec zmieniłem wersję Pythona na 2 i dopiero zaskoczyło. Dziwne bo 3 też jest zainstalowana. Mam najnowszą wersję Bustera na rpi 3b +.
Prawdopodobnie masz potrzebne biblioteki dla Pythona w wersji 2.x a brakuje Ci tych bibliotek dla Pythona w wersji 3.x
Uruchom ręcznie
/usr/bin/python3 /home/pi/domoticz/scripts/kontaktron.py
i zobacz jakie błędy się pokażą.
File /home........./kontaktron.py , line 3, in <module>
import RPi,GPIO as GPIO
ModuleNotFoundError : No module named 'RPi'
taki blad wyskakuje
Pozdrawiam
Zatem doinstaluj brakujący pakiet
sudo apt-get install python3-rpi.gpio
choć możliwe, że python3-dev też nie masz wtedy
sudo apt-get install python3-dev python3-rpi.gpio
Cześć, podłączę się pod temat, bo wcześniej korzystałem z wiringPi żeby sterować z domoticza zaworem podlewania. Z tego co wyczytałem WiringPi jest wycofane i nie działa na nowszej wersji Pythona/Raspberry(?)
Teraz chciałbym sterować oświetleniem za pomocą wyjść centrali Satel. Mam już do tego przeznaczone wyjście, ale musiałbym użyć jednego z GPIO na Raspberry żeby po zwarciu do masy wyjścia Satel móc odczystać stan na domoticzu (niestety nie posiadam modułu ETHM)
Skrypt @darton podoba mi się tylko mam pytanie: w wiringPi w pliku /etc/init.d/domoticz.sh deklarowałem które GPIO jest wejściem, a które wyjściem (3.3V). W skryppcie widzę same wejścia.
Jak robi się wyjścia za pomocą "nowej" metody?
I czy w tym zapisie
"51" : Button(5, hold_time=0.2)
5 oznacza numer GPIO ?
Button i jego parametry opisany jest w bibliotece gpiozero.