Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS - Home-Entertainement

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

    [Projekte] LBS - Home-Entertainement

    Hallo Zusammen

    nun nach so vielen Stunden der Verzweiflung warum das nicht funktioniert muss ich an euch gelangen.
    Dies ist mein erster LBS, erfahrung mit PHP oder sowas habe ich nicht. Ich habe einige Dinge gelesen und nachgeschaut. Aber der Profi bin ich nicht.

    Ich muss aber das Ding zum laufen bringen, dass meine Frau glücklich ist und unseren TV nur mit einer Fernbedienung bedienen kann.
    Mittlerweile habe ich wirklich schon x Stunden verlohren und komm hier nicht weiter.

    Grundlegend habe ich 3 Elemente zu steuern.

    TV
    Aktiv Box
    Radio

    TV und Radio spiele auf die Aktivbox jeweils auf einen Eingang.

    Der Baustein soll die Box steuern optional auch noch Radio und TV, alles nur Ein/Aus mehr nicht.

    Funktion:
    TV Ein - Box Ein - Eingang Opt
    Radio Ein - Box Ein - Eingang Coax

    wie unten zu entnehmen habe ich dazu noch zwei Variabeln aufgebaut einmal den Status des ganzen System V1 und einmal den Status V2 der Eingänge der Boxen.

    Nu habe ich Eingang 4 und 6 programmiert.
    Die sollten nur TV einschalten und Box einschalte und wider rückwärts das ganze.
    Aber nicht mal das läuft zuverlässig .. und ich finde den fehler nicht.

    Findet jemand das Problem ?

    Code:
    ###[DEF]###
    [name =Pawa Home-Entertainement ]
    [titel =Home-Entertainement ]
    
    [e#1 = TV_State_OnOff #init=0 ]
    [e#2 = Radio_State_OnOff #init=0 ]
    [e#3 = Speaker_State_OnOff #init=0 ]
    [e#4 = Cmd_Tv ]
    [e#5 = Cmd_Radio ]
    [e#6 = Cmd_Off ]
    
    [a#1 = TV_Switch_On ]
    [a#2 = TV_Switch_Off ]
    [a#3 = Radio_Switch_On ]
    [a#4 = Radio_Switch_Off ]
    [a#5 = Speaker_Switch_On ]
    [a#6 = Speaker_Switch_Off ]
    [a#7 = Speaker_Switch_Coax ]
    [a#8 = Speaker_Switch_Opt ]
    [a#9 = Debug_SysState ]
    [a#10 = DebugInputState ]
    
    [v#1 EntertainementSystemState #init=0]
    [v#2 Speaker_Input_State #init=0]
    ###[/DEF]###
    
    
    ###[HELP]###
    
    
    EntertainementSystemState 0: System aus
    EntertainementSystemState 1: Play Tv
    EntertainementSystemState 2: Play Radio
    
    Speaker_Input_State 0: Opt
    Speaker_Input_State 1: Coax
    
    
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
    if ($E=logic_getInputs($id)) {
    if ($E[4]['value']!=0 && $E[4]['refresh']==1) {
    if(getLogicElementVar($id,1)==0) {
    //TV_Switch_On
    
    //Speaker_Switch_On if off
    if($E[3]['refresh']=1){
    if($E[3]['value']==0) {
    logic_setOutput($id,5,1);
    logic_setOutput($id,6,0);
    }
    }
    
    //Speaker_Switch_Opt if in Coax State
    if(getLogicElementVar($id,2)==1){
    logic_setOutput($id,8,1);
    // Intern save state of speaker input
    SetLogicElementVar($id,2,0);
    logic_setOutput($id,10,0);
    }
    setLogicElementVar($id,1,1);
    logic_setOutput($id,9,1); // Debug
    }
    }
    if(getLogicElementVar($id,1)==1){
    }
    
    if(getLogicElementVar($id,1)==2){
    }
    if ($E[6]['value']==1) {
    if(getLogicElementVar($id,1)==0){
    }
    
    if(getLogicElementVar($id,1)==1){
    //TV_Switch_Off
    
    //Speaker_Switch_Off if on
    if($E[3]['value']==1) {
    logic_setOutput($id,6,1);
    logic_setOutput($id,5,0);
    }
    setLogicElementVar($id,1,0);
    logic_setOutput($id,9,0); // Debug
    }
    
    if(getLogicElementVar($id,1)==2){
    }
    }
    }
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    
    ?>
    ###[/EXEC]###
    Zuletzt geändert von ctx; 12.05.2020, 20:14.

    #2
    Für mich klingt das Problem danach als könnte man das mit wenigen Werks-LBS (Gatter + Ausgängen) lösen. Ich verstehe den Sinn des LBS nicht. Genau für solche Anforderungen sind doch die Standard LBS da.

    Kommentar


      #3
      Zitat von ctx Beitrag anzeigen
      //Speaker_Switch_On if off if($E[3]['refresh']=1){{
      Hier müsste ==1 rein

      Kommentar


        #4
        Das würde aber auch nur asugeführt, wenn E4 und E3 zur gleichen getriggert werden. Ansonsten gelangt der LBS gar nicht zum $E[3]['refresh']==1.
        Eigentlich kann das so gar nicht funktionieren. Und wie oben erwähnt, von der Problemstellung brauchst du eine Logik und keinen Logikbaustein.

        Kommentar


          #5
          Zitat von jonofe Beitrag anzeigen
          Das würde aber auch nur asugeführt, wenn E4 und E3 zur gleichen getriggert werden
          Ja, da hast du recht.

          Zitat von jonofe Beitrag anzeigen
          von der Problemstellung brauchst du eine Logik und keinen Logikbaustein.
          Hier gebe ich dir auch grundsätzlich recht. Allerdings kann man sich mit solchen Bausteinen auch in PHP einarbeiten.
          Ich mache es ja auch ab und zu, auch wenn es Teilweise anders zu lösen geht.

          Das hilft dann schon wenn man Fehler sucht und sich selbst ein wenig eingearbeitet hat.

          Zitat von ctx Beitrag anzeigen
          Nu habe ich Eingang 4 und 6 programmiert.
          wie muss ich das eigentlich verstehen. Vorher hat es irgendwie funktioniert?


          Kommentar


            #6
            Zitat von Michael85 Beitrag anzeigen
            Allerdings kann man sich mit solchen Bausteinen auch in PHP einarbeiten.
            Da gebe ich dir grundsätzlich auch Recht. Aber hier sind es so viele Punkte, die noch weit von einer lauffähigen Lösung weg sind, so dass man aus meiner Sicht kleiner anfangen sollte mit PHP und LBS Programmierung einzusteigen. Selbst mit den Kommentaren, die wir jetzt gegeben haben wird seine Frau am Ende nicht glücklich.

            Ich würde zuerst PHP lernen, dann mit einfachen EDOMI LBS anfangen, die nicht systemkritisch sind.
            Bis dahin würde ich Logiken, die über Glück/Unglück meiner Frau entscheiden einfach und konventionell lösen.

            Was ich übrigens aus eigener Erfahrung auch empfehlen kann: Zuerst die Hilfe erstellen und genau beschreiben, was der LBS machen soll, dann ist es viel leichter nachzuvollziehen, warum der am Ende vielleicht nicht das macht was er soll. Und damit meine ich nicht die Beschreibung, die in #1 steht.

            Kommentar


              #7
              Hallo Zusammen

              Danke für die Antworten.
              jonofe du hast natürlich recht mir fehlen viel Grundlagen.
              Gibt es dazu ein schlaues Buch das du empfehlen kannst.
              Das mit der Hilfe nehme ich mir auch zu herzen, werde ich heute Abend machen.

              Michael85
              Ich sehe das änlich wie du. Man kann das sicher auch mit einer Logik lösen aber ein Baustein wäre schöner.

              Für die Logik fehlen mir gerade die Inputs.. ich sehe da auch nur xy "Wenn-Dann" Bausteine und weiss ich nicht was alles.
              Daführ habe ich gerade Bahnhof in meinem Kopf, habe mich so auf den LBS fokussiert.

              Ich war schon mal weiter, aber so richtig funktioniert hat es nicht richtig (Siehe unten)

              Das Problem ist wohl das E6 nicht richtig getritter wird. Ich möchte hier eine 1 senden und das ganze HE System ausschalten.
              Sobald eine 1 bereits gesendet wurde verarbeitet er eine neue 1 nicht mehr.

              Die erste Funktion an E4 geht soweit, also ich kann die Boxen einschalten.

              PHP-Code:
              ###[DEF]###
              [name =Pawa Home-Entertainement ]
              [titel =Home-Entertainement ]

              [e#1 = TV_State_OnOff #init=0 ]
              [e#2 = Radio_State_OnOff #init=0 ]
              [e#3 = Speaker_State_OnOff #init=0 ]
              [e#4 = Cmd_Tv ]
              [e#5 = Cmd_Radio ]
              [e#6 = Cmd_Off ]


              [e#10 = Switch_Speaker_Input_State ]

              [a#1 = TV_Switch_On ]
              [a#2 = TV_Switch_Off ]
              [a#3 = Radio_Switch_On ]
              [a#4 = Radio_Switch_Off ]
              [a#5 = Speaker_Switch_On ]
              [a#6 = Speaker_Switch_Off ]
              [a#7 = Speaker_Switch_Coax ]
              [a#8 = Speaker_Switch_Opt ]
              [a#9 = Debug_SysState ]
              [a#10 = DebugInputState ]

              [v#1 EntertainementSystemState ]
              [v#2 Speaker_Input_State ]
              ###[/DEF]###


              ###[HELP]###


              EntertainementSystemState 0: System aus
              EntertainementSystemState 1: Play Tv
              EntertainementSystemState 2: Play Radio

              Speaker_Input_State 0: Opt
              Speaker_Input_State 1: Coax


              ###[/HELP]###


              ###[LBS]###
              <?
              function LB_LBSID($id){
              if ($E=logic_getInputs($id)){
              if (($E[4]['value']) && $E[4]['refresh']==1) {

              if(getLogicElementVar($id,1) == 0){
              //TV_Switch_On

              //Speaker_Switch_On if off
              if($E[3]['refresh'] == 1){
              if($E[3]['value'] == 0){
              logic_setOutput($id,5,1);
              logic_setOutput($id,6,0);
              }
              }

              //Speaker_Switch_Opt if in Coax State
              if (getLogicElementVar($id,2) == 1){
              logic_setOutput($id,8,1);
              // Intern save state of speaker input
              setLogicElementVar($id,2,0);
              logic_setOutput($id,10,0);
              }

              setLogicElementVar($id,1,1);
              logic_setOutput($id,9,1); // Debug
              }

              if(getLogicElementVar($id,1) == 1){
              }

              if(getLogicElementVar($id,1) == 2){
              logic_setOutput($id,8,1);
              // Intern save state of speaker input
              setLogicElementVar($id,2,0);
              logic_setOutput($id,10,0);


              }
              setLogicElementVar($id,1,1);
              logic_setOutput($id,9,1); // Debug
              }
              if (($E[5]['value']) && $E[5]['refresh']==1) {

              //Staring Radio Sequenze

              if(getLogicElementVar($id,1) == 0){
              //Radio_Switch_On

              //Speaker_Switch_On if off
              if($E[3]['refresh'] == 1){
              if($E[3]['value'] == 0){
              logic_setOutput($id,5,1);
              logic_setOutput($id,6,0);
              }
              }

              //Speaker_Switch_Coax if in Opt State
              if (getLogicElementVar($id,2) == 0){
              logic_setOutput($id,7,1);
              // Intern save state of speaker input
              setLogicElementVar($id,2,1);
              logic_setOutput($id,10,1);

              }
              setLogicElementVar($id,1,2);
              logic_setOutput($id,9,2); // Debug
              }

              if(getLogicElementVar($id,1) == 1){
              logic_setOutput($id,7,1);
              // Intern save state of speaker input
              setLogicElementVar($id,2,1);
              logic_setOutput($id,10,1);
              }
              setLogicElementVar($id,1,2);
              logic_setOutput($id,9,2); // Debug

              if(getLogicElementVar($id,1) == 2){


              }
              }
              if (($E[6]['value']) && $E[6]['refresh']==1) {
              if(getLogicElementVar($id,1) == 0){
              }
              if(getLogicElementVar($id,1) == 1){
              //TV_Switch_Off

              //Speaker_Switch_Off if on
              if($E[3]['refresh'] == 1){
              if($E[3]['value'] == 1){
              logic_setOutput($id,5,0);
              logic_setOutput($id,6,1);
              }
              }

              setLogicElementVar($id,1,0);
              logic_setOutput($id,9,0); // Debug
              }

              if(getLogicElementVar($id,1) == 2){
              //Speaker_Radio Off
              if($E[2]['refresh'] == 1){
              if($E[2]['value'] == 1){
              logic_setOutput($id,4,1);
              logic_setOutput($id,6,1);
              }
              }

              setLogicElementVar($id,1,0);
              logic_setOutput($id,9,0); // Debug
              }
              }
              if (($E[2]['value']) && $E[2]['refresh']==1) {
              // Wenn Radio automatisch ausgeschaltet wird durch Eingang 2
              if(getLogicElementVar($id,1) == 0){
              }

              if(getLogicElementVar($id,1) == 1){
              //Do noting
              }

              if(getLogicElementVar($id,1) == 2){
              //Speaker_Radio Off, wird direkt als 0 gesendet.
              if($E[1]['refresh'] == 1){
              if($E[2]['value'] == 1){
              logic_setOutput($id,4,0);
              logic_setOutput($id,6,1);
              }
              }

              setLogicElementVar($id,1,0);
              logic_setOutput($id,9,0); // Debug

              }
              }
              if (($E[10]['value']) && $E[10]['refresh']==1) {
              // Switch Speaker_Input_State
              if(getLogicElementVar($id,2) == 0){
              setLogicElementVar($id,2,1);
              }

              if(getLogicElementVar($id,2) == 1){
              setLogicElementVar($id,2,0);
              }


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


              ###[EXEC]###
              <?

              ?>
              ###[/EXEC]###

              Kommentar


                #8
                Ich glaube du machst viel zu viel Aufwand mit Variablen und Statuseingängen und separaten Ausgängen für on/off.
                Außerdem verwendest du $E[10] obwohl es nur 6 Eingänge gibt.

                Wenn du ein Statusobjekt an einem Eingang anliegen hast, brauchst du keine Variable mehr dafür, da du immer den Wert abfragen und verwenden kannst.

                Beschreib doch mal genau was der LBS machen soll. Ich habe verstanden, dass er folgendes machen soll

                1. Wenn TV eingeschaltet werden soll, dann sollen Ausgängen TV EIN, RADIO AUS, Aktivbox EIN und auf Eingang auf OPT geschaltet werden.
                2. Wenn Radio eingeschaltet werden soll, dann sollen Ausgänge TV AUS, Radio EIN, Aktivbox EIN und auf Eingang auf COAX geschaltet werden.
                3. Wenn alles AUSgeschaltet werden soll, dann sollen Ausgänge TV AUS, Radio AUS, Aktivbox AUS

                Wenn das stimmt, dann brauchst du aus meiner Sicht 3 Eingänge:

                E1: TV
                E2: Radio
                E3: AUS

                und 5 Ausgänge

                A1: TV schalten
                A2: Radio schalten
                A3: Aktivbox schalten
                A4: Aktivbox OPT
                A5: Aktivbox COAX

                Wenn E1=1 dann A1=1, A2=0, A3=1, A4=1
                Wenn E2=1 dann A1=0, A2=1, A3=1, A5=1
                Wenn E3=1 dann A1=0, A2=0, A3=0

                Fertig! Oder hab ichs falsch verstanden?

                In PHP:

                PHP-Code:

                function LB_LBSID($id)
                {
                if (
                $E=logic_getInputs($id)) {
                  if ((
                $E[1]['value']==1) && $E[1]['refresh']==1) {
                logic_setOutput($id,1,1);
                logic_setOutput($id,2,0);
                logic_setOutput($id,3,1);
                logic_setOutput($id,4,1);
                } elseif ((
                $E[2]['value']==1) && $E[2]['refresh']==1) {
                logic_setOutput($id,1,0);
                logic_setOutput($id,2,1);
                logic_setOutput($id,3,1);
                logic_setOutput($id,5,1);
                } elseif ((
                $E[3]['value']==1) && $E[3]['refresh']==1) {
                logic_setOutput($id,1,0);
                logic_setOutput($id,2,0);
                logic_setOutput($id,3,0);
                }
                } } 

                Kommentar


                  #9
                  Die Funktion ist Richtig.

                  So wie ich jetzt das getestet habe funktioniert auch alles bis auf eine Funktion.
                  Wenn ich vom TV direkt auf Radio (ode auch Umgekehrt) schalte, benötige ich nicht nochmal ein EIN Signal auf den Boxen, da diese ja schon laufen.

                  Ein weiteres EIN Signal würde die Boxe ausschalten da diese Power Toggel funktion haben. Also ein Knopf für Ein/Aus sprich ein IR Signal für Ein/Aus

                  Grundlegend muss ich dazu noch erklären.
                  Ich sende dann von EDOMI über MQTT an NodeRed weiter zu Logitech Harmony und diese dann per IR zu den Boxen.

                  Wichtig ist noch das bei der Umschalterei zwischen OPT und Coax muss immer geswitcht werden.
                  OPT und Coax haben beide auch ein OPT2 und Coax 2 also wen der OPT Befehl zwei mal kommt bin ich auf OPT 2 und dann geht nichts mehr weil der TV auf OPT 1 hängt. und OPT 2 ist leer. Dasselbe beim Coax 1 ist Radio und Coax 2 ist leer. Leider kann ich diese "übrigen" Eingänge nicht deaktivieren, das habe ich beim Hersteller schon angefragt.

                  Grundlgendes Ziel ist eigentlich das die Box von Edomi "verwaltet wird". Also er muss jederzeit wissen auf welchem Eingang er ist.
                  Wenn die Box Power Off ist nimmt sie bei Power On wieder den gleichen Eingang wie sie als letztes hatte.

                  Im Node-RED habe ich den Debug aufbau. Müsste nur noch die Switchs umhängen und dann ist es Live..
                  aber macht sich nicht so gut wenn die Frau TV schaut ;-)
                  Angehängte Dateien

                  Kommentar


                    #10
                    Node red kann noch auf die Harmony Box zugreifen?

                    Kommentar


                      #11
                      uzi10 ja bei mir geht das mit dem Flow : node-red-contrib-harmony-websocket

                      Kommentar


                        #12
                        Hallo jonofe oder wer sich auch immer gerne angesprochen fühlt um mir zu helfen.

                        Ich bin hier noch nicht weiter gekommen.. meine Kenntnisse für PHP reichen einfach noch nicht aus.
                        Ein Buch habe ich mir besorgt um das ein wenig zu lernen aber das dauert noch ewig.

                        Deshalb meine Anfrage an dich (oder jemand anders) kannst du mir das fertig bauen ? Gemäss meinem ursprünglichen Konzept ?

                        Gerne bin ich auch bereit etwas dazu zu bezahlen..

                        Ich habe hier mal die Hilfe ein wenig erweitert.


                        ###[DEF]###
                        [name =Pawa Home-Entertainement ]
                        [titel =Home-Entertainement ]

                        [e#1 = TV_State_OnOff #init=0 ]
                        [e#2 = Radio_State_OnOff #init=0 ]
                        [e#3 = Speaker_State_OnOff #init=0 ]
                        [e#4 = Cmd_Tv ]
                        [e#5 = Cmd_Radio ]
                        [e#6 = Cmd_Off ]


                        [e#10 = Switch_Speaker_Input_State ]

                        [a#1 = TV_Switch_On ]
                        [a#2 = TV_Switch_Off ]
                        [a#3 = Radio_Switch_On ]
                        [a#4 = Radio_Switch_Off ]
                        [a#5 = Speaker_Switch_On ]
                        [a#6 = Speaker_Switch_Off ]
                        [a#7 = Speaker_Switch_Coax ]
                        [a#8 = Speaker_Switch_Opt ]
                        [a#9 = Debug_SysState ]
                        [a#10 = DebugInputState ]

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


                        ###[HELP]###

                        [e#1 = TV_State_OnOff #init=0 ] = Status ob TV An oder Aus (Wird über Stromsensor dektiert, keine Rückmeldung des Gerätes möglich)
                        [e#2 = Radio_State_OnOff #init=0 ] = Status ob Radio An oder Aus
                        [e#3 = Speaker_State_OnOff #init=0 ] = Status ob Boxen An oder Aus (Wird über Stromsensor dektiert, keine Rückmeldung des Gerätes möglich)
                        [e#4 = Cmd_Tv ] = Kommando TV soll eingeschalten werden (1) oder Ausgeschalten (0)
                        [e#5 = Cmd_Radio ] = Kommando Radio soll eingeschalten werden (1) oder Ausgeschalten (0)
                        [e#6 = Cmd_Off ] = Kommando Alles auschalten


                        [e#10 = Switch_Speaker_Input_State ] = Hier kann manuell zwischen OPT und COAX der Box umgeschalten werden. Falls irgendwas nicht mehr stimmt.

                        [a#1 = TV_Switch_On ] = Ausgang TV Einschalten (1)
                        [a#2 = TV_Switch_Off ] = Ausgang TV Ausschalten (1)
                        [a#3 = Radio_Switch_On ] = Ausgang Radio Einschalten (1)
                        [a#4 = Radio_Switch_Off ] = Ausgang Radio Ausschalten (1)
                        [a#5 = Speaker_Switch_On ] = Ausgang Box Einschalten (1)
                        [a#6 = Speaker_Switch_Off ] = Ausgang Box Ausschalten (1)
                        [a#7 = Speaker_Switch_Coax ] = Ausgang Box Eingang umschalten auf Coax (1)
                        [a#8 = Speaker_Switch_Opt ] = Ausgang Box Eingang umschalten auf Opt (1)
                        [a#9 = Debug_SysState ] = Variabel 1 als Ausgang ( nur für Debug gebraucht )
                        [a#10 = DebugInputState ] = Variabel 2 als Ausgang ( nur für Debug gebraucht )



                        v#1
                        EntertainementSystemState 0: System aus
                        EntertainementSystemState 1: Play Tv
                        EntertainementSystemState 2: Play Radio

                        v#2
                        Speaker_Input_State 0: Opt
                        Speaker_Input_State 1: Coax

                        Dieser Baustein steuert ein Home-Entertainement System.

                        Bestehend aus folgenden Bauteilen:

                        Logitech Transporter (Radio )
                        Nubert Aktivlautsprecher X6000 (Box)
                        Samsung TV (TV)

                        Der Grundsatz des Baustein ist es eine vollautomatische Steuerung der Boxen zu gewährleisten.
                        In meinem konkreten Einsazt können die Boxen nur per Infrarot gesteuert werden.
                        Der Aktivlautsprecher wird über zwei Eingänge entsprechen versorgt.
                        Diese komplette Eingangsverwaltung soll über diesen Baustein gemanaget werden.
                        Das heist der Zustand der Box muss im Baustein gespeicher werden, da dieser nicht ausgelesen werden kann.


                        Die Boxen werden dabei jeweils eingeschalten wenn der TV eingeschalten wird oder auch wenn der Radio eingeschaltet wird.
                        Dabei muss an der Box jeweils der richtig Eingang gewählt werden.
                        Auch ein direktes umschalten der Box von Radio auf TV wird im Baustein gemanaget.
                        Daführ wurden die Variabeln V1 und V2 eingebaut diese bilden den Zustand des Systems ab in V1 und V2 ist für die verwaltung der Eingänge.

                        TV An = Box On Eingang auf OPT
                        Radio An = Box On Eingang auf Coax

                        Wechsel von TV auf Radio = Wechsel den Eingang von OPT auf Coax
                        und umgekehrt.

                        Wird der Lautsprecher ausgeschaltet und wieder eingschaltet bleibt sein Eingang im letzten Eingang den er beim ausschalten hatte.

                        Und natürlich die alles Aus funktion noch.

                        Kommentar


                          #13
                          ctx : Sorry, aber ich habe derzeit zu viele offene Projekte, um hier individuell zu unterstützen.

                          Kommentar

                          Lädt...
                          X