################################################################################
# Route RAW-Sensor-Data via FHEMWEB/CGI to fhem.pl: Function -> disptach($$$)
# 99_CGI_RAWMSG
#
# Version: 1.0.1
# Date: 24.05.2010
# Author: Axel Rieger
#
################################################################################
# Examples for RAW-Sensor-Data
# WBS = WeB-Sensors
# WBS:SENSOR-CODE:SENSOR-TYPE:VALUE:TIMESTAMP
# HMS -> H909801530400F4
# CUL_WS -> K21500163	
################################################################################
package main;
use strict;
use warnings;
use Data::Dumper;
use vars qw(%data);
use vars qw($__ME);
################################################################################
sub CGI_RAWMSG_Initialize($)
{
  # FHEM Part
  my ($hash) = @_;
  $hash->{Clients} = ":CUL_WS:HMS:WBS:";
  my %mc = (
	"1:CUL_WS"    => "^K.....",
	"2:HMS"       => "^810e04....(1|5|9).a001",
	"3:WBS"       => "^WBS:",
	);
  $hash->{MatchList} = \%mc;
  # CGI Part
  my $cgi_key = "rawmsg";
  my $cgi_name = "CGI_RAWMSG";
  # PRIV-CGI
  my $fhem_url = "/" . $cgi_key ;
  $data{FWEXT}{$fhem_url}{FUNC} = "CGI_RAWMSG_Dispatch";
  $data{FWEXT}{$fhem_url}{LINK} = $cgi_key;
  $data{FWEXT}{$fhem_url}{NAME} = $cgi_name;
  # Create IO-Device for fhem-dispatcher
  $data{$cgi_key}{NAME} = $cgi_name;
  $data{$cgi_key}{MatchList} = \%mc;
  if(!defined($defs{$cgi_name})){
	fhem "define $cgi_name dummy";
	$defs{$cgi_name}{STATE} = "AKTIV 99_CGI_RAWMSG";
	$defs{$cgi_name}{TYPE} = "CGI_RAWMSG";
	fhem "attr $cgi_name comment DUMMY_DEVICE_FOR_99_CGI_RAWMSG";
  }
  
}
################################################################################
sub CGI_RAWMSG_Dispatch($$)
{
  my ($htmlarg) = @_;
  my ($ret_param,$ret_txt,@tmp,$rawmsg,$cgikey);
  Log 5, "CGI_RAWMSG|Dispatch|START: $htmlarg";
  $ret_param = "text/plain; charset=ISO-8859-1";
  $ret_txt = "ERROR;NODATA";
#  print "CGI_RAWMSG|Dispatch: " . Dumper(@_) . "\n";
  # Aufurf: http://[FHEMWEB]/fhem/rawmsg?TEST12345
  # htmlarg = /rawmsg?TEST12345
  if($htmlarg =~ /\?/) {
	@tmp = split(/\?/,$htmlarg);
	$cgikey = shift(@tmp);
	$cgikey =~ s/\///;
	$rawmsg = shift(@tmp);
	# HELP
	if($rawmsg eq "help") {
	  no strict "refs";
	  $ret_txt = &CGI_RAWMSG_help;
	  use strict "refs";
	  return ($ret_param, $ret_txt);
	  }
	# Check rawmsg
	foreach my $m (sort keys %{$data{$cgikey}{MatchList}}) {
	  Log 5, "CGI_RAWMSG|MatchList-RAWMSG: $rawmsg";
	  Log 5, "CGI_RAWMSG|MatchList-Key: $m";
	  Log 5, "CGI_RAWMSG|MatchList-Val: " . $data{$cgikey}{MatchList}{$m};
	  my $match = $data{$cgikey}{MatchList}{$m};
	  if($rawmsg =~ m/$match/) {
		Log 5, "CGI_RAWMSG|MatchList-Key FOUND: $m";
		# $ret_txt = "HTMLARG = $htmlarg\n";
		# $ret_txt .= "CGI-KEY = $cgikey\n";
		# $ret_txt .= "RAWMSG = $rawmsg\n";
		# Dummy-Device
		my $name = $data{$cgikey}{NAME};
		my $hash = $defs{$name};
		$hash->{"${name}_MSGCNT"}++;
		$hash->{"${name}_TIME"} = TimeNow();
		$hash->{RAWMSG} = $rawmsg;
		my %addvals = (RAWMSG => $rawmsg);
		my $ret_disp = &Dispatch($hash, $rawmsg, \%addvals);
		if(defined($ret_disp)) {$ret_txt = "OK;" . join(";" ,@$ret_disp) . "\n";}
		else {$ret_txt = "ERROR;NODEVICEFOUND";}
		return ($ret_param, $ret_txt);
		}
	  }
  $ret_txt = "ERROR;NODATAMATCH";
	}
  return ($ret_param, $ret_txt);
}

################################################################################
sub CGI_RAWMSG_help
{
  my $txt = "Route RAW-Sensor-Data via FHEMWEB/CGI to FHEM\n";
  $txt .= "FHEM.PL Function -> disptach($$$)\n";
  $txt .= "Examples for RAW-Sensor-Data \n";
  $txt .= "WBS = WeB-Sensors\n";
  $txt .= "WBS:SENSOR-CODE:SENSOR-TYPE:VALUE:TIMESTAMP\n";
  $txt .= "HMS -> H909801530400F4\n";
  $txt .= "CUL_WS -> K21500163 \n";
  retrun $txt;
}
################################################################################
sub CGI_RAWMSG_new_iodev
{
}
################################################################################
1;
################################################################################