Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ja richtig, regen_count als Item und persistieren,dann ist es auch nach einem Neustart wieder da.
Regen pro Woche dann vielleicht als 2. Item welches jedesmal beim Rücksetzen der täglichen Werte aufaddiert wird.
Warum setzt Du den Regenzähler um 20 Uhr auf null zurück? Normalerweise beginnt der Tag doch um 0 Uhr...
Da Du die ersten drei mal die gleiche Bedingung verwendest, kannst Du auch gleich den Block klammern und nur einmal die Bedingung abfragen (so wie bei der letzten Bedingung).
Was den Wochenzähler betrifft, sollte es reichen, den hochzuzählen. Am einfachsten geht das so:
Code:
if (!(RegenminutenWoche.state instanceof Number)) { //Nur für den Fall, dass das Item nicht initialisiert ist
RegenminutenWoche.postUpdate(0) //Item mit 0 initialisieren
Thread::sleep(300) // openHAB ein bisschen Zeit geben
}
RegenminutenWoche.postUpdate((RegenminutenWoche.state as Number) + 1)
Wahlweise kannst Du das natürlich genauso machen, wie bei den Minuten (also mit einer Variablen)
Warum setzt Du den Regenzähler um 20 Uhr auf null zurück? Normalerweise beginnt der Tag doch um 0 Uhr...
Da Du die ersten drei mal die gleiche Bedingung verwendest, kannst Du auch gleich den Block klammern und nur einmal die Bedingung abfragen (so wie bei der letzten Bedingung).
Wahlweise kannst Du das natürlich genauso machen, wie bei den Minuten (also mit einer Variablen)
Guten Morgen,
20h deshalb, weil das meine normale Beregnungszeit ist. Da schaut er, wieviel Regen in den letzten 24 fiel (und soll dann mal entscheiden, ob er die Beregnungsventile öffnet). Danach wird neu gezählt. Das erschien mir so am logischsten.
Ja, dass mein Code sagen wir mal etwas "traditionell" ist, ist mir klar. Daher auch meine Frage der Guidance zur Programmierung. Ich habe zwar zurückliegende Programmiererfahrung, aber nicht mit Java. Daher taste ich mich da so ran. Ich habe es mittlerweile auch geklammert. Nur: das ist bei mir halt "trial and error". Wenn es funktioniert, dann lasse ich es im Zweifel stehen. Und die Testläufe haben gestern Abend sehr gut geklappt.
20h deshalb, weil das meine normale Beregnungszeit ist. Da schaut er, wieviel Regen in den letzten 24 fiel (und soll dann mal entscheiden, ob er die Beregnungsventile öffnet). Danach wird neu gezählt. Das erschien mir so am logischsten.
Ja,so ergibt es natürlich Sinn.
Ja, dass mein Code sagen wir mal etwas "traditionell" ist, ist mir klar. Daher auch meine Frage der Guidance zur Programmierung. Ich habe zwar zurückliegende Programmiererfahrung, aber nicht mit Java. Daher taste ich mich da so ran. Ich habe es mittlerweile auch geklammert. Nur: das ist bei mir halt "trial and error". Wenn es funktioniert, dann lasse ich es im Zweifel stehen. Und die Testläufe haben gestern Abend sehr gut geklappt.
Keine Frage, funktioniert genauso. Ich war nur irritiert, weil Du vier Zeilen weiter unten bewiesen hast, dass Du die Klammern { } und deren Funktion bereits kennst
Es sollte noch eine andere Möglichkeit (ohne extra Rules) geben, nämlich wenn Du dafür sorgst, dass der Regensensor nicht OPEN und CLOSED zurück gibt, sondern 1 und 0 (kommt auf den Sensor und das zugrunde liegende Binding an, wie kompliziert das ist.) Dann kannst Du den Sensor als Number Item abbilden und dieses über eine Persistence Policy ausschließlich minütlich speichern lassen.
In den Rules kannst Du
für die Wochensumme. Diese Daten brauchst Du dann nur in der Rule aufzurufen, in der Du sie benötigst (um zu bestimmen ob und wie lange die Bewässerung laufen soll...), es läuft also im Zweifel nur einmal am Tag eine Rule, statt jede Minute.
Allerdings hat der Ansatz über die Rules den angenehmen Nebeneffekt, dass Du problemlos eine aktuelle Anzeige der Regendauer erhältst, was bei der beschriebenen Methode mangels Item nicht gegeben ist.
Dafür könntest Du aber problemlos einen Graphen einbinden, der die Regendauer über die Zeit abbildet, was bei Deiner Lösung nicht ohne weiteren Aufwand zu erledigen ist, hat also alles seine Vor- und Nachteile.
Irrigigation_Time ist ein number item, das über setpoint in der Sitemap gesetzt wird. Damit kann ich die Beregnungsdauer einstellen.
Ich sehe zwei Unklarheiten:
Kann ich das Number Item so in den Timer schreiben?
Öffnen Ventil eins (Node15/2), nach der definierten Zeit schließen, eine Minute Pause, dann Öffnen Ventil zwei (Node15/1). Danach abschalten...
Und die zweite Frage ist, wie ich von der Syntax mehrere Befehle in einen Timer unterbringe (letztes Abschalten + Nachrichtenversand). Sie einfach so ohne Semikolon o.ä. hereinzuschreiben fände ich ungewohnt. Allerdings meldet das Logfile keinen Fehler in der RUle.
Aber: vielen Dank. Mit "harten Zahlen" eingetragen funktioniert es.
Wie schon an andere Stelle mehrfach erwähnt, Thread::sleep(int) sollte nur für kurze (int <= 500) Wartezeiten verwendet werden, da es den Thread blockiert und openHAB nur 5 Threads zur Ausführung von Rules zur Verfügung hat.
createTimer() erwartet als Argumente zum einen eine Zeitangabe als absoluten unix-Zeitstempel, zum anderen ein Lambda (das ist alles, was zwischen zwei eckigen Klammern [] steht). Das Lambda wird bei Ablauf des Timers ausgeführt. Es spielt keine Rolle, wie viele Befehle im Lambda stehen.
now liefert den Zeitstempel. Die Methode .plusMinutes() erwartet (wie eigentlich alle Methoden von now) zwingend ein integer als Argument, Du musst also sicherstellen, dass Dein State vom Typ Integer ist.
In Deiner Rule setzt Du dreimal hintereinander einen Timer, aber Du verwendest jedesmal den gleichen Handle (die Variable timer), was im besten Fall dazu führt, dass Du nur keinen Zugriff auf den Timer mehr hast, vielleicht wird auch nur der zuletzt definierte Timer ausgeführt, weil der andere Code jeweils überschrieben wird, oder openHAB beginnt, sich seltsam zu verhalten
Allgemein muss man sich immer überlegen, was denn da eigentlich passiert.
Du hast zwei Regner, der erste Regner wird gestartet, nach Ablauf einer festgelegten Zeit wird der Regner gestoppt, nach einer Minute wird der andere Regner gestartet, nach Ablauf der festgelegten Zeit wird auhc der zweite Regner gestoppt und eine Nachricht versendet.
das Ganze ist quasi ein Programmschalter zur Ablaufsteuerung, so wie er früher in Waschmaschinen oder Gschirrspülern verbaut war. Was Du also brauchst, ist eine solche Ablaufsteuerung.:
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar