Autor Thema: [Gelöst] MQTT für WLED, rgb reading mit # klappt nicht  (Gelesen 26375 mal)

Offline ComputerZOO

  • Full Member
  • ***
  • Beiträge: 243
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #165 am: 20 Dezember 2021, 13:47:46 »
...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...

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4523
  • Wer anderen eine Bratwurst brät...
    • Buy me a coffee
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #166 am: 20 Dezember 2021, 13:52:01 »
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

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4523
  • Wer anderen eine Bratwurst brät...
    • Buy me a coffee
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #167 am: 20 Dezember 2021, 15:42:48 »
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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #168 am: 20 Dezember 2021, 15:52:10 »
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 ?

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18398
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #169 am: 20 Dezember 2021, 16:16:18 »
Wieso nicht mit dem dritten Parameter und $JSONMAP? Der wird via EvalSpecials übergeben (https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/10_MQTT2_DEVICE.pm#L185).
Server: HP-T620@Debian 11, 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

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #170 am: 20 Dezember 2021, 16:50:22 »
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.


Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18398
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #171 am: 20 Dezember 2021, 16:56:13 »
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-T620@Debian 11, 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

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #172 am: 20 Dezember 2021, 16:56:49 »
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");}})}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #173 am: 20 Dezember 2021, 17:09:59 »
... 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:


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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18398
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #174 am: 20 Dezember 2021, 17:14:23 »
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-T620@Debian 11, 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

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25411
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #175 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?

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #176 am: 20 Dezember 2021, 17:27:53 »
Zitat
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...

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

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #177 am: 20 Dezember 2021, 17:33:05 »
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

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25411
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #178 am: 20 Dezember 2021, 17:47:42 »
Zitat
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
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?

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 4149
  • ... wer sät, der erntet ...
Antw:[Gelöst] MQTT für WLED, rgb reading mit # klappt nicht
« Antwort #179 am: 20 Dezember 2021, 18:06:44 »
 :) 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.
« Letzte Änderung: 20 Dezember 2021, 18:08:17 von TomLee »

 

decade-submarginal