Ankündigung

Einklappen
Keine Ankündigung bisher.

Itemwert prüfen und ggf. Wert auf Bus weiterleiten

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

    [callidomus] Itemwert prüfen und ggf. Wert auf Bus weiterleiten

    Hallo zusammen,

    Aktuell läuft bei mir noch ein eibPort mit 1-Wire. Nun kommt es ab und zu vor, dass der eibPort seltsame Temperaturwerte, z.B. 86.41, auf den Bus sendet. Das kommt nur ganz selten vor, sieht aber in der Visu blöd aus und auch Statistiken werden dadurch verfälscht.

    Gibt es eine Möglichkeit das ich diese Werte zuerst in callidomus prüfe bevor ich diese an den Heizungsaktor weiterleite?

    if GA_1WIRE_tempWert < 35
    send GA_tempWert
    endif

    Modifizieren möchte ich den Wert nicht, da er nach 10min dann wieder richtig gesendet wird. Daher möchte ich eigentlich nur die Weiterleitung deaktivieren bei einem Wert höher als 35 Grad.

    Danke für eure Hilfe

    Gruss Marc

    #2
    Hi,

    sollte mit "einer" Zeile im Codeblock gehen in dem Item wo der wert von KNX ankommt.

    Kann das nicht prüfen sollte aber so aussehen.

    value if value < 35 else none

    VG
    Jürgen

    Kommentar


      #3
      Hallo Jürgen,

      tönt eigentlich simpel Im Value kommt aber anscheinend nicht der Wert daher, sondenr ein String mit caller, source, etc. attributen.
      Im untenstehenden Beispiel müsste ich an die 22.3 kommen.

      Code:
      2016-12-20 12:03:42,182 DEBUG Main Triggering wiregate.temperatur.buero-code - caller: KNX source: 1.1.1 dest: 2/2/40 value: {'caller': 'KNX', 'source': '1.1.1', 'de -- scheduler.py:trigger:210
      2016-12-20 12:03:42,185 DEBUG wiregate.temperatur.buero-code Item wiregate.temperatur.buero = 22.3 via KNX 1.1.1 2/2/40 -- item.py:__update:498

      Angelegt habe ich das ganze folgendermassen:
      Code:
      2016-12-20 12:03:11,282 DEBUG Main Visu: admin (192.168.5.12:53356) sent '{"cmd":"admin","admin":"modifyNode","path":"wireg ate.temperatur.buero","attr":{"type":"num","trace" :"0","cache":"0","enforce_updates":"0","code":"val ue if value <35 else none","knx_dpt":"9","knx_init":"2/2/40","knx_listen":"2/2/40","knx_send":"1/2/15"}}' -- websocket.py:json_parse:254

      Gruss Marc

      Kommentar


        #4
        Im Log habe ich gerade noch folgendes gefunden:

        ID: wiregate.temperatur.buero, Line: 1, Method: , Exception: name 'none' is not defined, Code: value if value <35 else none

        Kommentar


          #5
          Hi,
          okay die codeblöcke werde ich wohl nicht mehr kapieren... mal ist es eine Zahl und kann damit rechnen... mal ist ein ein String und man darf es nicht. Hast du vielleicht mehr als eine Zeile?
          VG
          Jürgen

          Kommentar


            #6
            ne, ist nur eine Zeile, vom Typ her ist das Item eine Nummer, dann würde ich auch einen Int Wert dort erwarten. Was ich nicht ganz verstehe ist aber auch das none. Warum none? Ist das irgendwo dokumentiert das man none verwenden muss/soll wenn der Wert nicht weitergeleitet werden soll?

            codeblock.PNG

            Kommentar


              #7
              Hallo Marc,

              das Problem ist, es darf nicht none heissen, sondern None.
              An der Stelle (Codeblock) wird Python ausgeführt, und da ist None ein definierte Ausdruck für 'nichts'. Und wenn man einem Item den Wert None zuweist, passiert ... nichts. Sprich der Wert wird nicht verändert.

              Ich habe das, mit dem None, noch in die Online-Doku aufgenommen. Der Codeblock war eigentlich nie dafür gedacht so etwas zu machen, bis findige User, wie z.B. Waldemar angefangen haben, fancy Sachen damit zu machen.

              Bis bald

              Marcus

              Kommentar


                #8
                Hallo Marcus,

                der Fehler tritt nun im Log nicht mehr auf. Jedoch passiert auch nichts. Muss das Item in einer Visu verwendet werden? Eigentlich möchte ich nur das diese Logik im Hintergrund irgendwie die Werte prüft.

                Auf dem Bus finden sich regelmässig Werte mit der entsprechenden GA:

                messwert.PNG

                Wenn ich Core unter Debug starte sehe ich da gar nichts.
                Das Item ist folgendermassen angelegt:

                codeblock.PNG

                Du schreibst ja oben das der Codeblock dafür nicht gedacht ist. Gibt es eine bessere Lösung für mein Problem?

                Danke & Gruss
                Marc
                Angehängte Dateien

                Kommentar


                  #9
                  Hallo Marc,

                  wenn Du den Wert, der über KNX reinkam, über KNX verschicken möchtest, dann verwende das Feld Weiterleiten und nicht Senden. Siehe Online-Doku.

                  Ich denke die prinzipielle Lösung bzw. der Workaround passt so.
                  Du schreibst aber value < 90, das macht aber keinen Sinn, wenn Du fehlerhafte Wert um die 85 erhältst.

                  Wie komme ich auf 85? Die 1Wire Sensoren liefern als Temperaturwert 85, wenn Sie ein Problem haben.
                  Ich vermute ein Problem bei der Implementierung beim eibport, da dieser Wert nicht abgefangen wird, und 86.41 auf den Bus geschrieben wird.

                  Wie kann es zu den Problemen kommen? Ich bin jetzt nicht der 1W-Experte, aber das kann an der Verkabelung, Stromversorgung und dem Anfrageintervall liegen.
                  (Häufige Abfragen ziehen viel Strom)
                  Kannst im Forum suchen, dazu gibt es bestimmt etwas.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Zitat von goodguy82 Beitrag anzeigen
                    Hallo Marcus,

                    der Fehler tritt nun im Log nicht mehr auf. Jedoch passiert auch nichts. Muss das Item in einer Visu verwendet werden? Eigentlich möchte ich nur das diese Logik im Hintergrund irgendwie die Werte prüft.
                    Habs mal ausprobiert. Bei mir kommt sehr wohl eine Fehlermeldung.

                    2016-12-20 23:45:06 DEBUG Main Triggering aussen.geraeteraum.temp-code - caller: CLI source: 127.0.0.1:30365 dest: None value: {'value': '96', 'caller': 'CLI', 'des':
                    2016-12-20 23:45:06 WARNING aussen.geraeteraum.temp-code ID: aussen.geraeteraum.temp, Line: 1, Method: <module>, Exception: unorderable types: str() < int(), Code:
                    value if value <90 else None
                    2016-12-20 23:45:06 DEBUG aussen.geraeteraum.temp-code Item aussen.geraeteraum.temp: code evaluation returns None

                    Warum auch immer wenn du es so schreibst hat es bei mir funktioniert.

                    Code:
                    value if int(value)<90 else None
                    Ich würde das wie Marucs schon erklärt hat auf <85 Grad ändern.

                    Viele Grüsse
                    Jürgen

                    Kommentar


                      #11
                      Hallo Jürgen,

                      bei Dir kommt eine Fehlermeldung, da Du es über das CLI geändert hast. Und das schickt Dir einen String. Das werde ich aber mal anpassen, da dieses Problem schon öfter aufgetreten ist.

                      Marc: nicht das mit dem int() schreiben, sonst verlierst Du die Nachkommastellen.

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Frage:

                        Ich lese das so gebe value zurück wenn int(value) < 90 anderfalls Nix
                        Code:
                         
                         value if int(value)<90 else None
                        Warum sollte da int(value) zurückgegeben werden?

                        Vg
                        Jürgen

                        Kommentar


                          #13
                          Hallo zusammen,

                          es funktioniert nun bei mir auch. Ich müsste jedoch den Server komplett durchstarten. Evtl. habe ich heute zu viel an der Visu rumgebastelt. Ich hatte dann festgestellt, dass ich nur noch Werte auf den Bus senden konnte, aber keine mehr empfangen. Wenn ich mittels Taster oder über die ETS Werte verändert hatte, hat sich die Visu nicht mehr aktualisiert. Dadurch habe ich dann wohl auch keine Temperatur Werte erhalten und somit auch die "geprüften" Werte nicht auf dem Bus gesehen.

                          Nun funktioniert aber alles einwandfrei Ich danke euch vielmals. Der Wert kleiner 90 war nur zum Testen um überhaupt einen Wert auf die Weiterleitungs GA zu senden. ist jetzt auf 85 angepasst.

                          Marcus, wäre toll wenn du die 1-Wire Implementierung besser machst als im eibPort und diesen Wert erst gar nicht auf den Bus sendest. Der eibPort fragt alle Sensoren gleichzeitig ab, ggf. gibt es hier ab und zu Probleme mit der Stromversorgung...an der Verkabelung wird es nicht liegen.

                          Gruss Marc

                          Kommentar


                            #14
                            Hallo Jürgen,

                            Zitat von heckmannju Beitrag anzeigen
                            Warum sollte da int(value) zurückgegeben werden?
                            Du hast vollkommen Recht. War Blödsinn.

                            Bis bald

                            Marcus

                            Kommentar

                            Lädt...
                            X