Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem oder Denkfehler mit Logik

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

    Problem oder Denkfehler mit Logik

    Ich möchte beim Öffnen eines Fensters geschossweise den Status "ein Fenster ist offen setzen". Wenn alle Fenster zu sind, soll der Status "alle Fenster zu" gesetzt werden.

    Das funktioniert für das EG, aber nicht für das OG und ich verstehe nicht, warum:

    Alle items mit "fenster" triggern die Logik fenster.py:

    Code:
    # logic.conf
    [fenster_status]
    	filename = fenster.py
    	watch_item = *.*.fenster*
    Code:
    #!/usr/bin/env python
    # GA Status Fenster EG/OG setzen
    # "ZU" (1/True) wenn alle Fenster im Geschoss geschlossen sind
    # "AUF" (0/False) wenn irgendein Fenster im Geschoss offen ist
    
    status_eg = True
    status_og = True
    
    for item in sh.match_items('eg.*.fenster*'):
    	if not item:
    		status_eg = False
    
    if status_eg:
    	sh.eg.fenster('on')
    else:
    	sh.eg.fenster('off')
    	
    for item in sh.match_items('og.*.fenster*'):
    	if not item:
    		status_og = False
    
    if status_og:
    	sh.og.fenster('on')
    else:
    	sh.og.fenster('off')
    Das funktioniert problemlos im EG:

    Code:
    [eg]
    	name = Erdgeschoss
    	[[fenster]]
    		name = "Fenster EG"
    		type = bool
    		knx_dpt = 1
    		knx_status = 4/1/31			# GA mit dem Status für alle Fenster EG 
    
    (...)
    
    [[az]]
    		name = Arbeitszimmer
    
    (...)
    
    		[[[fenster]]]
    			name = "Fenster AZ"
    			type = bool
    			knx_dpt = 1
    			knx_cache = 4/1/9
    Code:
    2014-08-10 17:46:32,445 DEBUG    Main         Item eg.az.fenster = False via KNX 1.1.31 4/1/9 -- item.py:__update:363
    2014-08-10 17:46:32,452 DEBUG    Main         Triggering fenster_status - by: Item source: eg.az.fenster dest: None value: False -- scheduler.py:trigger:162
    2014-08-10 17:46:32,464 DEBUG    fenster_status Item eg.fenster = False via Logic None None -- item.py:__update:363
    2014-08-10 17:46:32,500 DEBUG    Main         knx: 1.1.254 set 4/1/31 to 00 -- __init__.py:parse_telegram:181
    Im OG wird die Logik zwar getriggert, macht aber nichts:

    Code:
    [og]
    	name = Obergeschoss
    	[[fenster]]
    		name = "Fenster OG"
    		type = bool
    		knx_dpt = 1
    		knx_status = 4/1/32			# GA mit dem Status für alle Fenster OG 
    
    (...)
    
    	[[sz]]
    		name = Schlafzimmer
    
    (...)
    
    		[[[fenster]]]
    			name = "Fenster SZ"
    			type = bool
    			knx_dpt = 1
    			knx_cache = 4/1/15
    Code:
    2014-08-10 17:46:57,657 DEBUG    Main         Item og.sz.fenster = False via KNX 1.1.81 4/1/15 -- item.py:__update:363
    2014-08-10 17:46:57,665 DEBUG    Main         Triggering fenster_status - by: Item source: og.sz.fenster dest: None value: False -- scheduler.py:trigger:162
    Irgendwas an meinem Python-Code ist falsch - aber ich steh' gerade auf dem Schlauch...

    #2
    Hallo,

    ich habe (leider) noch nie genug Zeit gehabt um mich groß mit Python zu befassen, aber man könnte ja mal versuch OG und EG zu trennen also in 2 Logiken zu Packen. Z.b. so:
    Code:
    # logic.conf
    [fenster_status_eg]
    	filename = fenster_eg.py
    	watch_item = eg.*.fenster*
    [fenster_status_og]
    	filename = fenster_og.py
    	watch_item = og.*.fenster*
    Natürlich noch die beiden Logik Dateien erstellen.

    Z.b. so: (fenster_eg.py)
    Code:
    #!/usr/bin/env python
    # GA Status Fenster EG/OG setzen
    # "ZU" (1/True) wenn alle Fenster im Geschoss geschlossen sind
    # "AUF" (0/False) wenn irgendein Fenster im Geschoss offen ist
    
    status_eg = True
    
    for item in sh.match_items('eg.*.fenster*'):
    	if not item:
    		status_eg = False
    
    if status_eg:
    	sh.eg.fenster('on')
    else:
    	sh.eg.fenster('off')
    Und so: (fenster_og.py)
    Code:
    #!/usr/bin/env python
    # GA Status Fenster EG/OG setzen
    # "ZU" (1/True) wenn alle Fenster im Geschoss geschlossen sind
    # "AUF" (0/False) wenn irgendein Fenster im Geschoss offen ist
    
    status_og = True
    
    for item in sh.match_items('og.*.fenster*'):
    	if not item:
    		status_og = False
    
    if status_eg:
    	sh.og.fenster('on')
    else:
    	sh.og.fenster('off')
    Angaben nach bestem Wissen und Gewissen (Inhalt und Rechtschreibung)

    Kommentar


      #3
      Moin,
      ich würde das testweise auch mal wie von ErKi vorgeschlagen trennen.
      Bin ebenfalls nicht die Python Leuchte, aber ich denke deine Logik geht nur in die zweite for-Schleife wenn status_eg = false
      Alternativ noch einiges an Klammern setzen.

      Wenn ich so drüber nachdenke würde ich sogar sagen, dass du versuchst die zweite Schleife innerhalb der ersten aufzurufen. Und in dem Fall kann og nie true werden, da nur bei eg items die Schleife überhaupt in den og Teil läuft.
      Aber wie gesagt, ich bin da nicht die Leuchte und es kann sein, dass ich das völlig falsch verstehe.

      Gruß, Sebastian
      Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
      Ruhri? -> Komm zum Stammtisch

      Kommentar


        #4
        Zitat von ErKi Beitrag anzeigen
        aber man könnte ja mal versuch OG und EG zu trennen also in 2 Logiken zu Packen.
        Habe ich mal probiert, hat aber (erwartungsgemäss) nichts am Verhalten im OG verändert. Ich habe mal weiter debugt und eigentlich wird das Skript i.W. korrekt abgearbeitet, aber aus irgendwelchen Gründen scheint im OG-Code - egal ob in einem *.py-File oder in getrennten - sh.og.fenster() nicht ausgeführt zu werden. Ich habe aber keine Ahnung, warum nicht

        Im (im Prinzip identischen) Skript für's EG klappt's. Ich kann auch nicht wirklich einen Unterschied in der item.conf für das OG finden, zumal die items selbst (also z.B. og.sz.fenster für das Schlafzimmerfenster im OG) ja auch korrekt erkannt und zugeordnet zu werden scheinen.

        Zitat von Bainit Beitrag anzeigen
        aber ich denke deine Logik geht nur in die zweite for-Schleife wenn status_eg = false
        Alternativ noch einiges an Klammern setzen.
        Nee, das ist schon OK und Klammern gehören da nicht hin

        Kommentar


          #5
          Hi,

          bin py-Newbie und könnte auch nur ein paar Vermutungen anstellen, aber das wird Dir ws. nicht weiterhelfen.
          Ich bin hier einen einfacheren Weg für den Fenster-Status gegangen, indem ich simpel über Eval in den Items das ganze Thema abfrühstücke.
          Vielleicht hilft's Dir ja weiter.... Hatte am Anfang auch so meine Schwierigkeiten in den Logiken und versuche nun das Thema eher Modular aufzubauen und die simplen "and/or's" direkt im item abzufangen und setze dann lieber mit einer Logik auf diesem Item auf....
          Code:
              [[OeffnungsStatusEG]]
                  type = bool
                  eval = or
                  eval_trigger = EG.*.Fenster|EG.*.Tuere
                  enforce_updates = yes

          Kommentar


            #6
            Ich bin mir nicht sicher, dass mir das weiterhilft, da es ja um 'ne ganze Menge Fenster geht und dann wird das mit eval schon ein bisschen lästig (vor allem unter SW-Wartungsgesichtspunkten).

            Aber Danke für den Tip.

            Nichtsdestotrotz würde ich mich über Tips freuen, wie ich meinen Ansatz über ein Python-Skript hin kriege, denn mich fuchst ganz gewaltig, dass ich derzeit keinen Schimmer habe, warum das nicht funktioniert

            Kommentar


              #7
              Hallo,

              ich bin mir nicht sicher, ob es daran liegt, es ist aber auf jeden Fall falsch.
              In der Logik verwendest Du 'item'. Damit sprichst Du das Objekt an. Du willst aber den Wert von dem Objekt/Item. Den bekommst Du mit 'item()'.

              Bis bald

              Marcus

              Kommentar


                #8
                Hi Marcus,

                nein, daran liegt's nicht

                Code:
                #!/usr/bin/env python
                # GA Status Fenster EG/OG setzen
                # "ZU" (1/True) wenn alle Fenster im Geschoss geschlossen sind
                # "AUF" (0/False) wenn irgendein Fenster im Geschoss offen ist
                
                status_og = True
                
                for item in sh.match_items('og.*.fenster*'):
                	if not item():
                		status_og = False
                
                if status_og:
                	sh.og.fenster('on')
                else:
                	sh.og.fenster('off')
                Das zeigt exakt das gleiche Verhalten.

                Wie gesagt, es sieht so aus, als würde sh.og.fenster() aus irgendwelchen Gründen nicht ausgeführt.

                Das item sh.og.fenster an sich funktioniert ebenfalls - wenn ich im interaktiven Modus den Status über das item setze funktioniert ebenfalls alles - nur die Logik scheint das item nicht zu triggern.

                Wenn's denn für die EG-items auch nicht funktionieren würde... Ich bin echt ratlos. Gibt's noch irgendwelche Tips, wonach ich suchen kann/sollte?

                Gruss,
                Dirk

                Kommentar


                  #9
                  Hi Dirk,

                  ich denk das Script passt jetzt.
                  Ohne (komplettes) Debuglog kann ich aber nichts sehen...

                  Davon abgesehen könnten man statt:

                  Code:
                  if status_og:
                  	sh.og.fenster('on')
                  else:
                  	sh.og.fenster('off')
                  auch einfach

                  Code:
                  sh.og.fenster(status_og)
                  schreiben.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Zitat von mknx Beitrag anzeigen
                    Ohne (komplettes) Debuglog kann ich aber nichts sehen...
                    Naja, da steht halt nicht wirklich was 'drin: Irgendein Fenster wird aufgemacht, eines meiner og.*.fenster*-items triggert die Logik, aber sh.og.fenster wird nicht ausgeführt. Ich hab' ja im ersten Post die entsprechenden Auszüge aus dem Debug-Log gepostet.

                    Wenn du mehr brauchst, sag' Bescheid, was ich dir schicken soll (und wohin ).

                    Gruss,
                    Dirk

                    Kommentar


                      #11
                      Hi,
                      hast Du denn schon versucht mit logger.info im py-script an den entsprechenden Stellen zu debuggen? Mir hilft das immer um herauszufinden welchen if-else Weg mit welchen variablen-Werten die Logik geht. Damit lässt es sich ggf. für Dich weiter eingrenzen wo was schiefgeht.

                      Kommentar


                        #12
                        Zitat von DiMa Beitrag anzeigen
                        Wenn du mehr brauchst, sag' Bescheid, was ich dir schicken soll (und wohin ).
                        Ich würde ein Debug-Log ab sh.py start vorschlagen.
                        Gezippt angehängt an deinem nächsten Post.

                        Es könnte ein Syntax-Fehler gemeldet werden -der ist nur beim Start von Sh.py sichtbar. Nur als Beispiel.

                        Gruß,
                        Hendrik

                        Kommentar


                          #13
                          Kein Problem, hängt an. Mir ist aber nichts dergleichen aufgefallen und wie gesagt: Das Seltsame ist, dass die Logik ja eigentlich für EG und OG identisch ist. EG tut's, OG nicht...

                          Bei 2014-08-12 19:48:56,235 habe ich ein Fenster im EG (sh.eg.az.fenster) auf und wieder zu gemacht (funktioniert alles wie gewünscht, sh.eg.fenster wird bei 2014-08-12 19:48:56,246 auf "Fenster offen" (False) und bei 2014-08-12 19:48:59,026 auf "Fenster geschlossen" (True) gesetzt).

                          Bei 2014-08-12 19:49:17,122 habe ich das gleiche im OG gemacht (sh.og.sz.fenster), aber sh.og.fenster wird gar nicht erst gesetzt, obwohl die Logik getriggert wird.
                          Angehängte Dateien

                          Kommentar


                            #14
                            Hallo Dirk,

                            sichere mal Deine Logik und ersetze sie mit:

                            Code:
                            status_og = True
                            
                            for item in sh.match_items('og.*.fenster*'):
                                logger.info("{0}: {1}".format(item, item()))
                                if not item():
                                    status_og = False
                                    break
                            
                            sh.og.fenster(status_og)
                            Sind dann alle Items True?

                            Bis bald

                            Marcus

                            Kommentar


                              #15
                              Bis auf das eine gegenwärtig offene Fenster im OG (Balkontür K3): Ja.

                              Allerdings wechseln im Log in K1 Fenster einmal ihren Status - kann aber sein, dass meine Tochter da gerade Fenster auf und zu gemacht hat, die ist gerade in ihrem Zimmer. Wenn das wichtig für die Fehlersuche ist, muss ich nochmal neu starten und allen Mitbewohnern so lange auf die Finger gucken

                              sh.og.fenster wird auch mit deinem Code nicht gesetzt.
                              Angehängte Dateien

                              Kommentar

                              Lädt...
                              X