2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 01:09:47 +00:00

69_SoftliqCloud.pm: Another "garbage" fix

git-svn-id: https://svn.fhem.de/fhem/trunk@24306 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
KernSani 2021-04-21 21:18:21 +00:00
parent acd6da21d3
commit 0ee38b10bd

View File

@ -22,6 +22,7 @@
##############################################################################
# Changelog:
# 0.1.06: Fixed reading the paramter list (119939/1151016)
# Another "garbage" fix
# 0.1.05: Fixed setting numeric parameters
# 0.1.04: ANother fix to avoid "garbage" in JSON
# 0.1.03: Improve error handling
@ -1771,145 +1772,37 @@ sub parseWebsocketRead {
my $hash = shift;
my $buf = shift;
my $name = $hash->{NAME};
my $json = safe_decode_json( $hash, $buf );
if ( $json->{type} && $json->{type} ne '6' ) {
my @jsons = split(/\{}/xsm, $buf);
foreach my $j (@jsons) {
my $json = safe_decode_json( $hash, $j );
if ( $json->{type} && $json->{type} ne '6' ) {
Log3 $name, LOG_RECEIVE, qq([$name] Received from socket: $buf);
readingsBeginUpdate($hash);
my @args = @{ $json->{arguments} };
my %info = %{ $args[0] };
my $i = 0;
foreach my $key ( keys %info ) {
Log3 $name, LOG_RECEIVE, qq([$name] Received from socket: $buf);
readingsBeginUpdate($hash);
my @args = @{ $json->{arguments} };
my %info = %{ $args[0] };
my $i = 0;
foreach my $key ( keys %info ) {
if ( $key eq 'type' ) { # no use and there is already a type reading (machine type)
next;
if ( $key eq 'type' ) { # no use and there is already a type reading (machine type)
next;
}
if ( $key =~ /2$/x and AttrVal( $name, 'sq_duplex', '0' ) eq '0' ) {
next;
}
if ( $key eq 'msaltusage' ) {
my $diff = $info{$key} - ReadingsNum( $name, "lastRefill", 0 );
readingsBulkUpdate( $hash, 'saltUsageSinceRefill', $diff );
}
readingsBulkUpdate( $hash, $key, $info{$key} );
}
if ( $key =~ /2$/x and AttrVal( $name, 'sq_duplex', '0' ) eq '0' ) {
next;
}
if ( $key eq 'msaltusage' ) {
my $diff = $info{$key} - ReadingsNum( $name, "lastRefill", 0 );
readingsBulkUpdate( $hash, 'saltUsageSinceRefill', $diff );
}
readingsBulkUpdate( $hash, $key, $info{$key} );
}
readingsEndUpdate( $hash, 1 );
readingsEndUpdate( $hash, 1 );
}
}
return;
}
# sub wsHandshake {
# my $hash = shift;
# my $name = $hash->{NAME};
# my $tcp_socket = $hash->{TCPDev};
# my $url = $hash->{helper}{url};
# # create a websocket protocol handler
# # this doesn't actually "do" anything with the socket:
# # it just encodes / decode WebSocket messages. We have to send them ourselves.
# Log3 $name, LOG_RECEIVE, "[$name] Trying to create Protocol::WebSocket::Client handler for $url...";
# my $client = Protocol::WebSocket::Client->new(
# url => $url,
# version => "13",
# );
# # Set up the various methods for the WS Protocol handler
# # On Write: take the buffer (WebSocket packet) and send it on the socket.
# $client->on(
# write => sub {
# my $sclient = shift;
# my ($buf) = @_;
# syswrite $tcp_socket, $buf;
# }
# );
# # On Connect: this is what happens after the handshake succeeds, and we
# # are "connected" to the service.
# $client->on(
# connect => sub {
# my $sclient = shift;
# # You may wish to set a global variable here (our $isConnected), or
# # just put your logic as I did here. Or nothing at all :)
# Log3 $name, LOG_RECEIVE, "[$name] Successfully connected to service!" . Dumper($hash);
# $sclient->write('{"protocol":"json","version":1}');
# #succesfully connected - start a timer
# my $next = int( gettimeofday() ) + MINUTESECONDS;
# InternalTimer( $next, 'FHEM::Gruenbeck::SoftliqCloud::wsClose', $hash, 0 );
# return;
# }
# );
# # On Error, print to console. This can happen if the handshake
# # fails for whatever reason.
# $client->on(
# error => sub {
# my $sclient = shift;
# my ($buf) = @_;
# Log3 $name, LOG_ERROR, qq([$name] ERROR ON WEBSOCKET: $buf);
# $tcp_socket->close;
# return qq([$name] ERROR ON WEBSOCKET: $buf);
# }
# );
# # On Read: This method is called whenever a complete WebSocket "frame"
# # is successfully parsed.
# # We will simply print the decoded packet to screen. Depending on the service,
# # you may e.g. call decode_json($buf) or whatever.
# $client->on(
# read => sub {
# my $sclient = shift;
# my ($buf) = @_;
# $buf =~ s///xsm;
# parseWebsocketRead( $hash, $buf );
# #Log3 $name, 3, "[$name] Received from socket: '$buf'";
# return;
# }
# );
# # Now that we've set all that up, call connect on $client.
# # This causes the Protocol object to create a handshake and write it
# # (using the on_write method we specified - which includes sysread $tcp_socket)
# Log3 $name, LOG_RECEIVE, "[$name] Calling connect on client...";
# $client->connect;
# # read until handshake is complete.
# while ( !$client->{hs}->is_done ) {
# my $recv_data;
# my $bytes_read = sysread $tcp_socket, $recv_data, TCPPACKETSIZE;
# if ( !defined $bytes_read ) {
# Log3 $name, LOG_ERROR, qq([$name] sysread on tcp_socket failed: $!);
# return qq([$name] sysread on tcp_socket failed: $!);
# }
# if ( $bytes_read == 0 ) {
# Log3 $name, LOG_ERROR, qq([$name] Connection terminated.);
# return qq([$name] Connection terminated.);
# }
# $client->read($recv_data);
# }
# # Create a Socket Set for Select.
# # We can then test this in a loop to see if we should call read.
# # my $set = IO::Select->new($tcp_socket);
# #$hash->{helper}{wsSet} = $set;
# $hash->{helper}{wsClient} = $client;
# # my $next = int( gettimeofday() ) + 1;
# # $hash->{helper}{wsCount} = 0;
# #InternalTimer( $next, 'FHEM::Gruenbeck::SoftliqCloud::wsRead', $hash, 0 );
# return;
# }
sub wsFail {
my $hash = shift;
@ -1946,7 +1839,7 @@ sub wsReadDevIo {
$buf =~ s///xsm;
$buf =~ s/\\x\{1e\}//xsm;
if (!($buf =~ /}$/xsm)) {
$buf = substr($buf, 0, rindex($buf,"}"));
$buf = substr($buf, 0, rindex($buf,"}"));
}
if ( length($buf) == 0 ) {
return;