Smart Home IdOTy
Smart Home IdOTy
WLAN Steckdosen (ICOMEN)
Brandname:
-ALDI EASY HOME - WLAN STECKDOSENSE
DIS-120 WIFI Adapter // smart2connect 48170 Hauptgerät
DIS-119 Funkadapter // smart2connect 48171 Innensteckdose
DIS-124 Funkadapter (IP44) // smart2connect 48172 Außensteckdose
-CSL - Wifi Smart Steckdose | Wlan Steckdose
-Ednet 84290/84291/84292 ?
-MEDION (MD 16173) Intelligente Steckdose mit Funksteckdosen-Set (WLAN, 433, App)
-SILVERCREST Wi-Fi-Steckdose SWS A1
-CASAcontrol Smart-Home-Systeme Basis-Station Smart Wi-Fi Pearl??
Ansteuerung der Dosen mit Pyhon / Bash / PHP
WLAN
Wenn die Sammlung fertig ist, wirds schöner ;-)
Sammlung der Daten zum Ansteuern (Stand und Hardware 11/2016)
Ansteuerung der WLAN Basis über WLAN/LAN
--> Danke an die Coder im FEHM Forum :-)
Sammlung:
UDP Port: 8530
Webinterface WLAN Basis:
Zugriff über Browser: <Your-IP>:<UDP Port>
User: admin Passwort: admin
PROTOKOLL:
0140MACMACMACMAC1012345678901234567890123456789012
01 (2 Stellen hex constant)
40 (2 Stellen 40hex=64dez oder 44hex=68dez ; dritte Stelle 4 = verschlüsselt)
MAC (12 Stellen Hex)
10 (2 Stellen Datenlänge = mir unklar )
Daten (Verschlüsselt mit AES128/CBC/NoPadding mit Schlüssel "0123456789abcdef“)
Beispieldaten 32 Stellen: 6eed72d95f2db03b82d5662e0a603424 # verschlüsselter Content
Content crypted: (6eed72d95f2db03b82d5662e0a603424)
Content encrypted: (0000D5C21192DD010000FFFF04040404)
WIFI Dose:
0x00 # CONSTANT
0x00D5 # Paketzähler
0xC2 # CompanyCode Lidl (SilverCrest): C1, Aldi (EasyHome): C2
0x11 # deviceType
0x92DD # authCode Lidl (SilverCrest): 7150, Aldi (EasyHome):92DD
0x01 # set
0x0000FFFF # state (0000FFFF: ON, 000000FF: OFF)
0x04040404 # padding (ignore)
RF SLAVE Dose:
0x00 # CONSTANT
0xFFFF # Paketzähler
0xC? # CompanyCode Lidl (SilverCrest): C1, Aldi (EasyHome): C2
0x11 # deviceType
0x92DD # authCode Lidl (SilverCrest): 7150, Aldi (EasyHome):92DD
0x08 # set RF / 433 Slave
0x?????? # RF Adresse 3 Byte
0xYZ # Y: 6 = Ein, 7 = AUS ; Z: 0 für Schalter, 1-9 für Dimmerlevel?
-> Paketzähler, es werden nur Paketnummern akzeptiert, die höher sind als die Letzte.
Die Reverseentwickler haben herausgefunden, dass die Pakete immer akzeptiert werden, wenn man die höchste mit 0xFFFF sendet. Der Zäher startet dann wieder bei 0x0001 - die Bedingung größer dem letzten ist erfüllt.
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import time
#Deine MAC-Adresse
mac = '00 95 69 a7 31 28'
# Befehle verschluesselt mit AES128//
on = '10 5B 94 D4 2E F5 C0 1E 30 2B 1B 7C B7 A7 D8 EA B0'
off = '10 66 30 bc fe 88 83 0c b4 ee ab 4a 78 43 56 ab 9f'
#
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.connect(('192.168.0.178', 8530)) # (IP, Port) is a single variable passed to connect function
s.send(bytearray.fromhex('01 40' + mac + on)) # to switch 'on'
time.sleep(5) # sleep for 5 seconds
#s.send(bytes.fromhex('01 40' + mac + off)) # to switch 'off'
#time.sleep(5)
Bash-Shell:
#!/bin/bash -x
# WiFi Dose ein / on
echo -n "0140009569a73128105b94d42ef5c01e302b1b7cb7a7d8eab0" | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie' | nc -u -w1 192.168.0.178 8530
#!/bin/bash -x
# WiFi Dose aus /off
echo -n "0140009569a73128106630bcfe88830cb4eeab4a784356ab9f" | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie' | nc -u -w1 192.168.0.178 8530
# Slave-Dose(x)
Hier ist die bei Dosenanmeldung generierte sechsstellige Hexadresse nötig
Nötige Anpassungen / ToDo:
MAC (Beispiel 009569a73128)
IP (Beispiel192.168.0.178) am Schluss.
LInks:
http://www.fhemwiki.de/wiki/Silvercrest_SWS_A1_Wifi
https://forum.fhem.de/index.php/topic,57612.15.html
https://forum.fhem.de/index.php/topic,38112.0.html
Ein Teardown im FHEM Forum von User Norbert-Walter
https://forum.fhem.de/index.php/topic,57612.15.html
Foto: User Norbert-Walter, tj
PHP Code zum Schalten der Dosen über das Netzwerk
Scriptname: plugswitch.php
Code von SebiM
Erforderlich PHP5 mit MCrypt Modul (AES-Verschlüsselung)
-> Aufruf mit: php plugswitch.php <on|off>
Was macht das Script:
Es erstellt mit den eigenen Daten die Schaltanweisung für die WLAN oder RF(433Mhz) Dosen
Erforderliche Anpassung im Code:
IP-Adress der WLAN-Dose ($ip)
MAC-Adresse der WLAN-Dose ($mac)
Optional Code der Slave-Dose: ($rfslave) --> Siehe Script wifiplug-cloudfetch.php
#!/usr/bin/php
<?php
// 2016 Sebi, public domain
// Insert your WiFi plug data here // Daten der eigenen WiFi-Funksteckdose hier eintragen
$ip = '192.x.x.x';
$mac = '1234567890AB';
$code = 'c21192dd';// Company code + device code + auth code
// Comment out the following line for WiFi plug switching instead of RF slave plug switching
// Folgende Zeile zum Schalten der WiFi-Dose selbst anstatt einer RF-Slave-Dose auskommentieren
$rfslave = '123ABC';
if ($argc != 2) {
echo "Usage: $argv[0] on|off\n";
exit(1);
}
function encodePacket($packet) {
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key = '0123456789abcdef';
mcrypt_generic_init($td, $key, $key);
$result = mcrypt_generic($td, $packet);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $result;
}
$msg = hex2bin("0140{$mac}10");
if (isset($rfslave)) {
if ($argv[1] == 'on') {
$value = '60';
} else if ($argv[1] == 'off') {
$value = '70';
} else {
exit(2);
}
$msg .= encodePacket(hex2bin("00ffff{$code}08{$rfslave}{$value}04040404"));
} else {
if ($argv[1] == 'on') {
$value = 'ff';
} else if ($argv[1] == 'off') {
$value = '00';
} else {
exit(2);
}
$msg .= encodePacket(hex2bin("00ffff{$code}010000{$value}ff04040404"));
}
echo 'UDP packet: ' . bin2hex($msg) . "\n";
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
for ($i = 0; $i < 4; $i++) {
socket_sendto($sock, $msg, strlen($msg), 0, $ip, 8530);
usleep(50 * 1000);// 50 ms
}
socket_close($sock);
Ich möchte mich besonders bei User SebiM aus dem FHEM-Forum für seine großartig Unterstützung bedanken.
Allerdings nicht nur für die großartige Programierleistung sondern besonders für seinen freudlichen Umgang wenn
es mal hakt, das ist leider nicht mehr der Regelfall. (Und ich weiß wo die FAQ zu suchen ist ;-))
Strukturbild Zur Verwendung der WLAN Dosen.
PHP Code zum Auslesen der Daten der Orginal Handyanwendung auf http://smart2connect.yunext.com
Scriptname: wifiplug-cloudfetch.php
Code von SebiM
Was liefert die Abfrage zurück:
-> Zugewiesene RF Adresse der 433 MHz Dosen
-> Zuordnung der Scenerie / Bilder
-> Erforderlich Username und Passwort
-> Aufruf mit: php wifiplug-cloudfetch.php <Username> <Passwort>
#!/usr/bin/php
<?php
// Request device data for Aldi & Lidl WiFi & RF plugs from cloud
// 2016 SebiM, can be considered as public domaif
if ($argc != 3) {
echo "Usage: $argv[0] <Username> <Password>\n";
exit(1);
}
function getJSON($path) {
global $argv;
$accessKey = 'Q763W08JZ07V23FR99410B3PC945LT28';
$username = urlencode($argv[1]);
$password = strtoupper(md5($argv[2]));
$URLPrefix = 'http://smart2connect.yunext.com';
$f = file_get_contents("$URLPrefix$path?accessKey=$accessKey&username=$username&password=$password");
/* Testing stuff...
$lpath = str_replace('/', '_', $path);
file_put_contents($lpath, $f);
$f = file_get_contents($lpath);
*/
return json_decode($f);
}
function cmpOrderNumber($a, $b) {
return ($a->orderNumber < $b->orderNumber) ? -1 : 1;
}
$plugs = [];
$WiFiPlugCodesByMAC = [];
$f = getJSON('/api/device/wifi/list');
if (isset($f->success) && $f->success == 1) {
uasort($f->list, 'cmpOrderNumber');
foreach ($f->list as $plug) {
$code = $plug->companyCode . $plug->deviceType . $plug->authCode;
$plugs[$plug->deviceName] = ['mac' => $plug->macAddress, 'code' => $code];
$WiFiPlugCodesByMAC[$plug->macAddress] = $code;
}
}
$f = getJSON('/api/scene/wifi/list');
if (isset($f->success) && $f->success == 1) {
uasort($f->list, 'cmpOrderNumber');
foreach ($f->list as $plug) {
$plugs[$plug->deviceName] = [
'mac' => $plug->macAddress,
'code' => $plug->companyCode . $plug->deviceType . $plug->authCode
];
}
}
$f = getJSON('/api/scene/rf/list');
if (isset($f->success) && $f->success == 1) {
uasort($f->list, 'cmpOrderNumber');
foreach ($f->list as $plug) {
$plugs[$plug->deviceName] = [
'mac' => $plug->macAddress,
'code' => $WiFiPlugCodesByMAC[$plug->macAddress],
'rfslave' => $plug->addressCode
];
}
}
echo json_encode($plugs, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);