Mal wieder eine "rule" Frage

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Mal wieder eine "rule" Frage

Beitrag von udo1toni »

Die Variante ist zugegebenermaßen kurz, aber schön ist das auch nicht.

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var Timer tRoll = null
var nRoll = 0

rule "Alle Rolladen ohne Ausnahmen öffnen"
when
    Item <TRIGGER> changed from OFF to ON
then
    if(tRoll === null) {                                                     // nur falls die Rule noch nicht getriggert wurde
        nRoll = 0                                                            // Zähler auf 0
        tRoll = createTimer(now.plusMillis(100), [|                          // Timer initialisieren
            nRoll += 1                                                       // Zähler hochzählen
            if(nRoll <= gBlinds.members.size) {                              // Falls noch nicht am Ende der Liste angekommen
                if(gBlinds.members.sortBy[name].get(nRoll).state > 0) {      // aktuelles Element > 0 ?
                    gBlinds.members.sortBy[name].get(nRoll).sendCommand(0)   // Laden hoch
                    tRoll.reschedule(now.plusMillis(200))                    // warten und nächster Laden
                } else {
                    tRoll.reschedule(now.plusMillis(10))                     // nächster Laden
                }
            } else {                                                         // Liste komplett durchlaufen
                tRoll = null                                                 // timer löschen
            }
        ])
    }
end
Vermutlich könnte man auf das sortBy[name] verzichten, das ist nur zur Sicherheit, dass die Läden in einer festgelegten Reihenfolge durchlaufen werden.

Diese Variante hat den Vorteil, dass die Rule (auch während sie ausgeführt wird) beliebig oft getriggert werden darf, ohne dass dies Auswirkungen hat, schließlich wird der Timer nur erstellt, wenn noch keiner angelegt wurde.
Es wird auch nur ein Platz im Scheduler benötigt. Auch wenn mir nicht bewusst wäre, dass es hier eine Grenze gibt, so könnte eine lange Liste im Scheduler doch Auswirkungen haben. Das Lambda wird pro Timer hinterlegt und der Code ist identisch - Platzverschwendung (RAM).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Mal wieder eine "rule" Frage

Beitrag von eiGelbGeek »

Müsste die folgende Zeile nicht geändert werden?

Code: Alles auswählen

gBlinds.members.sortBy[name].get(nRoll).state > 0
gBlinds.members.sortBy[name].get(nRoll).sendCommand(0)
in

Code: Alles auswählen

gBlinds.members.sortBy[name].get(nRoll -1).state > 0
gBlinds.members.sortBy[name].get(nRoll -1).sendCommand(0)
weil 0 das erste Element ist.

Ich kann gerade nicht alle Rolladen hoch und runter fahren WAF liegt im Bett ;-) Ohne den -1 rennt er in einen Java Fehler mit Array out of Range...

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

Re: Mal wieder eine "rule" Frage

Beitrag von udo1toni »

Oh, ja, das kann gut sein... :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

Tja, nach diversen Tests kann ich sagen, dass es nicht an der Synology lag. Auf Qnap das gleiche Resultat.
Da wir ja etwas vom ursprünglichen Thema abgekommen sind, beende ich damit meine Anfrage.
Immerhin mit einem doch positiven Resultat: wieder einiges gelernt :-)
Vielen Dank für eure Mühe.

Gruss und Dank
atk69
and IT works ;)

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Mal wieder eine "rule" Frage

Beitrag von eiGelbGeek »

atk69 hat geschrieben: 14. Aug 2019 07:24 Zuerst OH via Docker probiert. Gefällt mir gar nicht. Pfade sind schlecht zu finden und diverse Dienste gehen wohl nicht (z.B. ping)
Das lässt sich aber ganz einfach und simpel lösen, wenn man es passend installiert :mrgreen:

Dockerfile anlegen und benötigte Tools angeben. In meinen Beispiel sind es z.b. netcat (socat) , ping, jq, bc und awk

Code: Alles auswählen

FROM openhab/openhab:latest

RUN apt-get update && apt-get install -y netcat inetutils-ping jq bc gawk &&\
  rm -rf /var/lib/apt/lists/*
Docker Image erstellen mit:

Code: Alles auswählen

docker build --force-rm --no-cache -t private/openhab:latest

docker-compose.yml (ggf. Pfade anpassen hier ist es ein Synology NAS) (- "/dev/ttyZWave:/dev/ttyACM0" brauche ich für den ZWave Stick der an einen Raspberry hängt und per ser2net/socat angebunden ist)
USER und Gruppen ID natürlich auf deine Bedürfnisse anpassen :-)

Code: Alles auswählen

version: '3'

services:
  openhab:
    container_name: openhab
    image: "private/openhab:latest"
    restart: always
    network_mode: host
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
      - "/etc/TZ:/etc/timezone:ro"
      - "/volume1/docker/openhab/addons:/openhab/addons"
      - "/volume1/docker/openhab/conf:/openhab/conf"
      - "/volume1/docker/openhab/userdata:/openhab/userdata"
      - "/dev/ttyZWave:/dev/ttyACM0"
    environment:
      USER_ID: "9999"
      GROUP_ID: "66666"
      OPENHAB_HTTP_PORT: "8484"
      OPENHAB_HTTPS_PORT: "8843"
      EXTRA_JAVA_OPTS: "-Duser.timezone=Europe/Berlin -Dgnu.io.rxtx.SerialPorts=/dev/ttyACM0"
Docker funktioniert halt etwas anders als eine normale Installation, aber wenn man es einmal verstanden hat, dann will man openhab nicht mehr anders betreiben.... innerhalb weniger Sekunden hat man z.b. ein 2tes openhab gestartet, testet das build und wenn es funktioniert, dann nutzt man es oder bleibt beim alten ;-) Deine Config etc pp. bleibt immer erhalten, weil diese ausserhalb vom Container liegen. (einfach Container löschen, neuen starten und zack wieder ein frisches konfiguriertes System vorhanden.

Meine Empfehlung wäre, nutze Produktiv erstmal dein jetzt vorhandenes System und spiele mit Docker erstmal rum ... wenn es verstanden hast, dann switch rüber :-) Du kannst das Testsystem ja parallel betreiben :-) Wenn Fragen auftauchen, einfach hier fragen :-)

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Mal wieder eine "rule" Frage

Beitrag von atk69 »

Vielen Dank eiGelbGeek
war ein paar Wochen offline ;-)
werde es mittels deiner Anleitung nochmal probieren.

Gruss
atk69
and IT works ;)

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Mal wieder eine "rule" Frage

Beitrag von eiGelbGeek »

Meine Anleitung funktioniert aber ist nicht mehr das was ich nutze ;-) Das ganze geht besser, es muss kein Custom Image gebaut werden. Man kann das ganze über cont-init.d Script lösen ... das sind Scripte die beim Start des Containers ausgeführt werden ... dort werden dann die benötigten Tools installiert .... wenn ich mich nicht ganz täusche hat mich ein Thread in diesen Forum dadrauf aufmerksam gemacht, kann aber auch sein das es im Englischen Offiziellen Forum war ;-)

50-exec-scripts.sh erstellen in /pfad/zum/docker/openhab/cont-init.d/

Code: Alles auswählen

#!/usr/bin/with-contenv bash

# Include openhab scripts folder in path
export PATH=${OPENHAB_CONF}/scripts:${PATH}

# Install additional packages
apt-get -qq update && \
DEBIAN_FRONTEND=noninteractive apt-get -qq install --no-install-recommends -y \
netcat \
inetutils-ping \
jq \
bc \
gawk
docker-compose.yml erstellen in /pfad/zum/docker/openhab/

Code: Alles auswählen

version: '2.2'

services:
  openhab:
    container_name: openhab
    image: "openhab/openhab:latest"
    restart: always
    network_mode: host
    volumes:
      - "/etc/localtime:/etc/localtime:ro"
      - "/etc/TZ:/etc/timezone:ro"
      - "./addons:/openhab/addons"
      - "./conf:/openhab/conf"
      - "./userdata:/openhab/userdata"
      - "./cont-init.d:/etc/cont-init.d"
      - "/dev/ttyZWave:/dev/ttyACM0"
    environment:
      USER_ID: "XXXX"
      GROUP_ID: "XXXX"
      OPENHAB_HTTP_PORT: "8484"
      OPENHAB_HTTPS_PORT: "8843"
      EXTRA_JAVA_OPTS: "-Duser.timezone=Europe/Berlin -Dgnu.io.rxtx.SerialPorts=/dev/ttyACM0"
Docker Container starten mit

Code: Alles auswählen

cd /pfad/zum/docker/openhab/
sudo docker-compose -d up
PS: ggf. die Docker-compose und das Script anpassen .. falls du bestimmte Dinge nicht brauchst oder andere Tool benötigst :mrgreen:

Antworten