Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

logic/plugin - Nachts nachdimmen

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

    [Codebeispiel] logic/plugin - Nachts nachdimmen

    Gibt es da schon ein fertiges plugin/logic ?

    Ich hatte das mal fürs WireGate in Perl programmiert und hätte das hier auch gern Minutengenau und für unterschiedliche Zeiten für unterschiedliche Leuchten. Zum zweiten mal möchte ich aber das Rad ungern erfinden ...

    Falls nicht, ist das eher was für ein Plugin oder die Logic? Ich würde mich beidem annehmen.


    Grüße
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    #2
    Hi Mirko,

    Niko hat da was gemacht.
    Ich denke es ist eine kleine Logik. Und ich würde eine Logik auch als passend ansehen.

    Bis bald

    Marcus

    Kommentar


      #3
      logic/plugin - Nachts nachdimmen

      Ich hab dafür ne kleine Logik gebaut:

      Code:
      #!/usr/bin/env python
       
      # This logic sets an item specified with 'set_item' to 
      # a given value if the 'watch_item' is true.
      # The value is 30 on default. You can change it by setting
      # 'set_value'. You can also specify another value for the
      # night by setting 'night_value'. Further more you can specifiy
      # a conditional item plus value with 'cond_item' and 'cond_value'.
      # If the conditional item is true the logic sets the value specified
      # by 'cond_value'.
       
      val = 30  # default value
      now = sh.now()
      day = now.hour > 7 and now.hour < 22
      
      # look for a value to set
      if hasattr(logic, 'set_value'):
          val = logic.set_value
       
      # in the night there is maybe another value to set
      if not day:
          if hasattr(logic, 'night_value'):
              val = logic.night_value
       
      # and on a condition we can also use another value
      if hasattr(logic, 'cond_item') and hasattr(logic, 'cond_value'):
          if sh.return_item(logic.cond_item)():
              val = logic.cond_value
       
      # and now set the value to the specified item
      # if the watch item is set
      if hasattr(logic, 'watch_item'):
          if sh.return_item(logic.watch_item[0])():
              sh.return_item(logic.set_item)(val)
      kann dann so verwendet in etc/logic.conf werden:

      Code:
      ['dim_dg_ankleide']
          filename = 'set_value.py'
          watch_item = dg.ankleide.licht
          set_item = dg.ankleide.licht.wert
          set_value = 100
          night_value = 30
          cond_item = modus.schlafen
          cond_value = 5
      Mit freundlichen Grüßen
      Niko Will

      Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
      - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

      Kommentar


        #4
        Ich muss nochmal stören

        Die logic von Niko läuft, gefiel mir aber nicht so wirklich ... ich wollte es flexibler.
        Also einfach die Verfahrensweise aus dem WireGate-Plugin eingebaut - funktioniert auch grundsätzlich lediglich das item setzen und ich find den Fehler nicht.

        Bei Code nicht erschrecken ... der steckt jetzt noch voller prints fürs debuggen. Der rote Teil ist der Block fürs setzen des items welcher nicht funktioniert. Gleiche config

        logic.conf
        Code:
        [dimmen]
            filename = 'set_value.py'
            watch_item = og.arbeiten.licht_decke.switch
            set_item = og.arbeiten.licht_decke.dim
            set_value = 100
            night_value = 25
            start_time = '10:00'
            end_time = '22:00'
            #cond_item = modus.schlafen
            #cond_value = 5
        set_value.py
        Code:
        #!/usr/bin/env python
         
        now = sh.now()
        
        # look for a value to set
        if hasattr(logic, 'set_value'):
            val = logic.set_value
        if hasattr(logic, 'start_time'):
            start_time = logic.start_time
        if hasattr(logic, 'end_time'):
            end_time = logic.end_time
        
        # in the night there is maybe another value to set
        if hasattr(logic, 'night_value'):
        	unix = now.strftime('%s')
        	sh,sm = start_time.split(':')
        	eh,em = end_time.split(':')
        	sh = int(sh)
        	print "sh {0}".format(sh)
        	sm = int(sm)
        	print "sm {0}".format(sm)
        	eh = int(eh)
        	print "eh {0}".format(eh)
        	em = int(em)
        	print "em {0}".format(em)
        
        	print now
        
        	start = datetime.datetime(now.year, now.month, now.day, sh, sm, 0, 0)
        	unix_start = int(start.strftime('%s'))
        	print start
        
        	end = datetime.datetime(now.year, now.month, now.day, eh, em, 0, 0)
        	unix_end = int(end.strftime('%s'))
        	print end
        
        	print unix
        	print unix_start
        	print unix_end
        
        	###Startzeit vor Endzeit z.B. 14-18 Uhr
        	if sh <= eh: ###Startzeit vor Endzeit z.B. 14-18 Uhr
        		print "Startzeit vor Endzeit"
        		if int(unix) < int(unix_end) and int(unix) > int(unix_start):
        			val = logic.night_value
        			print "DIMMEN: CASE 1"
        		#seems to be obsolete
        		if sm > em and sh == eh:
        			val = logic.night_value
        			print "DIMMEN: CASE 2"
        
        	### Startzeit nach Endzeit z.B. 18-7 Uhr
        	if sh > eh: ### Startzeit nach Endzeit z.B. 18-7 Uhr
        		print "Startzeit nach Endzeit"
        		if int(unix) > int(unix_start):
        			val = logic.night_value
        			print "DIMMEN: CASE 3"
        
        		if int(unix) < int(unix_end):
        			val = logic.night_value
        			print "DIMMEN: CASE 4"
        
        # and on a condition we can also use another value
        if hasattr(logic, 'cond_item') and hasattr(logic, 'cond_value'):
            if sh.return_item(logic.cond_item)():
                val = logic.cond_value
        
        [COLOR="Red"]# and now set the value to the specified item
        # if the watch item is set
        if hasattr(logic, 'watch_item'):
            if sh.return_item(logic.watch_item[0])():
                sh.return_item(logic.set_item)(val)[/COLOR]

        log
        Code:
        2013-06-11 15:27:28,607 SmartHome.py DEBUG    og.arbeiten.licht_decke.switch = True via KNX 1.1.201 -- item.py:_update:214
        2013-06-11 15:27:28,642 SmartHome.py DEBUG    Triggering dimmen - by: Item source: og.arbeiten.licht_decke.switch destination: None value: True -- scheduler.py:trigger:117
        2013-06-11 15:27:28,650 1w-sen       DEBUG    ow.OG_Gaestezimmer_RL = 22.5 via 1-Wire /bus.3/28.9B6563040000/temperature10 -- item.py:_update:214
        sh 10
        sm 0
        eh 22
        em 0
        2013-06-11 15:27:28.704914+02:00
        2013-06-11 10:00:00
        2013-06-11 22:00:00
        1370957248
        1370937600
        1370980800
        Startzeit vor Endzeit
        DIMMEN: CASE 1
        2013-06-11 15:27:28,739 dimmen       WARNING  Logic: dimmen, File: set_value.py, Line: 71, Method: <module>, Exception: 'int' object has no attribute 'return_item' -- scheduler.py:_task:273
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          ganz einfach, weiter oben in deiner Logik überschreibst du die Variable sh = smarthome für den Zugriff auf return_item mit

          Code:
          sh,sm = start_time.split(':')
          und später mit

          Code:
          sh = int(sh)
          daher die Fehlermeldung das sh ein int ist und kein return_items hat
          Mit freundlichen Grüßen
          Niko Will

          Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
          - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

          Kommentar


            #6
            AW: logic/plugin - Nachts nachdimmen

            Ahhh shit...Danke.

            Baustelle 2.0
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Eine Frage bleibt ... warum übergibt er das item nicht als Prozentwert ?
              Trage ich "25" bei night_value ein dann wird auf 10% gedimmt.
              Muss ich das "manuell" vorrechnen oder gibt es da einen Fehler in meiner config ?

              Grüße

              item.conf
              Code:
              [og]
                  [[arbeiten]]
                      [[[licht_decke]]]
                          [[[[switch]]]]
                              type = bool
                              knx_dpt = 1
                              knx_send = 1/2/10
                              knx_listen = 1/2/11
                              knx_init = 1/2/11
                              visu = yes
                          [[[[dim]]]]
                              type = num
                              knx_dpt = 5
                              knx_send = 1/2/13
                              knx_listen = 1/2/13
                              knx_init = 1/2/13
                              visu = yes
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #8
                probier mal knx_dpt = 5001

                Bis bald

                Marcus

                Kommentar


                  #9
                  logic/plugin - Nachts nachdimmen

                  Oh ja, sorry... hätte ich vielleicht dazu schreiben sollen. Wegen meiner ersten handgestrickten Visu ist bei mir alkes numerische DPT 5.001 (also 5001 in sh.py) damit der Wertebereich von 0 bis 100 geht (war einfacher für Slider).
                  Mit freundlichen Grüßen
                  Niko Will

                  Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                  - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                  Kommentar


                    #10
                    Das "Nachts nachdimmen" benötige/verwende ich auch. Momentan ist das mein einzig verbliebenes Perl-Plugin für den wiregated - weil ich hier mehrere Lampen als "Liste" überwachen und dimmen kann und nicht für jede Lampe eine Logik brauche.
                    Funktion: Perl-Plugin lauscht einzig auf einer GA, ob der Nachtmodus aktiviert wird. Falls ja, wird über einen Hash von Lampen die überwacht werden soll iteriert und diese nun ebenfalls überwacht. Wenn eine überwachte GA geschrieben wird, kann die GA als Adresse des Hash nachgedimmt werden.

                    Frage: Kann man das irgendwie nachbilden?

                    Ideal wäre, wenn ich wie bei einem sh-Plugin in der item-Definition schon als Attribut angeben könnte "night_brightness = 35", dieses dann bei der Initialisierung des "Plugin" mit einer Art "Parse_Item" übernommen werden kann und entsprechend überwacht wird (gegebenenfalls dies sogar nur wenn eben der "Nachtmodus" aktiviert ist).

                    Sinn der Übung wäre das Plugin/die Logik einfach ohne direkten Bezug zu den Lampen laufen zu lassen und in eben der Item-Definition jeweils die Parametrierung (Überwachungs-Item, Schreib-Item, Helligkeitswert etc.) vorzunehmen.

                    Grüße
                    Robert

                    Kommentar


                      #11
                      Hallo Robert, das sollte doch möglich sein. Zur Not als Plugin.
                      Ich hab jetzt erstmal mehrere Logikblöcke definiert die alle auf die gleiche logic zugreifen (nachdimmen.py). Für mich ist es wichtig unterschiedliche Zeiten (wenigstens halbstündlich) zu definieren da ich im Flur OG eher eine Dimmung haben möchte als im Flur EG (Schlafenszeit Eltern vs. Schlafenszeit Kinder). Wenn das jemand noch anders umsetzt dann bitte auch unter Angabe der Uhrzeit die es betrifft .
                      DPT 5001 funktioniert übrigens dann wie erwartet.

                      Hier meine aktuelle Lösung:

                      logic.conf
                      Code:
                      [nachdimmen_og_flur]
                          filename = 'nachdimmen.py'
                          watch_item = og.flur.licht_decke.switch
                          set_item = og.flur.licht_decke.dim
                          #set_value = 100
                          night_value = 20
                          start_time = '21:30'
                          end_time = '07:00'
                          #cond_item = example.item
                          #cond_value = 0815
                      nachdimmen.py
                      Code:
                      #!/usr/bin/env python
                      val = 30 #set default
                      now = sh.now()
                      
                      # look for a value to set
                      if hasattr(logic, 'set_value'):
                          val = logic.set_value
                      if hasattr(logic, 'start_time'):
                          start_time = logic.start_time
                      if hasattr(logic, 'end_time'):
                          end_time = logic.end_time
                      
                      # in the night there is maybe another value to set
                      if hasattr(logic, 'night_value'):
                          unix = now.strftime('%s')
                          starthour,startminute = start_time.split(':')
                          endhour,endminute = end_time.split(':')
                          starthour = int(starthour)
                          startminute = int(startminute)
                          endhour = int(endhour)
                          endminute = int(endminute)
                          start = datetime.datetime(now.year, now.month, now.day, starthour, startminute, 0, 0)
                          unix_start = int(start.strftime('%s'))
                          end = datetime.datetime(now.year, now.month, now.day, endhour, endminute, 0, 0)
                          unix_end = int(end.strftime('%s'))
                      
                          ###starthour before endhour: i.e. 14-18 Uhr
                          if starthour <= endhour:
                      	#case 1:
                      	if int(unix) < int(unix_end) and int(unix) > int(unix_start):
                      	    val = logic.night_value
                      	    #logger.info('LOGIC---{0}---: dimming case 1'.format(logic.name))
                      	# case 2 - seem to be obsolete
                      	if startminute > endminute and starthour == endhour:
                      	    val = logic.night_value
                      	    #logger.info('LOGIC---{0}---: dimming case 2'.format(logic.name))
                      
                          ### starthour after endhour: i.e. 18-7 Uhr
                          if starthour > endhour:
                      	#case 3
                      	if int(unix) > int(unix_start):
                      	    val = logic.night_value
                      	    #logger.info('LOGIC---{0}---: dimming case 3'.format(logic.name))
                      	#case 4:
                      	if int(unix) < int(unix_end):
                      	    val = logic.night_value
                      	    #logger.info('LOGIC---{0}---: dimming case 4'.format(logic.name))
                      	    
                      # and on a condition we can also use another value
                      if hasattr(logic, 'cond_item') and hasattr(logic, 'cond_value'):
                          if sh.return_item(logic.cond_item)():
                              val = logic.cond_value
                      	#logger.info('LOGIC---{0}---: dimming at condition'.format(logic.name))
                      
                      # and now set the value to the specified item
                      # if the watch item is set
                      if hasattr(logic, 'watch_item'):
                          if sh.return_item(logic.watch_item[0])():
                              sh.return_item(logic.set_item)(val)
                      Umgezogen? Ja! ... Fertig? Nein!
                      Baustelle 2.0 !

                      Kommentar


                        #12
                        Ich würde dafür kein Plugin verwenden, da es eigentlich keins ist. Aber du kannst ja erstmal beliebige Attribute je Item definieren. Man könnte also ohne Probleme ein Item so definieren:

                        Code:
                        [eg]
                            [[kitchen]]
                                [[[light]]]
                                    [[[[switch]]]]
                                        ...
                                    [[[[value]]]]
                                        type = num
                                        night_brightness = 50
                                        night_start = 22:00
                                        night_end = 7:00
                        Nun macht man eine Logik, bei der man die watch items über Wildcards definiert (siehe https://knx-user-forum.de/smarthome-...ogic-conf.html):

                        Code:
                        [nachdimmen]
                            filename = 'nachdimmen.py'
                            watch_item = *.*.light.switch
                        In der Logik holt man sich dann das parent des auslösenden watch_items, schaut ob das ein child namens "value" hat und anschließend noch ob das die "nigth_xxx" Attribute besitzt, wenn ja werden diese eben ausgesteuert.
                        Mit freundlichen Grüßen
                        Niko Will

                        Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                        - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                        Kommentar


                          #13
                          Will man sich auf einen Weg einigen?
                          Wer baut es entsprechend um? Ich hätte keine Not damit.
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #14
                            Sollte nur eine Anregung sein, wie man es umsetzen kann. Bei mir funktioniert es so wie es ist, für mich also nicht notwendig. Man kann das auch als Plugin lösen, nur gehört das dann IMHO nicht ins Repo.
                            Mit freundlichen Grüßen
                            Niko Will

                            Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
                            - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

                            Kommentar


                              #15
                              Ich nehme da Helligkeit als Trigger und nicht feste Zeiten...
                              Derzeit zwischen Kistenauspacken und Garten anlegen.
                              Baublog im Profil.

                              Kommentar

                              Lädt...
                              X