HowTo: Müllabfuhrplan mit fixen Terminen Anzeige ww. in Stunden/Tagen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Sebastian
    LoxBus Spammer
    • 28.08.2015
    • 243

    HowTo: Müllabfuhrplan mit fixen Terminen Anzeige ww. in Stunden/Tagen

    Guten Abend,

    aufgrund einer Anregung aus dem Thread von Albert, schönen Dank schon einmal im Voraus, habe ich mich mal an PicoC und der Problematik bei abweichenden Müllabfuhrterminen versucht.
    PicoC kannte ich so noch nicht, und das letzte mal mit C habe ich in der 10. Klasse programmiert. Also seht mir bitte meine amateurhaften Versuche nach ;-)

    Formelbaustein:
    Das Skript ist so geschrieben, dass man einmal jährlich zu Weihnachten alle Termine einträgt. Ist eigentlich selbsterklärend, wenn man ins Skript schaut.

    Code:
    // Müllabfuhr für loxforum.com by Sebastian
    //AI1: Minuten Aktualisierung
    //AQ1: Stunden bis Restmüllabholung
    //AQ2: Stunden bis Biomüllabholung
    //AQ3: Stunden bis Altpapierabholung
    //AQ4: Stunden bis Leichtstoffabholung
    
    float sleeptime, now, restleft, bioleft, papierleft, leichtleft;
    int rest[30], bio[30], papier[30], leicht[30]; //Arrays. Falls es mehr Termine sind, einfach die Klammerwerte erhöhen
    int lenrest, lenbio, lenpapier, lenleicht, i, k, year, hourrest, hourbio, hourpapier, hourleicht, minuterest, minutebio, minutepapier, minuteleicht, remtimerest, remtimebio, remtimepapier, remtimeleicht;
    
    year = 2016; //Jahr, für den der Müllkalender gilt
    hourrest = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Restmüll)
    hourbio = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Biomüll)
    hourpapier = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Altpapier)
    hourleicht = 6; //Stunde, an der die Müllabfuhr üblicherweise kommt (Leichtstoff)
    minuterest = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
    minutebio = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
    minutepapier = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
    minuteleicht = 0; //Minute, an der die Müllabfuhr üblicherweise kommt ;-)
    remtimerest = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
    remtimebio = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
    remtimepapier = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
    remtimeleicht = 12; //Stunden vor der Abholung bzgl. Erinnerung. IM STATUSBAUSTEIN ANPASSEN (oder umgekehrt)!
    
    while(TRUE)
    {
        sleeptime = 60*getinput(0); //Aktualisierungszeit in Sekunden
        now = getcurrenttime(); //aktuelle Zeit in Sekunden (seit 01.01.2009 0:00)
    
        //Daten der Restmüllabholung
        rest[0] = gettimeval(year-1, 12, 17, hourrest, minuterest, 0, 1); //Letzter Abfuhrtermin des alten Jahres
        rest[1] = gettimeval(year, 1, 14, hourrest, minuterest, 0, 1); //ab hier für das neue Jahr (Variable "year")
        rest[2] = gettimeval(year, 2, 11, hourrest, minuterest, 0, 1);
        rest[3] = gettimeval(year, 3, 10, hourrest, minuterest, 0, 1);
        rest[4] = gettimeval(year, 4, 7, hourrest, minuterest, 0, 1);
        rest[5] = gettimeval(year, 5, 6, hourrest, minuterest, 0, 1);
        rest[6] = gettimeval(year, 6, 2, hourrest, minuterest, 0, 1);
        rest[7] = gettimeval(year, 6, 30, hourrest, minuterest, 0, 1);
        rest[8] = gettimeval(year, 7, 28, hourrest, minuterest, 0, 1);
        rest[9] = gettimeval(year, 8, 25, hourrest, minuterest, 0, 1);
        rest[10] = gettimeval(year, 9, 22, hourrest, minuterest, 0, 1);
        rest[11] = gettimeval(year, 10, 20, hourrest, minuterest, 0, 1);
        rest[12] = gettimeval(year, 11, 17, hourrest, minuterest, 0, 1);
        rest[13] = gettimeval(year, 12, 15, hourrest, minuterest, 0, 1);
            
            //Schleife Zählen der vorh. Arrayelemente beim Restmüll
            lenrest=0;
            for(k=0; k<(sizeof(rest)/sizeof(int)); k++) {
                if(rest[k] > 0) {
                    lenrest++;
                }
            }
    
        //Daten der Biomüllabholung
        bio[0] = gettimeval(year-1, 12, 23, hourbio, minutebio, 0, 1); //Letzter Abfuhrtermin des alten Jahres
        bio[1] = gettimeval(year, 1, 7, hourbio, minutebio, 0, 1); //ab hier für das neue Jahr (Variable "year")
        bio[2] = gettimeval(year, 1, 21, hourbio, minutebio, 0, 1);
        bio[3] = gettimeval(year, 2, 4, hourbio, minutebio, 0, 1);
        bio[4] = gettimeval(year, 2, 18, hourbio, minutebio, 0, 1);
        bio[5] = gettimeval(year, 3, 3, hourbio, minutebio, 0, 1);
        bio[6] = gettimeval(year, 3, 17, hourbio, minutebio, 0, 1);
        bio[7] = gettimeval(year, 4, 1, hourbio, minutebio, 0, 1);
        bio[8] = gettimeval(year, 4, 14, hourbio, minutebio, 0, 1);
        bio[9] = gettimeval(year, 4, 28, hourbio, minutebio, 0, 1);
        bio[10] = gettimeval(year, 5, 12, hourbio, minutebio, 0, 1);
        bio[11] = gettimeval(year, 5, 27, hourbio, minutebio, 0, 1);
        bio[12] = gettimeval(year, 6, 9, hourbio, minutebio, 0, 1);
        bio[13] = gettimeval(year, 6, 23, hourbio, minutebio, 0, 1);
        bio[14] = gettimeval(year, 7, 7, hourbio, minutebio, 0, 1);
        bio[15] = gettimeval(year, 7, 21, hourbio, minutebio, 0, 1);
        bio[16] = gettimeval(year, 8, 4, hourbio, minutebio, 0, 1);
        bio[17] = gettimeval(year, 8, 18, hourbio, minutebio, 0, 1);
        bio[18] = gettimeval(year, 9, 1, hourbio, minutebio, 0, 1);
        bio[19] = gettimeval(year, 9, 15, hourbio, minutebio, 0, 1);
        bio[20] = gettimeval(year, 9, 29, hourbio, minutebio, 0, 1);
        bio[21] = gettimeval(year, 10, 13, hourbio, minutebio, 0, 1);
        bio[22] = gettimeval(year, 10, 27, hourbio, minutebio, 0, 1);
        bio[23] = gettimeval(year, 11, 10, hourbio, minutebio, 0, 1);
        bio[24] = gettimeval(year, 11, 24, hourbio, minutebio, 0, 1);
        bio[25] = gettimeval(year, 12, 8, hourbio, minutebio, 0, 1);
        bio[26] = gettimeval(year, 12, 22, hourbio, minutebio, 0, 1);
    
            //Schleife Zählen der vorh. Arrayelemente beim Biomüll
            lenbio=0;
            for(k=0; k<(sizeof(bio)/sizeof(int)); k++) {
                if(bio[k] > 0) {
                    lenbio++;
                }
            }
    
        //Daten der Papiermüllabholung
        papier[0] = gettimeval(year-1, 12, 31, hourpapier, minutepapier, 0, 1); //Letzter Abfuhrtermin des alten Jahres
        papier[1] = gettimeval(year, 1, 28, hourpapier, minutepapier, 0, 1); //ab hier für das neue Jahr (Variable "year")
        papier[2] = gettimeval(year, 2, 25, hourpapier, minutepapier, 0, 1);
        papier[3] = gettimeval(year, 3, 23, hourpapier, minutepapier, 0, 1);
        papier[4] = gettimeval(year, 4, 21, hourpapier, minutepapier, 0, 1);
        papier[5] = gettimeval(year, 5, 20, hourpapier, minutepapier, 0, 1);
        papier[6] = gettimeval(year, 6, 16, hourpapier, minutepapier, 0, 1);
        papier[7] = gettimeval(year, 7, 14, hourpapier, minutepapier, 0, 1);
        papier[8] = gettimeval(year, 8, 11, hourpapier, minutepapier, 0, 1);
        papier[9] = gettimeval(year, 9, 8, hourpapier, minutepapier, 0, 1);
        papier[10] = gettimeval(year, 10, 7, hourpapier, minutepapier, 0, 1);
        papier[11] = gettimeval(year, 11, 4, hourpapier, minutepapier, 0, 1);
        papier[12] = gettimeval(year, 12, 1, hourpapier, minutepapier, 0, 1);
        papier[13] = gettimeval(year, 12, 30, hourpapier, minutepapier, 0, 1);
    
            //Schleife Zählen der vorh. Arrayelemente beim Papiermüll
            lenpapier=0;
            for(k=0; k<(sizeof(papier)/sizeof(int)); k++) {
                if(papier[k] > 0) {
                    lenpapier++;
                }
            }
    
        //Daten der Leichtstoffabholung
        leicht[0] = gettimeval(year-1, 12, 30, hourleicht, minuteleicht, 0, 1); //Letzter Abfuhrtermin des alten Jahres
        leicht[1] = gettimeval(year, 1, 27, hourleicht, minuteleicht, 0, 1); //ab hier für das neue Jahr (Variable "year")
        leicht[2] = gettimeval(year, 2, 24, hourleicht, minuteleicht, 0, 1);
        leicht[3] = gettimeval(year, 3, 22, hourleicht, minuteleicht, 0, 1);
        leicht[4] = gettimeval(year, 4, 20, hourleicht, minuteleicht, 0, 1);
        leicht[5] = gettimeval(year, 5, 19, hourleicht, minuteleicht, 0, 1);
        leicht[6] = gettimeval(year, 6, 15, hourleicht, minuteleicht, 0, 1);
        leicht[7] = gettimeval(year, 7, 13, hourleicht, minuteleicht, 0, 1);
        leicht[8] = gettimeval(year, 8, 10, hourleicht, minuteleicht, 0, 1);
        leicht[9] = gettimeval(year, 9, 7, hourleicht, minuteleicht, 0, 1);
        leicht[10] = gettimeval(year, 10, 6, hourleicht, minuteleicht, 0, 1);
        leicht[11] = gettimeval(year, 11, 3, hourleicht, minuteleicht, 0, 1);
        leicht[12] = gettimeval(year, 11, 30, hourleicht, minuteleicht, 0, 1);
        leicht[13] = gettimeval(year, 12, 29, hourleicht, minuteleicht, 0, 1);
    
            //Schleife Zählen der vorh. Arrayelemente beim Leichtstoffmüll
            lenleicht=0;
            for(k=0; k<(sizeof(leicht)/sizeof(int)); k++) {
                if(leicht[k] > 0) {
                    lenleicht++;
                }
            }
    
        //Schleife Restmüll
        for(i=0; i<lenrest; i++) {
            restleft = (rest[i]-now)/3600;
    
            if(restleft >= 0) {
                setoutput(0,restleft);
                i = lenrest-1;
            }
        }
        //Schleife Biomüll
        for(i=0; i<lenbio; i++) {
            bioleft = (bio[i]-now)/3600;
    
            if(bioleft >= 0) {
                setoutput(1,bioleft);
                i = lenbio-1;
            }
        }
        //Schleife Papiermüll
        for(i=0; i<lenpapier; i++) {
            papierleft = (papier[i]-now)/3600;
    
            if(papierleft >= 0) {
                setoutput(2,papierleft);
                i = lenpapier-1;
            }
        }
        //Schleife Leichtstoff
        for(i=0; i<lenleicht; i++) {
            leichtleft = (leicht[i]-now)/3600;
    
            if(leichtleft >= 0) {
                setoutput(3,leichtleft);
                i = lenleicht-1;
            }
        }
        //Schleife zur Überprüfung, ob die Erinnerungsuhrzeit ansteht (innerhalb 1 Stunde), wenn ja: Sleeptime verringern.
        if((restleft<(remtimerest+1) && restleft>=(remtimerest)) ||
            (bioleft<(remtimebio+1) && bioleft>=(remtimebio)) ||
            (papierleft<(remtimepapier+1) && papierleft>=(remtimepapier)) ||
            (leichtleft<(remtimeleicht+1) && leichtleft>=(remtimeleicht))) {
                sleeptime = 120;
        }
    sleeps(sleeptime); //Sleep-Wert in Sekunden, um die CPU zu schonen..
    }
    Merker:
    Man hat die Möglichkeit, sowohl die Reststunden als auch die Resttage anzuzeigen.

    Statusbaustein:
    Ich wollte es so, dass der Status jeweils 12 Stunden vor Abholung gesetzt wird. Das passt auch dazu, zu welchem Zeitpunkt wir abends die Tonnen rausstellen.

    Differenzschwellwertschalter:
    Schalten jeweils nur die Benachrichtigungen ein, die auch dazu passen.

    Symbole:
    Habe ich mir von Albert geborgt, reichen für meine Zwecke mehr als aus! Danke nochmals!

    Dann viel Spaß damit!
    Anregungen/Verbesserungen sind natürlich erwünscht!

    Gruß Sebastian

    EDIT 25.12.2015:
    Frohe Weihnachten!
    - Das Programm lief nur bei Miniserverupdate, behoben durch While(true)
    - Sleeptime mit Schieber hinzugefügt, um die CPU zu schonen
    - Statusbaustein angepasst
    - Benachrichtigungsbausteine: Zeit auf 12 Stunden hochgesetzt
    - Config-Datei angehängt
    - Screenshots erneuert

    EDIT 26.12.2015:
    - Statusbaustein angepasst.

    EDIT 27.12.2015:
    - Schleifen zur autom. Erkennung der Arrayinhalte eingefügt.

    EDIT 06.01.2016;
    - Sleeptimeanpassung bei 1 Stunde vor Erinnerungszeit bis zur Erinnerungszeit (um die Erinnerungszeit relativ genau zu erhalten, für Benachrichtigungen)

    EDIT 07.01.2016:
    - Aus einer Abholzeit mach 4, auf vielfachen Wunsch einer einzelnen Person ;-)

    EDIT 30.07.2016
    - Fehler im Code behoben
    Angehängte Dateien
    Zuletzt geändert von Sebastian; 30.07.2016, 18:28.
  • MightyLox
    LoxBus Spammer
    • 22.10.2015
    • 208

    #2
    Gefällt mir, werde ich bei Gelegenheit mal testen.

    Kann man ein PicoC Programm eigentlich von außen füttern? Ich könnte mir vorstellen, den ganzen Initialisierungskram von einem PC zu senden. Bei uns ist es zumindest so, dass der Abfallkalender mit allen Terminen elektronisch vorliegt (Excel). Diesen Kalender könnte man dann mit allen Terminen per UDP (z.B.) an das PicoC Programm senden. Geht das?

    Grüße
    Martin
    Haus: Neubau Start 22.11.15, EG/OG, 2 Pers./Kind/Hund, Massivhaus, Heizlast 7,52 KW
    Loxone: 1x MS, 2x Ext, 1x DMX
    KNX: 2x 8er & 8x 4er MDT Glastaster (mit Temp), Rollläden MDT AKU-1616.01, MDT AMI-1216.01 True RMS Steckdosen, MDT Wetter, MDT SCN-P360K4.01 Präsenzmelder
    Licht: DMX LED Beleuchtung (24V/230V)
    Heizung: LWWP Waterkotte Basic BS 7010.5, Webinterface Modbus TCP
    Projektseite: https://www.loxforum.com/forum/mein-...neubau-2015-16

    Kommentar

    • Sebastian
      LoxBus Spammer
      • 28.08.2015
      • 243

      #3
      Hi Martin,

      ich dachte erst auch daran.
      Aber der Aufwand war mir doch zu groß, da ich auch sowieso die Daten nur als PDF bekomme.
      Ich muss sie also händisch einpflegen.

      Wenn man sich da einmal im Jahr 10 Minuten hinsetzt, finde ich den Aufwand vertretbar.

      Gruß Sebastian

      Kommentar

      • Gast

        #4
        Funktioniert. Bei mir aktualisieren sich aber die Tage nicht. Wenn das Programm in den Miniserver geladen wird stimmen die Tage wieder. Am nächsten Tag steht immer noch die gleiche Anzahl an Tage drin. Was ist der Fehler ?

        Kommentar


        • Sebastian
          Sebastian kommentierte
          Kommentar bearbeiten
          Behoben, siehe 1. Post.

          Danke Dir!
      • Gast

        #5
        Hallo Sebastian,

        könntest du mal bitte die LoxConfig Datei anhanängen.

        Ich habe irgendwie Probleme mit dem Differenzschwellwertschalter.
        Was sind denn da die Parameter ?

        Jedesmal, wenn ich den Miniserver neu starte, bekomme ich die Benachrichtigungen :-(

        Frohe Weihnachten

        Kommentar


        • Sebastian
          Sebastian kommentierte
          Kommentar bearbeiten
          Ich hab Dir die Datei angehängt!
          Hab aber zusätzlich noch die Benachrichtigungszeit auf 12 Stunden gestellt, um etwaige doppelte Meldungen zu vermeiden.

          Dir auch Frohe Weihnachten!
      • Sebastian
        LoxBus Spammer
        • 28.08.2015
        • 243

        #6
        Hi Gast und Gast

        habe das soweit im 1. Beitrag angepasst.

        Falls noch was auffällt, meldet Euch bitte!

        Gruß und noch frohe Festtage!

        Kommentar

        • hismastersvoice
          Supermoderator
          • 25.08.2015
          • 7147

          #7
          Super Idee..
          Funktioniert prima, danke dafür.
          Kein Support per PN!

          Kommentar

          • Gast

            #8
            Hi Sebastian,

            vielen Dank.

            Ich habe leider immer noch das Problem, dass ich bei einem Miniserver Neustart sofort eine Benachrichtigung gesendet bekomme, dass mein Restmüll morgen geht...obwohl das erst in 5 Tagen soweit ist.

            Irgendeine Idee ?

            Kommentar

            • Sebastian
              LoxBus Spammer
              • 28.08.2015
              • 243

              #9
              Hi Gast ,

              guck dir nochmal den Statusbaustein an, da darf bei sonstigen Ereignissen keine "0" stehen, sondern ein Wert, mit dem die Differenzschwellwertschalter nix anfangen können (z.B. 1 oder 100).
              Weiterhin habe ich bei den Benachrichtigungen den Wert bei "minimaler Zeitabstand" auf 43200 s gestellt, das müsste aber normalerweise auch so gehen.

              Kannst ja auch mal in der Liveview testen, was da passiert.

              Grüße
              Sebastian
              Angehängte Dateien

              Kommentar

              • Gast

                #10
                guck dir nochmal den Statusbaustein an, da darf bei sonstigen Ereignissen keine "0" stehen, sondern ein Wert, mit dem die Differenzschwellwertschalter nix anfangen können (z.B. 1 oder 100).
                Könntest Du mir da auch noch einen Screenshot schicken - ich habe das aus Deinem Beispiel übernommen...

                Besten Dank

                Kommentar

                • Sebastian
                  LoxBus Spammer
                  • 28.08.2015
                  • 243

                  #11
                  Hi Ela, schau dir mal den Screenshot aus dem 1. Beitrag an.
                  Da gibt's noch die Spalte "Statuswert".
                  Das ist in deinem nicht sichtbar, du musst weiter nach rechts scrollen.

                  Kommentar

                  • smuso
                    Smart Home'r
                    • 26.08.2015
                    • 43

                    #12
                    Hy

                    könntest du die Config als File speichern das man es in Loxone aufmachen kann? geht das?

                    danke

                    Kommentar

                    • Sebastian
                      LoxBus Spammer
                      • 28.08.2015
                      • 243

                      #13
                      Mahlzeit!
                      Ist doch im 1. Beitrag angehängt?
                      Oder gibt's da noch nen anderes Format?

                      Kommentar

                      • Gast

                        #14
                        Hi,

                        irgendwas mach ich flasch :-(

                        Bei jedem Neustart des Miniservers kommen Benachrichtigungen.

                        Ich habe meine Config mal angehängt.

                        Evtl. findet jemand den Fehler...

                        Grüße
                        Angehängte Dateien

                        Kommentar

                        • Sebastian
                          LoxBus Spammer
                          • 28.08.2015
                          • 243

                          #15
                          Zitat von Ela1983
                          Hi,

                          irgendwas mach ich flasch :-(

                          Bei jedem Neustart des Miniservers kommen Benachrichtigungen.

                          Ich habe meine Config mal angehängt.

                          Evtl. findet jemand den Fehler...

                          Grüße
                          Hi Ela,

                          ich glaube es ist so:
                          Bis das Programm bei Neustart durchgelaufen ist, liegen am Statusbaustein bei AI1 bis AI4 Nullen an und es kommt so zu einer Meldung.
                          Beim Statusbaustein müssen also noch Bedingungen != 0 rein.
                          Habe das im 1. Beitrag angepassst.

                          Müsste jetzt aber klappen!? :-)

                          Viele Grüße
                          Sebastian

                          Kommentar

                          Lädt...