W dzisiejszym wpisie opisze jak sprawić by Nasz system Domoticz był w stanie rozpoznać czy Nasze urządzenie, np. (telefon komórkowy, laptop, TV, tablet itp.) jest włączony – znajduje się w obrębie Naszej sieci WiFi.
Aby to zrobić należy zalogować się przez SSH do Naszego Raspberry:
Przechodzimy do katalogu Scripts przez wpisanie komendy:
cd domoticz/scripts
Następnie utworzyć plik check_device_online.py za pomocą komendy: (plik można nazwać jak tylko chcecie)
sudo nano check_device_online.py
W pliku należy wkleić poniższy tekst:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#!/usr/bin/python # Title: check_device_online.py # Author: Chopper_Rob # Date: 25-02-2015 # Info: Checks the presence of the given device on the network and reports back to domoticz # URL : https://www.chopperrob.nl/domoticz/5-report-devices-online-status-to-domoticz # Version : 1.6.2 import sys import datetime import time import os import subprocess import urllib2 import json import base64 # Settings for the domoticz server domoticzserver="192.168.2.1:8080" domoticzusername = "admin" domoticzpassword = "admin" domoticzpasscode = "your passcode for Light/Switch Protection" # If enabled. The script will log to the file _.log # Logging to file only happens after the check for other instances, before that it only prints to screen. log_to_file = False # The script supports two types to check if another instance of the script is running. # One will use the ps command, but this does not work on all machine (Synology has problems) # The other option is to create a pid file named _.pid. The script will update the timestamp # every interval. If a new instance of the script spawns it will check the age of the pid file. # If the file doesn't exist or it is older then 3 * Interval it will keep running, otherwise is stops. # Please chose the option you want to use "ps" or "pid", if this option is kept empty it will not check and just run. check_for_instances = "pid" # DO NOT CHANGE BEYOND THIS LINE if len(sys.argv) != 5 : print ("Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.") sys.exit(0) device=sys.argv[1] switchid=sys.argv[2] interval=sys.argv[3] cooldownperiod=sys.argv[4] previousstate=-1 lastsuccess=datetime.datetime.now() lastreported=-1 base64string = base64.encodestring('%s:%s' % (domoticzusername, domoticzpassword)).replace('\n', '') domoticzurl = 'http://'+domoticzserver+'/json.htm?type=devices&filter=all&used=true&order=Name' if check_for_instances.lower() == "pid": pidfile = sys.argv[0] + '_' + sys.argv[1] + '.pid' if os.path.isfile( pidfile ): print datetime.datetime.now().strftime("%H:%M:%S") + "- pid file exists" if (time.time() - os.path.getmtime(pidfile)) < (float(interval) * 3): print datetime.datetime.now().strftime("%H:%M:%S") + "- script seems to be still running, exiting" print datetime.datetime.now().strftime("%H:%M:%S") + "- If this is not correct, please delete file " + pidfile sys.exit(0) else: print datetime.datetime.now().strftime("%H:%M:%S") + "- Seems to be an old file, ignoring." else: open(pidfile, 'w').close() if check_for_instances.lower() == "ps": if int(subprocess.check_output('ps x | grep \'' + sys.argv[0] + ' ' + sys.argv[1] + '\' | grep -cv grep', shell=True)) > 2 : print (datetime.datetime.now().strftime("%H:%M:%S") + "- script already running. exiting.") sys.exit(0) def log(message): print message if log_to_file == True: logfile = open(sys.argv[0] + '_' + sys.argv[1] + '.log', "a") logfile.write(message + "\n") logfile.close() def domoticzstatus (): json_object = json.loads(domoticzrequest(domoticzurl)) status = 0 switchfound = False if json_object["status"] == "OK": for i, v in enumerate(json_object["result"]): if json_object["result"][i]["idx"] == switchid: switchfound = True if json_object["result"][i]["Status"] == "On": status = 1 if json_object["result"][i]["Status"] == "Off": status = 0 if switchfound == False: print (datetime.datetime.now().strftime("%H:%M:%S") + "- Error. Could not find switch idx in Domoticz response. Defaulting to switch off.") return status def domoticzrequest (url): request = urllib2.Request(url) request.add_header("Authorization", "Basic %s" % base64string) response = urllib2.urlopen(request) return response.read() log (datetime.datetime.now().strftime("%H:%M:%S") + "- script started.") lastreported = domoticzstatus() if lastreported == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is online") if lastreported == 0 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- according to domoticz, " + device + " is offline") while 1==1: currentstate = subprocess.call('ping -q -c1 -W 1 '+ device + ' > /dev/null', shell=True) if currentstate == 0 : lastsuccess=datetime.datetime.now() if currentstate == 0 and currentstate != previousstate and lastreported == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, no need to tell domoticz") if currentstate == 0 and currentstate != previousstate and lastreported != 1 : if domoticzstatus() == 0 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, tell domoticz it's back") domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=switchlight&idx=" + switchid + "&switchcmd=On&level=0" + "&passcode=" + domoticzpasscode) else: log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " online, but domoticz already knew") lastreported=1 if currentstate == 1 and currentstate != previousstate : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, waiting for it to come back") if currentstate == 1 and (datetime.datetime.now()-lastsuccess).total_seconds() > float(cooldownperiod) and lastreported != 0 : if domoticzstatus() == 1 : log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, tell domoticz it's gone") domoticzrequest("http://" + domoticzserver + "/json.htm?type=command&param=switchlight&idx=" + switchid + "&switchcmd=Off&level=0" + "&passcode=" + domoticzpasscode) else: log (datetime.datetime.now().strftime("%H:%M:%S") + "- " + device + " offline, but domoticz already knew") lastreported=0 time.sleep (float(interval)) previousstate=currentstate if check_for_instances.lower() == "pid": open(pidfile, 'w').close() |
Zmieniamy w nim tylko linię (domoticzserver=„192.168.2.1:8080„) gdzie wpisujemy adres IP do Waszego systemu Domoticz.
Naciskamy CTR+X i zapisujemy plik.
Następnie wpisujemy:
sudo chmod +x check_device_online.py
Następnie w systemie Domoticz tworzymy wirtualny przycisk o typie Przełącznik ( o czym nie raz pisałem w poprzednich wpisach).
Zapamiętujemy jego IDX (możemy go znaleźć po lewej stronie w Konfiguracja–> Urządzenia–> Nieużywane) – w moim przypadku będzie to 98.
Następnie wpisujemy komendę:
crontab -e
Na końcu tego pliku wpisujemy:
*/10 * * * * sudo python /home/pi/domoticz/scripts/check_device_online.py XX.XX.XX.XX 98 99 45
Zamiast XX.XX.XX.XX wpisujemy adres IP Naszego urządzenia, którego widoczność chcemy sprawdzić (np. laptopa z ip 192.168.0.15).
Kolejna liczba 98 to Wasz IDX, o którym pisałem wcześniej.
Liczba 99 w przykładzie – co tyle czasu (99 sekund) Domoticz będzie sprawdzał czy Wasze urządzenie jest podłączone do sieci.
Liczba 45 w przykładzie – Jeżeli w przeciągu 45 sekund urządzenie nie odpowie na żądania IP – Domoticz ustawi włącznik w pozycji OFF.
Naciskamy CTRL+X i zapisujemy Nasz plik.

Jeżeli Wszystko zrobiliście poprawnie powinniście widzieć czy Wasze urządzenia są dostępne (włączone) w Waszej sieci domowej co pozwoli Wam np. na odpalenie lamki biurowej gdy włączycie laptopa, itp.
Gdyby coś nie działało pod tym adresem znajdziecie gotowy plik.
Pozdrawiam
33 Odpowiedzi
XTR
Robię dokładnie jak w poradniku jest napisane i zero reakcji … Co mogę robić źle ?
Łukasz Kostrzewa
Witam
Zapomniałem napisać o tym w poradniku ale czy zmienił Pan: domoticzpasscode = „your passcode for Light/Switch Protection”
Ma Pan to hasło ustawione w Konfiguracja–> Ustawienia „Zabezpieczenie świateł/przełączników:”
Może to pomoże
Proszę dać znać
Pozdrawiam
Artur
Mam RPi3 z domoticzem i w zaden sposob nie moge tego uruchomic.
[email protected]:~/domoticz/scripts $ sudo python check_device_online.py 192.168.1.60 3 45 45
20:33:20- pid file exists
20:33:20- Seems to be an old file, ignoring.
20:33:20- script started.
20:33:20- according to domoticz, 192.168.1.60 is offline
20:33:20- 192.168.1.60 offline, waiting for it to come back
Niby dziala ale nie widzi laptopa. Pingowanie OK
Łukasz Kostrzewa
Hmm…
Dziwne… Rozumiem, że adres 192.168.1.60 na pewno odpowiada Pańskiemu laptopowi i próbował Pan komendy ping 192.168.1.60 i wszystko działa?
Zapomniałem napisać o tym w poradniku ale czy zmienił Pan: domoticzpasscode = „your passcode for Light/Switch Protection”
Ma Pan to hasło ustawione w Konfiguracja–> Ustawienia „Zabezpieczenie świateł/przełączników:”
Może to jest problem?
Rozumiem, że 3 to numer IDX Pańskiego wirtualnego przełącznika odpowiadającemu za laptopa?
Proszę spróbować usunąć wszystkie pliki o rozszerzeniu .pid jakie utworzyły się w katalogu i spróbować raz jeszcze…mi czasami nie działało i musiałem usunąć utworzone wcześniej pliki.
Pozdrawiam
Krzysztof
Witam.
Skrypt wyrzuca mi błąd w lini 57 :
[email protected]:~/domoticz/scripts $ sudo python check_device_online.py 192.168.0.101 5 99 45
File „check_device_online.py”, line 57
if (time.time() – os.path.getmtime(pidfile)) < (float(interval) * 3): print datetime.datetime.now().strftime(„%H:%M:%S”) + „- script seems to be still running, exiting” print datetime.datetime.now().strftime(„%H:%M:%S”) + „- If this is not correct, please delete file ” + pidfile sys.exit(0) else: print datetime.datetime.now().strftime(„%H:%M:%S”) + „- Seems to be an old file, ignoring.” else: open(pidfile, ‚w’).close() if check_for_instances.lower() == „ps”: if int(subprocess.check_output(‚ps x | grep \” + sys.argv[0] + ‚ ‚ + sys.argv[1] + ‚\’ | grep -cv grep’, shell=True)) > 2 :
^
SyntaxError: invalid syntax
[email protected]:~/domoticz/scripts $
Łukasz Kostrzewa
Witam
Po tym jak to zostało wklejone niewiele widać.
Bardzo bym prosił o wysłanie screena z błędem na maila [email protected]
Pozdrawiam
Krzysztof
Witam serdecznie.
Panie Łukaszu jeszcze raz dziękuję za pomoc w rozwiązaniu błędu, który opisałem.
W moim przypadku metoda „kopiuj i wklej” skrypt nie zdała egzaminu, zapewne kwestia kodowania znaków.
Pomogła dopiero pomoc Pana Łukasza, a mianowicie przesłanie gotowego działającego skyptu e-mailem w załączniku.
Fajnie gdyby na blogu skrypty do opisywanych tematów były zamieszczane na serwerze z linkiem do pobrania gotowego pliku.
Ostatecznie wszystko u mnie działa jak należy zgodnie z opisem w tym tutorialu.
Pozdrawiam serdecznie i czekam na kolejne ciekawe wpisy 🙂
Łukasz Kostrzewa
Witam
Super, że się wszystko udało.
Uzupełniłem niektóre wpisy o gotowe pliki do ściągnięcia
Pozdrawiam i życzę miłego dnia
Kamil
Skopiowany kod podobnie jak u Krzysztofa wyrzucał błąd. Pobrałem więc plik i niestety tez nie działa prawidłowo: wyrzuca mi ze skryptu: „Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.” Gdzie szukać problemu?
Marcin
U mnie to samo co u Kamila. Jest rozwiązanie?
Łukasz
Witam ja tez mam problem jesli użyje polecenia sudo python check_device_online.py 192.168.1.202 34 45 45 urzadzenie jest wykrywane i wszystko ok ale bez uruchomionego tego polecenia nie działa co może byc tego przyczyną?
Agnieszka Kostrzewa
A w cronteb -e wszystko jest poprawnie wpisane?
Pozdrawiam
Tomek
Witam,
może ktoś wie co jest przyczyną tego, iż skrypt nie wykrywa obecności urządzeń pracujących na Windows 10? Telefony z androidem są wykrywane, laptop pod kontrolą Windows 7 również. Smart TV LG też jest wykrywany. Natomiast dwa komputery stacjonarne pracujące na systemie Windows 10 już niestety nie. Co może być przyczyną takiej sytuacji ?
pozdrawiam
Agnieszka Kostrzewa
Ciekawa sytuacja. Rozumiem ze komputer podlaczony jest kablem? A inne urzadzenia po WiFi? Nie powinno to miec teirerycznie znaczenia ale…
Pozdrawiam
Tomek
Laptop pod Win7 jest po WIFI, Telewizor jest po kablu.
Komputery pod kontrolą Win10 które nie są wykrywane – jeden łączy się po Wifi, drugi po kablu. Znajdują się w tej samej sieci i widzą normalnie Domoticza…
Dziwne, wiem – jak to rozwiązać?
Agnieszka Kostrzewa
Kurcze… Prosze sprobowac wyslac komende ping …. A w miejsce kropek nr ip komputera stacjonarnego. Jezeli ping nie wroci to bedzie to wina ustawien kompa. Jak wroci to nie mam pomysłu 🙁
Pozdrawiam
Tomek
Już rozwiązałem problem.
Konieczne okazało się ustawienie w systemie Windows 10 zezwolenia na udostępnianie plików i drukarek. Po tej małej zmianie wszystko działa 🙂
Może komuś się przyda.
ps. Bardzo fajne artykuły. Malina stoi u mnie już ponad rok z bramką Mysensors i kilkoma czujnikami bezprzewodowymi.
Teraz widzę, że można do wyposażyć w szereg innych ciekawych rozszerzeń 🙂
Jeszcze jedna rzecz, może komuś się przyda. Dostęp do sieci mam poprzez Play LTE i byłem przekonany, że nie da się ustawić dostępu zdalnego do Maliny. Byłem w okropnym błędzie. Oczywiście da się. Polecam zapoznać się z rozwiązaniem VPN.net – Hamachi by LogMeIn
pozdrawiam
Tomek.
Agnieszka Kostrzewa
Hej. Wielkie dzięki za info jak rozwiązać ten problem. Dzieki za mile slowa:) Pozdrawiam
konrad
Witam,
ponowie pytanie czy jest rozwiązanie na problem z :
„Not enough parameters. Needs %Host %Switchid %Interval %Cooldownperiod.”
Szukałem skąd ma pobrać te parametry ale już nie wiem…. są zmienne :
device=sys.argv[1]
switchid=sys.argv[2]
interval=sys.argv[3]
cooldownperiod=sys.argv[4]
Ale nie wiem co to za wartości są podane ?????
Marcin
Mam pytanie. Skoro przedostania cyfra w cronie odpowiada co ile dmoticz sprawdza urządzenie czy jest online czy nie, to za co odpowiada liczba */10 * * * * która występuje w tym fragmencie polecenia?
Pozdrawiam
Agnieszka Kostrzewa
Witam. Ta liczba oznacza ze co 10 minut. Tu jest wszystko ladnie wyjasnione http://www.adminschoice.com/crontab-quick-reference
Marcin
To wiem, ale nie mogę jednego pojąć. Jeżeli domoticz sprawdza co określony czas status urządzenia który ustawimy w przedostatniej liczbie, to po co ma się uruchamiać to zadanie w cronie co 10 minut? Czy jedno nie wyklucza drugiego?
Wiem że zadaje dziwne pytania :D, ale nie zgrywają mi się czasy i przez to sceny włączają się albo za późno albo za wcześnie
Pozdrawiam
Daniel
Super wpis ale mam pytanie dlaczego na dwóch urządzeniach z trzech mam ciągłe pingowanie nawet jeśli jednym z nich jest telefon który mam w pracy poza domem?Jeden TV jest ok drugi wciąż pinguje i telefon wciąż pinguje nawet jeśli wyłączony. Gdzie szukać problemu?
Agnieszka Kostrzewa
Tv może pingowac bo sie do końca nie wyłącza. Ja tak miałem z Philips Pos 9002. Tv po wyłączeniu miał wciąż aktywne wifi (może masz tak samo?) Telefonu wytłumaczyć nie potrafie:( Na bank dobry IP wpisałes? Nie mam pomysłu. Pozdrawiam
Przemek
Mam problem taki jak Łukasz. komenda:
sudo python check_device_online.py 192.168.1.17 127 45 45
Sprawia że wykrywa urządzenie i w domoticzu zmienia stan ale po za tym nie działa niestety. Może mała podpowiedz co sprawdzić: W crontab -e
mam jedynie:
*/10 * * * * sudo python /home/pi/domoticz/scripts/check_device_online.py 192.168.1.17 127 99 45
Agnieszka Kostrzewa
Witam. Nie rozumiem w czym problem skoro wykrywa urządzenie i zmienia stan w Domoticz to co nie działa? Pozdrawiam
Przemek
Problem że wywołanie komendy z wiersza poleceń wykrywa urządzenie i zmienia stan w domoticzu ale nie działa automatycznie tak jak by crontab nie był wywoływany
Agnieszka Kostrzewa
Ja niestety lub stety używam Domoticza sprzed 2 lat (tak samo jak i raspbiana). Od tego czasu mogło się wiele pozmieniać 🙁 Mi wszystko działa jak powinno i nie wiem czemu może nie działać poprawnie. Pozdrawiam
Piotr
Od wersji Domoticza 4.9 skrypt nie będzie działał… nie wiem dlaczego… błąd w linii 40 😦
Jednak jest rozwiązanie:
https://www.domoticz.com/wiki/System_Alive_Checker_%28Ping%29
Agnieszka Kostrzewa
Hej. Dzięki za info i rozwiązanie. Ja od 2 lat nie aktualizował Domoticza. Między innymi z obawy że niektóre rzeczy działać nie będa. Pozdrawiam