Fenstersymbol mit Anzahl offener Fenster als Kreis

Begonnen von zap, 31 Januar 2016, 15:10:17

Vorheriges Thema - Nächstes Thema

zap

Ich würde gerne ein Fenstersymbol darstellen, das die Anzahl der offenen Fenster als Kreis in der rechten oberen Ecke darstellt. Wie lässt sich das in FTUI umsetzen? Ich habe schon in einigen Screenshots gesehen, dass das möglich ist.

Die Anzahl der offenen Fenster sowie den Gesamtstatus habe ich in einem Dummy Device in 2 Readings stehen:

STATE = "open" oder "closed", je nachdem, ob mindestens 1 Fenster offen ist
COUNT_OPEN = Anzahl der offenen Fenster

2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

roman1528

#1
Zitat von: zap am 31 Januar 2016, 15:10:17
Ich würde gerne ein Fenstersymbol darstellen, das die Anzahl der offenen Fenster als Kreis in der rechten oberen Ecke darstellt. Wie lässt sich das in FTUI umsetzen? Ich habe schon in einigen Screenshots gesehen, dass das möglich ist.

Die Anzahl der offenen Fenster sowie den Gesamtstatus habe ich in einem Dummy Device in 2 Readings stehen:

STATE = "open" oder "closed", je nachdem, ob mindestens 1 Fenster offen ist
COUNT_OPEN = Anzahl der offenen Fenster

Moin.

Es würde reichen wenn dein Dummy die Anzahl der offenen Fenster erfasst. Weil bei "0" keine Fenster offen sind.
Also: STATE 5
oder: STATE 0


<div data-type="symbol"
        data-device="DUMMY"
        data-states='["0","^[01]$","^[1-9][0-9]|[2-9]$"]'
        data-icons='["ftui-window","ftui-window warn","ftui-window warn"]'
        data-colors='["#505050","#aa6900","#aa6900"]'
        data-icon="ftui-window" <!-- Das füge ich immer mit ein falls es zu Problemen kommt.-->
</div>


Viel Spaß beim testen :)

Grüße^^

EDIT

Oder du lässt dein Dummy so und liest nur "COUNT_OPEN" aus:


<div data-type="symbol"
        data-device="DUMMY"
        data-get="COUNT_OPEN"
        data-states='["0","^[01]$","^[1-9][0-9]|[2-9]$"]'
        data-icons='["ftui-window","ftui-window warn","ftui-window warn"]'
        data-colors='["#505050","#aa6900","#aa6900"]'
        data-icon="ftui-window" <!-- Das füge ich immer mit ein falls es zu Problemen kommt.-->
</div>
i3-10305T 4x3GHz;8GB RAM;250GB & 1TB NVMe:
FHEM 6.2;FTUI;8" Tablet's+Fully;NsPanelPro;HUE;ESPRGBWW;HM(CCU3);Duofern; ASC;MQTT(Tasmota);netatmo;SONOS;eBus;DbLog;XiaomiDevice;NUT;ModbusAttr

RPi3+: FHEM 6.2;I²C;GPIO;RFID;G-Tag;XiaomiBTLESens
RPi3: FHEM 6.2;DIY Relais-Board;I²C;GPIO;RFID;Photovoltaik

chris1284

wie errechnet ihr für den dummy die anzahl offener fenster?

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

choenig

Hi zap,

ich mach das wie folgt:

Einen Dummy zum nachhalten des Status:

defmod dummy_OffeneFenster dummy
attr dummy_OffeneFenster stateFormat openWindowsCount


Ein DOIF zum Ausführen der der Funktion aus 99_MyUtils.pm:

defmod doif__winOpen.StartStop DOIF ([".*:(open|tilted|closed)$"]) ({winOpenStartStop("$DEVICE", "$EVENT")})
attr doif__winOpen.StartStop do always


Eine Function in 99_MyUtils.pm:

sub winOpenStartStop($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
   
    #Der dummy der verwendet wird, um die offenen Fenster/Tueren nachzuhalten
    my $dummy = 'dummy_OffeneFenster';
   
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Ff]enster|Tuer/ && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-SEC-RHS')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openWindows = ReadingsVal($dummy, 'openWindows', '');
            my @parts;
            @parts = split(/,/, $openWindows) if ($openWindows ne '-');

            # wenn das aktuelle Fenster noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open' || $event eq 'tilted') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openWindowsCount = scalar(@parts);
            if ($openWindowsCount > 0) { $openWindows = join(',', @parts); }
            else                       { $openWindows = '-';               }
            fhem("setreading $dummy openWindows $openWindows");
            fhem("setreading $dummy openWindowsCount $openWindowsCount");
        }
    }
}


Und mein FTUI sieht wie folgt aus:

   <div data-type="label" class="cell" >Fenster/Türen geöffnet<>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle"]'
       data-colors='["#444444","#ff0000"]'
       class="cell grande top-narrow-2x" ><>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle warn"]'
       data-colors='["transparent","transparent"]'
       class="cell bigger top-narrow-2x" style="margin-top:-188px !important;margin-left:33px !important;"><>

(Achtung: Die closing tags werden durch das Board »zerstört«)

Der FTUI Code besteht aus zwei Teilen, da ich ein möglichst großes Ausrufezeichen haben wollte, aber der warn-Indikator sollte nicht so groß sein. Das geht bestimmt auch einfacher :-).

Ich bestehe nicht darauf, dass der Code optimal ist, aber er funktioniert gut :-)

LG
Christian

Thyraz

#5
Noch eine alternative Lösung:

Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".

Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:


sub numberOfOpenWindows() {
my $openWindows = 0;

foreach my $windowName (devspec2array("group=Fenster")) {
if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
$openWindows++;
}
}
return $openWindows;
}


Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

chris1284

Zitat von: CoolTux am 09 Dezember 2016, 08:26:10
Mit einer myUtils Funktion.

hatte ich mir gedacht und die 2 zeilen code in ein notfy gepackt

jnewton957

Zitat von: Thyraz am 10 Dezember 2016, 08:52:51
Noch eine alternative Lösung:

Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".

Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:


sub numberOfOpenWindows() {
my $openWindows = 0;

foreach my $windowName (devspec2array("group=Fenster")) {
if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
$openWindows++;
}
}
return $openWindows;
}


Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.

hallo,

kannst du das bitte mal komplett mit Anteil in der fhem.cfg , myUtils und dann ftui beschreiben.

Danke Danke

Jörg
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

macfly

Zitat von: choenig am 09 Dezember 2016, 22:57:40
Hi zap,

ich mach das wie folgt:

Einen Dummy zum nachhalten des Status:

defmod dummy_OffeneFenster dummy
attr dummy_OffeneFenster stateFormat openWindowsCount


Ein DOIF zum Ausführen der der Funktion aus 99_MyUtils.pm:

defmod doif__winOpen.StartStop DOIF ([".*:(open|tilted|closed)$"]) ({winOpenStartStop("$DEVICE", "$EVENT")})
attr doif__winOpen.StartStop do always


Eine Function in 99_MyUtils.pm:

sub winOpenStartStop($$) {
    #Als Parameter muss der device-Name übergeben werden
    my ($dev,$event)=@_;
   
    #Der dummy der verwendet wird, um die offenen Fenster/Tueren nachzuhalten
    my $dummy = 'dummy_OffeneFenster';
   
    #Erst mal prüfen, ob das übergebene device überhaupt existiert
    if ($dev =~ /[Ff]enster|Tuer/ && $defs{$dev})
    {
        my $model=AttrVal($dev,'model','');
        if ($model eq 'HM-SEC-SCo' || $model eq 'HM-SEC-RHS')
        {
            #hole die liste der Fenster, die gerade offen sind
            my $openWindows = ReadingsVal($dummy, 'openWindows', '');
            my @parts;
            @parts = split(/,/, $openWindows) if ($openWindows ne '-');

            # wenn das aktuelle Fenster noch nicht in der liste ist -> hinzufuegen
            if ($event eq 'open' || $event eq 'tilted') {
                # add element to array if not already there
                push(@parts, $dev) unless grep{$_ eq $dev} @parts;
            }
            elsif ($event eq 'closed') {
                # remove element from array
                @parts = grep {$_ ne $dev} @parts;
            }
           
            # aktualisiere die Readings des dummies
            my $openWindowsCount = scalar(@parts);
            if ($openWindowsCount > 0) { $openWindows = join(',', @parts); }
            else                       { $openWindows = '-';               }
            fhem("setreading $dummy openWindows $openWindows");
            fhem("setreading $dummy openWindowsCount $openWindowsCount");
        }
    }
}


Und mein FTUI sieht wie folgt aus:

   <div data-type="label" class="cell" >Fenster/Türen geöffnet<>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle"]'
       data-colors='["#444444","#ff0000"]'
       class="cell grande top-narrow-2x" ><>
   <div data-type="symbol" data-device="dummy_OffeneFenster" data-get="openWindowsCount"
       data-get-on='["0", "^[1-9].*"]'
       data-icons='["fa-exclamation-triangle", "fa-exclamation-triangle warn"]'
       data-colors='["transparent","transparent"]'
       class="cell bigger top-narrow-2x" style="margin-top:-188px !important;margin-left:33px !important;"><>

(Achtung: Die closing tags werden durch das Board »zerstört«)

Der FTUI Code besteht aus zwei Teilen, da ich ein möglichst großes Ausrufezeichen haben wollte, aber der warn-Indikator sollte nicht so groß sein. Das geht bestimmt auch einfacher :-).

Ich bestehe nicht darauf, dass der Code optimal ist, aber er funktioniert gut :-)

LG
Christian

Hi,

auf die Gefahr hin, wie ein völliger Noob zu wirken:

woher kommt die Zahl aus deinem Icon bei offenem Fenster? Ich habe das mal nachgespielt und kann die icon-farbänderung nachvollziehen aus data-type="symbol"  und data-get-on. Ich sehe auch die Platzierung der runden roten zahl mit margin-top und margin-left. Aber woher genau bekommt ftui den Wert  aus dem dummy_OffeneFenster?  Kannst du mir mal nachhilfe in html und div-platzierung geben?

danke,
Friedhelm

choenig

Hi Friedhelm,

Zitat von: macfly am 03 Februar 2018, 21:58:24
woher kommt die Zahl aus deinem Icon bei offenem Fenster?
[...]
Aber woher genau bekommt ftui den Wert  aus dem dummy_OffeneFenster?

ich versteh' die Frage(n) nicht ganz. Durch das »warn« im data-icons verwendet er den Wert des dummys als anzuzeigende Zahl.

Zitat von: macfly am 03 Februar 2018, 21:58:24
Kannst du mir mal nachhilfe in html und div-platzierung geben?

Was hast Du denn für ein Problem in »html und div-platzierung«?

LG
Christian

macfly

alles klar, dein Hinweis hat mich zu https://wiki.fhem.de/wiki/FTUI_Widget_Symbol geschickt. Hatte ich garnicht so auf den Schirm, dass das "warn" solche Auswirkungen hat. Ein Beispiel auf der wiki-seite wäre cool gewesen.

Vielen Dank für deine Antwort!

schöne Grüße,
Friedhelm

PingPong

Zitat von: Thyraz am 10 Dezember 2016, 08:52:51
Noch eine alternative Lösung:

Bei mir haben alle Fenster ein UserReading "windowState" welches open, closed, tilted sein kann.
Zusätzlich sind alle Fenster in der Gruppe "Fenster".

Die Anzahl der offenen Fenster bekomme ich dadurch ohne weitere Fallunterscheidungen für Sensormodelle etc. über diese 99_myUtils Funktion:


sub numberOfOpenWindows() {
my $openWindows = 0;

foreach my $windowName (devspec2array("group=Fenster")) {
if (ReadingsVal($windowName, "windowState", "closed") ne "closed") {
$openWindows++;
}
}
return $openWindows;
}


Für die FTUI Anzeige würde dann ein allgemeines Notify auf open|tilted|closed reichen, welches das DummyReading mit dem Rückgabewert der Funktion belegt.

Hallo zusammen, habe das Userreading "windowState" gesetzt und auch die Funktion in die 99_MyUtils.pm aufgenommen.
Leider stehe ich nun aber bei der Einrichtung des Dummy bzw. Notify völlig auf dem Schlauch.
Kann mir da bitte mal jemand unter die Arme greifen? :-(

CoolTux

#12

sub numberOfOpenWindows() {

      return devspec2array("group=Fenster:FILTER=STATE!=closed")
}

Sollte Dir die Anzahl der nicht geschlossenen Fenster zurück geben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

PingPong

Hallo CoolTux,

vielen Dank erstmal für Dein Feedback.
Wenn ich Dich richtig verstehe, liefert die Funktion nun also die Anzahl der offenen Fenster zurück.
Jetzt würde ich das Ergebnis aber gerne noch in ein Dummy Device schreiben, um dieses anschließend in TabletUI anzuzeigen.

Hast Du noch nen Tipp für mich, wie ich das mache?

Vielen Dank im Voraus.
Marc

CoolTux

Du machst ein Notify welches auf alle Fenster triggert und startest das im Notify die Funktion. Am besten gleich mit dem set Befehl für den Dummy
Von Vorteil ist wenn man eine vernünftige Namensgebung gewählt hat.

define notifyAnzahlFenster notify FensterKontact.*:(open|tilted|closed) { CommandSet(undef,'dummyname ' . numberOfOpenWindows()) }


Notify triggert auf alle Devices die vom Namen her anfangen mit FensterKontakt und den Event open,tilted oder closed haben und führt einen set dummyname Anzahl_der_offenen_Fenster aus
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net