[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht

Begonnen von stefanru, 22 März 2019, 21:16:26

Vorheriges Thema - Nächstes Thema

Keichi

#210
Ich weiß nicht ob ich es einfach nur überlesen habe oder Blind bin. Aber wie bekomme ich eigentlich die Aktuellen Werte von WLED ausgelesen, wenn ich sie mit einen DOIF ändern will und danach zurück zu den Einstellungen die ich vorher gesetzt hatte?

Edit: Ich habs nun so mit nen DOIF gelöst: define di_aqi_medium DOIF ([MYSENSOR_2:PM10:avg60] < 90) (set MQTT2_WLED_tischlampe apiraw &PS=250) (set MQTT2_WLED_tischlampe apiraw &GP=1&CL=#ffe100&FP=0&FX=100) (set MQTT2_WLED_tischlampe apiraw &PL=250)
attr di_aqi_medium wait 0,5,5
#   CFGFN     
#   DEF        ([MYSENSOR_2:PM10:avg60] < 90) (set MQTT2_WLED_tischlampe apiraw &PS=250) (set MQTT2_WLED_tischlampe apiraw &GP=1&CL=#ffe100&FP=0&FX=100) (set MQTT2_WLED_tischlampe apiraw &PL=250)


Sprich ich speichere den aktuellen State über die API in Preset 250, geb ihn 5sek zeit dafür, mach das was ich machen will und switch dann zurück auf das gespeicherte Preset. Ist zwar nicht schön aber funktioniert wunderbar.

Übrigens ist in RGB Wert nen Bug drin, wenn man mehrende Segmente benutz, so wie ich bei dieser Installation. Es ändert die Farbe generell nur für das erste segment statt alle, weswegen ich es über das Group Listing gelöst habe.

nussa

Hallo Alle,
@DeeSPe danke für dein Template.
mir ist aufgefallen, dass palette und effect nur funktioniert, wenn /Device/Topic keine Großbuchstaben hat.

lg Andreas

DeeSPe

Zitat von: nussa am 16 Januar 2023, 09:56:20
Hallo Alle,
@DeeSPe danke für dein Template.
mir ist aufgefallen, dass palette und effect nur funktioniert, wenn /Device/Topic keine Großbuchstaben hat.

lg Andreas

Wie ist dir das aufgefallen?
Im Code wird nirgends etwas an Groß-/Kleinschreibung verändert.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

nussa

Hallo,
ich habe mich gewundert warum ich keine Effekte oder die paletten umstellen konnte.

ich hatte als mqtt topic wlen/WZ1

als ich mit dem mqtt explorer mitgeschaut habe, ist mir aufgefallen, dass das topic wled/wz1/api=FX=67 gechickt wird, wenn ich z.B. "set MQTT2_wled_WZ1 effectname Colorwaves" sende.
mit dem set effect 67 wird richtig wled/WZ1/api=FX=67 geschickt und es geht.

das einfachste war WZ1 auf wz1 zu ändern, dann klappt es.

anbei ein bildschirmfoto vom mqtt explorer.

lg Andreas


DeeSPe

#214
Zitat von: nussa am 16 Januar 2023, 13:15:46
ich hatte als mqtt topic wlen/WZ1

als ich mit dem mqtt explorer mitgeschaut habe, ist mir aufgefallen, dass das topic wled/wz1/api=FX=67 gechickt wird, wenn ich z.B. "set MQTT2_wled_WZ1 effectname Colorwaves" sende.
mit dem set effect 67 wird richtig wled/WZ1/api=FX=67 geschickt und es geht.

das einfachste war WZ1 auf wz1 zu ändern, dann klappt es.

Das scheint aber kein Problem vom Template zu sein, sondern eher ein spezifisches MQTT_(SERVER|CLIENT) Problem?
Kenne mich damit aber zu wenig aus.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

Zitat von: DeeSPe am 16 Januar 2023, 13:37:17
Das scheint aber kein Problem vom Template zu sein, sondern eher ein spezifisches MQTT_(SERVER|CLIENT) Problem.
Hmm, wenn man die Daten richtig anliefert, werden die ja auch richtig übermittelt, oder habe ich das falsch interpretiert?

Glaube eher, dass es an dem lc in https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_attrT_WLED_Utils.pm#L102 liegt ;) .
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

DeeSPe

Zitat von: Beta-User am 16 Januar 2023, 13:42:20
Glaube eher, dass es an dem lc in https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_attrT_WLED_Utils.pm#L102 liegt ;) .

Ist mir wohl beim Überfliegen entfallen.
Wenn ich mir das so angucke weiß ich gar nicht wirklich warum das "lc" da überhaupt drin ist.

@nussa:
Könntest Du mal probieren ob es klappt wenn Du Zeile 102 so abänderst?
my $wled = InternalVal($dev,'CID',undef) // return;

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

nussa

Hallo Dan,
das wars, funktioniert!
danke!!

lg Andreas

DeeSPe

Zitat von: nussa am 16 Januar 2023, 17:05:38
Hallo Dan,
das wars, funktioniert!
danke!!

lg Andreas

Ja super!
Leider funktioniert es damit bei mir nicht mehr! :D
Eine Lösung die für alle funktioniert wäre aber besser!

Ich habe die WLED_set Funktion noch einmal überarbeitet wie sie nun hoffentlich bei uns beiden funktionieren sollte.
Könntest Du bitte testweise mal die komplette Funktion durch diese hier ersetzen und noch einmal testen?
sub WLED_set {
  my $dev  = shift // return;
  my $read = shift // return;
  my $val  = shift // return;
  my $cid = InternalVal($dev,'CID',undef) // return;
  my @wled = split('_',$cid);
  my $arr  = ReadingsVal($dev,'.'.$read.'s',undef) // return WLED_get($dev);
  my $top  = lc($wled[0]).'/'.$wled[1].'/api F';
  $top .= $read eq 'effect'?'X=':'P=';
  my $id;
  my $i = 0;
  for (split(',',$arr)){
    if ($_ ne $val) {
      $i++;
      next;
    } else {
      $id = $i;
      last;
    }
  }
  return defined $id ? $top.$id : undef;
}


Bei mir klappt's damit wieder wie vorher und bei Dir sollte es nun auch mit einem groß geschriebenen Topic funktionieren.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

nussa


DeeSPe

Zitat von: nussa am 17 Januar 2023, 08:05:00
Guten Morgen,
funktioniert bei mir.

lg Andreas

Danke fürs Testen Andreas.

@Beta-User:
Könntest Du bitte bei Gelegenheit die Funktion so abändern und einchecken?
Zitat von: DeeSPe am 16 Januar 2023, 18:22:52
sub WLED_set {
  my $dev  = shift // return;
  my $read = shift // return;
  my $val  = shift // return;
  my $cid = InternalVal($dev,'CID',undef) // return;
  my @wled = split('_',$cid);
  my $arr  = ReadingsVal($dev,'.'.$read.'s',undef) // return WLED_get($dev);
  my $top  = lc($wled[0]).'/'.$wled[1].'/api F';
  $top .= $read eq 'effect'?'X=':'P=';
  my $id;
  my $i = 0;
  for (split(',',$arr)){
    if ($_ ne $val) {
      $i++;
      next;
    } else {
      $id = $i;
      last;
    }
  }
  return defined $id ? $top.$id : undef;
}


Vielen Dank.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

TomLee

Zitat@Beta-User:
Könntest Du bitte bei Gelegenheit die Funktion so abändern und einchecken?

Und den Vorschlag aus #206 die IP in ein Reading zu schreiben ?

DeeSPe

#222
Zitat von: TomLee am 17 Januar 2023, 12:20:13
Und den Vorschlag aus #206 die IP in ein Reading zu schreiben ?

Klar, kann man auch machen! Sorry, hatte da nicht mehr dran gedacht.
Aber eigentlich steht ja die IP schon im Internal "IODev_CONN", dort allerdings noch mit Pre- und Suffix.
Von mir aus kann die IP aber auch noch in ein Reading geschrieben werden. Dann würde ich das Reading allerdings nur neu schreiben wenn es sich auch geändert hat, denn es ist ja im Normalfall nicht davon auszugehen dass sich die IP bei jedem Abruf ändert.

Zitatsub WLED_get {
  my $dev = shift // return;
  my $event = shift // undef;
  my $c;
  my $h = {
    sx => 'speed',
    ix => 'intensity',
    fp => 'palette',
    fx => 'effect',
    ps => 'preset'
  };
  for (keys %{$h}) {
    next if $event !~ m/(?<=<$_>)([\d]+)(?=<\/$_>)/x;
    if ($1 != ReadingsNum($dev,$h->{$_},-2)){
      $c->{$h->{$_}} = $1;
    }
  }
  my $io = InternalVal($dev,'LASTInputDev',AttrVal($dev,'IODev',InternalVal($dev,'IODev',undef)->{NAME})) // return defined $event ? $c : undef;
  my $ip = InternalVal($dev,$io.'_CONN',ReadingsVal($dev,'ip', undef)) =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/x ? $1 : return defined $event ? $c : undef;
  HttpUtils_NonblockingGet({
    url=>"http://$ip/json",
    callback=>sub($$$){
      my ($hash,$err,$data) = @_;
      WLED_setReadings($dev,$data,$ip);
    }
  });
  return defined $event ? $c : undef;
}

sub WLED_setReadings {
  my $dev  = shift // return;
  my $data = shift // return;
  my $ip   = shift // return;
  my $fx   = $data =~  m/effects..\[([^[]*?)]/x ? WLED_subst($1) : '';
  my $pl   = $data =~ m/palettes..\[([^[]*?)]/x ? WLED_subst($1) : '';
  my $hash = $defs{$dev};
  my @f    = split(',',$fx);
  my @p    = split(',',$pl);
  readingsBeginUpdate($hash);
  readingsBulkUpdate($hash,'effectname',$f[ReadingsNum($dev,'effect',0)]);
  readingsBulkUpdate($hash,'palettename',$p[ReadingsNum($dev,'palette',0)]);
  readingsEndUpdate($hash,1);
  readingsBeginUpdate($hash);
  readingsBulkUpdateIfChanged($hash,'.effectscount',(scalar @f)-1);
  readingsBulkUpdateIfChanged($hash,'.effects',$fx);
  readingsBulkUpdateIfChanged($hash,'.palettescount',(scalar @p)-1);
  readingsBulkUpdateIfChanged($hash,'.palettes',$pl);
  readingsBulkUpdateIfChanged($hash,'ip',$ip);
  readingsEndUpdate($hash,0);
  return;
}

@Beta-User:
Anbei mal die komplette geänderte Datei.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Beta-User

Hmm, vielleicht noch ein paar (zu?) schnelle Gedanken von meiner Seite:
- Wenn man die IP über die Connection ausliest, setzt das zwingend einen MQTT2_SERVER voraus und funktioniert mit MQTT2_CLIENT nicht (was ich vermutlich in einer Woche vergessen haben werde). Von daher würde ich eher dazu neigen, die IP beim Anwenden des attrTemplate auszulesen (versuchsweise), oder eben alternativ vom User eingeben zu lassen. Speichern dann als Reading*?
- Das mit der Groß- und Kleinschreibung ist auch irgendwie seltsam; eigentlich wäre es besser, auch diese Angabe direkt im attrTemplate ermitteln zu lassen (M2C kennt die CID nicht...), und dann wieder irgendwo zwischenzuspeichern. Da das Teil des Topics ist, wäre ggf. auch $DEVICETOPIC ein möglicher Speicherort.

*Da M2D zwischenzeitlich auch die Option bietet, mehrere deviceTopics anzugeben, könnte man so auch die IP in ein Attribut verlagern. Stellt sich nur die Frage des "Regel-/Ausnahmeverhältnisses". Da anscheinend bisher die Zahl der M2C-Nutzer in der Minderheit ist, würde man mit dem Internal anfangen, und wenn das nichts liefert, deviceTopic anzapfen?
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

TomLee

Ist es so in der Art gemeint ?
Zitat#source post: https://forum.fhem.de/index.php/topic,98880.msg995308.html#msg995308
name:wled_controller
filter:TYPE=MQTT2_DEVICE
desc:To control a WLED device, see https://github.com/Aircoookie/WLED/wiki for details).
order:W_01
{ Svn_GetFile('contrib/AttrTemplate/99_attrT_WLED_Utils.pm', 'FHEM/99_attrT_WLED_Utils.pm', sub(){ CommandReload(undef, '99_attrT_WLED_Utils') }) }
par:BASE_ID;BASE_ID typically is wled;{ AttrVal('DEVICE','readingList','') =~ m,([^:]+)[/][^/]+[/][^/]+:, ? $1 : undef }
par:DEVNAME;Device name as configured;{ AttrVal('DEVICE','readingList','') =~ m,[^:]+[/]([^/]+)[/][^/]+:, ? $1 : undef }
par:ICON;ICON as set, defaults to hue_filled_iris;{ AttrVal('DEVICE','icon','hue_filled_iris') }
par:IP;Insert Controller-IP ;{ InternalVal(AttrVal('MQTT2_wled_55da2c','IODev',InternalVal('MQTT2_wled_55da2c','IODev',undef)->{NAME}),'TYPE',undef) ne 'MQTT2_SERVER' ? undef : 1 }
attr DEVICE icon ICON
attr DEVICE setList\
  on:noArg BASE_ID/DEVNAME on\
  off:noArg BASE_ID/DEVNAME off\
  toggle:noArg BASE_ID/DEVNAME t\
  rgb:colorpicker,RGB BASE_ID/DEVNAME/col #$EVTPART1\
  brightness:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api A=$EVTPART1\
  dimup:noArg BASE_ID/DEVNAME/api A=~10\
  dimdown:noArg BASE_ID/DEVNAME/api A=~-10\
  speed:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api SX=$EVTPART1\
  intensity:colorpicker,BRI,0,1,255 BASE_ID/DEVNAME/api IX=$EVTPART1\
  effect:{'selectnumbers,0,1,'.ReadingsNum($name,'.effectscount',5).',0,lin'} BASE_ID/DEVNAME/api FX=$EVTPART1\
  effectname:{'select,'.join(',',sort(split(',',ReadingsVal($name,'.effects','Solid,Police'))))} {FHEM::attrT_WLED_Utils::WLED_set($NAME,'effect',$EVTPART1)}\
  effect_next:noArg BASE_ID/DEVNAME/api FX=~1\
  effect_prev:noArg BASE_ID/DEVNAME/api FX=~-1\
  effect_random:noArg BASE_ID/DEVNAME/api FX=r\
  effect_reset:noArg BASE_ID/DEVNAME/api FX=0\
  palette:{'selectnumbers,0,1,'.ReadingsNum($name,'.palettescount',5).',0,lin'} BASE_ID/DEVNAME/api FP=$EVTPART1\
  palettename:{'select,'.join(',',sort(split(',',ReadingsVal($name,'.palettes','Default,Party'))))}  {FHEM::attrT_WLED_Utils::WLED_set($NAME,'palette',$EVTPART1)}\
  palette_next:noArg BASE_ID/DEVNAME/api FP=~1\
  palette_prev:noArg BASE_ID/DEVNAME/api FP=~-1\
  palette_random:noArg BASE_ID/DEVNAME/api FP=r\
  palette_reset:noArg BASE_ID/DEVNAME/api FP=0\
  preset:selectnumbers,0,1,15,0,lin BASE_ID/DEVNAME/api PL=$EVTPART1\
  apiraw BASE_ID/DEVNAME/api $EVTPART1\
  seg BASE_ID/DEVNAME/api {'seg':{'i':[$EVTPART1,[$EVTPART2]]}}
attr DEVICE readingList \
  BASE_ID/DEVNAME/status:.* LWT\
  BASE_ID/DEVNAME/g:.* brightness\
  BASE_ID/DEVNAME/g:.* {$EVENT ? {state => 'on'} : {state => 'off'}}\
  BASE_ID/DEVNAME/c:.* {{rgb => substr($EVENT,1,6)}}\
  BASE_ID/DEVNAME/v:.* {FHEM::attrT_WLED_Utils::WLED_get($NAME,$EVENT)}
deletereading -q DEVICE (?!associatedWith|IODev).*
attr DEVICE devStateIcon {ReadingsVal($name,'LWT','offline') eq 'offline' ? '.*:message_attention@red' : Color::devStateIcon($name,'rgb','rgb','brightness','state')}
attr DEVICE webCmd rgb:brightness:effectname:speed:intensity:palettename:preset
attr DEVICE webCmdLabel RGB:Brightness\
:Effect:Speed:Intensity\
:Palette:Preset
attr DEVICE setStateList on off toggle dimdown dimup effect_prev effect_next effect_random palette_prev palette_next palette_random palette_reset effect_reset
attr DEVICE comment For questions about the use of different widgets for color selection see discussion at https://forum.fhem.de/index.php/topic,98880.msg995308.html
set DEVICE attrTemplate speechcontrol_type_light_255
setreading DEVICE ip IP
farewell:template has been applied successfully. <br>Note: webCmd and eventMap are just examples; adopt this to your needs.
attr DEVICE model wled_controller
setreading DEVICE attrTemplateVersion 20211220