Fritz!Dect 210 für verschiedene Szenarien

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
der_pman
Beiträge: 6
Registriert: 26. Jul 2021 19:27

Fritz!Dect 210 für verschiedene Szenarien

Beitrag von der_pman »

Hallo Alle zusammen,

ich bin jetzt schon eine ganze Weile Mitleser und habe viele Anregungen von Euch umsetzten können.
Vielen Dank dafür.

Mit der o.g. Steckdose wird im Sommer die Gartenbewässerung und im Dezember die Weihnachtsbeleuchtung gesteuert.
Dazu habe ich bis jetzt immer die Rule im Verzeichnis umbenannt.

Meine Weihnachtsregel

Code: Alles auswählen

/* Beleuchtung schaltet zwischen 5 und 21 Uhr wenn die Sonne hinter dem Horizont verschwunden ist */

rule "Beleuchtung"
	when 
		Time cron "0 0/15 * * * ?"	// cron alle 15 Minuten
	then
		logInfo("Weihnachten","Regel Beleuchtung an")
		if ((now.getHourOfDay() > 5 && now.getHourOfDay() < 21) && PositionElevation.state() < -5)
		   {Outlet2.sendCommand(ON)}
		else 
		   {Outlet2.sendCommand(OFF)}
end
Da ich einen halbautomatischen Umschalter von Gardena einsetze, habe ich bisher immer die Steckdose per Switch eingeschaltet und einen Timer laufen lassen. Nach 15 Minuten wurde automatisch abgeschaltet und nach 60 Sekunden habe ich wieder manuell eingeschaltet.
Nachdem ich jetzt den 3. Strang in Betrieb genommen habe, soll jetzt die manuelle Einschaltung wegfallen.

Meine bisherige "halbautomatische Rule" mit Timer

Code: Alles auswählen

/*
Outlet2 ist der name der Fritzsteckdose
Auto_Outlet2 ist ein virtueller Switch der den Timer aktiviert - steht dieser auf OFF = Dauerbetrieb
*/

var Timer dect210_timer = null //Timer auf Null

rule "dect210 an"
when
    Item Outlet2 changed to ON
then
			logInfo("dect210_timer","Pumpe ist an")
			dect210_timer = createTimer(now.plusMinutes(15), [|
			if (Auto_Outlet2.state == ON) {		
					Outlet2.sendCommand(OFF)
					sendNotification("bpman@web.de", 
            "Pumpe aus")
					}
		])
end

rule "dect210 aus"
when
	Item Outlet2 changed to OFF
then
        if(dect210_timer !== null) {
            logInfo("dect210_timer","Pumpe ist aus")
            dect210_timer.cancel()
            dect210_timer = null
   	    }
end
Da ich in dieser Rule die Schleife für die 3 Stränge nicht hinbekommen habe, wählte ich die nachfolgende nicht so elegante Methode

Code: Alles auswählen



rule "Pumpe schalten"

when
    Item Pumpe_an changed to ON       // Pumpe_an ist ein virtueller Switch
then
    var i = 0
    while((i=i+1) < 4)
	{
        Outlet2.sendCommand(ON)
		Thread::sleep(900000) // 15 Minuten
		Outlet2.sendCommand(OFF)
		Thread::sleep(60000) // 60 Sekunden
    }
	Pumpe_an.sendCommand(OFF)
end

Damit bekomme ich zwar meine 3 Durchläufe ohne Eingriff geregelt, bin mir aber im klaren, das es nicht der eleganteste Weg ist.

Hat jemand eine Idee wie ich die letzte Rule mit einem Timer realisieren und trotzdem eine variable Anzahl von Durchläufen ausführen kann?
Besteht eine Möglichkeit die Weihnachtsbeleuchtung mit in diese Regel zu integrieren? (evtl. mit einer Datumssteuerung aktiv 01.12 - 31.12)

Vielen Dank
pman
Ich weis das ich nix weis - und davon eine ganze Menge ;)

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

Re: Fritz!Dect 210 für verschiedene Szenarien

Beitrag von udo1toni »

Vielleicht erklärst Du kurz, warum Du das überhaupt so machst.

Also, warum hast Du in der Steckdose einen Ausschalttimer eingebaut? Das macht Dein Leben doch nur unnötig kompliziert.
Was meinst Du mit drei Strängen?

Deine Rules beeinflussen sich gegenseitig, Du ziehst daraus aber irgendwie keinen Nutzen.

Was die variable Schleife mit unterschiedlichen Ein-Ausschaltzeiten betrifft, schau mal hier:

Code: Alles auswählen

var Number nCount = 9
var Timer  tCount = null

rule "Pumpe schalten"
when
    Item Pumpe_an changed to ON                         // Pumpe_an ist ein virtueller Switch
then
    nCount = 9                                          // Zähler auf ungerade -> nächster Schritt ON
    tCount?.cancel                                      // Timer entfernen, falls vorhanden
    tCount = createTimer(now.plusMillis(10),[|          // Timer anlegen und ausführen
        nCount = nCount - 1                             // Zähler verringern
        if(nCount > 0) {                                // Falls noch nicht 0
            var Integer iTime = 60                      // Ausschaltdauer ist default
            if((nCount/2).intValue == nCount/2) {       // Falls gerade
                Outlet2.sendCommand(ON)                    // Steckdose an
                iTime = 900                             // Einschaltdauer setzen
            } else {                                    // Falls ungerade
                Outlet2.sendCommand(OFF)                // Steckdose aus
            }
            tCount.reschedule(now.plusSeconds(iTime))    // Timer erneut planen
        } else                                          // Falls Zähler 0
            Pumpe_an.postUpdate(OFF)                    // Schalter zurück nach OFF
    ])
end
Es wird ein Timer verwendet, außerdem eine Zählvariable (entspricht Deiner while-Variablen).
Der Unterschied ist allerdings, diese Rule läuft jeweils nur einige Millisekunden, während Deine Rule 4*(900+60) Sekunden mit Nichts tun verbringt, dabei aber einen Thread belegt.
Unter OH3 spielt das keine so große Rolle, vorher (also OH2.5 oder kleiner) kannst Du mit so einer Rule openHAB ganz leicht dazu bringen, dass nichts mehr funktioniert.

Aber wie gesagt, mir erscheinen Deine Rule unnötig kompliziert, salopp gesagt von hinten durch die Brust ins Auge.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

der_pman
Beiträge: 6
Registriert: 26. Jul 2021 19:27

Re: Fritz!Dect 210 für verschiedene Szenarien

Beitrag von der_pman »

Vielen Dank für Deine Antwort.

Kurz zur Erklärung, der Gardena-Automat kann bis zu 6 Stränge ausgangsseitig nacheinander bedienen (siehe Bild).
Davon nutze ich die Ausgänge 1-3, da meine Pumpe nicht alle Sprenger gleichzeitig bedienen kann.
Zum mechanischen Umschalten der Ausgänge ist eine Unterbrechung des Wasserdrucks erforderlich, daher die Pause von 60 Sekunden in Rule 3.

Ursprünglich wollte ich mit "outlet2.Sendcommand(15)" die Einschaltdauer übermitteln, aber das kann die Fritz-Dose nicht.

In der "halbautomatische" Rule sollte die Pumpe in Abhängigkeit der Stati von outlet2 und Auto_outlet2 geschaltet werden.
Wenn Auto_Outlet2 = ON dann greift der Ausschalttimer - wenn OFF dann läuft die Pumpe im Dauerbetrieb.

Alles basiert auf dem Status von outlet2.
Wenn ON dann greift die Rule, wenn OFF dann wird in der selben Rule der Timer zurückgesetzt und die Meldung "Pumpe ist aus" generiert.

Die Rule mit den Threads ist meine Alternative zu Rule 2 (mit dem Ausschalttimer) da ich die Schleife nicht anders hinbekommen habe.
Es ist nur eine von beiden aktiv.

Gruß pman
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ich weis das ich nix weis - und davon eine ganze Menge ;)

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

Re: Fritz!Dect 210 für verschiedene Szenarien

Beitrag von udo1toni »

Ah, der mechanische Umschalter erklärt es :)

Die Fritz-Dose selbst hat also keine Abschaltautomatik.

Dann sollte der Aufbau Deiner Rules dennoch anders funktionieren.

Timer-Steuerung habe ich ja schon gezeigt. Die Weihnachtsbeleuchtung kann davon losgelöst betrachtet werden.

Ich habe bei mir die Weihnachtsbeleuchtung komplett automatisiert, das heißt, die Beleuchtung startet am Montag nach dem Totensonntag (das ist der Montag vor dem 1. Advent) und endet am Heilige drei Könige (6.1.).
Letztlich habe ich eine Formel, welche den 1. Advent bestimmt, diese wird genutzt, um ein Flag zu setzen (das passiert um Mitternacht und beim Systemstart) Am 6.1. wird das Flag gelöscht (ebenfalls um Mitternacht).
Meine eigentlichen Schaltzeiten sind starr gesetzt über Time cron. Man kann auch Monate angeben, in denen die Rule aufgerufen wird (in diesem Fall also November bis Januar). Die jeweilige Rule zum Ein- bzw. Ausschalten wird also einmal am Tag aufgerufen, aber nur in dem fraglichen Zeitraum. Ist das Flag gesetzt, so schaltet sie, ist das Flag nicht gesetzt, lässt sie es bleiben.

Da Du die Steckdose jahreszeitabhängig unterschiedlich nutzt, bräuchtest Du im Zweifel noch ein weiters Flag, welches angibt, ob die Pumpe angeschlossen ist oder nicht (oder Du gehst einfach davon aus, dass die Pumpe immer angeschlossen ist, wenn die Weihnachtsbeleuchtung nicht angeschlossen ist… dann reicht das eine Flag aus)


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

Antworten