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

RappaSan

 :)
Eine dummy-variable:

define WasUsed dummy
attr WasUsed setList Ja Nein Entladen WaitForEntladen Geleert


columbine

Zitat von: RappaSan am 16 Oktober 2020, 08:45:30
:)
Eine dummy-variable:

define WasUsed dummy
attr WasUsed setList Ja Nein Entladen WaitForEntladen Geleert

Danke dir, aber welches Ereignis setzt den Status auf WasUsed Entladen?

Edit: Falls jemand es benötigt habe ich hier meine Configs:
Ich lasse mir auf Telegram verschiedene Nachrichten schicken u.a.wenn er fertig mit der Reinigung ist wie lange, wieviel m2 und wieviel Akku er verbraucht hat. Zusätzlich lasse ich mir nach jeder Reinigung einen Wartungsbericht schicken und sobald er auflädt und voll geladen ist, aber seht selbst, ich hoffe ihr könnt was damit anfangen! Mein Sauger kann ich auch mit Alexa steuern und habe das mit der HA-Bridge realisiert. Z.B: Alexa, starte Wohnzimmerreinigung. HA-Bridge sendet den Namen des Zimmers und ein start webcmd(http://192.168.1.48:8083/fhem?cmd.vacuum=setreading%20vacuum%20segment_zimmer%20Wohnzimmer und http://192.168.1.48:8083/fhem?cmd.vacuum=set%20vacuum%20segment%2017) an fhem mit dem segment welches er reinigen soll. Stoppen tue ich das ganze dann mit Alexa, beende Reinigung. Hab noch ein dummy erstellt damit nur 1 x am Tag bei Abwesenheit gesaugt wird, der um 0 Uhr zurückgesetzt wird. Gibt bestimmt bessere Lösungen, aber ich bin nur ein Laie deshalb bitte nicht aufregen oder dergleichen. Danke!

userReadings:
last_clean_time_zeit {my $hours=ReadingsNum($NAME,"last_clean_time",0); my $h=int($hours); my $m=int(($hours - $h)*60); $m="0".$m if ($m=~/^\d$/); "$h Stunden $m Minuten"},
total_clean_time_zeit {my $hours=ReadingsNum($NAME,"total_clean_time",0); my $h=int($hours); my $m=int(($hours - $h)*60); $m="0".$m if ($m=~/^\d$/); "$h Stunden $m Minuten"},
consumables_filter_verbraucht {my $zahl1=ReadingsNum($NAME,"consumables_filter",0); my $zahl2=100; $zahl2-$zahl1 . ""},
consumables_main_brush_verbraucht {my $zahl3=ReadingsNum($NAME,"consumables_main_brush",0); my $zahl4=100; $zahl4-$zahl3 . ""},
consumables_sensors_verbraucht {my $zahl5=ReadingsNum($NAME,"consumables_sensors",0); my $zahl6=100; $zahl6-$zahl5 . ""},
consumables_side_brush_verbraucht {my $zahl7=ReadingsNum($NAME,"consumables_side_brush",0); my $zahl8=100; $zahl8-$zahl7 . ""},
consumables_filter_zeit {my $zahl9=ReadingsNum($NAME,"consumables_filter",0); my $zahl10=150; $zahl9/100*$zahl10 . ""},
consumables_main_brush_zeit {my $zahl3=ReadingsNum($NAME,"consumables_main_brush",0); my $zahl4=300; $zahl4/100*$zahl3 . ""},
consumables_sensors_zeit {my $zahl5=ReadingsNum($NAME,"consumables_sensors",0); my $zahl6=30; $zahl6/100*$zahl5 . ""},
consumables_side_brush_zeit {my $zahl7=ReadingsNum($NAME,"consumables_side_brush",0); my $zahl8=200; $zahl8/100*$zahl7 . ""},
batteryPercent_verbraucht {my $zahl19=ReadingsNum($NAME,"batteryPercent_start",0); my $zahl20=ReadingsNum($NAME,"batteryPercent",0); $zahl19-$zahl20 . ""}


notify:
vacuum
{
if ($EVENT eq "Charging")
{
fhem "set teleBot msg @#SmartHome Sauger wird aufgeladen. \n\nAktueller Ladestand:\n- [vacuum:batteryPercent]%\nBatterie-Status:\n- [vacuum:batteryState]";
}
if ($EVENT eq "Docked")
{
fhem "set teleBot msg @#SmartHome Sauger ist zu [vacuum:batteryPercent]% aufgeladen.";
}
if ($EVENT eq "Paused")
{
fhem "set teleBot msg @#SmartHome Sauger macht eine Pause.";
}
if ($EVENT eq "Cleaning")
{
fhem "set teleBot msg @#SmartHome Sauger reinigt die Wohnung.";
fhem "setreading vacuum batteryPercent_start [vacuum:batteryPercent]";
}
if ($EVENT eq "Segment Clean")
{
fhem "set teleBot msg @#SmartHome Sauger reinigt [vacuum:segment_zimmer].";
fhem "setreading vacuum batteryPercent_start [vacuum:batteryPercent]";
}
if ($EVENT eq "Dock problem")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Problem an der Dockingstation.";
}
if ($EVENT eq "Device offline")
{
fhem "set teleBot msg @#SmartHome Sauger ist offline.";
}
if ($EVENT eq "Starting up")
{
fhem "set teleBot msg @#SmartHome Sauger startet.";
}
if ($EVENT eq "Sleeping")
{
fhem "set teleBot msg @#SmartHome Sauger geht schlafen.";
}
if ($EVENT eq "Waiting")
{
fhem "set teleBot msg @#SmartHome Sauger wartet auf Instruktionen.";
}
if ($EVENT eq "Remote control")
{
fhem "set teleBot msg @#SmartHome Sauger Remote.";
}
if ($EVENT eq "Returning to base")
{
fhem "set teleBot msg @#SmartHome Sauger ist fertig und fährt zurück zur Dockingstation. \n\nLetzte Reinigung:\n- [vacuum:last_clean_area] m² \n- [vacuum:last_clean_time_zeit]\n- [vacuum:batteryPercent_verbraucht]% Batterie verbraucht\n\nGesamtreinigung:\n- [vacuum:total_clean_area] m²\n- [vacuum:total_clean_time_zeit]\n- [vacuum:total_cleans] Reinigungen";
fhem "set teleBot msg @#SmartHome Sauger Wartungsbericht:\n\nFilter:\n- [vacuum:consumables_filter_verbraucht]% verbraucht\n- [vacuum:consumables_filter]% verbleibend\n- [vacuum:consumables_filter_zeit] Stunden verbleibend\n\nHauptbürste:\n- [vacuum:consumables_main_brush_verbraucht]% verbraucht\n- [vacuum:consumables_main_brush]% verbleibend\n- [vacuum:consumables_main_brush_zeit] Stunden verbleibend\n\nSeitenbürste:\n- [vacuum:consumables_side_brush_verbraucht]% verbraucht\n- [vacuum:consumables_side_brush]% verbleibend\n- [vacuum:consumables_side_brush_zeit] Stunden verbleibend\n\nSensoren:\n -[vacuum:consumables_sensors_verbraucht]% verbraucht\n -[vacuum:consumables_sensors]% verbleibend\n- [vacuum:consumables_sensors_zeit] Stunden verbleibend";
}

if ($EVENT eq "Charging problem")
{
fhem "set teleBot msg @#SmartHome Sauger wird nicht aufgeladen.";
}
if ($EVENT eq "Shutting down")
{
fhem "set teleBot msg @#SmartHome Sauger schaltet sich aus.";
}
if ($EVENT eq "Software update")
{
fhem "set teleBot msg @#SmartHome Sauger erhält ein Software Update.";
}
if ($EVENT eq "Unknown")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein ubekanntes Problem.";
}
if ($EVENT eq "Manual mode")
{
fhem "set teleBot msg @#SmartHome Sauger Manual mode.";
}
if ($EVENT eq "Spot cleaning")
{
fhem "set teleBot msg @#SmartHome Sauger Spot cleaning.";
fhem "setreading vacuum batteryPercent_start [vacuum:batteryPercent]";
}
if ($EVENT eq "Malfunction")
{
fhem "set teleBot msg @#SmartHome Sauger Malfunction.";
}
if ($EVENT eq "Goto")
{
fhem "set teleBot msg @#SmartHome Sauger fährt zum angegebenen Ziel.";
}
if ($EVENT eq "Fully Charged")
{
fhem "set teleBot msg @#SmartHome Sauger ist zu [vacuum:batteryPercent]% aufgeladen.";
}
if ($EVENT eq "Error")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Problem.";
}
if ($EVENT eq "Zoned Clean")
{
fhem "set teleBot msg @#SmartHome Sauger reinigt eine Zone.";
fhem "setreading vacuum batteryPercentstart [vacuum:batteryPercent]";
}
if ((Value "consumables_filter") eq "20")
{
fhem "set teleBot msg @#SmartHome Sauger Filter muss gereinigt werden.";
}
if ((Value "consumables_main_brush") eq "20")
{
fhem "set teleBot msg @#SmartHome Sauger die Hauptbürste muss ausgetauscht werden.";
}
if ((Value "consumables_sensors") eq "20")
{
fhem "set teleBot msg @#SmartHome Sauger Sensoren müssen gereinigt werden.";
}
if ((Value "consumables_side_brush") eq "20")
{
fhem "set teleBot msg @#SmartHome Sauger die Seitenbürste muss getauscht werden.";
}

}


vacuum
{
if ((Value "error_code") eq "Laser sensor fault")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Lasersensorfehler.";
}
if ((Value "error_code") eq "Collision sensor fault")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Kollisionssensorfehler.";
}
if ((Value "error_code") eq "Wheel floating")
{
fhem "set teleBot msg @#SmartHome Die Räder beim Sauger drehen durch.";
}
if ((Value "error_code") eq "Cliff sensor fault")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Kollisionssensorfehler."
}
if ((Value "error_code") eq "Main brush blocked")
{
fhem "set teleBot msg @#SmartHome Beim Sauger ist die Hauptbürste blockiert."; 
}
if ((Value "error_code") eq "Side brush blocked")
{
fhem "set teleBot msg @#SmartHome Beim Sauger ist die Seitenbürste blockiert."; 
}
if ((Value "error_code") eq "Wheel blocked")
{
fhem "set teleBot msg @#SmartHome Beim Sauger sind die Räder blockiert.";
}
if ((Value "error_code") eq "Device stuck")
{
fhem "set teleBot msg @#SmartHome Sauger ist eingeklemmt oder steckt fest.";
}
if ((Value "error_code") eq "Dust bin missing")
{
fhem "set teleBot msg @#SmartHome Beim Sauger wurde der Staubbehälter entfernt oder fehlt.";
}
if ((Value "error_code") eq "Filter blocked")
{
fhem "set teleBot msg @#SmartHome Beim Sauger ist der Filter blockiert";
}
if ((Value "error_code") eq "Magnetic field detected")
{
fhem "set teleBot msg @#SmartHome Beim Sauger wurde ein Magnetfeld erkannt.";
}
if ((Value "error_code") eq "Low battery")
{
fhem "set teleBot msg @#SmartHome Sauger hat wenig Batterie.";
}
if ((Value "error_code") eq "Charging problem")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Ladeproblem.";
}
if ((Value "error_code") eq "Battery failure")
{
fhem "set teleBot msg @#SmartHome Beim Sauger fehlt die Batterie.";
}
if ((Value "error_code") eq "Wall sensor fault")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Wandsensorfehler.";
}
if ((Value "error_code") eq "Uneven surface")
{
fhem "set teleBot msg @#SmartHome Sauger hat eine unebene Oberfläche.";
}
if ((Value "error_code") eq "Spot cleaning")
{
fhem "set teleBot msg @#SmartHome Sauger Spot cleaning.";
}
if ((Value "error_code") eq "Side brush failure")
{
fhem "set teleBot msg @#SmartHome Beim Sauger fehlt die Seitenbürste."; 
}
if ((Value "error_code") eq "Suction fan failure")
{
fhem "set teleBot msg @#SmartHome Sauger Ausfall des Sauggebläses." 
}
if ((Value "error_code") eq "Unpowered charging station")
{
fhem "set teleBot msg @#SmartHome Sauger Ladestation ohne Stromversorgung.";
}
if ((Value "error_code") eq "Unknown")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein ubekanntes Problem.";
}
if ((Value "error_code") eq "Laser pressure sensor problem")
{
fhem "set teleBot msg @#SmartHome Sauger hat ein Laserdrucksensor Problem.";
}
if ((Value "error_code") eq "Charge sensor problem")
{
fhem "set teleBot msg @#SmartHome Sauger hat Problem mit dem Ladungssensor.";
}
if ((Value "error_code") eq "Docking problem")
{
fhem "set teleBot msg @#SmartHome Sauger Docking Problem.";
}
if ((Value "error_code") eq "Exclusion zone")
{
fhem "set teleBot msg @#SmartHome Sauger Speerzone."; 
}
if ((Value "error_code") eq "Bin full")
{
fhem "set teleBot msg @#SmartHome Staubbehälter vom Sauger ist voll, bitte entleeren.";
}
if ((Value "error_code") eq "Internal error")
{
fhem "set teleBot msg @#SmartHome Sauger hat einen internen Fehler.";
}
}



vacuum
{
if ((Value "error_code") eq "Device stuck")
{
fhem "set vacuum start; sleep 100; set vacuum start";
}
}



vacuum
{
if ($EVENT eq "disconnected")
{
fhem "set vacuum reconnect";
}
if (((Value "event") eq "bin_full") && ((Value "in_cleaning") eq "no"))
{
fhem "set WasUsed Entladen";
}
if (($EVENT eq "Cleaning") || ($EVENT eq "Zoned Clean") || ($EVENT eq "Segment Clean"))
{
fhem "set WasUsed Ja";
}
if (((Value "WasUsed") eq "Entladen") && (($EVENT eq "Charging") || ($EVENT eq "Docked")))
{
fhem "set WasUsed WaitForEntladen; set vacuum goto Entladen";

}
if (((Value "WasUsed") eq "WaitForEntladen") && ($EVENT eq "Error"))
{
fhem "set vacuum remotecontrol stop; set WasUsed Geleert";

}
if (((Value "WasUsed") eq "Geleert") && (($EVENT eq "Paused") || ($EVENT eq "Waiting")))
{
#set vacuum stop;
fhem "set vacuum volume 50; set WasUsed Nein; set vacuum charge";
}
if ((Value "WasUsed") eq "WaitForEntladen")
{
#Wait-loop, provoziert Error bei Entnahme von Staubbehälter
fhem "
set SaugRoboter fan_power 1;
sleep 1;
define tmp_time1 at +00:00:03 set vacuum remotecontrol start;
sleep 8;
set SaugRoboter move 0 50 5000;
sleep 6;
set SaugRoboter move 10 0 0;
sleep 6;
set SaugRoboter move 0 50 5000;
sleep 5;
set vacuum remotecontrol stop"
}
}



doif:
([Anwesenheit] eq "absent" and [vacuum_anzahl_reinigung] eq "0")
(
set vacuum start;
set vacuum_anzahl_reinigung 1
)
DOELSEIF ([Anwesenheit] eq "present" and [vacuum] eq "Cleaning")
(
set vacuum pause
)
DOELSEIF ([20:00] and [vacuum] eq "Paused" or [vacuum] eq "Waiting" or [vacuum] eq "Sleeping")
(
set vacuum charge
)

RappaSan

Hallo columbine.

Das macht ein weiteres notify, das auf unsere Anwesenheit reagiert, abhängig davon ob mehr als 15 m² gesaugt wurden:

define GoToEntladen notify Phone1:presence:.present|Phone2:presence:.present {\
   if ((ReadingsNum("SauBaer","last_clean_area",0)) < 15) {\
      fhem "set WasUsed Nein";;\
   }\
\
   if ((Value "WasUsed") eq "Ja") {\
      fhem "set WasUsed Entladen";;\
   }\
}

Der code ist nicht vollständig hier abgebildet, es gibt noch diverse notifys und einen Weekdaytimer. Er ist für unsere Bedürfnisse sehr spezifisch ausgelegt und sollte nur als Denkanstoß dienen.

t1me2die

Moin Markus,

ich habe heute meinen neuen Xiaomi Fan mit der Bezeichnung "ZLXHS01ZM" (Modell: zhimi.fan.fa1) ausgepackt und mit deinem Modul getestet.
Den Token habe ich ausgelesen und das Device wie folgt angelegt:


Internals:
   DEF        192.168.xxx.xx xxxxxxxxxxxxxxxxxxx
   FD         31
   FUUID      5f901b2c-f33f-5a17-69e0-d0f495347443c8cd
   NAME       wz_Bodenventilator
   NR         1196
   STATE      ???
   TYPE       XiaomiDevice
   hardware   esp8266
   mac        64:90:C1:AC:55:D3
   mcu_firmware 0016
   model      zhimi.fan.fa1
   token      xxxxxxxxxxxxxxxxxxx
   wifi_firmware 2709610
   READINGS:
     2020-10-21 13:36:57   angle           90
     2020-10-21 13:37:59   angle_enable    off
     2020-10-21 13:37:59   buzzer          on
     2020-10-21 13:37:12   device_firmware 2.1.0
     2020-10-21 13:37:12   device_uptime   1.91
     2020-10-21 13:37:59   error           none
     2020-10-21 13:37:59   level           3
     2020-10-21 13:37:59   mode            sleep
     2020-10-21 13:37:59   power           off
     2020-10-21 13:37:59   timed_off       1
     2020-10-21 13:37:12   wifi_rssi       -62
   helper:
     ConnectionState connected
     crypt      AES
     delay      60
     dev        0e7f
     id         2753
     ip         192.168.xxx.xx
     last_read  1603280279
     packetid   36
     port       54321
     sequence   1603273358
     token      xxxxxxxxxxxxxxxxxxx
     packet:
       33         wifi_stats
       34         power_off
       35         fan_data_1C
Attributes:
   DbLogExclude .*
   room       Ventilator
   subType    SmartFan1C


Ich habe div. subTypen durchprobiert, natürlich funktioniert keiner zu 100% auf anhieb.
Ich möchte gerne dabei helfen, dass das Gerät unterstützt wird.
Nun ist die Frage, hast du Lust / Zeit dein Modul zu erweitern oder soll ich mich eigenständig daran versuchen?

Folgende Funktionen unterstützt das Gerät:

  • On / Off
  • Level: 1-5 (per Tasten am Gerät)
  • Speed adjustment: 1-100
  • Mode: Standard / Natural
  • Oscillating adjustment: Oscillate, Face forward, Stop
  • Left-right oscilllating: Turn left, Face forward, Turn right
  • Up-down oscallating: Turn up, Face forward, Turn down
  • Timer: 1-8hours
  • Light: On / Off
  • Notification Sound: On / Off
  • Parental controols: On / Off

Was bisher schon funktioniert unter dem subType "SmartFan1C":

  • On / Off
  • Notification Sound: On / Off
  • Level: 1-3 (es fehlt die Erweiterung für Stufe 4 und 5)

get wz_Bodenventilator data

ergibt folgendes:

2020.10.21 14:00:59 4: wz_Bodenventilator: write {"id":73,"method":"get_properties","params":[{"did": "power", "siid": 2, "piid": 1}, {"did": "level", "siid": 2, "piid": 2}, {"did": "mode", "siid": 2, "piid": 7}, {"did": "led", "siid": 2, "piid": 12}, {"did": "buzzer", "siid": 2, "piid": 11}, {"did": "angle_enable", "siid": 2, "piid": 3}, {"did": "child_lock", "siid": 3, "piid": 1}, {"did": "timed_off", "siid": 2, "piid": 10}]} (382)
2020.10.21 14:00:59 5: wz_Bodenventilator: send 213101a0000000000e7f27530000206d3ada63870eab5395a7aea6ae88a566c130bcb52e4f2c6ff71298e1e9cb33e6b6e722264607d9b8d25a81f8446566e5058670dae650dcd2992515f2c4c56c2d2d5c2a4140aa74c9c2a5e4b4a97db903826f42312c72ca4cfaae10be8392d0e21961c0efe9ad5b65a3d7b960c23afce27f1824199aa206c8213bbe2069bf63d06ad3ea103e00e73e701c563c7f3137634c2f5fdd5118b27fc322a3a515f79ae64ef0938b0f1c3e485785569f879d2c05f64d3b5131c839b6c11b7ffdf06875203bd58b8f1de65a8eea720d2c609f8776704659c7acb150a3f79d57564023f54420e794cfcf11cca40e1627cbdfaada436f5df5536dd16b125d2ba2873481e8a0393fc3e7fd843a00eae1295a0dd2e88207b42fbe4f8231671086ec6dddc7c73a204527d6f414c497d3dc540489898f7292fd523e1a007fed35ef60c3a1c2418ea89bf1d99b4e225b403d0f75fc132e969a76028c8cde4c8b503082a67fbd64de1f6f89e052645e314d362b790cf4e06d7c5c03aa6f064fd57d1dfbf9c84704ef3e041584ff553ea2325a882bb7e5033764
2020.10.21 14:00:59 5: wz_Bodenventilator Send SUCCESS
2020.10.21 14:00:59 5: wz_Bodenventilator > 213101a0000000000e7f27530000206d3ada63870eab5395a7aea6ae88a566c130bcb52e4f2c6ff71298e1e9cb33e6b6e722264607d9b8d25a81f8446566e5058670dae650dcd2992515f2c4c56c2d2d5c2a4140aa74c9c2a5e4b4a97db903826f42312c72ca4cfaae10be8392d0e21961c0efe9ad5b65a3d7b960c23afce27f1824199aa206c8213bbe2069bf63d06ad3ea103e00e73e701c563c7f3137634c2f5fdd5118b27fc322a3a515f79ae64ef0938b0f1c3e485785569f879d2c05f64d3b5131c839b6c11b7ffdf06875203bd58b8f1de65a8eea720d2c609f8776704659c7acb150a3f79d57564023f54420e794cfcf11cca40e1627cbdfaada436f5df5536dd16b125d2ba2873481e8a0393fc3e7fd843a00eae1295a0dd2e88207b42fbe4f8231671086ec6dddc7c73a204527d6f414c497d3dc540489898f7292fd523e1a007fed35ef60c3a1c2418ea89bf1d99b4e225b403d0f75fc132e969a76028c8cde4c8b503082a67fbd64de1f6f89e052645e314d362b790cf4e06d7c5c03aa6f064fd57d1dfbf9c84704ef3e041584ff553ea2325a882bb7e5033764
2020.10.21 14:00:59 5: wz_Bodenventilator < 21310200000000000e7f27530000206d84971309ebc109c7224c6fd6434afbacc4b8ec4535954bd5a89d1e6ff323e3c4fd10f58fa0bf5557e9b1cb2eaa299f7f0c890971a502fecca04e96f63a808de1e84ddb9262c3597a658ea9118bca8b0b7d508fa918675d9e026ba665348dc453cb5a3efa68c29f9f8b8d82d68b9979d65e4e60d6c8dfc7357dcba8f293a13685b196b74738cda762cab78096885dcdcf76d7fcf6d8c9cd58745c33ed43a86d24767581430068216fd25235d76e9f821f0878aac3c2a8fe5c2977ad39db81818fad9a614dcfde6e68bd9a08033454a49229242761b4bf48065fce5b84a51539a6b384f925c35ea94c00ac7f6b3b9d701533a307bca2f51dd56d9fcd86c3b86ed7381be66f2bb5730554ee76aba05e16ed85fa2452715d087c0e0dee0302752eabd1ba7e4d0578150b32e2ebe98c1728fa010422cb2c35613ab543b9429225844ff0fa0e4dcc58928ed901ee20d127678423e8bf1c9cb2f8308463635700427021b91f3281d523024eabce5cebaa2bb074765832474827b5d54916b327b9995c5be9d0e24656064b2816b27143161beb505091339a9011119560cad0c48bc78885ca5a1c5287511375fee91b3d6a0f63506ed7c1c49e224caa097e43048993d724f9f4370cd9e0364b3596c2a3ee8c40f4b1736bffd649b9059040e70107520fb25fa7a61e31aa119dd99ebd1e09222ae5 (512)
2020.10.21 14:00:59 5: wz_Bodenventilator: decrypted
{"id":73,"result":[{"did":"power","siid":2,"piid":1,"code":0,"value":false},{"did":"level","siid":2,"piid":2,"code":0,"value":1},{"did":"mode","siid":2,"piid":7,"code":0,"value":1},{"did":"led","siid":2,"piid":12,"code":-4005},{"did":"buzzer","siid":2,"piid":11,"code":0,"value":true},{"did":"angle_enable","siid":2,"piid":3,"code":0,"value":false},{"did":"child_lock","siid":3,"piid":1,"code":-4005},{"did":"timed_off","siid":2,"piid":10,"code":0,"value":1}],"exe_time":130}
2020.10.21 14:00:59 5: wz_Bodenventilator: parse id 73
{
  'exe_time' => 130,
  'id' => 73,
  'result' => [
    {
      'code' => 0,
      'did' => 'power',
      'piid' => 1,
      'siid' => 2,
      'value' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
    },
    {
      'code' => 0,
      'did' => 'level',
      'piid' => 2,
      'siid' => 2,
      'value' => 1
    },
    {
      'code' => 0,
      'did' => 'mode',
      'piid' => 7,
      'siid' => 2,
      'value' => 1
    },
    {
      'code' => -4005,
      'did' => 'led',
      'piid' => 12,
      'siid' => 2
    },
    {
      'code' => 0,
      'did' => 'buzzer',
      'piid' => 11,
      'siid' => 2,
      'value' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' )
    },
    {
      'code' => 0,
      'did' => 'angle_enable',
      'piid' => 3,
      'siid' => 2,
      'value' => $VAR1->{'result'}[0]{'value'}
    },
    {
      'code' => -4005,
      'did' => 'child_lock',
      'piid' => 1,
      'siid' => 3
    },
    {
      'code' => 0,
      'did' => 'timed_off',
      'piid' => 10,
      'siid' => 2,
      'value' => 1
    }
  ]
}

2020.10.21 14:00:59 4: wz_Bodenventilator: parse id 73 / fan_data_1C
2020.10.21 14:00:59 4: wz_Bodenventilator: msg ref is ARRAY


get wz_Bodenventilator device_info

ergibt folgendes:
2020.10.21 14:02:19 4: wz_Bodenventilator: write {"id":74,"method":"miIO.info","params":[""]} (44)
2020.10.21 14:02:19 5: wz_Bodenventilator: send 21310050000000000e7f2753000020bd80c157d7a3356a8aefa0ebeae85f7318868633fcd793e15f46c265768486c3798681d06ffe31d9ee8885837b5cfdfd913c5771eea8ef384b6283662bdb68f03c
2020.10.21 14:02:19 5: wz_Bodenventilator Send SUCCESS
2020.10.21 14:02:19 5: wz_Bodenventilator > 21310050000000000e7f2753000020bd80c157d7a3356a8aefa0ebeae85f7318868633fcd793e15f46c265768486c3798681d06ffe31d9ee8885837b5cfdfd913c5771eea8ef384b6283662bdb68f03c
2020.10.21 14:02:19 5: wz_Bodenventilator < 213101e0000000000e7f2753000020bd6ba29d4ffa743368ed5164e5464413a8bc1999c498a2acd9835ebc902ac9aeb4454c48bda494280be4501982a1f5939305b1b1dffffc434bb8afee0f600657608f02b8749dfab9d944509a3b1105b61906542ab33e0ed2f20b22bb34c2762225fd94ae372a31758541ddcf8fc170d02b4e1925069a6bc7c6a36162b14b7c595b2235563b0b072e3dc9d15a28fbae13e2801b4a0775a5ab0846a303683279fa0bc06a0dba4018abe5e1bb7a455cd33fd9a23c85547a059cb5feb956cf68b8f340f872e61f0f674a2004b5b59bcab0213456347724a7b261bae7375a64c135316376cf8a7240a8689ddcb3f2b306a363098f08f33ebceadc72f8107cf85e0cd1f1b43333b2bbdc91a00ce451bd7e692e683fbf60e3aeb4e899ce3686c3627f31fa2e3b3f12b0bf1f3f7e987b242b2e8ae0b44f0de5dc348eac2930c1e127ed7b096707253ae9fd3dbd1e4179f81238de8724a3140d0bed8b289cc9eec1c945410b6028ec04f2469a058c4a1b2231cff44affffc99679ad1ae7cf2ca5c96e5055db7edf5199e961326981383022d2d773bf3f10e2d9adcc04ad4137f17b3b7829a0fc05f419e1f4110234c579ce110fb1ee9760a2d13b33ee62062f9ffa758fe1a67b12b77617ea206dd96fc0699ba67bab (480)
2020.10.21 14:02:19 5: wz_Bodenventilator: decrypted
{"id":74,"result":{"life":8380,"uid":xxxxxxxxxx,"model":"zhimi.fan.fa1","token":"xxxxxxxxxxxxxxxxxxx","ipflag":1,"fw_ver":"2.1.0","mcu_fw_ver":"0016","miio_ver":"0.0.8","hw_ver":"esp8266","mmfree":23912,"mac":"64:90:C1:AC:55:D3","wifi_fw_ver":"2709610","ap":{"ssid":"xxxxx","bssid":"18:E8:29:6A:95:D4","rssi":-66,"primary":11},"netif":{"localIp":"192.168.xxx.xx","mask":"255.xxx.xxx.x","gw":"192.xxx.xxx.x"}},"exe_time":30}
2020.10.21 14:02:19 5: wz_Bodenventilator: parse id 74
{
  'exe_time' => 30,
  'id' => 74,
  'result' => {
    'ap' => {
      'bssid' => '18:E8:29:6A:95:D4',
      'primary' => 11,
      'rssi' => -66,
      'ssid' => 'xxxxx'
    },
    'fw_ver' => '2.1.0',
    'hw_ver' => 'esp8266',
    'ipflag' => 1,
    'life' => 8380,
    'mac' => '64:90:C1:AC:55:D3',
    'mcu_fw_ver' => '0016',
    'miio_ver' => '0.0.8',
    'mmfree' => 23912,
    'model' => 'zhimi.fan.fa1',
    'netif' => {
      'gw' => '192.xxx.xxx.x',
      'localIp' => '192.xxx.xxx.xx',
      'mask' => '255.xxx.xxx.x'
    },
    'token' => 'xxxxxxxxxxxxxxxxxxx',
    'uid' => xxxxxxxxx,
    'wifi_fw_ver' => '2709610'
  }
}

2020.10.21 14:02:19 4: wz_Bodenventilator: parse id 74 / device_info
2020.10.21 14:02:19 4: wz_Bodenventilator: msg ref is HASH


Einige Informationen habe ich durch "xxxx" ersetzt.

Gruß
Mathze

Markus M.

Zitat von: t1me2die am 21 Oktober 2020, 14:10:36
Xiaomi Fan mit der Bezeichnung "ZLXHS01ZM" (Modell: zhimi.fan.fa1)

Folgende Funktionen unterstützt das Gerät:

  • On / Off
  • Level: 1-5 (per Tasten am Gerät) unnötig
  • Speed adjustment: 1-100
  • Mode: Standard / Natural
  • Oscillating adjustment: Oscillate, Face forward, Stop ??
  • Left-right oscilllating: Turn left, Face forward, Turn right ??
  • Up-down oscallating: Turn up, Face forward, Turn down ??
  • Timer: 1-8hours
  • Light: On / Off
  • Notification Sound: On / Off
  • Parental controols: On / Off

miot ref: http://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:fan:0000A005:zhimi-fa1:1

Mach mal Screenshots was genau man da beim Schwenken und Neigen alles setzen/einstellen kann.
Den Rest bitte mal mit der Version im Anhang ausprobieren
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

t1me2die

Moin Markus, dass ging ja mal fix.
Die neue Version probiere ich Morgen aus, ich gebe Dir Morgen Feedback.

Ich habe Dir mal Screenshots von den Einstellungsmöglichkeiten gemacht, reicht Dir das?

Bisher habe ich lediglich "Turn left", "Turn right", "Turn up" und "Turn down" ausprobiert.
Pro Klick auf die jeweilige Richtung bewegt sich der Rotor um einen kleinen Step in die jeweilige Richtung.

Bei "Oscillate" bewegt sich der Rotor wahrscheinlich eigenständig 3-Dimensional. Bei "Stop" hört er sicherlich auf zu oszillieren.

Ich vermute "Face forward" ist die Grundstellung.
Wenn du möchtest, kann ich die Einstellungen Morgen detailliert testen und beschreiben.

Gruß
Mathze


Markus M.

Reicht nicht ganz.
Zu viele verwirrende Buttons was die Bewegungen jenseits von horizontal und vertikal angeht.
Wenn du Android hast, probier mal bitte das Logging mit der App von hier: https://forum.fhem.de/index.php/topic,73052.msg1085312.html#msg1085312
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

t1me2die

Zitat von: Markus M. am 21 Oktober 2020, 23:41:29
Reicht nicht ganz.
Zu viele verwirrende Buttons was die Bewegungen jenseits von horizontal und vertikal angeht.
Wenn du Android hast, probier mal bitte das Logging mit der App von hier: https://forum.fhem.de/index.php/topic,73052.msg1085312.html#msg1085312

Und was ist, wenn ich kein Android, sondern leider nur iOS Geräte habe? :-\

Gruß
Mathze

Markus M.

Zitat von: t1me2die am 22 Oktober 2020, 12:01:22
Und was ist, wenn ich kein Android, sondern leider nur iOS Geräte habe? :-\

Mit einem miio client manuell die noch nicht eingepflegten Befehle (die mit dem chinesischen Text) aus der miot Spec durchprobieren und gucken was passiert?
Bekommst du das hin?
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

t1me2die

Zitat von: Markus M. am 22 Oktober 2020, 12:59:23
Mit einem miio client manuell die noch nicht eingepflegten Befehle (die mit dem chinesischen Text) aus der miot Spec durchprobieren und gucken was passiert?
Bekommst du das hin?

Puh, ich habe einen MEmuplay Android Emulator, ich werde nachher mal probieren die App dort drauf zu installieren / zum laufen zu bekommen.
Bzgl. des "miio client" müsste ich mich erst schlau lesen, davon habe ich bisher noch nichts gehört.
Ich gebe Dir eine Info, ob ich das hinbekomme.

Gruß
Mathze

t1me2die

Zitat von: Markus M. am 21 Oktober 2020, 18:13:38
miot ref: http://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:fan:0000A005:zhimi-fa1:1

Mach mal Screenshots was genau man da beim Schwenken und Neigen alles setzen/einstellen kann.
Den Rest bitte mal mit der Version im Anhang ausprobieren

So Markus, ich habe deine neue Version vom Modul ausprobiert und ich muss sagen, RESPEKT!
Mit soviel Erfolg habe ich tatsächlich nicht gerechnet.
Ich habe die Ergebnisse zusammengetragen:


Was bereits perfekt funktioniert:
* On / Off
* Level: 1-100
* Buzzer: On / Off
* LED: On / Off
* Mode: Straight / natural
* Child_lock: On / Off
* timed_off: 1-8

Was bereits auch funktioniert, jedoch teilweise im reading nicht geupdatet wird oder "nicht der Erwartung" entspricht (dies ist meine reine subjektive Einschätzung!)
Funktionsbeschreibung:
* tilt_enable: on / off
  on = schwenkt den Rotor vertikal
  off = stopt das schwenken des Rotors vertikal
* tilt: 15, 30, 45, 60, 75, 90 hat nur Auswirkung, wenn "tilt_enable" = on ist.

Meine Definition von [b]Frontal[/b]:
Siehe Bild: Ausgangspunkt.JPEG 

  tilt: 90 = schwenkt von Frontal -> bis Frontal gegen die Decke -> sprich 90° -> reading wird auch geupdatet
 
  tilt: 15 = schwenkt genau wie "tilt 90", reading wird nicht geupdatet
  tilt: 30 = schwenkt von etwas über Frontal, gefühlt 30° nach oben und zurück -> reading wird nicht geupdatet
  tilt: 45 = schwenkt genau wie "tilt 90", reading wird nicht geupdatet
  tilt: 60 = schwenkt von Frontal ca. 60° Richtung Decke, im reading steht bei tilt "45"
  tilt: 75 = schwenkt genau wie "tilt 90", reading wird nicht geupdatet

* angle_enable = on / off
  on = schwenkt den Rotor horizontal
  off = stopt das schwenken des Rotors horizontal
* angle: 15, 30, 45, 60, 75, 90, 105, 120 hat nur Auswirkungen, wenn "angle_enable" = on ist.
 
Meine Definition von [b]Ausgangspunkt[/b]:
Siehe Bild: Ausgangspunkt.JPEG

  angle: 15 = schwenkt horizontal den kompletten Weg, reading wird auf "15" geupdatet
  angle: 30 = schwenkt horizontal, beginnt ca. 5° links vom Ausgangspunkt und schwenkt ca. 15° nach rechts über den Ausgangspunkt hinaus, reading wird auf "30" geupdatet
  angle: 45 = schwenkt horizontal, beginnt ca. 60° links vom Ausgangspunkt und schwenkt ca. 75° nach rechts über den Ausgangspunkt hinaus, reading wird auf "45" geupdatet
  angle: 60 = schwenkt horizontal, beginnt ca. 15° links vom Ausgangspunkt und schwenkt ca. 45° nach rechts über den Ausgangspunkt hinaus, reading wird auf "60" geupdatet
  angle: 75 = schwenkt horizontal, beginnt ca. 45° links vom Ausgangspunkt und schwenkt ca. 60° nach rechts über den Ausgangspunkt hinaus, reading wird auf "75" geupdatet
  angle: 90 = schwenkt horizontal, beginnt ca. 45° links vom Ausgangspunkt und schwenkt ca. 45° nach rechts über den Ausgangspunkt hinaus, reading wird auf "90" geupdatet
  angle:105 = schwenkt horizontal, beginnt ca. 60° links vom Ausgangspunkt und schwenkt ca. 75° nach rechts über den Ausgangspunkt hinaus, reading wird auf "105" geupdatet
  angle:120 = schwenkt horizontal, beginnt ca. 75° links vom Ausgangspunkt und schwenkt ca. 75° nach rechts über den Ausgangspunkt hinaus, reading wird auf "120" geupdatet


Bis auf paar Kleinigkeiten, würde ich fast sagen, dass war ein Treffer ins Schwarze!
Ich tue mich jedoch relativ schwierig mit dem beschreiben der jeweiligen Winkel, habe mir größte Mühe gegeben.

Wenn ich in der App "Oscillating" anklicke, erscheinen endlich div. Grade und zwar genau das, was ich mit "angle" und mit "tilt" einstellen kann.
Siehe Screenshot: Oscillating.JPEG

angle = Left-right oscillating
tilt = Up-down oscillation

Bei "set Device tilt xx" wird der Wert zwar in der App korrekt geupdatet, jedoch wird das Reading in FHEM nicht immer korrekt aktualisiert.

Der Button: "Face forward" richtet das Gerät so aus, wie auf dem Bild Ausgangspunkt.JPEG und zwar unabhängig, welchen ich von den drei "Face forward" Button in der App drücke, dass Gerät geht immer wieder in diese Stellung zurück.

Wenn man also ganz pingelig ist, fehlen folgende Funktionen:

  • Start Oscillate
  • Stop Oscillate
  • Face forward
  • Turn left (horizontal)
  • Turn right(horizontal)
  • Turn up(vertikal)
  • Turn down(vertikal)

Die "Turn" Funktionen gehen Schrittweise, d.h. 1x drücken = ein kleines Stückchen in die jeweilge RIchtung.
Bsp.:
1x Turn left = Rotor bewegt sich gefühlt 5% nach links und verhaart in dieser Position
2x Turn left = Rotor bewegt sich gefühlt 10% nach links und verhaart in dieser Position
...

Und nun ein recht herzliches DANKE für deine schnelle Anpassung!

Gruß
Mathze

PS.: Die russische Mi Home App kann ich leider nicht auf meiner Emulation installieren, eine aussagekräftige Fehlermeldung erhalte ich leider auch nicht.

Markus M.

Eventuell sind nicht alle Werte bei angle/tilt gültig.
Am besten du setzt jeden gültigen Wert mal mit der App und machst dann jeweils ein update im Device - dann siehst du welcher Wert intern gerade aktiv ist.

Und probier mal im Modul bzw. in der FHEM Kommandozeile
set fan json ...
mit folgenden Zeilen und notiere jeweils was passiert - das sind alle noch fehlenden Kommandos, ein paar Parameter sind allerdings geraten.
#left right return
{"id":1234,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": true}]}
{"id":1235,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": false}]}
#up down return
{"id":1236,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": true}]}
{"id":1237,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": false}]}
#l/r
{"id":1238,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "left"}]}
{"id":1239,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "right"}]}
#u/d
{"id":1240,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "up"}]}
{"id":1241,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "down"}]}
#one-key-cycle
{"id":1242,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": true}]}
{"id":1243,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": false}]}
#one-key-back
{"id":1244,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 9, "value": true}]}
{"id":1245,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 9, "value": false}]}

FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

t1me2die

Zitat von: Markus M. am 22 Oktober 2020, 19:31:08
Eventuell sind nicht alle Werte bei angle/tilt gültig.
Am besten du setzt jeden gültigen Wert mal mit der App und machst dann jeweils ein update im Device - dann siehst du welcher Wert intern gerade aktiv ist.

Und probier mal im Modul bzw. in der FHEM Kommandozeile
set fan json ...
mit folgenden Zeilen und notiere jeweils was passiert - das sind alle noch fehlenden Kommandos, ein paar Parameter sind allerdings geraten.
#left right return
{"id":1234,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": true}]}
{"id":1235,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": false}]}
#up down return
{"id":1236,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": true}]}
{"id":1237,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": false}]}
#l/r
{"id":1238,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "left"}]}
{"id":1239,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "right"}]}
#u/d
{"id":1240,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "up"}]}
{"id":1241,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "down"}]}
#one-key-cycle
{"id":1242,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": true}]}
{"id":1243,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": false}]}
#one-key-back
{"id":1244,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 9, "value": true}]}
{"id":1245,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 9, "value": false}]}



Moin Markus, dass ging ja wieder einmal fix bei Dir, hier die Funktionen aufgelistet:

Passiert nichts:
{"id":1234,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": true}]}
{"id":1235,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": false}]}
{"id":1237,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": false}]}

Turn left:
{"id":1238,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "left"}]}

Turn right:
{"id":1239,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 6, "value": "right"}]}

Turn up:
{"id":1240,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "up"}]}

Turn down:
{"id":1241,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 7, "value": "down"}]}

Face forward:
{"id":1236,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": true}]}

Oscillating Start:
{"id":1242,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": true}]}

Oscillating Stop:
{"id":1243,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 8, "value": false}]}


Nochmals danke für deine Mühe  :)

Gruß
Mathze

Markus M.

Probier 4/5/9 + true nochmal während der Ventilator nicht in Mittelstellung ist.
Das sollten verschiedene Dinge sein.
Also z.B. 4 nur angle return, 5 nur tilt return und 9 beides.

Schau mal ob das so passt.
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

t1me2die

Zitat von: Markus M. am 22 Oktober 2020, 20:19:07
Probier 4/5/9 + true nochmal während der Ventilator nicht in Mittelstellung ist.
Das sollten verschiedene Dinge sein.
Also z.B. 4 nur angle return, 5 nur tilt return und 9 beides.

Schau mal ob das so passt.

Ich verstehe nicht so recht, was du von mir möchtest.

Folgendes konnte ich noch identifizieren:

Face forward
{"id":1234,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": true}]}
Wobei hier der Neigungswinkel unverändert bleibt.


Folgendes konnte ich weiterhin auch in anderen Stellungen nicht identifizieren:

{"id":1235,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 4, "value": false}]}
{"id":1237,"method":"set_properties","params":[{"did": "tilt", "siid": 5, "piid": 5, "value": false}]}


Gruß
Mathze