2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-01 00:19:00 +00:00

98_HTTPMOD: new attribute bodyEncode

git-svn-id: https://svn.fhem.de/fhem/trunk@27034 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
StefanStrobel 2023-01-12 17:41:18 +00:00
parent 1f458d49d2
commit 073da19870
2 changed files with 36 additions and 5 deletions

View File

@ -21,7 +21,9 @@
# First version: 25.12.2013 # First version: 25.12.2013
# #
# Todo: # Todo:
# check encodings in attr (find_encoding, none as special case)
# allow set inerval 0 # allow set inerval 0
# allow multiple values for set -> $val1, $val2, ...
# setXYHintExpression zum dynamischen Ändern / Erweitern der Hints # setXYHintExpression zum dynamischen Ändern / Erweitern der Hints
# extractAllReadings mit Filter / Prefix # extractAllReadings mit Filter / Prefix
# definierbarer prefix oder Suffix für Readingsnamen wenn sie von unterschiedlichen gets über readingXY erzeugt werden # definierbarer prefix oder Suffix für Readingsnamen wenn sie von unterschiedlichen gets über readingXY erzeugt werden
@ -141,7 +143,7 @@ BEGIN {
)); ));
}; };
my $Module_Version = '4.1.14 - 19.8.2022'; my $Module_Version = '4.1.15 - 17.12.2022';
my $AttrList = join (' ', my $AttrList = join (' ',
'reading[0-9]+(-[0-9]+)?Name', 'reading[0-9]+(-[0-9]+)?Name',
@ -270,7 +272,8 @@ my $AttrList = join (' ',
'memReading', # debuf -> create a reading for the virtual Memory of the Fhem process together with BufCounter if it is used 'memReading', # debuf -> create a reading for the virtual Memory of the Fhem process together with BufCounter if it is used
'model', # for attr templates 'model', # for attr templates
'regexDecode', 'regexDecode',
'bodyDecode', 'bodyDecode', # implemented in the bodyDecode function in Utils
'bodyEncode', # also in utils
'regexCompile', 'regexCompile',
$main::readingFnAttributes); $main::readingFnAttributes);
@ -2518,6 +2521,7 @@ sub PrepareCookies {
################################################################# #################################################################
# set parameters for HttpUtils from request into hash # set parameters for HttpUtils from request into hash
# and do replacements
sub FillHttpUtilsHash { sub FillHttpUtilsHash {
my $hash = shift; my $hash = shift;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
@ -2612,7 +2616,8 @@ sub ReadyForSending {
} }
####################################### ##############################################
# prepare next queue entry and send it
# Aufruf aus InternalTimer mit "queue:$name" # Aufruf aus InternalTimer mit "queue:$name"
# oder direkt mit $direct:$name # oder direkt mit $direct:$name
sub HandleSendQueue { sub HandleSendQueue {
@ -2648,7 +2653,7 @@ sub HandleSendQueue {
$hash->{REQUEST} = $request; $hash->{REQUEST} = $request;
$hash->{value} = $request->{value}; # make value accessible for user defined replacements / expressions $hash->{value} = $request->{value}; # make value accessible for user defined replacements / expressions
my $huHash = FillHttpUtilsHash($hash); my $huHash = FillHttpUtilsHash($hash); # prepare hash, do replacements
Log3 $name, 4, Log3 $name, 4,
"$name: HandleSendQueue sends $request->{type} with timeout $huHash->{timeout} to " "$name: HandleSendQueue sends $request->{type} with timeout $huHash->{timeout} to "
@ -3469,6 +3474,13 @@ sub AddToSendQueue {
If no charset header is found, the body will remain undecoded. If no charset header is found, the body will remain undecoded.
<br> <br>
</li> </li>
<li><a id="HTTPMOD-attr-bodyEncode" data-pattern="bodyEncode">bodyEncode</a><br>
defines an encoding to be used in a call to the perl function encode to convert the raw http response body data string
read from the device before further processing / matching<br>
If you have trouble with JSON parsing you might need to use this feature and set it to utf8.
<br>
</li>
<li><a id="HTTPMOD-attr-regexDecode" data-pattern="regexDecode">regexDecode</a><br> <li><a id="HTTPMOD-attr-regexDecode" data-pattern="regexDecode">regexDecode</a><br>
defines an encoding to be used in a call to the perl function decode to convert the raw data string from regex attributes before further processing / matching<br> defines an encoding to be used in a call to the perl function decode to convert the raw data string from regex attributes before further processing / matching<br>
If you have trouble matching special characters or if you need to get around a memory leak in Perl regex processing this might help If you have trouble matching special characters or if you need to get around a memory leak in Perl regex processing this might help
@ -3552,6 +3564,8 @@ sub AddToSendQueue {
</li> </li>
<li><a id="HTTPMOD-attr-setIExpr" data-pattern="set.*IExpr">set[0-9]+IExpr</a><br> <li><a id="HTTPMOD-attr-setIExpr" data-pattern="set.*IExpr">set[0-9]+IExpr</a><br>
Perl Expression to compute the raw value to be sent to the device from the input value passed to the set. Perl Expression to compute the raw value to be sent to the device from the input value passed to the set.
E.g. "$val*100" will multiply $val by 100 after a set command, the thusly modified $val will then be used in subsequent processing,
e.g. "(get|set)[0-9]*Data" will use the modified $val
</li> </li>
<li><a id="HTTPMOD-attr-setExpr" data-pattern="set.*\[?\+?]Expr">set[0-9]+Expr</a><br> <li><a id="HTTPMOD-attr-setExpr" data-pattern="set.*\[?\+?]Expr">set[0-9]+Expr</a><br>
This is the old syntax for (get|reading)[0-9]*IExpr. It should be replaced by (get|reading)[0-9]*IExpr. The set command upgradeAttributes which becomes visible when the attribute enableControlSet is set to 1, can do this renaming automatically. This is the old syntax for (get|reading)[0-9]*IExpr. It should be replaced by (get|reading)[0-9]*IExpr. The set command upgradeAttributes which becomes visible when the attribute enableControlSet is set to 1, can do this renaming automatically.

View File

@ -54,6 +54,7 @@ our @EXPORT_OK = qw(UpdateTimer FhemCaller
IsOpen IsOpen
FmtTimeMs FmtTimeMs
FmtDate FmtDate
FmtDateTimeNice
DateDiff DateDiff
date_str2num date_str2num
ReadableArray ReadableArray
@ -282,11 +283,14 @@ sub EvalExpr {
my $inCheckEval = ($checkOnly ? 0 : 1); my $inCheckEval = ($checkOnly ? 0 : 1);
my $assign = 'package main; '; my $assign = 'package main; ';
KEYLOOP:
foreach my $key (keys %{$oRef}) { foreach my $key (keys %{$oRef}) {
next KEYLOOP if($key =~ /(checkOnly|nullIfNoExp|expr|action)/);
my $type = ref $oRef->{$key}; my $type = ref $oRef->{$key};
my $vName = substr($key,1); my $vName = substr($key,1);
my $vType = substr($key,0,1); my $vType = substr($key,0,1);
#Log3 $name, 3, "$name: EvalExpr: $action check key $key type $type and vType $vType";
if ($type eq 'SCALAR') { if ($type eq 'SCALAR') {
$assign .= "my \$$vName = \${\$oRef->{'$key'}};"; # assign ref to scalar as scalar $assign .= "my \$$vName = \${\$oRef->{'$key'}};"; # assign ref to scalar as scalar
} }
@ -631,7 +635,7 @@ sub ReadKeyValue {
################################################### ###################################################
# recoursive main part for HTTPMOD_FlattenJSON($$) # recoursive main part for FlattenJSON($$)
# consumes a hash passed as parameter # consumes a hash passed as parameter
# and creates $hash->{ParserData}{JSON}{$prefix.$key} # and creates $hash->{ParserData}{JSON}{$prefix.$key}
sub JsonFlatter { sub JsonFlatter {
@ -732,6 +736,7 @@ sub BodyDecode {
my $header = shift // ''; my $header = shift // '';
my $name = $hash->{NAME}; # Fhem device name my $name = $hash->{NAME}; # Fhem device name
my $bodyDecode = AttrVal($name, 'bodyDecode', 'default'); my $bodyDecode = AttrVal($name, 'bodyDecode', 'default');
my $bodyEncode = AttrVal($name, 'bodyEncode', '');
my $bodyCharset; my $bodyCharset;
my $decoding; my $decoding;
@ -776,6 +781,7 @@ sub BodyDecode {
$hash->{'.bodyCharset'} = 'internal'; $hash->{'.bodyCharset'} = 'internal';
#Log3 $name, 5, "$name: BodyDecode " . ($body ? "new body as utf-8 is: \n" . encode ('utf-8', $body) : "body empty"); #Log3 $name, 5, "$name: BodyDecode " . ($body ? "new body as utf-8 is: \n" . encode ('utf-8', $body) : "body empty");
} }
$body = encode($bodyEncode, $body) if ($bodyEncode && $bodyEncode !~ m{\A [Nn]one \z}xms );
return $body; return $body;
} }
@ -786,6 +792,7 @@ sub BodyDecode {
# tcpserver # tcpserver
sub IsOpen { sub IsOpen {
my $hash = shift; my $hash = shift;
return 0 if (!$hash->{DeviceName});
return 1 if ($hash->{DeviceName} eq 'none'); return 1 if ($hash->{DeviceName} eq 'none');
return 1 if ($hash->{TCPServer} && $hash->{FD}); return 1 if ($hash->{TCPServer} && $hash->{FD});
return 1 if ($hash->{TCPChild} && defined($hash->{CD})); return 1 if ($hash->{TCPChild} && defined($hash->{CD}));
@ -826,6 +833,16 @@ sub FmtDate {
} }
####################################################
# format date and time as nicer string
sub FmtDateTimeNice {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(shift);
my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @days = qw(So Mo Di Mi Do Fr Sa);
return sprintf("%s %d.%s %04d %02d:%02d", $days[$wday], $mday, $months[$mon], $year+1900, $hour, $min);
}
################################################################## ##################################################################
# get number of days between first and seccond (later) date string # get number of days between first and seccond (later) date string
sub DateDiff { sub DateDiff {