openhab2 json

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

openhab2 json

Beitrag von schlagi »

Hallo,

Ich lese über json Daten von der Middleware aus. Das funktoniert ohne Probleme.

Number Current_Haushalt1 "Leistung Haushalt1 [%.1f A]" (Current, Current_Chart) { http="<[http://10.0.0.37/middleware.php/data.js ... a.average)]" }

Ich lass mir die Daten Anzeigen . Das funktioniet auch.
Text item=Current_Haushalt1 label="Bezug vom Netz [%.1f W]" icon="energy"

Was ich jetzt möchte sind zwei sachen . 1 Das die Daten immer aktuell sind .
Und zweitens wenn sich der Wert denn ich einlese auf 0 ändert und der zweite Wert der auch eingelesen wird > 3000 ist soll sich ein item einschalten . Die Prüfung sollte alle Minute laufen ob das noch so ist wenn nicht ausschalten . Wie mache ich das ? Bitte um hilfe . Ich möchte damit meine Wärmepume für den Pool steuern die nur Laufen soll wenn genügend Strom von der PV anlage da ist und kein Strom vom Netz bezgen wird. Danke

mfg
Schlagi

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

Re: openhab2 json

Beitrag von udo1toni »

Etwas ungünstig ist, dass Du Deinen Code nicht als Code gepostet hast...

So sieht das etwas besser aus:

Code: Alles auswählen

Number Current_Haushalt1 "Leistung Haushalt1 [%.1f A]" (Current, Current_Chart) { http="<[http://10.0.0.37/middleware.php/data.json?from=-1Minute&to=+1Minute&uuid=uuid:3000:JSONPATH($.data.average)]" }
Ich gehe davon aus, dass es sich um volkszähler handelt. :)
Der to-Teil des Links wäre vermutlich besser mit Now zu setzen.
Der Wert 3000 bedeutet, dass openHAB das Item alle 3 Sekunden aktualisiert. Kannst Du machen, Du musst Dir aber im Klaren sein, dass Du damit sowhl in Volkszähler als auch in openHAB ziemlich Last erzeugst. Solange aber keine Probleme auftreten...

Die Anzeige in BASIC (oder auch einer anderen) UI wird vermutlich nicht so schnell aktualisiert werden, weil das wiederum openHAB sehr belasten würde.

Nun möchtest Du auf zwei Werte reagieren, hast hier aber nur einen Wert definiert. Aber grundsätzlich sollte so eine Regel so aussehen:

Code: Alles auswählen

rule "starte Wärmepumpe"
when
    Item eins changed or
    Item zwei changed
then
    if(eins.state == 0 && zwei.state > 3000) {
        if(pumpe.state != ON) pumpe.sendCommand(ON)
    } else if(eins.state > 0 || zwei.state < 3000) {
        if(pumpe.state != OFF) pumpe.sendCommand(OFF)
    }
end
Allerdings ist das so eine Sache... Pumpenmotoren mögen es nicht, innerhalb weniger Sekunden ein- und ausgeschaltet zu werden - eventuell gar mehrfach hintereinander.
Du solltest Dir also zum einen ein Fenster überlegen (Hysterese), welches verhindert, dass die Pumpe bei geringen Schwankungen ständig geschaltet wird, zum zweiten wäre es eine Überlegung wert, Mindestlaufzeiten und Mindestruhezeiten zu definieren. Dafür erstellst Du einen Timer, der erst abgelaufen sein muss, bevor die Pumpe erneut geschaltet wird.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

Re: openhab2 json

Beitrag von schlagi »

Hallo Toni,
Ich bin jetz einen Schritt weiter jedoch komm ich über den Fehler nicht hinweg. Wenn ich die Rule ausführe startet er immer ein uns aus.

rule "Waermepumpe Ein Aus"

when
Item Strom_Verkauf_ins_Netz received update

then
logInfo("Waermepumpen roule", "Aus Schalten")

var Number Strom_Bezug = Strom_Bezug_vom_Netz.state as DecimalType //Schreiben des Wertes in eine Variable
var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as DecimalType //Schreiben des Wertes in eine Variable
var Number PV_Current = PV_Current.state as DecimalType //Schreiben des Wertes in eine Variable

if (Strom_Bezug < 100 && PV_Current > 3000)
{
if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
}
logInfo("Waermepumpen roule", "Ein Schalten.")
logInfo("waermepumpe", "PV_Current " + PV_Current.toString)

if (Strom_Bezug > 520 ) // Strombezung groeßer als 520
logInfo("waermepumpe", "Strom_Bezug " + Strom_Bezug.toString)
{if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
}
logInfo("Waermepumpen aus", " Aus Schalten.")
logInfo("waermepumpe aus", "Strom_Bezug " + Strom_Bezug.toString)

end

Das sehe ich im Log. Ich hab mir auch schon die Werte anzeigen lassen . Die stimmen.
Aber wie kann das sein wenn die If bedingung für das Einschalten erfüllt ist kann ja die fürs ausschalten nicht erfüllt sein.
Bitte um Info wo ich da den Fehler hab.
Weiters mit der Überlegung von Mindestlaufzeiten und Ruhezeiten . Wie kann ich das einbauen. Möchte Mindestlaufzeit 15 Minuten.
Beim Ausschalten soll der Strom_Bezug auch mindestens 15 Minuten schon den Wert haben das nicht bei jeder Wolke ausgeschalten wird.
Wie kann ich das einbauen ?. Bitte um Hilfe. Danke Christian


2019-04-28 19:43:45.350 [INFO ] [e.smarthome.model.script.waermepumpe] - PV_Current 222
2019-04-28 19:43:45.351 [INFO ] [e.smarthome.model.script.waermepumpe] - Strom_Bezug 649.18
2019-04-28 19:43:45.352 [INFO ] [rthome.model.script.Waermepumpen aus] - Aus Schalten.
2019-04-28 19:43:45.352 [INFO ] [arthome.model.script.waermepumpe aus] - Strom_Bezug 649.18
2019-04-28 19:43:49.141 [INFO ] [home.model.script.Waermepumpen roule] - Aus Schalten
2019-04-28 19:43:49.143 [INFO ] [home.model.script.Waermepumpen roule] - Ein Schalten.
2019-04-28 19:43:49.143 [INFO ] [e.smarthome.model.script.waermepumpe] - PV_Current 212
2019-04-28 19:43:49.144 [INFO ] [e.smarthome.model.script.waermepumpe] - Strom_Bezug 638.71
2019-04-28 19:43:49.145 [INFO ] [rthome.model.script.Waermepumpen aus] - Aus Schalten.
2019-04-28 19:43:49.146 [INFO ] [arthome.model.script.waermepumpe aus] - Strom_Bezug 638.71

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

Re: openhab2 json

Beitrag von schlagi »

Hallo Toni,

Ich bin jetzt schon weiter mit der Rule.
Leider hab ich das Problem das ich laut log immer aus und ein schicke. Obwol das mit den IF Bedinungeng gar nicht sein kann.
Ich hab auch die Werte schon ausgelesen die in der IF Bedingung sind. Die sind Ok.
Has du da noch eine Idee für mich bitte. Bei den Laufzeiten hätte ich gerne 15 Minten ein und wenn er läuft muss der Wert
Strom_Bezug auch schon 15 Minuten so hoch sein bevor er ausschaltet um unterbrechungen von Wolken auszuschließen.
Wie kann ich denn das ein bauen . Bitte um Hilfe.

rule "Waermepumpe Ein Aus"

when

Item Strom_Verkauf_ins_Netz received update


then

logInfo("Waermepumpen roule", "Aus Schalten")


var Number Strom_Bezug = Strom_Bezug_vom_Netz.state as DecimalType //Schreiben des Wertes in eine Variable
var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as DecimalType //Schreiben des Wertes in eine Variable
var Number PV_Current = PV_Current.state as DecimalType //Schreiben des Wertes in eine Variable

if (Strom_Bezug < 100 && PV_Current > 3000)
{
if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
}
logInfo("Waermepumpen roule", "Ein Schalten.")
logInfo("waermepumpe", "PV_Current " + PV_Current.toString)



if (Strom_Bezug > 520 ) // Strombezung groeßer als 520
logInfo("waermepumpe", "Strom_Bezug " + Strom_Bezug.toString)
{if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
}
logInfo("Waermepumpen aus", " Aus Schalten.")
logInfo("waermepumpe aus", "Strom_Bezug " + Strom_Bezug.toString)


end


Auszug aus den log.

Wie man sieht schaltet er immer ein und aus !

2019-04-28 19:51:25.908 [INFO ] [home.model.script.Waermepumpen roule] - Aus Schalten
2019-04-28 19:51:25.910 [INFO ] [home.model.script.Waermepumpen roule] - Ein Schalten.
2019-04-28 19:51:25.910 [INFO ] [e.smarthome.model.script.waermepumpe] - PV_Current 64
2019-04-28 19:51:25.911 [INFO ] [e.smarthome.model.script.waermepumpe] - Strom_Bezug 696.774
2019-04-28 19:51:25.912 [INFO ] [rthome.model.script.Waermepumpen aus] - Aus Schalten.
2019-04-28 19:51:25.913 [INFO ] [arthome.model.script.waermepumpe aus] - Strom_Bezug 696.774
2019-04-28 19:51:29.817 [INFO ] [home.model.script.Waermepumpen roule] - Aus Schalten
2019-04-28 19:51:29.819 [INFO ] [home.model.script.Waermepumpen roule] - Ein Schalten.
2019-04-28 19:51:29.819 [INFO ] [e.smarthome.model.script.waermepumpe] - PV_Current 64
2019-04-28 19:51:29.820 [INFO ] [e.smarthome.model.script.waermepumpe] - Strom_Bezug 754.839
2019-04-28 19:51:29.821 [INFO ] [rthome.model.script.Waermepumpen aus] - Aus Schalten.
2019-04-28 19:51:29.822 [INFO ] [arthome.model.script.waermepumpe aus] - Strom_Bezug 754.839
2019-04-28 19:51:33.651 [INFO ] [home.model.script.Waermepumpen roule] - Aus Schalten
2019-04-28 19:51:33.652 [INFO ] [home.model.script.Waermepumpen roule] - Ein Schalten.
2019-04-28 19:51:33.653 [INFO ] [e.smarthome.model.script.waermepumpe] - PV_Current 61
2019-04-28 19:51:33.654 [INFO ] [e.smarthome.model.script.waermepumpe] - Strom_Bezug 696.774
2019-04-28 19:51:33.654 [INFO ] [rthome.model.script.Waermepumpen aus] - Aus Schalten.

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

Re: openhab2 json

Beitrag von udo1toni »

Nochmal der Hinweis, poste Code (sowie Logs oder Konfigurationen) immer als Code, nicht als normalen Text. Die Lesbarkeit ist einfach wesentlich besser.

Dein Code sieht ja erstmal gut aus, aber wenn man näher schaut, werden Fehler offenbar. Hier nochmal besser formatiert:

Code: Alles auswählen

rule "Waermepumpe Ein Aus"
when
    Item Strom_Verkauf_ins_Netz received update
then
    logInfo("Waermepumpen roule", "Aus Schalten")
    var Number Strom_Bezug = Strom_Bezug_vom_Netz.state as DecimalType         // Schreiben des Wertes in eine Variable
    var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as DecimalType     // Schreiben des Wertes in eine Variable
    var Number PV_Current = PV_Current.state as DecimalType                    // Schreiben des Wertes in eine Variable
    if (Strom_Bezug < 100 && PV_Current > 3000) {
        if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
    }
    logInfo("Waermepumpen roule", "Ein Schalten.")
    logInfo("waermepumpe", "PV_Current " + PV_Current.toString)
    if (Strom_Bezug > 520 )                                                    // Strombezung groeßer als 520
        logInfo("waermepumpe", "Strom_Bezug " + Strom_Bezug.toString)
    { if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
    }
    logInfo("Waermepumpen aus", " Aus Schalten.")
    logInfo("waermepumpe aus", "Strom_Bezug " + Strom_Bezug.toString)
end
Anhand der Einrückungen solltest Du Deinen Fehler erkennen können. Deine Bedingung if (Strom_Bezug > 520 ) wirkt schlicht nur auf die darauf folgende logInfo Zeile. Damit wird das OFF auf jeden Fall ausgeführt, gleich welche Bedingungen sonst erfüllt sind oder nicht. Besser wäre folgender Code:

Code: Alles auswählen

rule "Waermepumpe Ein Aus"
when
    Item Strom_Verkauf_ins_Netz received update
then
    logInfo("waermepumpe", "Schalten")
    if(!(Strom_Bezug_vom_Netz.state instanceof Number)) return;               // Abbruch, Strom_Bezug_vom_Netz ungültig
    if(!(Strom_Verkauf_ins_Netz.state instanceof Number)) return;             // Abbruch, Strom_Verkauf_ins_Netz ungültig
    if(!(PV_Current.state instanceof Number)) return;                         // Abbruch, PV_Current ungültig
    var Number Strom_Bezug = Strom_Bezug_vom_Netz.state as Number             // Schreiben des Wertes in eine Variable
    var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as Number         // Schreiben des Wertes in eine Variable
    var Number PV_Current = PV_Current.state as Number                        // Schreiben des Wertes in eine Variable
    if (Strom_Bezug < 100 && PV_Current > 3000) {
        logInfo("waermepumpe", "Einschalten.")
        logInfo("waermepumpe", "PV_Current {}",PV_Current)
        if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
    }
    if (Strom_Bezug > 520 )                                                   // Strombezug größer als 520
        logInfo("waermepumpe", " Ausschalten.")
        logInfo("waermepumpe", "Strom_Bezug {}", Strom_Bezug)
        if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
    }
end
Man sollte nicht davon ausgehen, dass alle Status der fraglichen Items gültige Zahlenwerte enthalten. Entsprechend muss also zuerst einmal überprüft werden, ob der Status vom Typ Number ist. Ist das der Fall, kann man ihn einer Variablen zuweisen. Oft enthalten die Status Berechnungsgrundlagen, ohne die die Rule sinnlos ist, weshalb es dann sinnvoll ist, die Rule einfach abzubrechen.
Die Laufzeiten könnte man mit einem Timer steurern. Wenn Du den Bezug über die letzten 15 Minuten betrachten willst, musst Du eine Persistence einrichten, die alle Updates in eine Datenbank schreibt. Hier bietet sich rrd4j an, aber eine SQL-Variante ginge auch. Ungeeignet ist hingegen mapdb, da hier keine historischen Werte betrachtet werden können.

Gesetzt den Fall, der Bezug wird mit rrd4j persistiert, sähe eine passende Rule so aus:

Code: Alles auswählen

var Timer tWaerme = null

rule "Waermepumpe Ein Aus"
when
    Item Strom_Verkauf_ins_Netz received update
then
    logInfo("waermepumpe", "Schalten")
    if(!(Strom_Bezug_vom_Netz.state instanceof Number)) {
        logWarn("waermepumpe", "Strom_Bezug_vom_Netz ungültig!")
        return;
    }
    if(!(Strom_Verkauf_ins_Netz.state instanceof Number)) {
        logWarn("waermepumpe", "Strom_Verkauf_ins_Netz ungültig!")
        return;
    }
    if(!(PV_Current.state instanceof Number)) {
        logWarn("waermepumpe", "PV_Current ungültig!")
        return;
    }
    var Number Strom_Bezug = Strom_Bezug_vom_Netz.minimumSince(now.minusMinutes(15),"rrd4j") as Number    // Schreiben des Wertes in eine Variable
    var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as Number                                     // Schreiben des Wertes in eine Variable
    var Number PV_Current = PV_Current.state as Number                                                    // Schreiben des Wertes in eine Variable
    logInfo("waermepumpe", "PV_Current {}",PV_Current)
    logInfo("waermepumpe", "Strom_Bezug {}", Strom_Bezug)
    if(tWaerme===null) {
        tWaerme = createTimer(now.plusMinutes(15), [ |
            tWaerme=null
        ])
        if((Strom_Bezug_vom_Netz.state as Number) < 100 && PV_Current > 3000) {
            logInfo("waermepumpe", "Einschalten.")
            if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
        }
        if(Strom_Bezug > 520) {                                                                           // Strombezung groeßer als 520
            logInfo("waermepumpe", " Ausschalten.")
            if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
        }
    }
end
Der Timer dient hier nur als Schaltunterdrückung.
Die Rule ist nicht elegant, sollte aber ihren Zweck erfüllen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

Re: openhab2 json

Beitrag von schlagi »

Hallo danke für die schelle Antwort.
Leider bekomme ich diesen Fehler, bei der Ausführung.

Code: Alles auswählen

[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'waermepumpe.rules' has errors, therefore ignoring it: [37,5]: extraneous input '}' expecting 'end'

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

Re: openhab2 json

Beitrag von udo1toni »

Du müsstest bitte den Inhalt des Rules Files posten, da ich nicht wissen kann, welche Zeile nun die 37ste ist. Der Fehler ist vermutlich schon etwas vorher, also zumindest die komplette Rule (so wie im File) zusammen mit der Angabe, welche Zeilennummer die 1. Zeile hat.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

Re: openhab2 json

Beitrag von schlagi »

hast du den Inhalt erhalten

schlagi
Beiträge: 34
Registriert: 14. Jul 2018 17:42
Answers: 0

Re: openhab2 json

Beitrag von schlagi »

Da ist ist der Inhalt der Rule.
Ich glaube das Problem ist das einlesen vom Strom_Bezug_vom_Netz

es wird von Volkszähler eingelesen . Wie sehe ich ob das auch Number ist ?. Siehst du da das Problem oder ?

Code: Alles auswählen

Number Strom_Bezug_vom_Netz "Strom_Bezug_vom_Netz [%.1f A]" (Current, gStrom_Chart) { http="<[http:ip/middleware.php/data.json?from=-1Minute&to=Now&uuid=uuid:3000:JSONPATH($.data.average)]" }
[code]

[code]var Timer tWaerme = null

rule "Waermepumpe Ein Aus"
when
     Strom_Bezug_vom_Netz received update
then
    logInfo("waermepumpe", "Schalten")
    if(!(Strom_Bezug_vom_Netz.state instanceof Number)) {
        logWarn("waermepumpe","Strom_Bezug_vom_Netz Status: {}" "Strom_Bezug_vom_Netz ungültig!")
        return;
    }
    if(!(Strom_Verkauf_ins_Netz.state instanceof Number)) {
        logWarn("waermepumpe", "Strom_Verkauf_ins_Netz ungültig!")
        return;
    }
    if(!(PV_Current.state instanceof Number)) {
        logWarn("waermepumpe", "PV_Current ungültig!")
        return;
    }
    var Number Strom_Bezug = Strom_Bezug_vom_Netz.minimumSince(now.minusMinutes(15),"rrd4j") as Number    // Schreiben des Wertes in eine Variable
    var Number Strom_Verkauf = Strom_Verkauf_ins_Netz.state as Number                                     // Schreiben des Wertes in eine Variable
    var Number PV_Current = PV_Current.state as Number                                                    // Schreiben des Wertes in eine Variable
    logInfo("waermepumpe", "PV_Current {}",PV_Current)
    logInfo("waermepumpe", "Strom_Bezug {}", Strom_Bezug)
   // if(tWaerme===null) {
	if(tWaerme == null) {
        tWaerme = createTimer(now.plusMinutes(15), [ |
            tWaerme=null
        ])
        if((Strom_Bezug_vom_Netz.state as Number) < 100 && PV_Current > 3000) {
            logInfo("waermepumpe", "Einschalten.")
            if(Sonoff1Channel1EIN.state != ON) Sonoff1Channel1EIN.sendCommand(ON)
        }
        if(Strom_Bezug > 520)                                                                             // Strombezung groeßer als 520
            logInfo("waermepumpe", " Ausschalten.")
            if(Sonoff1Channel1EIN.state != OFF) Sonoff1Channel1EIN.sendCommand(OFF)
        }
    }
end

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

Re: openhab2 json

Beitrag von udo1toni »

Jep, in der Zeile

Code: Alles auswählen

        if(Strom_Bezug > 520)                                                                             // Strombezung groeßer als 520
fehlt eine öffnende geschweifte Klammer:

Code: Alles auswählen

        if(Strom_Bezug > 520) {                                                                           // Strombezung groeßer als 520
Tippfehler meinerseits. Ich hab es oben korrigiert.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten