WLED JSON API mit HTTPMOD nutzen, Alternativ zu MQTT

Begonnen von Torxgewinde, 19 Dezember 2021, 18:44:47

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo,
Das WLED Projekt (https://kno.wled.ge/, https://github.com/Aircoookie/WLED/) bietet zu der gut bekannten MQTT Schnittstelle auch eine JSON API (https://kno.wled.ge/interfaces/json-api/). Diese kann man mit HTTPMOD nutzen, da ich allerdings ein wenig rumprobieren musste bis es klappte, hier meine Notizen. Mich interessierten nur wenige Parameter (Helligkeit und Preset), aber wenn man das Prinzip einmal sieht, kann man es für beliebige weitere Parameter abwandeln.

Besonderheit:

  • Bei Loglevel 6 werden die Fehler bei nicht erreichbarem Gerät nicht in die Logdatei geschrieben. Da ich recht schnell polle, wurden das zuviele Einträge falls das Gerät mal ausgeschaltet ist.
  • Wenn ein Fehler auftaucht wird recht pauschal der Status auf "offline" geschaltet. Hier wird nur abgefragt wie lange die letzte Fehlermeldung her ist und es wird nicht auch auf den Fehlertext selbst geachtet. gut genug, aber noch Luft nach oben...

defmod Ringlicht HTTPMOD http://<IP>/json 5
attr Ringlicht errLogLevel 6
attr Ringlicht showError 1

attr Ringlicht reading01JSON state_ps
attr Ringlicht reading01Name preset

attr Ringlicht reading02JSON state_bri
attr Ringlicht reading02Name brightness

attr Ringlicht set01Data {"ps":"$val"}
attr Ringlicht set01Header Content-Type: application/json
attr Ringlicht set01Method POST
attr Ringlicht set01Name preset
attr Ringlicht set01URL http://<IP>/json/state

attr Ringlicht set02Data {"bri":"$val"}
attr Ringlicht set02Header Content-Type: application/json
attr Ringlicht set02Method POST
attr Ringlicht set02Name brightness
attr Ringlicht set02URL http://<IP>/json/state

attr Ringlicht stateFormat {\
  if( time_str2num(ReadingsTimestamp($name, "LAST_ERROR", 0)) > time_str2num(ReadingsTimestamp($name, "preset", 0)) ) {\
fhem("IF (AttrVal(\"$name\", \"showError\", 0) != 0) (attr -silent $name showError 0, trigger $name offline)");;\
return "offline";;\
  }\
  \
  my $bri = ReadingsNum($name,"brightness","-1");;\
  my $ps = ReadingsNum($name,"preset","-1");;\
  \
  fhem("IF (AttrVal(\"$name\", \"showError\", 1) != 1) (attr -silent $name showError 1, trigger $name online)");;\
  return "Preset: $ps, Brightness: $bri";;\
}


Jetzt kann man das Preset-reading und den Set-Befehl bequem nutzen um zum Beispiel einen eingehenden Anruf an der WLED Leuchte zu signalisieren:
defmod Ringlicht.Action DOIF ([Anrufmonitor:"ring"])\
{ Log 1, "Telefon klingelt, Signal auf Ringlicht mit Preset 99, schalte nach 30 Sekunden wieder auf den gerade aktiven Zustand zurück" }\
(define -temporary Ringlicht.Action.timer at +00:00:30 set Ringlicht preset [Ringlicht:preset])\
(set Ringlicht preset 99)
attr Ringlicht.Action cmdpause 31
attr Ringlicht.Action do always


Viel Spaß!

Pumba9876

#1
Moin Torx ,
Habe dein Code mal getestet und da kam immer fehler Meldung mit dem klammer Setzung habe sie dann erstmal weg gelassen. Und mit dem Hellund dunkel regel hat auch nicht funktioniert . Hast du vielleicht noch einen Tipp für mich.
defmod Ringlicht HTTPMOD http://192.168.178.16/json 10
attr Ringlicht userattr readingList setList setreading
attr Ringlicht comment attr Ringlicht extractAllJSON 1attr Ringlicht reading01JSON state_psattr Ringlicht reading01Name presetattr Ringlicht reading02JSON state_briattr Ringlicht reading02Name brightnessattr Ringlicht reading03JSON state_onattr Ringlicht reading03Name on_offattr Ringlicht reading04JSON info_fxcountattr Ringlicht reading04Name effekteattr Ringlicht reading05Name effektespeedattr Ringlicht room System->Testattr Ringlicht set01Data {"ps":"$val"}attr Ringlicht set01Header Content-Type: application/jsonattr Ringlicht set01Method POSTattr Ringlicht set01Name presetattr Ringlicht set01URL http://192.168.178.16/json/stateattr Ringlicht set02Data {"bri":"$val"}attr Ringlicht set02Header Content-Type: application/jsonattr Ringlicht set02Method POSTattr Ringlicht set02Name brightnessattr Ringlicht set02URL http://192.168.178.16/json/stateattr Ringlicht showError 1attr Ringlicht stateFormat Helligkeit :brightness
attr Ringlicht devStateIcon 1:FS20.on 0:FS20.off
attr Ringlicht errLogLevel 6
attr Ringlicht extractAllJSON 0
attr Ringlicht extractAllJSONFilter state
attr Ringlicht icon hue2019_archetypesPendantRound
attr Ringlicht reading01JSON state_on
attr Ringlicht reading01Name lampe_status
attr Ringlicht reading02JSON state_bri
attr Ringlicht reading02Name lampe_helligkeit
attr Ringlicht reading03JSON state_seg_01_fx
attr Ringlicht reading03Name lampe_effekt
attr Ringlicht reading04JSON state_seg_01_sx
attr Ringlicht reading04Name lampe_effekt_speed
attr Ringlicht reading05JSON state_seg_01_ix
attr Ringlicht reading05Name lampe_effekt_int
attr Ringlicht reading06JSON state_seg_01_pal
attr Ringlicht reading06Name lampe_effekt_palette
attr Ringlicht reading07JSON effects
attr Ringlicht reading07Name effekt_Liste
attr Ringlicht reading07RecombineExpr join ",", @matchlist
attr Ringlicht reading08JSON palettes
attr Ringlicht reading08Name farbpalette_liste
attr Ringlicht reading08RecombineExpr join ",", @matchlist
attr Ringlicht reading11JSON state_seg_01_col_01_0
attr Ringlicht reading11Name rgbr
attr Ringlicht reading12JSON state_seg_01_col_01_1
attr Ringlicht reading12Name rgbg
attr Ringlicht reading13JSON state_seg_01_col_01_2
attr Ringlicht reading13Name rgbb
attr Ringlicht room System->Test
attr Ringlicht set01Data {"on":"$val"}
attr Ringlicht set01Header Content-Type: application/json
attr Ringlicht set01Method POST
attr Ringlicht set01Name Lampe_ein
attr Ringlicht set01URL http://192.168.178.16/json/state
attr Ringlicht set02Data {"bri": "$val"}
attr Ringlicht set02Header Content-Type: application/json
attr Ringlicht set02Method POST
attr Ringlicht set02Name helligkeit
attr Ringlicht set02URL http://192.168.178.16/json/state
attr Ringlicht setList Lampe_ein:1,0 helligkeit:colorpicker, BRI,0,1,255
attr Ringlicht stateFormat lampe_status

setstate Ringlicht 0
setstate Ringlicht 2022-12-30 14:00:05 effekt_Liste Solid,Blink,Scan,Heartbeat,Pacifica,Candle Multi,Solid Glitter,Sunrise,Phased,Phased Noise,Twinkleup,Noise Pal,Sine,Scan Dual,Flow,Chunchun,Dancing Shadows,Washing Machine,Candy Cane,Blends,TV Simulator,Dynamic Smooth,* Pixels,* Pixelwave,Fade,* Juggles,* Matripix,* Gravimeter,* Plasmoid,* Puddles,* Midnoise,* Noisemeter,* Noisefire,* Puddlepeak,* Ripplepeak,Theater,* Waterfall,* Gravcenter,* Gravcentric,Theater Rainbow,Running,Saw,Twinkle,Dissolve,Dissolve Rnd,Breathe,Sparkle,Sparkle Dark,Sparkle+,Strobe,Strobe Rainbow,Strobe Mega,Blink Rainbow,Android,Chase,Chase Random,Wipe,Chase Rainbow,Chase Flash,Chase Flash Rnd,Rainbow Runner,Colorful,Traffic Light,Sweep Random,Running 2,Aurora,Stream,Wipe Random,Scanner,Lighthouse,Fireworks,Rain,Tetrix,Fire Flicker,Gradient,Loading,Police,Police All,Random Colors,Two Dots,Two Areas,Circus,Halloween,Tri Chase,Tri Wipe,Tri Fade,Lightning,ICU,Multi Comet,Sweep,Scanner Dual,Stream 2,Oscillate,Pride 2015,Juggle,Palette,Fire 2012,Colorwaves,Bpm,Fill Noise,Dynamic,Noise 1,Noise 2,Noise 3,Noise 4,Colortwinkles,Lake,Meteor,Meteor Smooth,Railway,Ripple,Colorloop,Twinklefox,Twinklecat,Halloween Eyes,Solid Pattern,Solid Pattern Tri,Spots,Spots Fade,Glitter,Candle,Fireworks Starburst,Rainbow,Fireworks 1D,Bouncing Balls,Sinelon,Sinelon Dual,Sinelon Rainbow,Popcorn,Drip,Plasma,Percent,Ripple Rainbow
setstate Ringlicht 2022-12-30 14:00:05 farbpalette_liste Default,* Random Cycle,Forest,Rainbow,Rainbow Bands,Sunset,Rivendell,Breeze,Red & Blue,Yellowout,Analogous,Splash,* Color 1,Pastel,Sunset 2,Beech,Vintage,Departure,Landscape,Beach,Sherbet,Hult,Hult 64,* Colors 1&2,Drywet,Jul,Grintage,Rewhi,Tertiary,Fire,Icefire,Cyane,Light Pink,Autumn,* Color Gradient,Magenta,Magred,Yelmag,Yelblu,Orange & Teal,Tiamat,April Night,Orangery,C9,Sakura,* Colors Only,Aurora,Atlantica,C9 2,C9 New,Temperature,Aurora 2,Party,Cloud,Lava,Ocean
setstate Ringlicht 2022-12-30 14:00:05 lampe_effekt 0
setstate Ringlicht 2022-12-30 14:00:05 lampe_effekt_int 128
setstate Ringlicht 2022-12-30 14:00:05 lampe_effekt_palette 0
setstate Ringlicht 2022-12-30 14:00:05 lampe_effekt_speed 128
setstate Ringlicht 2022-12-30 14:00:05 lampe_helligkeit 255
setstate Ringlicht 2022-12-30 14:00:05 lampe_status 0
setstate Ringlicht 2022-12-30 14:00:05 rgbb 234
setstate Ringlicht 2022-12-30 14:00:05 rgbg 0
setstate Ringlicht 2022-12-30 14:00:05 rgbr 255


Gruß Pumba
1x FB7590 1x RPI3B 4xShelly 2.5 2x Shelly1Philips Hue ,Teufel Soundbar ,Ones, foscam Kamera

Torxgewinde

Kannst du die Fehlermeldung bitte auch posten?

Um das Problem einzugrenzen schlage ich vor die device-Konfiguration einzukürzen bis es mit einem einzigem Reading und Setting funktioniert. Wenn das wie am Schnürchen läuft, kann man immer mehr ergänzen, bis es wieder Fehler gibt. Je kleinschrittiger man dabei vorgeht, umso genauer weiß man wo das Problem liegt:

Als Grundstock:

defmod Ringlicht HTTPMOD http://192.168.178.16/json 10
attr Ringlicht errLogLevel 6
attr Ringlicht reading01JSON state_on
attr Ringlicht reading01Name lampe_status
attr Ringlicht set01Data {"on":"$val"}
attr Ringlicht set01Header Content-Type: application/json
attr Ringlicht set01Method POST
attr Ringlicht set01Name Lampe_ein
attr Ringlicht set01URL http://192.168.178.16/json/state


und dann immer mehr ergänzen...

Pumba9876

#3
Das ist die Fehlermeldung die ich bekomme wenn ich die stateFormat Zeile eingebenError evaluating Ringlicht stateFormat: syntax error at (eval 8836205) line 1, near "\ if" syntax error at (eval 8836205) line 2, at EOF Can't redeclare "my" in "my" at (eval 8836205) line 5, near "\ my" syntax error at (eval 8836205) line 9, at EOF. Und beim Set Befehl passiert auch nichts .
1x FB7590 1x RPI3B 4xShelly 2.5 2x Shelly1Philips Hue ,Teufel Soundbar ,Ones, foscam Kamera

Torxgewinde

Ok,
Da bin ich dann leider auch überfragt. Ich packe hier nochmal meine funktionierende Definition rein. Versuche die mal ohne Änderung außer der IP. Die WLED Version war 0.13.0 und ich habe auch mal auf 0.14.0b aktualisiert - das klappt auch wunderbar.


defmod Ringlicht HTTPMOD http://<IP>/json 30
attr Ringlicht errLogLevel 6
attr Ringlicht event-on-change-reading preset, brightness, LAST_ERROR
attr Ringlicht icon audio_rec
attr Ringlicht reading01JSON state_ps
attr Ringlicht reading01Name preset
attr Ringlicht reading02JSON state_bri
attr Ringlicht reading02Name brightness
attr Ringlicht room Badezimmer
attr Ringlicht set01Data {"ps":"$val"}
attr Ringlicht set01Header Content-Type: application/json
attr Ringlicht set01Method POST
attr Ringlicht set01Name preset
attr Ringlicht set01URL http://<IP>/json/state
attr Ringlicht set02Data {"bri":"$val"}
attr Ringlicht set02Header Content-Type: application/json
attr Ringlicht set02Method POST
attr Ringlicht set02Name brightness
attr Ringlicht set02URL http://<IP>/json/state
attr Ringlicht showError 1
attr Ringlicht stateFormat {\
  if( time() - time_str2num(ReadingsTimestamp($name, "LAST_ERROR", 0)) <= 1) {\
  return "offline"\
  } \
  \
  my $bri = ReadingsNum($name,"brightness","-1");;\
  my $ps = ReadingsNum($name,"preset","-1");;\
  \
  return "Preset: $ps, Brightness: $bri"\
}

MadMax-FHEM

#5
Zitat von: Pumba9876 am 30 Dezember 2022, 21:03:04
Das ist die Fehlermeldung die ich bekomme wenn ich die stateFormat Zeile eingebenError evaluating Ringlicht stateFormat: syntax error at (eval 8836205) line 1, near "\ if" syntax error at (eval 8836205) line 2, at EOF Can't redeclare "my" in "my" at (eval 8836205) line 5, near "\ my" syntax error at (eval 8836205) line 9, at EOF. Und beim Set Befehl passiert auch nichts .

@Pumba9876: Wie/wo/womit gibst du denn die Definition ein?

@Torxgewinde: ich vermute dein Post ist "RawDef"?

@Pumba9876: d.h. du musst das auch per RawDef eingeben

Ich kann es mangels HW nicht ausprobieren...
EDIT: naja, zumindest kann ich die Definition von @Torxgewinde eingeben OHNE Fehler. Es funktioniert nat. aber halt nicht 8)
EDIT: gilt für die erste Definition als auch für die letzte gepostete Definition von @Torxgewinde

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Pumba9876

Frohes neues  8)
@MadMax-FHEM habe über RawDef eingegeben .Trotzdem danke für eure Bemühungen. defmod Ringlicht HTTPMOD http://192.168.178.16/json 5
attr Ringlicht userattr readingList setList setreading
attr Ringlicht devStateIcon 1:FS20.on 0:FS20.off
attr Ringlicht errLogLevel 6
attr Ringlicht event-on-change-reading lamp.*,rgb.*nweiss
attr Ringlicht extractAllJSON 0
attr Ringlicht extractAllJSONFilter state
attr Ringlicht icon hue2019_archetypesPendantRound
attr Ringlicht reading01JSON state_on
attr Ringlicht reading01Name lampe_status
attr Ringlicht reading02JSON state_bri
attr Ringlicht reading02Name lampe_helligkeit
attr Ringlicht reading03JSON state_seg_01_fx
attr Ringlicht reading03Name lampe_effekt
attr Ringlicht reading04JSON state_seg_01_sx
attr Ringlicht reading04Name lampe_effekt_speed
attr Ringlicht reading05JSON state_seg_01_ix
attr Ringlicht reading05Name lampe_effekt_int
attr Ringlicht reading06JSON state_seg_01_pal
attr Ringlicht reading06Name lampe_effekt_palette
attr Ringlicht reading07JSON effects
attr Ringlicht reading07Name effekt_Liste
attr Ringlicht reading07RecombineExpr join ",", @matchlist
attr Ringlicht reading08JSON palettes
attr Ringlicht reading08Name farbpalette_liste
attr Ringlicht reading08RecombineExpr join ",", @matchlist
attr Ringlicht reading11JSON state_seg_01_col_01_0
attr Ringlicht reading11Name rgbr
attr Ringlicht reading12JSON state_seg_01_col_01_1
attr Ringlicht reading12Name rgbg
attr Ringlicht reading13JSON state_seg_01_col_01_2
attr Ringlicht reading13Name rgbb
attr Ringlicht reading14JSON state_seg_01_col_01_3
attr Ringlicht reading14Name weiss
attr Ringlicht reading20Name farbeHex
attr Ringlicht room System->Test
attr Ringlicht set01Name lampe_status
attr Ringlicht set01URL http://192.168.178.16/win&T=3
attr Ringlicht set02Name lampe_helligkeit
attr Ringlicht set02URL http://192.168.178.16/win&A=$val
attr Ringlicht set05Name farbeHex
attr Ringlicht set05TextArg 1
attr Ringlicht set06Name weiss
attr Ringlicht set06URL http://192.168.178.16/win&W=$val
attr Ringlicht set07Name rgbr
attr Ringlicht set07URL http://192.168.178.16/win&R=$val
attr Ringlicht set08Name rgbg
attr Ringlicht set08URL http://192.168.178.16/win&G=$val
attr Ringlicht set09Name rgbb
attr Ringlicht set09URL http://192.168.178.16/win&B=$val
attr Ringlicht setList lampe_status lampe_helligkeit weiss rgbr rgbg rgbb
attr Ringlicht setreading farbeHex:colorpicker,RGB
attr Ringlicht showError 1
attr Ringlicht stateFormat lampe_status
attr Ringlicht userReadings farbeHex {Color::rgb2hex(ReadingsVal($name,"rgbr",255),ReadingsVal($name,"rgbg",255),ReadingsVal($name,"rgbb",255))},\
rgbr,rgbg,rgbb,\

attr Ringlicht webCmd lampe_status:lampe_helligkeit:farbeHex:weiss:rgbr:rgbg:rgbb
attr Ringlicht webCmdLabel :Helligkeit :Farbe :Weiss:Rot :Grün:Blau
attr Ringlicht widgetOverride lampe_helligkeit:colorpicker,BRI,0,1,255 lampe_status:uzsuToggle,1,0 farbeHex:colorpicker weiss:colorpicker,BRI,0,1,255 rgbr:colorpicker,BRI,0,1,255 rgbg:colorpicker,BRI,0,1,255 rgbb:colorpicker,BRI,0,1,255

setstate Ringlicht 0
setstate Ringlicht 2023-01-02 13:04:59 effekt_Liste Solid,Blink,Scan,Heartbeat,Pacifica,Candle Multi,Solid Glitter,Sunrise,Phased,Phased Noise,Twinkleup,Noise Pal,Sine,Scan Dual,Flow,Chunchun,Dancing Shadows,Washing Machine,Candy Cane,Blends,TV Simulator,Dynamic Smooth,* Pixels,* Pixelwave,Fade,* Juggles,* Matripix,* Gravimeter,* Plasmoid,* Puddles,* Midnoise,* Noisemeter,* Noisefire,* Puddlepeak,* Ripplepeak,Theater,* Waterfall,* Gravcenter,* Gravcentric,Theater Rainbow,Running,Saw,Twinkle,Dissolve,Dissolve Rnd,Breathe,Sparkle,Sparkle Dark,Sparkle+,Strobe,Strobe Rainbow,Strobe Mega,Blink Rainbow,Android,Chase,Chase Random,Wipe,Chase Rainbow,Chase Flash,Chase Flash Rnd,Rainbow Runner,Colorful,Traffic Light,Sweep Random,Running 2,Aurora,Stream,Wipe Random,Scanner,Lighthouse,Fireworks,Rain,Tetrix,Fire Flicker,Gradient,Loading,Police,Police All,Random Colors,Two Dots,Two Areas,Circus,Halloween,Tri Chase,Tri Wipe,Tri Fade,Lightning,ICU,Multi Comet,Sweep,Scanner Dual,Stream 2,Oscillate,Pride 2015,Juggle,Palette,Fire 2012,Colorwaves,Bpm,Fill Noise,Dynamic,Noise 1,Noise 2,Noise 3,Noise 4,Colortwinkles,Lake,Meteor,Meteor Smooth,Railway,Ripple,Colorloop,Twinklefox,Twinklecat,Halloween Eyes,Solid Pattern,Solid Pattern Tri,Spots,Spots Fade,Glitter,Candle,Fireworks Starburst,Rainbow,Fireworks 1D,Bouncing Balls,Sinelon,Sinelon Dual,Sinelon Rainbow,Popcorn,Drip,Plasma,Percent,Ripple Rainbow
setstate Ringlicht 2023-01-02 13:04:59 farbeHex FF7397
setstate Ringlicht 2023-01-02 13:04:59 farbpalette_liste Default,* Random Cycle,Forest,Rainbow,Rainbow Bands,Sunset,Rivendell,Breeze,Red & Blue,Yellowout,Analogous,Splash,* Color 1,Pastel,Sunset 2,Beech,Vintage,Departure,Landscape,Beach,Sherbet,Hult,Hult 64,* Colors 1&2,Drywet,Jul,Grintage,Rewhi,Tertiary,Fire,Icefire,Cyane,Light Pink,Autumn,* Color Gradient,Magenta,Magred,Yelmag,Yelblu,Orange & Teal,Tiamat,April Night,Orangery,C9,Sakura,* Colors Only,Aurora,Atlantica,C9 2,C9 New,Temperature,Aurora 2,Party,Cloud,Lava,Ocean
setstate Ringlicht 2023-01-02 13:04:59 lampe_effekt 0
setstate Ringlicht 2023-01-02 13:04:59 lampe_effekt_int 128
setstate Ringlicht 2023-01-02 13:04:59 lampe_effekt_palette 2
setstate Ringlicht 2023-01-02 13:04:59 lampe_effekt_speed 128
setstate Ringlicht 2023-01-02 13:04:59 lampe_helligkeit 91
setstate Ringlicht 2023-01-02 13:04:59 lampe_status 0
setstate Ringlicht 2023-01-02 13:04:59 rgbb 151
setstate Ringlicht 2023-01-02 13:04:59 rgbg 115
setstate Ringlicht 2023-01-02 13:04:59 rgbr 255
setstate Ringlicht 2023-01-02 13:04:59 weiss 0

Habe meine Lampe jetzt so definiert.
Nur mit den Set für Farbe habe ich jetzt noch etwas Probleme von colorpicker zur Lampe .
Gruß Pumba
1x FB7590 1x RPI3B 4xShelly 2.5 2x Shelly1Philips Hue ,Teufel Soundbar ,Ones, foscam Kamera

Torxgewinde

@Pumba: Gut zu hören das es zum großen Anteil klappt. Mit dem Colorpicker ist ein wenig schade, aber das wird sicherlich auch noch.

@Mad-Max: Ja, das ist die Raw-Definition ohne die setstate Befehle am Ende.