Ankündigung

Einklappen
Keine Ankündigung bisher.

ZSU+ (Zeitschaltuhr für XXAPI²) - download

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #61
    Hallo Hans, das ist ja ein wahnsinns Teil, vielen Dank dafür. Ich hoffe das ich als Anfänger damit zu recht komme, aber ich will es versuchen. Im Moment halten mich folgende Meldungen auf Trapp, die ich nicht ganz einschätzen kann. Eventuell kannst du mir helfen. Das ist der Stand nach Installation und dem ersten überprüfen (siehe Bild). Vielen Dank Vorab!

    Gruß Dino

    ​​​​​​​
    Angehängte Dateien

    Kommentar


      #62
      Hallo, das Problem mit dem Baustein 12056 habe ich gelöst. Habe die Datei im logic Ordner mit dem Editor geöffnet und habe den Quelltext erneut hineinkopiert. Anschließend habe ich die Datei von hslz zu hsl umbenannt und erneut im Experten importiert. Ich weiß nicht ob das ein passendes Vorgehen war, aber es hat funktioniert :-)!

      Kommentar


        #63
        Zitat von Gecko Beitrag anzeigen
        Hi,

        ..
        Kannst du das so bestätigen?

        ..
        Gruß
        Oliver
        kurze Antwort: Ja

        Hans
        Hans

        Kommentar


          #64
          Hallo Hans,
          hab' jetzt auch angefangen, Deine ZSUs zu implementieren - zumindest für die Schaltuhren, an die ich ab und an mal dran muss (die UZSUs laufen ja auch unter xxAPI2 weiter, auch wenn man sie nicht mehr editieren/verändern kann :-)
          Die Einbindung gemäß Deiner Beschreibung hat einwandfrei und völlig problemlos geklappt (für die erste "einfache" ZSU). Und ganz so schlimm, wie das die Masse an Logik-Bausteinen erwarten lässt, war's dann doch nicht. Dein Ansatz zeigt recht gut, was mit diesen Gira-Logiken alles möglich ist - großer Respekt!!
          Ein paar Punkte/Fragen hätte ich dann doch noch:
          - Baustein 15030 hat bei mir die V1.0 - in Deiner Anleitung unter Punkt 13 soll man die Versionen einiger Bausteine prüfen (eben auch 15030), ob dort überall die V1.1 hinterlegt ist
          - ZSU+ hatte ich so verstanden, dass die Schaltzeiten gefiltert werden können auf Wochentage, Urlaub, Feiertag, An-/Abwesenheit. Falls dem so ist, müssten die entsprechenden Schalter doch "getoggelt" werden. Bei Wochentagen ist das auch so, bei Urlaub und Feiertag nicht, An-/Abwesenheit kann gar nicht gesetzt werden. Hab' ich da was missverstanden, oder stimmt das Popup ZSU+ nicht.
          - nur Interesse halber: warum brauchst Du für interne GAs Gruppenadressen?

          Was ich bisher ganz gerne genutzt hatte (UZSUs) war das Zufallselement (also schalte 8:00 Uhr +/- 30min oder SU + 30min +/- 15min). Macht das ganze automatische Geschalte nicht so berechenbar/maschinell oder eben etwas menschlicher ...
          Ist absolut "nice to have" - aber denkst Du an eine Weiterentwicklung?
          Oder siehst Du Deinen Ansatz selbst quasi als "Brückentechnologie" für die xxAPI2, die - Du hast das ja selbst oft geschrieben - ohne Schaltuhren für viele keine sinnvolle Alternative ist?
          Bin selbst hin und her gerissen - Deine Zeitraum-Logik hat schon was für sich - aber wenn die Filter mit ins Spiel kommen (soweit bin ich ja noch gar nicht) wird's wohl doch recht (zu?) komplex.
          Zum Beispiel Heizung/Lüftung:
          normaler Arbeitstag (Mo-Fr): schalten von 06:00 Uhr bis 09:00 Uhr und von 17:00 Uhr bis 23:00 Uhr Zustand A (sonst Zustand B)
          Samstag: schalten von 06:00 Uhr bis 01:00 Uhr
          Sonntag: schalten von 7:30 Uhr bis 24:00 Uhr
          Feiertag: schalten von 8:00 Uhr bis 24:00 Uhr
          Urlaub: gar nicht schalten

          Wie würdest Du sowas abbilden? Wäre dafür nicht die Schaltpunkt-Logik der UZSU besser geeignet? Wäre interessant, wie Du das siehst :-)

          Aber trotz der offenen Fragen: sehr interessanter Ansatz von Dir und eine tolle Leistung! Dafür danke auch von meiner Seite und dass Du das auch zugänglich machst. Meine bisherige Vorgehensweise bei Veränderungen an einigen Schaltzeiten war die folgende: altes Projekt (xxAPI) auf den HS hochladen - Schaltzeiten ändern - aktuelles Projekt (xxAPI2) wieder hochladen - Fertig.

          Das hat sich jetzt gändert - ZSU sei Dank!

          Herzliche Grüße nach Österreich
          Tom

          Kommentar


            #65
            Wollte einen Teil meiner eigenen Fragen gleich mal selbst beantworten:
            Urlaub und Feiertag in den Schaltuhren haben drei Zustände (der Wechsel läuft eben nicht übers "Toggeln" - hatte ich übersehen, sorry).
            Urlaub PLUS: Schaltuhr schaltet im Urlaub
            Urlaub MINUS: Schaltuhr schaltet nicht im Urlaub
            Urlaub (neutral): Schaltuhr schaltet, egal ob Urlaub anliegt oder nicht
            Gleiches gilt für Feiertage.
            An-/Abwesenheit ist eine Info im Popup - wird im Logikeditor die entsprechende GA mit dem Eingang verknüpft, schaltet die Schaltuhr entsprechend bei Abwesenheit oder eben bei Anwesenheit.
            Hoffe, das ist so richtig wiedergegeben.

            Nochmal: ist wirklich eine super Lösung zur Überbrückung, bis xxAPI2 soweit ist mit Schaltuhren - Kalender könnte man sogar so lassen wie es jetzt ist.
            Otto Normalo bräuchte bei dieser Lösung - so wie ich auch - sicher deutlich mehr Schaltuhren als die 16 möglichen. Wenn man's aber mal durchgeht, werden die meisten einmal eingerichtet und nie mehr angefasst (Heizung, Lüftung, Klima, Beschattung, etc.). Und die laufen ja auch über die UZSUs im Gira HS bei Nutzung xxAPI2 weiter - lassen sich halt nicht mehr verändern/editieren. Und die "wenigen", die tatsächlich hin und wieder verändert werden (Steckdosen, Teichpumpen im Sommer, etc.), für die könnten die verfügbaren 16 ZSUs schon dicke genügen - zumindest bei mir ist das so.
            Spricht also dank ZSU-Ansatz von Hans nichts mehr dafür, sich nicht mal intensiv mit den tollen Möglichkeiten der xxAPI2 von Nils zu beschäftigen :-)
            Hoffe, Du (Hans) nimmst mir das nicht übel, dass ich die ZSUs eher als Übergangslösung sehe - ich bin wirklich froh, dass Du das gewagt hast und die Lösung auch publiziert hast. Deine Sicht/Meinung (siehe auch letzter Post) zur "Übergangslösung" würde mich aber sehr interessieren.
            Viele Grüße
            Tom

            Kommentar


              #66
              Zitat von windy75 Beitrag anzeigen
              Wollte einen Teil meiner eigenen Fragen gleich mal selbst beantworten:
              Urlaub und Feiertag in den Schaltuhren haben drei Zustände (der Wechsel läuft eben nicht übers "Toggeln" - hatte ich übersehen, sorry).
              Urlaub PLUS: Schaltuhr schaltet im Urlaub
              Urlaub MINUS: Schaltuhr schaltet nicht im Urlaub
              Urlaub (neutral): Schaltuhr schaltet, egal ob Urlaub anliegt oder nicht
              Gleiches gilt für Feiertage.
              An-/Abwesenheit ist eine Info im Popup - wird im Logikeditor die entsprechende GA mit dem Eingang verknüpft, schaltet die Schaltuhr entsprechend bei Abwesenheit oder eben bei Anwesenheit.
              Hoffe, das ist so richtig wiedergegeben.

              .....
              Tom
              Hast DU richtig wiedergegeben.

              Solange DU fix eingestellte Zeiten - die keine oder nur beschränkte Änderungen benötigen, kannst DU die ZSU bzw. ZSU+ Bausteine direkt verwenden.
              Wahrscheinlich hilft den Endbenutzer ein spezielles Interface mehr und es wäre einfach zu realisieren.

              Übergangslösung:
              Die eierlegende Wollmilchsau kann ich "sicher" nicht liefern.

              Die Grundbausteine sind aber alle vorhanden, um sehr spezifische Lösungen zu realisieren.

              Z.B.Deine Lüftungslösung:

              sind 5 ZSU+ Zeitschaltuhren, wo DU nur die von-bis Zeiten (E3-E10) verändern kannst
              die 5 Ausgänge haben eine ODER-Verknüpfung
              alles anderen Eingänge sind fix belegt
              • werktags: Mo, Di, Mi, Do, Fr, kein Urlaub, kein Feiertag
                2 x für vormittag & nachmittag
              • Samstag: Sa, kein Urlaub, kein Feiertag
              • Sonntag: So, kein Urlaub
              • Feiertag: Mo.Di,Mi,Do,Fr,Sa, kein Urlaub, ein Feiertag (Annahme: wenn SONNTAG und FEIERTAG dann wird Sonntag-ZSU aktiv)
              Erklärung:
              • Mo, Di, ... So: ZSU+ E15 bis E21, 0=AUS/1=EIN
              • Urlaub, Feiertag: E23 und E22, 0=neutral, 1=Urlaub oder Feiertag, -1= kein Urlaub oder kein Feiertag
                weiter E25 und E24 mit Ausgängen von Urlaub bzw. Feiertag verknüpft

              Bei diesen Lösungsansatz kann die Zeitraumlogik Ihre Vorteile voll ausspielen.

              Bei Gira ist obiger Lösungsansatz nicht möglich. Ein eigenes Interface für den Endnutzer ist nicht möglich.

              Wesentlicher VORTEIL der Zeitraumlogik ist, dass bei einen Restart des Homeserver diese funktioniert. Die Gira UZSU aber nicht.

              Die Gira Lösung ist nach meiner Sicht nicht der wirkliche Knaller für obige Lösung. Ein Restart kann immer
              wieder vorkommen. Wenn diese Schaltung für einen kommerziellen Betrieb notwendig ist, ist die Gira-Lösung daher nach meiner Sicht ungeeignet.

              Ich glaube an einen Mischansatz. Standardisierte ZSUen + individualisierte Lösungen (wie oben beschrieben).

              Hans
              Zuletzt geändert von TirochH; 21.06.2017, 09:10.
              Hans

              Kommentar


                #67
                Zitat von windy75 Beitrag anzeigen
                Wollte einen Teil meiner eigenen Fragen gleich mal selbst beantworten:
                Urlaub und Feiertag in den Schaltuhren haben drei Zustände (der Wechsel läuft eben nicht übers "Toggeln" - hatte ich übersehen, sorry).
                Urlaub PLUS: Schaltuhr schaltet im Urlaub
                Urlaub MINUS: Schaltuhr schaltet nicht im Urlaub
                Urlaub (neutral): Schaltuhr schaltet, egal ob Urlaub anliegt oder nicht
                Gleiches gilt für Feiertage.

                Viele Grüße
                Tom
                Übrigens, habe Dein Posting nochmals gelesen.
                Stimmt doch nicht .
                Urlaub "-1" heißt: es wird nur geschaltet, wenn dieser Tag kein Urlaubstag ist. Dieselben Regeln gelten für Feiertage.

                Hans
                Hans

                Kommentar


                  #68
                  Zitat von Andreas1986 Beitrag anzeigen
                  Andreas: so könnte das Festtagsmodul ausschauen
                  Gruss Hans
                  Code:
                  # -*- coding: iso8859-1 -*-
                  ### (c) Hans Tiroch, September 2016
                  ### -----------------------------------------------------------
                  ### Festtage, siehe Baustein 16760 - Hoegg Peter
                  ### - Schreibweise und Vorbelegung Festtagsnamen nach österreichischen Normen
                  ### - fehlender NationalFesttag und fehlende LandesFesttage bei Custom aufgenommen
                  ### -----------------------------------------------------------
                  ### V0.5  Logikfehler
                  ### V0.4  Logikumbau bei Sa/So als Festtag gegenüber Ursprungsbaustein (funktioniert jetzt)
                  ###       Zeitumstellungslogik adaptiert
                  ### V1.0  Final 
                  ###       Filter Werte -1 herausfiltern
                  ###       4. Adventsonntag Berechnung korrigiert
                  ### V1.1  timedelta via lambda
                  ### -----------------------------------------------------------
                  
                  #################
                  ### Festtage ###
                  #################
                  
                  ### 5000 Definition für HS/FS-Experte
                  ### 5000|Bezeichnung|Remanent (0=nein/1=ja)|Anz.Eingänge|.n.|Anzahl Ausgänge|.n.|Version
                  ### -----------------------------------------------------------
                  5000|"Zeit-Funktionen\Festtage(15060)"|0|75|"E1 Debug lfd. Tag TT.MM.JJ"|"E2 SA als Festtag (0/1)"|"E3 SO als Festtag (0/1)"|"E4 Vorlauf Voralarm (Tage)"|"F1  Custom (TT.MM;I;Name)"|"F2  Custom (TT.MM;I;Name)"|"F3  Custom (TT.MM;I;Name)"|"F4  Custom (TT.MM;I;Name)"|"F5  Custom (TT.MM;I;Name)"|"F6  Custom (TT.MM;I;Name)"|"F7  Custom (TT.MM;I;Name)"|"F8  Custom (TT.MM;I;Name)"|"F9 Custom (TT.MM;I;Name)"|"F10 Custom (TT.MM;I;Name)"|"F11 Custom (TT.MM;I;Name)"|"F12 Custom (TT.MM;I;Name)"|"F13 Custom (TT.MM;I;Name)"|"F14 Custom (TT.MM;I;Name)"|"F15 Custom (TT.MM;I;Name)"|"F16 Custom (TT.MM;I;Name)"|"F17 Custom (TT.MM;I;Name)"|"F18 Custom (TT.MM;I;Name)"|"F19 Custom (TT.MM;I;Name)"|"F20 Custom (TT.MM;I;Name)"|"F21 Custom (TT.MM;I;Name)"|"F22 Custom (TT.MM;I;Name)"|"F23 Custom (TT.MM;I;Name)"|"F24 Custom (TT.MM;I;Name)"|"F25 Custom (TT.MM;I;Name)"|"F26 Custom (TT.MM;I;Name)"|"F27 Custom (TT.MM;I;Name)"|"F28 Custom (TT.MM;I;Name)"|"F29 Custom (TT.MM;I;Name)"|"F30 Custom (TT.MM;I;Name)"|"F31 Custom (TT.MM;I;Name)"|"F32 Custom (TT.MM;I;Name)"|"F33 Custom (TT.MM;I;Name)"|"F34 Custom (TT.MM;I;Name)"|"F35 Custom (TT.MM;I;Name)"|"F36 Custom (TT.MM;I;Name)"|"F37 Custom (TT.MM;I;Name)"|"F38 Custom (TT.MM;I;Name)"|"F39 Custom (TT.MM;I;Name)"|"F40 Custom (TT.MM;I;Name)"|"F41 Custom (TT.MM;I;Name)"|"F42 Custom (TT.MM;I;Name)"|"F43 Custom (TT.MM;I;Name)"|"F44 Custom (TT.MM;I;Name)"|"F45 Custom (TT.MM;I;Name)"|"F46 Custom (TT.MM;I;Name)"|"F47 Custom (TT.MM;I;Name)"|"F48 Custom (TT.MM;I;Name)"|"F49 Custom (TT.MM;I;Name)"|"F50 Custom (TT.MM;I;Name)"|7|"A1 Festtag Schalter(0/1)"|"A2 Festtag Name (Txt)"|"A3 Voralarm (0/1)"|"A4 Voralarm Name (Txt)"|"A5 Datum nächster Festtag (Txt)"|"A6 Name nächster Festtag (Txt)"|"A7 Tage bis nächster Festtag (Num / max 365)"|"V1.0"
                  
                  ### 5001 Definition des Bausteins
                  ### -----------------------------------------------------------
                  ###  Anz.Eingänge
                  ###  | Anz.Ausgänge
                  ###  |  | Anz.Zeitspeicher
                  ###  |  | | Anz.Speicher
                  ###  |  | | |  Berechnung bei Init
                  ###  |  | | |  |  
                  5001|52|7|1|32|1
                  
                  ### 5002 Definition der Eingänge EN[index]
                  ### -----------------------------------------------------------
                  ### Initwert:
                  ### -1 Festtag wird ignoriert
                  ###  0 Namezeigen
                  ###  1 Festtagbit + Namenzeigen
                  ###  2 kein Festtagbit + Namenzeigen + Voralarm
                  ###  3 Festtagbit + Namenzeigen + Voralarm
                  ### -----------------------------------------------------------
                  ###  Index Eingang
                  ###  | Initwert (bei Text in "")
                  ###  | |  Datenformat (0=Numerisch/1=Text)
                  ###  | |  | 
                  5002|1|''|1   # Debug lfd. Tag
                  5002|2|3|0    # Vorlauf Voralarm
                  
                  5002|3|"TT.MM;-1;Custom"|1          # Custom 1 Datum,zeigen/melden,Name
                  5002|4|"TT.MM;-1;Custom"|1          # Custom 2 Datum,zeigen/melden,Name
                  5002|5|"TT.MM;-1;Custom"|1          # Custom 3 Datum,zeigen/melden,Name
                  5002|6|"TT.MM;-1;Custom"|1          # Custom 4 Datum,zeigen/melden,Name
                  5002|7|"TT.MM;-1;Custom"|1          # Custom 5 Datum,zeigen/melden,Name
                  5002|8|"TT.MM;-1;Custom"|1          # Custom 6 Datum,zeigen/melden,Name
                  5002|9|"TT.MM;-1;Custom"|1          # Custom 7 Datum,zeigen/melden,Name
                  5002|10|"TT.MM;-1;Custom"|1          # Custom 8 Datum,zeigen/melden,Name
                  5002|11|"TT.MM;-1;Custom"|1          # Custom 9 Datum,zeigen/melden,Name
                  5002|12|"TT.MM;-1;Custom"|1          # Custom 10 Datum,zeigen/melden,Name
                  5002|13|"TT.MM;-1;Custom"|1          # Custom 11 Datum,zeigen/melden,Name
                  5002|14|"TT.MM;-1;Custom"|1          # Custom 12 Datum,zeigen/melden,Name
                  5002|15|"TT.MM;-1;Custom"|1          # Custom 13 Datum,zeigen/melden,Name
                  5002|16|"TT.MM;-1;Custom"|1          # Custom 14 Datum,zeigen/melden,Name
                  5002|17|"TT.MM;-1;Custom"|1          # Custom 15 Datum,zeigen/melden,Name
                  5002|18|"TT.MM;-1;Custom"|1          # Custom 16 Datum,zeigen/melden,Name
                  5002|19|"TT.MM;-1;Custom"|1          # Custom 17 Datum,zeigen/melden,Name
                  5002|20|"TT.MM;-1;Custom"|1          # Custom 18 Datum,zeigen/melden,Name
                  5002|21|"TT.MM;-1;Custom"|1          # Custom 19 Datum,zeigen/melden,Name
                  5002|22|"TT.MM;-1;Custom"|1          # Custom 20 Datum,zeigen/melden,Name
                  5002|23|"TT.MM;-1;Custom"|1          # Custom 21 Datum,zeigen/melden,Name
                  5002|24|"TT.MM;-1;Custom"|1          # Custom 22 Datum,zeigen/melden,Name
                  5002|25|"TT.MM;-1;Custom"|1          # Custom 23 Datum,zeigen/melden,Name
                  5002|26|"TT.MM;-1;Custom"|1          # Custom 24 Datum,zeigen/melden,Name
                  5002|27|"TT.MM;-1;Custom"|1          # Custom 25 Datum,zeigen/melden,Name
                  5002|28|"TT.MM;-1;Custom"|1          # Custom 26 Datum,zeigen/melden,Name
                  5002|29|"TT.MM;-1;Custom"|1          # Custom 27 Datum,zeigen/melden,Name
                  5002|30|"TT.MM;-1;Custom"|1          # Custom 28 Datum,zeigen/melden,Name
                  5002|31|"TT.MM;-1;Custom"|1          # Custom 29 Datum,zeigen/melden,Name
                  5002|32|"TT.MM;-1;Custom"|1          # Custom 30 Datum,zeigen/melden,Name
                  5002|33|"TT.MM;-1;Custom"|1          # Custom 31 Datum,zeigen/melden,Name
                  5002|34|"TT.MM;-1;Custom"|1          # Custom 32 Datum,zeigen/melden,Name
                  5002|35|"TT.MM;-1;Custom"|1          # Custom 33 Datum,zeigen/melden,Name
                  5002|36|"TT.MM;-1;Custom"|1          # Custom 34 Datum,zeigen/melden,Name
                  5002|37|"TT.MM;-1;Custom"|1          # Custom 35 Datum,zeigen/melden,Name
                  5002|38|"TT.MM;-1;Custom"|1          # Custom 36 Datum,zeigen/melden,Name
                  5002|39|"TT.MM;-1;Custom"|1          # Custom 37 Datum,zeigen/melden,Name
                  5002|40|"TT.MM;-1;Custom"|1          # Custom 38 Datum,zeigen/melden,Name
                  5002|41|"TT.MM;-1;Custom"|1          # Custom 39 Datum,zeigen/melden,Name
                  5002|42|"TT.MM;-1;Custom"|1          # Custom 40 Datum,zeigen/melden,Name
                  5002|43|"TT.MM;-1;Custom"|1          # Custom 41 Datum,zeigen/melden,Name
                  5002|44|"TT.MM;-1;Custom"|1          # Custom 42 Datum,zeigen/melden,Name
                  5002|45|"TT.MM;-1;Custom"|1          # Custom 43 Datum,zeigen/melden,Name
                  5002|46|"TT.MM;-1;Custom"|1          # Custom 44 Datum,zeigen/melden,Name
                  5002|47|"TT.MM;-1;Custom"|1          # Custom 45 Datum,zeigen/melden,Name
                  5002|48|"TT.MM;-1;Custom"|1          # Custom 46 Datum,zeigen/melden,Name
                  5002|49|"TT.MM;-1;Custom"|1          # Custom 47 Datum,zeigen/melden,Name
                  5002|50|"TT.MM;-1;Custom"|1          # Custom 48 Datum,zeigen/melden,Name
                  5002|51|"TT.MM;-1;Custom"|1          # Custom 49 Datum,zeigen/melden,Name
                  5002|52|"TT.MM;-1;Custom"|1          # Custom 50 Datum,zeigen/melden,Name
                  
                  ### 5004 Definition der Ausgänge AN[index]
                  ### -----------------------------------------------------------
                  ###  Index Ausgang
                  ###  | Initwert (bei Text in "")
                  ###  | |  Runden binär (0=nein/1=ja)
                  ###  | |  | Typ (1-send/2-sbc)
                  ###  | |  | | Datenformat (0=Numerisch/1=Text)
                  ###  | |  | | |
                  5004|1|-1|0|2|0     # Festtag
                  5004|2|'Init'|0|2|1 # Festtag Name
                  5004|3|-1|0|2|0     # Voralarm
                  5004|4|'Init'|0|2|1 # Voralarm für Festtag
                  5004|5|'Init'|0|2|1 # nächster Festtag Datum
                  5004|6|'Init'|0|2|1 # nächster Festtag Name
                  5004|7|-1|0|2|0     # nächster Festtag Anzahl Tage
                  
                  ### 5003 Definition des Speichers SN[index]
                  ### -----------------------------------------------------------
                  ###  Index Speicher
                  ###  | Initwert (""/'' bei Text, {}/[] bei Dictionary/Liste), true/false bei Binär
                  ###  | | Remanent (0=nein/1=ja)
                  ###  | | | 
                  5003|1|0|0    # Datetime Heute
                  5003|2|0|0    # Timedelta für Voralarm
                  5003|3|''|0   # Datum Heute als String %d.%m
                  5003|4|''|0   # Datum Voralarm als String %d.%m
                  5003|5|0|0    # Aktuelles Jahr
                  5003|6|0|0    # Custom Regex
                  5003|7|0|0    # Datenbank / Dictionary
                  5003|8|0|0    # Osterberechnung 
                  5003|9|0|0    # Osterberechnung
                  5003|10|0|0   # Osterberechnung
                  5003|11|0|0   # Osterberechnung
                  5003|12|0|0   # Osterberechnung
                  5003|13|0|0   # Osterberechnung
                  5003|14|0|0   # Osterberechnung
                  5003|15|0|0   # Osterberechnung
                  5003|16|0|0   # Osterberechnung
                  5003|17|0|0   # Weihnachten
                  5003|18|0|0   # 4. Advent
                  5003|19|0|0   # 1. Mai
                  5003|20|0|0   # Muttertag
                  5003|21|0|0   # 1. Oktober für Erntedankberechnung
                  5003|22|0|0   # Erntedank
                  5003|23|0|0   # Temporäre DB Abfrage
                  5003|24|0|0   # Liste der Festtage die angezeigt werden
                  5003|25|0|0   # Liste der Festtage incl. Datum von Heute
                  5003|26|0|0   # nächster Festtag aus Liste
                  5003|27|0|0   # nächster Festtag als Datum
                  5003|28|0|0   # Samstag/Sonntag
                  5003|29|0|0   # Lambda d+td = f(d,td)
                  5003|30|0|0   # Lambda time.mktime(d.timetuple()) = f(d)
                  5003|31|0|0   # Lambda datetime.timedelta(days) = f(days)
                  5003|32|0|0   # Bedingung
                  
                  ### 5012 Definition der Formelzeile(n)
                  ### 5012|Ende wenn Bedingung <> 0 (0=nein/1=ja)|Bedingung|Formel|Zeitformel|Pin-Ausgang|Pin-Zeitsppeicher|Pin-Speicher|Pin-Neg.Ausgang
                  ### -----------------------------------------------------------
                  ### EI        1==innerhalb Init/0==außerhalb Init
                  ### x         Eingang (EA/EN) / Ausgang (AA/AN/AC) / Speicher (SA/SN/SC)
                  ### xA[index] Wert - vor Berechnung
                  ### xN[index] Wert - aktuell
                  ### xC[index] 1==Wert hat sich geändert/0==Wert hat sich nicht geändert
                  ### EC[index] 1==Telegramm eingetroffen/0==Eingang nicht aktiv
                  ### ON[index] Wert Zeitspeicher - sobald abgelaufen  
                  ### OC[index] 1==Zeitspeicher abgelaufen/0==Zeitspeicher läuft
                  ### -----------------------------------------------------------
                  
                  5012|0|"EI"|"lambda d, t: (d + (t>0 and __import__('datetime').timedelta(days=int(abs(t))) or -__import__('datetime').timedelta(days=int(abs(t))))).strftime('%m/%d')"|""|0|0|29|0 #datum+zeit(days) 
                  5012|0|"EI"|"lambda d: __import__('time').mktime((d.timetuple()))"|""|0|0|30|0    #seconds since Epoche
                  5012|0|"EI"|"lambda d: __import__('datetime').timedelta(days=int(d))"|""|0|0|31|0 #timedelta
                  
                  ## Datum auf SN[1]
                  5012|0|""|"__import__('datetime').datetime.now()"|""|0|0|1|0
                  
                  ## Debug Datum auf EN[1]
                  5012|0|"len(EN[1]) >= 6"|"__import__('datetime').datetime.strptime(EN[1],'%d.%m.%y')"|""|0|0|1|0
                  
                  ## Timer zum nächsten Datumswechsel berechnen
                  5012|0|""|""|"SN[30](SN[1].replace(hour=0,minute=0,second=0,microsecond=0)+SN[31](1)) - SN[30](SN[1])"|0|1|0|0
                  
                  ## Auf 00:00:00.000 setzen
                  5012|0|""|"SN[1].replace(hour=0,minute=0,second=0,microsecond=0)"|""|0|0|1|0
                  
                  ## Timedelta Voralarm auf SN[2]
                  5012|0|""|"SN[31](EN[4])"|""|0|0|2|0
                  
                  ## Datum String errechnen auf SN[3]
                  5012|0|""|"SN[1].strftime('%m/%d')"|""|0|0|3|0
                  
                  ## Voralarm (Datum SN[1] + Timedelta SN[2]) Datum auf SN[4]
                  5012|0|""|"(SN[1] + SN[2]).strftime('%m/%d')"|""|0|0|4|0
                  
                  ## aktuelles Jahr auf SN[5] (globale Berechnungen nur bei Jahreswechsel/Start (=SC[5]) oder bei Änderung an den Eingängen 2..n)
                  5012|0|"SN[1].year<>SN[5] or max(EC[2:])"|"SN[1].year"|""|0|0|5|0
                  
                  ## Regex und Converter für Custom Eingang 3-52
                  5012|0|"EI"|"lambda eingang: (lambda lres: len(lres) == 1 and {'{0:02d}/{1:02d}'.format(int(lres[0][1]),int(lres[0][0])):[int(lres[0][2]),lres[0][3]]} or {})(__import__('re').findall('(\d{1,2})\.(\d{1,2});([-]?\d);(.*)',eingang))"|""|0|0|6|0
                  
                  ## Datenbank leeren bei Jahreswechsel/Start
                  5012|0|"SC[5]"|"dict()"|""|0|0|7|0
                  
                  ## Custom entrys
                  5012|0|"SC[5] and len(EN[3])>8"|"SN[7].update(SN[6](EN[3]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[4])>8"|"SN[7].update(SN[6](EN[4]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[5])>8"|"SN[7].update(SN[6](EN[5]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[6])>8"|"SN[7].update(SN[6](EN[6]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[7])>8"|"SN[7].update(SN[6](EN[7]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[8])>8"|"SN[7].update(SN[6](EN[8]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[9])>8"|"SN[7].update(SN[6](EN[9]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[10])>8"|"SN[7].update(SN[6](EN[10]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[11])>8"|"SN[7].update(SN[6](EN[11]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[12])>8"|"SN[7].update(SN[6](EN[12]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[13])>8"|"SN[7].update(SN[6](EN[13]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[14])>8"|"SN[7].update(SN[6](EN[14]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[15])>8"|"SN[7].update(SN[6](EN[15]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[16])>8"|"SN[7].update(SN[6](EN[16]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[17])>8"|"SN[7].update(SN[6](EN[17]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[18])>8"|"SN[7].update(SN[6](EN[18]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[19])>8"|"SN[7].update(SN[6](EN[19]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[20])>8"|"SN[7].update(SN[6](EN[20]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[21])>8"|"SN[7].update(SN[6](EN[21]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[22])>8"|"SN[7].update(SN[6](EN[22]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[23])>8"|"SN[7].update(SN[6](EN[23]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[24])>8"|"SN[7].update(SN[6](EN[24]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[25])>8"|"SN[7].update(SN[6](EN[25]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[26])>8"|"SN[7].update(SN[6](EN[26]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[27])>8"|"SN[7].update(SN[6](EN[27]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[28])>8"|"SN[7].update(SN[6](EN[28]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[29])>8"|"SN[7].update(SN[6](EN[29]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[30])>8"|"SN[7].update(SN[6](EN[30]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[31])>8"|"SN[7].update(SN[6](EN[31]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[32])>8"|"SN[7].update(SN[6](EN[32]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[33])>8"|"SN[7].update(SN[6](EN[33]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[34])>8"|"SN[7].update(SN[6](EN[34]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[35])>8"|"SN[7].update(SN[6](EN[35]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[36])>8"|"SN[7].update(SN[6](EN[36]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[37])>8"|"SN[7].update(SN[6](EN[37]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[38])>8"|"SN[7].update(SN[6](EN[38]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[39])>8"|"SN[7].update(SN[6](EN[39]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[40])>8"|"SN[7].update(SN[6](EN[50]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[41])>8"|"SN[7].update(SN[6](EN[51]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[42])>8"|"SN[7].update(SN[6](EN[52]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[43])>8"|"SN[7].update(SN[6](EN[53]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[44])>8"|"SN[7].update(SN[6](EN[54]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[45])>8"|"SN[7].update(SN[6](EN[55]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[46])>8"|"SN[7].update(SN[6](EN[56]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[47])>8"|"SN[7].update(SN[6](EN[57]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[48])>8"|"SN[7].update(SN[6](EN[58]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[49])>8"|"SN[7].update(SN[6](EN[59]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[50])>8"|"SN[7].update(SN[6](EN[50]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[51])>8"|"SN[7].update(SN[6](EN[51]))"|""|0|0|0|0
                  5012|0|"SC[5] and len(EN[52])>8"|"SN[7].update(SN[6](EN[52]))"|""|0|0|0|0
                  
                  ## Filter  entry v[0]<0
                  5012|0|"SC[5]"|"dict((k,v) for k,v in SN[7].items() if v[0]>=0)"|""|0|0|7|0
                  
                  ### Festtag ###
                  
                  5012|0|""|"(SN[1].weekday()==5 and EN[2]==1) and [1,''] or (SN[1].weekday()==6 and EN[3]==1) and [1,''] or [-1,'']"|""|0|0|28|0
                  
                  ## Suche nach aktuellem Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                  5012|0|""|"SN[7].get(SN[3],SN[28])"|""|0|0|23|0
                  5012|0|"(SN[28][0]==1) and (SN[23][0] in [0,2])"|"[int(SN[23][0]+1),SN[23][1]]"|""|0|0|23|0
                  
                  ## Wenn Tag als Festtag dann 1 auf Ausgang 1
                  5012|0|""|"(SN[23][0] in [1,3])"|""|1|0|0|0
                  
                  ## Name des Festtags oder leerer String auf Ausgang 2
                  5012|0|""|"(SN[23][0] in [0,1,2,3]) and (SN[23][1]) or ''"|""|2|0|0|0
                  
                  ### Voralarm ###
                  
                  5012|0|""|"((SN[1]+SN[2]).weekday()==5 and EN[2]==1) and [1,''] or ((SN[1]+SN[2]).weekday()==6 and EN[3]==1) and [1,''] or [-1,'']"|""|0|0|28|0
                  
                  ## Suche nach Voralarm Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                  5012|0|""|"SN[7].get(SN[4],SN[28])"|""|0|0|23|0
                  5012|0|"(SN[28][0]==1) and (SN[23][0] in [0,2])"|"[int(SN[23][0]+1),SN[23][1]]"|""|0|0|23|0
                  
                  ## Wenn Tag als Festtag mit Voralarm dann 1 auf Ausgang 3
                  5012|0|""|"(SN[23][0] in [3])"|""|3|0|0|0
                  
                  ## Name des Festtags oder leerer String auf Ausgang 4
                  5012|0|""|"(SN[23][0] in [2,3]) and (SN[23][1]) or ''"|""|4|0|0|0
                  
                  ## Liste angezeigter Festtage
                  5012|0|""|"dict((k,v) for k,v in SN[7].items() if v[0] in [0,1,2,3])"|""|0|0|24|0
                  ## Erster Festtag im nächsten Jahr
                  5012|0|""|"SN[3] >= max(SN[24])"|""|0|0|32|0 # Bedingung + Schalter für Jahreswechsel (=1)
                  5012|0|"SN[32]"|"min(SN[24])"|""|0|0|26|0
                  ## Heutiges Datum in sortierte Liste aller Ereignisse schreiben (wenn nicht in Liste)
                  5012|0|"SN[32]==0 and SN[3] not in SN[24]"|"SN[24].update({SN[3]:[0,'']})"|""|0|0|0|0
                  5012|0|"SN[32]==0"|"sorted(SN[24])"|""|0|0|25|0
                  ## Nächster Festtag aus Liste
                  5012|0|"SN[32]==0"|"SN[25][SN[25].index(SN[3])+1]"|""|0|0|26|0
                  ## nächster Festtag als Datum (datetime-format) (+ 1 Jahr, wenn SN[32]==1)
                  5012|0|""|"__import__('datetime').datetime.strptime('{0}/{1}'.format(SN[5]+int(SN[32]),SN[26]),'%Y/%m/%d')"|""|0|0|27|0
                  
                  ## Datum des nächsten Festtags als TT.MM auf Ausgang 5
                  5012|0|""|"SN[27].strftime('%d.%m')"|""|5|0|0|0
                  ## Festtagname auf Ausgang 6
                  5012|0|""|"SN[7].get(SN[26])[1]"|""|6|0|0|0
                  ## Tage bis zum nächsten Festtag auf Ausgang 7
                  5012|0|""|"(SN[27]-SN[1]).days"|""|7|0|0|0
                  Hans

                  Kommentar


                    #69
                    Super ich danke dir Hans. Bist ein Genie. Muss mich da erst mal bisschen rein denken in die Materie.
                    Heißt das in Österreich echt Festtage?

                    Was mir aufgefallen ist für jeden der den Code von oben Kopiert:!!!!!!
                    die Zeile:
                    5000|"Zeit-Funktionen\Festtage(15060)"|0|75|"E1 Debug lfd. Tag............................................... .....
                    scheint so nicht zu passen:
                    hab das so geschrieben und jetzt gehts:
                    5000|"Zeit-Funktionen\Festtage(15060)"|0|54|"E1 Debug lfd. Tag............................................... .....


                    LG Andy

                    Kommentar


                      #70
                      Zitat von Andreas1986 Beitrag anzeigen
                      Super ich danke dir Hans. Bist ein Genie. Muss mich da erst mal bisschen rein denken in die Materie.
                      Heißt das in Österreich echt Festtage?

                      Was mir aufgefallen ist für jeden der den Code von oben Kopiert:!!!!!!
                      die Zeile:
                      5000|"Zeit-Funktionen\Festtage(15060)"|0|75|"E1 Debug lfd. Tag............................................... .....
                      scheint so nicht zu passen:
                      hab das so geschrieben und jetzt gehts:
                      5000|"Zeit-Funktionen\Festtage(15060)"|0|54|"E1 Debug lfd. Tag............................................... .....


                      LG Andy
                      eine Optimierung, hoffentlich läuft es.
                      Gruss Hans

                      Code:
                      # -*- coding: iso8859-1 -*-
                      ### (c) Hans Tiroch, Juni 2017
                      ### -----------------------------------------------------------
                      ### Festtage, basierend auf Baustein 15025 FeiertageAT
                      ### V1.0  Final 
                      ### -----------------------------------------------------------
                      
                      ################
                      ### Festtage ###
                      ################
                      
                      ### 5000 Definition für HS/FS-Experte
                      ### 5000|Bezeichnung|Remanent (0=nein/1=ja)|Anz.Eingänge|.n.|Anzahl Ausgänge|.n.|Version
                      ### -----------------------------------------------------------
                      5000|"Zeit-Funktionen\Festtage(15060)"|0|52|"E1 Debug lfd. Tag TT.MM.JJ"|"E2 Vorlauf Voralarm (Tage)"|"F1  Custom (TT.MM;I;Name)"|"F2  Custom (TT.MM;I;Name)"|"F3  Custom (TT.MM;I;Name)"|"F4  Custom (TT.MM;I;Name)"|"F5  Custom (TT.MM;I;Name)"|"F6  Custom (TT.MM;I;Name)"|"F7  Custom (TT.MM;I;Name)"|"F8  Custom (TT.MM;I;Name)"|"F9 Custom (TT.MM;I;Name)"|"F10 Custom (TT.MM;I;Name)"|"F11 Custom (TT.MM;I;Name)"|"F12 Custom (TT.MM;I;Name)"|"F13 Custom (TT.MM;I;Name)"|"F14 Custom (TT.MM;I;Name)"|"F15 Custom (TT.MM;I;Name)"|"F16 Custom (TT.MM;I;Name)"|"F17 Custom (TT.MM;I;Name)"|"F18 Custom (TT.MM;I;Name)"|"F19 Custom (TT.MM;I;Name)"|"F20 Custom (TT.MM;I;Name)"|"F21 Custom (TT.MM;I;Name)"|"F22 Custom (TT.MM;I;Name)"|"F23 Custom (TT.MM;I;Name)"|"F24 Custom (TT.MM;I;Name)"|"F25 Custom (TT.MM;I;Name)"|"F26 Custom (TT.MM;I;Name)"|"F27 Custom (TT.MM;I;Name)"|"F28 Custom (TT.MM;I;Name)"|"F29 Custom (TT.MM;I;Name)"|"F30 Custom (TT.MM;I;Name)"|"F31 Custom (TT.MM;I;Name)"|"F32 Custom (TT.MM;I;Name)"|"F33 Custom (TT.MM;I;Name)"|"F34 Custom (TT.MM;I;Name)"|"F35 Custom (TT.MM;I;Name)"|"F36 Custom (TT.MM;I;Name)"|"F37 Custom (TT.MM;I;Name)"|"F38 Custom (TT.MM;I;Name)"|"F39 Custom (TT.MM;I;Name)"|"F40 Custom (TT.MM;I;Name)"|"F41 Custom (TT.MM;I;Name)"|"F42 Custom (TT.MM;I;Name)"|"F43 Custom (TT.MM;I;Name)"|"F44 Custom (TT.MM;I;Name)"|"F45 Custom (TT.MM;I;Name)"|"F46 Custom (TT.MM;I;Name)"|"F47 Custom (TT.MM;I;Name)"|"F48 Custom (TT.MM;I;Name)"|"F49 Custom (TT.MM;I;Name)"|"F50 Custom (TT.MM;I;Name)"|7|"A1 Festtag Schalter(0/1)"|"A2 Festtag Name (Txt)"|"A3 Voralarm (0/1)"|"A4 Voralarm Name (Txt)"|"A5 Datum nächster Festtag (Txt)"|"A6 Name nächster Festtag (Txt)"|"A7 Tage bis nächster Festtag (Num / max 365)"|"V1.0"
                      
                      ### 5001 Definition des Bausteins
                      ### -----------------------------------------------------------
                      ###  Anz.Eingänge
                      ###  | Anz.Ausgänge
                      ###  |  | Anz.Zeitspeicher
                      ###  |  | | Anz.Speicher
                      ###  |  | | |  Berechnung bei Init
                      ###  |  | | |  |  
                      5001|52|7|1|16|1
                      
                      ### 5002 Definition der Eingänge EN[index]
                      ### -----------------------------------------------------------
                      ### Initwert:
                      ### -1 Festtag wird ignoriert
                      ###  0 Namezeigen
                      ###  1 Festtagbit + Namenzeigen
                      ###  2 kein Festtagbit + Namenzeigen + Voralarm
                      ###  3 Festtagbit + Namenzeigen + Voralarm
                      ### -----------------------------------------------------------
                      ###  Index Eingang
                      ###  | Initwert (bei Text in "")
                      ###  | |  Datenformat (0=Numerisch/1=Text)
                      ###  | |  | 
                      5002|1|''|1   # Debug lfd. Tag
                      5002|2|3|0    # Vorlauf Voralarm
                      
                      5002|3|"TT.MM;-1;Custom"|1           # Custom  1 Datum,zeigen/melden,Name
                      5002|4|"TT.MM;-1;Custom"|1           # Custom  2 Datum,zeigen/melden,Name
                      5002|5|"TT.MM;-1;Custom"|1           # Custom  3 Datum,zeigen/melden,Name
                      5002|6|"TT.MM;-1;Custom"|1           # Custom  4 Datum,zeigen/melden,Name
                      5002|7|"TT.MM;-1;Custom"|1           # Custom  5 Datum,zeigen/melden,Name
                      5002|8|"TT.MM;-1;Custom"|1           # Custom  6 Datum,zeigen/melden,Name
                      5002|9|"TT.MM;-1;Custom"|1           # Custom  7 Datum,zeigen/melden,Name
                      5002|10|"TT.MM;-1;Custom"|1          # Custom  8 Datum,zeigen/melden,Name
                      5002|11|"TT.MM;-1;Custom"|1          # Custom  9 Datum,zeigen/melden,Name
                      5002|12|"TT.MM;-1;Custom"|1          # Custom 10 Datum,zeigen/melden,Name
                      5002|13|"TT.MM;-1;Custom"|1          # Custom 11 Datum,zeigen/melden,Name
                      5002|14|"TT.MM;-1;Custom"|1          # Custom 12 Datum,zeigen/melden,Name
                      5002|15|"TT.MM;-1;Custom"|1          # Custom 13 Datum,zeigen/melden,Name
                      5002|16|"TT.MM;-1;Custom"|1          # Custom 14 Datum,zeigen/melden,Name
                      5002|17|"TT.MM;-1;Custom"|1          # Custom 15 Datum,zeigen/melden,Name
                      5002|18|"TT.MM;-1;Custom"|1          # Custom 16 Datum,zeigen/melden,Name
                      5002|19|"TT.MM;-1;Custom"|1          # Custom 17 Datum,zeigen/melden,Name
                      5002|20|"TT.MM;-1;Custom"|1          # Custom 18 Datum,zeigen/melden,Name
                      5002|21|"TT.MM;-1;Custom"|1          # Custom 19 Datum,zeigen/melden,Name
                      5002|22|"TT.MM;-1;Custom"|1          # Custom 20 Datum,zeigen/melden,Name
                      5002|23|"TT.MM;-1;Custom"|1          # Custom 21 Datum,zeigen/melden,Name
                      5002|24|"TT.MM;-1;Custom"|1          # Custom 22 Datum,zeigen/melden,Name
                      5002|25|"TT.MM;-1;Custom"|1          # Custom 23 Datum,zeigen/melden,Name
                      5002|26|"TT.MM;-1;Custom"|1          # Custom 24 Datum,zeigen/melden,Name
                      5002|27|"TT.MM;-1;Custom"|1          # Custom 25 Datum,zeigen/melden,Name
                      5002|28|"TT.MM;-1;Custom"|1          # Custom 26 Datum,zeigen/melden,Name
                      5002|29|"TT.MM;-1;Custom"|1          # Custom 27 Datum,zeigen/melden,Name
                      5002|30|"TT.MM;-1;Custom"|1          # Custom 28 Datum,zeigen/melden,Name
                      5002|31|"TT.MM;-1;Custom"|1          # Custom 29 Datum,zeigen/melden,Name
                      5002|32|"TT.MM;-1;Custom"|1          # Custom 30 Datum,zeigen/melden,Name
                      5002|33|"TT.MM;-1;Custom"|1          # Custom 31 Datum,zeigen/melden,Name
                      5002|34|"TT.MM;-1;Custom"|1          # Custom 32 Datum,zeigen/melden,Name
                      5002|35|"TT.MM;-1;Custom"|1          # Custom 33 Datum,zeigen/melden,Name
                      5002|36|"TT.MM;-1;Custom"|1          # Custom 34 Datum,zeigen/melden,Name
                      5002|37|"TT.MM;-1;Custom"|1          # Custom 35 Datum,zeigen/melden,Name
                      5002|38|"TT.MM;-1;Custom"|1          # Custom 36 Datum,zeigen/melden,Name
                      5002|39|"TT.MM;-1;Custom"|1          # Custom 37 Datum,zeigen/melden,Name
                      5002|40|"TT.MM;-1;Custom"|1          # Custom 38 Datum,zeigen/melden,Name
                      5002|41|"TT.MM;-1;Custom"|1          # Custom 39 Datum,zeigen/melden,Name
                      5002|42|"TT.MM;-1;Custom"|1          # Custom 40 Datum,zeigen/melden,Name
                      5002|43|"TT.MM;-1;Custom"|1          # Custom 41 Datum,zeigen/melden,Name
                      5002|44|"TT.MM;-1;Custom"|1          # Custom 42 Datum,zeigen/melden,Name
                      5002|45|"TT.MM;-1;Custom"|1          # Custom 43 Datum,zeigen/melden,Name
                      5002|46|"TT.MM;-1;Custom"|1          # Custom 44 Datum,zeigen/melden,Name
                      5002|47|"TT.MM;-1;Custom"|1          # Custom 45 Datum,zeigen/melden,Name
                      5002|48|"TT.MM;-1;Custom"|1          # Custom 46 Datum,zeigen/melden,Name
                      5002|49|"TT.MM;-1;Custom"|1          # Custom 47 Datum,zeigen/melden,Name
                      5002|50|"TT.MM;-1;Custom"|1          # Custom 48 Datum,zeigen/melden,Name
                      5002|51|"TT.MM;-1;Custom"|1          # Custom 49 Datum,zeigen/melden,Name
                      5002|52|"TT.MM;-1;Custom"|1          # Custom 50 Datum,zeigen/melden,Name
                      
                      ### 5004 Definition der Ausgänge AN[index]
                      ### -----------------------------------------------------------
                      ###  Index Ausgang
                      ###  | Initwert (bei Text in "")
                      ###  | |  Runden binär (0=nein/1=ja)
                      ###  | |  | Typ (1-send/2-sbc)
                      ###  | |  | | Datenformat (0=Numerisch/1=Text)
                      ###  | |  | | |
                      5004|1|-1|0|2|0     # Festtag
                      5004|2|'Init'|0|2|1 # Festtag Name
                      5004|3|-1|0|2|0     # Voralarm
                      5004|4|'Init'|0|2|1 # Voralarm für Festtag
                      5004|5|'Init'|0|2|1 # nächster Festtag Datum
                      5004|6|'Init'|0|2|1 # nächster Festtag Name
                      5004|7|-1|0|2|0     # nächster Festtag Anzahl Tage
                      
                      ### 5003 Definition des Speichers SN[index]
                      ### -----------------------------------------------------------
                      ###  Index Speicher
                      ###  | Initwert (""/'' bei Text, {}/[] bei Dictionary/Liste), true/false bei Binär
                      ###  | | Remanent (0=nein/1=ja)
                      ###  | | | 
                      5003|1|0|0    # Datetime Heute
                      5003|2|0|0    # Timedelta für Voralarm
                      5003|3|''|0   # Datum Heute als String %d.%m
                      5003|4|''|0   # Datum Voralarm als String %d.%m
                      5003|5|0|0    # Aktuelles Jahr
                      5003|6|0|0    # Custom Regex
                      5003|7|0|0    # Datenbank / Dictionary
                      5003|8|0|0    # Temporäre DB Abfrage
                      5003|9|0|0    # Liste der Festtage die angezeigt werden
                      5003|10|0|0   # Liste der Festtage incl. Datum von Heute
                      5003|11|0|0   # nächster Festtag aus Liste
                      5003|12|0|0   # nächster Festtag als Datum
                      5003|13|0|0   # Samstag/Sonntag
                      5003|14|0|0   # Lambda time.mktime(d.timetuple()) = f(d)
                      5003|15|0|0   # Lambda datetime.timedelta(days) = f(days)
                      5003|16|0|0   # Bedingung
                      
                      ### 5012 Definition der Formelzeile(n)
                      ### 5012|Ende wenn Bedingung <> 0 (0=nein/1=ja)|Bedingung|Formel|Zeitformel|Pin-Ausgang|Pin-Zeitsppeicher|Pin-Speicher|Pin-Neg.Ausgang
                      ### -----------------------------------------------------------
                      ### EI        1==innerhalb Init/0==außerhalb Init
                      ### x         Eingang (EA/EN) / Ausgang (AA/AN/AC) / Speicher (SA/SN/SC)
                      ### xA[index] Wert - vor Berechnung
                      ### xN[index] Wert - aktuell
                      ### xC[index] 1==Wert hat sich geändert/0==Wert hat sich nicht geändert
                      ### EC[index] 1==Telegramm eingetroffen/0==Eingang nicht aktiv
                      ### ON[index] Wert Zeitspeicher - sobald abgelaufen  
                      ### OC[index] 1==Zeitspeicher abgelaufen/0==Zeitspeicher läuft
                      ### -----------------------------------------------------------
                      
                      5012|0|"EI"|"lambda d: __import__('time').mktime((d.timetuple()))"|""|0|0|14|0    #seconds since Epoche
                      5012|0|"EI"|"lambda d: __import__('datetime').timedelta(days=int(d))"|""|0|0|15|0 #timedelta
                      
                      ## Datum auf SN[1]
                      5012|0|""|"__import__('datetime').datetime.now()"|""|0|0|1|0
                      
                      ## Debug Datum auf EN[1]
                      5012|0|"len(EN[1]) >= 6"|"__import__('datetime').datetime.strptime(EN[1],'%d.%m.%y')"|""|0|0|1|0
                      
                      ## Timer zum nächsten Datumswechsel berechnen
                      5012|0|""|""|"SN[14](SN[1].replace(hour=0,minute=0,second=0,microsecond=0)+SN[15](1)) - SN[14](SN[1])"|0|1|0|0
                      
                      ## Auf 00:00:00.000 setzen
                      5012|0|""|"SN[1].replace(hour=0,minute=0,second=0,microsecond=0)"|""|0|0|1|0
                      
                      ## Timedelta Voralarm auf SN[2]
                      5012|0|""|"SN[15](EN[2])"|""|0|0|2|0
                      
                      ## Datum String errechnen auf SN[3]
                      5012|0|""|"SN[1].strftime('%m/%d')"|""|0|0|3|0
                      
                      ## Voralarm (Datum SN[1] + Timedelta SN[2]) Datum auf SN[4]
                      5012|0|""|"(SN[1] + SN[2]).strftime('%m/%d')"|""|0|0|4|0
                      
                      ## aktuelles Jahr auf SN[5] (globale Berechnungen nur bei Jahreswechsel/Start (=SC[5]) oder bei Änderung an den Eingängen 2..n)
                      5012|0|"SN[1].year<>SN[5] or max(EC[2:])"|"SN[1].year"|""|0|0|5|0
                      
                      ## Regex und Converter für Custom Eingang 3-52
                      5012|0|"EI"|"lambda eingang: (lambda lres: len(lres) == 1 and {'{0:02d}/{1:02d}'.format(int(lres[0][1]),int(lres[0][0])):[int(lres[0][2]),lres[0][3]]} or {})(__import__('re').findall('(\d{1,2})\.(\d{1,2});([-]?\d);(.*)',eingang))"|""|0|0|6|0
                      
                      ## Datenbank leeren bei Jahreswechsel/Start
                      5012|0|"SC[5]"|"dict()"|""|0|0|7|0
                      
                      ## Custom entrys 3-52
                      5012|0|"SC[5]"|"map(lambda i: SN[7].update(SN[6](EN[i])),filter(lambda x: len(EN[x])<=8,range(3,53)))"|""|0|0|0|0
                      
                      ## Filter  entry v[0]<0
                      5012|0|"SC[5]"|"dict((k,v) for k,v in SN[7].items() if v[0]>=0)"|""|0|0|7|0
                      
                      ### Festtag ###
                      
                      5012|0|""|"[-1,'']"|""|0|0|13|0
                      
                      ## Suche nach aktuellem Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                      5012|0|""|"SN[7].get(SN[3],SN[13])"|""|0|0|8|0
                      5012|0|"(SN[13][0]==1) and (SN[8][0] in [0,2])"|"[int(SN[8][0]+1),SN[8][1]]"|""|0|0|8|0
                      
                      ## Wenn Tag als Festtag dann 1 auf Ausgang 1
                      5012|0|""|"(SN[8][0] in [1,3])"|""|1|0|0|0
                      
                      ## Name des Festtags oder leerer String auf Ausgang 2
                      5012|0|""|"(SN[8][0] in [0,1,2,3]) and (SN[8][1]) or ''"|""|2|0|0|0
                      
                      ### Voralarm ###
                      
                      5012|0|""|"[-1,'']"|""|0|0|13|0
                      
                      ## Suche nach Voralarm Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                      5012|0|""|"SN[7].get(SN[4],SN[13])"|""|0|0|8|0
                      5012|0|"(SN[13][0]==1) and (SN[8][0] in [0,2])"|"[int(SN[8][0]+1),SN[8][1]]"|""|0|0|8|0
                      
                      ## Wenn Tag als Festtag mit Voralarm dann 1 auf Ausgang 3
                      5012|0|""|"(SN[8][0] in [3])"|""|3|0|0|0
                      
                      ## Name des Festtags oder leerer String auf Ausgang 4
                      5012|0|""|"(SN[8][0] in [2,3]) and (SN[8][1]) or ''"|""|4|0|0|0
                      
                      ## Liste angezeigter Festtage
                      5012|0|""|"dict((k,v) for k,v in SN[7].items() if v[0] in [0,1,2,3])"|""|0|0|9|0
                      ## Erster Festtag im nächsten Jahr
                      5012|0|""|"SN[3] >= max(SN[9])"|""|0|0|16|0 # Bedingung + Schalter für Jahreswechsel (=1)
                      5012|0|"SN[13]"|"min(SN[9])"|""|0|0|11|0
                      ## Heutiges Datum in sortierte Liste aller Ereignisse schreiben (wenn nicht in Liste)
                      5012|0|"SN[16]==0 and SN[3] not in SN[9]"|"SN[9].update({SN[3]:[0,'']})"|""|0|0|0|0
                      5012|0|"SN[16]==0"|"sorted(SN[9])"|""|0|0|10|0
                      ## Nächster Festtag aus Liste
                      5012|0|"SN[16]==0"|"SN[10][SN[10].index(SN[3])+1]"|""|0|0|11|0
                      ## nächster Festtag als Datum (datetime-format) (+ 1 Jahr, wenn SN[16]==1)
                      5012|0|""|"__import__('datetime').datetime.strptime('{0}/{1}'.format(SN[5]+int(SN[16]),SN[11]),'%Y/%m/%d')"|""|0|0|12|0
                      
                      ## Datum des nächsten Festtags als TT.MM auf Ausgang 5
                      5012|0|""|"SN[12].strftime('%d.%m')"|""|5|0|0|0
                      ## Festtagname auf Ausgang 6
                      5012|0|""|"SN[7].get(SN[11])[1]"|""|6|0|0|0
                      ## Tage bis zum nächsten Festtag auf Ausgang 7
                      5012|0|""|"(SN[12]-SN[1]).days"|""|7|0|0|0
                      Zuletzt geändert von TirochH; 23.06.2017, 10:38.
                      Hans

                      Kommentar


                        #71
                        Sry mein Fehler


                        LG Andy
                        Zuletzt geändert von Andreas1986; 24.06.2017, 08:33.

                        Kommentar


                          #72
                          Zitat von Andreas1986 Beitrag anzeigen
                          Sry mein Fehler


                          LG Andy
                          jetzt fehlerfrei

                          Hans

                          Code:
                          # -*- coding: iso8859-1 -*-
                          ### (c) Hans Tiroch, Juni 2017
                          ### -----------------------------------------------------------
                          ### Festtage, basierend auf Baustein 15025 FeiertageAT
                          ### V1.0  Final 
                          ### -----------------------------------------------------------
                          
                          ################
                          ### Festtage ###
                          ################
                          
                          ### 5000 Definition für HS/FS-Experte
                          ### 5000|Bezeichnung|Remanent (0=nein/1=ja)|Anz.Eingänge|.n.|Anzahl Ausgänge|.n.|Version
                          ### -----------------------------------------------------------
                          5000|"Zeit-Funktionen\Festtage(15060)"|0|52|"E1 Debug lfd. Tag TT.MM.JJ"|"E2 Vorlauf Voralarm (Tage)"|"F1  Custom (TT.MM;I;Name)"|"F2  Custom (TT.MM;I;Name)"|"F3  Custom (TT.MM;I;Name)"|"F4  Custom (TT.MM;I;Name)"|"F5  Custom (TT.MM;I;Name)"|"F6  Custom (TT.MM;I;Name)"|"F7  Custom (TT.MM;I;Name)"|"F8  Custom (TT.MM;I;Name)"|"F9 Custom (TT.MM;I;Name)"|"F10 Custom (TT.MM;I;Name)"|"F11 Custom (TT.MM;I;Name)"|"F12 Custom (TT.MM;I;Name)"|"F13 Custom (TT.MM;I;Name)"|"F14 Custom (TT.MM;I;Name)"|"F15 Custom (TT.MM;I;Name)"|"F16 Custom (TT.MM;I;Name)"|"F17 Custom (TT.MM;I;Name)"|"F18 Custom (TT.MM;I;Name)"|"F19 Custom (TT.MM;I;Name)"|"F20 Custom (TT.MM;I;Name)"|"F21 Custom (TT.MM;I;Name)"|"F22 Custom (TT.MM;I;Name)"|"F23 Custom (TT.MM;I;Name)"|"F24 Custom (TT.MM;I;Name)"|"F25 Custom (TT.MM;I;Name)"|"F26 Custom (TT.MM;I;Name)"|"F27 Custom (TT.MM;I;Name)"|"F28 Custom (TT.MM;I;Name)"|"F29 Custom (TT.MM;I;Name)"|"F30 Custom (TT.MM;I;Name)"|"F31 Custom (TT.MM;I;Name)"|"F32 Custom (TT.MM;I;Name)"|"F33 Custom (TT.MM;I;Name)"|"F34 Custom (TT.MM;I;Name)"|"F35 Custom (TT.MM;I;Name)"|"F36 Custom (TT.MM;I;Name)"|"F37 Custom (TT.MM;I;Name)"|"F38 Custom (TT.MM;I;Name)"|"F39 Custom (TT.MM;I;Name)"|"F40 Custom (TT.MM;I;Name)"|"F41 Custom (TT.MM;I;Name)"|"F42 Custom (TT.MM;I;Name)"|"F43 Custom (TT.MM;I;Name)"|"F44 Custom (TT.MM;I;Name)"|"F45 Custom (TT.MM;I;Name)"|"F46 Custom (TT.MM;I;Name)"|"F47 Custom (TT.MM;I;Name)"|"F48 Custom (TT.MM;I;Name)"|"F49 Custom (TT.MM;I;Name)"|"F50 Custom (TT.MM;I;Name)"|7|"A1 Festtag Schalter(0/1)"|"A2 Festtag Name (Txt)"|"A3 Voralarm (0/1)"|"A4 Voralarm Name (Txt)"|"A5 Datum nächster Festtag (Txt)"|"A6 Name nächster Festtag (Txt)"|"A7 Tage bis nächster Festtag (Num / max 365)"|"V1.0"
                          
                          ### 5001 Definition des Bausteins
                          ### -----------------------------------------------------------
                          ###  Anz.Eingänge
                          ###  | Anz.Ausgänge
                          ###  |  | Anz.Zeitspeicher
                          ###  |  | | Anz.Speicher
                          ###  |  | | |  Berechnung bei Init
                          ###  |  | | |  |  
                          5001|52|7|1|16|1
                          
                          ### 5002 Definition der Eingänge EN[index]
                          ### -----------------------------------------------------------
                          ### Initwert:
                          ### -1 Festtag wird ignoriert
                          ###  0 Namezeigen
                          ###  1 Festtagbit + Namenzeigen
                          ###  2 kein Festtagbit + Namenzeigen + Voralarm
                          ###  3 Festtagbit + Namenzeigen + Voralarm
                          ### -----------------------------------------------------------
                          ###  Index Eingang
                          ###  | Initwert (bei Text in "")
                          ###  | |  Datenformat (0=Numerisch/1=Text)
                          ###  | |  | 
                          5002|1|''|1   # Debug lfd. Tag
                          5002|2|3|0    # Vorlauf Voralarm
                          
                          5002|3|"TT.MM;-1;Custom"|1           # Custom  1 Datum,zeigen/melden,Name
                          5002|4|"TT.MM;-1;Custom"|1           # Custom  2 Datum,zeigen/melden,Name
                          5002|5|"TT.MM;-1;Custom"|1           # Custom  3 Datum,zeigen/melden,Name
                          5002|6|"TT.MM;-1;Custom"|1           # Custom  4 Datum,zeigen/melden,Name
                          5002|7|"TT.MM;-1;Custom"|1           # Custom  5 Datum,zeigen/melden,Name
                          5002|8|"TT.MM;-1;Custom"|1           # Custom  6 Datum,zeigen/melden,Name
                          5002|9|"TT.MM;-1;Custom"|1           # Custom  7 Datum,zeigen/melden,Name
                          5002|10|"TT.MM;-1;Custom"|1          # Custom  8 Datum,zeigen/melden,Name
                          5002|11|"TT.MM;-1;Custom"|1          # Custom  9 Datum,zeigen/melden,Name
                          5002|12|"TT.MM;-1;Custom"|1          # Custom 10 Datum,zeigen/melden,Name
                          5002|13|"TT.MM;-1;Custom"|1          # Custom 11 Datum,zeigen/melden,Name
                          5002|14|"TT.MM;-1;Custom"|1          # Custom 12 Datum,zeigen/melden,Name
                          5002|15|"TT.MM;-1;Custom"|1          # Custom 13 Datum,zeigen/melden,Name
                          5002|16|"TT.MM;-1;Custom"|1          # Custom 14 Datum,zeigen/melden,Name
                          5002|17|"TT.MM;-1;Custom"|1          # Custom 15 Datum,zeigen/melden,Name
                          5002|18|"TT.MM;-1;Custom"|1          # Custom 16 Datum,zeigen/melden,Name
                          5002|19|"TT.MM;-1;Custom"|1          # Custom 17 Datum,zeigen/melden,Name
                          5002|20|"TT.MM;-1;Custom"|1          # Custom 18 Datum,zeigen/melden,Name
                          5002|21|"TT.MM;-1;Custom"|1          # Custom 19 Datum,zeigen/melden,Name
                          5002|22|"TT.MM;-1;Custom"|1          # Custom 20 Datum,zeigen/melden,Name
                          5002|23|"TT.MM;-1;Custom"|1          # Custom 21 Datum,zeigen/melden,Name
                          5002|24|"TT.MM;-1;Custom"|1          # Custom 22 Datum,zeigen/melden,Name
                          5002|25|"TT.MM;-1;Custom"|1          # Custom 23 Datum,zeigen/melden,Name
                          5002|26|"TT.MM;-1;Custom"|1          # Custom 24 Datum,zeigen/melden,Name
                          5002|27|"TT.MM;-1;Custom"|1          # Custom 25 Datum,zeigen/melden,Name
                          5002|28|"TT.MM;-1;Custom"|1          # Custom 26 Datum,zeigen/melden,Name
                          5002|29|"TT.MM;-1;Custom"|1          # Custom 27 Datum,zeigen/melden,Name
                          5002|30|"TT.MM;-1;Custom"|1          # Custom 28 Datum,zeigen/melden,Name
                          5002|31|"TT.MM;-1;Custom"|1          # Custom 29 Datum,zeigen/melden,Name
                          5002|32|"TT.MM;-1;Custom"|1          # Custom 30 Datum,zeigen/melden,Name
                          5002|33|"TT.MM;-1;Custom"|1          # Custom 31 Datum,zeigen/melden,Name
                          5002|34|"TT.MM;-1;Custom"|1          # Custom 32 Datum,zeigen/melden,Name
                          5002|35|"TT.MM;-1;Custom"|1          # Custom 33 Datum,zeigen/melden,Name
                          5002|36|"TT.MM;-1;Custom"|1          # Custom 34 Datum,zeigen/melden,Name
                          5002|37|"TT.MM;-1;Custom"|1          # Custom 35 Datum,zeigen/melden,Name
                          5002|38|"TT.MM;-1;Custom"|1          # Custom 36 Datum,zeigen/melden,Name
                          5002|39|"TT.MM;-1;Custom"|1          # Custom 37 Datum,zeigen/melden,Name
                          5002|40|"TT.MM;-1;Custom"|1          # Custom 38 Datum,zeigen/melden,Name
                          5002|41|"TT.MM;-1;Custom"|1          # Custom 39 Datum,zeigen/melden,Name
                          5002|42|"TT.MM;-1;Custom"|1          # Custom 40 Datum,zeigen/melden,Name
                          5002|43|"TT.MM;-1;Custom"|1          # Custom 41 Datum,zeigen/melden,Name
                          5002|44|"TT.MM;-1;Custom"|1          # Custom 42 Datum,zeigen/melden,Name
                          5002|45|"TT.MM;-1;Custom"|1          # Custom 43 Datum,zeigen/melden,Name
                          5002|46|"TT.MM;-1;Custom"|1          # Custom 44 Datum,zeigen/melden,Name
                          5002|47|"TT.MM;-1;Custom"|1          # Custom 45 Datum,zeigen/melden,Name
                          5002|48|"TT.MM;-1;Custom"|1          # Custom 46 Datum,zeigen/melden,Name
                          5002|49|"TT.MM;-1;Custom"|1          # Custom 47 Datum,zeigen/melden,Name
                          5002|50|"TT.MM;-1;Custom"|1          # Custom 48 Datum,zeigen/melden,Name
                          5002|51|"TT.MM;-1;Custom"|1          # Custom 49 Datum,zeigen/melden,Name
                          5002|52|"TT.MM;-1;Custom"|1          # Custom 50 Datum,zeigen/melden,Name
                          
                          ### 5004 Definition der Ausgänge AN[index]
                          ### -----------------------------------------------------------
                          ###  Index Ausgang
                          ###  | Initwert (bei Text in "")
                          ###  | |  Runden binär (0=nein/1=ja)
                          ###  | |  | Typ (1-send/2-sbc)
                          ###  | |  | | Datenformat (0=Numerisch/1=Text)
                          ###  | |  | | |
                          5004|1|-1|0|2|0     # Festtag
                          5004|2|'Init'|0|2|1 # Festtag Name
                          5004|3|-1|0|2|0     # Voralarm
                          5004|4|'Init'|0|2|1 # Voralarm für Festtag
                          5004|5|'Init'|0|2|1 # nächster Festtag Datum
                          5004|6|'Init'|0|2|1 # nächster Festtag Name
                          5004|7|-1|0|2|0     # nächster Festtag Anzahl Tage
                          
                          ### 5003 Definition des Speichers SN[index]
                          ### -----------------------------------------------------------
                          ###  Index Speicher
                          ###  | Initwert (""/'' bei Text, {}/[] bei Dictionary/Liste), true/false bei Binär
                          ###  | | Remanent (0=nein/1=ja)
                          ###  | | | 
                          5003|1|0|0    # Datetime Heute
                          5003|2|0|0    # Timedelta für Voralarm
                          5003|3|''|0   # Datum Heute als String %d.%m
                          5003|4|''|0   # Datum Voralarm als String %d.%m
                          5003|5|0|0    # Aktuelles Jahr
                          5003|6|0|0    # Custom Regex
                          5003|7|0|0    # Datenbank / Dictionary
                          5003|8|0|0    # Temporäre DB Abfrage
                          5003|9|0|0    # Liste der Festtage die angezeigt werden
                          5003|10|0|0   # Liste der Festtage incl. Datum von Heute
                          5003|11|0|0   # nächster Festtag aus Liste
                          5003|12|0|0   # nächster Festtag als Datum
                          5003|13|0|0   # Samstag/Sonntag
                          5003|14|0|0   # Lambda time.mktime(d.timetuple()) = f(d)
                          5003|15|0|0   # Lambda datetime.timedelta(days) = f(days)
                          5003|16|0|0   # Bedingung
                          
                          ### 5012 Definition der Formelzeile(n)
                          ### 5012|Ende wenn Bedingung <> 0 (0=nein/1=ja)|Bedingung|Formel|Zeitformel|Pin-Ausgang|Pin-Zeitsppeicher|Pin-Speicher|Pin-Neg.Ausgang
                          ### -----------------------------------------------------------
                          ### EI        1==innerhalb Init/0==außerhalb Init
                          ### x         Eingang (EA/EN) / Ausgang (AA/AN/AC) / Speicher (SA/SN/SC)
                          ### xA[index] Wert - vor Berechnung
                          ### xN[index] Wert - aktuell
                          ### xC[index] 1==Wert hat sich geändert/0==Wert hat sich nicht geändert
                          ### EC[index] 1==Telegramm eingetroffen/0==Eingang nicht aktiv
                          ### ON[index] Wert Zeitspeicher - sobald abgelaufen  
                          ### OC[index] 1==Zeitspeicher abgelaufen/0==Zeitspeicher läuft
                          ### -----------------------------------------------------------
                          
                          5012|0|"EI"|"lambda d: __import__('time').mktime((d.timetuple()))"|""|0|0|14|0    #seconds since Epoche
                          5012|0|"EI"|"lambda d: __import__('datetime').timedelta(days=int(d))"|""|0|0|15|0 #timedelta
                          
                          ## Datum auf SN[1]
                          5012|0|""|"__import__('datetime').datetime.now()"|""|0|0|1|0
                          
                          ## Debug Datum auf EN[1]
                          5012|0|"len(EN[1]) >= 6"|"__import__('datetime').datetime.strptime(EN[1],'%d.%m.%y')"|""|0|0|1|0
                          
                          ## Timer zum nächsten Datumswechsel berechnen
                          5012|0|""|""|"SN[14](SN[1].replace(hour=0,minute=0,second=0,microsecond=0)+SN[15](1)) - SN[14](SN[1])"|0|1|0|0
                          
                          ## Auf 00:00:00.000 setzen
                          5012|0|""|"SN[1].replace(hour=0,minute=0,second=0,microsecond=0)"|""|0|0|1|0
                          
                          ## Timedelta Voralarm auf SN[2]
                          5012|0|""|"SN[15](EN[2])"|""|0|0|2|0
                          
                          ## Datum String errechnen auf SN[3]
                          5012|0|""|"SN[1].strftime('%m/%d')"|""|0|0|3|0
                          
                          ## Voralarm (Datum SN[1] + Timedelta SN[2]) Datum auf SN[4]
                          5012|0|""|"(SN[1] + SN[2]).strftime('%m/%d')"|""|0|0|4|0
                          
                          ## aktuelles Jahr auf SN[5] (globale Berechnungen nur bei Jahreswechsel/Start (=SC[5]) oder bei Änderung an den Eingängen 2..n)
                          5012|0|"SN[1].year<>SN[5] or max(EC[2:])"|"SN[1].year"|""|0|0|5|0
                          
                          ## Regex und Converter für Custom Eingang 3-52
                          5012|0|"EI"|"lambda eingang: (lambda lres: len(lres) == 1 and {'{0:02d}/{1:02d}'.format(int(lres[0][1]),int(lres[0][0])):[int(lres[0][2]),lres[0][3]]} or {})(__import__('re').findall('(\d{1,2})\.(\d{1,2});([-]?\d);(.*)',eingang))"|""|0|0|6|0
                          
                          ## Datenbank leeren bei Jahreswechsel/Start
                          5012|0|"SC[5]"|"dict()"|""|0|0|7|0
                          
                          ## Custom entrys 3-52
                          #5012|0|"SC[5]"|"map(lambda i: SN[7].update(SN[6](EN[i])),filter(lambda x: len(EN[x])>8,range(3,53)))"|""|0|0|0|0
                          5012|0|"SC[5]"|"[SN[7].update(SN[6](EN[i])) for i in range(3,53) if len(EN[i])>8]"|""|0|0|0|0
                          
                          ## Filter  entry v[0]<0
                          5012|0|"SC[5]"|"dict((k,v) for k,v in SN[7].items() if v[0]>=0)"|""|0|0|7|0
                          
                          ### Festtag ###
                          
                          5012|0|""|"[-1,'']"|""|0|0|13|0 #Samstag, Sonntag
                          
                          ## Suche nach aktuellem Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                          5012|0|""|"SN[7].get(SN[3],SN[13])"|""|0|0|8|0
                          5012|0|"(SN[13][0]==1) and (SN[8][0] in [0,2])"|"[int(SN[8][0]+1),SN[8][1]]"|""|0|0|8|0
                          
                          ## Wenn Tag als Festtag dann 1 auf Ausgang 1
                          5012|0|""|"(SN[8][0] in [1,3])"|""|1|0|0|0
                          
                          ## Name des Festtags oder leerer String auf Ausgang 2
                          5012|0|""|"(SN[8][0] in [0,1,2,3]) and (SN[8][1]) or ''"|""|2|0|0|0
                          
                          ### Voralarm ###
                          
                          5012|0|""|"[-1,'']"|""|0|0|13|0
                          
                          ## Suche nach Voralarm Datum in DB sonst -1 für kein Festtag setzen und '' für Festtag Text
                          5012|0|""|"SN[7].get(SN[4],SN[13])"|""|0|0|8|0
                          5012|0|"(SN[13][0]==1) and (SN[8][0] in [0,2])"|"[int(SN[8][0]+1),SN[8][1]]"|""|0|0|8|0
                          
                          ## Wenn Tag als Festtag mit Voralarm dann 1 auf Ausgang 3
                          5012|0|""|"(SN[8][0] in [3])"|""|3|0|0|0
                          
                          ## Name des Festtags oder leerer String auf Ausgang 4
                          5012|0|""|"(SN[8][0] in [2,3]) and (SN[8][1]) or ''"|""|4|0|0|0
                          
                          ## Liste angezeigter Festtage
                          5012|0|""|"dict((k,v) for k,v in SN[7].items() if v[0] in [0,1,2,3])"|""|0|0|9|0
                          
                          ## leer - Abbruch
                          5012|1|"len(SN[9])==0"|""|""|0|0|0|0
                          
                          ## Erster Festtag im nächsten Jahr
                          5012|0|""|"SN[3] >= max(SN[9])"|""|0|0|16|0 # Bedingung + Schalter für Jahreswechsel (=1)
                          5012|0|"SN[16]"|"min(SN[9])"|""|0|0|11|0
                          ## Heutiges Datum in sortierte Liste aller Ereignisse schreiben (wenn nicht in Liste)
                          5012|0|"SN[16]==0 and SN[3] not in SN[9]"|"SN[9].update({SN[3]:[0,'']})"|""|0|0|0|0
                          5012|0|"SN[16]==0"|"sorted(SN[9])"|""|0|0|10|0
                          ## Nächster Festtag aus Liste
                          5012|0|"SN[16]==0"|"SN[10][SN[10].index(SN[3])+1]"|""|0|0|11|0
                          ## nächster Festtag als Datum (datetime-format) (+ 1 Jahr, wenn SN[16]==1)
                          5012|0|""|"__import__('datetime').datetime.strptime('{0}/{1}'.format(SN[5]+int(SN[16]),SN[11]),'%Y/%m/%d')"|""|0|0|12|0
                          
                          ## Datum des nächsten Festtags als TT.MM auf Ausgang 5
                          5012|0|""|"SN[12].strftime('%d.%m')"|""|5|0|0|0
                          ## Festtagname auf Ausgang 6
                          5012|0|""|"SN[7].get(SN[11])[1]"|""|6|0|0|0
                          ## Tage bis zum nächsten Festtag auf Ausgang 7
                          5012|0|""|"(SN[12]-SN[1]).days"|""|7|0|0|0
                          Hans

                          Kommentar


                            #73
                            Hy Hans, Hab ich heute getestet funktioniert jetzt echt SUPER. DANKE dir für die Hilfe. Mann kann den Baustein Multifunktionell für FESTTAGE, als auch Geburtstage oder sogar Altpapier Abholungen nutzen, ohne eine Externe Schaltliste (damit komme ich nicht klar) nutzen.
                            Großes Lob an dich.

                            Habe allerdings noch eine Frage die nicht zum Thema passt und nichts mit dem Baustein zu tun hat...

                            Wenn der Voralarm Schalten (eingestellter Wert Tage) zum Beispiel auf 1 geht. Wie könnte ich den Wert wieder Reseten.

                            Beispiel ich habe ein Costum Datum. Mit einem Voralarm 1 Tag. Der Tag x Trifft ein. Wie kann ich das Reseten?


                            Grade Klick gemacht... glaub ich? Mit einem Timer? Oder Würdest du das anders Lösen?
                            Wenn das Event vorbei ist?


                            LG Andy

                            Kommentar


                              #74
                              Hallo Hans, vielleicht kannst Du damit was anfangen: HS Exceptions.JPG
                              Ich kann's natürlich nicht mit Sicherheit den ZSU-Logiken zuordnen - ist aber das einzige, an dem ich zur Zeit rumexperimentiere ...
                              Bin selbst nicht der Python-Experte, aber vielleicht siehst Du ja gleich, ob's überhaupt mit den ZSU-Logiken zusammenhängt oder nicht.
                              Danke und viele Grüße
                              Tom

                              Kommentar


                                #75
                                Zitat von windy75 Beitrag anzeigen
                                Hallo Hans, vielleicht kannst Du damit was anfangen:..
                                Ich kann's natürlich nicht mit Sicherheit den ZSU-Logiken zuordnen - ist aber das einzige, an dem ich zur Zeit rumexperimentiere ...
                                Bin selbst nicht der Python-Experte, aber vielleicht siehst Du ja gleich, ob's überhaupt mit den ZSU-Logiken zusammenhängt oder nicht.
                                Danke und viele Grüße
                                Tom
                                Du hast recht. Es ist der Feiertagskalender (15025).
                                Irgendwie ist hier die Version 1.0 statt 1.1 im Umlauf. Bitte austauschen.

                                Gilt für alle ZSU Anwender.

                                Hans

                                Angehängte Dateien
                                Hans

                                Kommentar

                                Lädt...
                                X