Event soll NeoPixel (WS2812B) steuern

Begonnen von Shardan, 21 Juli 2019, 02:00:00

Vorheriges Thema - Nächstes Thema

Shardan

Hallo zusammen,

ich stehe mir grade mal wieder selbst auf den Füßen... :-\

Bei mir läuft ein Wettersensor, der Regen und Gewittertätigkeit ausgibt. Die Ausgabe erfolgt schlicht in Stufen 0,1,2,3.
Der Event vom Sensor kommt an:
2019-07-21 01:51:46 ESPEasy ESPEasy_WeatherSensor RainLvl: 3

In einer kleinen Steuerkonsole sitzen zwei Neopixel, die schlicht mit einem set-Kommando gesteuert werden können, z.B.
set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 0 0 0

So weit, so gut. Nun versuche ich, mit einem Notify die Neopixel von dem Wettersensor steuern zu lassen.
define n_ROF2_Neo2 notify ESPEasy_WeatherSensor:LgtnLvl:.* \
{if (Value("LgtnLvl") eq "0"){fhem("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 0 0 0")}}\
{if (Value("LgtnLvl") eq "1"){fhem("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 0 25 0")}}\
{if (Value("LgtnLvl") eq "2"){fhem("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 0 0 25")}}\
{if (Value("LgtnLvl") eq "3"){fhem("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0")}}

ergibt ganz einfach keine Reaktion. Keine Fehlermeldung, nichts.

Der Fehler liegt offensichtlich in der Bedingung, denn ein  " "1" eq "1" " löst die set-Funktion aus.
Daraufhin hab ich ein anderes Konstrukt versucht:
{if (ReadingVal('ESPEasy_WeatherSensor','LgtnLvl','') eq "3") {fhem("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 0 0 0")}}
Gleicher Effekt, keine Fehlermeldung im Log, keine Reaktion.

Etliche andere Varianten sind auch schon durch...
Irgendwie stehe ich heute Abend ehm.. heute morgen auf dem Schlauch und seh den Wald vor lauter Bäumen nicht mehr.
Sieht jemand den Fehler?

Danke schonmal

FHEM auf Celeron-PC
CUNX mit Pigator, 433 + 868 MHZ.
MAX!-HK-Ventile, ESP8266-Sensoren und -Aktoren
Schaltsteckdosen IT / NetIO230B / Netio4

MadMax-FHEM

Poste doch mal ein list von ESPEasy_WeatherSensor.

Klammern sind wohl falsch...

Also: erste '{' -> "schaltet" auf Perl-Ebene. Da dann alle if "schachteln" mit entsprechenden Klammern (wo nötig oder wo du sie zur besseren "Lesbarkeit" willst). Da du in Perl bist hast du ja richtig den fhem-Befehl zur Ausführung von fhem Kommandos. Dann die "abschließende" '}' damit zu zurück in die "fhem-Ebene" und somit zum Notify zurück kehrst...

Wenn ich richtig gesehen habe, dann machst du für das erste if die Klammer nach Perl und danach wieder zu...
Dann zwar wieder auf, ich weiß nur nicht, ob man innerhalb eines Notify (oder "generell" einfach so) "beliebig" zwischen Perl- und fhem-Ebene wechseln kann...

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)

Shardan

Hallo Joachim,

Danke für deine Antwort.

die "{if"-Zeilen habe ich aus einem anderen Teil des FHEM bei mir übernommen, da sieht das so aus:
{if (Value("TestSite") eq "on"){fhem("set ESPEasy_OfficeRemote8x8_2 mcpgpio 3 1")}}
Das funktioniert einwandfrei.

Soweit ich weiß, startet das "{fhem" dann eine eigene fhem-Instanz... vielleicht nicht die schönste Lösung, funktioniert aber.

Ich hab es grade getestet:
{if (Value("LgtnLvl") eq "3") fhem ("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0")}
und
{if (Value("LgtnLvl") eq "3") ("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0")}
und
{if (Value("LgtnLvl") eq "3") set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0 }
funktionieren alle nicht, das wirft mir dann Fehlermeldungen wg. syntaktischer Fehler.

Ich denke, der Fehler liegt in der Bedingung
{if (Value("LgtnLvl") eq "3")
die schlicht nicht zum Tragen kommt.
FHEM auf Celeron-PC
CUNX mit Pigator, 433 + 868 MHZ.
MAX!-HK-Ventile, ESP8266-Sensoren und -Aktoren
Schaltsteckdosen IT / NetIO230B / Netio4

MadMax-FHEM

#3
Zitat von: Shardan am 21 Juli 2019, 13:15:58
die "{if"-Zeilen habe ich aus einem anderen Teil des FHEM bei mir übernommen, da sieht das so aus:
{if (Value("TestSite") eq "on"){fhem("set ESPEasy_OfficeRemote8x8_2 mcpgpio 3 1")}}
Das funktioniert einwandfrei.

Klar:

{ -> wechsel nach Perl

dann if(IrgendeineBedingung)

{ -> neue Befehlsgruppe (das ist ganz "normal" Perl bzw. "Programmierung"). Hier "unnötig", weil ja nur ein Befehl folgt wäre nach "if" auch einfach ohne geschweifte Klammer möglich. Dann aber auf jeden Fall einen Strichpunkt nach dem fhem-Befehl!

fhem("set ...") -> weil du in Perl bist musst du "nach fhem (zurück)wechseln" um fhem-Befehle abzusetzen. 'fhem' ist eine Perl-Funktion die genau das tut...

} (unnötigerweise [weil ja nur aber besser lesbar]) halt wieder die "Befehlsgruppe" schließen

} aus Perl wieder zurück in die fhem-Ebene und somit zurück "zum Define" des Notify oder was auch immer...



Zitat von: Shardan am 21 Juli 2019, 13:15:58
Soweit ich weiß, startet das "{fhem" dann eine eigene fhem-Instanz... vielleicht nicht die schönste Lösung, funktioniert aber.

Wo hast du das (den Quatsch!) denn her!?

Siehe meine Erläuterung(en) oben...
...bzw. einfach mal "fhem Klammern setzen" lesen!


Zitat von: Shardan am 21 Juli 2019, 13:15:58
{if (Value("LgtnLvl") eq "3") fhem ("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0")}
und
{if (Value("LgtnLvl") eq "3") ("set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0")}
und
{if (Value("LgtnLvl") eq "3") set ESPEasy_OfficeRemote8x8_2 NeoPixel 2 25 0 0 }
funktionieren alle nicht, das wirft mir dann Fehlermeldungen wg. syntaktischer Fehler.

Klar, siehe Erläuterung(en) oben! -> Klammern!

wenn du mit { nach Perl wechselst, dann gibt es KEINEN set-Befehl mehr, weil das fhem ist, du aber "in" Perl bist!

EDIT: bzw. bei der ersten Zeile auf jeden Fall der Strichpunkt (Abschluss eines Befehls in Perl) fehlt... Siehe auch oben...

EDIT2: du kannst auch munter weiter rumprobieren ODER einfach mal lesen und lernen: https://wiki.fhem.de/wiki/Klammerebenen Oder auch ein list posten wie angefragt und auch eines von deinem ersten Notify versuch bzw. halt beschreiben WAS bei WELCHEN Bedingungen WIE geschalten werden soll (also bei WIE am besten gleich den fhem set-Befehl der funktioniert). Ein Value "wertet" (soweit ich weiß) "nur" den status aus! Wenn du Bedingungen anhand bestimmter Readings willst besser (wie auch schon mal "rumprobiert") besser ReadingsVal bzw. ReadingsNum (wenn du nur "Zahlen" zurück willst)...

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)

Shardan

Warum die Equation
{if (Value("LgtnLvl") eq "3")
absolut nicht funktioniert - alles andere ist mittlerweile geprüft - weiß ich nach diesen super zielführenden Hinweisen auch nicht.
Ich mach seit drei Tagen nichts anderes als Nachlesen....
FHEM auf Celeron-PC
CUNX mit Pigator, 433 + 868 MHZ.
MAX!-HK-Ventile, ESP8266-Sensoren und -Aktoren
Schaltsteckdosen IT / NetIO230B / Netio4

MadMax-FHEM

Wie ist denn der status von LgtnLvl!?

Wenn es wie bei RainLvl ist, dann weiß ich nicht was Value liefert...

Schon mal:

{Value("LgtnLvl")}

in Fhem-Web eingegeben!?
Was kommt?

'3'?

Wenn nicht, brauchst du dich nicht wundern, dass der Vergleich nicht tut...

Weil Value (hab ich aber schon geschrieben) auf status prüft und nicht einen Wert eines bestimmten Readings...

Und wenn du keine (angefragten) Infos lieferst wird es schwer (weiter) zu helfen...

Z.B. ein list von ESPEasy_WeatherSensor...

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)