Script für TP-Link TP110

Servus,

gestern IPS gekauft und auch gleich mal angefangen meine Geräte einzubinden, da ich keinen Industriestandard verwende muss ich selbst was basteln (sofern es nichts von anderen Usern gibt)

Als erstes ist mir dabei dann die Schaltsteckdose TP110 in den Sinn gekommen.
Zum Glück kann man in IPS ja mit PHP programmieren und somit ist dann mein erstes Script entstanden welches ich auch der Allgemeinheit zugänglich machen möchte.

GitHub - Nisbo/TP110-Addon: TP-Link TP110 Addon/Script for IPS (IP Symcon)

Mir ist bewusst das dies noch keine Goldrandlösung ist und man in IPS vieles noch anders/besser machen könnte (z.B. den IPS Socket verwenden), für den Anfang soll es erst einmal reichen, ich werde Änderungen nach schieben so bald ich mich weiter eingelesen habe.

Mein allergrößten Respekt gestern gekauft und heute schon ein Skript, das ist lobenswert :D.

Für den Fall das Du Dich dann nach und nach in IP-Symcon vertiefst findest Du näheres in der Dokumention zu PHP Modulen. Mit so einem Modul wird dann in einem Formular nur noch vom Nutzer die IP Adresse eingetragen den Rest legt dann das Modul an.

Beispiele für Funktionsweisen findest Du in SymconTest

Ich wollte es eigentlich vermeiden, der Mensch ist ja von Natur aus faul :smiley: :smiley: :smiley:
Danke für die Links, so etwas in der Art hatte ich noch gesucht, werden bestimmt hilfreich sein :slight_smile:

Weiß jemand welchen Eigenstromverbrauch so eine Steckdose hat?

Quelle der Bewertungen bei Amazon

Im Ausgeschalteten Zustand sind es sehr akzeptable 1,35W die durch das Relais auf 2,07W hoch schnellen wenn die Steckdose eingeschaltet wird

Hi,

danke für dein Script.
Gibt es auch eine Möglichkeit die Dosen zu schalten ?

LG

Och da war ja noch was wo ich mal dran weiter basteln wollte :smiley:
Muss ich mal schauen wann ich dazu komme, geplant hatte ich es zumindest

darüber würde zumindest ich mich sehr freuen :wink: selber hab ich leider keine ahnung davon :rolleyes:

Du musst Dir nur für jede Funktion der Steckdose eine Funktion schreiben die den passenden String an den Socket sendet.
Exemplarisch machst Du das ja schon zum Abholen der Info. Wenn Du das mittelfristig in ein PHP Modul umbauen solltest kannst Du dann ja einfach einen Socket von IP-Symcon nutzten dann musst Du nicht selber einen im Skript erstellen.

Das sind die bekannten Funktionen


TP-Link Smart Home Protocol Command List
========================================
(for TP-Link HS100 and HS110)

System Commands
========================================
Get System Info (Software & Hardware Versions, MAC, deviceID, hwID etc.)
{"system":{"get_sysinfo":null}}

Reboot
{"system":{"reboot":{"delay":1}}}

Reset (To Factory Settings)
{"system":{"reset":{"delay":1}}}

Turn On
{"system":{"set_relay_state":{"state":1}}}

Turn Off
{"system":{"set_relay_state":{"state":0}}}

Turn Off Device LED (Night mode)
{"system":{"set_led_off":{"off":1}}}

Set Device Alias
{"system":{"set_dev_alias":{"alias":"supercool plug"}}}

Set MAC Address
{"system":{"set_mac_addr":{"mac":"50-C7-BF-01-02-03"}}}

Set Device ID
{"system":{"set_device_id":{"deviceId":"0123456789ABCDEF0123456789ABCDEF01234567"}}}

Set Hardware ID
{"system":{"set_hw_id":{"hwId":"0123456789ABCDEF0123456789ABCDEF"}}}

Set Location
{"system":{"set_dev_location":{"longitude":6.9582814,"latitude":50.9412784}}}

Perform uBoot Bootloader Check
{"system":{"test_check_uboot":null}}

Get Device Icon
{"system":{"get_dev_icon":null}}

Set Device Icon
{"system":{"set_dev_icon":{"icon":"xxxx","hash":"ABCD"}}}

Set Test Mode (command only accepted coming from IP 192.168.1.100)
{"system":{"set_test_mode":{"enable":1}}}

Download Firmware from URL
{"system":{"download_firmware":{"url":"http://...."}}}

Get Download State
{"system":{"get_download_state":{}}}

Flash Downloaded Firmware
{"system":{"flash_firmware":{}}}

Check Config
{"system":{"check_new_config":null}}


WLAN Commands
========================================
Scan for list of available APs
{"netif":{"get_scaninfo":{"refresh":1}}}

Connect to AP with given SSID and Password
{"netif":{"set_stainfo":{"ssid":"WiFi","password":"secret","key_type":3}}}


Cloud Commands
========================================
Get Cloud Info (Server, Username, Connection Status)
{"cnCloud":{"get_info":null}}

Get Firmware List from Cloud Server
{"cnCloud":{"get_intl_fw_list":{}}}

Set Server URL
{"cnCloud":{"set_server_url":{"server":"devs.tplinkcloud.com"}}}

Connect with Cloud username & Password
{"cnCloud":{"bind":{"username":"your@email.com", "password":"secret"}}}

Unregister Device from Cloud Account
{"cnCloud":{"unbind":null}}


Time Commands
========================================
Get Time
{"time":{"get_time":null}}

Get Timezone
{"time":{"get_timezone":null}}

Set Timezone
{"time":{"set_timezone":{"year":2016,"month":1,"mday":1,"hour":10,"min":10,"sec":10,"index":42}}}


EMeter Energy Usage Statistics Commands
(for TP-Link HS110)
========================================
Get Realtime Current and Voltage Reading
{"emeter":{"get_realtime":{}}}

Get EMeter VGain and IGain Settings
{"emeter":{"get_vgain_igain":{}}}

Set EMeter VGain and Igain
{"emeter":{"set_vgain_igain":{"vgain":13462,"igain":16835}}}

Start EMeter Calibration
{"emeter":{"start_calibration":{"vtarget":13462,"itarget":16835}}}

Get Daily Statistic for given Month
{"emeter":{"get_daystat":{"month":1,"year":2016}}}

Get Montly Statistic for given Year
{"emeter":{""get_monthstat":{"year":2016}}}

Erase All EMeter Statistics
{"emeter":{"erase_emeter_stat":null}}


Schedule Commands
(action to perform regularly on given weekdays)
========================================
Get Next Scheduled Action
{"schedule":{"get_next_action":null}}

Get Schedule Rules List
{"schedule":{"get_rules":null}}

Add New Schedule Rule
{"schedule":{"add_rule":{"stime_opt":0,"wday":[1,0,0,1,1,0,0],"smin":1014,"enable":1,"repeat":1,"etime_opt":-1,"name":"lights on","eact":-1,"month":0,"sact":1,"year":0,"longitude":0,"day":0,"force":0,"latitude":0,"emin":0},"set_overall_enable":{"enable":1}}}

Edit Schedule Rule with given ID
{"schedule":{"edit_rule":{"stime_opt":0,"wday":[1,0,0,1,1,0,0],"smin":1014,"enable":1,"repeat":1,"etime_opt":-1,"id":"4B44932DFC09780B554A740BC1798CBC","name":"lights on","eact":-1,"month":0,"sact":1,"year":0,"longitude":0,"day":0,"force":0,"latitude":0,"emin":0}}}

Delete Schedule Rule with given ID
{"schedule":{"delete_rule":{"id":"4B44932DFC09780B554A740BC1798CBC"}}}

Delete All Schedule Rules and Erase Statistics
{"schedule":{"delete_all_rules":null,"erase_runtime_stat":null}}


Countdown Rule Commands
(action to perform after number of seconds)
========================================
Get Rule (only one allowed)
{"count_down":{"get_rules":null}}

Add New Countdown Rule
{"count_down":{"add_rule":{"enable":1,"delay":1800,"act":1,"name":"turn on"}}}

Edit Countdown Rule with given ID
{"count_down":{"edit_rule":{"enable":1,"id":"7C90311A1CD3227F25C6001D88F7FC13","delay":1800,"act":1,"name":"turn on"}}}

Delete Countdown Rule with given ID
{"count_down":{"delete_rule":{"id":"7C90311A1CD3227F25C6001D88F7FC13"}}}

Delete All Coundown Rules
{"count_down":{"delete_all_rules":null}}


Anti-Theft Rule Commands (aka Away Mode) 
(period of time during which device will be randomly turned on and off to deter thieves) 
========================================
Get Anti-Theft Rules List
{"anti_theft":{"get_rules":null}}

Add New Anti-Theft Rule
{"anti_theft":{"add_rule":{"stime_opt":0,"wday":[0,0,0,1,0,1,0],"smin":987,"enable":1,"frequency":5,"repeat":1,"etime_opt":0,"duration":2,"name":"test","lastfor":1,"month":0,"year":0,"longitude":0,"day":0,"latitude":0,"force":0,"emin":1047},"set_overall_enable":1}}

Edit Anti-Theft Rule with given ID
{"anti_theft":{"edit_rule":{"stime_opt":0,"wday":[0,0,0,1,0,1,0],"smin":987,"enable":1,"frequency":5,"repeat":1,"etime_opt":0,"id":"E36B1F4466B135C1FD481F0B4BFC9C30","duration":2,"name":"test","lastfor":1,"month":0,"year":0,"longitude":0,"day":0,"latitude":0,"force":0,"emin":1047},"set_overall_enable":1}}

Delete Anti-Theft Rule with given ID
{"anti_theft":{"delete_rule":{"id":"E36B1F4466B135C1FD481F0B4BFC9C30"}}}

Delete All Anti-Theft Rules
"anti_theft":{"delete_all_rules":null}}

Wenn Du das in ein PHP Modul umbauen willst nutzt Du einfach einen IP Symon Socket UDP oder Clientsocket je nachdem wie das Gerät genau kommuniziert (UDP oder TCP/IP).
Als Grundlage für den Datenfluss kannst Du mit dem PHP Modul Dataflow Generator arbeiten der erleichtert es Dir vielleicht die passenden Einträge für ein PHP Modul zu erstellen.

Bei Deinen Skript musst Du zunächst nur alle notwendigen Funktionen ergänzen in der Form


function SendCommand($command)
{
	$sock   = connectToSocket();
    sendToSocket($command, $sock);
	$buf    = getResultFromSocket($sock);
	$result = json_decode(decrypt($buf));
	socket_close($sock);
	return $result;
}

#########################################################################################################################################
# Command to Send: {"system":{"get_sysinfo":{"err_code":0,"sw_ver":"1.1.4 Build 170417 
# Expexted answer: Rel.145118","hw_ver":"1.0","type":"IOT.SMARTPLUGSWITCH","model":"HS110(EU)","mac":"70:4F:57:1B:DD:C1","deviceId":"8006E91F9E48110F07356B2A68FBF29018EC5159","hwId":"45E29DA8382494D2E82688B52A0B2EB5","fwId":"851E8C7225C3220531D5A3AFDACD9098","oemId":"3D341ECE302C0642C99E31CE2430544B","alias":"Egon","dev_name":"Wi-Fi Smart Plug With Energy Monitoring","icon_hash":"","relay_state":1,"on_time":22954,"active_mode":"schedule","feature":"TIM:ENE","updating":0,"rssi":-45,"led_off":0,"latitude":48.123456,"longitude":11.123456}}}
function GetSystemInfo()
{
	$command = '{"system":{"get_sysinfo":{}}}';
	$result = $SendCommand($command);
	return $result;
}

// Get Realtime Current and Voltage Reading
#########################################################################################################################################
# Command to Send: '{"emeter":{"get_realtime":{}}}'
# Expexted answer: {"emeter":{"get_realtime":{"current":0.151818,"voltage":231.747099,"power":20.172881,"total":2.597000,"err_code":0}}}
function GetCurrentVoltage()
{
	$command = '{"emeter":{"get_realtime":{}}}';
	$result = $SendCommand($command);
	return $result;
}

// Power On
function PowerOn()
{
	$command = '{"system":{"set_relay_state":{"state":1}}}';
	$result = $SendCommand($command);
	return $result;
}

// Power Off
function PowerOff()
{
	$command = '{"system":{"set_relay_state":{"state":0}}}';
	$result = $SendCommand($command);
	return $result;
}

$result = GetSystemInfo();
if($debug) {
	echo " --> Message received successfully - Lenght: " . strlen($buf) . " - decrypt:
" . decrypt($buf) . "
";
	print_r((array) json_decode(decrypt($buf)));
	$result->system->get_sysinfo->model . " - ". $result->system->get_sysinfo->alias . " - " . $result->system->get_sysinfo->relay_state . " (1 = on / 0 = 0ff) - Values: ";
}
SetValueBoolean($varS, (bool) $result->system->get_sysinfo->relay_state);



$result = GetCurrentVoltage();
if($debug) {
	echo " --> Message received successfully - Lenght: " . strlen($buf) . " - decrypt:
" . decrypt($buf) . "
";; 
	print_r((array) json_decode(decrypt($buf)));
	echo $result->emeter->get_realtime->voltage . "V / " . $result->emeter->get_realtime->current . "A / " . $result->emeter->get_realtime->power . "W";
}
SetValueFloat($varV, $result->emeter->get_realtime->voltage);
SetValueFloat($varA, $result->emeter->get_realtime->current);
SetValueFloat($varP, $result->emeter->get_realtime->power);
if($debug) IPS_LogMessage("TestScript","Fertig");

Dein Skript was Du zyklisch ausführst ist dann halt ein extra Skript in dem Du das Skript mit allen Funktionen per include einbindest.
Das gleiche Vorgehen dann für alle anderen Befehle jeweils das Hauptskript mit den Funktionen includen und dann die Funktion aufrufen im Fall vom Einschalten in dem Fall also


PowerOn();

Der Rest ist reine Abtipparbeit für jeden vorhandenen Befehl eine Funktion zu erstellen die Du dann aufrufen kannst. Die Befehle dazu s.o. sind ja alle bekannt.

Hier hab mal ein PHP Modul zum Schalten und Auslesen der Werte gebastelt.
IPSymconTPLinkHS110

LOL ich hatte das auch bereits weiter gebastelt nur bisher noch nicht dazu gekommen es vernünftig zu dokumentieren … super so spart man sich Arbeit, man ist ja von Haus aus faul :smiley:

Aber mal so als Frage in die Runde (nicht böse gemeint), ist es hier bei IPS so üblich wenn man den Code anderer mit nutzt (auch wenn GNU) keine Info dazu zu schreiben ? Es wurde ja sogar meine MAC Adresse mit kopiert ^^

Ansonsten, Current ist Strom

$this->RegisterVariableFloat("Current", "Aktuell", "~Watt.3680", 4);
SetValueFloat($this->GetIDForIdent("Current"), floatval($result->emeter->get_realtime->current));

das sollte ~Ampere als Standardprofil nutzen und nicht ~Watt.3680

Ne hast Du recht war auf die Schnelle runtergetippt, ich werde noch als Quelle auf Dich und den Ansatz verweisen. Ansonsten kannst Du gerne den Repository forken und Änderungen hinzufügen und einen Pull Request erstellen.

Macht es aus Deiner Sicht Sinn Timer aus IP-Symcon zu modifizieren bzw. was brauchst Du so noch an weiteren Informationen in Variablen?

Bessere ich später mal mal aus.

Also ich brauche weiter nichts, bei mir passt alles so wie es ist (nutze noch meine Version welche nur schaltet und ausliest, also mit weniger Funktionen als Deine Version)

Macht es aus Deiner Sicht Sinn Timer aus IP-Symcon zu modifizieren

Wie meinst Du das ? Das Intervall über WebFront änderbar machen ? Wieso nicht, man sollte es nur nie zu kurz wählen, ist bei den Pull Sachen ja immer so ein Problem

Schalten tut die Dose ja auch so, der einzige Vorteil die Skripte abzulösen wäre höchstens das das Gerät ja in IP-Symcon zur Verfügung steht sobald das PHP Modul eingebunden ist und Du daher die Methoden einfach aufrufen kannst, auch bei Ereignissen, ohne jedes mal auf Skripte verweisen zu müssen.

Dies habe ich noch korrigiert und zusätzlich erweiterte Geräte Informationen im Konfigurationsformular ergänzt.

Ja wo Du recht hast hast Du recht ^^

Bringt mich da glatt auch wieder auf eine Idee (sobald die restlichen Xiaomi Teile da sind) beim Öffnen der Terrarientür im Dunkeln das Licht an zuschalten bzw es nicht aus zu schalten wenn die Tür noch offen ist.

Btw super Anleitung :slight_smile:

Hi Nisbo, Hi Fonzo,

script klappt super. Aber wie kann ich z.b. 3 Dosen über script gleichzeitig anschalten ?

Einfach mit dem Skript für jede Instanz (Steckdose) die passende Methode aufrufen.


$id1 = 12345; // ObjektID Steckdose 1
$id2 = 23456; // ObjektID Steckdose 2
$id3 = 34567; // ObjektID Steckdose 3
TPLHS_PowerOn($id1);
TPLHS_PowerOn($id2);
TPLHS_PowerOn($id3);

wo finde ich die ID … im IPS5 sehe ich die hinter der Variable nicht

Die steht unübersehbar ganz links im Objektbaum :). Und Du willst nicht die ObjektID der Variable, sondern immer die der Instanz, den Du sagst ja dem Gerät was zu tun ist nicht der Variable, die ist nur das Anzeigeinstrument bzw. Speicher für den Zustand. Wenn Du im Skript STRG+O drückst bekommst Du den Objektbaum angezeigt dann kannst Du die passende Instanz auswählen.

ja du hast recht… Bin blind :smiley: