[gelöst]Tasmota Display per MQTT - DOIF Problem

Begonnen von matze1999, 30 Dezember 2021, 11:54:45

Vorheriges Thema - Nächstes Thema

matze1999

Hallo,
ich habe zwei Probleme mit der Ansteuerung/Beschreiben eines Tasmota Displays, unabhängig vom Typ, ich habe einmal eine vierzeilige LCD Anzeige (20x4) und ein OLED (128x64).

Beide kann ich ansteuern und mit Werten beschreiben.

Das erste Problem: ich habe ein Setlist erstellt, das gut funktioniert, ausser, dass ich jede Zeile nicht linksbündig beschreiben konnte. Mittlerweile habe ich herausgefunden, dass das sehr wohl geht, wenn ich den set Befehl in der Kommandozeile von Fhem absetze:

set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1]Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C 

in der Setlist sieht das so aus:

setList    Zeile1  cmnd/tasmota_190C30/DisplayText [zs1l1c1]
Zeile2  cmnd/tasmota_190C30/DisplayText [s1l2c1]
Zeile3  cmnd/tasmota_190C30/DisplayText [s1l3c1]
Zeile4  cmnd/tasmota_190C30/DisplayText [s1l4c1]
Zeile5  cmnd/tasmota_190C30/DisplayText [s1l5c13]
löschen:noArg cmnd/tasmota_190C30/DisplayText [z]


Wenn ich hier in die Zeilen schreibe, erfolgt die Ausgabe nicht linksbündig, sondern um eine Spalte verschoben.
Kann es sein, das das Kommando über setlist ein Leerzeichen einfügt, also so:

set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1] Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C

und somit ein Leerzeichen linksbündig steht?

Darauf habe ich folgendes Problem gefunden: um das o.g. zu umgehen, beschreibe ich das Display nicht über die Setlist sondern direkt mit dem MQTT Befehl:

set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1]Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C[s1l2c1]Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%[s1l3c1]Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa[s1l5c1][T][s1l5c14][t]

Wenn ich diesen Befehl in der Fhem Kommandozeile ausführe, wird alles richtig, linksbündig ausgerichtet angezeigt. Aber wenn ich das in ein DOIF einfüge, wird alles in die erste Zeile geschrieben.

Hier das DOIF:

Internals:
   CFGFN     
   DEF        ([MQTT2_DVES_190C30:"^LWT:.Online$"] or [MQTT2_DVES_6CA8FD:"^LWT:.Online$"]) (
set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1]Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C[s1l2c1]Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%[s1l3c1]Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa[s1l5c1][T][s1l5c14][t])
   FUUID      61ccd0e4-f33f-214e-a347-cba52427ac021061
   MODEL      FHEM
   NAME       Testanzeige1
   NOTIFYDEV  global,MQTT2_DVES_6CA8FD,MQTT2_DVES_190C30
   NR         64225
   NTFY_ORDER 50-Testanzeige1
   STATE      initialized
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   READINGS:
     2021-12-30 11:51:27   Device          MQTT2_DVES_190C30
     2021-12-30 11:51:23   cmd             0
     2021-12-30 11:51:27   e_MQTT2_DVES_190C30_events DisplayText: [s1l5c13] 11:51
     2021-12-30 11:51:23   mode            enabled
     2021-12-30 11:51:23   state           initialized
   Regex:
     accu:
     collect:
     cond:
       MQTT2_DVES_190C30:
         0:
           &STATE     ^MQTT2_DVES_190C30$
       MQTT2_DVES_6CA8FD:
         0:
           &STATE     ^MQTT2_DVES_6CA8FD$
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0          ::EventDoIf('MQTT2_DVES_190C30',$hash,'^LWT:.Online$',1) or ::EventDoIf('MQTT2_DVES_6CA8FD',$hash,'^LWT:.Online$',1)
   do:
     0:
       0           set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1]Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C[s1l2c1]Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%[s1l3c1]Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa[s1l5c1][T][s1l5c14][t]
     1:
   helper:
     DEVFILTER  ^global$|^MQTT2_DVES_190C30$|^MQTT2_DVES_6CA8FD$
     NOTIFYDEV  global|MQTT2_DVES_190C30|MQTT2_DVES_6CA8FD
     event      DisplayText: [s1l5c13] 11:51
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev MQTT2_DVES_190C30
     triggerEvents:
       DisplayText: [s1l5c13] 11:51
     triggerEventsState:
       DisplayText: [s1l5c13] 11:51
   internals:
   readings:
   trigger:
     all         MQTT2_DVES_190C30 MQTT2_DVES_6CA8FD
   uiState:
   uiTable:
Attributes:
   alias      Testanzeige1
   do         always
   room       nt+di
   wait       5


Gibt es für diese zwei Probleme eine Lösung?

matze1999

Beta-User

Warum ein neuer Thread?

Schreib einfach mal $EVENT jeweils _direkt_ hinter die eckige Schluss-Klammer...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Hallo,

warum ein neuer Thread: weil es meiner Meinung nach etwas völlig neues ist.

Ich hab das in Setlist mal eingetragen:
Zeile2  cmnd/tasmota_190C30/DisplayText [s1l2c1]$EVENT

Wenn ich jetzt die Zeile 2 mit "Test" beschreibe erscheint auf dem Display:

linksbündig "Zeile2 Test" aber ohne $EVENT nur "Test" aber eben nicht linksbündig

matze1999

Beta-User

Zitat von: matze1999 am 30 Dezember 2021, 12:21:55
Hallo,

warum ein neuer Thread: weil es meiner Meinung nach etwas völlig neues ist.
Aha...
Zitat von: Beta-User am 16 Dezember 2021, 09:55:23
Schön. Würde aber empfehlen, die setter "internationalisiert" zu benennen, also "clear" statt "löschen". (Anleihen vielleicht bei den CUL_HM-Displays). Dann kann man eher generischen Code zum Füllen von Displays teilen...

Für die Zeilen hätte ich folgenden Vorschlag:
line2:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_D0DD09/DisplayText [l2c1]$payload)}
...daher meine Zwischenfrage...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

TomLee

Zitatlinksbündig "Zeile2 Test"

Einfach ins Blaue, wenn du in setList nach Zeile2 nur ein Leerzeichen verwendest oder :noArg ergänzt, ist das Leerzeichen dann immer noch da ?

matze1999

hallo,

das erste Problem (schon länger  8) ) gelöst:

line2:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_D0DD09/DisplayText [l2c1]$payload)}

löst dieses Problem.

Bleibt noch das zweite Problem, warum macht der gleiche set Befehl zwei unterschiedliche Sachen bzw. wird nicht korrekt in einem DOIF ausgeführt, nur über die Kommandozeile?

matze1999

Beta-User

...weil DOIF erst mal checken muss, was du willst, und da sind die eckigen Klammern halt möglicherweise ein Problem, weil das nach "Set Magic" (-alike) aussieht... Und da hat DOIF eben einen eigenen Parser.

Da du aber ja jetzt "funktionierende" setter im MQTT2_DEVICE hast, stellt sich die Frage, ob das mit dem direkten publish nicht anders gelöst werden kann.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Hallo,

naja, ich möchte in der letzten Zeile gern das Datum linksbündig und die Uhrzeit rechtsbündig darstellen. Da die Wetterstation nur alle 15 Min die Daten sendet, zeige ich die Uhrzeit per at an:

Internals:
   COMMAND    set myBroker publish cmnd/tasmota_190C30/DisplayText [s1l5c1][T][s1l5c14][t] ; set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t]
   DEF        +*00:01:00 set myBroker publish cmnd/tasmota_190C30/DisplayText [s1l5c1][T][s1l5c14][t] ; set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t]
   FUUID      61bb49c8-f33f-214e-17af-b37aa8d868b1453d
   NAME       Displayzeit
   NR         270
   NTM        13:04:03
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 13:04:03
   TIMESPEC   00:01:00
   TRIGGERTIME 1640865843.74535
   TRIGGERTIME_FMT 2021-12-30 13:04:03
   TYPE       at
   READINGS:
     2021-12-30 13:03:03   state           Next: 13:04:03
Attributes:
   alias      Displayzeit
   room       nt+di


Wenn ich das aber in ein DOIF reinpacke, mit den o.g. "line" wird nichts in der letzten Zeile angezeigt.

Internals:
   CFGFN     
   DEF        ([MQTT2_DVES_EF41A8:"^LWT:.Online$"] or [MQTT2_DVES_6CA8FD:"^LWT:.Online$"]) (
set MQTT2_DVES_EF41A8 line1 Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C,
set MQTT2_DVES_EF41A8 line2 Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%,
set MQTT2_DVES_EF41A8 line3 Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa,
set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t])
   FUUID      61cb43b3-f33f-214e-e839-0c67065c47b01106
   MODEL      FHEM
   NAME       MQTT2_DVES_EF41A8_DOIF_1
   NOTIFYDEV  MQTT2_DVES_6CA8FD,global,MQTT2_DVES_EF41A8
   NR         41276
   NTFY_ORDER 50-MQTT2_DVES_EF41A8_DOIF_1
   STATE      cmd_1
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   READINGS:
     2021-12-30 13:00:11   Device          MQTT2_DVES_6CA8FD
     2021-12-30 13:00:08   cmd             1
     2021-12-30 13:00:08   cmd_event       MQTT2_DVES_6CA8FD
     2021-12-30 13:00:08   cmd_nr          1
     2021-12-30 13:00:11   e_MQTT2_DVES_6CA8FD_events LWT: Offline
     2021-12-30 12:59:23   e_MQTT2_DVES_EF41A8_events LWT: Online
     2021-12-30 12:59:11   mode            enabled
     2021-12-30 13:00:08   state           cmd_1
     2021-12-30 13:00:08   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       MQTT2_DVES_6CA8FD:
         0:
           &STATE     ^MQTT2_DVES_6CA8FD$
       MQTT2_DVES_EF41A8:
         0:
           &STATE     ^MQTT2_DVES_EF41A8$
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0          ::EventDoIf('MQTT2_DVES_EF41A8',$hash,'^LWT:.Online$',1) or ::EventDoIf('MQTT2_DVES_6CA8FD',$hash,'^LWT:.Online$',1)
   do:
     0:
       0           set MQTT2_DVES_EF41A8 line1 Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C, set MQTT2_DVES_EF41A8 line2 Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%, set MQTT2_DVES_EF41A8 line3 Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa, set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t]
     1:
   helper:
     DEVFILTER  ^global$|^MQTT2_DVES_6CA8FD$|^MQTT2_DVES_EF41A8$
     NOTIFYDEV  global|MQTT2_DVES_6CA8FD|MQTT2_DVES_EF41A8
     event      LWT: Offline
     globalinit 1
     last_timer 0
     sleepdevice MQTT2_DVES_6CA8FD
     sleepsubtimer -1
     sleeptimer -1
     timerdev   MQTT2_DVES_6CA8FD
     timerevent LWT: Online
     triggerDev MQTT2_DVES_6CA8FD
     timerevents:
       LWT: Online
     timereventsState:
       LWT: Online
     triggerEvents:
       LWT: Offline
     triggerEventsState:
       LWT: Offline
   internals:
   readings:
   trigger:
     all         MQTT2_DVES_EF41A8 MQTT2_DVES_6CA8FD
   uiState:
   uiTable:
Attributes:
   alias      Wetterdisplay2
   do         always
   room       nt+di
   wait       5


Ich werde jetzt mal ein Datum und eiun Zeitfeld per setlist definbieren, das sollte dann ja klappen.

matze1999

matze1999

@Beta-User,

was bedeuten
~ s/
//g

=~ s/$EVTPART0 //g;

in dieser Zeile?

matze1999

Beta-User

Es ist eine "substitition" per Regex. $EVTPART0 ist dabei das erste "Wort", das in $EVENT steht (die Syntax/Begrifflichkeiten sind ähnlich wie bei notify). "g" steht für "mache es ggf. auch mehrfach", was hier eigentlich Quatsch ist...

Klartext also: Ersetze das erste Wort aus $EVENT und das darauf folgende Leerzeichen durch "nichts". Die Querstriche sind "Trenner", hier mal eine etwas deutlichere (hier im Forum aber nicht sehr verbreitete) Schreibweise ohne "mehrfach":
s{$EVTPART0 }{};
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

Danke,

ich habe jetzt per setlist die beiden Plätze für Time und Date definiert, das funktioniert auch aber wenn  ich das im DOIF verwenden will geht es nicht, dann wird nur lineD und lineT angezeigt, nicht das Datum bzw. die Zeit.

Internals:
   CFGFN     
   DEF        ([MQTT2_DVES_EF41A8:"^LWT:.Online$"] or [MQTT2_DVES_6CA8FD:"^LWT:.Online$"]) (
set MQTT2_DVES_EF41A8 line1 Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C,
set MQTT2_DVES_EF41A8 line2 Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%,
set MQTT2_DVES_EF41A8 line3 Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa,
set MQTT2_DVES_EF41A8 line4D [T],
set MQTT2_DVES_EF41A8 line4T [t])
   FUUID      61cb43b3-f33f-214e-e839-0c67065c47b01106
   MODEL      FHEM
   NAME       MQTT2_DVES_EF41A8_DOIF_1
   NOTIFYDEV  global,MQTT2_DVES_6CA8FD,MQTT2_DVES_EF41A8
   NR         41276
   NTFY_ORDER 50-MQTT2_DVES_EF41A8_DOIF_1
   STATE      cmd_1
   TYPE       DOIF
   VERSION    25295 2021-12-04 18:13:39
   READINGS:
     2021-12-30 13:27:05   Device          MQTT2_DVES_EF41A8
     2021-12-30 13:27:10   cmd             1
     2021-12-30 13:27:10   cmd_event       MQTT2_DVES_EF41A8
     2021-12-30 13:27:10   cmd_nr          1
     2021-12-30 13:27:05   e_MQTT2_DVES_EF41A8_events LWT: Online
     2021-12-30 13:26:49   mode            enabled
     2021-12-30 13:27:10   state           cmd_1
     2021-12-30 13:27:10   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       MQTT2_DVES_6CA8FD:
         0:
           &STATE     ^MQTT2_DVES_6CA8FD$
       MQTT2_DVES_EF41A8:
         0:
           &STATE     ^MQTT2_DVES_EF41A8$
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0          ::EventDoIf('MQTT2_DVES_EF41A8',$hash,'^LWT:.Online$',1) or ::EventDoIf('MQTT2_DVES_6CA8FD',$hash,'^LWT:.Online$',1)
   do:
     0:
       0           set MQTT2_DVES_EF41A8 line1 Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C, set MQTT2_DVES_EF41A8 line2 Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%, set MQTT2_DVES_EF41A8 line3 Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa, set MQTT2_DVES_EF41A8 line4D [T], set MQTT2_DVES_EF41A8 line4T [t]
     1:
   helper:
     DEVFILTER  ^global$|^MQTT2_DVES_6CA8FD$|^MQTT2_DVES_EF41A8$
     NOTIFYDEV  global|MQTT2_DVES_6CA8FD|MQTT2_DVES_EF41A8
     event      LWT: Online
     globalinit 1
     last_timer 0
     sleepdevice MQTT2_DVES_EF41A8
     sleepsubtimer -1
     sleeptimer -1
     timerdev   MQTT2_DVES_EF41A8
     timerevent LWT: Online
     triggerDev MQTT2_DVES_EF41A8
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: MQTT2_DVES_EF41A8
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: MQTT2_DVES_EF41A8
       state: cmd_1
     timerevents:
       LWT: Online
     timereventsState:
       LWT: Online
     triggerEvents:
       LWT: Online
     triggerEventsState:
       LWT: Online
   internals:
   readings:
   trigger:
     all         MQTT2_DVES_EF41A8 MQTT2_DVES_6CA8FD
   uiState:
   uiTable:
Attributes:
   alias      Wetterdisplay2
   do         always
   room       nt+di
   wait       5



matze1999

matze1999

also,

ich hab das setlist definiert:

line4:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_EF41A8/DisplayText [l4c1]$payload)}

das funktioniert in der Kommandozeile:

set MQTT2_DVES_EF41A8 line4 [T]

es wird das Datum angezeigt.

Übernehme ich das in ein DOIF  erscheint "line4" statt des Datums.

in einem at funktioniert es übrigens so:

Internals:
   COMMAND    set myBroker publish cmnd/tasmota_190C30/DisplayText [s1l5c1][T][s1l5c14][t] ; set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t]
   DEF        +*00:01:00 set myBroker publish cmnd/tasmota_190C30/DisplayText [s1l5c1][T][s1l5c14][t] ; set myBroker publish cmnd/tasmota_EF41A8/DisplayText [l4c1][T][l4c16][t]
   FUUID      61bb49c8-f33f-214e-17af-b37aa8d868b1453d
   NAME       Displayzeit
   NR         267
   NTM        14:39:50
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 14:39:50
   TIMESPEC   00:01:00
   TRIGGERTIME 1640871590.32408
   TRIGGERTIME_FMT 2021-12-30 14:39:50
   TYPE       at
   READINGS:
     2021-12-30 14:38:50   state           Next: 14:39:50
Attributes:
   alias      Displayzeit
   room       nt+di


matze1999


matze1999

Beta-User

...falls du von mir Hilfe zu DOIF erwartest: Das kann ich nicht und mache einen weiten Bogen drumrum...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

matze1999

#13
Hallo,

eigentlich nicht zum DOIF, aber vielleicht gibt es jemanden anderen, der das mit dem DOIF auflösen kann?

ich definiere zu einem MQTT Device per Setlist drei Zeilen:

line1:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_EF41A8/DisplayText [l1c1]$payload)}
line2:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_EF41A8/DisplayText [l2c1]$payload)}
line3:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_EF41A8/DisplayText [l3c1]$payload)}
line4:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //g; qq(cmnd/tasmota_EF41A8/DisplayText [l4c1]$payload)}


und kann dort jeweils per set Datum und/oder Uhrzeit per [T] und [t] anzeigen lassen.

set MQTT2_DVES_EF41A8 line4 [t]

Sobald ich das in einem DOIF machen will, funktioniert es nicht.

Und das funktioniert im DOIF auch nicht

set myBroker publish cmnd/tasmota_190C30/DisplayText [zs1l1c1]Temperatur [MQTT2_DVES_6CA8FD:Global_Temperature]C[s1l2c1]Feuchte [MQTT2_DVES_6CA8FD:Global_Humidity]%[s1l3c1]Luftdruck [MQTT2_DVES_6CA8FD:Global_Pressure]hPa[s1l5c1][T][s1l5c14][t]

matze1999

Damian

Die Angaben in eckigen Klammern kollidieren mit der DOIF-Syntax. Du kannst versuchen sie beim set-Befehl zu maskieren oder den set-Befehl in eine Perlfunktion auslagern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF