Ankündigung

Einklappen
Keine Ankündigung bisher.

[Problem] Rechnen in OpenHAB funktioniert nicht (OW-DS2450 Umrechnung)

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

    [Problem] Rechnen in OpenHAB funktioniert nicht (OW-DS2450 Umrechnung)

    Hallo,

    ich habe es heute doch noch geschafft, dass Openhab2 mir die Werte berechnet.

    An bei die Items und Rule für den "DS2450 als Multisensor" von https://www.tm3d.de

    1) Itmes: Ich habe immer zwei Items gewählt. Eine für die Messung, den zweiten für den berechnet Wert
    Code:
    Number OW_Temp_messung {onewire="deviceId=20.1BDB84000003;propertyName=volt.A;refreshinterval=60"}
    Number OW_Temp "Temp [%.2f °C]" <temperature> (gGA,RRD_Temp)
    Number OW_Hum_messung {onewire="deviceId=20.1BDB84000003;propertyName=volt.B;refreshinterval=60"}
    Number OW_Hum "HUM [%.2f %%]" <humidity> (gGA,RRD_Hum)
    Number OW_Lux_messung {onewire="deviceId=20.1BDB84000003;propertyName=volt.C;refreshinterval=60"}
    Number OW_Lux "Helligkeit [%.2f LUX]" <sun> (gGA,RRD_Hum)
    Number OW_Druck_messung  {onewire="deviceId=20.1BDB84000003;propertyName=volt.D;refreshinterval=60"}
    Number OW_Druck "Luftdruck Ausen2 [%.2f hPa]" (gGA)


    2) Rules

    Code:
    //Volt.A = Temperatur = (voltA - 2.56) * 128
    //Volt.B = Feuchte = $voltB * 128
    //Volt.C = Helligkeit = EXP(($voltC-2,56)*12,8)
    //Volt.D = Luftdruck = $voltD * 400
    Code:
    [SIZE=12px]rule "Temperatur DS2450_Ausen_20.1BDB84000003"[/SIZE]
    [SIZE=12px]when [/SIZE]
    [SIZE=12px]Item OW_Temp_messung received update[/SIZE]
    [SIZE=12px]then [/SIZE]
    [SIZE=12px]//logInfo("DS2450_Temp", "Temp Berechnen 20.1BDB84000003")[/SIZE]
    [SIZE=12px]var temp = (OW_Temp_messung.state as DecimalType - 2.56) * 128[/SIZE]
    [SIZE=12px]//logInfo("DS2450_Temp","ErgebnissTemp: " + temp + " °C")[/SIZE]
    [SIZE=12px]sendCommand(OW_Temp,temp)[/SIZE]
    [SIZE=12px]end[/SIZE]
    
    [SIZE=12px]rule "Luftfeuchte DS2450_Ausen_20.1BDB84000003"[/SIZE]
    [SIZE=12px]when [/SIZE]
    [SIZE=12px]Item OW_Hum_messung received update [/SIZE]
    [SIZE=12px]then [/SIZE]
    [SIZE=12px]//logInfo("DS2450_Luftfeuchte", "Feuchte Berechnen 20.1BDB84000003")[/SIZE]
    [SIZE=12px]var feuchte = OW_Hum_messung.state as DecimalType * 128[/SIZE]
    [SIZE=12px]//logInfo("DS2450_Luftfeuchte", "ErgebnissFeuchte: " +feuchte + " %")[/SIZE]
    [SIZE=12px]sendCommand(OW_Hum,feuchte)[/SIZE]
    [SIZE=12px]end[/SIZE]
    
    [SIZE=12px]rule "Helligkeit DS2450_Ausen_20.1BDB84000003"[/SIZE]
    [SIZE=12px]when [/SIZE]
    [SIZE=12px]Item OW_Lux_messung received update [/SIZE]
    [SIZE=12px]then [/SIZE]
    [SIZE=12px]//logInfo("DS2450_Helligkeit", "LUX Berechnen 20.1BDB84000003")[/SIZE]
    [SIZE=12px]var double lichtlux = Math::exp(((OW_Lux_messung.state as DecimalType).doubleValue -2.56) * 12.8)[/SIZE]
    [SIZE=12px]//logInfo("DS2450_Heligkeit", "ErgebnissLichtLUX: " + lichtlux + " LUX")[/SIZE]
    [SIZE=12px]sendCommand(OW_Lux,lichtlux)
    end[/SIZE]
    
    [SIZE=12px]rule "Luftdruck DS2450_Ausen_20.1BDB84000003"[/SIZE]
    [SIZE=12px]when [/SIZE]
    [SIZE=12px]Item OW_Druck_messung received update [/SIZE]
    [SIZE=12px]then [/SIZE]
    [SIZE=12px]//logInfo("DS2450_Luftdruck", "Druck Berechnen 20.1BDB84000003")
      // Höhen Korrektur berechnet hk = [/SIZE](1- HOEHE / 44330) ^ 5.255
     // 139m => 0.98363210471
    [SIZE=12px]var ldruck = (OW_Druck_messung.state as DecimalType * 400) [/SIZE]/ 0.98363210471
    [SIZE=12px]//logInfo("DS2450_Luftdruck", "ErgebnissDruck: "+ ldruck + " hPA")[/SIZE]
    [SIZE=12px]sendCommand(OW_Druck,ldruck)[/SIZE]
    [SIZE=12px]end[/SIZE]
    Gruß
    Lothar
    Zuletzt geändert von lo4dro; 18.09.2017, 06:44.
    --
    Gruß
    Lothar

    #2
    Die Lösung steht im ersten Beitrag.
    Vielleicht hilft es euch auch. Habe lange gesucht und ausprobiert, bis es funktioniert hat.
    Zuletzt geändert von lo4dro; 17.09.2017, 19:05.
    --
    Gruß
    Lothar

    Kommentar


      #3
      Nur ein paar Anmerkungen:
      1. sendCommand(Item,Wert): Das ist eine Action (im Gegensatz zur Methode). Das Problem der Action ist, dass sie zwingend zwei Strings als Parameter erwartet. Wenn die Action trotzdem funktioniert, dann nur, weil es sich beim übergebenen Parameter um ein Objekt handelt, welches openHAB automatisch in einen String wandeln kann. Beserer Stil wäre, diese Wandlung explizit anzugeben. Alternativ ist es grundsätzlich besser, die Methode Item.sendCommand(Wert) zu verwenden, die ist nämlich für alle möglichen Parametertypen (String, Number, State) implementiert.
      2. Item.state as DecimalType: Dieser Ausdruck sollte sicherheitshalber immer in Klammern stehen. Das kann ohne Klammern funktionieren, es gibt aber Situationen (oder auch Versionen von openHAB) wo dies nicht der Fall ist. Also besser (Item.state as DecimalType)
      3. Auskommentierte logInfo(): Klar, kann man machen. Besserer Stil ist es, stattdessen logDebug(<loggername>,<logstring>) zu verwenden, dann kann man bei Bedarf gezielt das Logging ein- und ausschalten, indem man den LogLevel für <loggername> auf Debug oder höher setzt. Entsprechend bietet es sich an, <loggername> nicht unbedingt in jeder Rule auf einen anderen Wert zu setzen, sondern eher logische Gruppen zu bilden und die letzte Unterscheidung über den <logstring> vorzunehmen.
        Die log-Befehle sind:
        Code:
                logError() //Immer angezeigt, es sei denn, LogLevel OFF
        	logWarn()  //angezeigt unterhalb LogLevel ERROR
        	logInfo()  //angezeigt unterhalb LogLevel WARN
        	logDebug() //angezeigt unterhalb LogLevel INFO
        Entsprechend sind die LogLevel:

        Code:
                DEFAULT //Normalerweise INFO, kann aber systemweit gesetzt werden -> Ein Schalter für alle
        	OFF     //kein Logging
        	ERROR   //nur logError() wird ausgegeben
        	WARN    //logError() und logWarn() werden ausgegeben
        	INFO    //nur logDebug() wird unterdrückt
        	DEBUG   //ab hier wird alles geloggt, was verfügbar ist.
        	TRACE   //für Rule Logging irrelevant, jedoch nicht für das Logging in Bindings usw.

      Kommentar


        #4
        Danke für die guten Tipps, ich werde mal versuchen das die nächsten Tage umzusetzen.
        Ich bin in vielen Bereiche noch lausiger Anfänger ;-)

        Zum Thema Login noch ne kurze Fragen,

        Es ist also Besser, wenn der Wert für logXXX() so aussehen würde.

        logXXX("DS2450_20.1BDB84000003", "Temp Berechnen 20.1BDB84000003 start")
        logXXX("DS2450_20.1BDB84000003","Ergebniss Temp: " + temp + " °C")

        logXXX("DS2450_20.1BDB84000003", "Feuchte Berechnen 20.1BDB84000003 start"
        logXXX("DS2450_20.1BDB84000003", "Ergebniss Feuchte: " +feuchte + " %")

        usw.

        Dadurch kann ich anhand des Namens (DS2450_20.1BDB84000003) gezielt den LOG Status für diese Abschnitte ein oder ausschalten?
        Zuletzt geändert von lo4dro; 18.09.2017, 08:39.
        --
        Gruß
        Lothar

        Kommentar


          #5
          Genau. Ob es allerdings sinnvoll ist, das Logging für ein einzelnes Item ein- und auszuschalten? Eher nicht... Stattdessen wäre also eher ein
          Code:
          logDebug("DS2450_20","1BDB84000003 Temperatur berechnen")
          logDebug("DS2450_20","1BDB84000003 Ergebnis: {}°C",temp)
          logDebug("DS2450_20","1BDB84000003 Feuchte berechnen")
          if(feuchte>90 || feuchte < 20)logWarn("DS2450_20","1BDB84000003 Feuchtewert nicht plausibel: {}%",feuchte)
          else logDebug("DS2450_20","1BDB84000003 Luftfeuchte: {}%",feuchte)
          Das heißt, Du bekommst zwar dann auch Meldungen von anderen Wertgebern, aber eben nur von dieser Gruppe, das reicht im Zweifel, um einen Fehler zu finden, aber nicht zu viel Meldungen zu bekommen.
          Das Beispiel mit der Feuchte habe ich natürlich nur zur Verdeutlichung eingebaut, wie man solche Meldungen dann gezielt erweitert. Die Warnmeldung wird auch ausgegeben, wenn das Logging runter gedreht ist, Überschrift und normale Berechnung werden nur im Debug-Modus ausgegeben.
          Die Schreibweise ("Text: {}% {}°C",feuchte,temp) wird von openHAB in "Text: <Wert von feuchte>% <Wert von temp>°C" umgewandelt, dabei müssen feuchte und temp nicht zwingend Strings oder Objekte sein (gleiches Problem wie bei Punkt 1). Deshalb ist diese Variante eleganter

          Kommentar


            #6
            danke, das ist ein sehr interessanter Beitrag
            --
            Gruß
            Lothar

            Kommentar


              #7
              Kann man eigentlich in der RULE-Datei auch das Debuggen ein oder ausschalten, oder muss ich das immer auf der Console von openhab machen?
              In meine Zeiten von Perl habe ich immer am Anfang vom Programmcode eine Zeile drinnen "debug=1 bzw. debug=0".
              Damit konnte ich immer sehr schnell das Debuggen einschalten.


              Noch ne Fragen zum Login:

              mit "log:set DEBUG DS2450_20" schalte ich das ganze ein, nur wie schaltet man das wider aus?
              ein "log:set OFF DS2450_20" hat nicht funktioniert?
              Zuletzt geändert von lo4dro; 20.09.2017, 08:12.
              --
              Gruß
              Lothar

              Kommentar


                #8
                Die korrekte Zeile, um das Logging hochzudrehen, ist
                Code:
                log:set DEBUG org.eclipse.smarthome.model.script.DS2450_20
                Das Logging für Deine Zeilen komplett zu verbieten (mit OFF) ist vermutlich gar nicht erwünscht, stattdessen setzt Du es einfach auf WARN oder ERROR (oder INFO)

                Mittels log:list kannst Du Dir die komplette Liste der Logeinträge anschauen, sollten sich dort unerwünschte Einträge finden, müsstest Du die Liste löschen und neu aufbauen, also zuerst mal die Liste anzeigen lassen und alle Einträge peinlichst genau notieren (oder die Ausgabe per Zwischenablage in einem Texteditor speichern...), anschließend mit log:clear die Liste löschen und danach die Einträge wieder herstellen.

                Kommentar

                Lädt...
                X