Wirtualne kanały

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
Remi
Posty: 129
Rejestracja: wt maja 22, 2018 4:03 pm

Cześć,

Wpadłem na pomysł (no chyba że coś takiego jest a ja nie wiem ;) ) że fajnie by było mieć możliwość utworzenia wirtualnych kanałów w cloudzie. W moim przypadku przydało by mi się to np. do określania, czy ktoś jest w domu czy nie (założeniem jest kilku mieszkańców) i sterowanie urządzeniami w domu w zależności od tego, kto jest i czy ktokolwiek jest.
Jak się zapatrujecie na taki pomysł?
Awatar użytkownika
Duch__
Posty: 1782
Rejestracja: śr sie 24, 2016 7:26 pm
Lokalizacja: Opole

Było omawiane...

viewtopic.php?f=18&t=4183
Obrazek
wsosniak
Posty: 726
Rejestracja: sob cze 02, 2018 8:02 am

oooo widzę ze ze Duch , jak zwykle, podał bardzo konkretną odpowiedź na zadane pytanie :) naprawde "szacun" ! :) Remi ? zakładam że to rozwiązało Twój problem :)

Do rzeczy : wczoraj chciałem potestować sobie pewne warunki /zależności pomiedzy kanałami i potrzebowałem kilku kanałów typu włącz wyłącz . Stety/niestety miałem tylko taki jednokanałowy moduł pod ręką : viewtopic.php?p=35027#p35027 (canwing c001 - taka kopia sonoffa basic). Żeby uzyskać wirtualne kanały załadowałem do niego multiboard i ustawiłem SONOFF 4CH i dostałem 4 kanały : jeden którym fizycznie mogłem sterować w urządzeniu , i trzy wirtualne, widoczne w cloudzie i aplikacji . I to co chciałem potestować to potestowałem .

Remi - nie wiem czy o to CI chodziło ale też mógłbyś coś takiego zrobić u siebie. Wystarczy że masz zainstalowanego u siebie jakiegolwiek sonoffa basic (czy jego kopie ). Przeinstaluj go na multiboard->sonoff 4CH, bedziesz miał wtedy 3 extra wirtualne kanały ON/OFF . Każdy kanał to osoba w Twoim domostwie (ON - jest w domu, OFF- poza) . Na telefonach instalujesz IFTTT , każdemu domownikowi zakładasz osobny login IFTTT i tworzysz dla kazdego domownika dwa aplety na bazie usługi lokalizacji . I na bazie tej usługi tworzysz :
1) pierwszy aplet kiedy dany telefon jest w poblizu domu (usługa LOCATION, powiedzmy +-50m od Twojego domu) , włącza wirtualny kanał danego domownika ( wywołanie usługi WEBHOOK i wywołujesz link bezpośredni danego kanału lub jeszcze lepiej : link do sceny fracza ktora włącza ten kanał + może włączać/ wyłączać, otwierac/zamykać cokolwiek , w zależności od domownika, od pory dnia, ...)
2) drugi aplet , kiedy dany telefon opuszcza lokalizację dom , to wyłącza kanał danego domownika (podobnie jak przy 1) )

no i masz swojego "big brother-a" :)
Remi
Posty: 129
Rejestracja: wt maja 22, 2018 4:03 pm

Jak to się stało że ja nie widziałem odpowiedzi kolegi Duch... ??? :)

Hmm no to jest lepsze rozwiązanie niż to które ja zrobiłem :)

Ja poszedłem na łatwiznę i podłączyłem po usb do prywatnego serwera VPN d1 mini w którym mam 9 kanałów :)

Resztę tak jak sugerujesz z tym że muszę jeszcze popracować nad algorytmem wykrywania użytkownika (najlepiej żeby szybko wykrywał i nie pobierał baterii z telefonu :) )
Remi
Posty: 129
Rejestracja: wt maja 22, 2018 4:03 pm

wsosniak pisze: śr mar 06, 2019 4:48 pm Na telefonach instalujesz IFTTT , kazdemu domownikowi zakladasz osobny login IFTTT i tworzysz dla kazdego domownika dwa aplety na bazie uslugi lokalizacji . I na bazie tej uslugi tworzysz :
1) pierwszy aplet kiedy dany telefon jest w poblizu domu (usluga LOCATION, powiedzmy +-50m od Twojego domu) , wlacza wirtualny kanal danego domownika ( wywolanie uslugi WEBHOOK i wywolujesz link bezposredni danego kanalu lub jeszcze lepiej : link do sceny fracza ktora wlacza ten kanal + moze wlaczac/ wylaczac, otwierac/zamykac cokolwiek , w zaleznosci od domownika, od pory dnia, ...)
2) drugi aplet , kiedy dany telefon opuszcza lokalizacje dom , to wylacza kanal danego domownika (podobnie jak przy 1) )
Testowalem z Automate opcję lokalizacji i niestety ale nie potrafie obejsc problemu zatrzymywania sie skryptu przy braku odpowiedzi na rzadanie https - problem zdarzal mi się sporadycznie jednak jest to irytujące jako że zatrzymuje cały skrypt. Ponadto jak chcemy często sprawdzac lokalizacje to bateria telefonu mocno to odczuwa. IFTTT bawiłem się chwilę i jakoś mi nie podszedł.

Na chwilę obecna wykombinowalem, aby sprawdzac czy telefon uzytkownika jest podlaczony do WIFI - jezeli tak, wywolują sie linki bezposrednie do ww. kanalów przypisanych pod uzytkowników a dalej to już sceny które też wywołuje z basha.
Ponizszy skrypt Bash dziala w podsieci 192.168.0/24 sprawdzajac obecnosc wszystkich hostów po protokole ICMP, po czym sprawdza, czy adres MAC telefonu jest w tablicy ARP. Jak skrypt wykryje wszystkich użytkowników to puszcza "echo request" co 60 sekund do każdego urządzenia w celu weryfikacji, czy dany użytkownik dalej jest w domu (czytaj dostępny w sieci ;) ). W sytuacji gdy nie wszyscy są dostępni, leci ponowny skan sieci.

Kod: Zaznacz cały

#!/bin/bash

# ********** WARTOŚCI PODANE MANUALNIE *********************************************
remik="xx:xx:xx:xx:xx:xx"                       #Adres MAC Remika
karolina="xx:xx:xx:xx:xx:xx"                    #Adres MAC Karoliny
nela="xx:xx:xx:xx:xx:xx"                        #Adres MAC Neli
max_ilosc_domownikow="3"                        #Ilość domowników
#**********************************************************************************
clear
echo ""
echo "-------------------------------------"
echo "Adres MAC Remika: $remik"                 #Wyświetlenie adresu MAC
echo "Adres MAC Karoliny: $karolina"            #Wyświetlenie adresu MAC
echo "Adres MAC Neli: $nela"                    #Wyświetlenie adresu MAC
echo ""
echo "maksymalna ilość użytkowników: $max_ilosc_domownikow"
echo "-------------------------------------"
sleep 4
for (( ; ; )) 
do
                for (( i=1; $i <= 254; i++ ))           #Pętla licząca adresy IP, które będą brane pod uwagę. Musi być ustawiona pod DHCP pool.
                do
                HOST_IP="192.168.0.$i"                  #Deklaracja zmiennej prezentującej adres IP
                echo "pingowanie hosta $HOST_IP"        #Wyświetlenie, jaki adres IP jest sprawdzany w danym momencie
                        if [ -n "$( ping -c 1 $HOST_IP|grep ttl=64)" ]          #Jeżeli sprawdzany host odpowiada, warunek jest spełniony
                        then
                                echo "host z adresem $HOST_IP jest osiągalny"
                        fi
                done
                echo "-------------------------------------"
                if [ -n "$( arp |grep $remik)" ]                        #Sprawdzenie, czy w tablicach ARP znajduje się rządany adres MAC
                then
                        remik_IP=$(arp |grep $remik |cut -c1-15)        #wyciągnięcie adresu IP z tablicy ARP i zapisanie do zmiennej
                        if [ -n "$( ping -c 1 $remik_IP |grep ttl=64)" ]        #Sprawdzenie, czy adres IP  jest dostępny w sieci
                        then
                                remik_w_domu="1"                                        #Zmienna opisująca obecnośc w domu.
                                echo "Telefon Remika jest osiągalny i ma adres $remik_IP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni aktywujący kanał w Supli
                                sleep 1
                        else
                                arp -d $remik_IP                        #czyszczenie tablicy ARP z nieaktualnego wpisu
                                remik_IP="0"                            #wyzerowanie adresu IP zmiennej gdy host nie odpowiada
                                remik_w_domu="0"
                                echo "Telefon Remika nie jest osiągalny. Wyczyszczoo tablice ARP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni dezaktywujący kanał w Supli
                        fi
                else
                remik_w_domu="0"
                echo "Telefon Remika nie jest osiągalny"
                fi
                if [ -n "$( arp |grep $karolina)" ]              
                then
                        karolina_IP=$(arp |grep $karolina |cut -c1-15) 
                        if [ -n "$( ping -c 1 $karolina_IP |grep ttl=64)" ]
                        then
                                karolina_w_domu="1"
                                echo "Telefon Karoliny jest osiągalny i ma adres $karolina_IP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni aktywujący kanał w Supli
                                sleep 1
                        else
                                arp -d $karolina_IP
                                karolina_IP="0"
                                karolina_w_domu="0"
                                echo "Telefon Karoliny nie jest osiągalny. Wyczyszczoo tablice ARP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni dezaktywujący kanał w Supli
                        fi
                else
                karolina_w_domu="0"
                echo "Telefon Karoliny nie jest osiągalny"
                fi
                if [ -n "$( arp |grep $nela)" ]
                then
                        nela_IP=$(arp |grep $nela |cut -c1-15)
                        if [ -n "$( ping -c 1 $nela_IP |grep ttl=64)" ]
                        then
                                nela_w_domu="1"
                                echo "Telefon Neli jest osiągalny i ma adres $nela_IP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni aktywujący kanał w Supli
                                sleep 1
                        else
                                arp -d $nela_IP
                                nela_IP="0"
                                nela_w_domu="0"
                                echo "Telefon Neli nie jest osiągalny. Wyczyszczoo tablice ARP"
# wget --spider -------LINK DO SUPLI ---------                          #Link bezpośredni dezaktywujący kanał w Supli
                        fi
                else
                nela_w_domu="0"
                echo "Telefon Neli nie jest osiągalny"
                fi
                liczba_domownikow=$[remik_w_domu + karolina_w_domu + nela_w_domu]       #Policzenie, ilu jest domowników w domu
                while [ $liczba_domownikow == $max_ilosc_domownikow ]; do               #Pętla sprawdzająca, czy maksymalna ilość domowników jest osiągnięta. Gdy nie jest, pętla nie wykonuje sie.
                        echo "osiągnięto maksymalną liczbę domowników. Następne sprawdzenie za 60 sekund"
                        sleep 60
                        if [ -n "$( ping -c 1 $remik_IP |grep ttl=64)" ]; then
                                 remik_w_domu=1
                        else
                                remik_w_domu=0
                        fi
                        if [ -n "$( ping -c 1 $karolina_IP |grep ttl=64)" ]; then
                                karolina_w_domu=1
                        else
                                karolina_w_domu=0
                        fi
                        if [ -n "$( ping -c 1 $nela_IP |grep ttl=64)" ]; then
                                nela_w_domu=1
                        else
                                nela_w_domu=0
                        fi
                        liczba_domownikow=$[remik_w_domu + karolina_w_domu + nela_w_domu]
                done
                echo "W domu nie ma wszystkich domowników. Powrót do skanowania sieci w celu ponownej weryfikacji"
                echo "-------------------------------------"
                sleep 15
done

ODPOWIEDZ

Wróć do „Pomysły i koncepcje”