Subversion Repositories HomeAutomation

Rev

Rev 2181 | Rev 2205 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1.  
  2. Sensor_ModuleNames    = [ "DS18x20", "FOST02", "BusVoltage", "SimpleDTMF", "DHT11" ];
  3. Sensor_Intervals      = function() { return [ 1, 5, 10, 15, 20 ]; };
  4. Sensor_Aliases        = function() { return Module_GetAliasNames(Sensor_ModuleNames); };
  5. Sensor_AvailableIds   = function() { return Module_GetAvailableIds(Sensor_ModuleNames); };
  6.  
  7. function Sensor_SetReportInterval(alias_name, interval)
  8. {
  9.     if (arguments.length < 2)
  10.     {
  11.         Log("\033[31mNot enough parameters given.\033[0m\n");
  12.         return false;
  13.     }
  14.  
  15.     var aliases_data = Module_ResolveAlias(alias_name, Sensor_ModuleNames);
  16.     var found = false;
  17.  
  18.     for (var name in aliases_data)
  19.     {
  20.         var variables = {"Time"     : interval };
  21.         if (Module_SendMessage(aliases_data[name]["module_name"], aliases_data[name]["module_id"], "Report_Interval", variables))
  22.         {
  23.             Log("\033[32mCommand sent successfully to " + name + ".\033[0m\n");
  24.         }
  25.         else
  26.         {
  27.             Log("\033[31mFailed to send command to " + name + ".\033[0m\n");
  28.         }
  29.  
  30.         found = true;
  31.     }
  32.  
  33.     if (!found)
  34.     {
  35.         Log("\033[31mNo aliases by the name " + alias_name + " were applicable for this command.\033[0m\n");
  36.         return false;
  37.     }
  38.  
  39.     return true;
  40. }
  41. Console_RegisterCommand(Sensor_SetReportInterval, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args, Sensor_Aliases(), Sensor_Intervals()); });
  42.  
  43. Sensor_OnNewPhonenumberFunctions = [];
  44.  
  45. function Sensor_RegisterToNewPhonenumber(alias_name, callback)
  46. {
  47.   if (!Sensor_OnNewPhonenumberFunctions[alias_name])
  48.   {
  49.     Sensor_OnNewPhonenumberFunctions[alias_name] = [];
  50.   }
  51.  
  52.   Sensor_OnNewPhonenumberFunctions[alias_name].push(callback);
  53. }
  54.  
  55. function Sensor_OnMessage(module_name, module_id, command, variables)
  56. {
  57.   if (in_array(Sensor_ModuleNames, module_name))
  58.   {
  59.     var aliases_data = Module_LookupAliases({
  60.       "module_name" : module_name,
  61.       "module_id"   : module_id,
  62.       "group"       : false
  63.     });
  64.  
  65.     switch (command)
  66.     {
  67.       case "Phonenumber":
  68.       {
  69.         for (var alias_name in aliases_data)
  70.         {
  71.           var number = variables["Number"];
  72.           var incommingCall = true;
  73.           var checkName = true;
  74.  
  75.           Log("received from DTMF:\"" + number + "\"");
  76.  
  77.           if (variables["Number"].length >= 6)
  78.           {
  79.             /* A seems to mean it is an incomming call! */
  80.             if (number.charAt(0) === 'A' || number.charAt(0) === 'D')
  81.             {
  82.               incommingCall = true;
  83.  
  84.               /* Remove leading A */
  85.               number = number.substring(1);
  86.             }
  87.             else /* Outgoing call */
  88.             {
  89.               incommingCall = false;
  90.             }
  91.  
  92.             /* A number can have a trailing C */
  93.             var endIndex = number.indexOf('C');
  94.  
  95.             if (endIndex !== -1)
  96.             {
  97.               /* Remove trailing C */
  98.               number = number.substring(0, endIndex);
  99.             }
  100.           }
  101.           else if (number == "B00C")
  102.           {
  103.             /* Unknown number */
  104.             number = "Unknown";
  105.             incommingCall = true;
  106.             checkName = false;
  107.           }
  108.           else if (number == "B10C")
  109.           {
  110.             /* Secret/protected number */
  111.             number = "Protected";
  112.             incommingCall = true;
  113.             checkName = false;
  114.           }
  115.           else
  116.           {
  117.             Log("DTMF decoded number is to short, number: \"" + number + "\", length: " + number.length);
  118.             return;
  119.           }
  120.          
  121.           /* Adding area code prefix if needed */
  122.           if (number.charAt(0) != '0' && checkName)
  123.           {
  124.             if (typeof sensorDefaultPhoneAreaCode === 'undefined')
  125.             {
  126.               Log("\033[31mOnlinePhonebook: please add sensorDefaultPhoneAreaCode = yourAreaCode to autostart.js, defaulting to 031\033[0m\n");
  127.               number = "031" + number;
  128.             }
  129.             else
  130.             {
  131.                 number = sensorDefaultPhoneAreaCode + number;
  132.             }
  133.           }
  134.  
  135.           /* Store number and direction in last values */
  136.           var lastValue = {};
  137.           var lastValueString = Storage_GetParameter("LastValues", alias_name);
  138.  
  139.           if (lastValueString)
  140.           {
  141.             lastValue = JSON.parse(lastValueString);
  142.           }
  143.  
  144.           var timestamp = get_time();
  145.  
  146.           lastValue["Phonenumber"] = { "value" : number, "timestamp" : timestamp };
  147.           lastValue["Direction"] = { "value" : incommingCall ? "in" : "out", "timestamp" : timestamp };
  148.  
  149.           Storage_SetParameter("LastValues", alias_name, JSON.stringify(lastValue));
  150.  
  151.  
  152.           /* Store number in phone call history */
  153.           var newValue = { "number" : number, "direction" : incommingCall ? "in" : "out", "module" : alias_name, "names" : [], "timestamp" : timestamp };
  154.  
  155.           Storage_SetParameter("PhoneCalls", timestamp, JSON.stringify(newValue));
  156.  
  157.  
  158.           /* Log the number */
  159.           Log("New number: " + number + ", direction: " + (incommingCall ? "in" : "out"));
  160.          
  161.           /* Lookup name */
  162.           if (checkName)
  163.           {
  164.             Sensor_StoreNumberInPhonebook(number, timestamp);
  165.           }
  166.  
  167.           var phonebookNumbers = Storage_GetJsonParamter("PhoneBook", number);
  168.           if (!phonebookNumbers)
  169.           {
  170.             phonebookNumbers = [];
  171.           }
  172.          
  173.           /* Call any potential subscribers */
  174.           if (Sensor_OnNewPhonenumberFunctions[alias_name])
  175.           {
  176.             for (var n in Sensor_OnNewPhonenumberFunctions[alias_name])
  177.             {
  178.               /* Call callback with arguments alias, number, direction */
  179.               Sensor_OnNewPhonenumberFunctions[alias_name][n](alias_name, number, incommingCall ? "in" : "out", phonebookNumbers);
  180.             }
  181.           }
  182.         }
  183.         break;
  184.       }
  185.       case "Voltage":
  186.       case "Temperature_Celsius":
  187.       {
  188.         if ((module_name == "DS18x20") && (variables["Value"] == 85))
  189.         {
  190.           Log("\033[31mDS18x20: Temperature conversion error: " + module_name + ":" + module_id + ", SensorId=" + variables["SensorId"] + "\033[0m");
  191.           break;
  192.         }
  193.       }
  194.       case "Humidity_Percent":
  195.       {
  196.         for (var alias_name in aliases_data)
  197.         {
  198.           if (aliases_data[alias_name]["specific"]["SensorId"] != variables["SensorId"])
  199.           {
  200.             continue;
  201.           }
  202.  
  203.           var last_value = {};
  204.           var last_value_string = Storage_GetParameter("LastValues", alias_name);
  205.  
  206.           if (last_value_string)
  207.           {
  208.             last_value = eval("(" + last_value_string + ")");
  209.           }
  210.  
  211.           last_value[command] = { "value" : variables["Value"], "timestamp" : get_time() };
  212.  
  213.           Storage_SetParameter("LastValues", alias_name, JSON.stringify(last_value));
  214.         }
  215.  
  216.         break;
  217.       }
  218.     }
  219.   }
  220. }
  221. Module_RegisterToOnMessage("all", Sensor_OnMessage);
  222.  
  223. function Sensor_StoreNumberInPhonebook(number, timestamp)
  224. {
  225.   var phonebookNumbers = Storage_GetJsonParamter("PhoneBook", number);
  226.  
  227.   if (!phonebookNumbers)
  228.   {
  229.     phonebookNumbers = [];
  230.  
  231.     url = "wap.eniro.se/query?search_word=" + number + "&what=mobwp";
  232.     //Log("\033[31mURL: http://"+url+"\033[0m\n");
  233.  
  234.     Http_Request(url, function(socket_id, result, header, content_data)
  235.     {
  236.       //Log("\033[31mOnlinePhonebook-eniro: result was: " + result + "\033[0m\n");
  237.       //Log("\033[31mOnlinePhonebook-eniro: content was: " + content_data + "\033[0m\n");
  238.  
  239.       if (result.indexOf("200 OK") != -1)
  240.       {
  241.  
  242.         var lines = content_data.split("\n");
  243.  
  244.         var endString = "<anchor>Tillbaka<prev/></anchor>";
  245.         var nameStartString = "<td class=\"hTd2\">";
  246.         var nameEndString = "</table>";
  247.  
  248.         for (var n = 1; n < lines.length; n++)
  249.         {
  250.           var line = lines[n].trim("\n");
  251.  
  252.           if (line.indexOf(endString) != -1)
  253.           {
  254.             break;
  255.           }
  256.  
  257.           if (line.indexOf(nameStartString) != -1)
  258.           {
  259.             line = lines[n + 1].trim("\n");
  260.             splitted = line.split("b>");
  261.  
  262.             phonebookNumbers.push(splitted[1].substr(0, splitted[1].length - 2));
  263.             break;
  264.           }
  265.         }
  266.  
  267.         //Log("\033[31mOnlinePhonebook: Line: " + lines[1] + "\033[0m\n");
  268.         //Log("\033[31mOnlinePhonebook: Line: " + lines[2] + "\033[0m\n");
  269.         //Log("\033[31mOnlinePhonebook: Line: " + lines[3] + "\033[0m\n");
  270.         if (phonebookNumbers.length > 0)
  271.         {
  272.           Storage_SetJsonParameter("PhoneBook", number, phonebookNumbers);
  273.  
  274.           Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  275.  
  276.           Log("\033[31mOnlinePhonebook-eniro: Found: " + JSON.stringify(phonebookNumbers) + "\033[0m\n");
  277.         }
  278.       }
  279.       else
  280.       {
  281.         Log("\033[31mOnlinePhonebook-eniro: Failed to do name lookup, result was: " + result + "\033[0m\n");
  282.       }
  283.  
  284.       if (phonebookNumbers.length == 0)
  285.       {
  286.         if (typeof sensorRKSEEK_API !== 'undefined')
  287.         {
  288.           url = "rkseek.oblivioncreations.se/?client="+sensorRKSEEK_API+"&n=" + number + "&out=text";
  289.           Log("\033[31mURL: http://"+url+"\033[0m\n");
  290.  
  291.           Http_Request(url, function(socket_id, result, header, content_data)
  292.           {
  293.             phonebookNumbers = [];
  294.  
  295.             if (result.indexOf("200 OK") != -1)
  296.             {
  297.               //Log("\033[31mOnlinePhonebook: result was: " + content_data + "\033[0m\n");
  298.               var lines = content_data.split("\n");
  299.               //Log("\033[31mOnlinePhonebook: Line: " + lines[1] + "\033[0m\n");
  300.               //Log("\033[31mOnlinePhonebook: Line: " + lines[2] + "\033[0m\n");
  301.               //Log("\033[31mOnlinePhonebook: Line: " + lines[3] + "\033[0m\n");
  302.               if (lines[2].length > 0)
  303.               {
  304.                 phonebookNumbers = [ lines[2] ]; // TODO Is this really correct?!
  305.                 Storage_SetJsonParameter("PhoneBook", number, phonebookNumbers);
  306.                
  307.                 Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  308.  
  309.                 Log("\033[31mOnlinePhonebook-rseek: Found: " + JSON.stringify(phonebookNumbers) + "\033[0m\n");
  310.               }
  311.             }
  312.             else
  313.             {
  314.               Log("\033[31mOnlinePhonebook-rseek: Failed to do name lookup, result was: " + result + "\033[0m\n");
  315.             }
  316.           });
  317.         }
  318.       }
  319.     });
  320.         /*
  321.         Http_Request("wap.hitta.se/default.aspx?Who=" + number + "&Where=&PageAction=White",
  322.             function(socket_id, result, header, content_data) {
  323.                 var persons = new Array();
  324.                 if (result.indexOf("200 OK") != -1)
  325.                 {
  326.                     var endString = "<anchor>Tillbaka<prev/></anchor>";
  327.                     var nameStartString = " title=\"Link\">";
  328.                     var nameEndString = "</a>";
  329.  
  330.                     var lines = content_data.split("<br/>");
  331.  
  332.                     for (var n = 1; n < lines.length; n++)
  333.                     {
  334.                         var line = lines[n].trim(" \n");
  335.  
  336.                         if (line.indexOf(endString) != -1)
  337.                         {
  338.                             break;
  339.                         }
  340.                         var pos = line.indexOf(nameStartString + (persons.length+1) + ".");
  341.  
  342.                         if (pos != -1)
  343.                         {
  344.                             pos += nameStartString.length + 2
  345.                             persons[persons.length] = line.substr(pos, line.length-pos-nameEndString.length).html_entity_decode().replace("  ", " ");
  346.                         }
  347.                     }
  348.                     if (persons.length > 0) {
  349.                         Storage_SetJsonParameter("PhoneBook", number, persons);
  350.  
  351.                         //CAll all listeners!
  352.                         //....
  353.  
  354.                         Log("\033[31mOnlinePhonebook: Found: " + JSON.stringify(persons) + "\033[0m\n");
  355.                     }
  356.                 }
  357.                 else
  358.                 {
  359.                     Log("\033[31mOnlinePhonebook: Failed to do name lookup, result was: " + result + "\033[0m\n");
  360.                 }
  361.             }
  362.         );
  363.         */
  364.  
  365.   }
  366.   else
  367.   {
  368.     //Log("Number already stored\n");
  369.  
  370.     Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  371.   }
  372.  
  373.   return phonebookNumbers;
  374. }
  375. Console_RegisterCommand(Sensor_StoreNumberInPhonebook, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args); });
  376.  
  377. function Sensor_StoreNumberInPhonebookManual(number, name)
  378. {
  379.     if (arguments.length < 2)
  380.     {
  381.         Log("\033[31mNot enough parameters given.\033[0m\n");
  382.         return false;
  383.     }
  384.    
  385.     var completename = arguments[1];
  386.     for (var i=2; i<arguments.length; i++)
  387.     {
  388.         completename = completename+" "+arguments[i];
  389.     }
  390.    
  391.     phonebookNumbers = [];
  392.     phonebookNumbers.push(completename);
  393.     Storage_SetJsonParameter("PhoneBook", number, phonebookNumbers);
  394. }
  395. Console_RegisterCommand(Sensor_StoreNumberInPhonebookManual, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args); });
  396.  
  397. function Sensor_UpdateNameInPhonecalls(timestamp, numbers)
  398. {
  399.   if (numbers.length > 0)
  400.   {
  401.     var lastValueString = Storage_GetParameter("PhoneCalls", timestamp);
  402.  
  403.     if (lastValueString)
  404.     {
  405.       var lastValue = JSON.parse(lastValueString);
  406.  
  407.       lastValue.names = numbers;
  408.  
  409.       Storage_SetParameter("PhoneCalls", timestamp, JSON.stringify(lastValue));
  410.     }
  411.   }
  412. }
  413.  
  414.