Xiaomi Smart Home Gateway

Ich vermute mal das PW muss dann ins JSON mit rein


{
	"cmd": "write",
	"sid": "34ce008c0221",
	"model": "gateway",
	"password": "fufhsufhdsfusafhdsf",
	"data": {
		"rgb": 1694433296
	}
}

ansonsten ist es durchaus üblich JSON Objekte im JSON zu haben

Was auch vorher sein kann das man sich authentisieren muss und dann mit dem Token arbeiten muss, der Token selbst ist kein Passwort

Evtl für Dich interessant:

Was soll ich mit dem Link? Das macht meine IDE :wink:
Klar kann man das verschachteln, das JSON encodierte Objekt ist ja nur noch ein weiter String.
Andere gehen den Weg aber konsequent (z.B. Kodi mit deren JSON-RPC, oder yeelight) und lassen die Nutzdaten als Objekt und nicht als Json-String, so wie Xiaomi hier.
Michael

Ne IDE die JSON automatisch einrückt/formatiert ? Cool, bei mir muss ich das immer nervig von Hand machen, egal ob bei PHP oder Java

Sonst würde mich glaube ich wahnsinnig werden. IPS Module brauchen ja auch diverse Files mit JSON.
Ich wühle mich gleich noch durch andere Implementierungen von dem Gateway, irgendwas werde ich da schon finden.
Michael

Den Zusammenhang zwischen Password, Token und zu sendenden Key habe ich inzwischen. Allerdings wird das heute nix mehr. Ist doch etwas komplizierter.
Hat überhaupt schon jemand irgendwas steuern können ? Also außer dem Gateway.
Licht oder Aktoren ?
Michael

Ja ich, den Button, funktioniert problemlos (auch die Doppelklick-Funktion)
Licht kommt erst nach Weihnachten…

Gesendet von iPhone mit Tapatalk

Äh… der Button ist noch nur um das Ereignis in IPS zu empfangen, oder ?
Kannst du den aus IPS heraus ansteuern :confused:

Michael

Ja das stimmt hab mich da vom Webfront täuschen lassen, aber das abfangen bzw verwenden der 4 Aktionen funktioniert wie es soll…

Gesendet von iPhone mit Tapatalk

Das dauert länger als Erwartet, da ich nur ein Beispiel habe und erst prüfen muss ob die benötigte encryt Funktion auch später in PHP 7 funktioniert :frowning:

Der Hinweis hier, deute ich so dass man die Prüfung aber abschalten kann:

When the encription mode is active in the gateway, it will verify the legitimacy of the write command using the „key“

Kannst du bitte mal prüfen ob dieser Modus ausgeschaltet werden kann und es dann funktioniert ?
Habe auch ein Update online für die anderen Fehler (Helligkeit bin ich noch unschlüssig ob es nun 0 - 100 oder 0 - 128 ist.)

Bitte einmal prüfen :slight_smile:

Die Variable Lux kannst du löschen, dafür kommt jetzt Illumination.

Was mich noch immer wundert, ist dass es im WebFront keine Bedienung (Standardaktion) für brightness und rgb gibt :confused:
Michael

Der Hinweis hier, deute ich so dass man die Prüfung aber abschalten kann:
Kannst du bitte mal prüfen ob dieser Modus ausgeschaltet werden kann und es dann funktioniert ?

In der APP ist nichts zu sehen oder ich bin nur blind

Habe auch ein Update online für die anderen Fehler (Helligkeit bin ich noch unschlüssig ob es nun 0 - 100 oder 0 - 128 ist.)

Bitte einmal prüfen

Mit dem Standardprofil ~Intensity…255 werden jetzt bei 100% nur 78% angezeigt, wenn ich auf das Profil ~Intensity.100 gehe (was vorher ging) werden jetzt 200% angezeigt.

Die Variable Lux kannst du löschen, dafür kommt jetzt Illumination.

Lux hatte ich vorher nicht, nur Brightness, das wird auch jetzt wieder erstellt
Steuern über Webfront geht nicht

Update habe ich unter Module natürlich gemacht, Device vorher gelöscht und neu eingefügt

Brauchst nicht löschen und neu anlegen. Der neue Code ist immer sofort aktiv.
Kannst du mit bitte einmal die Werte von RGB aus dem Debug geben, wenn in der App 0, 50 und 100% eingestellt werden?
Andere Implementierungen sind da auch irgendwie schwer zu verstehen, da wird noch mal plus minus 100 gerechnet oder gar nicht :confused:

Und das mittendrin einfach das Model laut Debug fehlt, scheint auch ein Fehler zu sein. Laut dem Splitter sieht das empfangene korrekt aus…
Dafür fehlt beim senden aktuell der Key, okay klar.
Aber auch der String im Data ist wohl einmal zuviel escaped… Grummel… Mistding :smiley:

Mhhh, ich glaube ich muss wenn ich Mal ein paar Euro über habe mir doch das Zeug zulegen :wink:
Michael

0, 50 und 100

Ach Du hast das gar nicht ^^
Das Teil ist aber eigentlich voll toll, Türgong und LED Anzeige für den Preis

Ich habe wegen dem Passwort mal weiter geschaut, so geht das in Perl
password, it must be hex and 16 characters

sub XiaomiSmartHome_EncryptKey($)
{
	my ($hash) = @_;
	my $name = $hash->{NAME};
	if ( $hash->{READINGS}{password}{VAL}  =~ /^[a-zA-Z0-9]{16}$/ ) {
		my $key = $hash->{READINGS}{password}{VAL};
		my $cipher = Crypt::CBC->new(-key => $key, -cipher => 'Cipher::AES',-iv => $iv, -literal_key => 1, -header => "none", -keysize => 16 );  
		my $encryptkey = $cipher->encrypt_hex($hash->{READINGS}{token}{VAL});
		$encryptkey = substr($encryptkey, 0, 32);	
		return $encryptkey;
		}
	else
		{
		Log3 $name, 1, "$name: EncryptKey> Password not SET!";
		}
	return undef;
}

RGB Query

$msg  = '{"cmd":"write","model":"gateway","sid":"' . $hash->{SID} . '","short_id":0,"key":"8","data":"{\"rgb\":' . $val . ',\"key\":\"'. XiaomiSmartHome_EncryptKey($hash) .'\"}" }';

Hier der ganze Code
https://raw.githubusercontent.com/T0RST3N/fhem-XiaomiSmartHome/master/FHEM/71_XiaomiSmartHome.pm

Ahhrg… den Screenshot irgendwie übersehen.
Das werde ich mir nachher noch ansehen und dann ändern im Modul.

Ja, ich mache das komplett ohne Hardware, also nur Tockenübungen ^_^;

Jetzt ist erstmal das Update mit dem Passwort online !
Dies ist im Splitter einzutragen.

Im Debug vom Splitter sollte auch der Token empfangen werden, und der Key beim schalten zu sehen sein.

Hoffe die Fehler mit no Data und no Key sind dann weg :slight_smile:

Bessere Fehlerbehandlung (Ausgabe der Meldungen vom Gateway) und das mit der Helligkeit dann hoffentlich heute Abend :slight_smile:

Michael

Ich auch… aber eine andere Quelle:
lumi-gateway-local-api/device_read_write.md at master · illxi/lumi-gateway-local-api · GitHub


$Key = openssl_encrypt(
                    $this->Token,
                    "AES-128-CBC",
                    $this->ReadPropertyString('Password'),
                    OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,
                    hex2bin("17996D093D28DDB3BA695A2E6F58562E")
                    );

So bekomme ich auch den Key aus dem Beispiel auf GitHub.
Sollte also laufen.
Michael

einfach nur aktualisieren oder muss das alte vorher gelöscht werden ?

Nur Update machen im Modul Control.
Anschließend den Splitter öffnen und Passwort eintragen.
Michael

Bevor ich das mache, noch eben eine Frage:
Hast du zwei Netzwerkkarten oder zwei IP-Adressen auf deinem IPS-Host?
Weil die Pakete ja immer doppelt eintreffen?!
Michael

Nee das ist ein Intel NUC der hat nur einen LAN

So neue Version, nach dem Anlegen des Devices (über dem Konfigurator) steht nicht „gateway“ dabei, wenn man im Device dann auf Read Values klickt wird das gateway ergänzt.

Wenn ich jetzt was übers Script schicken will

$Id = 53974 /*[Xiaomi\Xiaomi Device]*/;
$Ident = "rgb";
$Value = 16711696;
XISMD_WriteValueInteger($Id, $Ident, $Value);

$Ident = "brightness";
$Value = 100;
XISMD_WriteValueInteger($Id, $Ident, $Value);

bekomme ich

Notice:  model not set in C:\IP-Symcon\modules\Xiaomi-Smart-Home\XiaomiSHDevice\module.php on line 303

Das Passwort in der App lautet: paia1avyv5ceuzyw