Seite 1 von 1

Anfänger Frage zu Items schreiben in rules

Verfasst: 23. Mär 2019 21:51
von BO80
Hallo Zusammen, ich habe schon wieder eine Anfängerfrage:
Zunächst die Hardware:
Raspberry Pi 3b+, Temperatursensoren 18B20, 4 fach Relais Modul https://www.amazon.de/Elegoo-Relaismodu ... 0FC11P0ZN4
Software: Openhab2
Bisher frage ich die Temperaturen von meiner Heizung und der Zimmer ab und visualisiere sie in Grafana.
Literatur: Smart Home mit openHAB2 von Marianne Spiller

Nun zum aktuellen Vorhaben:
Anhand der gemessenen innen und außen Temperaturen sowie Luftfeuchte berechne ich den absoluten Feuchtegehalt der Luft und will diesen in ein Item schreiben ohne Einheit und in Grafana visualisieren.

Nun das Problem:
Ich habe noch Probleme die Syntax zu verstehen trotz einiger gelesenen Beiträgen funktioniert es so nicht.

Das Item

Code: Alles auswählen

Number Feuchtegehalt_draussen 
Number Feuchtegehalt_garage 
Die Rule

Code: Alles auswählen

import org.openhab.core.library.types.*
import java.lang.Math

rule "Luftfeuchte Garage"
when
    Time cron "0 0/5 * * * ?"       //alle 5min
then
    // Variablen
    var Number temp_in = (TemperaturGarage_Temperature.state as Number).floatValue         //Innentemperatur in Grad Celsius
    var Number temp_out = (TemperatureDraussen_Temperature .state as Number).floatValue            //Außentemperatur in Grad Celsius

    var Number abs_hum_in = 0
    var Number abs_hum_out = 0
    
    var Number rel_hum_in = (TemperaturGarage_Humidity.state as Number).floatValue           //relative Feuchte Innen
    var Number rel_hum_out = (TemperatureDraussen_Humidity .state as Number).floatValue            //relative Feuchte Außen
    
    // Konstanten
    val gas_const = 8314.3
    val mol = 18.016
    var Number ab = 0
    var a_out = 0
    var b_out = 0
    
    // Parameter a, b
    // wenn T>=0: a = 7.5, b = 237.3 (dies wird wohl immer von den Innenraum zutreffen)
    // wenn T<0:  a = 7.6, b = 240.7 (dies kann für die Außerntemperatur zutreffen)

    val a_in=7.5
    val b_in=237.3        
    if (temp_out >= 0) {
        a_out=7.5
        b_out=237.3    
    } else {
        a_out=7.6
        b_out=240.7        
    }
    
    // Formeln
    // Sättingungsdampfdruck:    SDD = 6.1078 * 10^((a*temp)/(b+temp))
    // Dampfdruck:                DD = rel_hum * 100 / SDD
    // Absolute Feuchte:        AF = 10^5 * mol / gas_const * DD / (temp + 273.15)
    
    // absolute Innenfeuchte
    ab = ((a_in * temp_in) / (b_in + temp_in)).doubleValue()
    var Number sdd_in = 6.1078 * Math::pow(10, ab)
    var Number dd_in = rel_hum_in / 100 * sdd_in
    abs_hum_in = Math::pow(10, 5) * mol / gas_const * dd_in / (temp_in + 273.15)
    
    // absolute Außenfeuchte
    ab = ((a_out * temp_out) / (b_out + temp_out)).doubleValue()
    var Number sdd_out = 6.1078 * Math::pow(10, ab)
    var Number dd_out = rel_hum_out / 100 * sdd_out
    abs_hum_out = Math::pow(10, 5) * mol / gas_const * dd_out / (temp_out + 273.15)


    //schreiben der werte in ITEM

   
    Feuchtegehalt_draussen.postUpdate(abs_hum_out)
    //Feuchtegehalt_garage.postUpdate(abs_hum_in)


    logInfo("Luftfeuchte Garage", "Abs. Luftfeuchte - in: " + abs_hum_in + "g/m3, out: " + abs_hum_out + "g/m3")

    if (abs_hum_in > abs_hum_out) { //wenn innen feuchter als außen, dann lüften
        // lüften, Fenster öffnen
        logInfo("Luftfeuchte", "Garage lüften")
        
    } else {
        // nicht lüften, Fenster schließen
        logInfo("Luftfeuchte", "Garage nicht lüften")
    }

end

Ich hoffe jemand kann mir weiterhelfen!

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 24. Mär 2019 08:36
von BO80
Ich konnte es doch selber lösen, der Fehler lag daran:

Code: Alles auswählen

Feuchtegehalt_draussen.postUpdate(abs_hum_out)
  Feuchtegehalt_garage.postUpdate(abs_hum_in)

anstatt:

Code: Alles auswählen

Feuchtegehalt_draussen.sendCommand(abs_hum_out)
        Feuchtegehalt_garage.sendCommand(abs_hum_in)

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 24. Mär 2019 14:14
von udo1toni
1. Du nutzt openHAB2. Damit ist in einer Rule diese Zeile weder erlaubt noch notwendig:

Code: Alles auswählen

import org.openhab.core.library.types.*
Ohne das Buch von Marianne Spiller in der Hand gehabt zu haben, möchte ich auch behaupten, dass Du diese Zeile dort so nirgends finden wirst. Hintergrund: in openHAB1 musste man lange alles importieren, was man verwenden wollte. Dabei waren imports ganzer Blöcke erlaubt, also ein * am Ende (womit dann alle "Unterverzeichnisse" gemeint sind.
In openHAB2 dürfen nur einzelne Bibliotheken importiert werden, jede Bibliothek muss einzeln aufgeführt werden. Dafür sind aber so gut wie alle Bibliotheken, die man normalerweise braucht, schon importiert, insbesondere natürlich die openhab.core libraries.
openHAB meckert die Zeile eventuell nicht an, wird sie aber trotzdem ignorieren. In diesem Fall ist es egal, weil die Bibliothek ohnehin schon mit an Bord ist.

2. Für die Visualisierung in Grafana kommt es darauf an, wie Grafana die Daten erhält. Wenn Du z.B. die influxdb Persistenz verwendest und dann in Grafana auf influxdb zugreifst, sollte .postUpdate() vollkommen ausreichen. Der Unterschied zwischen .postUpdate() und .sendCommand() besteht darin, dass .postUpdate() den Status des Items setzt, während .sendCommand() ein Kommando an das/die gekoppelte(n) Binding(s) sendet und nicht(!) den Status verändert.

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 24. Mär 2019 21:52
von BO80
Danke für die ausführliche Erklärung!
Ich bin wohl etwas mit openhab1 durch unterschiedliche Quellen durcheinander gekommen.
Die Library hab ich raus gelöscht, komischerweise funktioniert es aber mit .sendCommand() und ja ich nutze Influx als Persistenz.

Ich hab noch Frage dazu, wie ich ein "low" oder "high" von einem GPIO mit einem Item verbinden kann.
Kann ich das auch hier drunter schreiben oder lieber neues Thema aufmachen?

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 24. Mär 2019 22:48
von udo1toni
Wenn Du das GPIO Binding nutzt, kannst Du Contact oder Switch als Itemtyp verwenden, entspricht dann CLOSED/OFF/LOW bzw. OPEN/ON/HIGH.
Wie ist die Persistenz eingerichtet?

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 25. Mär 2019 22:56
von BO80
Danke für die schnelle Antwort, es funktioniert soweit mit switch ab
er nicht mit contact

item:

Code: Alles auswählen

Switch Heizungrelais "Heizungrelais [%s]" {gpio= "pin:25 activelow:no"}
Contact Heizungrelais "Heizungrelais [%s]" {gpio= "pin:25 activelow:yes"}
Sitemap:

Code: Alles auswählen

 Contact item=Heizungrelais  label="Heizungsrelais"
 Switch item=Heizungsrelais label="Heizungsrelais"
  

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 25. Mär 2019 23:06
von udo1toni
Du darfst nicht den selben pin in mehreren Items als input verwenden. Das Binding wird bei einem Event nur das erste Item ändern, welches es in seiner Konfiguration findet.

Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 25. Mär 2019 23:24
von BO80
Das habe ich verstanden habe hier nur beide gleichzeitig zur Veranschaulichung reingeschrieben.

Gesendet von meinem VKY-L09 mit Tapatalk


Re: Anfänger Frage zu Items schreiben in rules

Verfasst: 26. Mär 2019 19:01
von udo1toni
Ach so, der Itemanme darf natürlich ebenfalls nicht doppelt vergeben werden. Vermutlich war auch das nur zur Anschauung, ist aber nicht gut, das so unkommentiert hinzuschreiben ;)
Die Sitemap verwendet Widgets. Es gibt kein Contact Widget. Ein Contact Item wird normalerweise mittels Text Widget visualisiert. Der Status wird dann im Label angezeigt, welches natürlich den Platzhalter für den String enthalten muss. Also so:
Items:

Code: Alles auswählen

Switch Heizungrelais1 "Heizungrelais [%s]" {gpio= "pin:25 activelow:no"}
Contact Heizungrelais2 "Heizungrelais [%s]" {gpio= "pin:26 activelow:yes"}
Sitemap:

Code: Alles auswählen

Switch item=Heizungsrelais1
Text item=Heizungsrelais2