Setpoint Wert als sendCommand übergeben

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hi Udo,
da wird doch der Hund in der Pfanne verrückt... habe gerade mal einen Blick auf meine 5 Charts geworfen und was sehe ich nur noch Striche von Links nach rechts.
Habe ich jetzt ein Problem da ich mapDB Persistence und rrd4j Persistence aktiv habe?

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

Ich weiß ja nicht, was Du alles geändert hast...

Hast Du die Persistence mit beim Chart Widget stehen? Oder hast Du rrd4j als default Persistence gesetzt?

Bist Du sicher, dass die Sensoren gültige Werte liefern?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hi Udo,
wo genau stelle ich die rrd4j default Persistence ein?
Habe jetzt nicht nur eine Presistence am laufen:

Ich kann in paperUi doch immer nur eine als Standard einstellen oder?
Wenn ich hier auf rrd4j stelle gehen die Charts wieder aber die Speicherung der anderen Werte geht nicht mehr.

für die Chats benötige ich die rrd4j:

Code: Alles auswählen

Strategies {
// for rrd charts, we need a cron strategy Yohoo Binding
 everyMinute     : "0 * * * * ?"
   everyHour     : "0 0 * * * ?"
    everyDay     : "0 0 0 * * ?"
     everyWeek   : "0 0 0 0 * ?"
      everyMonth : "0 0 0 0 0 ?"

default = everyChange
}

Items {
    Temp_Chart0*, Temp_Chart1*, Temp_Chart2*, Temp_Chart3*, Temp_Chart4* : strategy = everyMinute, everyChange, restoreOnStartup //: strategy = everyChange, everyMinute    
    //Temperature : strategy = everyUpdate, everyMinute
    //Temperature : strategy = everyMinute, everyUpdate, restoreOnStartup
    //Temperature_yo: strategy = everyChange, everyMinute
    //ein Item wird jede Minute persistiert:
    //Test_Leistung : strategy = everyMinute //jede Minute wird der Wert gespeichert
    //Alternative: die Gruppe wird bei jeder Veränderung gespeichert
    //TChart_Temp* : strategy = restoreOnStartup, everyChange //bei jeder Änderung des Wertes wird dieser gespeichert 
}
für die Speicherung der anderen Werte benötige ich die mapdb.persist:

Code: Alles auswählen

Strategies {
    default = everyUpdate
}

Items {
    //*** Ab hier Rollosteuerung *******
    Bewoelkung : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_1 : strategy = everyChange, restoreOnStartup
    Rollo_auf_1 : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_2 : strategy = everyChange, restoreOnStartup
    Rollo_auf_2 : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_3 : strategy = everyChange, restoreOnStartup
    Rollo_auf_3 : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_4 : strategy = everyChange, restoreOnStartup
    Rollo_auf_4 : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_5 : strategy = everyChange, restoreOnStartup
    Rollo_auf_5 : strategy = everyChange, restoreOnStartup
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

Nein, die default Persistence spielt nur beim Zugriff auf die persistierten Daten eine Rolle, also wenn Du in der Sitemap ein Chart Widget verwendest oder innerhalb einer Rule auf historische Daten zugreifen willst. Du kannst bei jedem dieser Befehle explizit angeben, welcher Persistence Service verwendet werden soll. Wenn es die default Persistence ist, kannst Du den Parameter weg lassen.

Für das Speichern der Daten spielt es keine Rolle, welche default Persistence definiert ist, hier zählt einzig die Information in den *.persist Dateien.

Aber nochmal der Hinweis: Deine Strategies sind fehlerhaft. Abgesehen davon, dass es keinen Tag 0 im Monat gibt und everyWeek, also einmal pro Woche, an einem bestimmten Wochentag persistieren müsste (z.B. immer Montags), sind all diese Strategies sinnfrei. rrd4j muss zwingend everyMinute als Strategy gesetzt haben, wahlweise kann man das noch mit everyChange und/oder restoreOnStartup ergänzen.
In mapdb ist alles außer everyChange und restoreOnStartup auch sinnfrei, allenfalls könnte man statt everyChange noch everyUpdate setzen, aber da mapdb nur den letzten bekannten Wert zurück liefert, ist auch der Speicherzeitpunkt eher nicht so wichtig.
Bei Datenbanken wie MySQL sieht die Sache eventuell etwas anders aus, aber selbst da müssten die Strategies anders definiert sein, um dem Namen entsprechend korrekt zu funktionieren.

Code: Alles auswählen

Strategies {
   everyMinute : "0 * * * * ?" // zur vollen Minute
   everyHour   : "1 0 * * * ?" // eine Sekunde nach der vollen Stunde
   everyDay    : "2 0 0 * * ?" // zwei Sekunden nach Mitternacht
   everyWeek   : "3 0 0 ? * 1" // drei Sekunden nach Mitternacht am Montag
   everyMonth  : "4 0 0 1 * ?" // vier Sekunden nach Mitternacht am Monatsersten
   everyYear   : "5 0 0 1 1 ?" // fünf Sekunden nach Mitternacht an Neujahr

default = everyChange
}
Wichtig ist auch, wie oben zu sehen, die Strategies aufzuteilen, so dass unterschiedliche Strategien möglichst nicht zum selben Zeitpunkt feuern.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hi Udo,
Danke für Deine schnelle Antwort, könntest Du mir bitte ein Beispiel geben, an welcher Stelle ich das Befehl zur Zuordnung des Charts zur jeweiligen Persistence einsetze?
Wo genau in der Sitemap muss welcher Befehl hin?

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Wohnort: bei Mannheim

Re: Setpoint Wert als sendCommand übergeben

Beitrag von Joe »

Hi Udo,
so bin mal wieder vor der Kiste. Hat funktioniert Dank.
Sag mal kann ich den Service nur bei einem Chart angeben oder auch bei ITEMS für die ich jetzt die mapdb.presist nutze?

Code: Alles auswählen

Items {
    //*** Ab hier Rollosteuerung *******
    Bewoelkung : strategy = everyChange, restoreOnStartup
    Soll_Setpoint_1 : strategy = everyChange, restoreOnStartup

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

Ich verstehe jetzt nicht so ganz, was Du meinst. Die Angabe des Service bezieht sich immer auf das Item. Wenn Du ein Chart Widget in der Sitemap angibst, übergibst Du den Service, damit das Chart Widget weiß, von welchem Persistence Service es die Daten des Items (oder auch einer Gruppe von Items) holen soll. In einer Sitemap ist das Chart Widget das einzige, welches auf historische Daten zugreift.

Wenn Du in Rules auf historische Daten zugreifst (z.B. mittels myItem.previousState().state oder mittels myItem.averageSince()), kannst Du den zu verwendenden Service genauso angeben, dabei wird der Service dann einfach als zweiter Parameter angegeben:

Code: Alles auswählen

var Number nMax = myItem.maximumSince(now.minusMinutes(45),"rrd4j") as Number
Da sich die *.persist Dateien immer auf exakt einen Persistence Service beziehen, gibt es dort keine Möglichkeit, den Service mit anzugeben.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

deranfänger
Beiträge: 45
Registriert: 12. Feb 2018 17:53

Re: Setpoint Wert als sendCommand übergeben

Beitrag von deranfänger »

Hallo,

ich würde gern den ursprünglichen Post nochmal aufgreifen.

ich möchte gern für jede Heizung zwei Setpoint Items erzeugen.
Mit einem Item möchte die Wohlfürtemperatur für den Raum einstellen,
das zweite Item die Absenktemperatur.

über eine Regel soll das Item Heizung was mit dem Thing Heizung verbunden ist, entweder den Wert von "Absenktemperatur" oder den Wert von "Wohlfühltemperatur" annehmen.

nach dem Beispiel vom Anfang dieses Threads habe ich eine regel so gemacht:

Code: Alles auswählen

rule "EG_Wohnzimmer_1"


when
    Item Heizungsmodus changed to 1
then
    if(EG_Wohnzimmer_Heizung_Absenktemperatur instanceof Number)
        Number EG_Wohnzimmer_Heizung_SOLLtemperatur.sendCommand(EG_Wohnzimmer_Heizung_Absenktemperatur as Number)
end
ich denke ich brauch das "instanceof" nicht. daher habe ich noch eine zweite regel geschrieben

Code: Alles auswählen

rule "EG_Wohnzimmer_2"


when
    Item Heizungsmodus changed to 2
then
     Number EG_Wohnzimmer_Heizung_SOLLtemperatur.sendCommand(EG_Wohnzimmer_Heizung_Heiztemperatur as Number)
end
beide Regeln tun aber nicht.
Im LogViewer steht dies
2019-12-26 17:04:57.262 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'EG_Wohnzimmer_1': Could not cast EG_Wohnzimmer_Heizung_Absenktemperatur (Type=NumberItem, State=12, Label=Absenktemperatur, Category=null) to java.lang.Number; line 10, column 65, length 48
2019-12-26 17:04:59.784 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'EG_Wohnzimmer_2': Could not cast EG_Wohnzimmer_Heizung_Heiztemperatur (Type=NumberItem, State=27, Label=Heiztemperatur, Category=null) to java.lang.Number; line 20, column 62, length 46
kann mir jemand einen Hinweiß geben wo der Fehler stecken könnte

Benutzeravatar
udo1toni
Beiträge: 13858
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Setpoint Wert als sendCommand übergeben

Beitrag von udo1toni »

Warum definierst Du zwei Rules? Wie sind Deine Items definiert?
Wenn die Items allesamt vom Typ Number sind (nicht Number:Temperature), sähe eine passende Rule so aus:

Code: Alles auswählen

rule "Heizung EG Wohnzimmer"
when
    Item Heizungsmodus changed                                                 // Heizungsmodus geändert
then
    if(!(Heizungsmodus.state instanceof Number))                               // Modus ist eine gültige Zahl?
        return;                                                                // falls nicht: Abbruch 
    var Number nTemp = 18                                                      // initialisiere Variable mit 18
    switch((Heizungsmodus.state as Number).intValue) {                         // Wähle nach gewählter Betriebsart
        case 1: {                                                              // Modus 1
            if(EG_Wohnzimmer_Heizung_Absenktemperatur.state instanceof Number) // Absenktemperatur gültige Zahl?
                nTemp = EG_Wohnzimmer_Heizung_Absenktemperatur.state as Number // dann in die Variable übernehmen
        }
        case 2: {                                                              // Modus 2
            if(EG_Wohnzimmer_Heizung_Heiztemperatur.state instanceof Number)   // Heiztemperatur gültige Zahl?
                nTemp = EG_Wohnzimmer_Heizung_Heiztemperatur.state as Number   // dann in Variable übernehmen
        }
        default: {                                                             // alle anderen Modi
            nTemp = 19                                                         // setze auf 19
        }
    }
    EG_Wohnzimmer_Heizung_SOLLtemperatur.sendCommand(nTemp)                    // sende gewählte Temperatur
end
Wichtig ist, dass Du auf den Status des Items zugreifen willst, Du musst also .state anhängen. Das Schlüsselwort Number gehört nicht vor das Item (nur im Items File)
Die Variable musst Du nicht unbedingt verwenden, wenn Du sie verwendest, musstDu sie nicht unbedingt mit einem Zahlenwert initialisieren, auch ein default Value muss nicht unbedingt gesetzt werden. Wenn Du sicher weißt, dass jedes der drei Items jederzeit eine gültige Zahl enthält, kannst Du auch die Prüfung auf instanceof Number weg lassen. Dann sähe die Rule so aus:

Code: Alles auswählen

rule "Heizung EG Wohnzimmer"
when
    Item Heizungsmodus changed
then
    switch((Heizungsmodus.state as Number).intValue) {
        case 1: {
            EG_Wohnzimmer_Heizung_SOLLtemperatur.sendCommand(EG_Wohnzimmer_Heizung_Absenktemperatur.state as Number)
        }
        case 2: {
            EG_Wohnzimmer_Heizung_SOLLtemperatur.sendCommand(EG_Wohnzimmer_Heizung_Heiztemperatur.state as Number)
        }
    }
end
Aber bedenke, dass jedes Item zum Start des Systems immer den Status NULL hat, womit die Rule eine null pointer exception wirft, sobald sie triggert.
Ein gültiges default Verhalten ist auch immer wünschenswert...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten