ID – zrób to sam

Inteligentny dom stworzony własnymi rękami

Skrypty

5. Powiadomienia SMS

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ł.

ZOSTAW ODPOWIEDŹ

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *