AZ-Touch 2.8" unter Tasmota betreiben

Begonnen von WW, 28 Januar 2022, 14:34:36

Vorheriges Thema - Nächstes Thema

WW

#15
Zitat von: kaihs am 01 Februar 2022, 22:36:55
Nur die Touchbuttons erzeugen bei mir soweit ich erkennen kann keine MQTT-Messages.

Hast du in der autoexec.be den "publish"-Befehl an deine Namensgebung angepasst? Beim Betätigen der Touch-Buttoms flackern diese kurz.
...
def btn_clicked_cb(obj, event)
    var btn = "Unknown"
    if   obj == prev_btn  btn = "Prev"
    elif obj == next_btn  btn = "Next"
    elif obj == home_btn  btn = "Home"
    end
    print(btn, "button pressed")
    tasmota.publish("tele/tasmota232/SENSOR/Buttom",btn)
end
...

FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

WW

Zitat von: Papa Romeo am 02 Februar 2022, 07:05:20
... würde bedeuten, dass wenn der Beeper nicht über Toogle2 auf AUS ist, an GPIO 21 immer noch ein PWM-Signal im nicht hörbaren Bereich anliegt,
welche am ihm über R2 (1kOhm) und T2 (BC817) eine effektive Spannung von so um die 1.5 Volt erzeugt. ...

Habe jetzt das Template noch einmal angepasst:
{"NAME":"ESP32 AZ-Touch","GPIO":[0,1,576,1,800,768,0,0,1,1,7264,448,0,0,736,672,1,417,1024,704,1,1,1,1,0,0,0,0,1,1,1,1,1,0,6210,1],"FLAG":0,"BASE":1}

GPIO21 (Buzzer) ist jetzt "PWM 2" statt "PWM_i 2".
Hierdurch sinkt der normale Stromverbrauch (Display an, Buzzer aus) bei 12 V Einspeisung von ca. 200 mA auf ca. 35-75 mA (je nach WLAN-Aktivität). Dies entspricht dem, was ich von einem ESP32 erwarten würde.

LG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

kaihs

Zitat von: WW am 02 Februar 2022, 08:33:13
Hast du in der autoexec.be den "publish"-Befehl an deine Namensgebung angepasst? Beim Betätigen der Touch-Buttoms flackern diese kurz.

Die Toucherkennung scheint generell nicht zu funktionieren. Auch die print Ausgaben erscheinen nicht in der Berry-Console.

Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

WW

#18
Zitat von: kaihs am 06 Februar 2022, 17:24:06
Die Toucherkennung scheint generell nicht zu funktionieren. Auch die print Ausgaben erscheinen nicht in der Berry-Console.

Versuche mal, ob irgendwo auf dem Display die Touchs reagieren. Vielleicht sind die Koordinatensystem von Display und Touch unterschiedlich. Bei mir reagierten anfangs die Buttoms am oberen Bildschirmrand. Ändern lässt sich dies in den Zeilen ":0", ":1", ":2" bzw. ":3" in der Datei "display.ini"

https://tasmota.github.io/docs/Displays/#descriptor-file


MfG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

kaihs

Zitat von: WW am 06 Februar 2022, 20:28:49
Versuche mal, ob irgendwo auf dem Display die Touchs reagieren. Vielleicht sind die Koordinatensystem von Display und Touch unterschiedlich. Bei mir reagierten anfangs die Buttoms am oberen Bildschirmrand. Ändern lässt sich dies in den Zeilen ":0", ":1", ":2" bzw. ":3" in der Datei "display.ini"

Danke für den Hinweis.
Mit

:0,28,00,00,04

funktioniert es jetzt bei mir.
Ich habe das 2,4" Display, da ist die Zuordnung von Touch-Koordinaten mglw. anders als bei deinem 2,8" Display.

Bei mir funktioniert das Display auch mit 40 MHz SPI-Takt einwandfrei und entsprechend schneller.

Jetzt muss ich mich "nur" noch mit Berry/LVGL beschäftigen damit ich das Display auch vernünftig nutzen kann.
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

kaihs

Ich war mit der Funktionsweise des Beepers noch nicht zufrieden weil ich gerne das Buzzer Kommando nutzen möchte.

Dazu habe ich im Template GPIO21 auf Buzzer umgestellt.

{"NAME":"ESP32 AZ-Touch","GPIO":[0,1,576,1,800,768,0,0,1,1,7264,448,0,0,736,672,1,480,1024,704,1,1,1,1,0,0,0,0,1,1,1,1,1,0,6210,1],"FLAG":0,"BASE":1}


Zusätzlich müssen noch ein paar Einstellungen vorgenommen werden:

PWMFrequency 1000
BuzzerPWM 1
SetOption111 1


Dann kann man es mit

Buzzer

kurz piepen lassen z. B. bei Betätigung eines Touchbuttons.
Die Frequenz kann man mit PWMFrequency ändern, bei 2700Hz ist der Beeper wohl am lautesten.
Die Lautstärke kann aber nicht direkt geändert werden, nur indiekt über die Frequenz.

Die autoexec.be habe ich entsprechend erweitert:

def btn_clicked_cb(obj, event)
    var btn = "Unknown"
    if   obj == prev_btn  btn = "Prev"
    elif obj == next_btn  btn = "Next"
    elif obj == home_btn  btn = "Home"
    end
    print(btn, "button pressed")
    tasmota.cmd("buzzer 1")
    tasmota.publish("tele/tasmota232/SENSOR/Buttom",btn)
end

def buzzer_enable()
  tasmota.cmd("buzzerpwm 1") # use PWM on buzzer pin (GPIO21)
  tasmota.cmd("pwmfrequency 1000") # highest volume at 2700 as per datasheet of LET7525AS-3.6L-2.7-15-R
  tasmota.cmd("setoption111 1")
end

buzzer_enable

prev_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)
next_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)
home_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)


Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

carlos

Super.
Ich habe auch ein wenig rum gespielt und habe so zum test mal einen slider und ein dropdown eingebaut.
Hier die autoexec:
#- start LVGL and init environment -#
lv.start()

# var scr1 = lv.obj_create(None, None);
# var scr2  = lv.obj_create(None, None);
# lv.scr_load(scr1);

hres = lv.get_hor_res()       # should be 320
vres = lv.get_ver_res()       # should be 240

scr = lv.scr_act()            # default screen object
f20 = lv.montserrat_font(20)  # load embedded Montserrat 20
f28 = lv.montserrat_font(28)  # load embedded Montserrat 28

#- Background with a gradient from black #000000 (bottom) to dark blue #0000A0 (top) -#
scr.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT)
scr.set_style_bg_grad_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT)
scr.set_style_bg_grad_dir(lv.GRAD_DIR_VER, lv.PART_MAIN | lv.STATE_DEFAULT)

#- Upper state line -#
stat_line = lv.label(scr)
if f28 != nil stat_line.set_style_text_font(f28, lv.PART_MAIN | lv.STATE_DEFAULT) end
stat_line.set_long_mode(lv.LABEL_LONG_SCROLL)                                        # auto scrolling if text does not fit
stat_line.set_width(hres)
stat_line.set_align(lv.TEXT_ALIGN_LEFT)                                              # align text left
stat_line.set_style_bg_color(lv.color(0xD00000), lv.PART_MAIN | lv.STATE_DEFAULT)    # background #000088
stat_line.set_style_bg_opa(lv.OPA_COVER, lv.PART_MAIN | lv.STATE_DEFAULT)            # 100% background opacity
stat_line.set_style_text_color(lv.color(0xFFFFFF), lv.PART_MAIN | lv.STATE_DEFAULT)  # text color #FFFFFF
stat_line.set_text("Tasmota")
stat_line.refr_size()                                                                # new in LVGL8
stat_line.refr_pos()                                                                 # new in LVGL8

#- display wifi strength indicator icon (for professionals ;) -#
wifi_icon = lv_wifi_arcs_icon(stat_line)    # the widget takes care of positioning and driver stuff
clock_icon = lv_clock_icon(stat_line)


#- create a style for the buttons -#
btn_style = lv.style()
btn_style.set_radius(10)                        # radius of rounded corners
btn_style.set_bg_opa(lv.OPA_COVER)              # 100% backgrond opacity
if f20 != nil btn_style.set_text_font(f20) end  # set font to Montserrat 20
btn_style.set_bg_color(lv.color(0x1fa3ec))      # background color #1FA3EC (Tasmota Blue)
btn_style.set_border_color(lv.color(0x0000FF))  # border color #0000FF
btn_style.set_text_color(lv.color(0xFFFFFF))    # text color white #FFFFFF

#- create buttons -#
prev_btn = lv.btn(scr)                            # create button with main screen as parent
prev_btn.set_pos(20,vres-40)                      # position of button
prev_btn.set_size(80, 30)                         # size of button
prev_btn.add_style(btn_style, lv.PART_MAIN | lv.STATE_DEFAULT)   # style of button
prev_label = lv.label(prev_btn)                   # create a label as sub-object
prev_label.set_text("<")                          # set label text
prev_label.center()

next_btn = lv.btn(scr)                            # right button
next_btn.set_pos(220,vres-40)
next_btn.set_size(80, 30)
next_btn.add_style(btn_style, lv.PART_MAIN | lv.STATE_DEFAULT)
next_label = lv.label(next_btn)
next_label.set_text(">")
next_label.center()

home_btn = lv.btn(scr)                            # center button
home_btn.set_pos(120,vres-40)
home_btn.set_size(80, 30)
home_btn.add_style(btn_style, lv.PART_MAIN | lv.STATE_DEFAULT)
home_label = lv.label(home_btn)
home_label.set_text(lv.SYMBOL_OK)                 # set text as Home icon
home_label.center()

#- callback function when a button is pressed, react to EVENT_CLICKED event -#

def btn_clicked_cb(obj, event)
    var btn = "Unknown"
    if   obj == prev_btn  btn = "Prev"
    elif obj == next_btn  btn = "Next"
    elif obj == home_btn  btn = "Home"
    end
    print(btn, "button pressed")
    tasmota.cmd("buzzer 1")
    tasmota.publish("tele/tasmota232/SENSOR/Buttom",btn)
end

def buzzer_enable()
  tasmota.cmd("buzzerpwm 1") # use PWM on buzzer pin (GPIO21)
  tasmota.cmd("pwmfrequency 1000") # highest volume at 2700 as per datasheet of LET7525AS-3.6L-2.7-15-R
  tasmota.cmd("setoption111 1")
end

buzzer_enable

prev_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)
next_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)
home_btn.add_event_cb(btn_clicked_cb, lv.EVENT_CLICKED, 0)

def slider_event_cb(obj, event)
    var slider = "Unknown"
    var value = "999"

    if   obj == slider  slider= "SLIDER"
    # elif obj == next_slider  slider= "Next"
    # elif obj == home_btn  slider= "Home"
    end

    value= obj.get_value()

    # Refresh the text
    # label.set_text(str(value))
   
    print("slider set:", str(value))
   
    tasmota.publish("tele/AZTouch/SENSOR/Slider", str(value))
end

# Create a slider in the center of the display
slider = lv.slider(scr)
slider.set_pos(20,vres-80) 
slider.set_width(200)                                              # Set the width
slider.center()                                                    # Align to the center of the parent (screen)
slider.add_event_cb(slider_event_cb, lv.EVENT_VALUE_CHANGED, None) # Assign an event function

# Create a label below the slider
label = lv.label(scr)
label.set_text("0")
label.align_to(slider, lv.ALIGN_OUT_TOP_MID, 0, -15)               # Align below the slider

def dropdown_changed_cb(obj, event)
    var option = "Unknown"

    var modes = ['Auto', 'Boost', 'On', 'Off', 'Adv', 'Day' ]

    var code = event.code

    if code == lv.EVENT_VALUE_CHANGED
       print("Dropdown code :", code )
       option = obj.get_selected()
   
       print("Dropdown set:", modes[option])
   
       tasmota.publish("tele/AZTouch/SENSOR/Dropdown", modes[option] )
     end

end

var modes = ['Auto', 'Boost', 'On', 'Off', 'Adv', 'Day' ]
var modes_str = modes.concat('\n')
ddlist = lv.dropdown(scr)
ddlist.set_options(modes_str)
ddlist.set_pos(20,vres-180)
# ddlist.center()
ddlist.add_event_cb(dropdown_changed_cb, lv.EVENT_ALL, None)


Gruß Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

ZeitlerW

Hallo zusammen,

das ist schon sehr cool. In 10 Minuten habe ich nun ein Display hinbekommen.
Hat jemand von Euch ein Beispiel, wie man ein Textfeld per MQTT mit z.B: Messwerten füllen kann.

lG
Wolfgang

WW

#23
Zitat von: ZeitlerW am 13 März 2022, 17:47:58
...
Hat jemand von Euch ein Beispiel, wie man ein Textfeld per MQTT mit z.B: Messwerten füllen kann.
...

Ich habe zwischenzeitlich zwei Bewegungssensoren eingebaut, die ich mit meiner Raumüberwachung gekoppelt habe. Den vorderen Bewegungssensor (Switch2) benutze ich zusätzlich zur An-/Abschaltung des Displays über die "autoexec.be":


#Switch2 zur Displaysteuerung benutzen
var ret=0
def aus()
  tasmota.set_power(0, false)
end

def rule_switch2(value,trigger)
  if value == "ON"
    ret = tasmota.get_power()
    if ret[0] == false tasmota.set_power(0, true) end
    tasmota.remove_timer()
    tasmota.set_timer(60000,aus)
  end
end

tasmota.add_rule("Switch2",rule_switch2)


Den Displaybereich zwischen oberer Statuszeile und unterer Buttom-Zeile habe ich für mich in 5 Textzeilen eingeteilt, die ich über set-Anweisungen des zugehörigen MQTT-Devices bedienen kann:


defmod EgDieleTasmota232 MQTT2_DEVICE tasmota232
attr EgDieleTasmota232 DbLogExclude .*
attr EgDieleTasmota232 devicetopic tasmota232
attr EgDieleTasmota232 event-on-change-reading LWT,Buttom
attr EgDieleTasmota232 group EG: Diele
attr EgDieleTasmota232 icon rc_INFO
attr EgDieleTasmota232 readingList cmnd/tasmota232/restart:.* restart\
stat/tasmota232/RESULT:.* { json2nameValue($EVENT) }\
tele/tasmota232/LWT:.* LWT\
cmnd/tasmota232/POWER:.* POWER\
tele/tasmota232/INFO1:.* { json2nameValue($EVENT) }\
tele/tasmota232/INFO2:.* { json2nameValue($EVENT) }\
tele/tasmota232/INFO3:.* { json2nameValue($EVENT) }\
stat/tasmota232/POWER1:.* POWER1\
stat/tasmota232/POWER2:.* POWER2\
stat/tasmota232/POWER3:.* POWER3\
tele/tasmota232/STATE:.* { json2nameValue($EVENT) }\
tele/tasmota232/SENSOR:.* { json2nameValue($EVENT) }\
cmnd/tasmota232/POWER1:.* POWER1\
cmnd/tasmota232/Channel1:.* Channel1\
tele/tasmota232/SENSOR/Buttom:.* Buttom\
cmnd/tasmota232/POWER2:.* POWER2\
stat/tasmota232/STATUS:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS1:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS2:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS3:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS4:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS5:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS6:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS7:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS10:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS11:.* { json2nameValue($EVENT) }\
stat/tasmota232/STATUS0:.* { json2nameValue($EVENT) }\
cmnd/tasmota232/DisplayText:.* DisplayText\
cmnd/tasmota232/Displaytext:.* { json2nameValue($EVENT) }
attr EgDieleTasmota232 room System->MQTT2_DEVICE,System->Sonoff,Unsorted
attr EgDieleTasmota232 setExtensionsEvent 1
attr EgDieleTasmota232 setList DisplayClear:noArg cmnd/$DEVICETOPIC/Displaytext [x0y38Ci0R319:160]\
DisplayZeile1:textField {my $x=$EVENT;;$x=~s/$EVTPART0 //g;;$x=~s/$EVTPART0//g;;qq(cmnd/$DEVICETOPIC/DisplayText [x0y50Ci0R320:24Ci1f2s2D2]$x)}\
DisplayZeile2:textField {my $x=$EVENT;;$x=~s/$EVTPART0 //g;;$x=~s/$EVTPART0//g;;qq(cmnd/$DEVICETOPIC/DisplayText [x0y78Ci0R320:24Ci1f2s2D2]$x)}\
DisplayZeile3:textField {my $x=$EVENT;;$x=~s/$EVTPART0 //g;;$x=~s/$EVTPART0//g;;qq(cmnd/$DEVICETOPIC/DisplayText [x0y106Ci0R320:24Ci1f2s2D2]$x)}\
DisplayZeile4:textField {my $x=$EVENT;;$x=~s/$EVTPART0 //g;;$x=~s/$EVTPART0//g;;qq(cmnd/$DEVICETOPIC/DisplayText [x0y134Ci0R320:24Ci1f2s2D2]$x)}\
DisplayZeile5:textField {my $x=$EVENT;;$x=~s/$EVTPART0 //g;;$x=~s/$EVTPART0//g;;qq(cmnd/$DEVICETOPIC/DisplayText [x0y162Ci0R320:24Ci1f2s2D2]$x)}\
POWER1:on,off cmnd/$DEVICETOPIC/POWER1 $EVTPART1\
  POWER2:on,off,toggle,blink cmnd/$DEVICETOPIC/POWER2 $EVTPART1\
  Channel1:slider,10,1,100 cmnd/$DEVICETOPIC/Channel1 $EVTPART1\
  DisplayText:textField cmnd/$DEVICETOPIC/$EVENT\
  Reboot:noArg cmnd/$DEVICETOPIC/restart 1\
  Clear_Readings:noArg {fhem("deletereading -q $NAME (?!associatedWith).*");;return undef}


Die eigentliche Ansteuerung erfolgt jetzt über ein doif:

defmod doifEgDieleTasmota232 DOIF AzTouch {\
[+:05];;\
#####  Home: Temperatur, Luftfeuchtigkeit und Luftdruck  #####\
if ([EgDieleTasmota232:Buttom] eq "Home") {\
# Aussen: Zeile 1\
my $t = 0;;\
$t += [?AuHaustuerLacrosse:temperature];;\
$t += [?DgHeizung:TAi];;\
$t += [?AuGarageEsp02:T2];;\
$t += [?AuGartenhausEsp01:T2];;\
$t += [?LuftdatenInfoVennikel:temperature];;\
$t += [?ProplantaWetter:temperature];;\
$t /= 6;;\
\
my $h = 0;;\
$h += [?AuHaustuerLacrosse:humidity];;\
$h += [?ProplantaWetter:humidity];;\
$h /= 2;;\
\
my $p = 0;;\
$p += [?ProplantaWetter:pressure];;\
$p /= 1;;\
\
my $text = "AU: ";;\
$text .= sprintf("%5.1f~f8C, ",$t);;\
$text .= sprintf("%2.0f %%, ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
if (get_Reading("Zeile1") ne $text) {\
set_Reading("Zeile1",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile1 $text");;\
}\
\
# KG: Zeile 2\
$t = 0;;\
$t += [?KgFlurEsp05:KgBzT];;\
$t += [?KgFlurEsp05:KgFlurT];;\
$t += [?KgVrLacrosse:temperature];;\
$t += [?KgWkEsp03:T2];;\
$t += [?KgWsLacrosse:temperature];;\
$t /= 5;;\
\
$h = 0;;\
$h += [?KgFlurEsp05:KgBzH];;\
$h += [?KgFlurEsp05:KgFlurH];;\
$h += [?KgWsLacrosse:humidity];;\
$h /= 3;;\
\
$text = "KG: ";;\
$text .= sprintf("%5.1f~f8C, ",$t);;\
$text .= sprintf("%2.0f %%, ",$h);;\
if (get_Reading("Zeile2") ne $text) {\
set_Reading("Zeile2",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile2 $text");;\
}\
\
# EG: Zeile 3\
$t = 0;;\
$t += [?EgAbSonoff103:AM2301_Temperature];;\
$t += [?EgEzLacrosse:temperature];;\
$t += [?EgFzLacrosse:temperature];;\
$t += [?EgFzBridgeSonoff106:AM2301_Temperature];;\
$t += [?EgKuSonoff113:BME280_Temperature];;\
$t += [?EgWzSonoff104:AM2301_Temperature];;\
$t /= 6;;\
\
$h = 0;;\
$h += [?EgAbSonoff103:AM2301_Humidity];;\
$h += [?EgEzLacrosse:humidity];;\
$h += [?EgFzLacrosse:humidity];;\
$h += [?EgFzBridgeSonoff106:AM2301_Humidity];;\
$h += [?EgKuSonoff113:BME280_Humidity];;\
$h += [?EgWzSonoff104:AM2301_Humidity];;\
$h /= 6;;\
\
$p = 0;;\
$p += [?EgKuSonoff113:BME280_Pressure];;\
$p /= 1;;\
\
$text = "EG: ";;\
$text .= sprintf("%5.1f~f8C, ",$t);;\
$text .= sprintf("%2.0f %%, ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
if (get_Reading("Zeile3") ne $text) {\
set_Reading("Zeile3",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile3 $text");;\
}\
\
# OG: Zeile 4\
$t = 0;;\
$t += [?OgAzLgwLacrosse99:temperature];;\
$t += [?OgBadLacrosse:temperature];;\
$t += [?OgGzBridgeSonoff108:AM2301_Temperature];;\
$t += [?OgSzSonoff112:AM2301_Temperature];;\
$t /= 4;;\
\
$h = 0;;\
$h += [?OgAzLgwLacrosse99:humidity];;\
$h += [?OgBadLacrosse:humidity];;\
$h += [?OgGzBridgeSonoff108:AM2301_Humidity];;\
$h += [?OgSzSonoff112:AM2301_Humidity];;\
$h /= 4;;\
\
$p = 0;;\
$p += [?OgAzLgwLacrosse99:pressure];;\
$p /= 1;;\
\
$text = "OG: ";;\
$text .= sprintf("%5.1f~f8C, ",$t);;\
$text .= sprintf("%2.0f %%, ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
if (get_Reading("Zeile4") ne $text) {\
set_Reading("Zeile4",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile4 $text");;\
}\
\
# DG: Zeile 5\
$t = 0;;\
$t += [?DgEsp04:T1];;\
$t += [?DgEsp04:T2];;\
$t += [?TestEsp07:T1];;\
$t += [?TestEsp07:T2];;\
$t += [?DgBueroTasmota229:AM2301_Temperature];;\
$t += [?DgSonoff105:AM2301_Temperature];;\
$t /= 6;;\
\
$h = 0;;\
$h += [?TestEsp07:H1];;\
$h += [?TestEsp07:H3];;\
$h += [?DgBueroTasmota229:AM2301_Humidity];;\
$h += [?DgSonoff105:AM2301_Humidity];;\
$h /= 4;;\
\
$text = "DG: ";;\
$text .= sprintf("%5.1f~f8C, ",$t);;\
$text .= sprintf("%2.0f %%, ",$h);;\
#$text .= sprintf("%4.0f hPa",$p);;\
if (get_Reading("Zeile5") ne $text) {\
set_Reading("Zeile5",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile5 $text");;\
}\
}\
\
#####  Next: Energie-Verbrauch  #####\
if ([EgDieleTasmota232:Buttom] eq "Next") {\
\
# Strom: Zeile 1\
my $text = "\[s2\]Strom: ";;\
$text .= sprintf("%.3f / ",[myCounter:Strom_day]);;\
$text .= sprintf("%.3f kWh",[?myCounter:Strom_last_day]);;\
if (get_Reading("Zeile1") ne $text) {\
set_Reading("Zeile1",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile1 $text");;\
}\
\
# Gas: Zeile 2\
$text = "\[s2\]Gas: ";;\
$text .= sprintf("%.3f / ",[myCounter:Gas_day]);;\
$text .= sprintf("%.3f kWh",[?myCounter:Gas_last_day]);;\
if (get_Reading("Zeile2") ne $text) {\
set_Reading("Zeile2",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile2 $text");;\
}\
\
# Wasser: Zeile 3\
$text = "Wasser: ";;\
$text .= sprintf("%.0f / ",[myCounter:Wasser_day]*1000);;\
$text .= sprintf("%.0f Liter",[?myCounter:Wasser_last_day]*1000);;\
if (get_Reading("Zeile3") ne $text) {\
set_Reading("Zeile3",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile3 $text");;\
}\
\
# Rest löschen\
$text = "~20";;\
if (get_Reading("Zeile4") ne $text) {\
set_Reading("Zeile4",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile4 $text");;\
}\
$text = "~20";;\
if (get_Reading("Zeile5") ne $text) {\
set_Reading("Zeile5",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile5 $text");;\
}\
}\
\
#####  Prev: Spritpreise  #####\
if ([EgDieleTasmota232:Buttom] eq "Prev") {\
\
# Diesel: Zeile 1\
my $text = "Diesel: ";;\
$text .= sprintf("%.2f Euro/Liter",[TankstelleVennikel:Diesel]);;\
if (get_Reading("Zeile1") ne $text) {\
set_Reading("Zeile1",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile1 $text");;\
}\
\
# SuperE5: Zeile 2\
$text = "Super: ";;\
$text .= sprintf("%.2f Euro/Liter",[TankstelleVennikel:SuperE5]);;\
if (get_Reading("Zeile2") ne $text) {\
set_Reading("Zeile2",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile2 $text");;\
}\
\
# Rest löschen\
$text = "~20";;\
if (get_Reading("Zeile3") ne $text) {\
set_Reading("Zeile3",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile3 $text");;\
}\
\
$text = "~20";;\
if (get_Reading("Zeile4") ne $text) {\
set_Reading("Zeile4",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile4 $text");;\
}\
$text = "~20";;\
if (get_Reading("Zeile5") ne $text) {\
set_Reading("Zeile5",$text,1);;\
fhem_set("EgDieleTasmota232 DisplayZeile5 $text");;\
}\
}\
}
attr doifEgDieleTasmota232 DbLogExclude .*
attr doifEgDieleTasmota232 event-on-change-reading Zeile.*, block_AzTouch
attr doifEgDieleTasmota232 group EG: Diele
attr doifEgDieleTasmota232 icon helper_doif
attr doifEgDieleTasmota232 room Unsorted
attr doifEgDieleTasmota232 stateFormat [$name:Zeile1]<br>\
[$name:Zeile2]<br>\
[$name:Zeile3]<br>\
[$name:Zeile4]<br>\
[$name:Zeile5]<br>\
([$name:block_AzTouch:t])


Die Umschaltung zwischen den Bereichen "Spritpreise", "Klimawerte" und "Energieverbrauch" erfolgt im Moment über die eine direkte Zuordnung zwischen den Display-Buttoms und der Auswahl. Dies werde ich noch erweitern um ein Menüsystem, bei dem ich durchtoggeln kann. Die entsprechenden Bilder sind beigefügt.

Unzufrieden bin ich bei dieser Lösung mit den zur Verfügung stehenden Fonts. Lieber wäre mir die Benutzung der LVGL-Fonts. Ich würde hier gerne wieder 5 Zeilen definieren und dann deren Inhalt über MQTT von FHEM aus setzen. Falls jemand damit Erfahrungen hat, wäre ich dankbar für entsprechende Tipps.

LG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

ZeitlerW

#24
Hallo Willi,

sehr sehr cool!

Heißt, du nimmst somit keine Widgets aus lvgl, sondern das native Displaytext MQTT - Kommando.
Ich wußte nicht, dass beides gleichzeitig geht :)


Vielen Dank!

WW

Ich bin leider (noch) zu dumm für die Widgets aus "lvgl".  :D ;)

LG Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

RappaSan

#26
Interessantes Projekt...
Bevor ich die binary flashe:
Wo kommen denn display.ini und autoexec.be hin?
Kann man die in einer Weboberfläche hochladen oder muß das im sourcecode eingearbeitet werden?

@Wolfgang: Danke. :)

ZeitlerW

Hi RappaSan,

einfach nach
-Consoles
- Manage Files System

gehen.

Dort kannst Du die Dateien erzeugen und ablegen.

VG
Wolfgang

RappaSan

#28
Hallo Willi,
prima Vorarbeit bisher, Hut ab.
Bitte nicht böse sein; es heißt button, nicht Buttom. :)

RappaSan

Macht Spaß, das Ganze. :D
Wenn man jetzt noch Grafiken und Bilder übertragen könnte...