W szufladzie miałem stary modem GSM Huawei E1750C. Szkoda, żeby się marnował, więc postanowiłem wykorzystać go do wysyłania powiadomień SMS z systemu, ponieważ bazując jedynie na powiadomieniach wysyłanych przez internet nie mamy nigdy gwarancji (zresztą w przypadku SMS też), że powiadomienie dojdzie. Zależało mi na tych powiadomieniach ponieważ w swojej instalacji mam czujniki zalania od Xiaomi to warto by było wiedzieć kiedy będę miał wyciek.
Jak już wspomniałem wcześniej miałem nieużywany modem GSM i postanowiłem go użyć. Na początku kupiłem kartę SIM w sieci Play i aktywowałem ofertę “Play na Kartę odNOWA” dzięki czemu nie muszę co miesiąc doładowywać konta. poniżej kilka ważnych informacji o tej taryfie (nie jest to żadne lokowanie produktu, po prostu uważam, że ta oferta jest idealna do takich rzeczy):
Cykl rozliczeniowy zaczyna się w dniu aktywacji i trwa miesiąc.
- Jeśli w cyklu nie wykonasz żadnej płatnej aktywności, pobierzemy 2 zł.
- Jeśli masz na koncie 0 zł – odłączymy Stan Darmowy.
- Jeśli przez 12 miesięcy nie wykonasz żadnej płatnej aktywności, Twoje konto zostanie dezaktywowane, a niewykorzystane środki przepadną.
Płatna aktywność to np. płatność za rozmowę lub SMS, doładowanie konta lub skorzystanie z internetu.
Mając już kartę możemy zabrać się za konfigurację.
Na początku musimy podłączyć modem z zainstalowaną kartą SIM do gniazda USB.
Następnie wykonujemy polecenie, które wyszuka modem:
lsusb
po wykonaniu polecenia powinniśmy zobaczyć coś takiego:
Bus 001 Device 006: ID 12d1:1001 Huawei Technologies Co., Ltd.
Kolejnym krokiem będzie zainstalowanie niezbędnych pakietów
sudo apt install ppp usb-modeswitch usb-modeswitch-data
i po instalacji
sudo reboot
po restarcie ponownie wykonujemy polecenie
lsusb
i powinniśmy zobaczyć coś podobnego
Bus 001 Device 006: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
Z powyższego ważne jest ID 12d1:1001 – należy je zapamiętać.
Kolejnym krokiem jest sprawdzenie gdzie modem został zamontowany w systemie
dmesg | grep ttyUSB
jeżeli wszystko przeszło prawidłowo to powinniśmy zobaczyć
[3.235831] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB0 [3.236856] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB1 [3.237626] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB2
Najprawdopodobniej w kolejnych poleceniach będziemy używać nazwy ttyUSB0.
Jeżeli jednak po wykonaniu powyższego polecenia nie znaleźliśmy zamontowanego modemu USB to musimy ręcznie utworzyć plik konfiguracyjny dla naszego modemu.
tworzymy plik o nazwie ID, które zapamiętaliśmy
sudo nano /etc/usb_modeswitch.d/12d1:1001
i wypełniamy go zawartością
TargetVendor= 0x12d1 TargetProduct= 0x1001 MessageContent="55534243123456780000000000000011062000000100000000000000000000" NoDriverLoading=1
gdzie dwie pierwsze linijki to fragmenty naszego ID. Taki plik zapisujemy i wykonujemy ponownie komendę
dmesg | grep ttyUSB
która powinna zwrócić
[3.235831] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB0
[3.236856] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB1
[3.237626] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB2
Sukces, teraz mozemy zainstalować oprogramowanie, którego użyjemy do wysyłania SMS-ów.
sudo apt install gammu
następnie konfigurujemy gammu
sudo gammu-config
port = /dev/ttyUSB0
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =
Identyfikujemy modem
sudo gammu --identify
w odpowiedzi dostaniemy coś podobnego
Device : /dev/ttyUSB0
Manufacturer : Huawei
Model : E1750 (E1750)
Firmware : **.**.**.**.**
IMEI : ***********************
SIM IMSI : *********************
Jeżeli wszystko przeszło pomyślnie to możemy wysłać testowy SMS
echo "test" | sudo gammu sendsms TEXT TUTAJ_NUMER_TELEFONU
Sukces!! SMS dotarł.
Powiadomienia SMS w ioBrokerze
Do wysyłania powiadomień w ioBrokerze wykorzystamy adapter JavaScript i skrypty “globalne” co pozwoli nam na korzystanie z funkcji, która będzie dostępna dla innych skryptów. W przypadku potrzeby wprowadzeniu jakiś zmian w funkcji wysyłającej SMS-y wystarczy dokonać zmian w jednym miejscu.
Otwieramy zakładkę Scripts i w katalogu global tworzymy skrypt JavaScript o nazwie sms.
Skrypt będzie wykorzystywał możliwość wykonywania poleceń systemowych z poziomu ioBrokera.
/* * */ function sendSms(tresc, adrest){ var sms_cmd = 'echo "'+tresc+'" |/usr/bin/gammu sendsms TEXT ' + adrest; exec(sms_cmd, function (error, stdout, stderr) { if(error) console.log("SMS ERR: " + stderr); }); }
Skrypt jest bardzo prosty a najważniejszym jego elementem jest funkcja exec()
W skrypcie wysyłającym SMS jako pierwszy parametr podawana jest komenda wysyłająca SMS, a drugim parametrem obsłużone są odpowiedzi wykonywanej komendy – w naszym przypadku obsługa ewentualnych błędów. Powyższy skrypt można rozbudować o kontrolę czy SMS rzeczywiście został wysłany (kiedyś to zrobię) dzięki czemu można dodać mechanizm ponownej próby wysłania w przypadku niepowodzenia.
Mając gotową funkcję wysyłającą SMS-y możemy dodać obsługę np. wysłania powiadomienia w przypadku wykrycia zalania.
//zmywarka on({id: 'zigbee.0.00158d00026e264e.detected'/*Is water detected*/, change: "ne"}, function (obj) { var value = obj.state.val; if(value){ sendSms("wykryto wode pod zmywarka", 48XXXXXXXXX); } });
Jak wspomniałem na początku używam karty SIM z sieci Play z taryfą odNOWA. jednym z warunków tej taryfy jest:
Jeśli w cyklu nie wykonasz żadnej płatnej aktywności, pobierzemy 2 zł.
Jest bardzo prosty sposób aby uniknąć tego:
schedule('32 13 6 * *', function () { var sms_cmd = 'echo Powiadomienie wysylane 1 raz na miesiac |/usr/bin/gammu sendsms TEXT ' + 48XXXXXXXXX; exec(sms_cmd, function (error, stdout, stderr) { console.log("sms err1:" + error); console.log("sms err2:" + stderr); }); });
Powyższy skrypt każdego 6 dnia miesiąca o godzinie 13:32 wyśle SMS-a, dzięki czemu operator zarejestruje płatną aktywność (0,29 zł) i nie naliczy nam opłaty 2 zł.