AZ-Touch 2.8" unter Tasmota betreiben

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

Vorheriges Thema - Nächstes Thema

WW

Ich besitze ein AZ-Touch-Display der Fa. AZ-Delivery in der 2.8"-Version. Bestückt ist es mit einem ESP32. Angeregt durch diesen Artikel https://github.com/arendst/Tasmota/discussions/13349 habe ich versucht, dies für mich nachzuvollziehen:

{"NAME":"ESP32 AZ-Touch","GPIO":[6210,1,576,1,800,768,0,0,1,1,7264,992,0,0,736,672,1,1,1024,704,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
  • Configuration eines "PWM_i 1"-Ausganges an GPIO21 (Buzzer des Boards)
  • Abgewandelte Form der Datei "autoexec.be":
#- start LVGL and init environment -#
lv.start()

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

scr = lv.scr_act()            # default screean 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("Ahornstr. 1")
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.publish("tele/tasmota232/SENSOR/Buttom",btn)
end


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)

  • Datei "display.ini":
:H,ILI9341,320,240,16,SPI,1,*,*,*,*,*,*,*,20
:S,2,1,1,0,40,20
:I
EF,3,03,80,02
CF,3,00,C1,30
ED,4,64,03,12,81
E8,3,85,00,78
CB,5,39,2C,00,34,02
F7,1,20
EA,2,00,00
C0,1,23
C1,1,10
C5,2,3e,28
C7,1,86
36,1,48
37,1,00
3A,1,55
B1,2,00,18
B6,3,08,82,27
F2,1,00
26,1,01
E0,0F,0F,31,2B,0C,0E,08,4E,F1,37,07,10,03,0E,09,00
E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F
11,80
29,80
:o,28
:O,29
:A,2A,2B,2C
:R,36
:0,28,00,00,05
:1,88,00,00,01
:2,E8,00,00,02
:3,48,00,00,03
:i,20,21
:TS,*
:M,3946,401,241,3828
#


  • Damit ergibt sich folgende Anzeige (siehe Anhang: Tasmota232-1.jpg)
  • Der Slider gibt das Puls-Pausen-Verhältnis für den Buzzer vor, "Toggle 1" schaltet den Buzzer. Mit "Toggle 2" sollte das Display abschaltbar sein. Der Text verschwindet auch. Es erscheint aber ein weißer Hintergrund über das ganze Bild anstatt einer Displayabschaltung.


  • Bei dieser Konfiguration erhalte ich folgende Anzeige auf dem Display (siehe Anhang: Tasmota232-2.jpg). Die Uhrzeit wird aktualisiert und die WIFI-Signalstärke in der rechten oberen Ecke auch. Die drei Funktionstasten unten funktionieren ebenfalls und erzeugen MQTT-Messages

  • Auf FHEM-Seite habe ich folgendes Device angelegt:
Internals:
   CFGFN     
   CID        tasmota232
   DEF        tasmota232
   DEVICETOPIC tasmota232
   FUUID      61f04e49-f33f-8792-15c2-d61baa34d995c696
   IODev      Mqqt2Client
   LASTInputDev Mqqt2Client
   MSGCNT     16408
   Mqqt2Client_MSGCNT 16408
   Mqqt2Client_TIME 2022-01-28 14:08:51
   NAME       MQTT2_tasmota232
   NR         37086
   STATE      DisplayDimmer
   TYPE       MQTT2_DEVICE
   .attraggr:
   .attrminint:
   OLDREADINGS:
   READINGS:
     2022-01-26 21:11:48                   [s4l4c1P20] *
     2022-01-28 14:08:51   Berry_HeapUsed  8
     2022-01-28 14:08:51   Berry_Objects   144
     2022-01-27 21:40:26   Buttom          Next
     2022-01-28 14:08:51   Dimmer          50
     2022-01-28 13:59:47   DisplayDimmer   58
     2022-01-26 21:19:57   DisplayText     [s4l3c1p20]~20
     2022-01-28 14:08:51   ESP32_Temperature 52.2
     2022-01-28 14:08:51   Fade            OFF
     2022-01-28 14:08:51   Heap            66
     2022-01-28 12:44:47   Info1_FallbackTopic cmnd/DVES_314548_fb/
     2022-01-28 12:44:47   Info1_GroupTopic cmnd/tasmotas/
     2022-01-28 12:44:47   Info1_Module    ESP32 AZ-Touch
     2022-01-28 12:44:47   Info1_Version   10.1.0(lvgl)
     2022-01-28 12:44:47   Info2_Hostname  Tasmota232
     2022-01-28 12:44:47   Info2_IPAddress 192.168.1.232
     2022-01-28 12:44:47   Info2_WebServerMode Admin
     2022-01-28 12:44:47   Info3_RestartReason RTC Watch dog reset digital core and rtc module
     2022-01-28 12:44:47   LWT             Online
     2022-01-28 14:08:51   LedTable        ON
     2022-01-28 14:08:51   LoadAvg         19
     2022-01-28 14:08:51   MqttCount       1
     2022-01-28 12:44:47   POWER           
     2022-01-28 14:08:51   POWER1          OFF
     2022-01-28 13:03:00   POWER2          ON
     2022-01-26 20:16:09   Restart         Restarting
     2022-01-28 14:08:51   Sleep           50
     2022-01-28 14:08:51   SleepMode       Dynamic
     2022-01-28 14:08:51   Speed           1
     2022-01-28 14:08:51   TempUnit        C
     2022-01-28 14:08:51   Time            2022-01-28T14:08:51
     2022-01-28 14:08:51   Uptime          0T01:24:11
     2022-01-28 14:08:51   UptimeSec       5051
     2022-01-28 14:08:51   Wifi_AP         1
     2022-01-28 14:08:51   Wifi_BSSId      CC:CE:1E:7E:B9:CA
     2022-01-28 14:08:51   Wifi_Channel    1
     2022-01-28 14:08:51   Wifi_Downtime   0T00:00:05
     2022-01-28 14:08:51   Wifi_LinkCount  1
     2022-01-28 14:08:51   Wifi_Mode       11n
     2022-01-28 14:08:51   Wifi_RSSI       64
     2022-01-28 14:08:51   Wifi_SSId       WW-Router-2
     2022-01-28 14:08:51   Wifi_Signal     -68
     2022-01-26 15:49:44   associatedWith  MQTT2_Mqqt2Client
     2022-01-26 21:19:57   json2nameValueErrorText error parsing 's4l3c1p20'
     2022-01-26 21:19:57   json2nameValueInput [s4l3c1p20]~20
     2022-01-26 20:16:09   restart         1
     2022-01-28 13:59:46   state           DisplayDimmer
Attributes:
   DbLogExclude .*
   devicetopic tasmota232
   readingList tele/tasmota232/STATE:.* { json2nameValue($EVENT) }
tele/tasmota232/SENSOR:.* { json2nameValue($EVENT) }
tele/tasmota232/SENSOR/Buttom:.* Buttom
tele/tasmota232/LWT:.* LWT
tele/tasmota232/INFO1:.* { json2nameValue($EVENT) }
tele/tasmota232/INFO2:.* { json2nameValue($EVENT) }
tele/tasmota232/INFO3:.* { json2nameValue($EVENT) }
stat/tasmota232/RESULT:.* { json2nameValue($EVENT) }
stat/tasmota232/POWER1:.* POWER1
stat/tasmota232/POWER2:.* POWER2
cmnd/tasmota232/POWER1:.* POWER1
cmnd/tasmota232/POWER2:.* POWER2
cmnd/tasmota232/DisplayDimmer:.* DisplayDimmer
cmnd/tasmota232/DisplayText:.* { json2nameValue($EVENT) }
cmnd/tasmota232/restart:.* restart
cmnd/tasmota232/POWER:.* POWER
   room       MQTT2_DEVICE
   setExtensionsEvent 1
   setList    POWER1:on,off,toggle,blink cmnd/$DEVICETOPIC/POWER1 $EVTPART1
  POWER2:on,off,toggle,blink cmnd/$DEVICETOPIC/POWER2 $EVTPART1
  DisplayDimmer:slider,10,1,100 cmnd/$DEVICETOPIC/DisplayDimmer $EVTPART1
  DisplayText:textField cmnd/$DEVICETOPIC/$EVENT
  Reboot:noArg cmnd/$DEVICETOPIC/restart 1
  Clear_Readings:noArg {fhem("deletereading -q $NAME (?!associatedWith).*");return undef}


  • Über Set-Befehle kann das Display mit Hilfe des Tasmota-Befehls "DisplayText" beschrieben werden. Der letzte Tastendruck der drei Funktionstasten ist im Reading "Buttom" ersichtlich.



Bis hier hin bin ich eigentlich recht zufrieden. Offene Fragen sind für mich noch:

  • Warum lässt sich das Display nicht abschalten, sondern zeigt stattdessen einen weißen Bildschirm an
  • Wo finde ich Dokumentationen über die existierenden LVGL-Klassen bzw. -Methoden für den Einsatz mit Berry? Das Beispiel ist ja verständlich, aber was kann ich wirklich alles machen
  • Das Booten des ESPs funktioniert (nach langem Ausprobieren) bei mir nur, wenn ich die Datei "display.ini" im Filesystem kopiere und die Kopie unter dem Namen "Display.ini" im Filesystem ablege. Wenn nur eine der beiden Dateien vorhanden ist, dann bootet der ESP bei mir nicht
  • Bei mir arbeitet das Display nur dann flackerfrei, wenn ich den SPI-Takt auf 20 MHz begrenze (Zeile 1 in "display.ini")

Und noch ein paar Anmerkungen:

  • Ich plane noch den Einbau eines Bewegungssensors in das Gehäuse, um damit zum einen den Bildschirm schalten zu können und zum anderen diesen Sensor als weiteren Alarmsensor zur Raumüberwachung nutzen zu können
  • Etwas überrascht hat mich der relativ hohe Stromverbrauch von ca. 200 mA bei 12 V Einspeisung. Das entspricht knapp 2.5 W
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)

frober

Bezgl. weißes Display, das dürfte die Hintergrundbeleuchtung sein. Hast du mal versucht GPIO15 abzuschalten?

https://lvgl.io/
https://github.com/berry-lang/berry
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

WW

#2
Zitat von: frober am 28 Januar 2022, 21:05:00
Bezgl. weißes Display, das dürfte die Hintergrundbeleuchtung sein. Hast du mal versucht GPIO15 abzuschalten?

Hier kann ich jetzt Fortschritte vermelden: GPIO15 ist im Template mit "BackLight" verknüpft. Ein Low an diesem Pin des Displays schaltet das Display aus. PWM-Werte (über DisplayDimmer) verändern die Helligkeit zwischen ganz dunkel und ganz hell. Unglücklicherweise ist im Schaltplan für den ESP32 eine invertierende Transistorstufe eingebaut. Daher führt das Ausschalten des Displays zum Einschalten mit maximaler Helligkeit. Es würde also so etwas wie "Backlight_i" (ein invertiertes Backlight-Signal) benötigt. Realisiert habe ich dies jetzt im Template durch Tauschen von "Backlight" mit "PWM_i 1".

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

Das hat allerdings mehrere Konsequenzen (siehe Anhang):

  • Es erscheinen auf dem GUI drei Toggle-Schaltflächen und 2 Slider
  • "Toggle 1" und der obere Slider regeln die Helligkeit des Displays (Befehle: "Power1" und "Channel1"
  • "Toggle 2" und der untere Slider regeln die die Ansteuerung des an GPIO21 angeschlossenen Buzzers (Befehle: "Power2" und "Channel2"
  • "Toggle 3" kommt automatisch aus dem Displaytreiber. Setzt man diesen auf "Off", so wird das Display wieder voll hell und übersteuert. Zum reibungslosen Betrieb muss also Toggle3 auf on stehen (Befehl: "Power3"). Diesen unschönen Effekt hätte ich gerne weg, weiß aber nicht wie, bzw. was überhaupt mit diesem Signal passiert.
  • Die ursprüngliche Helligkeitsregelung über "DisplayDimmer" funktioniert jetzt nicht mehr.
  • Aus diesen Änderungen ergben sich auf der FHEM-Seite auch einige Anpassungen:

Internals:
   CFGFN     
   CID        tasmota232
   DEF        tasmota232
   DEVICETOPIC tasmota232
   FUUID      61f04e49-f33f-8792-15c2-d61baa34d995c696
   IODev      Mqqt2Client
   LASTInputDev Mqqt2Client
   MSGCNT     24135
   Mqqt2Client_MSGCNT 24135
   Mqqt2Client_TIME 2022-01-30 17:08:07
   NAME       MQTT2_tasmota232
   NR         37086
   STATE      Channel1
   TYPE       MQTT2_DEVICE
   .attraggr:
   .attrminint:
   OLDREADINGS:
   READINGS:
     2022-01-30 17:08:07   Berry_HeapUsed  8
     2022-01-30 17:08:07   Berry_Objects   144
     2022-01-30 16:38:09   Buttom          Next
     2022-01-30 17:08:07   Channel1        50
     2022-01-30 17:08:07   Channel2        29
     2022-01-30 17:08:07   Color           804A
     2022-01-30 16:42:01   DisplayDimmer   99
     2022-01-30 17:08:07   ESP32_Temperature 50.0
     2022-01-30 17:08:07   Heap            59
     2022-01-30 16:36:03   Info1_FallbackTopic cmnd/DVES_314548_fb/
     2022-01-30 16:36:03   Info1_GroupTopic cmnd/tasmotas/
     2022-01-30 16:36:03   Info1_Module    ESP32 AZ-Touch
     2022-01-30 16:36:03   Info1_Version   10.1.0(lvgl)
     2022-01-30 16:36:03   Info2_Hostname  Tasmota232
     2022-01-30 16:36:03   Info2_IPAddress 192.168.1.232
     2022-01-30 16:36:03   Info2_WebServerMode Admin
     2022-01-30 16:36:03   Info3_RestartReason Software reset CPU
     2022-01-30 16:36:03   LWT             Online
     2022-01-30 17:08:07   LoadAvg         99
     2022-01-30 17:08:07   MqttCount       1
     2022-01-30 16:36:03   POWER           
     2022-01-30 17:08:07   POWER1          ON
     2022-01-30 17:08:07   POWER2          OFF
     2022-01-30 16:36:03   POWER3          ON
     2022-01-30 16:35:52   Restart         Restarting
     2022-01-30 17:08:07   Sleep           10
     2022-01-30 17:08:07   SleepMode       Dynamic
     2022-01-30 17:08:07   TempUnit        C
     2022-01-30 17:08:07   Time            2022-01-30T17:08:07
     2022-01-30 17:08:07   Uptime          0T00:32:11
     2022-01-30 17:08:07   UptimeSec       1931
     2022-01-30 17:08:07   Wifi_AP         1
     2022-01-30 17:08:07   Wifi_BSSId      CC:CE:1E:7E:B9:CA
     2022-01-30 17:08:07   Wifi_Channel    1
     2022-01-30 17:08:07   Wifi_Downtime   0T00:00:05
     2022-01-30 17:08:07   Wifi_LinkCount  1
     2022-01-30 17:08:07   Wifi_Mode       11n
     2022-01-30 17:08:07   Wifi_RSSI       66
     2022-01-30 17:08:07   Wifi_SSId       WW-Router-2
     2022-01-30 17:08:07   Wifi_Signal     -67
     2022-01-30 16:37:59   associatedWith  MQTT2_Mqqt2Client
     2022-01-30 16:35:52   restart         1
     2022-01-30 16:43:24   state           Channel1
Attributes:
   DbLogExclude .*
   devicetopic tasmota232
   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
   room       MQTT2_DEVICE
   setExtensionsEvent 1
   setList    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}


Edit: Das fehlte noch:
setoption68 1
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)

carlos

Hallo,
Da hast du ja gute Vorarbeit geleistet, ich habe gestern in 10min mein AZ Touch Display so installiert.
Gefällt mir ausgesprochen gut.
Da kann man drauf aufbauen.
Ich habe hier https://github.com/Beormund/Tasmota32-Multi-Zone-Heating-Controller
eine Anwendung gefunden, evtl kann man sich hier Anregungen suchen zum weiteren Vorgehen.
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

WW

#4
Zitat von: carlos am 31 Januar 2022, 11:45:24
Hallo,
...
Da kann man drauf aufbauen.
....

Hast du eine Idee, wie man den dritten Toggle-Buttom wegkriegt?

Weitere Infos über Berry:
https://github.com/berry-lang/berry/wiki/Reference
https://groups.google.com/g/sonoffusers/c/QWiyPZUpmOM

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)

Papa Romeo

Zitat von: WW am 31 Januar 2022, 13:30:01
Hast du eine Idee, wie man den dritten Toggle-Buttom wegkriegt?

Wieviele hast du in der Vorlage konfiguriert ?

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

WW

Ich habe nur 2 konfiguriert (GPIO15 und GPIO21), der dritte muss aus dem Displaytreiber (?) kommen.
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)

carlos

Bei mir sieht es mit genau der gleichen config so aus.
Bei beiden slidern reagiert der buzzer.

Irgendwas stimmt da nicht.

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

Papa Romeo

... weiß jetzt nicht wie wichtig das Signal T_IRQ für das Display ist, bzw. für welche Touch-Version die .bin geschrieben wurde.

Bei der älteren Touch-Version V01-03-00 führt GPIO02 das T_IRQ-Signal, auf dem lt. deiner Vorlage LedLink_i liegt.
Bei der neueren MOD-Version V01-03.01 ist GPIO27 des ESP32 für dieses T_IRQ-Signal zuständig.

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

carlos

In der FAQ zum AZ Touch steht das hier:
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 5 // Chip select control pin
#define TFT_DC 4 // Data Command control pin
#define TFT_RST 22 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TOUCH_CS 14 // Chip select pin (T_CS) of touch screen


Also sollte das so passen.
Bei mir steht V01-03 als Version drauf.
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

WW

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)

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

kaihs

Ich habe es dank dieser Anleitung auch sehr schnell in Betrieb nehmen können, daher danke dafür.

Nur die Touchbuttons erzeugen bei mir soweit ich erkennen kann keine MQTT-Messages.

Zitat von: WW am 28 Januar 2022, 14:34:36
Etwas überrascht hat mich der relativ hohe Stromverbrauch von ca. 200 mA bei 12 V Einspeisung. Das entspricht knapp 2.5 W[/li][/list]

Da habe ich die Beobachtung gemacht, dass sich der Stromverbrauch halbiert wenn man den Beeper komplett ausschaltet, d.h. Toggle 2 auf aus.
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

Papa Romeo

Zitat von: kaihs am 01 Februar 2022, 22:36:55
Da habe ich die Beobachtung gemacht, dass sich der Stromverbrauch halbiert wenn man den Beeper komplett ausschaltet, d.h. Toggle 2 auf aus.

... 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.

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

Papa Romeo

... habe doch die Vermutung, dass der Sketch nicht für die MOD-Version ausgelegt wurde oder bestimmte Änderungen an der Hardware nicht weiter mit in Betracht gezogen wurden. Bei der alten Version würde es keine Rolle spielen ob GPIO 21 weiter auf HIGH bleibt oder ein PWM im nicht hörbaren Bereich anliegt, da hier ein piezoelektrischer Beeper verbaut wurde. Die Stromaufnahme läge hier dann bei unter 0.5 mA.

Bei der MOD-Version haben sie einen "Beeper" mit 15 Ohm Spulenwiderstand verbaut. Da fällt das dann natürlich ganz anders ins Gewicht.

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

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...

ZeitlerW

Hallo zusammen,

nun geht es weiter mit OpenHasp in Tasmota.
https://github.com/arendst/Tasmota/pull/15307
lG
Wolfgang

WW

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

Ich greife das Thema noch einmal auf. Vielleicht hat ja inzwischen jemand Erfahrungen mit HASPmota (ehemals OpenHASP) gemacht.

Ich habe, wie unter https://tasmota.github.io/docs/HASPmota/ beschrieben, HASPmota auf meinem AZ-Touch installiert. Wie früher bereits beschrieben, habe ich in meinem AZ-Touch zwei Bewegungsmelder implemtiert (Switch1 und Switch2) und die Beispielprogramme so modifiziert, das der Status des Bewegungsmelder auf page1 angezeigt wird.

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)


... und pages.jsonl:

{"page":0,"comment":"---------- Upper stat line ----------"}
{"id":0,"text_color":"#FFFFFF"}
{"id":11,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":22,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Ahornstr. 1","text_font":"montserrat-20"}

{"id":15,"obj":"lv_wifi_arcs","x":291,"y":0,"w":29,"h":22,"radius":0,"border_side":0,"bg_color":"#000000","line_color":"#FFFFFF"}
{"id":16,"obj":"lv_clock","x":232,"y":3,"w":55,"h":16,"radius":0,"border_side":0}

{"comment":"---------- Bottom buttons - prev/home/next ----------"}
{"id":101,"obj":"btn","x":20,"y":210,"w":80,"h":25,"action":"prev","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF053","text_font":"montserrat-20"}
{"id":102,"obj":"btn","x":120,"y":210,"w":80,"h":25,"action":"back","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF015","text_font":"montserrat-20"}
{"id":103,"obj":"btn","x":220,"y":210,"w":80,"h":25,"action":"next","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF054","text_font":"montserrat-20"}

{"page":2,"comment":"---------- Page 2 ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}

{"comment":"---------- Wifi status ----------"}
{"id":20,"obj":"lv_wifi_graph","x":257,"y":25,"w":60,"h":40,"radius":0}
{"id":21,"obj":"lv_tasmota_info","x":3,"y":25,"w":251,"h":40,"radius":0}
{"id":22,"obj":"lv_tasmota_log","x":3,"y":68,"w":314,"h":90,"radius":0,"text_font":12}

{"page":1,"comment":"---------- Page 1 ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}

{"id":2,"obj":"arc","x":20,"y":65,"w":80,"h":100,"border_side":0,"type":0,"rotation":0,"start_angle":180,"end_angle":0,"start_angle1":180,"value_font":12,"value_ofs_x":0,"value_ofs_y":-14,"bg_opa":0,"text":"--.-°C","min":200,"max":800,"val":0,"val_rule":"ESP32#Temperature","val_rule_formula":"val * 10","text_rule":"ESP32#Temperature","text_rule_format":"%2.1f °C"}

{"id":5,"obj":"label","x":2,"y":35,"w":120,"text":"Temperature","align":1}

{"id":10,"obj":"label","x":172,"y":35,"w":140,"text":"Bewegungsmelder","align":0}
{"id":11,"obj":"label","x":172,"y":55,"w":140,"text":"Switch 1: ","align":0,"text_rule":"Switch1","text_rule_format":"Switch1: %s"}
{"id":12,"obj":"label","x":172,"y":75,"w":140,"text":"Switch 2: ","align":0,"text_rule":"Switch2","text_rule_format":"Switch2: %s"}

{"comment":"--- Trigger sensors every 2 seconds ---","berry_run":"tasmota.add_cron('*/2 * * * * *', def () tasmota.publish_rule(tasmota.read_sensors()) end, 'oh_every_5_s')"}


Das Durchtoggeln der beiden vorhandenen Seiten über die drei Schaltflächen funktioniert, ein Seitenwechsel über die Berry-Console p1.show() bzw. p2.show() funktioniert ebenfalls. Auch kann ich über die Berry-Console, z.B. mit p1b10.text="xxxx" den vorhandenen Text "Bewegungsmelder" überschreiben.

Was mir jetzt fehlt:

  • Wie bekomme ich den Index der aktuell dargestellten Seite nach FHEM, bzw. wie kann ich von FHEM-Seite vorgeben, welche Seite angezeigt werden soll?
  • Wie kann ich Berry-Variable von FHEM-Seite aus ändern, bzw. deren Wert erfragen?

Letztlich möchte ich erreichen, das ich über die pages.jsonl-Datei ein Menüsystem auf dem AZ-Touch aufbaue, die Variablen in Textfeldern dann von FHEM aus setzen kann, bzw. Eingabefelder auf einer Seite (z.B. Code für Alarmanlage) rücklesen kann. Zusätzlich sollen von FHEM-Seite Page-Wechsel durchführbar werden. Damit hätte ich dann die Möglichkeit, mit "vernünftigen" Fonts ansprechende Oberflächen zu erstellen.

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)

AndyM

Vielen Dank für die Super Vorarbeit.  :)

Ich habe mir mit HASPmota ein umfangreiches Menüsystem aufgebaut, in dem ich mir Werte von FHEM anzeigen lasse, Befehle an FHEM senden kann und das Display steuern kann (Slider zum dimmen, Button ,,DisplayAus").

pages.jsonl

{"page":0,"comment":"---------- Upper stat line ----------"}
{"id":0,"text_color":"#FFFFFF"}

{"id":15,"obj":"lv_wifi_arcs","x":291,"y":0,"w":29,"h":22,"radius":0,"border_side":0,"bg_color":"#000000","line_color":"#FFFFFF"}
{"id":16,"obj":"lv_clock","x":232,"y":3,"w":55,"h":16,"radius":0,"border_side":0}

{"comment":"---------- Bottom buttons - prev/home/next ----------"}
{"id":101,"obj":"btn","x":20,"y":200,"w":80,"h":30,"action":"prev","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF053","text_font":"montserrat-20"}
{"id":102,"obj":"btn","x":120,"y":200,"w":80,"h":30,"action":"back","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF015","text_font":"montserrat-20"}
{"id":103,"obj":"btn","x":220,"y":200,"w":80,"h":30,"action":"next","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF054","text_font":"montserrat-20"}

{"page":1,"comment":"---------- Page 1 Heizung ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Heizung","text_font":"montserrat-28"}


{"id":10,"obj":"label","x":20,"y":35,"w":140,"text":"Brennerleistung","align":0}
{"id":20,"obj":"label","x":160,"y":35,"w":140,"text":"","align":0}

{"id":11,"obj":"label","x":20,"y":60,"w":140,"text":"Aussentemperatur","align":0}
{"id":21,"obj":"label","x":160,"y":60,"w":70,"text":"","align":0}
{"id":31,"obj":"label","x":230,"y":60,"w":70,"text":"","align":0}

{"id":12,"obj":"label","x":20,"y":85,"w":140,"text":"Mischerkreis","align":0}
{"id":22,"obj":"label","x":160,"y":85,"w":47,"text":"","align":2}
{"id":32,"obj":"label","x":207,"y":85,"w":47,"text":"","align":0}
{"id":42,"obj":"label","x":254,"y":85,"w":46,"text":"","align":1}

{"id":13,"obj":"label","x":20,"y":110,"w":140,"text":"Warmwasser","align":0}
{"id":23,"obj":"label","x":160,"y":110,"w":47,"text":"","align":0}
{"id":33,"obj":"label","x":207,"y":110,"w":47,"text":"","align":2}
{"id":43,"obj":"label","x":254,"y":110,"w":46,"text":"","align":0}


{"id":100,"obj":"btn","x":120,"y":150,"w":80,"h":30,"action":"ww","bg_color":"#D00000","radius":10,"border_side":1,"text":"WW","text_font":"montserrat-20"}


{"page":2,"comment":"---------- Page 2 Fenster/Tueren ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Fenster/Tueren","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":20,"y":35,"w":70,"text":"Straße","align":0}
{"id":20,"obj":"label","x":90,"y":35,"w":70,"text":"","align":2}
{"id":11,"obj":"label","x":20,"y":60,"w":70,"text":"Garten G","align":0}
{"id":21,"obj":"label","x":90,"y":60,"w":70,"text":"","align":2}
{"id":12,"obj":"label","x":20,"y":85,"w":70,"text":"Garten K","align":0}
{"id":22,"obj":"label","x":90,"y":85,"w":70,"text":"","align":2}

{"id":13,"obj":"label","x":160,"y":60,"w":160,"text":"Garage","align":1}
{"id":23,"obj":"label","x":160,"y":85,"w":160,"text":"","align":1}

{"id":100,"obj":"btn","x":160,"y":150,"w":80,"h":30,"action":"Garage","bg_color":"#D00000","radius":10,"border_side":1,"text":"Garage","text_font":"montserrat-20"}

{"page":3,"comment":"---------- Page 3 Waschen ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Waschen","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":0,"y":47,"w":160,"text":"Waschmaschine","align":1}
{"id":20,"obj":"label","x":0,"y":72,"w":160,"text":"","align":1}
{"id":30,"obj":"label","x":0,"y":97,"w":160,"text":"","align":1}

{"id":11,"obj":"label","x":160,"y":47,"w":160,"text":"Trockner","align":1}
{"id":21,"obj":"label","x":160,"y":72,"w":160,"text":"","align":1}
{"id":31,"obj":"label","x":160,"y":97,"w":160,"text":"","align":1}

{"page":4,"comment":"---------- Page 4 Aquarium ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Aquarium","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":20,"y":80,"w":180,"text":"Licht","align":1}
{"id":20,"obj":"label","x":20,"y":130,"w":180,"text":"","align":1}

{"id":100,"obj":"btn","x":200,"y":50,"w":100,"h":30,"action":"Blau","bg_color":"#D00000","radius":10,"border_side":1,"text":"Blau","text_font":"montserrat-20"}
{"id":101,"obj":"btn","x":200,"y":100,"w":100,"h":30,"action":"Weis","bg_color":"#D00000","radius":10,"border_side":1,"text":"Weis","text_font":"montserrat-20"}
{"id":102,"obj":"btn","x":200,"y":150,"w":100,"h":30,"action":"Aus","bg_color":"#D00000","radius":10,"border_side":1,"text":"Aus","text_font":"montserrat-20"}

{"page":5,"comment":"---------- Page 5 System-AZ ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"System-AZ","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":20,"y":35,"w":280,"text":"Temperatur","align":0,"text_rule":"ESP32#Temperature","text_rule_format":"Temperatur: %2.1f °C","text_rule_formula":"val"}

{"id":50,"obj":"slider","x":20,"y":60,"w":280,"h":30,"bg_color":"#D00000","radius":10,"border_side":1,"min":0,"max":100,"val":100,"val_rule":"Channel1"}

{"id":100,"obj":"btn","x":20,"y":150,"w":120,"h":30,"bg_color":"#D00000","radius":10,"border_side":1,"text":"DisplayAus","text_font":"montserrat-20"}
{"id":101,"obj":"btn","x":180,"y":150,"w":120,"h":30,"bg_color":"#D00000","radius":10,"border_side":1,"text":"Refresh","text_font":"montserrat-20"}


autoexec.be

# simple `autoexec.be` to run HASPmota using the default `pages.jsonl`
import haspmota
import string
haspmota.start()
def DisplayON() end

def ObjOFF()
  tasmota.add_rule("hasp", DisplayON)
end

def DisplayOFF()
  tasmota.cmd("POWER1 off")
  global.p1b100.enabled=0
  global.p2b100.enabled=0
  global.p4b100.enabled=0
  global.p4b101.enabled=0
  global.p4b102.enabled=0
  global.p5b50.enabled=0
  global.p5b100.enabled=0
  global.p5b101.enabled=0
  tasmota.set_timer(500, ObjOFF)
  tasmota.remove_timer("timerDisplayChack")
  print("Display off")
end

def ObjON()
  global.p1b100.enabled=1
  global.p2b100.enabled=1
  global.p4b100.enabled=1
  global.p4b101.enabled=1
  global.p4b102.enabled=1
  global.p5b50.enabled=1
  global.p5b100.enabled=1
  global.p5b101.enabled=1
  tasmota.remove_rule("hasp")
end

def DisplayAktiv()
  var inactive_time = lv.disp().get_inactive_time()
  if inactive_time > 30000
    DisplayOFF()
  end
  if inactive_time <= 30000
    tasmota.set_timer(1000, DisplayAktiv, "timerDisplayChack")
  end
end

def DisplayON()
  tasmota.cmd("POWER1 on")
  tasmota.set_timer(500, ObjON)
  tasmota.set_timer(1000, DisplayAktiv)
  print("Display on")
end

#Warmwasser
#tasmota.add_rule("hasp#p1b100#event==up", / -> tasmota.cmd(""))
#Garagr
#tasmota.add_rule("hasp#2b100#event==up", / -> tasmota.cmd(""))
#Aquqrium
tasmota.add_rule("hasp#p4b100#event==up", / -> tasmota.publish("Aquarium/Licht/Schalten", "Blau"))
tasmota.add_rule("hasp#p4b101#event==up", / -> tasmota.publish("Aquarium/Licht/Schalten", "Weis"))
tasmota.add_rule("hasp#p4b102#event==up", / -> tasmota.publish("Aquarium/Licht/Schalten", "Aus"))
#System-AZ
tasmota.add_rule("hasp#p5b50#val", / val-> tasmota.cmd("Channel1 " + str(val)))
tasmota.add_rule("hasp#p5b100#event==up", DisplayOFF)
tasmota.add_rule("hasp#p5b101#event==up", / -> tasmota.publish("AZ_Touch/ExterneWerteSenden", "Senden"))
DisplayON()

def Wertezuweisen(topic, idx, payload_s,payload_b)
  if topic == "FHEM/MyWolf/Brennerleistung"
    global.p1b20.text=string.format("%.0f%%", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Aussentemperatur"
    global.p1b21.text=string.format("%.1f°C", real(payload_s))
  end
  if topic == "FHEM/MyWolf/AussentemperaturGemittelt"
    global.p1b31.text=string.format("(%.1f°C)", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Mischerkreis/Ist"
    global.p1b22.text=string.format("%.1f/", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Mischerkreis/Soll"
    global.p1b32.text=string.format("%.1f°C", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Mischerkreis/Mischer"
    global.p1b42.text=string.format("%.0f%%", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Warmwasser/Solar"
    global.p1b23.text=string.format("%.1f°C", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Warmwasser/Ist"
    global.p1b33.text=string.format("%.1f/", real(payload_s))
  end
  if topic == "FHEM/MyWolf/Warmwasser/Soll"
    global.p1b43.text=string.format("%.1f°C", real(payload_s))
  end
  if topic == "FHEM/Fenster/DG/Strasse"
    if payload_s == "closed"
      global.p2b20.text="ZU"
      global.p2b20.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b20.text="AUF"
      global.p2b20.text_color="#D00000"
    end
  end
  if topic == "FHEM/Fenster/DG/Garten_G"
    if payload_s == "closed"
      global.p2b21.text="ZU"
      global.p2b21.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b21.text="AUF"
      global.p2b21.text_color="#D00000"
    end
  end
  if topic == "FHEM/Fenster/DG/Garten_K"
    if payload_s == "closed"
      global.p2b22.text="ZU"
      global.p2b22.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b22.text="AUF"
      global.p2b22.text_color="#D00000"
    end
  end
  if topic == "FHEM/Garage/Tor/Pruefen"
    if payload_s == "on"
      global.p2b23.text="ZU"
      global.p2b23.text_color="#FFFFFF"
    end
    if payload_s == "off"
      global.p2b23.text="AUF"
      global.p2b23.text_color="#D00000"
    end
  end
  if topic == "FHEM/Waschen/Trockner/Betrieb"
    global.p3b21.text=payload_s
  end
  if topic == "FHEM/Waschen/Trockner/Leistung"
    global.p3b31.text=string.format("%.0fW", real(payload_s))
  end
  if topic == "FHEM/Waschen/Waschmaschine/Betrieb"
    global.p3b20.text=payload_s
  end
  if topic == "FHEM/Waschen/Waschmaschine/Leistung"
    global.p3b30.text=string.format("%.0fW", real(payload_s))
  end
  if topic == "FHEM/Aquarium/Licht/Info"
    global.p4b20.text=payload_s
  end
  print(topic +" "+ payload_s +"("+ idx +" "+ payload_b +")")
end


def subscribes()
  import mqtt
  mqtt.subscribe("FHEM/#", Wertezuweisen)
end

tasmota.add_rule("MQTT#Connected=1", subscribes)


Ich verwende die Tasmota-Version 12.1.1.
Quelle der MQTT Subscribe ist https://github.com/arendst/Tasmota/discussions/14856

Die Werte aus FHEM werden jeweils durch ein MQTT-Topic übermittelt, das mit FHEM/... beginnt. Sie werden mit der Funktion Wertezuweisen(topic, idx, payload_s,payload_b) ausgewertet und einem Label zugewiesen (z.B. global.p1b2.text=...). Die MQTT-Topics werden mit einer MQTT Subscribe mqtt.subscribe("FHEM/#", Wertezuweisen) überwacht.
In FHEM werden die Readings mit MQTT_GENERIC_BRIDGE im jeweiligen Device gesendet und empfangen (z.B. attr <dev> mqttPublish <READING>:topic=FHEM/...).

Die Funktionen DisplayOFF, ObjOFF, ObjON und DisplayON deaktivieren bzw. aktivieren das Display und die Objekte zur Eingabe (btn & slider). Das deaktivieren erfolgt mit dem Button ,,DisplayAus" oder der Funktion DisplayAktiv nach 30s Inaktivität. Beide lösen DisplayOFF aus. Aktiviert wird das Display mit einem Tuch. Wenn das Display aus ist, wird die Regel hasp - tasmota.add_rule("hasp", DisplayON) – aktiviert und wenn es an ist, wird sie wider deaktiviert - tasmota.remove_rule("hasp").

Vorher hatte ich für jedes MQTT-Topic eine mqtt.subscribe mit zugehöriger Funktion eingerichtet. Es waren zum Schluss 18 Topics, die überwacht wurden. Leider stürzte Tasmota nach kurzer Zeit (1-2 Stunden) ab, und ich musste das Gerät kurz vom Strom trennen. Das ist aber behoben, da nur noch das Topik FHEM/# überwacht wird.

WW

Zitat von: AndyM am 02 November 2022, 16:07:51
...
Ich habe mir mit HASPmota ein umfangreiches Menüsystem aufgebaut, in dem ich mir Werte von FHEM anzeigen lasse, Befehle an FHEM senden kann und das Display steuern kann (Slider zum dimmen, Button ,,DisplayAus").
...

Super, das war genau der Teil, der mir noch fehlte.  :)

Was mir noch unklar ist: Gibt es außerhalb der Haspmota-Beschreibung auf der Tasmota-Seite, irgendeine empfehlenswerte Dokumentation über Berry bzw. die Verbindung zu Tasmota / Haspmota. Ich bin bisher z.B. gescheitert, weil mit "global." nicht klar war. Überhaupt erschliesst es sich mir nicht immer, welche Klassen, Methoden oder Besonderheiten es alles gibt, bzw. wie die entsprechende Syntax ist.

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)

AndyM

Andrer Quellen als tasmota.github.io habe ich leider auch nicht gefunden. Habe die meisten Sachen durch ausprobieren herausgefunden. Das mit "global." habe ich z.B. in der tamota_demo.tapp gefunden. Die TAPP-Dateien können einfach entpackt werden.
Wenn mal was nicht funktioniert hat, gab es ja zum Glück Hinweise in der Console von Tasmota, warum die autoexec.be nicht geladen werden konnte.

LG
Andy

AndyM

Kleines Update zu meinem Script.

Die pages.jsonl ist gleich geblieben. Die autoexec.be habe ich so geändert, dass die MQTT-topics je nach LogLevel protokolliert werden und bei wichtigen Ereignissen das Display angeht und die entsprechende Seite gezeigt wird.

Die Funktion log(text:string, loglevel:int) sollte selbst erklärend sein.

Da das Display bei einer Aktivierung mit DisplayON() ohne Berührung des Displays sofort wider aus ging, musste ich eine Aktivität simulieren. (Z.B. bei der Behandlung des Topics "FHEM/Waschen/Trockner/Betrieb")
Sobald das Display an ist, wird mit lv.disp().get_inactive_time() die Zeit der Inaktivität ermittelt. Mit lv.disp().trig_activity() wird eine Aktivität simulieren. Somit bleibt das Display auch jetzt 30s an.
Mit global.p3.show() wird die entsprechende Seite gezeigt.

Quelle für lv.disp().trig_activity() ist docs.lvgl.io hier heißt es allerdings lv_disp_trig_activity().

autoexec.be

# simple `autoexec.be` to run HASPmota using the default `pages.jsonl`
import haspmota
import string
haspmota.start()
def DisplayON() end

def ObjOFF()
  tasmota.add_rule("hasp", DisplayON)
end

def DisplayOFF()
  tasmota.cmd("POWER1 off")
  global.p1b100.enabled=0
  global.p2b100.enabled=0
  global.p4b100.enabled=0
  global.p4b101.enabled=0
  global.p4b102.enabled=0
  global.p5b50.enabled=0
  global.p5b100.enabled=0
  global.p5b101.enabled=0
  tasmota.set_timer(500, ObjOFF)
  tasmota.remove_timer("timerDisplayChack")
end

def ObjON()
  global.p1b100.enabled=1
  global.p2b100.enabled=1
  global.p4b100.enabled=1
  global.p4b101.enabled=1
  global.p4b102.enabled=1
  global.p5b50.enabled=1
  global.p5b100.enabled=1
  global.p5b101.enabled=1
  tasmota.remove_rule("hasp")
end

def DisplayAktiv()
  var inactive_time = lv.disp().get_inactive_time()
  if inactive_time > 30000
    DisplayOFF()
  else
    tasmota.set_timer(1000, DisplayAktiv, "timerDisplayChack")
  end
end

def DisplayON()
  tasmota.cmd("POWER1 on")
  tasmota.set_timer(500, ObjON)
  tasmota.set_timer(1000, DisplayAktiv)
end

#Warmwasser
#tasmota.add_rule("hasp#p1b100#event==up", / -> tasmota.cmd(""))
#Garagr
#tasmota.add_rule("hasp#2b100#event==up", / -> tasmota.cmd(""))
#Aquqrium
tasmota.add_rule("hasp#p4b100#event==up", / -> tasmota.publish("FHEM/Aquarium/Licht/Info", "Blau"))
tasmota.add_rule("hasp#p4b101#event==up", / -> tasmota.publish("FHEM/Aquarium/Licht/Info", "Weis"))
tasmota.add_rule("hasp#p4b102#event==up", / -> tasmota.publish("FHEM/Aquarium/Licht/Info", "Aus"))
#System-AZ
tasmota.add_rule("hasp#p5b50#val", / val-> tasmota.cmd("Channel1 " + str(val)))
tasmota.add_rule("hasp#p5b100#event==up", DisplayOFF)
tasmota.add_rule("hasp#p5b101#event==up", / -> tasmota.publish("AZ_Touch/ExterneWerteSenden", "Senden"))
DisplayON()

def Wertezuweisen(topic, idx, payload_s,payload_b)
  var logmassage = "MQTT: "
  var loglevel = 4
  if topic == "FHEM/MyWolf/Brennerleistung"
    global.p1b20.text=string.format("%.0f%%", real(payload_s))
  elif topic == "FHEM/MyWolf/Aussentemperatur"
    global.p1b21.text=string.format("%.1f°C", real(payload_s))
  elif topic == "FHEM/MyWolf/AussentemperaturGemittelt"
    global.p1b31.text=string.format("(%.1f°C)", real(payload_s))
  elif topic == "FHEM/MyWolf/Mischerkreis/Ist"
    global.p1b22.text=string.format("%.1f/", real(payload_s))
  elif topic == "FHEM/MyWolf/Mischerkreis/Soll"
    global.p1b32.text=string.format("%.1f°C", real(payload_s))
  elif topic == "FHEM/MyWolf/Mischerkreis/Mischer"
    global.p1b42.text=string.format("%.0f%%", real(payload_s))
  elif topic == "FHEM/MyWolf/Warmwasser/Solar"
    global.p1b23.text=string.format("%.1f°C", real(payload_s))
  elif topic == "FHEM/MyWolf/Warmwasser/Ist"
    global.p1b33.text=string.format("%.1f/", real(payload_s))
  elif topic == "FHEM/MyWolf/Warmwasser/Soll"
    global.p1b43.text=string.format("%.1f°C", real(payload_s))
  elif topic == "FHEM/Fenster/DG/Strasse"
    if payload_s == "closed"
      global.p2b20.text="ZU"
      global.p2b20.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b20.text="AUF"
      global.p2b20.text_color="#D00000"
    end
  elif topic == "FHEM/Fenster/DG/Garten_G"
    if payload_s == "closed"
      global.p2b21.text="ZU"
      global.p2b21.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b21.text="AUF"
      global.p2b21.text_color="#D00000"
    end
  elif topic == "FHEM/Fenster/DG/Garten_K"
    if payload_s == "closed"
      global.p2b22.text="ZU"
      global.p2b22.text_color="#FFFFFF"
    end
    if payload_s == "opened"
      global.p2b22.text="AUF"
      global.p2b22.text_color="#D00000"
    end
  elif topic == "FHEM/Garage/Tor/Pruefen"
    if payload_s == "on"
      global.p2b23.text="ZU"
      global.p2b23.text_color="#FFFFFF"
    end
    if payload_s == "off"
      global.p2b23.text="AUF"
      global.p2b23.text_color="#D00000"
    end
  elif topic == "FHEM/Waschen/Trockner/Betrieb"
    global.p3b21.text=payload_s
    if payload_s == "fertig"
      global.p3.show()
      lv.disp().trig_activity()
      DisplayON()
      global.p3b21.text_color="#00D000"
    else
      global.p3b21.text_color="#FFFFFF"
    end
  elif topic == "FHEM/Waschen/Trockner/Leistung"
    global.p3b31.text=string.format("%.0fW", real(payload_s))
  elif topic == "FHEM/Waschen/Waschmaschine/Betrieb"
    global.p3b20.text=payload_s
    if payload_s == "fertig"
      global.p3.show()
      lv.disp().trig_activity()
      DisplayON()
      global.p3b20.text_color="#00D000"
    else
      global.p3b20.text_color="#FFFFFF"
    end
  elif topic == "FHEM/Waschen/Waschmaschine/Leistung"
    global.p3b30.text=string.format("%.0fW", real(payload_s))
  elif topic == "FHEM/Aquarium/Licht/Info"
    global.p4b20.text=payload_s
  else
    logmassage = "MQTT: MQTT-Unknown "
    loglevel = 2
  end
  log(logmassage + topic +" "+ payload_s +"("+ str(idx) +" "+ str(payload_b) +")",loglevel)
  return true
end

def subscribes()
  import mqtt
  mqtt.subscribe("FHEM/#", Wertezuweisen)
end

tasmota.add_rule("MQTT#Connected=1", subscribes)

gr3g0r

Hallo Andy

kannst du auch deine Definition aus FHEM Posten das würde mir sehr helfen das alles zu verstehen.



grüße

AndyM

Einen MQTT-Server setze ich mal voraus (https://wiki.fhem.de/wiki/MQTT).

Ich habe wie im Abschnitt 3.1 - FHEM als MQTT-Server – einen MQTT2_SERVER angelegt. Diesen habe ich mit dem allowed Device abgesichert (optional).

Den verwendeten Readings der unterschiedlichen Devices habe ich direkt in diesen ein MQTT-Topik zugewiesen. Siehe Abschnitt 3.4.1 MQTT_GENERIC_BRIDGE.

Bei mir sind die beiden Devices wie folgt angelegt.

define MQTT_Server MQTT2_SERVER 1883 global
attr MQTT_Server clientOrder MQTT2_DEVICE MQTT_GENERIC_BRIDGE

define MQTT MQTT_GENERIC_BRIDGE
attr MQTT IODev MQTT_Server



Als Beispiel mein dummy Device zur Steuerung meiner Aquariumbeleuchtung.
Mit den Attributen mqttPublish und mqttSubscribe wird das Reading ,,state" per MQTT gesendet bzw. mit MQTT geändert/gesetzt. Damit das Licht wirklich gesteuert wird, sind natürlich noch weitere Devices erforderlich.


define AquariumLicht dummy
attr AquariumLicht devStateIcon Weis:on@white Blau:on@blue Aus:off
attr AquariumLicht icon Icon_Fisch@SkyBlue
attr AquariumLicht mqttPublish state:topic={"FHEM/Aquarium/Licht/Info"}
attr AquariumLicht mqttSubscribe state:topic={"FHEM/Aquarium/Licht/Info"}
attr AquariumLicht webCmd Weis:Blau:Aus



Der Button zum Refreshen (letzte Zeile in der pages.jsonl) hat in FHEM folgende Devices.

Dummy zum Empfang des MQTT-Topics.

define AZ_Touch_ExterneWerteSenden dummy
attr AZ_Touch_ExterneWerteSenden mqttSubscribe ExterneWerteSenden:topic=AZ_Touch/ExterneWerteSenden
attr AZ_Touch_ExterneWerteSenden userReadings ExterneWerteSenden


Notify zum Schalten eines AT Device.

define n_AZ_Touch_ExterneWerteSenden notify AZ_Touch_ExterneWerteSenden:ExterneWerteSenden.* set a_MQTT_Aktualisieren execNow


AT zum Senden der Readings per MQTT. Es ist nur ein Reading als Beispiel angegeben.

define a_MQTT_Aktualisieren at +*00:15:00 \
set MQTT_Server publish FHEM/Aquarium/Licht/Info {(ReadingsVal("AquariumLicht","state",0))};;\
set MQTT_Server publish FHEM/... {(ReadingsVal("<DEVICE>",">READING>",0))};;\
...
set MQTT_Server publish FHEM/... {(ReadingsVal("<DEVICE>",">READING>",0))}
attr a_MQTT_Aktualisieren alignTime 00:05


Ich hoffe es ist nachvollziehbar. Die drei Devices für den Refresh-Button könnte man vielleicht auch durch ein DOIF ersetzen. Testen, ob die MQTT-Topics gesendet werden, kann man z.B. mit einer APP auf dem Smartphone.

Viel Erfolg.

frober

#39
MQTT_GENERIC_BRIDGE ist eigentlich für Devices die kein MQTT sprechen.

In deinem Fall reicht doch ein MQTT_CLIENT MQTT_DEVICE!
Dann  brauchst du keinen Dummy.
Beim Senden der Topics von Tasmota, sollte das Device automatisch angelegt werden ( Edit: bez. auf MQTT2).

Nachtrag:
Ich sehe gerade, du schreibst vom MQTT2 und benutzt aber MQTT, das ist ein Unterschied!
MQTT braucht einen Broker ala Mosquito
MQTT2 macht alles alleine, es reicht die Def in Fhem

Hier noch der Link zu MQTT2 https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

AndyM

Ich benutze MQTT2_SERVER und MQTT_GENERIC_BRIDGE die heißen nur ,,MQTT_Server" und ,,MQTT". Ist nicht so schön, da es verwirrend ist und es ein MQTT Device auch noch wirklich gibt. Aber es funktioniert.  :)

Du hast natürlich recht. Bei mir wurde ein MQTT2_DEVICE angelegt. Das Dummy kann man sich sparen.


WW

#41
Zitat von: AndyM am 02 November 2022, 16:07:51
Ich habe mir mit HASPmota ein umfangreiches Menüsystem aufgebaut, in dem ich mir Werte von FHEM anzeigen lasse, Befehle an FHEM senden kann und das Display steuern kann (Slider zum dimmen, Button ,,DisplayAus").

Dank der Anregungen von AndyM habe ich meine Konfiguration jetzt noch einmal überarbeitet und möchte das Ergebnis zur Anregung hier noch einmal darstellen. Wie bereits beschrieben habe ich mein AZ-Touch mit 2 Bewegungssensoren erweitert. Jetzt habe ich zusätzlich noch eine Signalisierungs-LED eingebaut. Diese wird als Relais1 angesprochen (siehe Bilder 1 und 2).

autoexec.be:
# simple `autoexec.be` to run HASPmota using the default `pages.jsonl`
import haspmota
import string
haspmota.start()

# menuesystem (1:Temperatur, 2:Energie, 3:Spritpreise, 4:Heizung)
global.p4.next=1
global.p1.prev=4

# menuesystem (5:Info)
global.p5.next=1
global.p5.prev=1


#Touch im oberen Bildschirmbereich
def statusleiste()
  tasmota.cmd("power1 off")   # led aus
  tasmota.cmd("power3 off")   # piezo aus
end
tasmota.add_rule("hasp#p0b200#event==up", statusleiste)

# Heizung schalten
tasmota.add_rule("hasp#p4b100#event==up", / -> tasmota.publish("cmnd/tasmota118/POWER1", "1"))
tasmota.add_rule("hasp#p4b101#event==up", / -> tasmota.publish("cmnd/tasmota118/POWER1", "0"))


# Werte von FHEM übernehmen
def Wertezuweisen(topic, idx, payload_s,payload_b)
  # Temperaturen
  if topic == "AzTouch/temp/au"
    global.p1b12.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/temp/kg"
    global.p1b22.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/temp/eg"
    global.p1b32.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/temp/og"
    global.p1b42.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/temp/dg"
    global.p1b52.text=string.format("%s",payload_s)
  end

  # Energie
  if topic == "AzTouch/energie/strom"
    global.p2b12.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/energie/gas"
    global.p2b22.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/energie/wasser"
    global.p2b32.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/energie/brunnen"
    global.p2b42.text=string.format("%s",payload_s)
  end

  # Sprit
  if topic == "AzTouch/sprit/diesel"
    global.p3b12.text=string.format("%s",payload_s)
  end
  if topic == "AzTouch/sprit/e5"
    global.p3b22.text=string.format("%s",payload_s)
  end

  # Heizung
  if topic == "AzTouch/heizung/zustand"
    global.p4b12.text=string.format("%s",payload_s)
  end

  # Info
  if topic == "AzTouch/info/text"
    global.p5b11.text=string.format("%s",payload_s)
  end

  # Seitenwechsel von FHEM aus
  if topic == "AzTouch/tasmota232/page"
    if payload_s == "Temperatur"
      global.p1.show()
    end
    if payload_s == "Energie"
      global.p2.show()
    end
    if payload_s == "Spritpreise"
      global.p3.show()
    end
    if payload_s == "Heizung"
      global.p4.show()
    end
    if payload_s == "Info"
      global.p5.show()
    end
  end

end


def subscribes()
  import mqtt
  mqtt.subscribe("AzTouch/#", Wertezuweisen)
end

tasmota.add_rule("MQTT#Connected=1", subscribes)


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

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

tasmota.add_rule("Switch2",rule_switch2)
tasmota.cmd("blinkcount 0")
tasmota.cmd("blinktime 4")


und pages.jsonl:
{"page":0,"comment":"---------- Upper stat line ----------"}
{"id":0,"text_color":"#FFFFFF"}
{"id":200,"obj":"btn","x":0,"y":0,"w":320,"h":75,"bg_opa":0}

{"id":15,"obj":"lv_wifi_arcs","x":291,"y":2,"w":29,"h":22,"radius":0,"border_side":0,"bg_color":"#000000","line_color":"#FFFFFF"}
{"id":16,"obj":"lv_clock","x":232,"y":6,"w":55,"h":16,"radius":0,"border_side":0}

{"comment":"---------- Bottom buttons - prev/home/next ----------"}
{"id":101,"obj":"btn","x":20,"y":200,"w":80,"h":30,"action":"prev","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF053","text_font":"montserrat-20"}
{"id":102,"obj":"btn","x":120,"y":200,"w":80,"h":30,"action":"back","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF015","text_font":"montserrat-20"}
{"id":103,"obj":"btn","x":220,"y":200,"w":80,"h":30,"action":"next","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF054","text_font":"montserrat-20"}


{"page":1,"comment":"---------- Page: Temperaturen ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF","text_font":"robotocondensed-24"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":" Temperatur","text_font":"montserrat-28"}
{"id":200,"obj":"btn","x":0,"y":80,"w":320,"h":75,"bg_opa":0,"action":"p5"}

{"id":11,"obj":"label","x":10,"y":40,"w":140,"text":"AU:","align":0}
{"id":12,"obj":"label","x":60,"y":40,"w":260,"text":"","align":0}

{"id":21,"obj":"label","x":10,"y":70,"w":140,"text":"KG:","align":0}
{"id":22,"obj":"label","x":60,"y":70,"w":260,"text":"","align":0}

{"id":31,"obj":"label","x":10,"y":100,"w":140,"text":"EG:","align":0}
{"id":32,"obj":"label","x":60,"y":100,"w":260,"text":"","align":0}

{"id":41,"obj":"label","x":10,"y":130,"w":140,"text":"OG:","align":0}
{"id":42,"obj":"label","x":60,"y":130,"w":260,"text":"","align":0}

{"id":51,"obj":"label","x":10,"y":160,"w":140,"text":"DG:","align":0}
{"id":52,"obj":"label","x":60,"y":160,"w":260,"text":"","align":0}


{"page":2,"comment":"---------- Page: Energie ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF","text_font":"robotocondensed-24"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":" Energie","text_font":"montserrat-28"}

{"id":11,"obj":"label","x":10,"y":40,"w":140,"text":"Strom:","align":0}
{"id":12,"obj":"label","x":100,"y":40,"w":160,"text":"","align":2}
{"id":13,"obj":"label","x":270,"y":40,"w":50,"text":"kWh","align":0}

{"id":21,"obj":"label","x":10,"y":70,"w":140,"text":"Gas:","align":0}
{"id":22,"obj":"label","x":100,"y":70,"w":160,"text":"","align":2}
{"id":23,"obj":"label","x":270,"y":70,"w":50,"text":"kWh","align":0}

{"id":31,"obj":"label","x":10,"y":100,"w":140,"text":"Wasser:","align":0}
{"id":32,"obj":"label","x":100,"y":100,"w":160,"text":"","align":2}
{"id":33,"obj":"label","x":270,"y":100,"w":50,"text":"Liter","align":0}

{"id":41,"obj":"label","x":10,"y":130,"w":140,"text":"Brunnen:","align":0}
{"id":42,"obj":"label","x":100,"y":130,"w":160,"text":"","align":2}
{"id":43,"obj":"label","x":270,"y":130,"w":50,"text":"Liter","align":0}


{"page":3,"comment":"---------- Page: Spritpreise ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF","text_font":"robotocondensed-24"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":" Spritpreise","text_font":"montserrat-28"}

{"id":11,"obj":"label","x":10,"y":70,"w":140,"text":"Diesel:","align":0}
{"id":12,"obj":"label","x":120,"y":70,"w":60,"text":"","align":2}
{"id":13,"obj":"label","x":240,"y":70,"w":120,"text":"€/Liter","align":0}

{"id":21,"obj":"label","x":10,"y":100,"w":140,"text":"Super:","align":0}
{"id":22,"obj":"label","x":120,"y":100,"w":60,"text":"","align":2}
{"id":23,"obj":"label","x":240,"y":100,"w":120,"text":"€/Liter","align":0}

{"page":4,"comment":"---------- Page: Heizung ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF","text_font":"robotocondensed-24"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":" Heizung","text_font":"montserrat-28"}

{"id":11,"obj":"label","x":10,"y":70,"w":140,"text":"aktuell:","align":0}
{"id":12,"obj":"label","x":120,"y":70,"w":200,"text":"","align":0}

{"id":100,"obj":"btn","x":40,"y":120,"w":100,"h":50,"action":"","bg_color":"#D00000","radius":10,"border_side":1,"text":"ein","text_font":"montserrat-20"}
{"id":101,"obj":"btn","x":180,"y":120,"w":100,"h":50,"action":"","bg_color":"#D00000","radius":10,"border_side":1,"text":"aus","text_font":"montserrat-20"}


{"page":5,"comment":"---------- Page: Info ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF","text_font":"robotocondensed-24"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":" Info","text_font":"montserrat-28"}

{"id":11,"obj":"label","x":0,"y":40,"w":320,"text":"","align":0}


Die Bilder 3 - 7 zeigen die entsprechenden Bildschirme.

Die Steuerung auf FHEM-Seite erfolgt zum einen über ein DOIF:
defmod doifEgDieleTasmota232 DOIF AzTouch {\
[+:05];;\
#####  Temperatur, Luftfeuchtigkeit und Luftdruck  #####\
if (1) {\
# 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 = "";;\
$text .= sprintf("%5.1f °C,  ",$t);;\
$text .= sprintf("%2.0f %%,  ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
fhem_set("Mqqt2Client publish -r AzTouch/temp/au $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 = "";;\
$text .= sprintf("%5.1f °C,  ",$t);;\
$text .= sprintf("%2.0f %%,  ",$h);;\
fhem_set("Mqqt2Client publish -r AzTouch/temp/kg $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 = "";;\
$text .= sprintf("%5.1f °C,  ",$t);;\
$text .= sprintf("%2.0f %%,  ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
fhem_set("Mqqt2Client publish -r AzTouch/temp/eg $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 = "";;\
$text .= sprintf("%5.1f °C,  ",$t);;\
$text .= sprintf("%2.0f %%,  ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
fhem_set("Mqqt2Client publish -r AzTouch/temp/og $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;;\
\
$p = 0;;\
$p += [?TestLgwLacrosse98:pressure];;\
$p /= 1;;\
\
$text = "";;\
$text .= sprintf("%5.1f °C,  ",$t);;\
$text .= sprintf("%2.0f %%,  ",$h);;\
$text .= sprintf("%4.0f hPa",$p);;\
fhem_set("Mqqt2Client publish -r AzTouch/temp/dg $text");;\
}\
\
#####  Energie-Verbrauch  #####\
if (1) {\
\
# Strom: Zeile 1\
my $text = "";;\
$text .= sprintf("%.3f / ",[myCounter:Strom_day]);;\
$text .= sprintf("%.3f",[?myCounter:Strom_last_day]);;\
fhem_set("Mqqt2Client publish -r AzTouch/energie/strom $text");;\
\
# Gas: Zeile 2\
$text = "";;\
$text .= sprintf("%.1f / ",[myCounter:Gas_day]);;\
$text .= sprintf("%.1f",[?myCounter:Gas_last_day]);;\
fhem_set("Mqqt2Client publish -r AzTouch/energie/gas $text");;\
\
# Wasser: Zeile 3\
$text = "";;\
$text .= sprintf("%.0f / ",[myCounter:Wasser_day]*1000);;\
$text .= sprintf("%.0f",[?myCounter:Wasser_last_day]*1000);;\
fhem_set("Mqqt2Client publish -r AzTouch/energie/wasser $text");;\
\
# Brunnen: Zeile 4\
$text = "";;\
$text .= sprintf("%.0f / ",[myCounter:Brunnen_day]*1000);;\
$text .= sprintf("%.0f",[?myCounter:Brunnen_last_day]*1000);;\
fhem_set("Mqqt2Client publish -r AzTouch/energie/brunnen $text");;\
}\
\
#####  Spritpreise  #####\
if (1) {\
\
# Diesel: Zeile 1\
my $text = "";;\
$text .= sprintf("%.2f",[TankstelleVennikel:Diesel]);;\
fhem_set("Mqqt2Client publish -r AzTouch/sprit/diesel $text");;\
\
# SuperE5: Zeile 2\
$text = "";;\
$text .= sprintf("%.2f",[TankstelleVennikel:SuperE5]);;\
fhem_set("Mqqt2Client publish -r AzTouch/sprit/e5 $text");;\
}\
\
\
#####  Heizung  #####\
if (1) {\
# Heizungsmode\
my $text = "";;\
$text .= sprintf("%s",[DgNzHeizung118:Heizungsmode]);;\
fhem_set("Mqqt2Client publish -r AzTouch/heizung/zustand $text");;\
if ($text eq "Aus"){\
#fhem_set("EgDieleTasmota232 SelectPage Heizung");;\
}\
}\
\
}
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

setstate doifEgDieleTasmota232 initialized
setstate doifEgDieleTasmota232 2022-11-15 19:05:00 Device myCounter
setstate doifEgDieleTasmota232 2022-11-15 19:05:00 block_AzTouch executed
setstate doifEgDieleTasmota232 2022-11-15 15:11:16 e_DgNzHeizung118_Heizungsmode Automatik
setstate doifEgDieleTasmota232 2022-11-15 18:30:19 e_TankstelleVennikel_Diesel 1.86
setstate doifEgDieleTasmota232 2022-11-15 18:40:18 e_TankstelleVennikel_SuperE5 1.84
setstate doifEgDieleTasmota232 2022-11-14 00:00:05 e_myCounter_Brunnen_day 0
setstate doifEgDieleTasmota232 2022-11-15 19:00:00 e_myCounter_Gas_day 28.20
setstate doifEgDieleTasmota232 2022-11-15 19:05:00 e_myCounter_Strom_day 8.9086
setstate doifEgDieleTasmota232 2022-11-15 18:48:05 e_myCounter_Wasser_day 0.1416
setstate doifEgDieleTasmota232 2022-11-09 21:09:30 mode enabled
setstate doifEgDieleTasmota232 2022-11-09 21:09:30 state initialized
setstate doifEgDieleTasmota232 2022-11-15 19:05:00 timer_01_c01 15.11.2022 19:10:00


Im folgendem DOIF wird unter "heizung_aus" von FHEM-Seite aus die LED eingeschaltet, der Piezo-Summer aktiviert und die entsprechene Menüseite "Heizung" auf dem AZ-Touch angezeigt:
defmod doifHeizung DOIF heizung_an {              \
if ([05:45]) {\
fhem_set("DgNzHeizung118 on");;\
} \
}\
  \
heizung_aus { # Tür Anbau und Küche überwachen \
if (([$SELF:sperre] eq "on") and ([?DgNzHeizung118:POWER1] eq "on")) {    \
#Log 1,"Anbau: ".[EgAbZbDwTS:Reed].", Küche: ".[EgKuZbDwTS:Reed].", Heizung: ".[DgNzHeizung118:POWER1];;\
fhem_set("DgNzHeizung118 off");;\
fhem_set("EgDieleTasmota232 POWER1 blink");;\
fhem_set("EgDieleTasmota232 POWER3 blink");;\
fhem_set("EgDieleTasmota232 SelectPage Heizung");;\
set_Exec("off_timer",5,'fhem_set("EgDieleTasmota232 POWER3 off")');;\
} \
}\
\
heizung_status {\
if ([DgNzHeizung118:POWER1] eq "on") {\
set_State("Heizung in Automatik");;\
}\
else {\
if ([$SELF:sperre] eq "on") { \
set_State("Heizung ausgeschaltet, Türen offen");; \
}\
else {\
set_State("Heizung ausgeschaltet");; \
}\
}\
} \
\
}\
\

attr doifHeizung DOIF_Readings sperre:(([EgAbZbDwTS:Reed] + [EgKuZbDwTS:Reed]) > 1 ? "on" : "off")
attr doifHeizung DbLogExclude .*
attr doifHeizung alias DG-Nähzimmer: Heizungsüberwachung
attr doifHeizung devStateStyle style="text-align:left"
attr doifHeizung event-on-change-reading sperre,state
attr doifHeizung group DG: Heizung
attr doifHeizung icon helper_doif
attr doifHeizung room Heizung
attr doifHeizung sortby 12
attr doifHeizung stateFormat [$name:state] ([$name:state:t])

setstate doifHeizung Heizung in Automatik (2022-11-15 15:11:16)
setstate doifHeizung 2022-11-15 15:11:16 Device DgNzHeizung118
setstate doifHeizung 2022-11-15 05:45:00 block_heizung_an executed
setstate doifHeizung 2022-11-15 15:11:16 block_heizung_aus executed
setstate doifHeizung 2022-11-15 15:11:16 block_heizung_status executed
setstate doifHeizung 2022-11-15 15:11:16 e_DgNzHeizung118_POWER1 on
setstate doifHeizung 2022-11-15 07:58:38 e_EgAbZbDwTS_Reed 0
setstate doifHeizung 2022-11-15 07:43:36 e_EgKuZbDwTS_Reed 0
setstate doifHeizung 2022-11-15 07:43:02 e_doifHeizung_sperre off
setstate doifHeizung 2022-11-11 09:30:10 mode enabled
setstate doifHeizung 2022-11-15 07:43:02 sperre off
setstate doifHeizung 2022-11-15 15:11:16 state Heizung in Automatik
setstate doifHeizung 2022-11-15 05:45:00 timer_01_c01 16.11.2022 05:45:00

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)

Mucki

#42
Guten Abend zusammen,

da habt Ihr tolle Vorarbeit  geleistet  :) - dafür herzlichen Dank.  Ich bin auch dabei, mir ein Menü aufzubauen.  Viele Beispiele von Euch konnte ich verwenden. Tatsächlich ist die Dokumentation in Netz sehr knapp gehalten und es gibt auch nur wenige Beispiele. Daher auch von mir ein paar Anregungen und Beispiele aber auch Fragen.

Weil mein ESP32 immer abstürzte, habe ich mir einen mit PSRAM besorgt. Dieser läuft ohne Probleme.

Die erste Seite ist fertig. Die Prognosedaten nehme ich vom Wettermodul Proplanta. Die Icons habe ich auch von Proplanta übernommen, diese ins png-Format umgewandelt und gezippt auf dem ESP32 abgelegt.

Auszug aus der haspmota.jsonl
{"page":1,"comment":"---------- Page 1 Wetter ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#000090","bg_opa":255,"radius":0,"border_side":0,"text":"Wetter","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":  0,"y":36,"w":80,"text":"morgens","align":1,"border_width":0,"border_color":"#888888"}
{"id":20,"obj":"label","x": 80,"y":36,"w":80,"text":"tagsüber","align":1,"border_width":0,"border_color":"#ff0000"}
{"id":30,"obj":"label","x":160,"y":36,"w":80,"text":"abends","align":1,"border_width":0,"border_color":"#888888"}
{"id":40,"obj":"label","x":240,"y":36,"w":80,"text":"nachts","align":1,"border_width":0,"border_color":"#ff0000"}

{"id":11,"obj":"label","x":  0,"y":56,"w":80,"text":"","comment":"sonnig","align":1,"border_width":0,"border_color":"#888888"}
{"id":21,"obj":"label","x": 80,"y":56,"w":80,"text":"","comment":"heiter","align":1,"border_width":0,"border_color":"#ff00ff"}
{"id":31,"obj":"label","x":160,"y":56,"w":80,"text":"","comment":"Regen","align":1,"border_width":0,"border_color":"#888888"}
{"id":41,"obj":"label","x":240,"y":56,"w":80,"text":"","comment":"Schneeschauer","align":1,"border_width":0,"border_color":"#ff00ff"}

{"id":12,"obj":"img","x": 24,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t1.png"}
{"id":22,"obj":"img","x":103,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t2.png"}
{"id":32,"obj":"img","x":182,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t3.png"}
{"id":42,"obj":"img","x":261,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#n1.png"}


{"id": 13,"obj":"label","x": 10,"y":120,"w": 43,"text":"Regen","align":0,"border_width":0,"border_color":"#888888"}
{"id": 23,"obj":"label","x": 53,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"66%"}
{"id": 33,"obj":"label","x": 93,"y":120,"w":  3,"text":"|","align":0,"border_width":0,"border_color":"#888888"}
{"id": 43,"obj":"label","x": 96,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"-12,3°C"}
{"id": 53,"obj":"label","x":136,"y":120,"w":  5,"text":"-","align":1,"border_width":0,"border_color":"#888888"}
{"id": 63,"obj":"label","x":141,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"-15,8°C"}
{"id": 73,"obj":"label","x":180,"y":120,"w": 50,"text":"| Sonne","align":0,"border_width":0,"border_color":"#888888"}
{"id": 83,"obj":"label","x":230,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"2"}
{"id": 93,"obj":"label","x":270,"y":120,"w": 30,"text":"| UV","align":0,"border_width":0,"border_color":"#888888"}
{"id":103,"obj":"label","x":300,"y":120,"w": 20,"text":"","align":0,"border_width":0,"border_color":"#ff0000","comment":"2"}

{"id":14,"obj":"label","x":10,"y":140,"w":30,"text":"","align":0}

{"id":15,"obj":"label","x":10,"y":160,"w":60,"text":"","comment":"1007hpA","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":25,"obj":"label","x":70,"y":160,"w":95,"text":" | rel. Feuchte","align":0,"border_width":0,"border_color":"#888888"}
{"id":35,"obj":"label","x":165,"y":160,"w":40,"text":"","comment":"70%","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":45,"obj":"label","x":205,"y":160,"w":15,"text":"| ","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":55,"obj":"label","x":220,"y":160,"w":90,"text":"","text_color":"#ff0000","align":0,"border_width":0,"border_color":"#ff0000","comment":"Frostgefahr"}

{"id":16,"obj":"label","x": 10,"y":180,"w":40,"text":"Rosen","align":0}
{"id":26,"obj":"label","x": 50,"y":180,"w":55,"text":"","align":1,"comment":"-15,2°C"}
{"id":36,"obj":"label","x":105,"y":180,"w":60,"text":"| Garage","align":0}
{"id":46,"obj":"label","x":162,"y":180,"w":55,"text":"","align":1,"comment":"22,0°C"}
{"id":56,"obj":"label","x":214,"y":180,"w":60,"text":"| Pergola","align":0}
{"id":66,"obj":"label","x":272,"y":180,"w":55,"text":"","align":1,"comment":"14,8°C"}



und aus der autoexec.be
def Wertezuweisen(topic, idx, payload_s,payload_b)
  var logmassage = "MQTT: "
  var loglevel = 4
 
  if topic == "AzTouch/wetter/prognose/morgens" ## Prognose morgens z.B. bedeckt
    laenge(global.p1b11,payload_s)
  elif topic == "AzTouch/wetter/prognose/tags"
    laenge(global.p1b21,payload_s)
  elif topic == "AzTouch/wetter/prognose/abends"
    laenge(global.p1b31,payload_s)
  elif topic == "AzTouch/wetter/prognose/nachts"
    laenge(global.p1b41,payload_s)   

  elif topic == "AzTouch/wetter/prognose/morgens_pic"
    global.p1b12.src = "A:/pics.zip#" + (string.split((string.split(payload_s,"/").item([6]))[0],".").item([0]))[0] + ".png" ## Icon für morgens
    ## das Formatiern der obigen Zeile kann ggf. auch einfacher erledigt werden.
    ## Beispiel: Proplanta liefert unter fc0_weatherDayIcon
    ## "https://www.proplanta.de/wetterdaten/images/symbole/t4.gif"  daraus wird "A:/pics.zip#t4.png
   
  elif topic == "AzTouch/wetter/prognose/tags_pic"
    global.p1b22.src = "A:/pics.zip#" + (string.split((string.split(payload_s,"/").item([6]))[0],".").item([0]))[0] + ".png"
  elif topic == "AzTouch/wetter/prognose/abends_pic"
    global.p1b32.src = "A:/pics.zip#" + (string.split((string.split(payload_s,"/").item([6]))[0],".").item([0]))[0] + ".png"
  elif topic == "AzTouch/wetter/prognose/nachts_pic"
    global.p1b42.src = "A:/pics.zip#" + (string.split((string.split(payload_s,"/").item([6]))[0],".").item([0]))[0] + ".png"
   
     
  elif topic == "AzTouch/wetter/ist/Druck"  ## aktueller Luftdruck
    global.p1b15.text=string.format("%.0fhPa", real(payload_s))
  elif topic == "AzTouch/wetter/ist/hum" ## Luftfeuchtigkeit
    global.p1b35.text=string.format("%.0f%%", real(payload_s))
       
  elif topic == "AzTouch/wetter/prognose/frost"
    if number(payload_s) == 1  ##1 bedeutet Frostgefahr
        global.p1b55.text="Bodenfrost"
        global.p1b45.text="| "
    else
        global.p1b45.text = ""
        global.p1b55.text = ""
    end     
       
    elif topic == "AzTouch/wetter/prognose/RegenTags"
        global.p1b23.text = string.format("%.0f%%", real(payload_s))
    elif topic == "AzTouch/wetter/prognose/TempMin"
        global.p1b43.text = string.format("%.0f°C", real(payload_s))
   elif topic == "AzTouch/wetter/prognose/TempMax"
        global.p1b63.text = string.format("%.0f°C", real(payload_s))
      elif topic == "AzTouch/wetter/prognose/sun"
        global.p1b83.text = string.format("%.0f%%", real(payload_s))
    elif topic == "AzTouch/wetter/prognose/uv"
        global.p1b103.text = payload_s
        if number(payload_s) >= 6  ##UV Index hoch - extrem hoch, in roter Schrift anzeigen
            global.p1b103.text_color = "#ff0000"
        else
            global.p1b103.text_color = "#ffffff"
        end   
  elif topic == "AzTouch/wetter/ist/Rosen" ## Temperatursensor im Garten
    global.p1b26.text=string.format("%.1f°C", real(payload_s))
  elif topic == "AzTouch/wetter/ist/Garage"
    global.p1b46.text=string.format("%.1f°C", real(payload_s))
  elif topic == "AzTouch/wetter/ist/Pergola"
    global.p1b66.text=string.format("%.1f°C", real(payload_s))

end


Lange habe ich gebraucht zu verstehen, wie über die Berry Console dynamisch neue Elemente eingefügt werden können. Daher ein Beispiel für den Befehl haspmota.parse(<json>)
haspmota.parse ('{"page":6,"id":20,"obj":"label","x":20,"y":160,"w":180,"text":"I was here","align":1}')


Noch nicht verstanden habe ich, wie die Haspmota Klassen btnmatrix und dropdown zu verwenden sind.

Bei btnmatrix werden immer 5 Schaltflächen erzeugt und diese als Btn1, Btn2, ... benannt. Mir fehlt noch der Bezeichner für das Attribut mit dem die Knöpfe definiert und benannt werden können.
Bei OpenHasp ist der Bezeichner options (https://www.openhasp.com/0.6.3/design/objects/#button-matrix). Dieses Attribut kennt haspmota aber nicht. Bei lvgl bin ich auch nicht fündig geworden.
{"page":1,"id":20,"obj":"btnmatrix","x":10,"y":10,"w":220,"h":150,"options":["eins","zwei","\n","drei"]}

Dropdowns kann ich erzeugen, aber ich habe noch nicht rausgefunden, wie die einzelnen Elemente formatiert werden können. Vielleich kennt jemand die entsprechenden Attribute.
{"id":10,"obj":"dropdown","x":20,"y":30,"w":290,"show_selected":"true","text_font":"montserrat-14","bg_opa":255,"val":0,"val_rule":"val","direction":0,"options":"eins\nzwei\ndrei\nvier\nfuenf\nsechs\nsienben"}



WW

Zitat von: Mucki am 23 November 2022, 22:48:39
... Ich bin auch dabei, mir ein Menü aufzubauen.  ...

Hallo Mucki,
dein Beitrag bringt mich wieder ein ganzes Stück weiter. Die Wetterseite ist toll. Das mit den Images war mir so noch nicht klar. Ich würde sie gerne übernehmen. Um mir die Arbeit ein wenig einfacher zu machen, bitte ich dich um die Vervollständigung deiner Infos:

  • den kompletten Teil der "autoexec.be" (z.B. Funktion "laenge") und der "haspmota.jsonl" (falls nicht schon komplett)
  • der zip-Datei mit den umgewandelten Images.
  • ein list des entsprechenden FHEM-Devices (vermutlich das Proplanta-Device), aus dem ersichtlich ist, welche Topics wie erstellt werden.

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)

Mucki

Hallo Willi,

mit der Funktion laenge wird die Schriftgröße verkleinert, wenn im auszugebenen Text die Anzahl der Zeichen >= 11 ist. Außerdem wird der Text um zwei Pixel nach unten versetzt. Dann sieht es besser aus.
Die mqtt-Zuweisung ist auch enthalten.

def laenge (i,payload_s)
    i.text = payload_s 
    if size(payload_s) >= 11
        i.text_font = 12 ##Schriftgröße 12
        i.y = 58  ##zwei Pixel tiefer
    else
        i.text_font = 16
        i.y = 56
    end   
end

def subscribes()
  import mqtt
  mqtt.subscribe("AzTouch/#", Wertezuweisen)
end

tasmota.add_rule("MQTT#Connected=1", subscribes)


Das FHEM-Device ist das Proplanta-Device. Hier musst Du nur Deinen Standort eintragen. Im Beispiel habe ich Hamburg eingetragen. Steht aber auch im Hilfetext. retain = 1 ist wichtig, damit das Display sofort nach Einschalten die Daten per mqtt geschickt bekommt und nicht warten muss, bis die Proplanta-Daten aktualisiert werden.

defmod Wetter PROPLANTA Hamburg de
attr Wetter MQTT2Defaults retain
attr Wetter MQTT2Publish fc0_weatherMorning:topic=AzTouch/wetter/prognose/morgens \
fc0_weatherMorningIcon:topic=AzTouch/wetter/prognose/morgens_pic \
fc0_weatherDay:topic=AzTouch/wetter/prognose/tags \
fc0_weatherDayIcon:topic=AzTouch/wetter/prognose/tags_pic \
fc0_weatherEvening:topic=AzTouch/wetter/prognose/abends \
fc0_weatherEveningIcon:topic=AzTouch/wetter/prognose/abends_pic \
fc0_weatherNight:topic=AzTouch/wetter/prognose/nachts \
fc0_weatherNightIcon:topic=AzTouch/wetter/prognose/nachts_pic \
fc0_uv:topic=AzTouch/wetter/prognose/uv \
fc0_sun:topic=AzTouch/wetter/prognose/sun \
fc0_frost:topic=AzTouch/wetter/prognose/frost \
fc0_tempMin:topic=AzTouch/wetter/prognose/TempMin \
fc0_tempMax:topic=AzTouch/wetter/prognose/TempMax \
fc0_chOfRainDay:topic=AzTouch/wetter/prognose/RegenTags \
*:retain=1
attr Wetter forecastDays 4
attr Wetter room 2.2_Umwelt_Aussen


Wie gewünscht hier noch einmal die Seiten 0 und 1 aus der pages.jsonl
{"page":0,"comment":"---------- Upper stat line ----------"}
{"id":0,"text_color":"#FFFFFF"}


{"id":15,"obj":"lv_wifi_arcs","x":291,"y":3,"w":29,"h":22,"radius":0,"border_side":0,"bg_color":"#FF0000","line_color":"#FFFFFF"}
{"id":16,"obj":"lv_clock","x":232,"y":6,"w":55,"h":16,"radius":0,"border_side":0}

{"comment":"---------- Bottom buttons - prev/home/next ----------"}
{"id":101,"obj":"btn","x":20,"y":200,"w":80,"h":30,"action":"prev","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF053","text_font":"montserrat-20"}
{"id":102,"obj":"btn","x":120,"y":200,"w":80,"h":30,"action":"back","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF015","text_font":"montserrat-20"}
{"id":103,"obj":"btn","x":220,"y":200,"w":80,"h":30,"action":"next","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF054","text_font":"montserrat-20"}

{"page":1,"comment":"---------- Page 1 Wetter ----------"}
{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"}
{"id":1,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":30,"bg_color":"#000090","bg_opa":255,"radius":0,"border_side":0,"text":"Wetter","text_font":"montserrat-28"}

{"id":10,"obj":"label","x":  0,"y":36,"w":80,"text":"morgens","align":1,"border_width":0,"border_color":"#888888"}
{"id":20,"obj":"label","x": 80,"y":36,"w":80,"text":"tagsüber","align":1,"border_width":0,"border_color":"#ff0000"}
{"id":30,"obj":"label","x":160,"y":36,"w":80,"text":"abends","align":1,"border_width":0,"border_color":"#888888"}
{"id":40,"obj":"label","x":240,"y":36,"w":80,"text":"nachts","align":1,"border_width":0,"border_color":"#ff0000"}

{"id":11,"obj":"label","x":  0,"y":56,"w":80,"text":"","comment":"sonnig","align":1,"border_width":0,"border_color":"#888888"}
{"id":21,"obj":"label","x": 80,"y":56,"w":80,"text":"","comment":"heiter","align":1,"border_width":0,"border_color":"#ff00ff"}
{"id":31,"obj":"label","x":160,"y":56,"w":80,"text":"","comment":"Regen","align":1,"border_width":0,"border_color":"#888888"}
{"id":41,"obj":"label","x":240,"y":56,"w":80,"text":"","comment":"Schneeschauer","align":1,"border_width":0,"border_color":"#ff00ff"}

{"id":12,"obj":"img","x": 24,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t1.png"}
{"id":22,"obj":"img","x":103,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t2.png"}
{"id":32,"obj":"img","x":182,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#t3.png"}
{"id":42,"obj":"img","x":261,"y":82,"w":35,"h":30,"comment":"A:/pics.zip#n1.png"}

{"id":  13,"obj":"label","x":  10,"y":120,"w": 43,"text":"Regen", "align":0,"border_width":0,"border_color":"#888888"}
{"id":  23,"obj":"label","x":  53,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"66%"}
{"id":  33,"obj":"label","x":  93,"y":120,"w":   3,"text":"|","align":0,"border_width":0,"border_color":"#888888"}
{"id":  43,"obj":"label","x":  96,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"-12,3°C"}
{"id":  53,"obj":"label","x":136,"y":120,"w":   5,"text":"-","align":1,"border_width":0,"border_color":"#888888"}
{"id":  63,"obj":"label","x":141,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"-15,8°C"}
{"id":  73,"obj":"label","x":180,"y":120,"w": 50,"text":"| Sonne","align":0,"border_width":0,"border_color":"#888888"}
{"id":  83,"obj":"label","x":230,"y":120,"w": 40,"text":"","align":1,"border_width":0,"border_color":"#ff0000","comment":"2"}
{"id":  93,"obj":"label","x":270,"y":120,"w": 30,"text":"| UV","align":0,"border_width":0,"border_color":"#888888"}
{"id":103,"obj":"label","x":300,"y":120,"w": 20,"text":"","align":0,"border_width":0,"border_color":"#ff0000","comment":"2"}

{"id":14,"obj":"label","x":10,"y":140,"w":30,"text":"","align":0}

{"id":15,"obj":"label","x":10,"y":160,"w":60,"text":"","comment":"1007hpA","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":25,"obj":"label","x":70,"y":160,"w":95,"text":" | rel. Feuchte","align":0,"border_width":0,"border_color":"#888888"}
{"id":35,"obj":"label","x":165,"y":160,"w":40,"text":"","comment":"70%","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":45,"obj":"label","x":205,"y":160,"w":15,"text":"| ","align":0,"border_width":0,"border_color":"#ff0000"}
{"id":55,"obj":"label","x":220,"y":160,"w":90,"text":"","text_color":"#ff0000","align":0,"border_width":0,"border_color":"#ff0000","comment":"Frostgefahr"}

{"id":16,"obj":"label","x": 10,"y":180,"w":40,"text":"Rosen","align":0}
{"id":26,"obj":"label","x": 50,"y":180,"w":55,"text":"","align":1,"comment":"-15,2°C"}
{"id":36,"obj":"label","x":105,"y":180,"w":60,"text":"| Garage","align":0}
{"id":46,"obj":"label","x":162,"y":180,"w":55,"text":"","align":1,"comment":"22,0°C"}
{"id":56,"obj":"label","x":214,"y":180,"w":60,"text":"| Pergola","align":0}
{"id":66,"obj":"label","x":272,"y":180,"w":55,"text":"","align":1,"comment":"14,8°C"}



Viel Spaß, Erfolg und lG
Mucki

WW

Zitat von: Mucki am 29 November 2022, 13:20:23
Hallo Willi,

mit der Funktion laenge ...

Danke für die Info, werde es ausprobieren.

Wie hast du die zip-Datei mit den Images erstellt? Wie müssen die aussehen? Oder kannst du die Datei noch zur Verfügung stellen?

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)

Mucki

#46
Hallo Willi,

guckst Du in meinen letzten Beitrag  8)

LG
Mucki

Lars721

#47
Hallo und Danke an alle, die das AZ Touch Display durch HaspMota zum "Leben erweckt" haben.

Ich habe mein Display hauptsächlich mit dem Code von AndyM zum Laufen gebracht.

Die folgende Funktion zum Anzeigen der Prozessor Temperatur verstehe ich aber nicht und bei mir wird auch kein Wert angezeigt.
{"id":10,"obj":"label","x":20,"y":35,"w":280,"text":"Temperatur","align":0,"text_rule":"ESP32#Temperature","text_rule_format":"Temperatur: %2.1f °C","text_rule_formula":"val"}
Woher kommt dieser Wert aus der Rule "ESP32#Temperature" ?
Muss dazu nicht auch noch eine Rule mit diesem Namen in der Autoexec.be Datei eingefügt werden?

Desweiteren möchte ich bei dem Slider zum Dimmen der LCD auch den aktuellen Dimmwert (Channel1) zur Laufzeit auslesen und den Wert des Sliders (val) auf diesen setzen.
{"id":50,"obj":"slider","x":20,"y":60,"w":280,"h":30,"bg_color":"#D00000","radius":10,"border_side":1,"min":0,"max":100,"val":xxx,"val_rule":"Channel1"}
Wie komme ich an den aktuellen Wert und wie müsste eine Funtion (in der Autoexce.be? Datei) aussehen, um an den Wert zu kommen?

Vielen Dank für eure Hilfe
FHEM 5.7 auf Raspberry Pi 2 B

Lars721

Meine erste Frage mit der CPU Temperatur kann ich jetzt selbst beantworten.
In der Tasmota Konsole muss man die Anzeige der Temperatur erst aktivieren.
Zumindest war es bei mir inaktiv.

Enable display of ESP32 internal temperature with SetOption146 1
{"Time":"2021-01-01T00:00:00","ESP32":{"Temperature":41.7},"TempUnit":"C"}
FHEM 5.7 auf Raspberry Pi 2 B

Lars721

Hallo zusammen,

ich möchte hier noch mal darauf hinweisen, dass für das AZ-Mod Touch Display unbedingt ein Prozessor mit PSRAM benutzt werden muss, wenn man HASPmota darauf betreiben möchte und das Programm nicht ständig abstürzt.

Eine Antwort auf die darauf folgende Frage, woher man nun ein passendes Board mit einem Prozessor bekommt, der auch einen PSRAM Speicher hat und wie überhaupt so ein Board heißt, konnte ich bislang nicht finden.

Hier dazu meine Antworten:
- Man benötigt einen ESP32 Prozesser, der sich Wrover nennt. (Nicht zu verwechseln mit Wroom!!)
- Ein passendes Board mit so einem Prozessor wird beim Hersteller Espressif "ESP32-DevKitC-VE" genannt
- So ein Board gibt es nicht bei AZ-Delivery, der die AZ-Touch Displays verkauft und auch nicht bei Reichelt und nicht bei Conrad Electronic.
- Im Prinzip gibt es das Board nur direkt aus China oder USA (über Amazon, ...)
- Damit die Lieferung etwas schneller geht, habe ich mein Board bei Mouser Electronics bestellt. Die Versandkosten sind wegen der Express Lieferung allerdings etwas hoch. Die Lieferung kommt allerdings auch nicht aus Deutschland, sondern aus den USA

Und nicht wundern: Falls man eine CPU mit 8 MB PSRAM bestellt, werden bei Tasmota immer nur maximal 4 MB vom PSRAM verwendet.
FHEM 5.7 auf Raspberry Pi 2 B

BassT

#50
Zitat von: WW am 23 März 2022, 14:32:02Ich 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":

Hi Willi, ich bin auch gerade dabei meine 3 neuen AZ-Touch zu programmieren.
Die Vorlagen von euch sind dafür extrem hilfreich, am anfang ;)

Leider habe ich ein Problem mit dem PIR. Habe diesen an 3,3/GND/GPIO32 angelötet (die vorgesehenen - Beschrifteten Löcher auf der Platine).
Habe in der Conig den 32 auf Switch und den 33 auf Relais gestellt (Habe schon mehrere AM312 auf D1 mini Verbaut). Leider steht das Signal immer auf "ON".
selbst wenn ich GPIO25/26 auf Switch/Relais setze - wo nichts angelötet ist, ist auch immer auf "ON".

Hat jemand eine Idee, wo das Problem sein könnte - habe bisher nocht nicht den PIR als Fehlerquelle ausschließen können.

Grüße

Zitat von: Lars721 am 09 Januar 2023, 18:31:07- Man benötigt einen ESP32 Prozesser, der sich Wrover nennt. (Nicht zu verwechseln mit Wroom!!)

Gilt natürlich nur bei Verwendung von HASPmota!
Ein ESP32-S3 (Wroom) geht auch. Habe gerade welche über ebay gekauft. Ist tatsächlich nicht so einfach Boards zu finden mit PSRAM.
!!! Bitte aber immer auf die Pin Belegung beim einbau achten!!! Die Pins sind kein Standart :(

Bisher muss ich noch mit meinen ESP32-S (Dev Kit C v4) vorlieb nehmen. Dabei schmiert aber immer wieder Tasmota ab und ich muss komplett neu flashen um ihn wieder zum leben zu erwecken.

EDIT:
Habe mich jetzt nochmal an das Board gesetzt. An GPIO34 funktioniert der PIR wunderbar :)

EDIT:
So, mal wieder ein kleines Update:
Habe meine ESP32-S3 N16R8 Board erhalten, geflashed und verdrahtet. Funktioniert prächtig. Die Tage ist dann jetzt die richtige Programmierung dran ;)
Hier ein Bild der verdrahtung:
Du darfst diesen Dateianhang nicht ansehen.
Und hier das Mapping in Tasmota:
Du darfst diesen Dateianhang nicht ansehen.

yetti

Erstmal danke für die bisher geleistete Arbeit.

Ich habe einen ESP32-DevKitC-VE und ein AZ-Touch-Mod Version 01-03 mit 2,8inch TFT.

Das Display funktioniert, doch der Touch reagiert nicht mit den hier aufgezeigten Werten.
Ich glaube ich habe alle Kombinationen von Template und display.ini durch.
Mit openHasp funktioniert der Touch, also kann der Touch nicht defekt sein, muss also eine Einstellung sein.

Ich würde gerne Tasmota nutzen, Tasmota Version ist: 13.2.0(lvgl-haspmota)

Kann mir bitte jemand das Template und die display.ini hier posten. Danke



WW

Zitat von: yetti am 09 Dezember 2023, 14:14:55...
Kann mir bitte jemand das Template und die display.ini hier posten. Danke


Ich benutze die Version "12.3.1(lvgl-haspmota)". Mit späteren Versionen hatte ich Probleme.

Hier das Template:
{"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}
und die display.ini:
:H,ILI9341,320,240,16,SPI,1,*,*,*,*,*,*,*,40
:S,2,1,1,0,40,20
:I
EF,3,03,80,02
CF,3,00,C1,30
ED,4,64,03,12,81
E8,3,85,00,78
CB,5,39,2C,00,34,02
F7,1,20
EA,2,00,00
C0,1,23
C1,1,10
C5,2,3e,28
C7,1,86
36,1,48
37,1,00
3A,1,55
B1,2,00,18
B6,3,08,82,27
F2,1,00
26,1,01
E0,0F,0F,31,2B,0C,0E,08,4E,F1,37,07,10,03,0E,09,00
E1,0F,00,0E,14,03,11,07,31,C1,48,08,0F,0C,31,36,0F
11,80
29,80
:o,28
:O,29
:A,2A,2B,2C
:R,36
:0,28,00,00,05
:1,88,00,00,01
:2,E8,00,00,02
:3,48,00,00,03
:i,20,21
:TS,*
:M,3946,401,241,3828
#

Und zur Info:
ESP32 AZ-Touch
EgDieleTasmota232 (AZ-Touch)
Program Version    12.3.1(lvgl-haspmota)
Build Date & Time    2023-06-21T20:31:53
Core/SDK Version    2_0_5_3/v4.4.3
Uptime    37T12:51:00
Flash Write Count    29329
Boot Count    22
Restart Reason    RTC Watch dog reset digital core and rtc module
Friendly Name 1    EgDieleTasmota232 (AZ-Touch-LED)
Friendly Name 2    EgDieleTasmota232 (AZ-Touch-Display)
Friendly Name 3    EgDieleTasmota232 (AZ-Touch-Piezo)
Friendly Name 4    EgDieleTasmota232 (AZ-Touch)
    
AP1 SSId (RSSI)    WW-Router-2 (100%, -41 dBm) 11n
Hostname    Tasmota232
MAC Address    C4:DE:E2:C7:27:58
IP Address (wifi)    192.168.1.232
Gateway    192.168.1.1
Subnet Mask    255.255.255.0
DNS Server1    192.168.1.1
DNS Server2    0.0.0.0
    
HTTP API    Enabled
    
MQTT Host    192.168.1.7
MQTT Port    1883
MQTT TLS    Disabled
MQTT User    DVES_USER
MQTT Client    DVES_C72758
MQTT Topic    tasmota232
MQTT Group Topic 1    cmnd/tasmotas/
MQTT Full Topic    cmnd/tasmota232/
MQTT Fallback Topic    cmnd/DVES_C72758_fb/
MQTT No Retain    Disabled
    
ESP Chip Id    13051736 (ESP32-D0WD-V3 rev.3)
Flash Chip Id    0x174020 (DIO)
Flash Size    8192 KB
Program Flash Size    8192 KB
Program Size    2065 KB
Free Program Space    814 KB
Free Memory    78.2 KB (frag. 7%)
PS-RAM Memory    4075 KB
PS-RAM free Memory    3945 KB
    
Partition safeboot    832 KB (used 95%)
Partition app0*    2880 KB (used 71%)
Partition fs    4416 KB

Tasmota 12.3.1 by Theo Arends
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)

yetti

Das war die Version

Da kann ich ja lange probieren.

Danke für den Tip.

Grüße zurück
Jürgen

[quote author=WW link=msg=1296383 date=1702150179]

Ich benutze die Version "12.3.1(lvgl-haspmota)". Mit späteren Versionen hatte ich Probleme.


Tasmota 12.3.1 by Theo Arends
MfG Willi


[/quote]

yetti

Für die Calibrierung des Touch ist folgendes zu empfehlen:

https://tasmota.github.io/docs/Tasmota-Application/#display-calibration

Damit wird in der display.ini die Zeile M: für den Touch angepasst.


Den OpenHasp Designer könnte ebenfalls für andere noch Interessant sein, um erstmal ein Grundgerüst zu bauen.

https://github.com/HASwitchPlate/openHASP/discussions/479

https://github.com/mvturnho/OpenHaspDesigner


RappaSan

Bei mir wird die Version 12.4.0 angezeigt. Ein update über Tasmota funktioniert allerdings nicht, so daß die neueste Version nicht verfügbar ist.
Warum das so ist, ist mir allerdings nicht klar.