deconz: Xiaomi Cube - Readings unklar

Begonnen von Gunther, 15 Oktober 2018, 10:28:58

Vorheriges Thema - Nächstes Thema

KernSani

#15
Das Zahlen sollten näherungsweise den Drehwinkel angeben (bezogen auf eine imaginäre 0-Linie. Also: Alter Wert 70, neuer Wert -20 ergibt Drehung nach links um 90 Grad (so zumindest meine Interpretation)

Edit: Hab den Cube noch ein paarmal gedreht... Das ist eher der tatsächliche Winkel... also negative Zahlen Drehung um x Grad nach links, positiv nach rechts.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Green Hornet

Zitat von: Papaloewe am 12 Februar 2019, 18:30:44
Nach einiger Pfriemelei komme ich zu einem anderem Ergebnis.
Vielleicht habe ich aber auch eine neuere, ältere Version des Zauberwürfels?
Vielleicht hilft es ja jemandem. Viel Erfolg.
MfG
Thomas


defmod Zauberwuerfel1_action HUEDevice sensor 8  IODev=deCONZ
attr Zauberwuerfel1_action IODev deCONZ
attr Zauberwuerfel1_action icon xiaomi_cube
attr Zauberwuerfel1_action room HUEDevice,Wohnen
attr Zauberwuerfel1_action stateFormat Aktion: action\
Seite:  side
attr Zauberwuerfel1_action userReadings first \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;; \
  {return $first}}, \
last \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $last  = substr($string, 3, 1);;;; \
  {return $last}}, \
action \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;; \
my $last   = substr($string, 3, 1);;;; \
if ($first eq "7") {return 'shake'} \
elsif ($first eq $last) {return 'doubletap'}  \
elsif ($last eq "0") {return 'move'} \
elsif ($first gt "0" and $first lt "7") {return 'flip'} \
  else {return 'unknown'}}, \
side \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;;  \
if ($first eq "1") {return 'upper'} \
elsif ($first eq "2") {return 'behind'} \
elsif ($first eq "3") {return 'left'} \
elsif ($first eq "4") {return 'right'} \
elsif ($first eq "5") {return 'front'} \
elsif ($first eq "6") {return 'under'} \
  else {return 'unknown'}}, \
last_side \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;; \
my $last  = substr($string, 3, 1);;;; \
if ($last eq "1") {return 'upper'} \
elsif ($last eq "2") {return 'behind'} \
elsif ($last eq "3") {return 'left'} \
elsif ($last eq "4") {return 'right'} \
elsif ($last eq "5") {return 'front'} \
elsif ($last eq "6") {return 'under'} \
  else {return 'unknown'}}


defmod Zauberwuerfel1_angle HUEDevice sensor 10  IODev=deCONZ
attr Zauberwuerfel1_angle IODev deCONZ
attr Zauberwuerfel1_angle icon xiaomi_cube
attr Zauberwuerfel1_angle room HUEDevice,Wohnen
attr Zauberwuerfel1_angle stateFormat Drehrichtung: rotate
attr Zauberwuerfel1_angle userReadings rotate \
{my $state = ReadingsVal("Zauberwuerfel1_angle","state","");;;; \
if ($state gt 0) {return 'right'} \
elsif ($state lt 0) {return 'left'} \
  else {return 'unknown'}}


Hallo zusammen,

wenn ich das Userreading von Papaloewe verwende bekomm ich folgende Fehler. Vielleicht hat jemand eine Idee was ich falsch mache :(

Internals:
   CFGFN     
   DEF        sensor 13  IODev=Raspbee_1
   FUUID      5c76dca7-f33f-9f3a-5d0d-7c85dd05b46fdf44
   ID         S13
   INTERVAL   
   IODev      Raspbee_1
   NAME       Wz.Zauberwuerfel1_action
   NR         94617
   STATE      Aktion: action
Seite:  side
   TYPE       HUEDevice
   lastupdated 2019-02-27 21:23:25
   lastupdated_local 2019-02-27 22:23:25
   manufacturername LUMI
   modelid    lumi.sensor_cube.aqgl01
   name       Zauberw�rfel Wohnzimmer
   on         1
   reachable  1
   swversion  20160704
   type       ZHASwitch
   uniqueid   00:15:8d:00:02:9a:90:07-02-0012
   Helper:
     DBLOG:
       state:
         DBLogging:
           TIME       1551302605.92177
           VALUE      5005
   READINGS:
     2019-02-27 21:48:00   battery         85
     2019-02-27 22:23:25   first           Error evaluating Wz.Zauberwuerfel1_action userReading first: syntax error at (eval 495006) line 2, near ")
my "
Global symbol "$first" requires explicit package name at (eval 495006) line 2, <GEN1028326> line 1.
Global symbol "$string" requires explicit package name at (eval 495006) line 2, <GEN1028326> line 1.
Global symbol "$first" requires explicit package name at (eval 495006) line 3, <GEN1028326> line 1.
syntax error at (eval 495006) line 3, near "}}"

     2019-02-27 21:48:00   reachable       true
     2019-02-27 22:23:25   state           5005
   helper:
     devtype    S
     reachable  0
     update_timeout 1
     setList:
Attributes:
   IODev      Raspbee_1
   room       Wohnzimmer
   stateFormat Aktion: action
Seite:  side
   userReadings first {my $string = ReadingsVal("Wz.Zauberwuerfel1_action","state","")
my $first  = substr($string, 0, 1)
  {return $first}}
last {my $string = ReadingsVal("Wz.Zauberwuerfel1_action","state","")
my $last  = substr($string, 3, 1)
  {return $last}}
action {my $string = ReadingsVal("Wz.Zauberwuerfel1_action","state","")
my $first  = substr($string, 0, 1)
my $last   = substr($string, 3, 1)
if ($first eq "7") {return 'shake'}
elsif ($first eq $last) {return 'doubletap'}
elsif ($last eq "0") {return 'move'}
elsif ($first gt "0" and $first lt "7") {return 'flip'}
  else {return 'unknown'}}
side {my $string = ReadingsVal("Wz.Zauberwuerfel1_action","state","")
my $first  = substr($string, 0, 1)
if ($first eq "1") {return 'upper'}
elsif ($first eq "2") {return 'behind'}
elsif ($first eq "3") {return 'left'}
elsif ($first eq "4") {return 'right'}
elsif ($first eq "5") {return 'front'}
elsif ($first eq "6") {return 'under'}
  else {return 'unknown'}}
last_side {my $string = ReadingsVal("Wz.Zauberwuerfel1_action","state","")
my $last  = substr($string, 3, 1)
if ($last eq "1") {return 'upper'}
elsif ($last eq "2") {return 'behind'}
elsif ($last eq "3") {return 'left'}
elsif ($last eq "4") {return 'right'}
elsif ($last eq "5") {return 'front'}
elsif ($last eq "6") {return 'under'}
  else {return 'unknown'}}
2x Raspberry 3 | 1x Raspberry 2 | HMlan | HM-MOD-UART | Raspbee | HM-Komponeneten | Xiaomi Aqara Komponenten | Alexa-Fhem | Homebridge-Fhem | Harmony Hub | Philips HUE

Green Hornet

OK, hab' s jetzt selber gelöst. Habe die Semikolons warum auch immer raus gelöscht gehabt. ::)
2x Raspberry 3 | 1x Raspberry 2 | HMlan | HM-MOD-UART | Raspbee | HM-Komponeneten | Xiaomi Aqara Komponenten | Alexa-Fhem | Homebridge-Fhem | Harmony Hub | Philips HUE

Papaloewe

Sorry, gerade erst gesehen, aber ich habe das Userreading noch um flip-180 erweitert:
first
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);;
  {return $first}},
last
{my $string = ReadingsVal($name,"state","");;
my $last  = substr($string, 3, 1);;
  {return $last}},
action
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);;
my $last   = substr($string, 3, 1);;
my $sum   = ($first + $last);;
if ($first eq "7") {return 'shake'}
elsif ($first eq $last) {return 'doubletap'} 
elsif ($last eq "0") {return 'move'}
elsif ($sum eq "7") {return 'flip-180'}
elsif ($first gt "0" and $first lt "7") {return 'flip-90'}
  else {return 'unknown'}},
side
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);; 
if ($first eq "1") {return 'upper'}
elsif ($first eq "2") {return 'behind'}
elsif ($first eq "3") {return 'left'}
elsif ($first eq "4") {return 'right'}
elsif ($first eq "5") {return 'front'}
elsif ($first eq "6") {return 'under'}
  else {return 'unknown'}},
last_side
{my $string = ReadingsVal($name,"state","");;
my $last  = substr($string, 3, 1);;
if ($last eq "1") {return 'upper'}
elsif ($last eq "2") {return 'behind'}
elsif ($last eq "3") {return 'left'}
elsif ($last eq "4") {return 'right'}
elsif ($last eq "5") {return 'front'}
elsif ($last eq "6") {return 'under'}
  else {return 'unknown'}}

Green Hornet

2x Raspberry 3 | 1x Raspberry 2 | HMlan | HM-MOD-UART | Raspbee | HM-Komponeneten | Xiaomi Aqara Komponenten | Alexa-Fhem | Homebridge-Fhem | Harmony Hub | Philips HUE

mimo84

#20
Servus miteinander,

ich hab das drehdings nochmal aufgebohrt:

rotate
{my $state = ReadingsVal("AQ_Cube","state","");;
if ($state > 9000) {return 'right90'}
elsif ($state > 4500) {return 'right45'}
elsif ($state > 0) {return 'right'}
elsif ($state < -9000) {return 'left90'}
elsif ($state < -4500) {return 'left45'}
elsif ($state < 0) {return 'left'}
else {return 'unknown'}}


Per DOIF rumpel ich dann auf den AV-Receiver raus: (Ist nicht besonders elegant, funktioniert aber :-D )
defmod WZ_DI_CubeDrehen DOIF ([AQ_Cube:rotate] eq "right" \
and [?OnkyoAVR:power] eq "on")\
(set OnkyoAVR VolumeUp)\
DOELSEIF\
([AQ_Cube:rotate] eq "right45" \
and [?OnkyoAVR:power] eq "on")\
(set OnkyoAVR VolumeUp)(set OnkyoAVR VolumeUp)\
DOELSEIF\
([AQ_Cube:rotate] eq "left" \
and [?OnkyoAVR:power] eq "on") \
(set OnkyoAVR VolumeDown)\
DOELSEIF\
([AQ_Cube:rotate] eq "left45" \
and [?OnkyoAVR:power] eq "on") \
(set OnkyoAVR VolumeDown)(set OnkyoAVR VolumeDown)\
DOELSE
attr WZ_DI_CubeDrehen do always
attr WZ_DI_CubeDrehen room Automatisierung,Wohnzimmer
attr WZ_DI_CubeDrehen wait 0:0,0.5:0:0,0.5


Gruß, mimo

Schlimbo

Hallo zusammen,
erst mal vielen danke für die Bereitstellung der Userreadings, das hat mir bei der Auswertung viel Zeit erspart.

Da der Würfel aber auch die Readings "temperature" und "battery" bereitstellt, würde eine Temperatur/Batterie Änderung auch ein triggern der userreadings bewirken und so ungewollt Aktionen ausführen.
Desshalb habe ich für die userreadings noch den Trigger Parameter gesetzt.

action:^\d{4}$ bzw. rotate:^-?\d+$

Anbei meine angepassten Attribute inkl. der letzten Modifikationen von Papaloewe & mimo84:
attr Zauberwuerfel1_action userReadings
first:^\d{4}$
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);;
  {return $first}},
last:^\d{4}$
{my $string = ReadingsVal($name,"state","");;
my $last  = substr($string, 3, 1);;
  {return $last}},
action:^\d+$
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);;
my $last   = substr($string, 3, 1);;
my $sum   = ($first + $last);;
if ($first eq "7") {return 'shake'}
elsif ($first eq $last) {return 'doubletap'}
elsif ($last eq "0") {return 'move'}
elsif ($sum eq "7") {return 'flip-180'}
elsif ($first gt "0" and $first lt "7") {return 'flip-90'}
else {return 'unknown'}},
side:^\d{4}$
{my $string = ReadingsVal($name,"state","");;
my $first  = substr($string, 0, 1);;
if ($first eq "1") {return 'upper'}
elsif ($first eq "2") {return 'behind'}
elsif ($first eq "3") {return 'left'}
elsif ($first eq "4") {return 'right'}
elsif ($first eq "5") {return 'front'}
elsif ($first eq "6") {return 'under'}
else {return 'unknown'}},
last_side:^\d{4}$
{my $string = ReadingsVal($name,"state","");;
my $last  = substr($string, 3, 1);;
if ($last eq "1") {return 'upper'}
elsif ($last eq "2") {return 'behind'}
elsif ($last eq "3") {return 'left'}
elsif ($last eq "4") {return 'right'}
elsif ($last eq "5") {return 'front'}
elsif ($last eq "6") {return 'under'}
else {return 'unknown'}}


attr Zauberwuerfel1_angle userReadings
rotate:^-?\d+$ {my $state = ReadingsVal($name,"state","");;
if ($state > 9000) {return 'right90'}
elsif ($state > 4500) {return 'right45'}
elsif ($state > 0) {return 'right'}
elsif ($state < -9000) {return 'left90'}
elsif ($state < -4500) {return 'left45'}
elsif ($state < 0) {return 'left'}
else {return 'unknown'}}


Gruß Schlimbo

ripperle

#22
Hallo,

Das mit den User readings hat bei mit geklappt, danke dafür!

Ich habe noch das Problem das mein cube die rotate Bewegung nicht erkennt (also drehen ohne zu flippen)...
Das ist jetzt mal unabhängig vom User reading...

Hatte zuvor den cube mit zigbee2mqtt betrieben und da gieng das noch...
Ist das ein bekanntes Problem?

Gruß!

EDIT:
Problem gefunden! Deconz legt 2 seperat devices bei mir an...

rohlande

Vielen Dank für das Code Beispiel. Hätte ich Wochen gebraucht.
Läuft wunderbar. Hatte bisher den Cube via "zigbee2MQTT" angebunden.
Deconz finde ich aber besser.

Vg Denny


Zitat von: Papaloewe am 12 Februar 2019, 18:30:44
Nach einiger Pfriemelei komme ich zu einem anderem Ergebnis.
Vielleicht habe ich aber auch eine neuere, ältere Version des Zauberwürfels?
Vielleicht hilft es ja jemandem. Viel Erfolg.
MfG
Thomas


defmod Zauberwuerfel1_action HUEDevice sensor 8  IODev=deCONZ
attr Zauberwuerfel1_action IODev deCONZ
attr Zauberwuerfel1_action icon xiaomi_cube
attr Zauberwuerfel1_action room HUEDevice,Wohnen
attr Zauberwuerfel1_action stateFormat Aktion: action\
Seite:  side
attr Zauberwuerfel1_action userReadings first \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;; \
  {return $first}}, \
last \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $last  = substr($string, 3, 1);;;; \
  {return $last}}, \
action \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;; \
my $last   = substr($string, 3, 1);;;; \
if ($first eq "7") {return 'shake'} \
elsif ($first eq $last) {return 'doubletap'}  \
elsif ($last eq "0") {return 'move'} \
elsif ($first gt "0" and $first lt "7") {return 'flip'} \
  else {return 'unknown'}}, \
side \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;;\
my $first  = substr($string, 0, 1);;;;  \
if ($first eq "1") {return 'upper'} \
elsif ($first eq "2") {return 'behind'} \
elsif ($first eq "3") {return 'left'} \
elsif ($first eq "4") {return 'right'} \
elsif ($first eq "5") {return 'front'} \
elsif ($first eq "6") {return 'under'} \
  else {return 'unknown'}}, \
last_side \
{my $string = ReadingsVal("Zauberwuerfel1_action","state","");;;; \
my $last  = substr($string, 3, 1);;;; \
if ($last eq "1") {return 'upper'} \
elsif ($last eq "2") {return 'behind'} \
elsif ($last eq "3") {return 'left'} \
elsif ($last eq "4") {return 'right'} \
elsif ($last eq "5") {return 'front'} \
elsif ($last eq "6") {return 'under'} \
  else {return 'unknown'}}


defmod Zauberwuerfel1_angle HUEDevice sensor 10  IODev=deCONZ
attr Zauberwuerfel1_angle IODev deCONZ
attr Zauberwuerfel1_angle icon xiaomi_cube
attr Zauberwuerfel1_angle room HUEDevice,Wohnen
attr Zauberwuerfel1_angle stateFormat Drehrichtung: rotate
attr Zauberwuerfel1_angle userReadings rotate \
{my $state = ReadingsVal("Zauberwuerfel1_angle","state","");;;; \
if ($state gt 0) {return 'right'} \
elsif ($state lt 0) {return 'left'} \
  else {return 'unknown'}}

HostSystem: Synology DS918 | FHEM im Docker Version: 6.0-s22528_v2.2.4 (dedizierte IP Adresse) | MQTT_Broker auf DS918 NAS | MQTT_FHEM | TASMOTA_DEVICE | SSChatBot | SSCam | LaMetric | FBAHAHTTP | CUL | SONOS | HUEBridge (deCONZ) Zigbee | FB_CALLMONITOR | InfluxDBLogger