FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: matze1999 am 30 Dezember 2021, 11:54:45

Titel: [gelöst]Tasmota Display per MQTT - DOIF Problem
Beitrag von: matze1999 am 30 Dezember 2021, 11:54:45
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: Beta-User am 30 Dezember 2021, 12:15:38
Warum ein neuer Thread?

Schreib einfach mal $EVENT jeweils _direkt_ hinter die eckige Schluss-Klammer...
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 12:21:55
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: Beta-User am 30 Dezember 2021, 12:34:57
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...
Titel: Antw:Tasmota Display per MQTT
Beitrag von: TomLee am 30 Dezember 2021, 12:36:02
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 ?
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 12:48:32
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: Beta-User am 30 Dezember 2021, 12:59:58
...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.
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 13:06:31
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 13:13:43
@Beta-User,

was bedeuten
~ s/
//g

=~ s/$EVTPART0 //g;

in dieser Zeile?

matze1999
Titel: Antw:Tasmota Display per MQTT
Beitrag von: Beta-User am 30 Dezember 2021, 13:23:25
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 }{};
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 13:30:15
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: matze1999 am 30 Dezember 2021, 14:40:45
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
Titel: Antw:Tasmota Display per MQTT
Beitrag von: Beta-User am 30 Dezember 2021, 14:45:41
...falls du von mir Hilfe zu DOIF erwartest: Das kann ich nicht und mache einen weiten Bogen drumrum...
Titel: Antw:Tasmota Display per MQTT - DOIF geht nicht
Beitrag von: matze1999 am 30 Dezember 2021, 14:59:36
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
Titel: Antw:Tasmota Display per MQTT - DOIF Problem
Beitrag von: Damian am 30 Dezember 2021, 15:21:58
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.
Titel: Antw:Tasmota Display per MQTT - DOIF Problem
Beitrag von: matze1999 am 30 Dezember 2021, 15:53:47
@Damian,

das ist die Lösung, vielen Dank.

matze1999