Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik: Blinklicht (Lichtklingel)

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

    Logik: Blinklicht (Lichtklingel)

    Hi Leute,

    ich steh gerade auf dem Schlauch..

    ich will, da man bei uns im Haus (gerade im Keller) die Türklingel nicht überall hört, in bestimmten Räumen ein
    Licht blinken lassen. Das kann man sehr schön über den Oszillator machen.. das funktioniert auch...
    ABER... ich will jetzt wenn diese Lampe schon an ist, soll sie nach dem Blinken auch wieder an sein. Des Oszillator
    schaltet sie nach dem Zyklus immer wieder ab...

    Versuche mit Wertauslösern und Vergleichern waren bis jetzt nicht erfolgreich... Könnte noch Timer probieren, die
    einfach nach einer bestimmten Zeit den Ursprungswert wieder senden.. aber das erscheint mir nicht Smart zu sein..

    Ne Idee ??

    Gruß Martin
    Zuletzt geändert von Brick; 07.12.2016, 18:45.
    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

    #2
    Quick 'n dirty würde ich es so machen:

    2 Oszillatoren gleich konfiguriert. Beim zweiten Oszillator am Ausgang mit einen Inverter.
    Ausgang des ersten Oszillators sowie der Ausgang des Inverters gehen auf dieselbe Ausgangsbox( !=leer), welche als Aktion den Eingangswert auf das Schalt-KO des Lichts sendet.

    Wenn Licht aus ist, dann triggere den ersten Oszillator ansonsten den zweiten.

    Also ungefähr so:

    2016-12-07 12_53_30-EDOMI · Administration.png

    Ich will nicht ausschließen, dass es mit anderen LBS noch viel einfacher geht. Ist natürlich ungetestet, nur mal schnell visualisiert,
    Zuletzt geändert von jonofe; 07.12.2016, 12:55.

    Kommentar


      #3
      Hi Andre... vielen Dank.. das sieht eigentlich gut aus.. .

      hab mich aber mal an dem LBS Oszillator gewagt und auch was umgesetzt.. ist jetzt auch nicht schön von mir umgesetzt... scheint aber zu funktionieren.

      hier mal der Code..vielleicht kann das einer schöner machen.. bzw. mal checken ob das so geht:

      PHP-Code:
      ###[DEF]###
      [name        =Oszillator    mit Status            ]

      [e#1        =Start/Stop #init=0        ]
      [e#2        =Dauer 1 (ms) #init=500    ]
      [e#3        =Dauer 0 (ms) #init=500    ]
      [e#4        =Zyklen (0=∞) #init=0    ]
      [e#5        =Status nach Ablauf        ]

      [a#1        =1/0                    ]

      [v#1        =0                        ]
      [v#2        =0                        ]
      [v#3        =0                        ]
      [v#4        =0                        ]
      ###[/DEF]###


      ###[HELP]###
      Dieser Baustein setzt A1 abwechselnd auf 1 und 0.

      Ein neues Telegramm =1 an E1 startet den Baustein, ein neues Telegramm=0 stoppt den Baustein. Ein Zyklus beginnt immer mit A1=1, gefolgt von A1=0.
      E2 bestimmt die Dauer in ms für A1=1, E3 bestimmt die Dauer für A1=0.

      Die Anzahl der Zyklen wird mit E4 definiert, E4=0 läßt den Baustein solange arbeiten, bis E1=0 wird. Ein Zyklus dauert E2+E3 Millisekunden.

      Wichtig: A1 wird beim Stoppen des Bausteins bzw. nach Ablauf der Zyklen immer(!) auf 0 gesetzt.

      E1: 1=Start, 0=Stop
      E2: Dauer für A1=1 (ms)
      E3: Dauer für A1=0 (ms)
      E4: Anzahl der Zyklen: 0=unendlich (bis E1=0 ist), 1..∞=Anzahl (1 Zyklus = E2 ODER E3)
      E5: Status auf den der Wert gesetzt werden soll nach Ablauf.
      A1: wechselt zwischen 1 und 0 (entspricht einem Zyklus). Beendet wird der Baustein immer mit A1=0 (auch wenn Zyklus-Anzahl "unendlich" ist)
      ###[/HELP]###


      ###[LBS]###
      <?

      function LB_LBSID($id) {

          if (($E=logic_getInputs($id)) && ($V=logic_getVars($id))) {

              if ($E[2]['value']<1) {$E[2]['value']=1;}
              if ($E[3]['value']<1) {$E[3]['value']=1;}

              if (logic_getState($id)==0) {

                  if ($E[1]['value']==1 && $E[1]['refresh']==1) { //Start
                      logic_setVar($id,1,getMicrotime()+($E[2]['value']/1000)); //Timer (für High und Low)
                      logic_setVar($id,2,1); //High- oder Low-Periode
                      logic_setVar($id,3,1); //Anzahl der bereits abgespielten Zyklen
                      logic_setOutput($id,1,1);
                      logic_setState($id,1,$E[2]['value']);
                      logic_setVar($id,4, $E[5]['value']);
                  }

              } else {

                  if (($V[2]==1) && (getMicrotime()>=$V[1])) {        //"High"-Periode fertig

                      logic_setOutput($id,1,0);
                      $V[1]=getMicrotime()+($E[3]['value']/1000);
                      logic_setVar($id,1,$V[1]);
                      $V[2]=0;
                      logic_setVar($id,2,0);
                      logic_setState($id,1,$E[3]['value']);


                  } else if (($V[2]==0) && (getMicrotime()>=$V[1])) {    //"Low"-Periode fertig

                      $V[1]=getMicrotime()+($E[2]['value']/1000);
                      logic_setVar($id,1,$V[1]);
                      logic_setVar($id,2,1);
                      logic_setState($id,1,$E[2]['value']);
                      logic_setVar($id,3,($V[3]+1));

                      if ($E[4]['value']>0) {
                          //Zyklus-Anzahl prüfen
                          if ($V[3]<$E[4]['value']) {
                              //Anzahl noch nicht erreicht
                              logic_setOutput($id,1,1);
                          } else {
                              //Anzahl der Zyklen erledigt => Ende
                              logic_setOutput($id,1,$V[4]);
                              logic_setState($id,0);
                          }
                      } else {
                          //Zyklus-Anzahl ist unendlich
                          logic_setOutput($id,1,1);
                      }

                  }

                  if ($E[1]['value']==0 && $E[1]['refresh']==1) {     //Stop (also quasi Abbruch => Ausgang auf 0)
                      logic_setOutput($id,1,0);
                      logic_setState($id,0);
                  }

              }

          }

      }
      ?>
      ###[/LBS]###


      ###[EXEC]###
      <?

      ?>
      ###[/EXEC]###
      Hab einfach einen neuen Eingang gemacht.. auf dem dem der Status gespeichert wird.. und am Ende wird einfach dieser Status gesetzt.

      Gruß Martin
      Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

      Kommentar


        #4
        Ich hätte einfach nur das

        PHP-Code:
        //Anzahl der Zyklen erledigt => Ende
        logic_setOutput($id,1,$E[5]['value']); 
        gemacht. Warum erst in eine Variable schieben und dann den Ausgang setzen?

        Kommentar


          #5
          Gedanklich wollte ich den Status vorher abgreifen, also beim Start des LBS... egal wie sich dann der Wert des Eingangs verändert (während der Laufzeit)
          wird am Ende der Wert vom Beginn an gesetzt...

          Wann werden den die Werte gesetzt ??

          PHP-Code:
          function LB_LBSID($id) {

              if ((
          $E=logic_getInputs($id)) && ($V=logic_getVars($id))) {

                  if (
          $E[2]['value']<1) {$E[2]['value']=1;}
                  if (
          $E[3]['value']<1) {$E[3]['value']=1;}

                  if (
          logic_getState($id)==0) {

                      if (
          $E[1]['value']==&& $E[1]['refresh']==1) { //Start
                          
          logic_setVar($id,1,getMicrotime()+($E[2]['value']/1000)); //Timer (für High und Low)
                          
          logic_setVar($id,2,1); //High- oder Low-Periode
                          
          logic_setVar($id,3,1); //Anzahl der bereits abgespielten Zyklen
                          
          logic_setOutput($id,1,1);
                          
          logic_setState($id,1,$E[2]['value']);
                          
          logic_setVar($id,4$E[5]['value']);
                      } 
          man hat ja dieses if (($E=logic_getInputs($id)) && ($V=logic_getVars($id))) { ... hier werden ja die Eingänge eingelesen.. wird das beim Start des Edomi Server gemacht?
          oder immer wenn der LBS getriggert wird ? Den getriggert wird doch erst hier: if ($E[1]['value']==1 && $E[1]['refresh']==1) dachte ich?



          Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

          Kommentar


            #6
            Bei jedem Wechsel wird der Oszillator ja neu durchlaufen, also auch die Eingänge neue gelesen.
            Dies wird durch das

            PHP-Code:
            if (($E=logic_getInputs($id))..... 
            sichergestellt. Daher kann man direkt auf E[5]['value'] zugreifen und hat bei jedem Durchlauf den aktuellen Wert.

            Kommentar


              #7
              Oder einfach eine Blink-Sequenz basteln - ganz ohne Logik und Oszi?

              Sprich:
              Ein
              Aus
              Ein
              Aus
              ...
              Ein
              EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

              Kommentar


                #8
                Zitat von jonofe Beitrag anzeigen
                zugreifen und hat bei jedem Durchlauf den aktuellen Wert.
                Aber genau das will ich ja nicht.. ich will ja den Wert am Anfang wissen und nicht bei jeden Durchlauf neu.. den da blinkt das Teil ja..
                ist also immer in einem anderen zustand...

                @gaert... du meinst einfach mehrere Befehle hintereinander ???
                wie ist dann die Frequenz ?? will jetzt keinen Disco Strobo haben..

                Edit... dann hab ich aber immer noch das Problem mit der Eingeschalteten Lampe.. bzw. dann müsste ich das
                auch wieder erst durch eine Logik abfragen...


                Zuletzt geändert von Brick; 07.12.2016, 15:00.
                Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                Kommentar


                  #9
                  Man sieht doch direkt beim erstmaligen Ausprobieren der Sache, dass man nach jedem Befehl der Sequenz eine Wartezeit in Sekunden eingeben kann...

                  Kommentar


                    #10
                    Zitat von wintermute Beitrag anzeigen
                    Man sieht doch direkt beim erstmaligen Ausprobieren der Sache, dass man nach jedem Befehl der Sequenz eine Wartezeit in Sekunden eingeben kann...
                    sorry.. die Aussage versteh ich jetzt nicht.. und ich erkenn jetzt auch nicht, worauf sie sich bezieht ?

                    Die Idee die ich umsetzen möchte ist, eine Lampe zum blinken zu bringen und sie soll nach dem Blinken den selben zustand haben, wie vor dem blinken..
                    Das funktioniert soweit mit dem Code den ich oben gepostet hab ganz gut.. auch wenn das sicher nicht die schönste Lösung ist. Das liegt aber hauptsächlich daran, das ich mit PHP nichts am Hut hab und nur wild zeug hin und her Kopieren kann...
                    Die Idee mit der Variable (bzw. über denn Sinn dieser) kann jetzt noch diskutiert werden... ich glaub man braucht sie... Andre meint es geht ohne.. wahrscheinlich hat er auch recht.. (da ich mich ja nicht auskenn).. aber ich würde es gern verstehen...

                    Gruß Martin
                    Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                    Kommentar


                      #11
                      Hm, Wertauslöser mit Oszi-Triggern und einen Inverter dahinter, Anzahl der Durchläufer gerade. Dann müsste man sogar zwischenrein Ausschalten können. blinkt zwar weiter, aber der End-Zustand wäre ok.

                      Kommentar


                        #12
                        Zitat von Brick Beitrag anzeigen
                        sorry.. die Aussage versteh ich jetzt nicht.. und ich erkenn jetzt auch nicht, worauf sie sich bezieht ?
                        Auf Deine Frage nach der Frequenz einer Sequenz... man muss noch nichtmal die Hilfe lesen, man taete das schon sehen wenn man sich das in der GUI einfach mal angucken wuerde - nichtmal ausprobieren, bloss angucken

                        Zum Rest: nimm ein iKO als "Merker", setz am Anfang der Sequenz den Merker auf den aktuellen Status und am Ende den aktuellen Status wieder auf den Merker. Willst Du waehrend der Sequenz ein/ausschalten erlauben, musste den Merker eben "mit"schalten.

                        Kommentar


                          #13

                          Hi Winni... das sieht glaub ich gut aus und macht auch von der Logik her Sinn.. danke..
                          wusste doch das es einen einfachen Weg geben muss

                          Bereich.png

                          Funktioniert !!

                          Gruß Martin
                          Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                          Kommentar


                            #14
                            Zitat von Brick Beitrag anzeigen
                            ich glaub man braucht sie... Andre meint es geht ohne.. wahrscheinlich hat er auch recht.. (da ich mich ja nicht auskenn).. aber ich würde es gern verstehen...

                            Gruß Martin
                            Du hast natürlich Recht. Wenn man direkt E[5] nehmen würde und dort den Status der Leuchte anlegen würde, dann würde sich natürlich dieser Status bei jedem Blinken ändern und wieder den Wert von E[5] ändern. Also völlig richtig, wie du es gemacht hast, beim Start in eine Variable sichern und am Ende auf den Ausgang schreiben.
                            Sorry for confusion ...

                            Kommentar


                              #15
                              wintermute .. alles klar.. ich hab Sequenzen noch nicht verwendet.. habs gerade mal probiert.. und genau das gesehen was du gerade geschrieben hast..
                              nachdem das von Winni aber perfekt funktioniert werd ich das nutzen...

                              Trotzdem allen vielen Dank für die Unterstützung..

                              Gruß Martin
                              Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                              Kommentar

                              Lädt...
                              X