Subversion Repositories HomeAutomation

Rev

Rev 2122 | Rev 2153 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

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