24_TPLinkHS110.pm: Support für TPLink HS100/HS110 v1/2/3 Steckdosen

Begonnen von Volker Kettenbach, 25 August 2016, 18:03:57

Vorheriges Thema - Nächstes Thema

Brockmann

Für die Ansteuerung meiner WLAN-Steckdosen per UI habe ich eine "toggle"-Funktion vermisst. Deshalb habe ich die mal selbst in das Modul "reingebastelt".
Sind letztlich nur ein paar Zeilen Code. Vielleicht mag der Modulautor sich die mal ansehen und ggf. in die offizielle Version übernehmen?

Einschränkung: Es wird "nur" in FHEM selbst ermittelt, wie der aktuelle Status vorm Toggle ist. Wenn die Steckdose kurz zuvor manuell geschaltet wurde und FHEM das noch nicht mitbekommen hat, würde genau falsch geschaltet, also gar nichts passieren. Wollte man es perfekt machen, müsste man erst den Status bei der Steckdose abfragen und dann schalten. Aber das war mir zu aufwändig, da für meinen Anwendungsfall überflüssig (ich schalte die praktisch nie manuell).

Ich habe leider auf die Schnelle keine Software für ein Diff oder einen PullRequest. Deshalb poste ich hier meine geänderte Version der Funktion TPLinkHS110_Set bezogen auf 24_TPLinkHS110.pm  15532 2017-12-01 07:31:38Z vk


#####################################
sub TPLinkHS110_Set($$)
{
my ( $hash, @a ) = @_;
  my $name= $hash->{NAME};
return "Device disabled in config" if ($attr{$name}{"disable"} eq "1");
    Log3 $hash, 3, "TPLinkHS110: $name Set <". $a[1] ."> called";
return "Unknown argument $a[1], choose one of on off toggle " if($a[1] ne "on" & $a[1] ne "off" & $a[1] ne "toggle");

my $command;
if($a[1] eq "on") {
$command = '{"system":{"set_relay_state":{"state":1}}}';
}
if($a[1] eq "off") {
$command = '{"system":{"set_relay_state":{"state":0}}}';
}
if($a[1] eq "toggle") {
if (ReadingsVal($name,"state", "???") eq "off") {
$command = '{"system":{"set_relay_state":{"state":1}}}';
}
if (ReadingsVal($name,"state", "???") eq "on") {
$command = '{"system":{"set_relay_state":{"state":0}}}';
}
}
my $remote_host = $hash->{HOST};
my $remote_port = 9999;
my $c = encrypt($command);
my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT})
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($c);
my $data;
my $retval = $socket->recv($data,8192);
$socket->close();
unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4));
my $json;
eval {
$json = decode_json($data);
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};

        if ($json->{'system'}->{'set_relay_state'}->{'err_code'} eq "0") {
TPLinkHS110_Get($hash,"");

} else {
                return "Command failed!";
        }
return undef;
}

Volker Kettenbach

Servus Brockmann,

ich baue das ein und stelle ein neues Modul in Github bzw. FHEM bereit.
Bitte etwas Geduld.

Gruß
Volker

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Brockmann

Zitat von: CoolTux am 09 Januar 2018, 10:10:35
Verstehe nicht wieso man das Rad zweimal erfinden muß.

https://wiki.fhem.de/wiki/DevelopmentModuleAPI#SetExtensions
https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/SetExtensions.pm
Danke für den Hinweis. Bin nun mal kein Entwickler und mit solchen Mechanismen nicht vertraut. Aber Recht hast Du und neben toggle bekommt man gleich noch einige andere Befehle gratis dazu.
Hier also die Variante mit setExtensions (bezogen auf 24_TPLinkHS110.pm  15532 2017-12-01 07:31:38Z vk:
Diesmal die komplette Datei, wobei außer in der Set-Funktion nur ganz oben eine use-Zeile ergänzt wurde.
Ggf. sollte in der HTML-Doku noch erwähnt werden, dass das Modul die setExtensions-Befehle unterstützt?

################################################################
# $Id: 24_TPLinkHS110.pm 15532 2017-12-01 07:31:38Z vk $
#
#  Copyright notice
#
#  (c) 2016 Copyright: Volker Kettenbach
#  e-mail: volker at kettenbach minus it dot de
#
#  Description:
#  This is an FHEM-Module for the TP Link TPLinkHS110110/110
#  wifi controlled power outlet.
#  It support switching on and of the outlet as well as switching
#  on and of the nightmode (green led off).
#  It supports reading several readings as well as the
#  realtime power readings of the HS110.
#
#  Requirements
Perl Module: IO::Socket::INET
Perl Module: IO::Socket::Timeout

In recent debian based distributions IO::Socket::Timeout can
be installed by "apt-get install libio-socket-timeout-perl"
In older distribution try "cpan IO::Socket::Timeout"
#
#  Origin:
#  https://github.com/kettenbach-it/FHEM-TPLink-HS110
#
################################################################

package main;

use strict;
use warnings;
use IO::Socket::INET;
use IO::Socket::Timeout;
use JSON;
use SetExtensions;

#####################################
sub TPLinkHS110_Initialize($)
{
  my ($hash) = @_;
 
  $hash->{DefFn}      = "TPLinkHS110_Define";
  $hash->{ReadFn}     = "TPLinkHS110_Get";
  $hash->{SetFn}      = "TPLinkHS110_Set";
  $hash->{UndefFn}    = "TPLinkHS110_Undefine";
  $hash->{DeleteFn}   = "TPLinkHS110_Delete";
  $hash->{AttrFn}     = "TPLinkHS110_Attr";
  $hash->{AttrList}   = "interval ".
"disable:0,1 " .
"nightmode:on,off " .
  "timeout " .
                        "$readingFnAttributes";
}

#####################################
sub TPLinkHS110_Define($$)
{
  my ($hash, $def) = @_;
  my $name= $hash->{NAME};

  my @a = split( "[ \t][ \t]*", $def );
  return "Wrong syntax: use define <name> TPLinkHS110 <hostname/ip> " if (int(@a) != 3);

  $hash->{INTERVAL}=300;
  $hash->{TIMEOUT}=1;
  $hash->{HOST}=$a[2];
  $attr{$name}{"disable"} = 0;
  # initial request after 2 secs, there timer is set to interval for further update
  InternalTimer(gettimeofday()+2, "TPLinkHS110_Get", $hash, 0);
   
  Log3 $hash, 3, "TPLinkHS110: $name defined.";
 
  return undef;
}


#####################################
sub TPLinkHS110_Get($$)
{
my ($hash) = @_;
my $name = $hash->{NAME};
return "Device disabled in config" if ($attr{$name}{"disable"} eq "1");
  RemoveInternalTimer($hash);   
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "TPLinkHS110_Get", $hash, 1);
$hash->{NEXTUPDATE}=localtime(gettimeofday()+$hash->{INTERVAL});

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon++;
$year += 1900;

my $remote_host = $hash->{HOST};
my $remote_port = 9999;
my $command = '{"system":{"get_sysinfo":{}}}';
my $c = encrypt($command);
my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT} )
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($c);
my $data;
my $retval = $socket->recv($data,8192);
$socket->close();
unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4));
my $json;
eval {
$json = decode_json($data);
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};

Log3 $hash, 3, "TPLinkHS110: $name Get called. Relay state: $json->{'system'}->{'get_sysinfo'}->{'relay_state'}, RSSI: $json->{'system'}->{'get_sysinfo'}->{'rssi'}";
readingsBeginUpdate($hash);
foreach my $key (sort keys %{$json->{'system'}->{'get_sysinfo'}}) {
readingsBulkUpdate($hash, $key, $json->{'system'}->{'get_sysinfo'}->{$key});
        }
if ($json->{'system'}->{'get_sysinfo'}->{'relay_state'} == 0) {
readingsBulkUpdate($hash, "state", "off");
}
if ($json->{'system'}->{'get_sysinfo'}->{'relay_state'} == 1) {
readingsBulkUpdate($hash, "state", "on");
}
# If the device is a HS110, get realtime data:
if ($json->{'system'}->{'get_sysinfo'}->{'model'} eq "HS110(EU)" or $json->{'system'}->{'get_sysinfo'}->{'model'} eq "HS110(UK)") {
my $realtimejcommand='{"emeter":{"get_realtime":{}}}';
my $rc = encrypt($realtimejcommand);
my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT} )
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($rc);
my $rdata;
$retval = $socket->recv($rdata,8192);
$socket->close();
unless( defined $retval) { return undef; }
$rdata = decrypt(substr($rdata,4));
my $realtimejson;
if (length($rdata)==0) {
Log3 $hash, 1, "TPLinkHS110: $name: Received zero bytes of realtime data. Cannot process realtime data";
return;
}
eval {
$realtimejson = decode_json($rdata);
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};
foreach my $key2 (sort keys %{$realtimejson->{'emeter'}->{'get_realtime'}}) {
readingsBulkUpdate($hash, $key2, $realtimejson->{'emeter'}->{'get_realtime'}->{$key2});
}
Log3 $hash, 3, "TPLinkHS110: $name Device is an HS110. Got extra realtime data: $realtimejson->{'emeter'}->{'get_realtime'}->{'power'} Watt, $realtimejson->{'emeter'}->{'get_realtime'}->{'voltage'} Volt, $realtimejson->{'emeter'}->{'get_realtime'}->{'current'} Ampere";
# Get Daily Stats
my $command = '{"emeter":{"get_daystat":{"month":'.$mon.',"year":'.$year.'}}}';
my $c = encrypt($command);
$socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT} )
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($c);
my $data;
$retval = $socket->recv($data,8192);
$socket->close();
unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4));
eval {
my $json = decode_json($data);
my $total=0;
foreach my $key (sort keys @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}}) {
foreach my $key2 ($json->{'emeter'}->{'get_daystat'}->{'day_list'}[$key]) {
$total = $total+ $key2->{'energy'};
if ($key2->{'day'} == $mday) {
readingsBulkUpdate($hash, "daily_total", sprintf("%.3f", $key2->{'energy'}));
}
}
}
my $count=1;
$count = @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}};
readingsBulkUpdate($hash, "monthly_total", $total);
if ($count) { readingsBulkUpdate($hash, "daily_average", $total/$count)};
1;
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};
}
readingsEndUpdate($hash, 1);
Log3 $hash, 3, "TPLinkHS110: $name Get end";
}


#####################################
sub TPLinkHS110_Set($$)
{
my ( $hash, $name, $cmd, @args ) = @_;
my $cmdList = "on off";
return "\"set $name\" needs at least one argument" unless(defined($cmd));
return "Device disabled in config" if ($attr{$name}{"disable"} eq "1");
    Log3 $hash, 3, "TPLinkHS110: $name Set <". $cmd ."> called";

my $command="";
if($cmd eq "on")
{
$command = '{"system":{"set_relay_state":{"state":1}}}';
}
elsif($cmd eq "off")
{
$command = '{"system":{"set_relay_state":{"state":0}}}';
}
else # wenn der übergebene Befehl nicht durch X_Set() verarbeitet werden kann, Weitergabe an SetExtensions
{
return SetExtensions($hash, $cmdList, $name, $cmd, @args);
}

my $remote_host = $hash->{HOST};
my $remote_port = 9999;
my $c = encrypt($command);
my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT})
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($c);
my $data;
my $retval = $socket->recv($data,8192);
$socket->close();
unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4));
my $json;
eval {
$json = decode_json($data);
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};

        if ($json->{'system'}->{'set_relay_state'}->{'err_code'} eq "0") {
TPLinkHS110_Get($hash,"");

} else {
                return "Command failed!";
        }
return undef;
}


#####################################
sub TPLinkHS110_Undefine($$)
{
my ($hash, $arg) = @_;
my $name= $hash->{NAME};
RemoveInternalTimer($hash);   
Log3 $hash, 3, "TPLinkHS110: $name undefined.";
return;
}


#####################################
sub TPLinkHS110_Delete {
my ($hash, $arg) = @_;
my $name= $hash->{NAME};
Log3 $hash, 3, "TPLinkHS110: $name deleted.";
return undef;
}


#####################################
sub TPLinkHS110_Attr {
my ($cmd,$name,$aName,$aVal) = @_;
my $hash = $defs{$name};
 
if ($aName eq "interval") {
if ($cmd eq "set") {
$hash->{INTERVAL} = $aVal;
} else {
$hash->{INTERVAL} = 300;
}
Log3 $hash, 3, "TPLinkHS110: $name INTERVAL set to " . $hash->{INTERVAL};
}

if ($aName eq "timeout") {
if ($cmd eq "set") {
$hash->{TIMEOUT} = $aVal;
} else {
$hash->{TIMEOUT} = 1;
}
Log3 $hash, 3, "TPLinkHS110: $name TIMEOUT set to " . $hash->{TIMEOUT};
}

if ($aName eq "nightmode") {
my $command;
if ($cmd eq "set") {
$hash->{NIGHTMODE} = $aVal;
Log3 $hash, 3, "TPLinkHS110: $name Nightmode $aVal.";
$command =  '{"system":{"set_led_off":{"off":1}}}' if ($aVal eq "on");
$command =  '{"system":{"set_led_off":{"off":0}}}' if ($aVal eq "off");
}
if ($cmd eq "del") {
Log3 $hash, 3, "TPLinkHS110: $name Nightmode attribute removed. Nightmode disabled.";
$command =  '{"system":{"set_led_off":{"off":0}}}';
$hash->{NIGHTMODE} = "off";
}
my $remote_host = $hash->{HOST};
my $remote_port = 9999;
my $c = encrypt($command);
my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => $hash->{TIMEOUT} )
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";
$socket->send($c);
my $data;
my $retval = $socket->recv($data,8192);
$socket->close();
unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4));
my $json;
eval {
$json = decode_json($data);
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return;
};
}
return undef;
}

# Encryption and Decryption of TP-Link Smart Home Protocol
# XOR Autokey Cipher with starting key = 171
# Based on https://www.softscheck.com/en/reverse-engineering-tp-link-hs110/
sub encrypt {
        my $key = 171;
        my $result = "\0\0\0\0";
        my @string=split(//, $_[0]);
        foreach (@string) {
                my $a = $key ^ ord($_);
                $key = $a;
                $result .= chr($a);
        }
        return $result;
}
sub decrypt {
        my $key = 171;
        my $result = "";
        my @string=split(//, $_[0]);
        foreach (@string) {
                my $a = $key ^ ord($_);
                $key = ord($_);
                $result .= chr($a);
        }
        return $result;
}

######################################################################################

1;



=pod
=begin html

<a name="TPLinkHS110"></a>
<h3>TPLinkHS110</h3>
<ul>
  <br>

  <a name="TPLinkHS110"></a>
  <b>Define</b>
    <code>define &lt;name&gt; TPLinkHS110 &lt;ip/hostname&gt;</code><br>
    <br>
Defines a TP-Link HS100 or HS110 wifi-controlled switchable power outlet.<br>
The difference between HS100 and HS110 is, that the HS110 provides realtime measurments of<br>
power, current and voltage.<br>
This module automatically detects the modul defined and adapts the readings accordingly.<br>
<br><br>
This module does not implement all functions of the HS100/110.<br>
Currently, all parameters relevant for running the outlet under FHEM are processed.<br>
Writeable are only "On", "Off" and the nightmode (On/Off) (Nightmode: the LEDs of the outlet are switched off).<br>
Further programming of the outlet should be done by TPLinks app "Kasa", which funtionality is partly redundant<br>
with FHEMs core functions.
  <p>
  <b>Attributs</b>
<ul>
<li><b>interval</b>: The interval in seconds, after which FHEM will update the current measurements. Default: 300s</li>
An update of the measurements is done on each switch (On/Off) as well.
<p>
<li><b>timeout</b>:  Timeout in seconds used while communicationg with the outlet. Default: 1s</li>
<i>Warning:</i>: the timeout of 1s is chosen fairly aggressive. It could lead to errors, if the outlet is not answerings the requests
within this timeout.<br>
Please consider, that raising the timeout could mean blocking the whole FHEM during the timeout!
<p>
<li><b>disable</b>: The execution of the module is suspended. Default: no.</li>
<i>Warning: if your outlet is not on or not connected to the wifi network, consider disabling this module
by the attribute "disable". Otherwise the cyclic update of the outlets measurments will lead to blockings in FHEM.</i>
</ul>
  <p>
  <b>Requirements</b>
<ul>
This module uses the follwing perl-modules:<br><br>
<li> Perl Module: IO::Socket::INET </li>
<li> Perl Module: IO::Socket::Timeout </li>
</ul>

</ul>

=end html

=begin html_DE

<a name="TPLinkHS110"></a>
<h3>TPLinkHS110</h3>
<ul>
  <br>

  <a name="TPLinkHS110"></a>
  <b>Define</b>
    <code>define &lt;name&gt; TPLinkHS110 &lt;ip/hostname&gt;</code><br>
    <br>
    Definiert eine TP-Link HS100 oder HS110 schaltbare WLAN-Steckdose. <br>
Der Unterschied zwischen der HS100 und HS110 besteht darin, dass die HS110 eine Echtzeit-Messung von <br>
Strom, Spannung sowie Leistung durchführt.<br>
Dieses Modul erkennt automatisch, welchen Typ Sie verwenden und passt die Readings entsprechend an.
<br><br>
Das Modul implementiert nicht alle Funktionen der HS100/110.<br>
Derzeit werden alle für den sinnvollen Betrieb an FHEM benötigten Parameter ausgelesen.<br>
Geschrieben werden jedoch nur die Schaltzustände  "An", "Aus" sowie der Nachtmodus An/Aus (Nachtmodus = LEDs der Steckdose ausschalten).<br>
Für eine weitergehende Programmierung der Steckdosen wird daher die TP Link App "Kasa" empfohlen, wobei deren<br>
Funktionen wie Timer etc. letztlich redundant zu Kernfunktionen von FHEM sind.
  <p>
  <b>Attribute</b>
<ul>
<li><b>interval</b>: Das Intervall in Sekunden, nach dem FHEM die Messwerte aktualisiert. Default: 300s</li>
Eine Aktualisierung der Messwerte findet auch bei jedem Schaltvorgang statt.
<p>
<li><b>timeout</b>:  Der Timeout in Sekunden, der bei der Kommunikation mit der Steckdose verwendet wird. Default: 1s</li>
<i>Achtung</i>: der Timeout von 1s ist knapp gewählt. Ggf. kann es zu Fehlermeldungen kommen, wenn die Steckdose nicht
schnell genug antwortet.<br>
Bitte beachten Sie aber auch, dass längere Timeouts FHEM für den Zeitraum des Requests blockieren!
<p>
<li><b>disable</b>: Die Ausführung des Moduls wird gestoppt. Default: no.</li>
<i>Achtung: wenn Ihre Steckdose nicht in Betrieb oder über das WLAN erreichbar ist, sollten Sie
dieses FHEM-Modul per Attribut "disable" abschalten, da sonst beim zyklischen Abruf der Messdaten
der Steckdose Timeouts auftreten, die FHEM unnötig verlangsamen.</i>
</ul>
  <p>
  <b>Requirements</b>
<ul>
Das Modul benötigt die folgenden Perl-Module:<br><br>
<li> Perl Module: IO::Socket::INET </li>
<li> Perl Module: IO::Socket::Timeout </li>
</ul>

</ul>
=end html_DE

=item summary Support for TPLink HS100/100 wifi controlled power outlet

=item summary_DE Support für die TPLink HS100/110 WLAN Steckdosen

Volker Kettenbach



Volker Kettenbach

Guten Abend allerseits,

das neue Release mit SetExtension (Danke für den Tip - Das kannte ich bisher auch nicht!) ist fertig.
Das FHEM-SVN habe ich aktualisiert. Das Modul sollte morgen verfügbar sein.

Wer's früher mag, findet es hier:
https://github.com/kettenbach-it/FHEM-TPLink-HS110

Ein Bitte:
ich bin dankbar für jeden Beitrag.
Aber diesen bitte entweder als komplettes Modul hier hochladen, so dass ich einen Patch/Pull-Request damit erzeigen kann.
Oder einen Pull-Request auf GitHub erzeugen.

Wer regelmäßig contributen will, der kann gerne auch Zugriff auf Git bekommen.
In diesem Falle wäre aber wichtig, sich mit GitFlow aus zu kennen, denn das verwende ich zum Management des Git-Repos.

Gruß
VK

Winterbottom

Hallo Volker,

danke für das schöne Modul.
Dank der anderen, die dieselben Fehler gemacht haben, wie ich, habe ich es mit ein bisschen Lesen doch recht schnell hinbekommen, meine Steckdose an Fhem anzubinden.
Danke!
RaspPi3 über FGW-USB, Eltako Gebäudefunk (FAM14) zentral für EFH mit ca 70 Aktoren und 100 Eingängen, 20x LaCrosse an JeeLink, FHEM 5.7, TabletUI

Wizzball

Hallo!
Erst einmal danke für das sehr nützliche Modul. Ich bin auch über den Fehler mit den nicht immer aktualisierenden Werten gestolpert. Ab und an scheint der Plug keine sinnvollen Tages-/Monatsdaten zuliefern. Auch in der Kasa-App ist dann nichts zu sehen. Dann werden ab auch die Real-Time Daten nicht mehr aktualisiert.
Soweit ich das Modul verstanden habe, scheint nach dem Log-Eintrag in Level 2 direkt ein Return zu folgen, ohne ein readingsEndUpdate davor. Das scheint dazuzuführen, dass zwar die Readings am Device aktuell sind, aber keine Events geschickt werden.
Ich habe Lokal bei mir nun a) die Fehlerlogs geändert, damit ich weiß welches Json decoding schief geht und b) vor das Return ein readingsEndUpdate gestellt.
Jetzt scheint mein Waschmaschinen-Ende-Doif wieder zu funktionieren.
Ich beobachte mal, ob ich nichts kaputt gemacht habe. Und wenn ich herausfinde, wie ich das Modul per Tablett hochlade teile ich gerne meine Änderungen.
Viele Grüße, Robert

Edit: Datei angefügt

tox14

Hallo!

ich nutze das Modul seit ca. einen Monat und habe nun seit 2 Tagen folgendes Problem, dass bei Internals der state nicht mehr aktualisiert wird. Dieser steht permanent auf off.
Der state unter den readings wird bei jedem manuellen Schaltvorgang aktualisiert.

Ich steuere mit folgender Routine, die dadurch nicht mehr so in dieser Art funktioniert, da der state sich nicht ändert und somit die Steckdose nicht mehr ausschaltet.
([Heizkreis_VLVM:temperature:d] < 33.0) (set wifipowerplug1:FILTER=STATE=on off) DOELSEIF ([Heizkreis_VLVM:temperature:d] > 35.0) (set wifipowerplug1:FILTER=STATE=off on)

Im logfile taucht auch ein neuer Eintrag auf:
Vorher:
2018.01.01 00:03:51 3: TPLinkHS110: wifipowerplug1 Get called. Relay state: 0, RSSI: -73
2018.01.01 00:03:51 3: TPLinkHS110: wifipowerplug1 Device is an HS110. Got extra realtime data: 0 Watt, 226.388095 Volt, 0.02574 Ampere
2018.01.01 00:03:51 3: TPLinkHS110: wifipowerplug1 Get end

Seit 2 Tagen:
2018.01.31 21:20:11 3: TPLinkHS110: wifipowerplug1 Get called. Relay state: 1, RSSI: -50
2018.01.31 21:20:11 3: TPLinkHS110: wifipowerplug1 Device is an HS110. Got extra realtime data: 0 Watt, 225.183699 Volt, 0.025733 Ampere
2018.01.31 21:20:11 2: TPLinkHS110: wifipowerplug1 json-decoding failed. Problem decoding getting statistical dat

Ich habe das Problem gelöst, indem ich bei der Steuerung das :FILTER=STATE=on entfernt habe.

Kann mir jemand sagen wieso auf einmal bei Internals der state hängt und sich nicht aktualisiert?

Vielen Dank im voraus.

VG

Wizzball

Hallo tox14,
ich hatte das selbe Problem und habe das Modul bei mir Lokal modifiziert, so dass auch beim auftreten dieses Fehlers noch die der (anscheinend nötige) Befehl abgesetzt wird um die alles vollständig zu aktualisieren und die Events abzufeuern. Meine Änderungen habe ich oben angehängt.
Zumindest bei mir läuft die Welt nun wieder normal.

Volker Kettenbach

Hallo zusammen,

ich habe die Änderungen von Wizzball ins offizielle Release eingebaut.
Vielen Dank dafür! Du hast in der Tat einen Bug gefixed!

(Dafür dass die Steckdosen manchmal keine Daten liefern kann ich aber nichts).

Das neue Modul steht unter https://github.com/kettenbach-it/FHEM-TPLink-HS110 und ab morgen im FHEM-SVN zur Verfügung.

Gruß
VK

Wizzball


tox14

@Wizzball: Danke für das schnelle Feedback und die Modifikation

Ich habe wie oben beschrieben, die eine Statusabfrage rausgenommen und gestern hat alles wieder ordnungsgemäß funktioniert. Ich denke auch, dass der Status wieder aktualisiert wurde.

@VK: Ich werde das Modul mal updaten, die Routine wieder auf den Ausgangszustand zurücksetzen und beobachten. Danke erstmal dafür.

DS_Starter

Hallo Volker,

habe mir jetzt auch mal eine solche Dose zugelegt und hat auch einwandfrei funktioniert.
Frage ... in der Commandref steht:

Zitat
Geschrieben werden jedoch nur die Schaltzustände "An", "Aus" sowie der Nachtmodus An/Aus (Nachtmodus = LEDs der Steckdose ausschalten).

Mal abgesehen davon dass ich irgendwie nicht deuten kannst was du mit "Geschrieben" meinst, finde ich auch kein set-Kommando mit dem man den Nachmodus ein/ausschalten könnte.

Vielleicht habe ich auch etwas übersehen ?

Danke und LG,
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter