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

Volker Kettenbach

Zitat von: DS_Starter am 16 März 2018, 11:13:36
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 ?

Der Nightmode wird über ein Attribut festgelegt.
Geschrieben heißt an das Gerät gesendet.

DS_Starter

Morgen Volker,

ZitatDer Nightmode wird über ein Attribut festgelegt.

Ahh ... jetzt habe ich es gefunden. Das Attribut ist in der Commandref nicht aufgeführt !

Grüße,
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

DS_Starter

Gibt es eine Möglichkeit dem Gerät eine feste IP zuzuordnen ?

Ich habe bis jetzt auch in der Kasa-App nichts dergleichen gefunden.
Vielleicht habt ihr es doch irgendwie hinbekommen.

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

Volker Kettenbach

Ich kann mich nicht erinnern, ob das evtl in der App geht.
Ich habe es auf jeden Fall per DHCP gelöst (statischer Eintrag).

der-graph

Hallo,
ich bin begeisterter Benutzer des Moduls für die HS110 und auch sehr zufrieden mit den Steckdosen selbst.

Nachrem ich mir ganz aktuellen Nachschub gegönnt habe, muss ich nun leider feststellen, dass im Log nur noch die  Meldung

TPLinkHS110: XXX json-decoding failed. Problem decoding getting statistical data

TPLinkHS110: XXX json-raw:


erscheint.
Nach etwas Recherche ist mir aufgefallen, dass die beiden neuen Steckdosen nun HW-Version 2.0 (anstatt 1.0 bei den alten Dosen) in der App anzeigen und die Firmware bei den alten 1.2.5 und bei den neuen 1.5.2 lautet. Möglicherweise scheint hier etwas nicht mehr kompatibel zu sein. In der Kasa App scheinen natürlich sonst beide identisch zu sein.

Kann ich irgendentwas beisteuern, so dass sich das Problem hoffentlich lösen lässt? Danke schon mal!

der-graph

Hi, ich nochmal.

Nachdem ich mich nun intensiv mit dem Problem beschäftigt habe, ist es mir nun tatsächlich gelungen das Problem zu lösen. Wenn ich von V2 spreche meine ich die neuen Dosen (hw_ver=2.0), bei V1 meine ich die "alten" Dosen mit hw_ver=1.0
Folgende Dinge sind mir aufgefallen:

1.) In der Funktion encrypt muss eine Änderung erfolgen, da sonst die neuen Dosen V2 nicht antworten. Ich habe keinen Ahnung warum, aber die Änderung interessiert die alten Dosen V1 anscheinend nicht, hier läuft nach meinen Tests alles auch nach der Änderung problemlos weiter:
349: my $result = "\0\0\0\0";
wird zu
my $result = "\0\0\0".chr(@string);

Anschließend antwortet die Dose schon wieder und alle mit einer HS100 V2 habens bereits geschafft. Allerdings gab es bei der HS110 V2 noch ein paar Änderungen, so dass nun das Auslesen der Verbäuche nicht mehr funktioniert.

2.) Bei V2 wurden leider die Werte im json-String {'emeter'}->{'get_realtime'} umbenannt, so dass nicht mehr auf die entsprechenden Daten zur Auswertung von Volt, Watt, Ampere etc zugegriffen werden kann.
Konkret wurde

{'power'} zu {'power_mw'}
{'voltage'} zu {'voltage_mv'}
{'current'} zu {'current_ma'}
{'energy'} zu {'energy_wh'}


Damit nun alles wieder funktioniert muss an diesen Stellen natürlich die Version der Dosen unterschieden werden. Ich hab das für mich jetzt mal so gelöst:

163: 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";


wird zu


my $hw_ver = $json->{'system'}->{'get_sysinfo'}->{'hw_ver'};
if ($hw_ver eq "1.0") {
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";
# hw_vers >= 2.0
} else {
Log3 $hash, 3, "TPLinkHS110: $name Device is an HS110. Got extra realtime data: $realtimejson->{'emeter'}->{'get_realtime'}->{'power_mw'} Milliwatt, $realtimejson->{'emeter'}->{'get_realtime'}->{'voltage_mv'} Millivolt, $realtimejson->{'emeter'}->{'get_realtime'}->{'current_ma'} Milliampere";
}


und


182: 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'}));
}
}
}


wird nun zu:


foreach my $key (sort keys @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}}) {
foreach my $key2 ($json->{'emeter'}->{'get_daystat'}->{'day_list'}[$key]) {
if ($hw_ver eq "1.0") {
$total = $total+ $key2->{'energy'};
if ($key2->{'day'} == $mday) {
readingsBulkUpdate($hash, "daily_total", sprintf("%.3f", $key2->{'energy'}));
}
} else {
$total = $total+ $key2->{'energy_wh'};
if ($key2->{'day'} == $mday) {
readingsBulkUpdate($hash, "daily_total", sprintf("%.3f", $key2->{'energy_wh'}));
}
}

}
}



So funktioniert das Ganze nun erst mal. Wie jedoch die geänderten Werte schon erahnen lassen werden nun tatsächlich auch die Einheiten bei der Auswertung geändert. Wo früher Volt stand und Werte wie current=229.3001 gesendet wurden sind es nun tatsächlich Millivolt und der Wert lautet current_mv=229300. Ebenso bei den anderen Werten (Milliampere etc.) Hier sollten eventuell die Readings angeasst werden ( / 1000), so dass das Modul wieder einheitliche Werte liefert. Ich hoffe der aktuelle Stand hilft aber bereits dem ein oder anderen.

Schöne Grüße


Edit: Noch etwas. Es gibt ein neues Reading unter {"system":{"get_sysinfo":{}}} mit dem Namen "next_action". Dabei handelt es sich um eine geschachteltes JSON-Objekt und taucht aktuell dann in fhem natürlich als "HASH(0x47e4180)" auf. Sollte auch noch gefixt werden, nur zur Info...

Volker Kettenbach

Hallo Graph,

vielen Dank für Deine Beitrag und den Pull-Request.
Da ich selbst keine Version 2 Dosen haben, hätte ich auch nur bedingt helfen können.
Dein Beitrag schaut auch im Code sehr sinnvoll aus und ich würde den Pull-Request grundsätzlich mergen.
Aber es wäre nett, wenn Du die vorgeschlagene Division /1000 einbauen würdest und einen neuen Pull-Request schicken könntest.
Grund ist, dass sonst bei einem Mischbetrieb der beiden Versionen der Dosen unterschiedliche Einheiten in de Readings stehen und das Rechnen damit dann zu einem Durcheinander würde.

Wäre es möglich, dass Du das noch machst und noch mal einen Pull-Request schickst?
Ich merge den dann sofort.

Gruß
Volker

der-graph

Hallo,

hab den Code entsprechend aktualisiert. Da bei mir die Dosen Version 1/2 ja jetzt auch im Mischbetrieb laufen, war mir das auch ein persönliches Anliegen die Werte schnell zu vereinheitlichen.

Was momentan noch fehlt ist das verschachtelte neue json-Element für die "next_action" im sysinfo mittels foreach auszulesen. Keine große Sache, aber sollte man eventuell irgendwann der Vollständigkeit halber noch einbauen.

Da die Dosen zur Zeit, weil "Alexa kompatibel", extrem auf Amazon beworben werden, hab ich jetzt ein Werte/Faktor Mapping gebaut. Nicht, dass in Kürze dann Hardwareversion 3.0 erscheint und die Readings wieder umständlich geändert werden müssen.  ;D
Hier sollte im Code zur Vereinheitlichung auch im Abschnitt "total/energy" noch auf das Mapping verwiesen werden, wie im Abschnitt "sysinfo" und "emeter". Aber funktioniert dort natürlich im Moment auch anhand der Unterscheidung von "hw_ver". Aber schöner - weil einheitlicher - wär's.

Schöne Grüße

Volker Kettenbach

Super!
Gib mir mal das Wochenende Zeit.
Dann teste und merge ich das!

dynamoa

Hallo Volker,

gibt es hier schon etwas neues? Habe seit dem WE auch die HS110 V2 im Einsatz, und bekomme auch nur die Logeinträge:

TPLinkHS110: HS110 json-decoding failed. Problem decoding getting statistical data

Meine HS100 V1 läuft immer noch einwandfrei. Wenn ich irgendwie helfen kann, würde ich das gerne machen.

VG

Raik

Volker Kettenbach


Volker Kettenbach


dynamoa

Hallo Volker,

vielen Dank, dass Du Dich kümmerst! Leider hat das Update bei der HS110 V2 noch nicht den gewünschten Effekt. In FHEM bekomme ich als State nur ???.
Im Log habe ich folgendes stehen:

PERL WARNING: Use of uninitialized value in string eq at ./FHEM/24_TPLinkHS110.pm line 253.

Die andere Meldung scheint dafür aber weg zu sein. Kann ich noch irgendwie helfen?

VG

EDIT: Sorry, aber bekomme jetzt doch Meldungen von der Steckdose. Scheint also zu funktionieren. Musste nur einmal einen request an die HS110 senden. Also: VIELEN DANK noch einmal!!!

DS_Starter

Hallo Volker,

bin aus dem Urlaub gekommen und habe ein Update in FHEM gemacht. Seitdem bekomme ich bei meiner V1-Steckdose immer wieder die Meldungen:


2018.05.28 07:59:53.038 2: TPLinkHS110: tplink.energymeter json-decoding failed. Problem decoding getting daily stat data
2018.05.28 08:15:22.996 2: TPLinkHS110: tplink.energymeter json-decoding failed. Problem decoding getting daily stat data
2018.05.28 08:17:58.041 2: TPLinkHS110: tplink.energymeter json-decoding failed. Problem decoding getting daily stat data


Manchmal funktioniert es auch. Aber so stabil wie vorher ist es leider nicht mehr. Zwei Beiträge vorher hat dynamoa das gleiche Problem mit V2 Dosen beschrieben das bei ihm offensichtlich nach einer Codeänderung beseitigt ist, bei mir aber nun dieser Fehler kommt.

list:


Internals:
   DEF        192.168.2.102
   HOST       192.168.2.102
   INTERVAL   155
   NAME       tplink.energymeter
   NR         1551
   STATE      2.249066 W
   TIMEOUT    1
   TYPE       TPLinkHS110
   READINGS:
     2018-05-28 08:37:53   active_mode     schedule
     2018-05-28 08:37:53   alias           Steckdose 2
     2018-05-28 08:37:53   current         0.074613
     2018-05-28 08:37:53   daily_average   0.0740714285714286
     2018-05-28 08:37:53   daily_total     0.022
     2018-05-28 08:37:53   dev_name        Wi-Fi Smart Plug With Energy Monitoring
     2018-05-28 08:37:53   deviceId        800631C67AD9E0A84E8DF3B6BA79D2941991980D
     2018-05-28 08:37:53   err_code        0
     2018-05-28 08:37:53   feature         TIM:ENE
     2018-05-28 08:37:53   fwId            851E8C7225C3220531D5A3AFDACD9098
     2018-05-28 08:37:53   hwId            45E29DA8382494D2E82688B52A0B2EB5
     2018-05-28 08:37:53   hw_ver          1.0
     2018-05-28 08:37:53   icon_hash       
     2018-05-28 08:37:53   latitude        51.316095
     2018-05-28 08:37:53   led_off         0
     2018-05-28 08:37:53   longitude       12.06025
     2018-05-28 08:37:53   mac             B0:4E:26:6B:99:03
     2018-05-28 08:37:53   model           HS110(EU)
     2018-05-28 08:37:53   monthly_total   2.074
     2018-05-28 08:37:53   oemId           3D341ECE302C0642C99E31CE2430544B
     2018-05-28 08:37:53   on_time         465
     2018-05-28 08:37:53   power           2.249066
     2018-05-28 08:37:53   relay_state     1
     2018-05-28 08:37:53   rssi            -60
     2018-05-28 08:37:53   state           on
     2018-05-28 08:37:53   sw_ver          1.1.4 Build 170417 Rel.145118
     2018-05-28 08:37:53   total           3.503
     2018-05-28 08:37:53   type            IOT.SMARTPLUGSWITCH
     2018-05-28 08:37:53   updating        0
     2018-05-28 08:37:53   voltage         233.371585
Attributes:
   alias      TPLink Energiemesser
   cmdIcon    on:remotecontrol/black_btn_GREEN off:remotecontrol/black_btn_RED
   comment    *_total:      Wh
power:        aktueller Verbrauch in Watt
on_time:      s
   disable    0
   event-on-update-reading state
   group      Energiemesser
   interval   155
   room       Energie
   stateFormat power W
   verbose    2


Grüße
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

DS_Starter

Hi Volker,

ich nehme alles zurück behaupte das Gegenteil  :)
Habe die vorherige Version wieder eingespielt und bekomme die gleichen Fehlermitteilungen. Muß also an etwas anderem liegen und muss mal auf die Suche gehen.

Grüße
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