Ankündigung

Einklappen
Keine Ankündigung bisher.

hysteresis_state

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

    hysteresis_state

    Hi,

    Ich versuche mich gerade an dem neuen Hysterese Attribut.
    Grundgedanke dahinter ist, sobald Stufe1 länger als 1 Minute auf 1 steht, wird die Warmwasserproduktion getriggert.

    Code:
    Power:
        P_Minus:
           Stufe1:
                type: num
                eval: 1 if sh.Power.P_Minus() > 1000 and sh.Power.P_Minus() <= 3000 else 0
                eval_trigger: Power.P_Minus
                enforce_updates: 'True'
                cache: 'yes'
    
                Hysterese_Stage1:
                    type: bool
                    name: 'EnergieStufe1'
                    hysteresis_input: Power.P_Minus.Stufe1
                    hysteresis_upper_threshold: 0 ; 60​
    Das klappt aber leider so nicht.
    Code:
    2024-02-07  08:16:03 ERROR    lib.item.item       Item 'Power.P_Minus.Stufe1.Hysterese_Stage1': __run_attribute_eval(None): Attribute expression 'None' evaluated to a non-numeric value 'None', using 0 instead
    Ich verstehe nicht warum hier ein 'None' auftaucht. Auch mit dem 'hysteresis_state()' Befehl bekomme ich kein Ergebnis.

    Ich habe es auch schon mit upper und lower threshold probiert aber damit ist es, zumindest aus meiner Sicht, nicht möglich das Item NUR auf 'True' zusetzen wenn der Wert zwischen upper and lower liegt.

    Wo liegt mein Denkfehler?

    mfg
    Markus


    #2
    Das 'None' bezieht sich vermutlich auf den fehlenden lower threshold.

    Zudem hat Power.P_Minus keine Attribute. Woher kommen die Daten, die das eval in Power.P_Minus.Stufe1 auswerten soll?

    Gruß
    Wolfram
    Zuletzt geändert von wvhn; 07.02.2024, 09:45.

    Kommentar


      #3
      Zitat von wvhn Beitrag anzeigen
      Das 'None' bezieht sich vermutlich auf den fehlenden lower threshol
      Nein, es müssen nicht unbedingt beide Thresholds angegeben werden.

      Wie aus dem Logeintrag hervor geht, liegt das Problem im eval Attribut. Dort wird auf sh.Power.P_Minus() zugegriffen. Das Item Power.P_Minus hat jedoch kein type Attribut. Daher hat das Item den Typ foo und Items des Typs foo werden auf None initialisiert.
      Viele Grüße
      Martin

      There is no cloud. It's only someone else's computer.

      Kommentar


        #4
        Ok, ich hatte nicht alle Attribute von P_Minus bekannt gegeben. Aktueller stand...

        Code:
        Power:
        
            P_Minus:
                type: num
                knx_dpt: 14
                knx_cache: 9/0/22
                visu_acl: rw
                database: 'init'
                cache: 'yes'
        
                Time:
                    type: num
                    initial_value: 1
        
                Limit:
                    type: num
                    value: 0
        
               Stufe1:
                    type: num
                    eval: 1 if sh.Power.P_Minus() > 1000 and sh.Power.P_Minus() <= 3000 else -1
                    eval_trigger: Power.P_Minus
                    enforce_updates: 'True'
                    cache: 'yes'
        
                    Hysterese_Stage1:
                        type: bool
                        name: 'EnergieStufe1'
                        hysteresis_input: Power.P_Minus.Stufe1
                        hysteresis_upper_threshold: sh.Power.P_Minus.Limit() ; sh.Power.P_Minus.Time()
                        hysteresis_lower_threshold: sh.Power.P_Minus.Limit() ; sh.Power.P_Minus.Time()​
        Damit funktioniert es jetzt, jedoch liefert 'sh.Power.P_Minus.Stufe1.Hysterese_Stage1.hysteres is_state()' kein Ergebnis aber auch keine Fehlermeldung.
        Ich vermute das liegt am selben Limit für upper and lower.

        Kommentar


          #5
          Was für eine Hysteresis Kurve erwartest Du denn, wenn Du das Upper Limit und das Lower Limit gleich setzt?

          Die Voraussetzung ist schon, dass das Upper Limit > Lower Limit ist.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Zitat von Msinn Beitrag anzeigen
            Was für eine Hysteresis Kurve erwartest Du denn, wenn Du das Upper Limit und das Lower Limit gleich setzt?
            Maximal 'On', 'Timer --> On' bzw. 'Off', 'Timer Off' aber das ist als 'Nice to have' zu werten. Insgesamt ein tolles Feature. DANKE dafür.

            Kommentar


              #7
              Zitat von Msinn Beitrag anzeigen
              Nein, es müssen nicht unbedingt beide Thresholds angegeben werden..
              Das hatte ich befürchtet, aber keinen Hinweis in der Doku gefunden. Gibt es default-Werte für die thresholds oder nimmt die Hysterese dann eben nur die Werte an, für die thresholds definiert sind? Also würde die Hysterese-Funktion bei fehlendem lower_threshold nur 'On' und 'Timer -> On' annehmen, aber niemals 'Off'?

              Gruß
              Wolfram

              Kommentar


                #8
                Ein fehlender Threshold wird mit 0 angenommen. Der zugehörige Timer ist None (also ohne Verzögerung).

                Die Auswertung bleibt unverändert:

                Falls Wert > Upper -> On
                Falls Wert < Lower -> Off

                Das gibt natürlich evtl. merkwürdige Konstelationen, falls z.B. Lower=10 gesetzt ist und Upper nicht gesetzt ist (also 0)

                Dann wird Falls der Wert > 0 ist, zuerst bei der Prüfung für "Upper" On gesetzt und anschließend bei der Prüfung für "Lower" wird Off gesetzt (falls der Wert <= 10 ist

                Viele Grüße
                Martin

                There is no cloud. It's only someone else's computer.

                Kommentar


                  #9
                  (gelöscht, Martin war schneller)

                  Kommentar


                    #10
                    Wie erwähnt, funktioniert die Hysterese soweit. Diese soll jetzt auch eine Logic auslösen und erhalte folgenden Eintrag im Log mit dem ich nichts anfangen kann.
                    Betrifft shng 1.10 + SV3.4

                    Code:
                    2024-02-10  11:14:19 NOTICE   modules.admin.systemdata logic_name='Automatik_WarmWasser', logic_info={'name': 'Automatik_WarmWasser', 'enabled': True, 'cycle': None, 'crontab': None, 'watch_item': ['Power.P_Minus.Stufe0.Hysterese_Stage0', 'Power.P_Minus.Stufe1.Hysterese_Stage1', 'Power.P_Minus.Stufe2.Hysterese_Stage2', 'Power.P_Minus.Stufe3.Hysterese_Stage3'], 'userlogic': True, 'logictype': 'Python', 'filename': 'Automatik_WarmWasser.py', 'pathname': '/usr/local/smarthome/logics/Automatik_WarmWasser.py', 'description': '', 'visu_access': False}
                    Ich denke
                    Code:
                    'visu_access': False
                    ist das Problem.


                    Logic:
                    Code:
                    if sh.ZS.WW() == 1 and sh.LWZ.dhwPumpOn() == 0:
                        #Stufe 0 WW 37 Grad
                        if sh.LWZ.dhwPumpOn() == 0 and sh.Power.P_Minus.Stufe0.Hysterese_Stage0() == 1 and sh.LWZ.dhwTemp() != 37:
                            sh.LWZ.p04DHWsetDayTemp(37)
                    
                        #Stufe 1 WW 40 Grad
                        if sh.LWZ.dhwPumpOn() == 0 and sh.Power.P_Minus.Stufe1.Hysterese_Stage1() == 1 and sh.LWZ.dhwTemp() <= 38:
                            sh.LWZ.p04DHWsetDayTemp(40)
                    
                        #Stufe 2 WW 45 Grad
                        if sh.LWZ.dhwPumpOn() == 0 and sh.Power.P_Minus.Stufe2.Hysterese_Stage2() == 1 and sh.LWZ.dhwTemp() <= 43:
                            sh.LWZ.p04DHWsetDayTemp(45)
                            
                        #Stufe 3 WW 53 Grad
                        if sh.Power.P_Minus.Stufe3.Hysterese_Stage3() == 1 and sh.LWZ.dhwTemp() <= 50:
                            sh.LWZ.p04DHWsetDayTemp(53)​
                    via Executer Plugin 'sh.LWZ.p04DHWsetDayTemp...' funktioniert ohne Probleme.

                    P.S.
                    Eventuell liegt es doch am thz Plugin und dessen Berechtigung
                    Nach einem neustart von shng steht folgendes im Log
                    Code:
                    2024-02-10  12:44:47 ERROR    plugins.thz         thz: Failed to open serial port - (<class 'serial.serialutil.SerialException'>, SerialException(13, "could not open port /dev/ttyUSB0: [Errno 13] Keine Berechtigung: '/dev/ttyUSB0'"), <traceback object at 0x7f1437f04b00>)
                    --> sudo chmod a+rw /dev/ttyUSB0 und einem Neustart von shng, steht zumindest nichts dergleichen mehr im log.
                    Gilt rw nur bis zu einem Neustart?

                    Zuletzt geändert von fuxl66; 10.02.2024, 13:03. Grund: P.S.

                    Kommentar


                      #11
                      Ich behaupte, die Devices werden beim Neustart angelegt -> Permissions machen keinen Sinn. Du musst den User, der shng ausführt der Gruppe dialout hinzufügen. Dann sollte es klappen.

                      Kommentar


                        #12
                        Onkelandy Vielen Dank für deinen wertvollen Tipp.

                        Kommentar


                          #13
                          Zitat von fuxl66 Beitrag anzeigen
                          Wie erwähnt, funktioniert die Hysterese soweit. Diese soll jetzt auch eine Logic auslösen und erhalte folgenden Eintrag im Log mit dem ich nichts anfangen kann.
                          Die Hysterese Funktionalität der Items haben kein besonderes Handling für Logiken. Wie löst Du die Logik denn aus?
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #14
                            Zitat von Msinn Beitrag anzeigen
                            Die Hysterese Funktionalität der Items haben kein besonderes Handling für Logiken. Wie löst Du die Logik denn aus?
                            Ganz einfach mit 'watch_item'

                            Code:
                                watch_item:
                                -   Power.P_Minus.Stufe0.Hysterese_Stage0
                                -   Power.P_Minus.Stufe1.Hysterese_Stage1
                                -   Power.P_Minus.Stufe2.Hysterese_Stage2
                                -   Power.P_Minus.Stufe3.Hysterese_Stage3​

                            Kommentar


                              #15
                              Zitat von fuxl66 Beitrag anzeigen
                              Code:

                              2024-02-10 11:14:19 NOTICE modules.admin.systemdata logic_name='Automatik_WarmWasser', logic_info={'name': 'Automatik_WarmWasser', 'enabled': True, 'cycle': None, 'crontab': None, 'watch_item': ['Power.P_Minus.Stufe0.Hysterese_Stage0', 'Power.P_Minus.Stufe1.Hysterese_Stage1', 'Power.P_Minus.Stufe2.Hysterese_Stage2', 'Power.P_Minus.Stufe3.Hysterese_Stage3'], 'userlogic': True, 'logictype': 'Python', 'filename': 'Automatik_WarmWasser.py', 'pathname': '/usr/local/smarthome/logics/Automatik_WarmWasser.py', 'description': '', 'visu_access': False}
                              Ich denke Code:

                              'visu_access': False
                              ist das Problem.
                              Nein, visu_access ermöglicht (oder verbietet) das triggern einer Logik aus der smartVISU. Die NOTICE aus dem Log ist jedoch der Hinweis, dass die Logik aus der AsminGUI getriggert hast (und die hat mit der smartVISU nichts zu tun).

                              Wenn Du die NOTICE los werden willst, lege einen Logger modules.admin.systemdata an und setze bei ihm den LEVEL auf WARNING, dann werden keine NOTICEs geloggt.
                              Viele Grüße
                              Martin

                              There is no cloud. It's only someone else's computer.

                              Kommentar

                              Lädt...
                              X