58_SecvestIP.pm 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #####################################################################
  2. # #
  3. # SecvestIP.pm written by Peter J. Flathmann #
  4. # Version 0.3, 2012-09-15 #
  5. # SecvestIP firmware version 2.3.4 #
  6. # #
  7. # ----------------------------------------------------------------- #
  8. # #
  9. # Usage: #
  10. # #
  11. # define <name> SecvestIP <hostname> <user> <password> #
  12. # set <name> <Set|PartSet|Unset> #
  13. # #
  14. # Example: #
  15. # #
  16. # define EMA SecvestIP secvestip admin geheimesKennwort #
  17. # attr EMA webCmd state #
  18. # set EMA Set #
  19. # #
  20. # ----------------------------------------------------------------- #
  21. # #
  22. # Possible states: #
  23. # #
  24. # Set: activated #
  25. # PartSet: internally activated #
  26. # Unset: deactivated #
  27. # #
  28. #####################################################################
  29. package main;
  30. use strict;
  31. use warnings;
  32. use POSIX;
  33. use LWP::UserAgent;
  34. use HTTP::Cookies;
  35. sub SecvestIP_Initialize($) {
  36. my ($hash) = @_;
  37. $hash->{DefFn} = "SecvestIP_Define";
  38. $hash->{SetFn} = "SecvestIP_Set";
  39. $hash->{GetFn} = "SecvestIP_Get";
  40. return undef;
  41. }
  42. sub SecvestIP_Get($) {
  43. my ($hash) = @_;
  44. my $url = 'http://'.$hash->{HOST}.'/';
  45. my $agent = LWP::UserAgent->new(
  46. cookie_jar => HTTP::Cookies->new,
  47. requests_redirectable => [ 'GET', 'HEAD', 'POST' ]
  48. );
  49. # Login
  50. my $response = $agent->post( $url."login.cgi", {
  51. Language => 'deutsch',
  52. UserName => $hash->{USER},
  53. Password => $hash->{PASSWORD}}
  54. );
  55. # Get SecvestIP state
  56. $response = $agent->get ($url.'getMode.cgi?ts='.time().'&Action=AudioAlarm&Source=Webpage');
  57. my @pairs = split(/\s+/,$response->content);
  58. my @state = split('=',$pairs[0]);
  59. $hash->{STATE} = $state[1];
  60. return undef;
  61. }
  62. sub SecvestIP_Set($$$) {
  63. my ($hash, $name ,$cmd) = @_;
  64. # Get current SecvestIP state
  65. SecvestIP_Get($hash);
  66. return "Unknown argument $cmd, choose one of state:Set,Unset,PartSet" if ($cmd eq "?");
  67. Log 1, "SecvestIP: Set $name $cmd";
  68. my $url = 'http://'.$hash->{HOST}.'/';
  69. my $agent = LWP::UserAgent->new(
  70. cookie_jar => HTTP::Cookies->new,
  71. requests_redirectable => [ 'GET', 'HEAD', 'POST' ]
  72. );
  73. # Login
  74. my $response = $agent->post( $url."login.cgi", {
  75. Language => 'deutsch',
  76. UserName => $hash->{USER},
  77. Password => $hash->{PASSWORD}}
  78. );
  79. # switching between internal and full activation or vice versa requires Unset first
  80. if ($cmd eq "Set" and $hash->{STATE} eq "PartSet" or $cmd eq "PartSet" and $hash->{STATE} eq "Set") {
  81. Log 1, "SecvestIP: switching from $hash->{STATE} to $cmd";
  82. $response = $agent->get ($url.'setMode.cgi?Mode=Unset&Source=Webpage&ts='.time() );
  83. sleep(2); # wait a moment to avoid confusing SecvestIP's web interface
  84. }
  85. $response = $agent->get ($url.'setMode.cgi?Mode='.$cmd.'&Source=Webpage&ts='.time() );
  86. SecvestIP_Get($hash);
  87. return undef;
  88. }
  89. sub SecvestIP_Define($$) {
  90. my ($hash, $def) = @_;
  91. Log 1, "SecvestIP: define $def";
  92. my @a = split("[ \t][ \t]*", $def);
  93. return "syntax: define <name> SecvestIP <hostname> <user> <password>" if (int(@a) != 5);
  94. $hash->{STATE} = "Initialized";
  95. $hash->{NAME} = $a[0];
  96. $hash->{HOST} = $a[2];
  97. $hash->{USER} = $a[3];
  98. $hash->{PASSWORD} = $a[4];
  99. SecvestIP_Get($hash);
  100. return undef;
  101. }
  102. 1;