Forum użytkowników automatyki budynkowej

Z-wave => Fibaro - sceny => Wątek zaczęty przez: Akronaut w Kwiecień 27, 2015, 08:09:47 am

Tytuł: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 27, 2015, 08:09:47 am
Mam uruchomione sprawdzanie obecności w domu na podstawie zalogowania do sieci wifi. Na tej podstawie ustawiana jest zmienna, która odpala sceny.
Zauważyłem, że w ciągu dnia telefon jest wylogowywany i w ciągu minuty ponownie logowany. To wystarcza do np. opuszczenia rolet.
Czy możecie pomóc w przygotowaniu sceny, która sprawdza logowanie i w przypadku wylogowania sprawdza ponownie za 2 minuty.
Jeżeli drugie sprawdzenie nie wykryje zalogowania dopiero wówczas scena zmienia wartość zmiennej.
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: marecki_0luk1 w Kwiecień 27, 2015, 10:09:46 am
Zrób sprawdzenie w pętli ze sleepem :)
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 27, 2015, 10:26:13 am
Kolego ja jestem inżynierem ale od budownictwa  ;D.
Może i potrafię to zrobić ale Twój opis mi nic nie mówi.
Możesz bardziej przystępnym językiem to opisać .... ;)
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: marecki_0luk1 w Kwiecień 27, 2015, 11:04:14 am
Wklej to co masz - poprawię Ci.
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 27, 2015, 11:27:02 am
co minutę scena poniżej

--[[
%% autostart
%% properties
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
 ( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "00", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "23", "59"))) and (math.floor(os.time()/60)-math.floor(1422831600/60))%1 == 0 )
)
then
   fibaro:call(460, "pressButton", "1");
   fibaro:call(461, "pressButton", "1");
   fibaro:call(462, "pressButton", "1");
   fibaro:call(463, "pressButton", "1");
end

setTimeout(tempFunc, 20*1000)
end
if (sourceTrigger["type"] == "autostart") then
tempFunc()
else

local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
   fibaro:call(460, "pressButton", "1");
   fibaro:call(461, "pressButton", "1");
   fibaro:call(462, "pressButton", "1");
   fibaro:call(463, "pressButton", "1");
end

end
if (sourceTrigger["type"] == "other") then
    fibaro:call(460, "pressButton", "1");
   fibaro:call(461, "pressButton", "1");
   fibaro:call(462, "pressButton", "1");
   fibaro:call(463, "pressButton", "1");
end 

uruchamia urządzenie wirtualne

tcpSocket = Net.FTcpSocket("192.168.1.12", 32001)
bytes, errorCode = tcpSocket:write("test")

if errorCode == 0
then
fibaro:setGlobal("WiFi_Mariusz_WP", "1"); 
fibaro:log("Mariusz w domu"); 
else
fibaro:setGlobal("WiFi_Mariusz_WP", fibaro:getGlobal("WiFi_Mariusz_WP") - 1);
fibaro:log("Mariusz poza domem");
end

które ustawia zmienną (mam 4 takie urządzenia dla 4 zmiennych)
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: marecki_0luk1 w Kwiecień 27, 2015, 12:29:55 pm
Można to ładniej zrobić, ale zadziała a na tyle mam czas :)

fibaro:debug("Start looking for phone");

local lvs_GlobalName = "WiFi_Mariusz_WP";
local lvs_Phone_IP = "192.168.XX.XXX";
local lvn_Phone_PORT = YY;
local lvb_IsPhoneOnline = false;
local lvb_TryAgain = true;
local lvn_Iterator = 1;

while lvb_TryAgain do   
fibaro:debug("Try number: " .. lvn_Iterator); 
tcpSocket = Net.FTcpSocket(lvs_Phone_IP, lvn_Phone_PORT)
bytes, errorCode = tcpSocket:write("test")

  fibaro:debug("ERROR CODE: " .. errorCode);
 
if errorCode == 0 then
lvb_IsPhoneOnline = true;
    lvb_TryAgain = false;
else
            if lvn_Iterator == 3 then
    lvb_TryAgain = false;
      lvb_IsPhoneOnline = false;
      else
fibaro:sleep(1000*60);
    end;
    lvn_Iterator = lvn_Iterator + 1;
end; 
end;

if lvb_IsPhoneOnline then
fibaro:setGlobal(lvs_GlobalName, "1");
fibaro:log("Phone founded [" .. tostring(lvb_IsPhoneOnline) .. "]");
else
fibaro:setGlobal(lvs_GlobalName, "0");
fibaro:log("Phone founded [" .. tostring(lvb_IsPhoneOnline) .. "]");
end; 

fibaro:debug("--- Script finnished ---");
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 27, 2015, 01:53:21 pm
dziękuję
po powrocie do domu sprawdzę
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 27, 2015, 02:35:30 pm
wpisałem szukane IP, numer portu i zmienną i w linii 11 mam komunikat:
[DEBUG] 15:35:00: Start looking for phone
[DEBUG] 15:35:00: Try number: 1
[ERROR] 15:35:00: line 12: attempt to index global 'Net' (a nil value)

pewnie to proste i macie ze mnie ubaw ;)
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: marecki_0luk1 w Kwiecień 27, 2015, 09:52:43 pm
EDIT: wpisz to jako kod do urzadzenia wirtualnego. thx szytwniak za uwagę.
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: sztywniak w Kwiecień 27, 2015, 09:58:05 pm
Wkleił do sceny
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Kwiecień 28, 2015, 09:21:00 am
już wkleiłem do VD i działa
dzięki
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Czerwiec 14, 2015, 08:06:31 am
nie mam wielkich osiągnięć w programowaniu ale zainstalowałem z Waszą pomocą takie VD dla 4 telefonów i wszystko działało na WP 8.1 do czasu zamiany jednego z nich na Huawei P8
tcpSocket = Net.FTcpSocket("192.168.1.xx", 60792)
bytes, errorCode = tcpSocket:write("test")
 
if errorCode == 0
then
fibaro:setGlobal("WiFi_Mariusz_Andr", "1"); 
fibaro:log("Mariusz w domu"); 
else
fibaro:setGlobal("WiFi_Mariusz_Andr", fibaro:getGlobal("WiFi_Mariusz_Andr") - 1);
fibaro:log("Mariusz poza domem");
end
 
zmienna jest ale wartość się nie zmienia
podejrzewałem, że problem leży w wolnym porcie w telefonie ale udało mi się zeskanować wolny 60792, za chwilę był inny
jak to poprawić?
mam wiele scen zależnych od zmiennych sterowanych zalogowanymi wifi
zaczynam żałować, że zdradziłem Nokię
 
DD-WRT chyba nie wchodzi w grę - mam Fun Box z Orange
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Akronaut w Wrzesień 08, 2015, 05:09:13 pm
Jakiś czas temu zamieniłem telefony na Huawei.
Jestem zadowolony ale ... nie działa sprawdzanie obecności w sposób taki jak miałem ustawiony dla Windows Phone. Poradziłem sobie z tym instalując Tasker. Stworzyłem profile, które w zależności od zalogowania do domowego wifi lub będąc w pobliżu wybranych stacji GSM wysyłają komunikat HTTP GET do HC2 uruchamiający scenę zmieniającą zmienną. Takich komunikatów i scen dla każdego telefonu mam 3 i wysyłane są co 120 sek. Uruchomienie tych scen (zmiana zmiennej na 1) od razu uruchamia odliczanie 240 sek. po których następuje zmiana wartości zmiennej na 0 (kolejna scena). Zmiana wartości zmiennych następuje cyklicznie tak długo jak telefon jest z w zasięgu domowego wifi lub stacji GSM. Jeżeli HC2 nie otrzyma komendy z taskera o zmianie zmiennej po 240 sek. wszystkie zmienne mają wartość 0. Do potwierdzenia obecności jest kolejna scena: jeżeli którakolwiek zmienna równa jest 1 to osoba jest w domu, jeżeli wszystkie zmienne są równe 0 osoba jest poza domem. W teorii wszystko jest OK. Są dni kiedy wszystko działa bez zarzutu, są dni, że HC2 zmienia zmienne co kilka minut nawet co minutę tak jakby osoba wychodziła z domu i z powrotem wchodziła. W tym czasie telefony leżą nieruchomo w pobliżu routera i HC2.
Zastanawiam się co może być przyczyną:
słaby sygnał wifi - raczej wykluczam, sygnał jest silny i stabilny,czasem telefon leży obok routera
wylogowywanie się ze stacji GSM - mało prawdopodobne aby telefon na dłużej niż 120 sek. wylogował się ze wszystkich stacji, może się mylę
nieprawidłowe działanie taskera - profile przez cały czas informują, że są aktywne więc odpowiednie komendy są wysyłane.
Od kilku dni zastanawiam się czy nie jest to spowodowane kłopotami z dostępem zdalnym i lokalnym do HC2. Tasker aktywuje profil, wysyła HTTP GET do HC2 ale komenda nie dochodzi. Po jakimś czasie komenda dochodzi i osoba "znajduje" się w domu mimo, że z niego nie wychodziła.
Może łączność wifi telefonu z routerem po jakimś czasie się zawiesza. Nie mam w telefonie funkcji, która by za to odpowiadała. Może jest jakiś sposób na symulowanie łączności wifi.

Od obecności w domu mam uzależnionych wiele urządzeń i scen. Wszyscy się do tych ułatwień przyzwyczaili i nie chcę rezygnować z powodu zmiany telefonu.
Macie jakiś pomysł? Ja się poddaję.
Dziękuję za uwagę ;) To pisałem ja, inżynier budownictwa, nie elektronik, nie informatyk więc wybaczcie.
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: Kamikaze w Wrzesień 08, 2015, 06:43:35 pm
Włącz logowanie w taskerze i zobacz czy faktycznie wywołuje Ci tego geta. Mam podobny problem w pracy. Na podstawie taskera wysyłamy GET co 3 minuty jeśli tel podłączony jest do firmowego wifi w ten sposób sprawdzamy czas pracy. Czasem działa to rewelacyjnie czasem nalicza przerwy w pracy co kilka minut na wybranych telefonach. Z tego co udało mi się ustalić to tak jakby ten timer się rozjeżdżał w taskerze bo on odpala zadanie czasem kilka sekund przed albo po zadanym czasie nie zgadza mu się zadana godzina i przerywa zadanie. Od nowa liczy.... czasem trafi czasem nie... Nie mam na to pomysłu.... Może to kwestia telefonu lub wersji androida? U nas problemy są na galaxy s6 android 5.1.1

Edit// Wystarczyło zaznaczyć opcję kontynuuj działanie po błędzie przy scenie i wszystko jak ręką odjął. Problem był taki ze czasami wifi jeszcze było w zasięgu ale telefon geta nie był wstanie wysłać (granica zasięgu). Tasker się wykrzaczał na tym i nie wysyłał już kolejnych getów pomimo dobrego zasięgu, konieczny był restart taskera.
Tytuł: Odp: obecność w domu
Wiadomość wysłana przez: wojtas810 w Lipiec 07, 2016, 09:40:29 pm
Hej użyłem tego kodu w VD
pytanie mam przy debugu takie coś

[DEBUG] 22:39:42: Start looking for phone
[DEBUG] 22:39:42: Try number: 1
[DEBUG] 22:39:42: ERROR CODE: 0
[DEBUG] 22:39:42: --- Script finnished ---