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
Warum ein neuer Thread?
Schreib einfach mal $EVENT jeweils _direkt_ hinter die eckige Schluss-Klammer...
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
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...
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 ?
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
...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.
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
@Beta-User,
was bedeuten
~ s/
//g
=~ s/$EVTPART0 //g;
in dieser Zeile?
matze1999
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 }{};
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
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
...falls du von mir Hilfe zu DOIF erwartest: Das kann ich nicht und mache einen weiten Bogen drumrum...
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
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.
@Damian,
das ist die Lösung, vielen Dank.
matze1999