Witam wszystkich,
Od dawna szukałem sposobu, by wykrywać pojawienie się mojego telefonu w sieci domowej WiFi.
Przeszukałem chyba cale forum i nic co jest tutaj umieszczone nie odpowiadało mi zbytnio. Być możne z racji moich biednych umiejętności programistycznych i słabej znajomości języka LUA (brak jakiegoś porządnego kursu w oparciu o system Fibaro).
W końcu znalazłem ten oto temat, który w 99% spełnił moje oczekiwanie.
W domu posiadam router Asus RT-N66U i nie jest (z mojego punktu widzenia) tak łatwe dobranie się do listy podłączonych urządzeń, ale po głębszym szperaniu w końcu znalazłem to co chciałem. Jest to lista aktualnie podłączonych urządzeń, aktualizująca się dynamicznie.
Przechodząc do rzeczy, powyższy temat umożliwił mi sprawdzanie obecności danego urządzenia w sieci lokalnej, jednak by to zrobić, muszę kliknąć w przycisk na urządzeniu wirtualnym. Owszem, mogę stworzyć scenę, która będzie to za mnie robić ale pomyślałem, po co UW i scena, jeśli można by to zrobić tylko i wyłącznie za pomocą sceny, która uruchamiała by się np co minutę i ustawiała by zmienna globalna. Jak pomyślałem tak zrobiłem i przeniosłem kod z przycisku wirtualnego do sceny. Jak się można domyślić, tutaj pojawiają się schody.
Oto kod z przycisku w urządzeniu wirtualnym (po moim dostosowaniu), który świetnie tam działa po naciśnięciu:
-- START USTAWIENIA UZYTKOWNIKA --
-- Router user i password dla logowania
user = "xxxx";
pwd = "yyyy";
-- adres MAC do wyszukania
--deviceMAC = "64:9A:XX:XX:XX:XX";
-- powyzsze nie dziala jak powinno
deviceMAC = "64:9A:XX:XX:XX:XX associated authorized";
-- END USTAWIENIA UZYTKOWNIKA --
-- NIE ZMIENIAC ODTAD --
selfId = fibaro:getSelfId();
ip = fibaro:get(selfId, 'IPAddress');
port = fibaro:get(selfId, 'TCPPort');
router = Net.FHttp(ip, port);
router:setBasicAuthentication(user,pwd);
--testuje rozne warianty dostepu do routera, jedno z nich powinno dzialac i pokazac mi liste podlaczonych urzadzen
--response, status, errorCode = router:GET("/device-map/clients.asp")
response, status, errorCode = router:GET("/Main_WStatus_Content.asp")
--response, status, errorCode = router:GET("/Status_Lan.asp")
if(string.find(response, deviceMAC)) then
fibaro:debug("Robert JEST w WiFi")
fibaro:call(95, "sendPush", "Roberta JEST w WiFi");
fibaro:log("Robert jest w WiFi")
else
fibaro:debug("Roberta nie ma w WiFi")
fibaro:call(95, "sendPush", "Robert POZA WiFi");
fibaro:log("Robert nie jest w WiFi")
end
fibaro:debug("*********************************")
Pytanie (i prośba) pojawia się następujące: co muszę dodać/zmienić/napisać inaczej by scena mogla się wykonać bezbłędnie?
Pierwszy problem to jak przypisać adres IP do zmiennej IP by potem moc go wykorzystać?
Zrobilem tak (caly kod):
--[[
%% properties
%% globals
--]]
-- START USER SETTINGS --
user = "xxxx";
pwd = "yyyy";
-- MAC address to search for
deviceMAC = "64:9A:XX:XX:XX:XX associated authorized";
-- END USER SETTINGS --
-- DO NOT CHANGE FROM HERE --
ip = "192.168.2.1"
port = 80
router = Net.FHttp(ip, port);
fibaro:debug(tostring(router))
router:setBasicAuthentication(user,pwd);
--testuje rozne warianty dostepu do routera
--response, status, errorCode = router:GET("/device-map/clients.asp")
response, status, errorCode = router:GET("/Main_WStatus_Content.asp")
--response, status, errorCode = router:GET("/Status_Lan.asp")
if(string.find(response, deviceMAC)) then
fibaro:debug("Robert JEST w WiFi")
fibaro:call(95, "sendPush", "Robert JEST w WiFi");
fibaro:log("Robert jest w WiFi")
else
fibaro:debug("Roberta nie ma w WiFi")
fibaro:call(95, "sendPush", "Robert POZA WiFi");
fibaro:log("Robert nie jest w WiFi")
end
fibaro:debug("*********************************")
I dochodzi do momentu gdzie pojawia się taki oto błąd:
line 25: attempt to index global"Net" (a nil value)
linia 25 to: router = Net.FHttp(ip, port);
Czy może mi ktoś pomóż?