AZ-Touch 2.8" unter Tasmota betreiben

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

Vorheriges Thema - Nächstes Thema

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