Xiaomi WiFi Devices Modul (Vacuum/Airpurifier/Fan) - 72_XiaomiDevice (Support)

Begonnen von Markus M., 11 Juni 2017, 12:48:58

Vorheriges Thema - Nächstes Thema

B.Stromberg

Zitat von: Guenni1404 am 04 April 2021, 15:11:26
Könnte das senden  von Befehlen an den Reiskocher integriert werden.
Hier werden auch schon Programme gelistet. Wäre super wenn ich den Reiskocher so starten könnte und nicht die App dafür brauche.
https://raw.githubusercontent.com/rytilahti/python-miio/5730f535d4691e0c2b4260cd7835b7a43ddc8ab0/miio/data/cooker_profiles.json


Ein Start/Stop/Auswahl eines Programms über FHEM wäre super. Würde dann für die Standartprogramme nicht immer die App benötigen.

Hallo!
Hast du auch das Problem mit der Uhrzeit, dass diese 1 Std. falsch geht beim Reiskocher? Habe den 3 Liter Induktion mit Chinesischer Beschriftung.

B.Stromberg

Kann bitte kurz jemand sagen, ob mein Reiskocher nicht unterstützt wird?

Internals:
   DEF        192.168.2.33 1234567890
   FD         26
   FUUID      6142500f-f33f-4afb-1c6c-4a55314c0baa983f
   NAME       Reiskocher
   NR         297
   STATE      ???
   TYPE       XiaomiDevice
   hardware   esp32
   mac        54:48:E6:6B:63:8E
   model      chunmi.cooker.normalcd1
   token      1234567890
   wifi_firmware v4.0.1-476-g71f0ccb
   READINGS:
     2021-09-16 18:27:22   device_firmware 2.1.8_0008
     2021-09-16 18:27:22   device_uptime   5.70
     2021-09-16 18:27:28   error           none
     2021-09-16 18:27:22   wifi_rssi       -56
   helper:
     ConnectionState connected
     crypt      AES
     delay      60
     dev        1579
     id         3cf9
     ip         192.168.2.33
     last_read  1631809648
     packetid   4
     port       54321
     sequence   1631789133
     token      1234567890
     packet:
       1          device_info
       2          wifi_stats
       3          ricecooker_data
Attributes:
   subType    RiceCooker


Das Einzige was im Log steht ist:

2021-09-16 18:32:28 XiaomiDevice Reiskocher error: none

Dr. Smag

Wenn mir einer den Reiskocher mit einem frankierteren Rückschein oder so rüber schickt, versuche ich das Teil zu implementieren.
RPi1,2,3,HMLAN,HM,CC-RT-DN,HM-TC-IT-WM-W-EU,HM-LC-SW2-PB-FM,HM-LC-Sw1PBU-FM,HM-LC-Dim1TPBU-FM,HM-SEC-RHS,HM-SEC-KEY-S,HM-SEC-S,C, HM-OU-LED16,HM-ES-PMSw1-Pl,HM-RC-Dis-H-x-EU,HM-LC-SW4-DR,HM-RC-8,HM-OU-CFM-TW,HM-SEC-WDS, HM-PB-2-WM55,HM-Sen-MDIR-O,HM-Dis-WM55,HM-Dis-EP-WM55,HM-ES-PMSw1-Pl-DN-R1...

B.Stromberg

Achso, dachte der wäre schon drin??
Weil in der 72er pm finde ich zumindest Kommandos für einen Reiskocher.
Wohl nur nicht für diesen

B.Stromberg


B.Stromberg

Ne, ist nicht meins von Github


Aber der Ganze Kram ist doch eigentlich schon enthalten in der PM:

my %cooker_menus = ( '0000' => "None",
                     '0001' => "Cooking",
                     '0002' => "Quick cooking",
                     '0003' => "Rice porridge",
                     '0004' => "Heat preservation",
                     '0100' => "Personal settings" , );


my %cooker_stages = ( '00' => "Idle",
                      '01' => "Preheating",
                      '02' => "Water-absorbing",
                      '03' => "Boiling",
                      '04' => "Gelantinizing",
                      '05' => "Braising" , );

Dr. Smag

Die Geräte unterscheiden sich da von den Kommandos. Ich habe das beim SmartFan3 gemerkt.
Ich brauche die Response-Json von dem Gerät. Die sieht glaube ich anders aus. Muss ich mir morgen mal anschauen. Heute schaffe ich das nicht mehr.
RPi1,2,3,HMLAN,HM,CC-RT-DN,HM-TC-IT-WM-W-EU,HM-LC-SW2-PB-FM,HM-LC-Sw1PBU-FM,HM-LC-Dim1TPBU-FM,HM-SEC-RHS,HM-SEC-KEY-S,HM-SEC-S,C, HM-OU-LED16,HM-ES-PMSw1-Pl,HM-RC-Dis-H-x-EU,HM-LC-SW4-DR,HM-RC-8,HM-OU-CFM-TW,HM-SEC-WDS, HM-PB-2-WM55,HM-Sen-MDIR-O,HM-Dis-WM55,HM-Dis-EP-WM55,HM-ES-PMSw1-Pl-DN-R1...


Dr. Smag

Der Hase ist in der unten aufgeführten Sektion begraben. Da gibt es einen Block, wo gezielt in der JSON des Geräts zugegriffen wird.
Leider unterscheiden sich die Array-Positionen je nach Model. Das müsste man entsprechend als Model erweitern.

Der hier eigentlich dargestellte Block ist um einiges größer. Hier nur eine Zeile.


  if($msgtype eq "ricecooker_data")
  {
...
    readingsBulkUpdate( $hash, "func", $json->{result}[0], 1 ) if(defined($json->{result}[0]));
...
  }


Um den Datenverkehr mitzuschneiden, gibt es versch. Tools. Bei iOS habe ich den HTTP-Catcher installiert (da gibt es versch. Tools (Charles, Mitmproxy etc.)) und parallel die Xiaomi-App benutzt um an die Daten zu kommen, die notwendig sind.
RPi1,2,3,HMLAN,HM,CC-RT-DN,HM-TC-IT-WM-W-EU,HM-LC-SW2-PB-FM,HM-LC-Sw1PBU-FM,HM-LC-Dim1TPBU-FM,HM-SEC-RHS,HM-SEC-KEY-S,HM-SEC-S,C, HM-OU-LED16,HM-ES-PMSw1-Pl,HM-RC-Dis-H-x-EU,HM-LC-SW4-DR,HM-RC-8,HM-OU-CFM-TW,HM-SEC-WDS, HM-PB-2-WM55,HM-Sen-MDIR-O,HM-Dis-WM55,HM-Dis-EP-WM55,HM-ES-PMSw1-Pl-DN-R1...

B.Stromberg

Mag leider keine Äpfel. Hast du da was für Android?
Sag mir dann genau was du brauchst.
Den Sniffer an und dann einmal alle Funktionen auswählen und loggen?

Dr. Smag

Ne, eigentlich wirft das Teil ein Json zurück, welches die komplette Struktur liefert. Besser gesagt die verschachtelten Daten, wo man sie dann findet und was die für Parameter erwarten. Und entprechend der gefüllten Daten.

Ich kann dir das aus Xiaomi-Copyright-Gründen hier nicht posten. Schicke Dir ne PM.
RPi1,2,3,HMLAN,HM,CC-RT-DN,HM-TC-IT-WM-W-EU,HM-LC-SW2-PB-FM,HM-LC-Sw1PBU-FM,HM-LC-Dim1TPBU-FM,HM-SEC-RHS,HM-SEC-KEY-S,HM-SEC-S,C, HM-OU-LED16,HM-ES-PMSw1-Pl,HM-RC-Dis-H-x-EU,HM-LC-SW4-DR,HM-RC-8,HM-OU-CFM-TW,HM-SEC-WDS, HM-PB-2-WM55,HM-Sen-MDIR-O,HM-Dis-WM55,HM-Dis-EP-WM55,HM-ES-PMSw1-Pl-DN-R1...

B.Stromberg


hkspks

Zitat von: JensS am 22 August 2021, 18:55:32
p.s. Habe eine Notlösung gebastelt und mit Hilfe von node-mihome ein kleines NPM-Modul inkl. MQTT-Anbindung geschrieben, welches als Service läuft.
Nun kann der Viomi S9 von FHEM (inkl. Rhasspy-Sprachsteuerung) über die Cloud gesteuert werden.

Cool, magst du teilen? Was kannst du damit alles ansteuern?

JensS

Zitat von: hkspks am 18 September 2021, 23:29:11
Cool, magst du teilen? Was kannst du damit alles ansteuern?
Gern, wie schon erwähnt läuft der Konnektor per NPM. Bin aber kein Programmierer und habe bestimmt etliche Fehler drin. Zumindestens läufts, solange FHEM nicht neu gestartet wird. Müsste noch eine Fehlerroutine rein.const mihome = require('/usr/local/lib/node_modules/node-mihome'); // "npm i node-mihome" -g erforderlich
const username = 'xxx@xxx.xxx'; // Zugangsdaten zur MiCLoud - Email
const password = '...'; // Zugangsdaten zur MiCLoud - Passwort
const optionen = { country: 'de' };
const deviceId = 'xxxxxxxxx'; // DeiviceId des Gerätes
var mqtt    = require('/usr/local/lib/node_modules/mqtt');
var count =0;
var test;
var client  = mqtt.connect("mqtt://192.168.100.2:1884",{clientId:"viomi"}); // MQTT-Server
var Methode = 'get_properties'; //
var Parameter = [{ "siid": 2, "piid": 1 }]; // Status-Ids beim Viomi S9

// Loginfunktion in MiCloud
async function cloudlogin() {
await mihome.miCloudProtocol.login(username, password);
};
cloudlogin();

// Versand der Anweisung zur CLoud
async function cloud() {
anweisung = await mihome.miCloudProtocol.miioCall(deviceId, Methode, Parameter, optionen);
Reading = JSON.stringify(anweisung);
publish("viomi",Reading,options);
};

// Empfang der MQTT-Nachrichten von FHEM und Übergabe an den Versand
client.on('message',function(topic, message, packet){
var test = JSON.parse(message);
var key = Object.keys(test)[0];
var Value = Object.values(test)[0];
Methode = key;
Parameter = Value;
cloud();
});

// MQTT-Anmeldung
client.on("connect",function(){
});

// Exit bei Fehler
client.on("error",function(error){
client.on("connect",function(){}});

// Versand der MQTT-Nachricht an FHEM
function publish(topic,msg,options){

if (client.connected == true){
client.publish("viomisend",msg,options);
}
else
{
count+=1;
if (count==2) {cloudlogin()}; // Relogin bei 2 Fehlern
if (count==4) {// End bei 4 Fehlern
    clearTimeout(timer_id); //stop timer
    client.end();
};
};
};

var options={
retain:false,
qos:0};

var topic="xiaomi";
var message="test message";
client.subscribe(topic,{qos:1});
var timer_id=setInterval(function(){ },5000);


Dazu der Service:[Unit]
Description=Viomi Staub-Wischroboter
After=network.target

[Service]
Environment=NODE_PORT=3001
Type=simple
User=egon
ExecStart=/usr/bin/node /opt/viomi/index.js
Restart=on-failure

[Install]
WantedBy=multi-user.target


Hier ein paar setList:Status:noArg xiaomi {"get_properties": [{"siid": 2, "piid": 1}]}
SaugeAlles:noArg xiaomi {"action": {"siid":2,"aiid":1,"in":[]}}
WaehleZoneEsstisch:noArg xiaomi {"set_properties": [{"siid": 6, "piid": 2, "value":"1.6,-0.7,1.6,1.5,4.5,1.5,4.5,-0.7"}]}
SaugeRaum1und2:noArg xiaomi {"action": {"siid": 4, "aiid": 13, "in":[{"piid": 36, "value": 0}, {"piid": 37, "value": 1}, {"piid": 38, "value": "1,2"}]}}


Die Werte des Viomi S9 habe ich von https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:vacuum:0000A006:viomi-v18:1.

Der Empfang von Events steht noch auf der Liste und alle Map-Sachen mache ich mit dem Handy.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

FHEMbeta

Gibt es eine Möglichkeit die beiden folgenden Modelle zu integrieren: Roborock E4 und Roborock S7?

Der E4 funktioniert nicht (getestet mit korrektem Token), beim S7 erwäge ich einen Kauf. Bisher vorhandene Modelle Roborock S5/S50 und S5 Max funktionieren einwandfrei.