Button Farbe entsprechend GPIO Input ändern ?

Begonnen von jumperger, 26 Oktober 2019, 17:48:25

Vorheriges Thema - Nächstes Thema

jumperger

Hallo,
ich habe einen Button angelegt welcher ein Relais schaltet.
Das funktioniert perfekt.
Das besagte Relais hat eine StatusLED, diese lese ich über GPIO 22 aus.
Nun wollte ich meinen Button orange einfärben wenn die StatusLED leuchtet.
Das lesen des GPIO ist folgendermassen definiert:

defmod GPIO_IN_22 RPI_GPIO 22
attr GPIO_IN_22 active_low yes
attr GPIO_IN_22 debounce_in_ms 20
attr GPIO_IN_22 direction input
attr GPIO_IN_22 interrupt both
attr GPIO_IN_22 pud_resistor up
attr GPIO_IN_22 room E1_Buro


STATE wird als ,,on" oder ,,off" gemeldet.

Der Button im FTUI ist folgendermassen definiert:
<div data-type="button" data-device="Licht_Buro_Taster_DOIF" data-states='["M26_L1-2_On_Off"]' data-set-states='["M26_L1-2_On_Off"]' class=""></div>

Ich habe jetzt versucht mit data-get und data-color die Farbe vom button entsprechend der Ausgabe von GPIO_IN_22 zu ändern.
Leider ohne Erfolg.

Kann jemand mir auf die Sprünge helfen in welche Richtung ich suchen muss?

Danke für eure Hilfe.

jumperger

Mit folgendem Code kann ich die Farben eines nicht schaltenden Buttons anpassen an den Zustand meines Relais.
<div data-type="button" data-device="GPIO_IN_22" data-get-on='["on","off"]' data-icons='["fa-lightbulb-o","fa-lightbulb-o"]' data-colors='["orange","white"]' class=""></div>

Nach einschalten des Lichts (Relais) und anschliessendem Refresh der ftui wechselt der Lightbulb die Farbe.

Aber wie bekomme ich das in meinen Button der auch zum Schalten dient?

Prof. Dr. Peter Henning

Steht alles auf der Wiki-Seite des entsprechenden Widgets. Einfach lesen und verwenden.

LG

pah

jumperger


jumperger

#4
Lese mich in die ,,Push" Wiki ein.


data-on-color Feste Iconfarbe für den Zustand ON, oder <device>:<reading>, um einen entsprechenden Wert dynamisch aus FHEM abzurufen. #aa6900

kann jemand mir sagen wie die Syntax des Attributs ist?

data-on-color="GPIO_IN:STATE"
vielleicht und wo kommt der Farbcode hin?

Prof. Dr. Peter Henning

 ::) ::)

Zitatbutton: Variante der push und switch Widgets, die entweder einen URL ansteuern oder einen FHEM-Befehl absetzen kann

Einfach lesen, was für Attribute diese haben.

LG

pah

bartman121

#6
Ich bin kein Profi, ich bezweifel aber, dass es funktioniert. Da hier das zu schaltende DEVICE und das "signalisierende" DEVICE unterschiedlich sind.

Du müsstest erstmal im schaltenden DEVICE noch ein Reading erzeugen, das den Zustand des jeweiligen GPIO-In hat.

Dann kannst du mit Data-get dieses Reading auswerten.

Am besten du machst ein notify auf GPIO-IN welches mittels "setreading" im schaltenden DEVICE ein Reading setzt.

Grüße

Andreas

jumperger

#7
Das ist doch mal ein Antwort, vielen Dank. Ich lese mich also in die Richtung ein.
Die Geschichte mit den 2 verschiedenen Devices war mir irgendwie klar aber ich wusste nicht wie man dies umgehen kann.
Das reading im schaltenden Device, muss ich das neu « erfinden » oder gibt es da vordefinierte Sachen welche ich auswählen kann?
Bzw. wird das mit userReading gemacht?

bartman121

#8
Also ich würde das userreading "gpio_response_22" nennen.

Du kannst mittels "setreading DEVICE gpio_response_22 on" das Reading in "DEVICE" auf on setzen.

Ich bin kein erfahrener User der Dir notify mit dem richtigen regexp sicher hinschreiben kann ohne das zu testen.

Aber das hier wäre ein Versuch:
defmod n_gpio_in_22 notify GPIO_IN_22:.* { fhem("setreading DEVICE gpio_response_22 $EVENT");;}
DEVICE musst du durch den Namen deines schaltenden DEVICES ersetzen.



Prof. Dr. Peter Henning

#9
ZitatIch bin kein Profi, ich bezweifel aber, dass es funktioniert. Da hier das zu schaltende DEVICE und das "signalisierende" DEVICE unterschiedlich sind.
Stimmt nicht - mit dem Attribut "data-set" können beliebige FHEM-Befehle übermittelt werden, und mit dem Attribut "data-warn" kann man das Aussehen an ein beliebiges Reading anpassen.

All das lernt man, wenn man die Dokumentation https://wiki.fhem.de/wiki/FTUI_Widget_Switch sorgfältig liest - man muss es nur tun.

LG

pah

bartman121

Also ich habe die Doku jetzt mehrfach gelesen, ich sehe die Möglichkeit nicht, wie man "zwei unterschiedliche Geräte" in einem Widget benutzen kann.

Aber vielleicht kannst du ja mal ein Beispiel dafür geben.

Prof. Dr. Peter Henning

#11
::) ::) Leute, es steht doch wirklich schwarz auf weiß da...


Das Switch-Widget kennt als Haupt-Device dasjenige, welche die Anzeige enthält. Mit einem Klick darauf wird aber ein beliebiges anderes Device geschaltet, so wie hier beschrieben: https://wiki.fhem.de/wiki/FHEM_Tablet_UI#JavaScript-Funktionen.

Zeile 3 und 4 DIESER Tabelle https://wiki.fhem.de/wiki/FTUI_Widget_Switch#Standard-Attribute adressieren dann ein Reading, das nur als User-Reading im Haupt-Device existiert. Im Zweifelsfall kann man darauf auch mit einem notify triggern.

Und die Farbe kann noch durch ein drittes Device bestimmt werden, Zeile 5-8 DIESER Tabelle: https://wiki.fhem.de/wiki/FTUI_Widget_Switch#Attribute_f.C3.BCr_mehrere_Zust.C3.A4nde

LG

pah

jumperger

Besagte Tabelle habe ich weiter oben zitiert und um Erklärung gebeten wie sie zu verstehen ist.
Weshalb sind z.B. verschiedene Begriffe fett gedruckt.
Wie ist z.B. <device>:<reading> in konkrete Syntax umzusetzen? wo kommen = oder ' oder '' hin ?

Ich habe ein device vom Type RPI_GPIO namen GPIO_IN_22 welches als STATE , ON oder OFF hat
wie können die denn nun in dem Attribut data-on-color des devices Taster_DOIF eingesetzt werden?

Prof. Dr. Peter Henning


jumperger

#14
Ich geb nicht so schnell auf.

Mit dem "darstellenden" Device (GPIO_IN_22) welches das "schaltende" Device (Licht_Buro_Taster_DOIF) schaltet habe ich es nun hingekriegt, dass der Button des Tablet-UI sich anhand des Zustandes meines Relais einfärbt.
Danke pah.
Code (Auszug aus der index.html von FTUI) Auswählen
<div data-type="button" data-device="GPIO_IN_22" data-get-on='["on","off"]' data-background-colors='["orange","#535353"]' onclick="ftui.setFhemStatus('set Licht_Buro_Taster_DOIF M26_L1-2_On_Off')" class=""></div>
Die Info zum "onclick" war leider nirgends in der wiki/FTUI_Widget_Switch zu finden nicht bei hoch runter und quer lesen. Aber Danke für den Tip , er hat zum Ziel geführt.

Gerne würde ich auch die beiden anderen Möglichkeiten verstehen um mich mehr in Fhem einzuarbeiten.
Es gelang mir ein userReading (gpio_response_22) im "schaltenden"Device (Licht_Buro_Taster_DOIF) zu erstellen.
Ebenfalls habe ich mein erstes Notify erstellt (n_gpio_in_22) welches anhand vom reading des GPIO_IN_22 das userReading des Licht_Buro_Taster_DOIF schreibt. Danke Andreas.

In FTUI gelingt es mir aber leider nicht mit data-set und data-cmd mein Ziel zu erreichen , das gleiche gilt für den Tipp zur Tabelle mit data-on-color ...

Als Info hier die DEFs der 3 betroffenen Geräte:

Code (Relais mittels Schaltimpuls Ein/Ausschalten läuft über MCP23017) Auswählen
defmod Licht_Buro_Taster_DOIF DOIF (xyz) (set OUT_1 PortB5 on)(set OUT_1 PortB5 off)
attr Licht_Buro_Taster_DOIF cmdState M26_L1-2_On_Off
attr Licht_Buro_Taster_DOIF do always
attr Licht_Buro_Taster_DOIF room E1_Buro
attr Licht_Buro_Taster_DOIF userReadings gpio_response_22
attr Licht_Buro_Taster_DOIF wait 0,0.3
attr Licht_Buro_Taster_DOIF webCmd M26_L1-2_On_Off

setstate Licht_Buro_Taster_DOIF M26_L1-2_On_Off
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 cmd 1.2
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 cmd_event set_M26_L1-2_On_Off_cmd_1
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 cmd_nr 1
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 cmd_seqnr 2
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:20:42 gpio_response_22 on
setstate Licht_Buro_Taster_DOIF 2019-10-10 21:25:13 mode enabled
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 state M26_L1-2_On_Off
setstate Licht_Buro_Taster_DOIF 2019-11-03 19:01:36 wait_timer no timer


Code (Relais Schaltzustand per GPIO 22 lesen) Auswählen
defmod GPIO_IN_22 RPI_GPIO 22
attr GPIO_IN_22 active_low yes
attr GPIO_IN_22 debounce_in_ms 20
attr GPIO_IN_22 direction input
attr GPIO_IN_22 interrupt both
attr GPIO_IN_22 pud_resistor up
attr GPIO_IN_22 room E1_Buro

setstate GPIO_IN_22 on
setstate GPIO_IN_22 2019-11-03 19:01:34 Dblclick off
setstate GPIO_IN_22 2019-11-03 19:20:43 Longpress on
setstate GPIO_IN_22 2019-11-03 19:22:40 Pinlevel high
setstate GPIO_IN_22 2019-11-03 19:20:42 state on


Code (Notify um das userReading von Licht_Buro_Taster_DOIF anhand des State von GPIO_IN_22 zu setzen) Auswählen
defmod n_gpio_in_22 notify GPIO_IN_22:(on|off) { fhem("setreading Licht_Buro_Taster_DOIF gpio_response_22 $EVENT")}
attr n_gpio_in_22 room E1_Buro

setstate n_gpio_in_22 2019-11-03 19:31:21
setstate n_gpio_in_22 2019-11-03 19:01:26 state active