Müllabfuhr-Visualisierung mit Modul holiday

Begonnen von dancatt, 26 Januar 2016, 14:48:26

Vorheriges Thema - Nächstes Thema

dancatt

Hallo zusammen,

hat jemand schon eine vergleichbare Lösung für eine Müllabfuhr-Visualisierung in FTUI wie unter
http://forum.fhem.de/index.php/topic,32382.msg247854.html#msg247854
dargestellt?
Mir geht es vor allem um eine Lösung mit dem Modul holiday.

Alle Lösungen die ich gefunden habe sind mit google realisiert was ich nicht möchte.

Vielen Dank.

Gruß Daniel
Cubietruck: FHEM-Server 6.0

Homematic: HM-USB-CFG2, HM-CFG-LAN, HM-LC-SW1-FM, HM-LC-Sw1-Pl-DN-R1, HM-CC-RT-DN, HM-TC-IT-WM-W-EU, HM-SEC-SC-2, HM-SEC-SD, HM-PB-6-WM55

wmr72

Hier ist meine Lösung, sie setzt sich zusammen aus einem holiday-Kalender, einem nächtlichen at, das über eine Funktion in 99_MyUtils.pm pro Abfall-"Art" einen dummy befüllt und der Anzeige in Tablet UI. Die Anzeige in der UI blinkt am Vortag der Abholung, ein Klick auf den Button ("Mülltonne wurde rausgestellt") beendet das Blinken.

abfallkalender:
define abfallkalender holiday

und dazugehört dann natürlich eine abfallkalender.holiday:
...
1 01-05 Biomuell
1 01-05 Papier
1 01-05 GelberSack
1 01-11 Restmuell
1 01-11 Glas
...


Dummies:
define abfall_GelberSack dummy
define abfall_Restmuell dummy
define abfall_Biomuell dummy
define abfall_Glas dummy
define abfall_Papier dummy


99_MyUtils.pm:
sub updateAbfallDummys() {
    use DateTime;

    my $now = DateTime->now(locale=>"de_DE", time_zone => 'Europe/Berlin',);

    my %abfall_zeit;

    for (my $i = 35; $i >= 0; $i--) {
        my $dayname = $now->clone->add(days => $i)->day_name();
        my $abfall = fhem("get abfallkalender days $i", 1);
        Log 4, "debug: days $i: $abfall";

        if ($abfall ne "none") {
            my $status = "in $i Tagen";
            if ($i <= 6) {
                if ($i == 0) {
                    $status = "Heute";
                } elsif ($i == 1) {
                    $status = "Morgen";
                } elsif ($i == 2) {
                    $status = "Übermorgen";
                } else {
                    $status = $dayname;
                }
            }

            my @abfallart = split(",", $abfall);
            foreach $a (@abfallart) {
                $a =~ s/\s//g;
                $abfall_zeit{$a} = $status;
                Log 4, "debug: abfall_$a = $status";
            }
        }
    }

    foreach $a (keys %abfall_zeit) {
        my $status = $abfall_zeit{$a};
        fhem("set abfall_$a $status", 1);
        if ($status ne "Heute" && $status ne "Morgen" && $status ne "Übermorgen") {
            Log 4, "debug: setreading abfall_$a alarm off";
            fhem("setreading abfall_$a alarm off");
        } else {
            my $alarm_status = ReadingsVal("abfall_$a", "alarm", "off");
            Log 4, "alarm abfall_$a = $alarm_status";
            if ($alarm_status ne "done") {
                my $newalarm = ($status eq "Übermorgen") ? "warn" : "blink";
                Log 4, "debug: setreading abfall_$a alarm $newalarm";
                fhem("setreading abfall_$a alarm $newalarm", 1);
            }
        }
    }
}


Timer:
define timer_abfall at +*24:00 {updateAbfallDummys()}
attr timer_abfall alignTime 00:30


HTML:

<li data-row="4" data-col="6" data-sizex="3" data-sizey="1">
        <header>ABFALL</header>
        <div class="cell">
            <div class="left left-space">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_GelberSack"
                    data-off-color="#E6E600"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-recycle","fa-recycle warn","fa-recycle warn blink"]'
                    data-fhem-cmd="setreading abfall_GelberSack alarm done"
                    data-on-colors='["#E6E600","#E6E600","#E6E600"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_GelberSack" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Biomuell"
                    data-off-color="#996633"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Biomuell alarm done"
                    data-on-colors='["#996633","#996633","#996633"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Biomuell" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Papier"
                    data-off-color="green"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Papier alarm done"
                    data-on-colors='["green","green","green"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Papier" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Restmuell"
                    data-off-color="grey"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Restmuell alarm done"
                    data-on-colors='["gray","gray","gray"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Restmuell" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Glas"
                    data-off-color="#1bb8f9"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["wmr-bottles","wmr-bottles warn","wmr-bottles warn blink"]'
                    data-fhem-cmd="setreading abfall_Glas alarm done"
                    data-on-colors='["#1bb8f9","#1bb8f9","#1bb8f9"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Glas" class="darker thin small"></div>
            </div>
    </div>
</li>


GuidoS

Hi,

danke für die Darstellung und posten deiner Lösung. Ich finde die Holiday Funktion PRIMA ! -

Ich habe jedoch das Problem, dass die Dummys nicht aktualisiert werden,...

Idee - Codeänderung ?

gloob

#3
Muss man DateTime zusätzlich installieren auf dem Raspberry Pi?

Ich bekomme folgende Fehlermeldung in FHEM:

ERROR:
Can't locate DateTime.pm in @INC (you may need to install the DateTime module) (@INC contains: /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/arm-linux-gnueabihf/perl5/5.20 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl . ./FHEM ./FHEM/lib) at ./FHEM/99_myUtils.pm line 84. BEGIN failed--compilation aborted at ./FHEM/99_myUtils.pm line 84.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

gloob

#4
Okay ich konnte es mit folgende Kommands lösen:

sudo apt-get update
sudo apt-get install libdatetime-perl


Da ich es auch ohne die zusätzliche Lib lösen wollte habe ich den Code etwas abgeändert. Ich hoffe es ist erlaubt.
Auch konnte ich data-type="pagebutton" nicht finden.

Ich schreibe jetzt nur die Anzahl der Tage bis zur Leerung in den Dummy.

sub updateAbfall() {
    my %abfall_zeit;

    for (my $i = 35; $i >= 0; $i--) {
        my $abfall = fhem("get abfallkalender days $i", 1);
        Log 4, "debug: days $i: $abfall";

        if ($abfall ne "none") {
my $status = $i;

            my @abfallart = split(",", $abfall);
            foreach $a (@abfallart) {
                $a =~ s/\s//g;
                $abfall_zeit{$a} = $status;
                Log 4, "debug: abfall_$a = $status";
            }
        }
    }

    foreach $a (keys %abfall_zeit) {
        my $status = $abfall_zeit{$a};
        fhem("set abfall_$a $status", 1);
    }
}


Dadurch kann ich folgenden Code in FTUI nutzen und mir eine Blase an jedem Symbol anzeigen lassen mit den Tagen bis zur nächsten Leerung:

<li data-row="6" data-col="4" data-sizex="1" data-sizey="1" class="semitransparent">
<header><font size="+1">Abfall</font></header>
<div class="cell">
<div data-type="symbol" data-background-icon="fa-circle-thin " data-off-background-color="#7A7A7A" data-on-background-color="#7A7A7A" data-device="abfall_Restmuell" data-get='STATE' data-off-color="grey" data-get-on='["off","^[01]$","^[1-9][0-9]|[2-9]$"]' data-icons='["fa-trash warn","fa-trash warn blink","fa-trash warn"]' data-on-colors='["gray","gray","gray"]' class=""></div>
<div data-type="symbol" data-background-icon="fa-circle-thin " data-off-background-color="#7A7A7A" data-on-background-color="#7A7A7A" data-device="abfall_GelberSack" data-get='STATE' data-off-color="#E6E600" data-get-on='["off","^[01]$","^[1-9][0-9]|[2-9]$"]' data-icons='["fa-trash warn","fa-trash warn blink","fa-trash warn"]' data-on-colors='["mustard", "mustard", "mustard"]' class=""></div>
<div data-type="symbol" data-background-icon="fa-circle-thin " data-off-background-color="#7A7A7A" data-on-background-color="#7A7A7A" data-device="abfall_Biomuell" data-get='STATE' data-off-color="#996633" data-get-on='["off","^[01]$","^[1-9][0-9]|[2-9]$"]' data-icons='["fa-trash warn","fa-trash warn blink","fa-trash warn"]' data-on-colors='["Blood Red","Blood Red","Blood Red"]' class=""></div>
<div data-type="symbol" data-background-icon="fa-circle-thin " data-off-background-color="#7A7A7A" data-on-background-color="#7A7A7A" data-device="abfall_Papier" data-get='STATE' data-off-color="#4747D1" data-get-on='["off","^[01]$","^[1-9][0-9]|[2-9]$"]' data-icons='["fa-trash warn","fa-trash warn blink","fa-trash warn"]' data-on-colors='["blue","blue","blue"]' class=""></div>
</div>
</li>


Das Blinken des Symbols mit Abholung heute und morgen habe ich beibehalten.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

wmr72

@GuidoS: läuft denn Dein at? Wenn ja: Logging hochdrehen, damit sollte recht einfach zu sehen sein was passiert.

GuidoS

#6
Hi,

danke für deine Antwort... der Fehler lag an falschen Einträgen im ALARM ... die standen alle auf done (aus welchem Grund uch immer) ggf. sollten die vorher als default / reset  angelegt werden ..

PS:Logging hochdrehen = Log 1, "debug: .... oder geht das noch besser .. so dass man alles durchklicken kann (debug mit klick)

.. habe gerade die Testtermine rausgenommen (welche für die kommenden 4 Tage mal angelegt..) und die Anzeige bleibt ... d.h. die ALTEN Einträge bleiben bestehen ... gibt es da eine Möglichkeit die im Script zu berücksichtigen?

VG


wmr72

Zitat von: GuidoS am 12 Februar 2016, 10:03:23
danke für deine Antwort... der Fehler lag an falschen Einträgen im ALARM ... die standen alle auf done (aus welchem Grund uch immer) ggf. sollten die vorher als default / reset  angelegt werden ..

PS:Logging hochdrehen = Log 1, "debug: .... oder geht das noch besser .. so dass man alles durchklicken kann (debug mit klick)

Wenn Du damit einen Debugger meinst, in dem Du jede einzelne Codezeile durchgehen kannst: keine Ahnung, ich glaube es gibt sowas in perl, wenn dann müsstest Du aber vermutlich das ganze FHEM im Debug-Modus laufen lassen. Damit habe ich aber keine Erfahrung.

Zitat
.. habe gerade die Testtermine rausgenommen (welche für die kommenden 4 Tage mal angelegt..) und die Anzeige bleibt ... d.h. die ALTEN Einträge bleiben bestehen ... gibt es da eine Möglichkeit die im Script zu berücksichtigen?
Geht es um die Anzeige oder um den Status der Dummies? Wenn eine Abfall-Sorte überhaupt nicht mehr in Deinem holiday vorkommt, dann werden die Dummies tatsächlich nicht gelöscht, aber das dürfte im Realbetrieb wohl kaum vorkommen. Beim Testen hilft deletereading.

bmwfan

@gloob:
Ich habe Deinen Code verwendet und es hat fast alles geklappt. Leider schaffe ich es nicht, die Tage bis zum nächsten Termin in einem roten Kreis im Tablet-UI beim Symbol einzublenden. Ich kann die Tage als normales Label unterhalb darstellen, aber nicht innerhalb des Symbols, obwohl ich Deinen Code vom Symbol umgesetzt habe. Wie geht denn das genau?

Wäre schön, wenn Du mir einen Tip egben könntest.

Gruß Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Waldmensch

Hab die Lösung von @wmr72 nachgebaut - klappt 1A - Danke fürs zur Verfügung stellen. Enorme WAF Steigerung  ;)

mcmidi

Könntet ihr für Newbies bitte noch erklären, wo die einzelnen Codes abgelegt werden. Danke! Was ich mir schon denke ist:

abfallkalender: fhem.cfg
abfallkalender.holiday: ?
Dummies: fhem.cfg
99_MyUtils.pm: ?
Timer: fhem.cfg
HTML: FTUI index.html

mcmidi

Meine Frage selbst gelöst:
abfallkalender.holiday erstellung abgelegt unter: /opt/fhem/FHEM/
99_MyUtils.pm erstellt

Neue Frage:
Meine Mülltonnen zeigen im roten Kreis aber nur ein "!". Woran kann das liegen?

wmr72

Solltest Du meine Lösung direkt übernommen haben: für mich war es Absicht, ich wollte da keine Zahl haben. Eine Zahl wird dort nur angezeigt, wenn der Wert des Readings eine Zahl ist, bei mir steht da aber "warn", "blink", usw. drin.

Michi240281

#13
Zitat von: wmr72 am 29 Januar 2016, 19:13:43
Hier ist meine Lösung, sie setzt sich zusammen aus einem holiday-Kalender, einem nächtlichen at, das über eine Funktion in 99_MyUtils.pm pro Abfall-"Art" einen dummy befüllt und der Anzeige in Tablet UI. Die Anzeige in der UI blinkt am Vortag der Abholung, ein Klick auf den Button ("Mülltonne wurde rausgestellt") beendet das Blinken.

abfallkalender:
define abfallkalender holiday

und dazugehört dann natürlich eine abfallkalender.holiday:
...
1 01-05 Biomuell
1 01-05 Papier
1 01-05 GelberSack
1 01-11 Restmuell
1 01-11 Glas
...


Dummies:
define abfall_GelberSack dummy
define abfall_Restmuell dummy
define abfall_Biomuell dummy
define abfall_Glas dummy
define abfall_Papier dummy


99_MyUtils.pm:
sub updateAbfallDummys() {
    use DateTime;

    my $now = DateTime->now(locale=>"de_DE", time_zone => 'Europe/Berlin',);

    my %abfall_zeit;

    for (my $i = 35; $i >= 0; $i--) {
        my $dayname = $now->clone->add(days => $i)->day_name();
        my $abfall = fhem("get abfallkalender days $i", 1);
        Log 4, "debug: days $i: $abfall";

        if ($abfall ne "none") {
            my $status = "in $i Tagen";
            if ($i <= 6) {
                if ($i == 0) {
                    $status = "Heute";
                } elsif ($i == 1) {
                    $status = "Morgen";
                } elsif ($i == 2) {
                    $status = "Übermorgen";
                } else {
                    $status = $dayname;
                }
            }

            my @abfallart = split(",", $abfall);
            foreach $a (@abfallart) {
                $a =~ s/\s//g;
                $abfall_zeit{$a} = $status;
                Log 4, "debug: abfall_$a = $status";
            }
        }
    }

    foreach $a (keys %abfall_zeit) {
        my $status = $abfall_zeit{$a};
        fhem("set abfall_$a $status", 1);
        if ($status ne "Heute" && $status ne "Morgen" && $status ne "Übermorgen") {
            Log 4, "debug: setreading abfall_$a alarm off";
            fhem("setreading abfall_$a alarm off");
        } else {
            my $alarm_status = ReadingsVal("abfall_$a", "alarm", "off");
            Log 4, "alarm abfall_$a = $alarm_status";
            if ($alarm_status ne "done") {
                my $newalarm = ($status eq "Übermorgen") ? "warn" : "blink";
                Log 4, "debug: setreading abfall_$a alarm $newalarm";
                fhem("setreading abfall_$a alarm $newalarm", 1);
            }
        }
    }
}


Timer:
define timer_abfall at +*24:00 {updateAbfallDummys()}
attr timer_abfall alignTime 00:30


HTML:

<li data-row="4" data-col="6" data-sizex="3" data-sizey="1">
        <header>ABFALL</header>
        <div class="cell">
            <div class="left left-space">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_GelberSack"
                    data-off-color="#E6E600"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-recycle","fa-recycle warn","fa-recycle warn blink"]'
                    data-fhem-cmd="setreading abfall_GelberSack alarm done"
                    data-on-colors='["#E6E600","#E6E600","#E6E600"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_GelberSack" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Biomuell"
                    data-off-color="#996633"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Biomuell alarm done"
                    data-on-colors='["#996633","#996633","#996633"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Biomuell" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Papier"
                    data-off-color="green"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Papier alarm done"
                    data-on-colors='["green","green","green"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Papier" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Restmuell"
                    data-off-color="grey"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["fa-trash","fa-trash warn","fa-trash warn blink"]'
                    data-fhem-cmd="setreading abfall_Restmuell alarm done"
                    data-on-colors='["gray","gray","gray"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Restmuell" class="darker thin small"></div>
            </div>
            <div class="left">
                <div
                    data-type="pagebutton"
                    data-background-icon="fa-circle-thin"
                    data-off-background-color="#7A7A7A"
                    data-on-background-color="#7A7A7A"
                    data-device="abfall_Glas"
                    data-off-color="#1bb8f9"
                    data-get="alarm"
                    data-get-on='["off","warn|done","blink"]'
                    data-icons='["wmr-bottles","wmr-bottles warn","wmr-bottles warn blink"]'
                    data-fhem-cmd="setreading abfall_Glas alarm done"
                    data-on-colors='["#1bb8f9","#1bb8f9","#1bb8f9"]'
                    class="big">
                </div>
                <div data-type="label" data-device="abfall_Glas" class="darker thin small"></div>
            </div>
    </div>
</li>


Hi,

ich habe deine Lösung nachgebaut, vielen Dank für den Code! :-)

Funktioniert auch soweit, bis auf eins: Irgendwie wird bei allen Tonnen das Icon mit dem "!" dran angezeigt, obwohl dann im Text/Reading z.B. "in 9 Tagen steht"! Haste ne Idee, woran das liegen könnte?

EDIT 13.05.16: Ich habe das jetzt verstanden. Das Reading "alarm" der Dummies steht nach Betätigen des blinkenden Icons auf "done". Für "warn" und "done" ist ja das "warn-icon" definiert. Also müsste das Reading doch dann wiede den state "off" annehmen. Aber passiert das denn überhaupt irgendwo?
FHEM auf QNAP per VM / HM LAN Adapter / diverse HM-Devices
QNAP TVS 463
VU+ Duo4kSE
Sony 75ZD9

wmr72

Zitat
EDIT 13.05.16: Ich habe das jetzt verstanden. Das Reading "alarm" der Dummies steht nach Betätigen des blinkenden Icons auf "done". Für "warn" und "done" ist ja das "warn-icon" definiert. Also müsste das Reading doch dann wiede den state "off" annehmen. Aber passiert das denn überhaupt irgendwo?

Hallo,

ja das passiert, und zwar hier:

        ...
        if ($status ne "Heute" && $status ne "Morgen" && $status ne "Übermorgen") {
            Log 4, "debug: setreading abfall_$a alarm off";
            fhem("setreading abfall_$a alarm off");
        } else {
        ...

also am ersten Tag nach der Abholung, falls die nicht schon wieder in maximal 2 Tagen stattfindet.

Der Vollständigkeit halber: Wenn Du kein Ausrufezeichen an den Icons dranhaben willst sondern Zahlen, dann muss in dem alarm-Reading eine Zahl als Wert drin stehen.