PHP Modul TP Link HS 100 / TP Link HS 100

Äh… Die gibt es ab Werk:
Volt.230
Watt.14490
Electricity
Du solltest keine Profile nutzen wo man sieht das sie von anderen Modulen stammen.
Die Tilde vor den Profilen kannst du Weglassen.

Was mich viel mehr schockiert hat, was machen darstellbare Werte wie Model, Firmware, RSSI usw… in den Eigenschaften ?!
Entweder ist es eine Variable in IPS Wert oder nicht. Aber doch bitte nicht in die Eigenschaft…
Und das dann auch noch zyklisch Abfragen und ApplyChanges auf sich selbst.
Dafür sind die Eigenschaften nicht da.
Michael

Hallo Fonzo,
Fehlermeldungen weg, aber Werte fehlen

Kann ich noch anpassen.

Ganz einfach, so lange es bei IP-Symcon so ist, das von der Anzahl der Variablen die Lizenz abhängt, macht es keinen Sinn für jeden noch so kleinen Wert eine Variable anzulegen. dann hätte eine poplige Steckdose 20 ! Variablen. Es mag ja aber durchaus sein, dass man so einen Wert nachschauen will ohne ihn gleich darstellen zu wollen. Eine Variable dient in erster Linie dazu im Webfront dargestellt zu werden oder mit dem Wert dann weiter zu arbeiten. Aber Du kannst mir gerne einen Vorschlag machen wie Du das lösen würdest ohne unnötig Variablen zu benutzten und die Informationen dennoch für einen Nutzer vorzuhalten.

Ist das eine HS 100 oder HS110? Läst sich die Dose denn ein/aus schalten?

2 HS110 brandneu. Schalten geht, jedoch die visuelle Änderung der Buttons erscheinen mir hoch in Symcon.

Gruss Reinhard

Wozu gibt es dann eigentlich ~Electricity.HM wenn es doch schon ~Electricity gibt?

Komplett falsch gedacht und umgesetzt.
A) Du kompromittiert damit das IPS Lizenz Model.
B) Reine Info-Werte kannst du direkt in der Form durch GetConfigurationForm dynamisch anzeigen (Model, Typ usw)
C) Werte wie Längen und Breitengrad sind ja wohl komplett überflüssig bei einer Steckdose.
D) Variablen sind nicht in erster Linie dazu gedacht sie im WebFront darzustellen, sondern genauso um anhand ihrer Werte Ereignisse auszulösen oder sie in anderen Scripten abzufragen.
E) Man kann auch den User einfach konfigurieren lassen was er als Variablen haben will. Wählt er z.B. GerateTyp ab, hat er halt keine Variable dafür und kommt nicht an den Wert.

Mein SDM630 hat ca 40 Variablen. Ja und?
Michael

Vermutlich weil der Wertebereich nicht passt?
Michael

Was gibt denn die Methode


$instanceid = 12345 /*[Geräte\TP Link HS 110\TP Link HS 110]*/;
$result = TPLHS_GetRealtimeCurrent($instanceid);
var_dump($result);

als Antwort?

Was meinst Du damit genau?

Zitat von rekostar
Schalten geht, jedoch die visuelle Änderung der Buttons erscheinen mir hoch in Symcon.

Sorry mein Fehler. Das funktioniert ! :mad:
Es fehlen nur die werte

Das kann man sehen wie man will, eine Steckdose ist zum Schalten da. Und ich persönlich halte es für überzogen nur weil man sagen wir 10 Geräte besitzt, dann eine größere Lizenz zu benötigen, weil ein simples Gerät so viele Variablen verbraucht. Variablen sind dazu da, entweder etwas zu schalten, zu visualisieren oder Daten als Graph darzustellen. So was wie die Firmware Version ist zwar nett zu wissen, aber ich würde da niemals eine Variable für verwenden wenn ich ich so oder so die Unlimited Version hätte.

Das ist eine gute Idee, aber wo liegt da jetzt der genaue Vorteil zu dem was jetzt der Fall ist, die Form wird doch auch in einer Property abgelegt?

Das sagst Du so, die Dose kann aber durchaus so was wie bei Sonnenaufgang schalten. Und wenn da Murks hinterlegt ist, dann funktioniert das auch nicht. Also ist diese Information aus meiner Sicht schon relevant.

Da stimme ich Dir ja vollkommen zu, nur was will ich mit so was wie MAC oder der Modell Bezeichnung in einem Skript auslösen? Also brauche ich da zumindest aus meiner persönlichen Sicht auch keine Variable für.

So habe ich das ja in anderen Modulen gemacht z.B. Denon wo der Nutzer auswählen kann was er braucht. Ich werde mal schauen wie man das vielleicht noch ändern kann so was wie eine Liste ist vielleicht ja gut, wobei das wie gesagt auch eine Property ist also den genauen Unterschied sehe ich jetzt noch nicht.

Hm :confused:, bei mir zeigt er Werte an, ich habe jedoch, wenn ich das vergleiche, Firmware 1.1.4 Build 170417 Rel.145118 und Hardware Version 1. In sofern unterscheidet sich das. Kann sein, dass da wieder alles über den Haufen geworfen worden ist und noch mal wieder alles anders ist. Das dauert dann bestimmt länger und ich kann es selber auch nicht testen weil ich die Hardware Version gar nicht selber besitze. In sofern muss man da mal schauen ob man da eine Lösung findet, vielleicht hat da ja jemand eine Idee. Ich fürchte daher auf die Schnelle wirst Du Dich vorerst mit Ein/Aus begnügen müssen bei der Hardware Version.

Danke für Eure Hilfe. Ich habe das jetzt mit einer HS110 HW Ver. 1 nachvollzogen und hier funktioniert alles.Es sieht so aus, als hätte TP Link hier in der Befehlsreferenz was geändert. Schade :mad:

Gruss Reinhard

Grundsätzlich kann man das ja eventuell anpassen, nur dann geht das Spiel eben wieder von vorne los und man muss schauen was die App da eigentlich macht, und ohne Hardware wird das schwierig. Aber wenn Du was heraus finden solltest, kannst Du Dich ja gerne melden, dann kann man das auch für neue Hardware Versionen erweitern.

Hallo!

Vor diesem Problem stehe ich nun auch. Meine „alten“ TP-LINK HS-110 funktionieren mit dem Script tadellos. Die kürzlich gekauften leider nicht mehr.

Vielleicht kann ich selbst ein wenig beisteuern:

Bislang (ohne IPS) habe ich folgendes Python Modul in meinen Scripten verwendet:

GitHub - GadgetReactor/pyHS100: Python Library to control TPLink Switch (HS100 / HS110)

Hier gibt es u.a. auch ein binary „pyhs100“ welches folgende Informationen ausgibt:

i) „altes Modell“ (voll funktionsfähig mit dem IPS-Modul:)

== ECT01 - HS110(EU) ==
Device state: ON
IP address: 192.168.118.191
On since: 2018-06-15 10:26:47.868698
LED state: True
== Generic information ==
Time: 2018-12-21 11:29:10
Hardware: 1.0
Software: 1.2.5 Build 171213 Rel.101523
MAC (rssi): B0:4E:26:6B:9E:8F (-61)
Location: {‚longitude‘: 0, ‚latitude‘: 0}
== Emeter ==
Current state: {‚total‘: 183.493, ‚current‘: 0.553777, ‚power‘: 59.286718, ‚voltage‘: 225.4195}

ii) „neueres Modul“

== ECT06 - HS110(EU) ==
OFF
IP address: 192.168.118.100
On since: 2018-12-21 11:29:11.223658
LED state: True
== Generic information ==
Time: 2018-12-21 11:29:03
Hardware: 1.0
Software: 1.2.5 Build 171213 Rel.101523

MAC (rssi): B0:4E:26:54:37:30 (-59)
Location: {‚longitude‘: 0, ‚latitude‘: 0}
== Emeter ==
Current state: {‚total‘: 1.15, ‚current‘: 0.014063, ‚power‘: 0, ‚voltage‘: 229.320428}

iii) ganz neue Version

== heECT07 - HS110(EU) ==
OFF
IP address: 192.168.118.197
On since: 2018-12-21 11:29:13.275751
LED state: True
== Generic information ==
Time: 2018-12-21 11:29:12
Hardware: 2.0
Software: 1.5.4 Build 180815 Rel.121440

MAC (rssi): AC:84:C6:89:EF:0B (-51)
Location: {‚longitude‘: 0, ‚latitude‘: 0}
== Emeter ==
Current state: {‚voltage_mv‘: 226735, ‚power_mw‘: 0, ‚total_wh‘: 24, ‚current_ma‘: 12}

Derzeit ist es bei mir so, dass i) vollständig funktioniert (Schaltung sowie Energiemessung), ii) und iii) aber nur schalten, die Energiewerte sind „0“

Wenn ich die Seite zum „hacken“ des HS-110 (https://www.softscheck.com/en/reverse-engineering-tp-link-hs110/) richtig verstehe, dann kommt nach dem „decrypten“ einfach ein JSON String heraus.

Die „Keys“ dieses JSON sind bei der alten Version (1.0) (‚total‘, ‚current‘, ‚power‘, ‚voltage‘) anders als bei der neuen Version (2.0) (‚voltage_mv‘, ‚power_mw‘, ‚total_wh‘, ‚current_ma‘).

Könnte es ein, dass sich nur die Keys (ok, und die Einheiten) geändert haben?

Ich habe mir (als absoluter PHP Laie) die „module.php“ einmal angesehen. Die „decrypt“ Funktion habe ich gefunden. Leider kann ich nicht herausfinden, wie der JSON-String ausgewertet wird:


// Get Realtime Current and Voltage Reading
	public function GetRealtimeCurrent()
	{
		$command = '{"emeter":{"get_realtime":{}}}';
		$result = $this->SendToTPLink($command);
		SetValueFloat($this->GetIDForIdent("Voltage"), floatval($result->emeter->get_realtime->voltage));
		$this->SendDebug("TP Link:", "Voltage: " . floatval($result->emeter->get_realtime->voltage), 0);
		SetValueFloat($this->GetIDForIdent("Current"), floatval($result->emeter->get_realtime->current * 1000.0));
		$this->SendDebug("TP Link:", "Current: " . floatval($result->emeter->get_realtime->current * 1000.0), 0);
		$power = floatval($result->emeter->get_realtime->power);
		$this->SendDebug("TP Link:", "Power: " . $power, 0);
		SetValueFloat($this->GetIDForIdent("Power"), $power);
		$previous_work = GetValue($this->GetIDForIdent("Work"));
		$timefactor = floatval($this->ReadPropertyInteger("systeminfointerval") / 3600.0);
		$work = $previous_work + ($power * $timefactor);
		$this->SendDebug("TP Link:", "Work: " . $work, 0);
		SetValueFloat($this->GetIDForIdent("Work"), $work);
		return array("voltage" => floatval($result->emeter->get_realtime->voltage), "current" => floatval($result->emeter->get_realtime->current), "power" => floatval($result->emeter->get_realtime->power), "work" => $work);
	}

Hier komme ich nicht weiter:


$command = '{"emeter":{"get_realtime":{}}}';
$result = $this->SendToTPLink($command);
SetValueFloat($this->GetIDForIdent("Voltage"), floatval($result->emeter->get_realtime->voltage));

Die SendToTPLink() Funktion sieht so aus:


protected function SendToTPLink($command)
	{
		$sock = $this->connectToSocket();
		$this->sendToSocket($command, $sock);
		$buf = $this->getResultFromSocket($sock);
		$result = json_decode($this->decrypt($buf));
		socket_close($sock);
		$this->SendDebug("TP Link Socket:", "Result: ". json_encode($result), 0);
		return $result;
	}

$result = json_decode($this->decrypt($buf));… hier kommt der JSON Output heraus. Aber wie/wo entsteht der $result->emeter->get_realtime->voltage Teil? emeter wird schon in der $command Variable verwendet… Dennoch kann ich das nicht nachvollziehen.

Im Grund gehe ich im Moment davon aus, dass das Script anpassbar ist, da das o.g. Pyhton Modul auch mit der Hardware-Version 2.0 funktioniert. Nur ob ich das in PHP schaffe, da bin ich mir noch nicht so sicher :slight_smile:

Zur Not füttere ich IPS über die JSON-RPC Schnittstelle aus einem Python Script. Ist aber ja nicht Sinn der Sache :wink:

Vielen Dank für jeden Tip!

Sollte sich die Verschlüsselung nicht geändert haben sondern lediglich die Werte ist das kein Problem dann kann man das schnell ergänzen.

Kannst Du mal die Instanz öffnen und dann das Debug Fenster (Käfer Icon) öffen und posten was dort bei den neueren Modellen steht bei TP Link Socket Result?
Wenn dort Klartext steht dann ist nur die Art wie die Werte übergeben werden anderes dann kann ich das auch anpassen.

Hallo Fonzo!

Das wäre super, dann haben alle was davon! (Bei meinem „gepfusche“ in PHP) würde ich das niemandem zumuten wollen :banghead:

Und es kommt tatsächlich Klartext:


12/21/2018, 4:01:06 PM |      TP Link Socket: | Result: {"emeter":{"get_realtime":{"voltage_mv":226755,"current_ma":12,"power_mw":0,"total_wh":24,"err_code":0}}}


Danke & Gruß

Kannst Du mal ein Update machen und schauen ob die Werte jetzt aktualisiert werden? Lässt sich denn die neue Version ein /ausschalten?

Die Werte werden aktualisiert… Allerdings handelt es sich um Hochspannung :smiley: -> müsste noch durch 1000 dividiert werden

Schalten geht auch, allerdings bleibt die „Eieruhr“ / das „Rad“ nach einer Schaltaktion ca. 50 Sekunden. Danach geht die GUI in den Zustand vor der Schaltaktion (die Aktion selber am HS-110 bleibt aber). Drückt man den Button im WebFrontend noch einmal, das gleiche Spiel. Diesmal bleibt die GUI Darstellung aber, auch wenn das „Rad“ nach 50 Sekunden verschwindet. (Sollte das unverständlich sein, mache ich ein Video davon…)

Selection_237.png

Dann habe ich plötzlich bei der Einrichtung eines Events alle Properties doppelt. Kannst Du mir sagen, wie ich das bereinigen kann?

Ist doch praktisch kannst Du dein E Auto direkt an der Steckdose laden ;), Spaß beiseite ist durch 1000 dividiert nach dem Update.

Das hört sich nicht gut an anscheinend wird da auf irgendwas gewartet, da muss ich mal schauen ob ich das finde.

Die Frage müste eigentlich jemand von IP-Symcon beantworten, ist leider oft so dass dies nach einem Modul Update auftritt. Das sollte dann wieder normal sein, wenn IP-Symcon einmal komplett neu gestartet wurde.