[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

ComputerZOO

Zitat von: Beta-User am 20 Dezember 2021, 12:32:08
...Mal abgesehen davon, dass unklar ist, wo der JSON herkommt...

Der JSON kommt beim Aufruf von http://wled-ip/json

Werde die Tage mal mit json2nameValue() spielen...

DeeSPe

Zitat von: TomLee am 20 Dezember 2021, 12:51:10
So (mit dem dort zu sehenden Gebastel) hatte ich mir bis vor kurzem den gewählten Effektnamen in das Device geholt gehabt.

Im Prinzip ist die Version von mir auf Basis dieses Codes entstanden. Ich habe das nur weiter optimiert.
Bei mir habe ich seit einigen Tagen ein Version laufen die sehr gut funktioniert. Den Code und das entsprechende AttrTemplate werde ich später am heutigen Tage mit Euch teilen. Das ist jetzt soweit alles von offensichtlichen Fehlern bereinigt und etliche Tage getestet. Einen offiziellem Einchecken steht von meiner Seite aus dann nichts entgegen.

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

DeeSPe

Hier meine finale Version des AttrTemplate für WLED:
#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') }
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
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 or prior


Die dazu passende Moduldatei befindet sich im Anhang.

@Beta-User: Sofern von Dir für gut erachtet könnte diese Version dann Einzug ins SVN halten.

Danke.

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 von: ComputerZOO am 20 Dezember 2021, 13:47:46
Werde die Tage mal mit json2nameValue() spielen...

Frage an die Experten, kann sein das ich auch völlig daneben liege, theoretisch könnte man doch beliebigen Perlcode hinter dem Topic in der rL eines Devices ausführen, wichtig ist doch nur das j2nv die Referenz auf den Hash zurückgibt ?

Wenn ich sowas versuche, startet FHEM neu:

wled/538e36/g:.* {HttpUtils_NonblockingGet({url=>"http://192.168.188.95/json",callback=>sub($$$){my ($hash,$err,$data) = @_;json2namevalue($data,"",$JSONMAP,"ver|col");}})}

Mit json2reading erhalte ich die gewünschten Readings problemlos:

{HttpUtils_NonblockingGet({
    url=>"http://192.168.188.95/json",
    callback=>sub($$$){
      my ($hash,$err,$data) = @_;;
      json2reading($defs{Device1},$data,"",undef,"","ver|col");;'done'
    }})}


Wenn es mit j2nv nicht gehen sollte, ist es möglich mit dem vierten Parameter von j2r die Readingnamen anzupassen, wenn ja wie genau ?

Beta-User

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 mir zu hoch wie das jetzt gemeint ist.

Vlt. erstmal ganz langsam und vorne angefangen.

Warum stürzt Fhem ab bei der Variante mit j2nv in der RL ?
Die Parameter sind mMn. korrekt angegeben und mit dem Attribut jsonMap könnte man umbenennen.


Beta-User

Warum FHEM abschmiert sollte im Log stehen, ich würde darauf tippen, dass j2nv() "in der Luft" hängt, weil es dazu gemacht ist, einen Hash zurückzugeben, und nicht, ein Device zu füllen (das ist ein zeitlich entkoppelter callback, wenn ich das nicht komplett missverstehe).

Aber den Hash aus dem Internal JSONMAP gibt MQTT2_DEVICE in die Evaluierung des Perl-Codes weiter, wenn man die "Variable" $JSONMAP reinschreibt. Das ist nicht auf j2nv() begrenzt, sondern generischer Natur.
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

OK, wenn man j2nv richtig schreibt stürzt Fhem nicht mehr ab, die gewünschten Readings bleiben aber aus.

wled/538e36/c:.* {HttpUtils_NonblockingGet({url=>"http://192.168.188.95/json",callback=>sub($$$){my ($hash,$err,$data) = @_;json2nameValue($data,"",$JSONMAP,"ver|col");}})}

TomLee

Zitat von: Beta-User am 20 Dezember 2021, 16:56:13
... weil es dazu gemacht ist, einen Hash zurückzugeben, und nicht, ein Device zu füllen

Nee , Referenz, keinen Hash und mit der Begrifflichkeit füllen komm ich wieder nicht ganz mit.
Mit füllen verstehe ich Readings erstellen, irgendwie korreliert das doch mit der Aussage von damals:


Zitat von: rudolfkoenig am 07 August 2020, 15:49:17
Ich meine ja: json2nameValue liefert eine Referenz auf ein "flaches" Hash zurueck, was aus "Name"=>"Wert" Paaren besteht.
Es dient nicht dazu, JSON in Perl Datenstrukturen zu verwandeln, sondern um JSON Daten nach FHEM Readings bzw. Events zu konvertieren.

Beta-User

OK, es gibt die Referenz auf einen Hash zurück. Hier aber innerhalb eines "callback", also einer Funktion, die zeitlich entkoppelt irgendwann was zurückliefert, aber eben nicht mehr innerhalb des aufrufenden Codes, der dann wüßte, was er mit der Referenz auf einen Hash anstellen soll. Die irgendwann später (wohin) abgelieferte Referenz weiß nicht mehr, was mit ihr geschehen soll...

Und ja, mit "Füllen" war Reading aus der Referenz ableiten gemeint.
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 bin nicht sicher, dass ich das Problem verstehe (ich habe den Faden seit eine Weile verloren), aber waere nicht json2reading() was fuer euch?

TomLee

ZitatHier aber innerhalb eines "callback", also einer Funktion, die zeitlich entkoppelt irgendwann was zurückliefert, aber eben nicht mehr innerhalb des aufrufenden Codes, der dann wüßte, was er mit der Referenz auf einen Hash anstellen soll. Die irgendwann später (wohin) abgelieferte Referenz weiß nicht mehr, was mit ihr geschehen soll...

Danke, für die Erklärung, so irgendwie hatte ich mir das zuvor zusammengereimt das es sein würde.




Dann halt mit json2reading, dazu hab ich die Erklärung dann aber nicht verstanden, zu wenig Verständnis anhand des gezeigten Code abzuleiten wie das anzugehen wäre die Namen anzupassen

TomLee

Zitat von: rudolfkoenig am 20 Dezember 2021, 17:22:48
Ich bin nicht sicher, dass ich das Problem verstehe (ich habe den Faden seit eine Weile verloren), aber waere nicht json2reading() was fuer euch?

In #161 steht der JSON, in #168 mein Ansatz ( der auch funzt), jetzt nur noch ordentliche Namen bitte. :P

rudolfkoenig

ZitatDann halt mit json2reading, dazu hab ich die Erklärung dann aber nicht verstanden, zu wenig Verständnis anhand des gezeigten Code abzuleiten wie das anzugehen wäre die Namen anzupassen
Statt
json2nameValue($data,"",$JSONMAP,"ver|col")
koennte man
my $hash = $defs{<DEVICENAME>};; json2reading($hash, $data, "", $hash->{JSONMAP},undef,"ver|col")
probieren.

Der zweite JSONMAP ist deswegen so komisch, weil ich nicht sicher bin, ob die Variable $JSONMAP beim Ausfuehrung des Callbacks zu Verfuegung steht.
Kann das jemand pruefen?

TomLee

#179
 :) Thx


Die Frage ist welchen Topicpfad wählt man um den Code auszuführen und welche Namen.
Das interessiert mich aber recht wenig, weil ich das nicht brauche und ungerne mit Licht beschäftige.


Hier der Code der bei mir klappt:

wled/538e36/c:.* {HttpUtils_NonblockingGet({url=>"http://192.168.188.95/json",callback=>sub($$$){my ($hash,$err,$data) = @_;my $hash = $defs{$NAME}; json2reading($hash, $data, "", $hash->{JSONMAP},undef,"ver|col");}})}

@ComputerZoo

Du wolltest das haben, mit dem Attribut jsonMap kann man die Readingnamen anpassen, mach mal Vorschläge.