Ankündigung

Einklappen
Keine Ankündigung bisher.

Webinterface

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

    [Codebeispiel] Webinterface

    Ich Eibgenossen,
    ich habe letztes Wochenende meinen Eibpc bekommen und die ersten Sachen probeweise ausprobiert. Ich habe mich beim Schreiben etwas am Handbuch durchgehangelt. Ist sicher nicht optimal, daher stelle ich meinen Code hier mal rein und hoffe auf viele schöne Verbesserungsvorschläge von Euch und hoffe dieser Code hilft auch dem Einen oder Anderen sie KNX zu visualisieren.

    Code:
     
    [ETS-ESF]
    // Die aus der ETS3 exportierte ESF-Datei
    H:/KNX/Katrin_und_Carsten.esf
    [WebServer]
    button(1)[CLOCK]$Uhrzeit$ none button(2)[DATE]$Datum$
    line
    button(10)[WINDOW]$Kind 1$ none chart(10)[$16$,$20$,$24$]
    shifter(11)[PLUS,TEMPERATURE,MINUS]$Solltemperatur$
    button(12)[TEMPERATURE]$Grundheizen$ button(13)[TEMPERATURE]$Zusatzheizen$
    shifter(14)[UP,LIGHT,DOWN]$Licht A$ shifter(15)[UP,LIGHT,DOWN]$Licht B$
    line
    button(50)[Mail]$Test Email$
    [EibPC]
    //Systemstart
    if (systemstart()) then \\
    write("Licht A Kind 1 Schalten-1/0/2",AUS); \\
    write("Licht B Kind 1 Schalten-1/0/7",AUS); \\
    write("Temperatur Vorgabe Kind 1-3/0/2",21f16) ;\\
    write("Zeit-0/0/1"t24,settime()) ;\\
    endif
    // Webserver
    gettime("Zeit-0/0/1")
    if stime(0) then webdisplay(1,settime(),CLOCK,INACTIVE,GREY) endif
    if stime(0) then webdisplay(2,setdate(),DATE,INACTIVE,GREY) endif
    // Webserver - Kind 1 Temperaturchart und Fensterstatus 
    if (stime(0) and "Fenster Kind 1-4/0/1") then webdisplay(9,"Temperatur Ist
    Kind 1-3/0/0",WINDOW,INACTIVE,GREY) endif 
    if (stime(0) and !"Fenster Kind 1-4/0/1") then webdisplay(9,"Temperatur Ist
    Kind 1-3/0/0",WINDOW,BRIGHTRED,GREY) endif 
    if cycle(30,0) then webchart(10,convert(3.75*("Temperatur Ist Kind
    1-3/0/0"-15.0),0),$-25 Std.$c14,$aktuell$c14) endif 
    // Webserver - Kind 1 Temperatursollwert und Heizanzeige 
    if stime(0) then webdisplay(11,"Temperatur Soll Kind
    1-3/0/1",TEMPERATURE,INACTIVE,GREY) endif
    if webbutton(11)==1 then write("Temperatur Vorgabe Kind 1-3/0/2","Temperatur
    Soll Kind 1-3/0/1"+0.5);webdisplay(11,"Temperatur Vorgabe Kind
    1-3/0/2"+0.5,TEMPERATURE,INACTIVE,GREY) endif 
    if webbutton(11)==3 then write("Temperatur Vorgabe Kind 1-3/0/2","Temperatur
    Soll Kind 1-3/0/1"-0.5);webdisplay(11,"Temperatur Vorgabe Kind
    1-3/0/2"-0.5,TEMPERATURE,INACTIVE,GREY) endif 
    if ("Grundheizen Kind 1-3/0/3"==0) then
    webdisplay(12,$AUS$c14,TEMPERATURE,INACTIVE,GREY) endif 
    if ("Grundheizen Kind 1-3/0/3">0) then webdisplay(12,"Grundheizen Kind
    1-3/0/3",TEMPERATURE,ACTIVE,GREY) endif 
    if ("Zusatzheizen Kind 1-3/0/4"==0) then
    webdisplay(13,$AUS$c14,TEMPERATURE,INACTIVE,GREY) endif 
    if ("Zusatzheizen Kind 1-3/0/4">0) then webdisplay(13,"Zusatzheizen Kind
    1-3/0/4",TEMPERATURE,ACTIVE,GREY) endif 
    //Webserver - Kind 1 Licht A 
    if webbutton(14)==2 then if "Licht A Kind 1 Rück-1/0/5" then write("Licht A
    Kind 1 Schalten-1/0/2",AUS) endif; if !"Licht A Kind 1 Rück-1/0/5" then
    write("Licht A Kind 1 Schalten-1/0/2",EIN) endif; endif 
    if webbutton(14)==1 then write("Licht A Kind 1 Wert-1/0/4","Licht A Kind 1
    Rück Wert-1/0/6"+25) endif
    if webbutton(14)==3 then write("Licht A Kind 1 Wert-1/0/4","Licht A Kind 1
    Rück Wert-1/0/6"-25) endif
    if ("Licht A Kind 1 Rück Wert-1/0/6"==0%) then
    webdisplay(14,$AUS$c14,LIGHT,INACTIVE,GREY) endif
    if ("Licht A Kind 1 Rück Wert-1/0/6">0) then webdisplay(14,"Licht A Kind 1
    Rück Wert-1/0/6",LIGHT,STATE4,GREY) endif 
    if ("Licht A Kind 1 Rück Wert-1/0/6">85) then webdisplay(14,"Licht A Kind 1
    Rück Wert-1/0/6",LIGHT,STATE5,GREY) endif 
    if ("Licht A Kind 1 Rück Wert-1/0/6">170) then webdisplay(14,"Licht A Kind 1
    Rück Wert-1/0/6",LIGHT,STATE6,GREY) endif 
    if ("Licht A Kind 1 Rück Wert-1/0/6"==255) then webdisplay(14,"Licht A Kind
    1 Rück Wert-1/0/6",LIGHT,ACTIVE,GREY) endif
    // Webserver - Kind 1 Licht B 
    if webbutton(15)==2 then if "Licht B Kind 1 Rück-1/0/10" then write("Licht B
    Kind 1 Schalten-1/0/7",AUS) endif; if !"Licht B Kind 1 Rück-1/0/10" then
    write("Licht B Kind 1 Schalten-1/0/7",EIN) endif; endif 
    if webbutton(15)==1 then write("Licht B Kind 1 Wert-1/0/9","Licht B Kind 1
    Rück Wert-1/0/11"+25) endif 
    if webbutton(15)==3 then write("Licht B Kind 1 Wert-1/0/9","Licht B Kind 1
    Rück Wert-1/0/11"-25) endif 
    if ("Licht B Kind 1 Rück Wert-1/0/11"==0%) then
    webdisplay(15,$AUS$c14,LIGHT,INACTIVE,GREY) endif
    if ("Licht B Kind 1 Rück Wert-1/0/11">0) then webdisplay(15,"Licht B Kind 1
    Rück Wert-1/0/11",LIGHT,STATE4,GREY) endif 
    if ("Licht B Kind 1 Rück Wert-1/0/11">85) then webdisplay(15,"Licht B Kind 1
    Rück Wert-1/0/11",LIGHT,STATE5,GREY) endif
    if ("Licht B Kind 1 Rück Wert-1/0/11">170) then webdisplay(15,"Licht B Kind
    1 Rück Wert-1/0/11",LIGHT,STATE6,GREY) endif
    if ("Licht B Kind 1 Rück Wert-1/0/11"==255) then webdisplay(15,"Licht B Kind
    1 Rück Wert-1/0/11",LIGHT,ACTIVE,GREY) endif
    // Webserver Test Email 
    [EMAIL="email=$xxx@htp-tel.de$"]email=$xxx@htp-tel.de$[/EMAIL] 
    betreff=$EibPC$ 
    nachricht=$Dies ist eine Test-Email$ 
    if webbutton(50)==1 then sendmail(email,betreff,nachricht) endif

    #2
    kleiner Tipp

    Guten Morgen Fuchs,

    das war eine Menge Schreibarbeit. Ein kleiner Tipp für den Webserver: Mit Makros lässt sich das vereinfachen. Spätere Erweiterungen gehen dann auch schneller. Aussehen könnte das dann so:

    Makrodatei:
    Code:
    :begin WebSwitch(Index, GA)
    :info $Dieses Makro Realisiert die Reaktion auf die Betätigung eines Button$ $Index Button$ $GA Gruppenadresse$
    :shortinfo $Schaltfunktion$
    
    if webbutton(Index)==1 then \\
      write (GA, !GA); \\
      if GA then \\
        webdisplay(Index,$$,LIGHT,INACTIVE,GREY) \\
      else \\
        webdisplay(Index,$$,LIGHT,ACTIVE,GREY) \\
      endif \\
    endif  
    
    :end
    
    :begin RefreshWebSwitch(Index, GA)
    :info $Dieses Makro aktualisiert die WEB-Darstellung eines Button, wenn sich der Zustand durch Busaktivität geändert hat.$ \\
            $Index Index des WEB Button$ \\
            $GA Gruppenadresse$
    :shortinfo $WEBDisplay Aktualisierung$
    
    if event(GA) then \\
      if GA then \\
        webdisplay(Index,$$,LIGHT,ACTIVE,GREY) \\
      else \\
        webdisplay(Index,$$,LIGHT,INACTIVE,GREY) \\
      endif \\
    endif  
    
    :end
    In der Projektdatei würden die Makros dann so aufgerufen:
    Code:
    [Macros]
    // Reaktion auf Befehle über WEB
    WebSwitch(1," licht büro ein/aus-1/3/7")
    RefreshWebSwitch(1," licht büro ein/aus-1/3/7")
    WebSwitch(2,"licht kz  ein/aus-1/3/8")
    RefreshWebSwitch(2,"licht kz  ein/aus-1/3/8")
    .....
    Kleiner Nebeneffekt: Die Änderungen erfolgen in Abhängigkeit vom Ereignis und nicht von der Zeit. Kein Schönheitswettbewerb, nur ein Tipp, wie gesagt..

    Einen schönen Tag noch
    Venestra

    Kommentar


      #3
      Zitat von venestra Beitrag anzeigen
      Guten Morgen Fuchs,
      Makros lässt sich das vereinfachen. Spätere Erweiterungen gehen dann auch schneller. Aussehen könnte das dann so:
      Vielleicht auch mal an die Verwendung comobject denken, wenn man das Licht über mehrere GA ansprechen kann.
      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
      Enertex Produkte kaufen

      Kommentar


        #4
        Danke, diese Dinge helfen Neueinsteigern bestimmt!

        Noch zwei kleine Kommentare:

        Wäre dierser Thread nicht besser unter Öffentlicher Bereich > KNX EIB Forum > Code-Schnipsel aufgehoben?

        Umgebt doch mal euren Code mit den Highlight-Tags (Natürlich die { } durch [ ] ersetzen):
        {highlight=vb}
        {/highlight}

        Verbessert die Übersicht (OK, über die Farben kann man streiten ;-)

        Kommentar


          #5
          Tach Fuchs,

          Code:
           
          
          [WebServer]
          button(1)[CLOCK]$Uhrzeit$ none button(2)[DATE]$Datum$
          line
          
          //mach aus der (1) eine Variable:
          
          button(WEBID_Uhrzeit)[CLOCK]$Uhrzeit$ none button(2)[DATE]$Datum$
          line
          
          [EibPC]
          // Die Variable wird dann hier definiert
          WEBID_Uhrzeit = 1u08
          WEBID_Datum = ...
          WEBID_Licht_Kind = 42u08
          WEBID ...
          
          [Macros]
          // Dann kannst Du mit dem passenden Macro schreiben
          WebTaster_GA_SO(WEBID_Licht_Kind,*WertGA*,*StatusGA*)
          // ** = Gruppenadresse noch einsetzen ...
          Meine Web Macrosammlung habe ich mal beigefügt , kannst Du gerne nutzen verbessern, verändern etc.

          Gruß,
          Bernd

          Kommentar


            #6
            Hallo,

            hier auch ein einfaches Macro für Lichttaster. Für andere kannst du sie dann kopieren und ändern. Das Macro fragt auch den Zustand beim Systemstart automatisch ab.
            Im Programm steht dann nur eineZeile: z.B.

            [highlight=vb]
            WebTaster(35,"Licht Werkstatt Wandseite-2/0/11") [/highlight]

            die Helligkeitsabfragen kannst du dann auch ergänzen und für alle Schaltstellen verwenden.
            Für die Anzeigen würde ich mal versuchen den Schaltzustand (State 4-8) = Wert 4-8 rechnerisch zu ermitteln und einzutragen, wäre dann nur 1-2 Zeilen im Makro statt 8.

            Das macht das Programm viel übersichtlicher.
            Angehängte Dateien
            Der schöne Niederrhein läßt Grüssen

            Andreas


            Alter Hof mit neuer Technik

            Kommentar


              #7
              Zitat von anlo007 Beitrag anzeigen
              Hallo,

              hier auch ein einfaches Macro für Lichttaster. Für andere kannst du sie dann kopieren und ändern. Das Macro fragt auch den Zustand beim Systemstart automatisch ab.
              ... Wenn man die Kommentarzeichen entfernt.
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar


                #8
                Zitat von enertegus Beitrag anzeigen
                ... Wenn man die Kommentarzeichen entfernt.
                sind entfernt, war noch eine ältere Testversion.
                Der schöne Niederrhein läßt Grüssen

                Andreas


                Alter Hof mit neuer Technik

                Kommentar


                  #9
                  vielen Dank für die vielen Infos, werde mir das alles mal ansehen.

                  Kommentar


                    #10
                    Habe mal probiert etwas in ein Makro auszulagern. brauch dabei nochmal eure hilfe:
                    ich bekomme diesen fehler

                    Laufzeitfehler:
                    ! DatenTyp nicht möglich : >"Licht A Kind 1 Rück-1/0/5"+10< !
                    Überprüfen Sie ggf. auch Argumenttypen von Funktionen
                    habe das mit den deklaration der variablen noch nicht ganz verstanden. direkt im hauptprogramm ging es so

                    Code:
                    [Macros]
                    DimmtasterWeb(14,"Licht A Kind 1 Schalten-1/0/2","Licht A Kind 1 Rück-1/0/5","Licht A Kind 1 Wert-1/0/4","Licht A Kind 1 Rück-1/0/5")

                    Code:
                     
                    :begin DimmtasterWeb(ID,GASchalt,RückSchalt,GADimm,RückDimm)
                    :info $Ein Dimmtaster für Licht per Webserver$ \\
                          $ID des Tasters$ \\
                          $Gruppenadresse Schalten$ \\
                          $Rückmeldeadresse Schalten$ \\
                          $Gruppenadresse Dimmenwert$ \\
                          $Rückmeldeadresse Dimmenwert$
                    :shortinfo $Einfacher Dimtaster im Webserver$
                    if after(systemstart(),convert(random(15000u32),1u64)) then read(RückSchalt);read(RückDimm) endif
                    if webbutton(15)==2 then  \\
                      if (RückSchalt) then write(GASchalt,AUS) endif; \\
                      if (!RückSchalt) then write(GASchalt,EIN) endif; \\
                    endif 
                    if webbutton(15)==1 then write(GADimm,RückDimm+25) endif 
                    if webbutton(15)==3 then write(GADimm,RückDimm+25) endif 
                    if (RückDimm==0) then webdisplay(15,$AUS$c14,LIGHT,INACTIVE,GREY) endif
                    if (RückDimm>0) then webdisplay(15,RückDimm,LIGHT,STATE4,GREY) endif 
                    if (RückDimm>85) then webdisplay(15,RückDimm,LIGHT,STATE5,GREY) endif
                    if (RückDimm>170) then webdisplay(15,RückDimm,LIGHT,STATE6,GREY) endif
                    if (RückDimm==255) then webdisplay(15,RückDimm,LIGHT,ACTIVE,GREY) endif
                    :end

                    Kommentar


                      #11
                      Hi Fuchs,

                      Code:
                      :begin DimmtasterWeb(ID,GASchalt,RueckSchalt,GADimm,RueckDimm)
                      :info $Ein Dimmtaster für Licht per Webserver$ \\
                            $ID des Tasters$ \\
                            $Gruppenadresse Schalten$ \\
                            $Rückmeldeadresse Schalten$ \\
                            $Gruppenadresse Dimmenwert$ \\
                            $Rückmeldeadresse Dimmenwert$
                      :shortinfo $Einfacher Dimmtaster im Webserver$
                      
                      if after(systemstart(),convert(random(15000u32),1u64)) then {
                         read(RückSchalt);
                         read(RückDimm)
                      } endif
                      
                      if webbutton(ID)==2 then {
                        if (RückSchalt) then write(GASchalt,AUS) endif;
                        if (!RückSchalt) then write(GASchalt,EIN) endif
                      } endif
                      
                      if webbutton(ID)==1 then write(GADimm,RueckDimm+25) endif
                      if webbutton(ID)==3 then write(GADimm,RueckDimm+25) endif
                      if (RueckDimm==0) then webdisplay(ID,$AUS$,LIGHT,INACTIVE,GREY) endif
                      if (RueckDimm>0) then webdisplay(ID,convert(RueckDimm,$$),LIGHT,STATE4,GREY) endif
                      if (RueckDimm>85) then webdisplay(ID,convert(RueckDimm,$$),LIGHT,STATE5,GREY) endif
                      if (RueckDimm>170) then webdisplay(ID,convert(RueckDimm,$$),LIGHT,STATE6,GREY) endif
                      if (RueckDimm==255) then webdisplay(ID,convert(RueckDimm,$$),LIGHT,ACTIVE,GREY) endif
                      :end
                      Ich kanns jetzt nicht ausprobieren aber es sollte theoretisch klappen.
                      - Kein ä,ö,ü in den Makroargumentnamen
                      - die ID auch überall einsetzen (nicht die 15 stehen lassen)
                      - bei if then ruhig { } verwenden statt der // Orgie

                      Gruß,
                      Bernd

                      Kommentar


                        #12
                        hat sich erledigt, falsch GA ausgewählt :-(

                        Kommentar


                          #13
                          Habe noch eine Frage. Ich habe jetzt alle Änderungen im Webinterface angestoßen über das drücken der Knöpfe. Muss ich das auch noch abfragen über change, z.b. wenn ein realer taster gedrückt wird oder erkennt das webinterface das alleine?

                          eure tipps haben übrings viel geholfen. mein code ist schon viel kürzer geworden :-)

                          Kommentar

                          Lädt...
                          X