Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

    #46
    Hallo,
    ich bräuchte mal wieder Hilfe bei einem eval. Ich finde den Fehler nicht.

    Meine item.yaml
    Code:
    %YAML 1.1
    ---
    heizung:
                             
        waermebedarf:
            type: bool
            visu_acl: ro
            eval: 0 if ((sh..stellgroesse_max() < 10) or (sh..waermebedarf_sommer_winter() = 0)) else 1
            eval_trigger:
              - .stellgroesse_max
              - .waermebedarf_sommer_winter
            cache: yes
            
            waermebedarf_sommer_winter:
                name: Wärmebedarf basierend auf DIN Winter
                type: bool
                eval: not sh.raumtemp.aussen.nord.sommer()
                eval_trigger: 
                  - raumtemp.aussen.nord.sommer
                cache: yes
           
            stellgroesse_max:
                name: max Stellgröße aus allen Räumen
                type: num
                visu_acl: rw
                eval: max
                eval_trigger:
                  - raumtemp.eg.wohnen.rtr.stellgr_zum_aktor
                  - raumtemp.og.bad.rtr.stellgr_zum_aktor
                  - raumtemp.og.kind.rtr.stellgr_zum_aktor
                  - raumtemp.og.schlafzimmer.rtr.stellgr_zum_aktor
                  - raumtemp.og.gaestezimmer.rtr.stellgr_zum_aktor
                  - raumtemp.og.buero.rtr.stellgr_zum_aktor
                cache: yes
    Das Eval
    Code:
    eval: 0 if ((sh..stellgroesse_max() < 10) or (sh..waermebedarf_sommer_winter() = 0)) else 1
    führt immer zu einem Fehler.

    Log:
    Code:
    WARNING  heizung.waermebedarf Item heizung.waermebedarf: problem evaluating 0 if ((sh.heizung.waermebedarf.stellgroesse_max() < 10) or (sh.heizung.waermebedarf.waermebedarf_sommer_winter() = 0)) else 1: invalid syntax (<string>, line 1)
    Die relativen Items sind korrekt.

    Wo liegt der Fehler?

    Danke Euch!

    Kommentar


      #47
      Wie wäre es mit einem doppelten '=' zum Vergleich von Werten?
      Viele Grüße
      Martin

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

      Kommentar


        #48
        Zitat von msinn Beitrag anzeigen
        wie wäre es mit einem doppelten '=' zum vergleich von werten?
        danke!

        Kommentar


          #49
          Hallo,

          ich habe mal wieder eine Frage zum eval. Ich möchte über den Wert, den das Item über eval_trigger bekommt, aus einer Liste den passenden Text ermitteln und dem Item zuweisen.

          Die Liste sieht folgendermaßen aus:
          Code:
          '{'00': 'Warmwasserbetrieb', '01': 'Reduzierter Betrieb (dauernd)', '02': 'Normalbetrieb (dauernd)', '03': 'Heiz- und Warmwasserbetrieb', '04': 'H+WW FS', '05': 'Abschaltbetrieb'}'
          Die Werte, die das Item dann bekommt, entsprechend 00, 01 etc.
          Wir der Wert 00 dem Item zugwiesen, soll aus der Liste Warmwasserbetrieb ermittelt werden und schlussendlich dieser String dem Item zugewiesen werden.

          Wie kann man das realisieren?

          Danke Euch

          Kommentar


            #50
            Schau mal in eval-für-strings

            Kommentar


              #51
              Zitat von bmx Beitrag anzeigen
              Schau mal in
              Danke!
              Klappt super.

              Das Viessmann Plugin ist dann fast fertig.

              Kommentar


                #52
                Hallo,

                ich habe mal wieder eine Frage an die eval Gurus mumpf ;o)

                Ich baue gerade ein Widget für meine Viessmann-Heizung. Dabei kann man u.a. den Ferienstarttag und den Ferienendtag setzen. Das mache ich aktuell mit basic.input über die smartVISU. Die übergibt das datetime im isoformat, also so: 2017-11-29T23:00:00.000Z

                Ich habe die Stunden, Minuten im Widget ausgeblendet, da ich nur das Datum benötige. Im Widget stelle ich bspw. den 2020-03-01 ein. Bedingt dich das Isoformat mit Zeitzone kommt im Item aber 2020-02-29T23:00:00.000Z an.

                Wie kann ich mit einem eval die Korrektur machen, also aus 2020-02-29T23:00:00.000Z ein 2020-03-01?

                Danke Euch!

                Kommentar


                  #53
                  Das wird in einem eval eher heftig (falls es überhaupt geht). Um die Zeitzonen zu berücksichtigen, musst Du auf Python Packages zurückgreifen. Damit wäre das zurzeit eher ein Fall für eine Logik oder ein Plugin.

                  Ich kann noch mal schauen ob ich (vielleicht sogar schon für die v1.7, je nachdem wieviel Zeit ich habe) die lib.shtime um entsprechende Funktionen erweitere, die auch sinnvoll in evals nutzbar wären.
                  Viele Grüße
                  Martin

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

                  Kommentar


                    #54
                    Msinn
                    Danke.

                    Ich bin mit wvhn im Kontakt. Es scheint ein Fehler in der smartVISU konkret bei basic.input zu sein.
                    Es scheint, dass die Zeitzone beim Übertrag der datebox in einen string verloren geht. Wir versuchen den Fehler dort zu beheben, dann sollte es bei shNG auch klappen.
                    Danke dir.

                    Kommentar


                      #55
                      Hallo,

                      und wieder eine Frage zum Thema eval von mir.

                      Ich möchte die Differenz zwischen einer Datetime in der Zukunft und dem jetzt in Sekunden haben und das als Dauer für einen autotimer nutzen.

                      Die Anwendung wäre, die Heizung von jetzt (now) bis zum angegebenen Zeitung in den Standby (Betriebsart) zu schicken.

                      Bislang habe ich das in einer Logik gemacht, frage mich aber, ob es nicht auch in einem eval gehen würde.
                      Die Logik:

                      Code:
                      #!/usr/bin/env python3
                      # zeitdifferenz_sec.py
                      
                      from datetime import datetime
                      
                      finishdatetimestring = sh.heizung.abwesenheit.enddatetime()
                      duration = datetime.strptime(finishdatetimestring, '%Y-%m-%dT%H:%M:%S') - datetime.now()
                      duration_sec = duration.days * 3600 + duration.seconds
                      
                      
                      if duration_sec > 0:
                          sh.heizung.abwesenheit.dauer(duration_sec)
                      else:
                          sh.heizung.abwesenheit.dauer(0)
                          logger.error('Endtermin liegt vor heute!')
                      Was meint ihr?
                      Danke.

                      Kommentar


                        #56
                        Da könnte es Dir helfen auf SmartHomeNG v1.7 zu warten.

                        Im kommenden Release sind in lib.shtime folgende Funktionen hinzugekommen:
                        • shtime.time_since()
                        • shtime.time_until()
                        • shtime.time_diff()
                        Die können die Differenz in verschiedenen Formaten zurückliefern:
                        • Sekunden
                        • Minuten (float)
                        • Stunden (float)
                        • Tage (float)
                        • Minuten (int)
                        • Stunden (int)
                        • Tage (int)
                        • Tuple (Tage, Stunden, Minuten, Sekunden)
                        • Tuple (Tage, Sekunden)
                        Wobei die beiden letzten Varianten für evals eher schlecht geeignet sind.
                        Viele Grüße
                        Martin

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

                        Kommentar


                          #57
                          Msinn

                          Danke. Das könnte helfen.

                          Andere Frage: Ist in der Doku irgendwo beschrieben, welche Python Funktionen im eval möglich sind und wie ich diese dann in Verbindung mit dem Items (Itempfad) anwenden kann?

                          Kommentar


                            #58
                            Da müsste ich in die Doku gucken
                            Viele Grüße
                            Martin

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

                            Kommentar


                              #59
                              Zitat von Msinn Beitrag anzeigen
                              Da müsste ich in die Doku gucken
                              Ich hatte natürlich die Doku durchsucht, bevor ich meine Frage gestellt habe. Funden habe ich dazu allerdings nichts.
                              Beschrieben ist, das eval den "Ausdrucks ist der Syntax einer Python conditional expression" haben muss. Mir ging es darum, welche Funktionen verfügbar sind und wie ich diese bei Items oder value anwenden kann.

                              Kommentar


                                #60
                                Hi,

                                wenn ich mich recht erinnere (ist schon etwas her), dann steht in der Doku, welche Module von shNG.py importiert werden. Nur diese Funktionen kannst Du dann in einem eval verwenden, da man in einem eval keinen Import machen kann.

                                Wenn man irgendwas braucht, was man extra importieren muss, braucht man eine Logik.

                                Gruß, Waldemar

                                Kommentar

                                Lädt...
                                X