Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu VISU und Logik

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

    Frage zu VISU und Logik

    Hallo zusammen,
    meine Test-VISU für's Wohnzimmer (Anhang) nimmt Formen an. Bei den Buttons "Haustür" und "Status" kam der Spieltrieb etwas durch......
    Frage zur VISU:
    Beim Button "Status" wechselt das Icon von "im Haus" = anwesend, zu "aus dem Haus" = abwesend. Aber der Button ist aktiv, also man kann durch klicken auf das Icon das Bit des ReedKontaktes ändern. Gibt es eine Möglichkeit reine Anzeige-Buttons zu verwenden, auch bei wechselnden Grafiken?

    [WebServer]
    pbutton(Licht1ID)[LIGHT]$SteinLeuchte$ pbutton(Licht2ID)[LIGHT]$BlaueLeuchte$ pbutton(Info1ID)[KEY]$Haustür$ pbutton(Info2ID)[ABSENT]$Status$
    [Macros]
    //habe ich umbenannt, hiess vorher: UmschaltButtonZweiIconsVar
    StatusAnzeigeZweiButtons(Info2ID,WohnungWohnzimmer ID,ReedHaustuer,ABSENT,PRESENT,DISPLAY,DISPLAY)

    [EibPC]
    //Tests
    //Haustür doppelt abschließen => Alle Rollos runter(1b01), alle Leuchten aus(0b01)
    ReedHaustuer='5/0/0'b01
    RolloSchaltZeit=0
    DaemmerungRollo=0
    if chtime(22,00,00) then RolloSchaltZeit=1 endif
    if event("Helligkeit IST-Wert in Lux-8/0/6") and "Helligkeit IST-Wert in Lux-8/0/6" < 200.00f16 then DaemmerungRollo=1 endif
    if delay(ReedHaustuer==EIN,60000u64) then write('3/1/11'b01,EIN); write('1/1/41'b01,AUS) endif
    if(ReedHaustuer==AUS) then if RolloSchaltZeit==1 or DaemmerungRollo==1 then write('1/1/41'b01,EIN) else write('3/1/11'b01,AUS); write('1/1/41'b01,EIN) endif endif

    Frage zur Logik:
    Mit "delay" (vorletzte Zeile) erreiche ich, dass die Rollos nicht sofort runter gehen, falls man irgendetwas vergessen hat, u. innerhalb von ca. 5 Min. die Haustür nochmals aufschließt, das funktioniert auch.....
    Eigentlich fände ich es besser, wenn die Rollos sofort runtergehen, und wenn man dann innerhalb von ca. 5 Min. nochmals aufschließt, sie nicht wieder hochgehen, aber das ist mir bisher nicht gelungen.
    Hat hierfür vielleicht jemand einen Tip für mich?

    Gruß, Paul
    Angehängte Dateien

    #2
    Hallo Paul,

    in dem Macro "StatusAnzeigeZweiButtons" wird es eine Zeile geben die den Tastendruck (z.B. if pushbutton....) auswertet und dann eine Aktion vornimmt. Diese musst du löschen, um eine reine Anzeige in Abhängigkeit von "ReedHaustuer" zu erhalten.

    Hier noch ein Vorschlag bezüglich deiner Rollos:

    Code:
    //Tests
    //Haustür doppelt abschließen => Alle Rollos runter(1b01), alle Leuchten aus(0b01)
    
    ReedHaustuer='5/0/0'b01
    RolloSchaltZeit=0
    DaemmerungRollo=0
    RolloSperre=0
    
    if chtime(22,00,00) then RolloSchaltZeit=1 endif      // Wann setzt du die Variable zurück?
    
    if event("Helligkeit IST-Wert in Lux-8/0/6") and "Helligkeit IST-Wert in Lux-8/0/6" < 200.00f16 then DaemmerungRollo=1 endif           // Wann setzt du die Variable zurück?
    
    if ReedHaustuer==EIN then write('3/1/11'b01,EIN); write('1/1/41'b01,AUS); RolloSperre=1 endif
    
    if after(RolloSperre==1,600000u64) then RolloSperre=0 endif      // Nach 10 Minuten wird die Sperre wieder aufgehoben
    
    if(ReedHaustuer==AUS) then {
            write('1/1/41'b01,EIN);
            if RolloSchaltZeit==0 and DaemmerungRollo==0 and RolloSperre==0 then {
                        write('3/1/11'b01,AUS)        
            } endif
    } endif
    Viel Spaß.

    Gruß,
    Eike
    ViP - Verteilerplanung in Perfektion
    www.verteilerplanung-in-perfektion.de

    Kommentar


      #3
      Hallo Eike,
      vielen Dank für deine Antwort.
      Kurz zu den Widersprüchlichkeiten in dem Code - ich habe von Programmieren NULL Ahnung, alles zusammengesucht u. ausprobiert......
      Deine Vorschläge sind super, werde ich heute abend ausprobieren.
      Kurze Nachfrage zur RolloSperre:
      Wo definiere ich die GA dafür im Code? meine Rollos haben eine AutomatikSperre, da gibt es sogar pro Rollo eine GA für (Manchmal sieht man den Wald vor lauter Bäumen nicht....)

      Zum Zurücksetzen der Variablen:
      Im Handbuch habe ich gelesen, dass die Zeit-Variable um 0 Uhr auf den Wert 0 umschaltet.
      (Das gefällt mir eigentlich auch nicht, denn manchmal kommt man ja nach 24h nach Hause, aber dann wirkt die Dämmerungsvariable..... Ich wollte eigentlich so etwas definieren, dass über 24h hinausgeht, aber das hängt noch......)
      Bei der Dämmerungsvariablen bin ich davon ausgegangen, dass bei > 200 Lux die Variable wieder auf den Wert 0 springt......

      Danke, Gruß Paul

      Kommentar


        #4
        Hallo Paul,

        die Variable "Rollo Sperre" habe ich im Code definiert, sie hat nichts mit deinen GAs zu tun. Sie dient dazu, das nach dem Abschließen deiner Haustür die Rauffahrt deiner Rollos für 10 Minuten gesperrt wird. (somit kannst du in diesem Zeitfenster erneut Auf- und wieder Abschließen)

        Code:
        if chtime(22,00,00) then RolloSchaltZeit=1 endif
        Chtime wird um 22 Uhr auf "EIN" gesetzt und wechselt erst um 24 Uhr wieder auf "AUS". Das heißt aber nicht, dass deine Variable wieder auf "0" gesetzt wird. Du könntest das z.B. so lösen:

        Code:
        if htime(22,00,00) then RolloSchaltZeit=1 endif
        if htime(06,00,00 then RolloSchaltZeit=0 endif
        Htime wird nur für einen Verarbeitungszyklus auf "EIN" gesetzt, somit wird deine Variable um 22 Uhr auf "1" gesetzt und um 06 Uhr wieder auf "0".

        Was deine Dämmerungsvariable betrifft, hast du das gleiche Problem. Mit deiner If Bedingung setzt du sie auf "1" aber mehr auch nicht ;-) Das könntest du z.B. so lösen:

        Code:
        DaemmerungRollo = "Helligkeit IST-Wert in Lux-8/0/6" < 200.00f16
        Besser wäre noch ein wenig Hysterese, dazu gibt es eine fertige Funktion Namens "hysteresis".

        Gruß,
        Eike

        PS: Du hast in deinem Code für die Variablen den Datentyp u08 gewählt (=0,=1). Für diese Anwendung würde es auch b01 reichen (=AUS,=EIN). Dies hat den Vorteil, dass du für z.B. "RolloSchaltZeit==EIN" auch einfach nur "RolloSchaltZeit" schreiben könntest und für "RolloSchaltZeit==AUS" einfach "!RolloSchaltZeit".
        Zuletzt geändert von eike3091; 04.07.2017, 13:19.
        ViP - Verteilerplanung in Perfektion
        www.verteilerplanung-in-perfektion.de

        Kommentar


          #5
          Hallo Eike,
          deine Unterstützung hat mir weitergeholfen, danke dafür.
          Der vorher "aktive" Button ist jetzt nur noch Anzeigebutton.
          Der Programmteil sieht jetzt so aus:

          Code:
          //Haustür doppelt abschließen => Alle Rollos runter(1b01), alle Leuchten aus(0b01)
          ReedHaustuer='5/0/0'b01
          RolloSchaltZeit=0
          RolloSperre=0
          DaemmerungRollo="Helligkeit IST-Wert in Lux-8/0/6" < 200.00f16
          
          if htime(22,00,00) then RolloSchaltZeit=1 endif
          if htime(04,00,00) then RolloSchaltZeit=0 endif
          
          if(ReedHaustuer==EIN) then write('3/1/11'b01,EIN); write('1/1/41'b01,AUS); RolloSperre=1 endif
          
          if after(RolloSperre==1,300000u64) then RolloSperre=0 endif
          
          if(ReedHaustuer==AUS) then if RolloSchaltZeit==0 and DaemmerungRollo==AUS and RolloSperre==0 then\\
          write('3/1/11'b01,AUS) else write('1/1/41'b01,EIN) endif endif
          Bis auf die RolloSchaltZeit funktioniert alles.
          Wenn ich die Variable "RolloSchaltZeit" nach 22:00h abfrage, steht sie immer noch auf "0". Eigentlich hatte ich erwartet, dass sie auf "1" steht, denn der Wert hätte doch um 22:00h in die Variable geschrieben werden müssen, oder liege ich da falsch?
          Hast du dazu noch eine Idee?

          Die Syntax der Variablen, also ob mit 1x = oder 2 x ==, ob mit EIN/AUS oder 0/1 ist mir noch unklar.
          Auf S. 164 im Handbuch stehen zwar einige Erläuterungen dazu, muss ich aber noch ein paar mal lesen.

          Gruß, Paul.

          Kommentar


            #6
            Hallo Paul,

            hast du das Programm nach 22 Uhr auf den EibPC übertragen? Htime wird immer nur genau zu dem eingestellten Zeitpunkt für einen Verarbeitungszyklus auf "EIN" gesetzt. Falls du das Programm also nach 22 Uhr übertragen hast, funktioniert die Sache erst am nächsten Tag. Wenn dich dieses Verhalten stört, müsstest du dir etwas mit chtime (chtime wird bei Erreichen des eingestellten Zeitpunkts auf "EIN" gesetzt und bleibt bis zum Tagesende auf diesem Wert) basteln.

            Bezüglich Syntax:

            Mit "=" schreibst du einen neuen Wert in deine jeweilige Variable.
            Mit "==", ">=", "<=" vergleichst du deine Variable mit einer Konstante oder einer anderen Variable. Wenn dieser Vergleich erfüllt ist, wird er "WAHR".

            "EIN" ist als Konstante vordefiniert und hat den Wert 1b01 (WAHR), du kannst also z.B. "if RolloSchaltZeit == EIN" oder auch einfach nur "if RolloSchaltZeit" schreiben.
            "AUS" ist ebenfalls eine vordefinierte Konstante und hat den Wert 0b01 (FALSCH), du kannst also z.B. "if RolloSchaltZeit == AUS" oder auch einfach nur "if !RolloSchaltZeit" schrieben.

            "0" oder "1" werden als Datentyp u08 erkannt. Dieser Datentyp geht von 0 - 255. Wenn du diesen Datentyp für Bedienungen benutzt, die eigentich nur zwei Zustände haben können, hast du den Nachteil, dass du immer mit "==" arbeiten musst. Abkürzungen wie "if RolloSchaltZeit" oder "if !RolloSchaltZeit" funktionieren nur bei binären Geschichten.

            Gruß,
            Eike

            ViP - Verteilerplanung in Perfektion
            www.verteilerplanung-in-perfektion.de

            Kommentar


              #7
              Hallo Eike,
              wahrscheinlich hast du recht und ich hatte das Programm zu spät übertragen, habe ziemlich viel experimtiert..
              Heute habe ich die Zeit verstellt und dann mit dem Debugger die Variable überprüft, funktioniert problemlos.
              Vielen Dank auch nochmal für deine Erläuterungen bzgl. der Variablen-Zuweisung -Abfrage.
              Gruß, Paul.

              Kommentar


                #8
                Definiere Dein RolloSchaltzeit doch besser so:

                RolloSchaltzeit = chtime(22,00,00) or !chtime(04,00,00);

                Spart Dir ein paar Zeilen und es ist vollkommen egal, um welche Zeit Du ein neues Programm in den EibPC einspielst...

                Kommentar

                Lädt...
                X