Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
sdk:sleep-mode [2020/09/25 20:21] – created jurascheksdk:sleep-mode [2021/07/20 10:28] (current) fachet
Line 1: Line 1:
-This page shows details about the Sleep mode of the NB1601 and NB800 +====== Using the Sleep Mode of the NB1601 and NB800  ====== 
 + 
 +For optimizing the power consumption you can put the NB1601 / NB800 into a deep sleep state over our SDK API.  
 + 
 +In the Deep Sleep State the CPU is basicly not running. The only component still running is our Power Managment Chip and will consum a very low current (<1mA). Please keep in mind you still need to have power supply attached to the router in the deep sleep State.  
 + 
 +===== Requierements ===== 
 + 
 +The Feature was introduce with NRSW Version 4.4.0.104 and newer. Please check our [[documentation:releases|NRSW Releases]] Page for the most current download link.  
 + 
 +You need an NB1601 Router or a NB800 HW Rev. B Router to use this Feature.  
 + 
 + 
 +===== Limitations ===== 
 + 
 +The minimum Sleep time is defined as 60sec.  
 + 
 + 
 + 
 + 
 +===== Basic Usage ===== 
 + 
 +The basic Usage of the API is defined as follows:  
 +<code c basic-sleep.are> 
 + 
 +nb_syslog("Sleep for 1 hour"); 
 +// we will set the wakeup time in 9-  
 +nb_wakeup(3600); 
 +nb_syslog("Triggering deep sleep mode by SDK SKript NOW"); 
 + 
 +res = nb_poweroff(); 
 +if (res != 0) { 
 +    nb_syslog("failed unexpectedly"); 
 +
 + 
 +</code> 
 + 
 +You can use this example code and a period timer every X hours. 
 + 
 +===== SMS Usage ===== 
 + 
 +For easy triggering of the Sleep mode you can used this extended sms-control skript. Please combine it with the sms-received trigger.  
 +The Command you would need to send is: 
 +"sleep 10" 
 + 
 +Where 10 is the Time in Minute after it will wake up again.  
 + 
 + 
 + 
 +<code c sms-control-sleep.are> 
 +    /* DESC: This script will execute commands received by SMS. 
 +     * Copyright (C) 2012 NetModule AG, Switzerland 
 +     */ 
 +      
 +    INTERVAL        = 10;                           /* only run every 10 seconds                    */ 
 +    MAXMSG          = 5;                            /* process max. 5 msgs                          */ 
 +    MAXAGE          = 300;                          /* message mustn't be older than 5 mins         */ 
 +    MAXLINES     = 32;     /* max. number of lines in msg (incl. header)   */ 
 +    AUTH            = 1;                            /* perform authentication                       */ 
 +    ADMPWD          = "";                           /* password used for authentication             */ 
 +    IGNORECASE      = 1;                            /* ignore upper-/lower-case                     */ 
 +    SENDERS         = mkarray(/* "+123456789" */);  /* allowed senders                              */ 
 +      
 +    /* check if we should perform authentication */ 
 +    if (argc == 2 && argv[1] == "noauth") { 
 +        AUTH = 0; 
 +    } 
 +      
 +    /* retrieve password */ 
 +    if (AUTH) { 
 +        if (strlen(ADMPWD) == 0) { 
 +            /* use configured admin password */ 
 +            ADMPWD = nb_config_get("admin.password"); 
 +            if (strlen(ADMPWD) > 0) { 
 +                nb_syslog("using admin password for authentication"); 
 +            } else { 
 +                /* not there -> use a default password instead */ 
 +                nb_syslog("using default password for authentication"); 
 +                ADMPWD = "admin01"; 
 +            } 
 +        } 
 +        if (IGNORECASE) ADMPWD = tolower(ADMPWD); 
 +    } 
 +      
 +    /* parse message */ 
 +    string parse (string msg) 
 +    { 
 +        /* read by line */ 
 +        lnr = 0; 
 +        ishdr = 1; 
 +        tlnr = 0; 
 +        allowed = (length(SENDERS) == 0) ? 1 : 0; 
 +      
 +        lp = msg; 
 +        for (lnr = 0; lnr < MAXLINES && strlen(lp) > 0; lnr++) { 
 +            pos = strchr(lp, "\n"); 
 +        if (is_void(pos)) pos = strlen(lp); 
 +      
 +            line = left(lp, pos); 
 +    lp = substr(lp, pos + 1); 
 +      
 +            if (strlen(line) == 0) { 
 +                /* saw header separator */ 
 +                ishdr = 0; 
 +                continue; 
 +            } 
 +            if (ishdr) { 
 +                /* saw header line */ 
 +                if (left(line, 5) == "Sent:") { 
 +                    /* check age of message */ 
 +                    sentdate = trim(substr(line, 5)); 
 +                    sent = strptime(sentdate, "%Y-%m-%d %H:%M:%S"); 
 +      
 +                    if (!is_void(sent)) { 
 +                        /* got a valid sent date */ 
 +                        now = localtime(time()); 
 +                        age = mktime(now) - mktime(sent); 
 +                        nb_syslog("message has been sent %ds ago", age); 
 +                        if (age > MAXAGE) { 
 +                        nb_syslog("rejecting too old message"); 
 +                            return ""; 
 +                        } 
 +                    } else { 
 +                        nb_syslog("time check has been omitted"); 
 +                    } 
 +                } else if (left(line, 5) == "From:") { 
 +                    from = substr(line, 6); 
 +                    if (length(SENDERS) > 0) { 
 +                        for (s = 0; s < length(SENDERS); s++) { 
 +                            sender = SENDERS[s];  
 +                            if (left(from, strlen(sender)) == sender) { 
 +                                allowed = 1; 
 +                                break; 
 +                            } 
 +                        } 
 +                    } 
 +                    if (allowed == 0) { 
 +                        nb_syslog("rejecting message from unknown sender %s", from); 
 +                        return ""; 
 +                    } else { 
 +                        nb_syslog("sender %s can pass", from); 
 +                    } 
 +                } 
 +            } else { 
 +                /* saw text line */ 
 +                if (IGNORECASE) line = tolower(line); 
 +      
 +                if (AUTH && tlnr == 0) { 
 +                    /* first line of message must contain the password */ 
 +                    if (left(line, strlen(ADMPWD)) != ADMPWD) { 
 +                        nb_syslog("authentication failed"); 
 +                        return ""; 
 +                    } else { 
 +                        nb_syslog("authentication succeeded"); 
 +                    } 
 +                } else if ((AUTH && tlnr == 1) || (!AUTH && tlnr == 0)) { 
 +                    /* this line must contain the command */ 
 +                    if (left(line, 6) == "reboot") { 
 +                        return "reboot"; 
 +                    } else if (left(line, 7) == "connect") { 
 +                        return "connect"; 
 +                    } else if (left(line, 10) == "disconnect") { 
 +                        return "disconnect"; 
 +                    } else if (left(line, 6) == "status") { 
 +                        return "status"; 
 +                    } else if (left(line, 6) == "output") { 
 +                        return left(line, 13); 
 +                    } else if (left(line, 5) == "sleep") { 
 +                        return left(line, 13); 
 +                    } 
 +                } else { 
 +                    break; 
 +                } 
 +                tlnr++; 
 +            } 
 +        } 
 +      
 +        nb_syslog("no command detected"); 
 +      
 +        return ""; 
 +    } 
 +      
 +    int setdio (string cmd)  
 +    { 
 +        newstate = substr(cmd, 9, 3); 
 +        port = substr(cmd, 7, 1); 
 +      
 +        if (port != "1" && port != "2") { 
 +            nb_syslog("invalid DIO port %s\n", port);         
 +            return -1; 
 +        }      
 +        if (newstate == "on") {  
 +            st = 1; 
 +        } else if (newstate == "off") {  
 +            st = 0; 
 +        } else  {          
 +            nb_syslog("invalid new DIO state %s\n", newstate); 
 +            return -1; 
 +        }         
 +      
 +        rc = nb_dio_set(sprintf("out%s", port), st); 
 +        if (rc) { 
 +            nb_syslog("Unable to set state %s for DIO output port %s\n", newstate, port); 
 +            return -1; 
 +        } else {             
 +            nb_syslog("Setting state %s for DIO output port %s\n", newstate, port); 
 +            return 0;  
 +        } 
 +    } 
 + 
 + 
 +    int setsleep (int minutes) 
 +
 + nb_syslog("Sleep for %i minutes",minutes); 
 + // we will set the wakeup time in 9-  
 + nb_wakeup(minutes*60); 
 + nb_syslog("Triggering deep sleep mode by sms"); 
 + 
 + res = nb_poweroff(); 
 + if (res != 0) { 
 + nb_syslog("failed unexpectedly"); 
 + }  
 + 
 + 
 + }     
 + 
 +    /* check if we got stressed */ 
 +    LASTFILE = "/tmp/sms-control.last"; 
 +    last = 0; 
 +      
 +    fp = fopen(LASTFILE, "r"); 
 +    if (fp) { 
 +        /* we have been run at least one time */ 
 +        str = fread(fp, 32); 
 +        if (str) last = (int) str; 
 +        fclose(fp); 
 +    } 
 +      
 +    now = mktime(localtime(time())); 
 +    elapsed = now - last; 
 +    if (elapsed > 0 && elapsed < INTERVAL) { 
 +        nb_syslog("we have ben run %d seconds ago. skipping.", elapsed); 
 +        exit(0); 
 +    } 
 +      
 +    /* record timestamp */ 
 +    fp = fopen(LASTFILE, "w+"); 
 +    if (fp) { 
 +        str = sprintf("%d", now); 
 +        fwrite(fp, str); 
 +        fclose(fp); 
 +    } 
 +      
 +    /* read inbox */ 
 +    msgs = nb_sms_list(); 
 +    nr_msgs = length(msgs); 
 +      
 +    if (nr_msgs == 0) { 
 +        nb_syslog("there are no messages in your inbox"); 
 +        exit(0); 
 +    } 
 +      
 +    nb_syslog("you have %d message(s) in your inbox", nr_msgs); 
 +      
 +    /* track states */ 
 +    reboot = 0; 
 +    connecting = 0; 
 +    disconnecting = 0; 
 +      
 +      
 +    /* only process latest messages */ 
 +    start = nr_msgs - MAXMSG; 
 +    if (start < 0) start = 0; 
 +      
 +    for (i=start; i<nr_msgs; i++) { 
 +        msg = nb_sms_retrieve(msgs[i]); 
 +        if (!msg) continue; 
 +      
 +        nb_syslog("processing message %d of %d (ID %s)",  
 +                   i, nr_msgs, msgs[i]); 
 +      
 +        cmd = parse(msg); 
 +        if (cmd == "reboot") {    
 +            nb_syslog("reboot command received"); 
 +            reboot = 1; 
 +        } else if (cmd == "connect") { 
 +            nb_syslog("connect command received"); 
 +            if (connecting) { 
 +                nb_syslog("already connecting"); 
 +            } else { 
 +                /* enable first wanlink */ 
 +                nb_config_set("wanlink.0.mode=1"); 
 +                connecting = 1; 
 +            } 
 +        } else if (cmd == "disconnect") { 
 +            nb_syslog("disconnect command received"); 
 +            if (disconnecting) { 
 +                nb_syslog("already disconnecting"); 
 +            } else { 
 +                /* disable first wanlink */ 
 +                nb_config_set("wanlink.0.mode=0"); 
 +                disconnecting = 1; 
 +            } 
 +        } else if (cmd == "status") { 
 +            nb_syslog("status command received"); 
 +            rcpt = nb_sms_header(msgs[i], "From"); 
 +            if (rcpt) { 
 +                id = nb_sms_send(rcpt, nb_status_summary()); 
 +                if (!id) { 
 +                    nb_syslog("unable to send status message to %s", rcpt); 
 +                } else { 
 +                    nb_syslog("successfully queued status message to %s (ID %s)", rcpt, id); 
 +                } 
 +            } 
 +        } else if (left(cmd,6) == "output") { 
 +            nb_syslog("dio out command received"); 
 +            setdio(cmd); 
 +        } else if (left(cmd,5) == "sleep") { 
 +            nb_syslog("dio out command received"); 
 +            setsleep(right(cmd,strlen(cmd)-5)); 
 +        } else { 
 +            nb_syslog("ignoring invalid message"); 
 +        } 
 +      
 +        /* delete message  */ 
 +        ret = nb_sms_delete(msgs[i]); 
 +        if (ret == 0) nb_syslog("deleted message %s", msgs[i]); 
 +    } 
 +      
 +    if (reboot == 1) { 
 +        /* trigger reboot  */ 
 +        nb_syslog("rebooting system"); 
 +        nb_reboot(); 
 +    } 
 +      
 +    exit(0); 
 + 
 + 
 + 
 + 
 + 
 + 
 +</code> 
 + 
 + 
 + 
 + 
 +