18_WBS.pm 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. ################################################################################
  2. # Web based Sensors = 18_WBS.pm
  3. # Sensors updated only via Web
  4. #
  5. # Version: 1.0.1
  6. # Date: 24.05.2010
  7. # Author: Axel Rieger
  8. # $Id $
  9. ################################################################################
  10. #
  11. # Define:
  12. # define <NAME> WBS TYPE CODE
  13. #
  14. # Type = READING-NAME f.e.
  15. # CODE = Unique-Code for WBS-Sensors max. 16 Chars
  16. #
  17. # Example
  18. # define WBS001 WBS Temperature 1032D8ED01080011
  19. # $defs$defs{WBS001}{TYPE} = WBS
  20. # $defs$defs{WBS001}{CODE} = 1032D8ED01080011
  21. # $defs{WBS001}{READINGS}{Temperature}{VAL} = 0
  22. # $defs{WBS001}{READINGS}{Temperature}{TIME} = TimeNow()
  23. # Only One READING for each WBS
  24. #
  25. # Updates via WEB:
  26. # MSG-Format:
  27. # WBS:SENSOR-CODE:VALUE
  28. # WBS -> Web Based Sensor -> matching in FHEM
  29. # Sensor-Code -> Unique-Code for WBS-Sensors max. 16 Chars
  30. # Value -> Data from Sensor like 18°C -> Format: INT only [1...90.-]
  31. # max. lenght Value: -xxx.xxx 8 Chars
  32. # max-Lenght MSG: 3:16:8 = 29 Chars
  33. # Example: Temperature form Dallas 1820-Temp-Sensors 24.32 °Celsius
  34. # WBS:1032D8ED01080011:23.32
  35. # Update via http-get-request
  36. # http://[MY_FHEMWEB:xxxx]/fhem/rawmsg?WBS:1032D8ED01080011:23.32
  37. ################################################################################
  38. package main;
  39. use strict;
  40. use warnings;
  41. use POSIX;
  42. use Data::Dumper;
  43. use vars qw(%defs);
  44. use vars qw(%attr);
  45. use vars qw(%data);
  46. use vars qw(%modules);
  47. ################################################################################
  48. sub WBS_Initialize($)
  49. {
  50. my ($hash) = @_;
  51. $hash->{Match} = "^WBS:";
  52. $hash->{DefFn} = "WBS_Define";
  53. $hash->{UndefFn} = "WBS_Undef";
  54. $hash->{ParseFn} = "WBS_Parse";
  55. $hash->{AttrList} = "IODEV do_not_notify:0,1 loglevel:0,5 disable:0,1";
  56. $hash->{defptr} = {};
  57. #Rebuild DefPtr
  58. my $mod = "WBS";
  59. foreach my $d (sort keys %defs) {
  60. next if($defs{$d}{TYPE} ne $mod);
  61. Log 0, "WBS-DEFPTR-FOUND: " . $defs{$d}{NAME} . " : " . $defs{$d}{CODE};
  62. $modules{WBS}{defptr}{$defs{$d}{CODE}} = $defs{$d}{NAME};
  63. }
  64. }
  65. ################################################################################
  66. sub WBS_Define($)
  67. {
  68. # define <NAME> WBS TYPE CODE
  69. my ($self, $defs) = @_;
  70. # Log 0, "WBS|DEFINE: " . Dumper(@_);
  71. my @a = split(/ /, $defs);
  72. return "WBS|Define|ERROR: Unknown argument count " . int(@a) . " , usage define <NAME> WBS TYPE CODE" if(int(@a) != 4);
  73. my $mod = $a[1];
  74. my $Type = $a[2];
  75. my $Code = $a[3];
  76. if(defined($modules{WBS}{defptr}{$Code})) {
  77. return "WBS|Define|ERROR: Code is used";
  78. }
  79. if(length($Code) > 16) {
  80. return "WBS|Define|ERROR: Max. Length CODE > 16";
  81. }
  82. $self->{CODE} = $Code;
  83. $self->{STATE} = "NEW: " . TimeNow();
  84. $self->{WBS_TYPE} = $Type;
  85. $self->{READINGS}{$Type}{VAL} = 0;
  86. $self->{READINGS}{$Type}{TIME} = TimeNow();
  87. $modules{WBS}{defptr}{$Code} = $self->{NAME};
  88. return undef;
  89. }
  90. ################################################################################
  91. sub WBS_Undef($$)
  92. {
  93. my ($hash, $name) = @_;
  94. Log 0, "WBS|Undef: " . Dumper(@_);
  95. my $mod = $defs{$name}{TYPE};
  96. my $Code = $defs{$name}{CODE};
  97. if(defined($modules{$mod}{defptr}{$Code})) {
  98. delete $modules{$mod}{defptr}{$Code}
  99. }
  100. return undef;
  101. }
  102. ################################################################################
  103. sub WBS_Parse($$)
  104. {
  105. my ($iodev,$rawmsg) = @_;
  106. # MSG: WBS:1032D8ED01080011:23.32
  107. my ($null,$code,$value) = split(/:/, $rawmsg);
  108. if(length($code) > 16 ) {
  109. return "WBS|Parse|ERROR: Max. Length CODE > 16";
  110. }
  111. if(length($value) > 8) {
  112. return "WBS|Parse|ERROR: Max. Length VALUE > 8";
  113. }
  114. # Find Device-Name
  115. my $mod = "WBS";
  116. if(!defined($modules{$mod}{defptr}{$code})){
  117. return "WBS|Parse|ERROR: Unkown Device for $code";
  118. }
  119. my $wbs_name = $modules{$mod}{defptr}{$code};
  120. my $wbs = $defs{$wbs_name};
  121. #LogLevel
  122. my $ll = 0;
  123. if(defined($attr{$wbs_name}{loglevel})) {$ll = $attr{$wbs_name}{loglevel};}
  124. #Clean-Value
  125. $value =~ s/[^0123456789.-]//g;
  126. # Get Reading
  127. my $reading = $wbs->{WBS_TYPE};
  128. $wbs->{READINGS}{$reading}{VAL} = $value;
  129. $wbs->{READINGS}{$reading}{TIME} = TimeNow();
  130. # State: [FirstChar READING]:VALUE
  131. my $fc = uc(substr($reading,0,1));
  132. $wbs->{STATE} = "$fc: $value | " . TimeNow();
  133. # Changed
  134. $wbs->{CHANGED}[0] = "$reading: $value";
  135. return $wbs_name;
  136. }
  137. ################################################################################
  138. 1;