[gelöst] Mysensors und setExtensions

Begonnen von Beta-User, 09 Januar 2019, 07:46:50

Vorheriges Thema - Nächstes Thema

rs

...

das hat die Auswirkung, dass "on-for-timer" nicht mehr funktioniert; heisst, die Lampen schalten sich nicht mehr ab.
Bei mir gilt das für HUE Lampen.

/R
rpi3+ & RaspBee | Phillips, Osram, IKEA, SIlvercrest Devices | FHEM 6.3 | Echo Show 15 | Yamaha YAS| LG TV | Ubuntu 24.04 - NextCloud 29 - OpemVPN - Wordpress - NAS - ...

rudolfkoenig

Zitatich glaube die änderung auf $hash bei InternalTimer durch version 19189 macht probleme.
Danke fuer den Hinweis, habs gefixt und (eingeschraenkt) getestet, Feedback ist willkommen.

rs

Ja,  bestätige, on-for-timer funktioniert wieder.

VIelen Dank
Roland
rpi3+ & RaspBee | Phillips, Osram, IKEA, SIlvercrest Devices | FHEM 6.3 | Echo Show 15 | Yamaha YAS| LG TV | Ubuntu 24.04 - NextCloud 29 - OpemVPN - Wordpress - NAS - ...

rudolfkoenig

ZitatMal der Versuch, das in Code zu fassen, ist vermutlich einfacher:
Bin nicht sicher, ob das fuers Verstehen deiner Absicht auch gilt :)

Ich sehe, dass fuer on-*/off-*/blink eine Transformation durchgefuehrt wird (das schliesst on-till/off-till auch ein), verstehe aber noch nicht, warum man nicht einfach state uebernimmt.

Warum wird bei $rgb die Indirektion ueber ein Reading genommen?


Beta-User

So, nochmal eine grob angetestete Variante, die zumindest für die MiLight-Bulbs zu funktionieren scheint:sub milight_devStateIcon255($;$$) {
  my ($name,$rgb,$se) = @_;
  if(lc(ReadingsVal($name,"state","on")) eq "off"){
    return ".*:off:toggle" unless (defined $se && $se && defined $defs{$name}->{TIMED_OnOff}->{CMD});
  };
  my $pct = ReadingsNum($name,"brightness","255");
  $rgb = ReadingsVal($name,$rgb,"FFFFFF");
  my $s = "on";
  if (defined $se && $se && $defs{$name}->{TIMED_OnOff}->{CMD} =~ m/(o.*-.*|blink)/s) {
    $s = $defs{$name}->{TIMED_OnOff}->{CMD} =~ m/on-.*/s ? "on-for-timer" : $defs{$name}->{TIMED_OnOff}->{CMD} =~ m/off-.*/s ? "off-for-timer" : ReadingsVal($name,"state","on") =~ m/off-.*/s ? "off-for-timer" : "light_toggle";
  } elsif ($pct < 254) {
    $s = sprintf("dim%02d%%",int((1+int($pct/18))*6.25));
  }
  if ($rgb ne "FFFFFF") {
    $s .= "@#$rgb";
  }
  return ".*:$s:toggle";
}

state kann man aus zwei Gründen nicht wirklich verwenden: Zum einen wird state wieder überschrieben, wenn das Zieldevice jeweils Vollzug meldet (state kommt über den JSON als Rückmeldung zum setzen des status), zum anderen ist da das Brightness-Thema nicht berücksichtigt, es wird also bei "on" ein anderes Reading herangezogen (bzw. gleich zwei, wenn man die rgb-Variante will); letzteres war der Grund, warum es überhaupt die Ausgangsfunktion in MQTT2_DEVICE gibt.

Die Indirektion kommt daher, dass wir nur den Namen des Readings kennen (und flexibel an die Funktion übergeben können wollen), aber noch nicht den Inhalt (es mag verwirrend sein, dass der code aus dem Namen den Inhalt ableitet und intern dieselbe Variable nutzt, das könnte man auch anders lösen, aber da man den Ausgangswert nie mehr braucht, habe ich das einfach umetikettiert).

Für Verbesserungsvorschläge bin ich aber offen, will nicht behaupten, da Experte zu sein.

Anbei noch ein list -r von dem Device, mit dem ich getestet habe (leider ohne den MQTT-Verkehr):
defmod Licht_Spuele MQTT2_DEVICE milight_0xBE59_3
attr Licht_Spuele IODev MQTT2_FHEM_Server
attr Licht_Spuele alias Spüle
attr Licht_Spuele devStateIcon {milight_devStateIcon255($name,'hex',1)}
attr Licht_Spuele eventMap /set_white:Weiss/night_mode:Nacht/white_mode:white/
attr Licht_Spuele group Licht
attr Licht_Spuele icon light_control
attr Licht_Spuele model X_01_esp_milight_hub_rgbw_bulb
attr Licht_Spuele readingList milight/states/0xBE59/rgbw/3:.* { json2nameValue($EVENT) }\
   milight/states/0xBE59/rgbw/0:.* { json2nameValue($EVENT) }\
   milight/updates/0xBE59/rgbw/3:.* { json2nameValue($EVENT) }\
   milight/updates/0xBE59/rgbw/0:.* { json2nameValue($EVENT) }
attr Licht_Spuele room Esszimmer
attr Licht_Spuele setExtensionsEvent 1
attr Licht_Spuele setList on milight/0xBE59/rgbw/3 {"status":"ON"}\
   off milight/0xBE59/rgbw/3 {"status":"OFF"}\
   brightness:colorpicker,BRI,0,15,255 milight/0xBE59/rgbw/3 {"$EVTPART0":"$EVTPART1"}\
   hue:colorpicker,HUE,0,1,359 milight/0xBE59/rgbw/3 {"$EVTPART0":"$EVTPART1"}\
   command:uzsuSelectRadio,Weiss,Nacht milight/0xBE59/rgbw/3 {"$EVTPART0":"$EVTPART1"}
attr Licht_Spuele setStateList on off
attr Licht_Spuele userReadings hex:color_r.* {Color::rgb2hex(ReadingsVal($name,"color_r",255),ReadingsVal($name,"color_g",255),ReadingsVal($name,"color_b",255))}, hue:bulb_mode.*white {"0"}
attr Licht_Spuele webCmd brightness:hue:command

setstate Licht_Spuele OFF
setstate Licht_Spuele 2019-04-24 20:10:30 brightness 112
setstate Licht_Spuele 2019-04-24 20:10:30 bulb_mode white
setstate Licht_Spuele 2019-04-12 19:44:01 button_id 0
setstate Licht_Spuele 2019-04-24 20:10:30 color_b 255
setstate Licht_Spuele 2019-04-24 20:10:30 color_g 255
setstate Licht_Spuele 2019-04-24 20:10:30 color_r 255
setstate Licht_Spuele 2019-04-18 06:42:07 command set_white
setstate Licht_Spuele 2019-04-24 20:10:30 hex FFFFFF
setstate Licht_Spuele 2019-04-24 20:10:30 hue 0
setstate Licht_Spuele 2019-04-18 07:20:57 myDimmDir 0
setstate Licht_Spuele 2019-04-18 07:25:40 myLastShort 2
setstate Licht_Spuele 2019-04-24 20:10:30 state OFF
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Ich habe die Funktion "umformatiert", und sie unter dem alten Namen als zigbee2mqtt_devStateIcon255 eingecheckt.

Da du mit Perl zunehmend mehr machst :), hier ein paar nicht offensichtliche Punkte:
- auch wenn ein Test wie $defs{$name}->{TIMED_OnOff}->{CMD} fehlschlaegt, es werden alle Hashes bis auf dem Letzten angelegt, d.h. nach der Pruefung existiert $defs{$name}->{TIMED_OnOff}. Ist in FHEM ein sehr "beliebter" Weg Verwirrung zu stiften.
- die Pruefung auf $se impliziert defined($se)
- im Regexp ist .* am Ende ueberfluessig, wenn man kein $ spezifiziert.
- das s Modifier ist fuer Mehrzeiler relevant (siehe perldoc perlre), ich erwarte fuer state sowas nicht.
Die letzten Punkte machen mAn den Code kuerzer, und damit einfacher lesbar.

Beta-User

Danke für's Einchecken und (v.a. auch) die hilfreichen Hinweise!
Es ist für mich immer wieder erhellend, was rauskommt, wenn sich ein echter Experte so einer Sache annimmt :) .
Jetzt muß ich das "nur noch" entsprechend in MYSENSORS_DEVICE einbauen ;D ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files