Hallo,
ich habe mich heute auch einige Zeit damit beschäftigt. Es gibt ein Python Programm, welches folgende Daten an die Steckdose (in meinem Fall MSS210) sendet. Dabei MUSS der anschließend verwendete mqtt Server ssl unterstützen (also ggf. eine 2. Instanz mit SSL in Symcon aktivieren).
return request.post({
url: `http://${this.host}/config`,
headers: {
'Content-Type': 'application/json'
},
json: payload
Setting up device with IP 10.10.10.1
Setting MQTT servers [ { host: '192.168.102.6', port: '1025' } ]
sending payload { header:
{ method: 'SET',
namespace: 'Appliance.Config.Key',
messageId: '43f912a3efa0c7b366850ecbba72b5f0',
timestamp: 1608323115,
sign: '1033fc35f729ba4cb32b545b128ef5dd' },
payload:
{ key:
{ gateway: { host: '192.168.102.6', port: '1025' },
key: '',
userId: '' } } }
sending payload { header:
{ method: 'SET',
namespace: 'Appliance.Config.Wifi',
messageId: '24e5321a735a25d739e2328fb3415c7d',
timestamp: 1608323115,
sign: '31955b65d3c4214fc916aebf40030e34' },
payload:
{ wifi: { ssid: 'base64SSID', password: 'base64pwd' } } }
Got response: { header:
{ messageId: '24e5321a735a25d739e2328fb3415c7d',
namespace: 'Appliance.Config.Wifi',
method: 'SETACK',
payloadVersion: 1,
from: '/appliance/1907186973974025184948e1e9014e52/publish',
timestamp: 863,
timestampMs: 937,
sign: '1fadb10a44f8d418be77e293d8833d4c' },
payload: {} }
Meross/bin/src at master · bytespider/Meross · GitHub
Es kommen Daten per MQTT an, die sehen z.B. so aus:
{
"header":{
"messageId":"3d573703ad22ffe3e96dc3eec65f9f52",
"namespace":"Appliance.System.Report",
"method":"PUSH",
"payloadVersion":1,
"from":"/appliance/1907186973974025184948e1e9014e52/publish",
"timestamp":1608342572,
"timestampMs":988,
"sign":"16818ec6397d10f217d143e7849b1c8f"
},
"payload":{
"report":[
{
"type":"1",
"value":"0",
"timestamp":1608342572
}
]
}
Oder beim Schalten der Dose lokal am Gerät:
{
"header":{
"messageId":"517b702e59a9abb4f61422b72e0ccdaf",
"namespace":"Appliance.Control.ToggleX",
"method":"PUSH",
"payloadVersion":1,
"from":"/appliance/1907186973974025184948e1e9014e52/publish",
"timestamp":1608344143,
"timestampMs":180,
"sign":"3fce399b0b2132e6cdcaf861cb7ff2b7"
},
"payload":{
"togglex":[
{
"channel":0,
"onoff":1,
"lmTime":1608344142
}
]
}
Update: Folgender Code schaltet entsprechend die Steckdose, jenachdem ob onoff auf 0 (aus) oder 1 (ein) steht.
{
"header":{
"messageId":"cce65df4cd510c03e724f755bea01635",
"namespace":"Appliance.Control.ToggleX",
"method":"SET",
"payloadVersion":1,
"from":"/appliance/1907186973974025184948e1e9014e52/subscribe",
"timestamp":1608379343,
"sign":"a76c960ab1cf55497c257b7f8434ed6a"
},
"payload":{
"togglex":{
"channel":0,
"onoff":1
}
}
}
Folgende Lektüre kann ich anbieten:
Interaktion mit der Meross Cloud (für uns vmtl nicht so spannend, nur der Vollständigkeit halber)
GitHub - albertogeniola/MerossIot at 49a73e3c631ad6f5851c5933b00c40b1598f2ebb
Node-Red Implementierung, vmtl auch für lokalen mqtt Server, u.a. wird dort vmtl der selbe json Code zum erstmaligen Umbiegen ins Lokale Netz generiert, wie durch das ganz oben verlinkte Python script.
Meross-Node-Red-Comm/flows.json at V-3.00 · shodge12/Meross-Node-Red-Comm · GitHub
Programmcode, welcher relativ leicht verständlich ist und mit der Cloud kommuniziert. Hier habe ich den von mir generierten Payload hergeleitet:
meross-cloud/index.js at master · Apollon77/meross-cloud · GitHub
Thema Key, aus dem die Signatur berechnet wird, dieser wird durch das Python-Script in der Dose auf ‚leerstring‘ initialisiert. Und ist daher in der weiteren Berechnung nicht relevant.
Erste Versuche in Symcon:
<?php
function generateRandomString($length) {
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$len = strlen($chars)-1;
$nonce = '';
for($i=0;$i<$length;$i++){
$nonce .= $chars[rand(0,$len)];
}
return $nonce;
}
function generate_message($payload, $uid){
$messageId = md5(generateRandomString(16));
$timestamp = time();
$key = '';
$signature = md5($messageId . $key . $timestamp);
$header = array("header" => array(
"messageId" => $messageId,
"namespace" => "Appliance.Control.ToggleX", /*ToggleX*/
"method" => "SET",
"payloadVersion" => 1,
"from" => "/appliance/".$uid."/subscribe",
"timestamp" => $timestamp,
"sign" => $signature
),
"payload" => $payload
);
$data = json_encode($header);
$data = str_replace("\\/", "/", $data);
$data = str_replace('\"', '"', $data);
return $data;
}
function setOnOff($type, $uid, $socket = 16957){
$onoff = ($type) ? 1 : 0;
$message = generate_message(array(
"togglex" => array(
"channel" => 0,
"onoff" => $onoff
)), $uid);
RequestAction($socket, $message);
}
$uid = "1907186973974025184948e1e9014e52";
setOnOff(true, $uid);
Vielleicht hilft das schonmal jemandem.