Subversion Repositories HomeAutomation

Rev

Rev 2050 | Rev 2092 | 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.  
  74.           if (variables["Number"].length > 6)
  75.           {
  76.             /* A seems to mean it is an outgoing call! */
  77.             if (number.charAt(0) === 'A')
  78.             {
  79.               incommingCall = false;
  80.  
  81.               /* Remove leading A */
  82.               number = number.substring(1);
  83.             }
  84.             else /* Incomming call */
  85.             {
  86.               incommingCall = true;
  87.  
  88.               /* Remove leading D if needed */
  89.               if (number.charAt(0) === 'D')
  90.               {
  91.                 number = number.substring(1);
  92.               }
  93.             }
  94.  
  95.             /* A number can have a trailing C */
  96.             var endIndex = number.indexOf('C');
  97.  
  98.             if (endIndex !== -1)
  99.             {
  100.               /* Remove trailing C */
  101.               number = number.substring(0, endIndex);
  102.             }
  103.           }
  104.           else if (number == "B00C")
  105.           {
  106.             /* Unknown number */
  107.             number = "Unknown";
  108.             incommingCall = true;
  109.           }
  110.           else if (number == "B10C")
  111.           {
  112.             /* Secret/protected number */
  113.             number = "Protected";
  114.             incommingCall = true;
  115.           }
  116.           else
  117.           {
  118.             Log("DTMF decoded number is to short, number: \"" + number + "\", length: " + number.length);
  119.             return;
  120.           }
  121.  
  122.  
  123.           /* Store number and direction in last values */
  124.           var lastValue = {};
  125.           var lastValueString = Storage_GetParameter("LastValues", alias_name);
  126.  
  127.           if (lastValueString)
  128.           {
  129.             lastValue = JSON.parse(lastValueString);
  130.           }
  131.  
  132.           var timestamp = get_time();
  133.  
  134.           lastValue["Phonenumber"] = { "value" : number, "timestamp" : timestamp };
  135.           lastValue["Direction"] = { "value" : incommingCall ? "in" : "out", "timestamp" : timestamp };
  136.  
  137.           Storage_SetParameter("LastValues", alias_name, JSON.stringify(lastValue));
  138.  
  139.  
  140.           /* Store number in phone call history */
  141.           var newValue = { "number" : number, "direction" : incommingCall ? "in" : "out", "module" : alias_name, "names" : [], "timestamp" : timestamp };
  142.  
  143.           Storage_SetParameter("PhoneCalls", timestamp, JSON.stringify(newValue));
  144.  
  145.  
  146.           /* Log the number */
  147.           Log("New number: " + number + ", direction: " + (incommingCall ? "in" : "out"));
  148.  
  149.  
  150.           /* Lookup name */
  151.           Sensor_StoreNumberInPhonebook(number, timestamp);
  152.  
  153.  
  154.           /* Call any potential subscribers */
  155.           if (Sensor_OnNewPhonenumberFunctions[alias_name])
  156.           {
  157.             for (var n in Sensor_OnNewPhonenumberFunctions[alias_name])
  158.             {
  159.               /* Call callback with arguments number, direction */
  160.               Sensor_OnNewPhonenumberFunctions[alias_name][n](alias_name, number, incommingCall ? "in" : "out");
  161.             }
  162.           }
  163.         }
  164.         break;
  165.       }
  166.       case "Voltage":
  167.       case "Temperature_Celsius":
  168.       {
  169.         if ((module_name == "DS18x20") && (variables["Value"] == 85))
  170.         {
  171.           Log("\033[31mDS18x20: Temperature conversion error: " + module_name + ":" + module_id + ", SensorId=" + variables["SensorId"] + "\033[0m");
  172.           break;
  173.         }
  174.       }
  175.       case "Humidity_Percent":
  176.       {
  177.         for (var alias_name in aliases_data)
  178.         {
  179.           if (aliases_data[alias_name]["specific"]["SensorId"] != variables["SensorId"])
  180.           {
  181.             continue;
  182.           }
  183.  
  184.           var last_value = {};
  185.           var last_value_string = Storage_GetParameter("LastValues", alias_name);
  186.  
  187.           if (last_value_string)
  188.           {
  189.             last_value = eval("(" + last_value_string + ")");
  190.           }
  191.  
  192.           last_value[command] = { "value" : variables["Value"], "timestamp" : get_time() };
  193.  
  194.           Storage_SetParameter("LastValues", alias_name, JSON.stringify(last_value));
  195.         }
  196.  
  197.         break;
  198.       }
  199.     }
  200.   }
  201. }
  202. Module_RegisterToOnMessage("all", Sensor_OnMessage);
  203.  
  204. function Sensor_StoreNumberInPhonebook(number, timestamp)
  205. {
  206.   var phonebookNumbers = Storage_GetJsonParamter("PhoneBook", number)
  207.  
  208.   if (!phonebookNumbers)
  209.   {
  210.     if (number.charAt(0) != '0')
  211.     {
  212.       if (typeof sensorDefaultPhoneAreaCode === 'undefined')
  213.       {
  214.         Log("\033[31mOnlinePhonebook: please add sensorDefaultPhoneAreaCode = yourAreaCode to autostart.js, defaulting to 031\033[0m\n");
  215.         number = "031" + number;
  216.       }
  217.       else
  218.       {
  219.           number = sensorDefaultPhoneAreaCode + number;
  220.       }
  221.     }
  222.  
  223.     phonebookNumbers = [];
  224.  
  225.     url = "wap.eniro.se/query?search_word=" + number + "&what=mobwp";
  226.     //Log("\033[31mURL: http://"+url+"\033[0m\n");
  227.  
  228.     Http_Request(url, function(socket_id, result, header, content_data)
  229.     {
  230.       //Log("\033[31mOnlinePhonebook-eniro: result was: " + result + "\033[0m\n");
  231.       //Log("\033[31mOnlinePhonebook-eniro: content was: " + content_data + "\033[0m\n");
  232.  
  233.       if (result.indexOf("200 OK") != -1)
  234.       {
  235.  
  236.         var lines = content_data.split("\n");
  237.  
  238.         var endString = "<anchor>Tillbaka<prev/></anchor>";
  239.         var nameStartString = "<td class=\"hTd2\">";
  240.         var nameEndString = "</table>";
  241.  
  242.         for (var n = 1; n < lines.length; n++)
  243.         {
  244.           var line = lines[n].trim("\n");
  245.  
  246.           if (line.indexOf(endString) != -1)
  247.           {
  248.             break;
  249.           }
  250.  
  251.           if (line.indexOf(nameStartString) != -1)
  252.           {
  253.             line = lines[n + 1].trim("\n");
  254.             splitted = line.split("b>");
  255.  
  256.             phonebookNumbers.push(splitted[1].substr(0, splitted[1].length - 2));
  257.             break;
  258.           }
  259.         }
  260.  
  261.         //Log("\033[31mOnlinePhonebook: Line: " + lines[1] + "\033[0m\n");
  262.         //Log("\033[31mOnlinePhonebook: Line: " + lines[2] + "\033[0m\n");
  263.         //Log("\033[31mOnlinePhonebook: Line: " + lines[3] + "\033[0m\n");
  264.         if (phonebookNumbers.length > 0)
  265.         {
  266.           Storage_SetJsonParameter("PhoneBook", number, phonebookNumbers);
  267.  
  268.           Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  269.  
  270.           //CAll all listeners!
  271.           //....
  272.  
  273.           Log("\033[31mOnlinePhonebook-eniro: Found: " + JSON.stringify(phonebookNumbers) + "\033[0m\n");
  274.         }
  275.       }
  276.       else
  277.       {
  278.         Log("\033[31mOnlinePhonebook-eniro: Failed to do name lookup, result was: " + result + "\033[0m\n");
  279.       }
  280.     });
  281.  
  282.     if (phonebookNumbers.length == 0)
  283.     {
  284.       if (typeof sensorRKSEEK_API !== 'undefined')
  285.       {
  286.         url = "rkseek.oblivioncreations.se/?client="+sensorRKSEEK_API+"&n=" + number + "&out=text";
  287.         Log("\033[31mURL: http://"+url+"\033[0m\n");
  288.  
  289.         Http_Request(url, function(socket_id, result, header, content_data)
  290.         {
  291.           phonebookNumbers = [];
  292.  
  293.           if (result.indexOf("200 OK") != -1)
  294.           {
  295.             //Log("\033[31mOnlinePhonebook: result was: " + content_data + "\033[0m\n");
  296.             var lines = content_data.split("\n");
  297.             //Log("\033[31mOnlinePhonebook: Line: " + lines[1] + "\033[0m\n");
  298.             //Log("\033[31mOnlinePhonebook: Line: " + lines[2] + "\033[0m\n");
  299.             //Log("\033[31mOnlinePhonebook: Line: " + lines[3] + "\033[0m\n");
  300.             if (lines[2].length > 0)
  301.             {
  302.               phonebookNumbers = lines[2];
  303.               Storage_SetJsonParameter("PhoneBook", number, phonebookNumbers);
  304.  
  305.               Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  306.  
  307.               Log("\033[31mOnlinePhonebook-rseek: Found: " + JSON.stringify(phonebookNumbers) + "\033[0m\n");
  308.             }
  309.           }
  310.           else
  311.           {
  312.             Log("\033[31mOnlinePhonebook-rseek: Failed to do name lookup, result was: " + result + "\033[0m\n");
  313.           }
  314.         });
  315.       }
  316.     }
  317.  
  318.         /*
  319.         Http_Request("wap.hitta.se/default.aspx?Who=" + number + "&Where=&PageAction=White",
  320.             function(socket_id, result, header, content_data) {
  321.                 var persons = new Array();
  322.                 if (result.indexOf("200 OK") != -1)
  323.                 {
  324.                     var endString = "<anchor>Tillbaka<prev/></anchor>";
  325.                     var nameStartString = " title=\"Link\">";
  326.                     var nameEndString = "</a>";
  327.  
  328.                     var lines = content_data.split("<br/>");
  329.  
  330.                     for (var n = 1; n < lines.length; n++)
  331.                     {
  332.                         var line = lines[n].trim(" \n");
  333.  
  334.                         if (line.indexOf(endString) != -1)
  335.                         {
  336.                             break;
  337.                         }
  338.                         var pos = line.indexOf(nameStartString + (persons.length+1) + ".");
  339.  
  340.                         if (pos != -1)
  341.                         {
  342.                             pos += nameStartString.length + 2
  343.                             persons[persons.length] = line.substr(pos, line.length-pos-nameEndString.length).html_entity_decode().replace("  ", " ");
  344.                         }
  345.                     }
  346.                     if (persons.length > 0) {
  347.                         Storage_SetJsonParameter("PhoneBook", number, persons);
  348.  
  349.                         //CAll all listeners!
  350.                         //....
  351.  
  352.                         Log("\033[31mOnlinePhonebook: Found: " + JSON.stringify(persons) + "\033[0m\n");
  353.                     }
  354.                 }
  355.                 else
  356.                 {
  357.                     Log("\033[31mOnlinePhonebook: Failed to do name lookup, result was: " + result + "\033[0m\n");
  358.                 }
  359.             }
  360.         );
  361.         */
  362.  
  363.   }
  364.   else
  365.   {
  366.     //Log("Number already stored\n");
  367.  
  368.     Sensor_UpdateNameInPhonecalls(timestamp, phonebookNumbers);
  369.   }
  370. }
  371. Console_RegisterCommand(Sensor_StoreNumberInPhonebook, function(arg_index, args) { return Console_StandardAutocomplete(arg_index, args); });
  372.  
  373. function Sensor_UpdateNameInPhonecalls(timestamp, numbers)
  374. {
  375.   if (numbers.length > 0)
  376.   {
  377.     var lastValueString = Storage_GetParameter("PhoneCalls", timestamp);
  378.  
  379.     if (lastValueString)
  380.     {
  381.       var lastValue = JSON.parse(lastValueString);
  382.  
  383.       lastValue.names = numbers;
  384.  
  385.       Storage_SetParameter("PhoneCalls", timestamp, JSON.stringify(lastValue));
  386.     }
  387.   }
  388. }
  389.  
  390.