Seite 2 von 2

Re: Openhab 3 Rules / Code

Verfasst: 1. Jan 2022 14:36
von Andy089
Funktionieren tut es. Es gibt ebenso die Möglichkeit bei OH3, über die Grafische Oberfläche dieses zu konfigurieren, ich gehe stark davon aus das es bei OH2 auch schon so war.
Allerdings hatte es bei mir etwas gedauert bis OH mir die Lautsprecher zu Verfügung gestellt hatte.
Beim ersten Versuch eine rule zu erstellen hatte ich die Lautsprecher noch nicht zur Auswahl, Beim zweiten versuche, also ein Tag später waren Sie Plötzlich alle da. 😊
Ich kann zum Glück das Problem was du schilderst nicht bestätigen, bisher läuft es bisher ohne Probleme.
Ich habe meine Instanzen auf einem Raspberry Zero W und auf zwei Raspberry 3 anlaufen mit dem aktuellen Buster Debian. Einer der beiden Raspberry 3 ist der Openhab und Mediacenter Server.

Re: Openhab 3 Rules / Code

Verfasst: 1. Jan 2022 16:50
von udo1toni
Buster ist nicht aktuell :) das aktuelle Debian heißt Bullseye...

Ich gehe auch stark davon aus, dass der von mir beschriebene Bug mit einer aktuellen Version von squeezelite nicht mehr auftreten wird, aber der Odroid U3 ist seit etlichen Jahren nicht mehr im Angebot, ich müsste also z.B. stattdessen dort einen Raspberry Pi 4 einbauen (es gibt kein aktuelles Build).
Es laufen auf dem SBC vier Instanzen des squeezelite - im Zusammenspiel mit einer 8-Kanal-USB Soundkarte, die über ALSA in vier virtuelle Stereo Soundkarten gesplittet ist. Momentan ist es ohnehin nicht ganz einfach, an neue Raspberries zu kommen...

Re: Openhab 3 Rules / Code

Verfasst: 2. Jan 2022 15:42
von rmfausi
Frohes Neues erstmal,
ich habe bei mir zwei Türkontakte in der Garage verbaut. Einer ist am Garagentor der Andere an der Tür zum Garten.
Ich möchte das so machen, wenn das Garagentor öffnet wird eine Telegram Nachricht gesendet und eine Lampe leuchtet grün auf.
Wenn die Gartentür offen ist wieder die Nachricht und die Lampe leuchtet weiss. Sind beide gleichzeitig offen dann soll die Lampe rot leuchten.

Code: Alles auswählen

val telegramAction = getActions("telegram","telegrambot")
  telegramAction.sendTelegram("Das Garagentor ist OFFEN")
  
if (GartenturContact_OpenClose.state  == OPEN) {
  GaragenLicht_Farbe.sendCommand("0,100,100") // Rot
}
else
  GaragenLicht_Farbe.sendCommand("120,100,100") //Grün
Meine Frage ist nun, ist der Status "GartenturContact_OpenClose.state" global oder wie kann ich darauf zugreifen? Muss man das isrgendwo definieren? Die Lampe schaltet nicht auf rot um wenn beide Türen offen sind, diesen Fehler suche ich gerade und stehe ein bisschen auf dem Schlauch.

Ich würde mich freuen wenn jemand einen Tipp für mich hätte, Gruß rmfausi.

Re: Openhab 3 Rules / Code

Verfasst: 2. Jan 2022 17:37
von HiG
rmfausi hat geschrieben: 2. Jan 2022 15:42 GartenturContact_OpenClose.state == OPEN
ich für meinen Teil frage den Status lieber als String ab

Code: Alles auswählen

GartenturContact_OpenClose.state.toString=='OPEN'
rmfausi hat geschrieben: 2. Jan 2022 15:42 und die Lampe leuchtet weiss
das fehlt aber noch

Auch bin ich eher ein Fan von

Code: Alles auswählen

if (GartenturContact_OpenClose.state  === null ) {
  //Tu was oder nicht
} else if (GartenturContact_OpenClose.state .toString == 'OPEN'){
  //Dann tu was anderes
} else if (GartenturContact_OpenClose.state .toString == 'CLOSE'){
  //Dann tu wieder was anderes
} else {
  //alle!!!! anderen Fälle
}
Beachte auch die 3! "=" im ersten IF. Ob das für den State ohne toString auch so gemacht werden muss....kann Dir sicher der Udo sagen

Re: Openhab 3 Rules / Code

Verfasst: 2. Jan 2022 22:50
von udo1toni
Du kannst das nicht in einer Rule erschlagen (bzw geht das schon, aber eben nicht so).
Eine Rule ist immer ereignisgesteuert. Das Ereignis kann zeitlich sein, eine Statusänderung, ein Befehl...
Deine Rule soll auf beide Kontakte reagieren, also müssen beide Kontakte die Rule triggern.

Innerhalb der Rule musst Du dann vier Fälle unterscheiden, Kontakt 1 ist CLOSED und Kontakt 2 ist CLOSED, Kontakt 1 ist OPEN und Kontakt 2 ist CLOSED, Kontakt 1 ist CLOSED und Kontakt 2 ist OPEN, sowie Kontakt 1 ist OPEN und Kontakt 2 ist OPEN.

Eine einfache Form wäre so:

Code: Alles auswählen

var Integer nDoors = 0
if(GartenturContact_OpenClose.state == OPEN) nDoors = 1
if(GaragenturContact_OpenClose.state == OPEN) nDoors += 2
switch(nDoors) {
    case 0: { // beide zu
        // Licht  aus
        // telegramm senden?
    }
    case 1: { // Gartentür offen
        // Licht  weiß
        // telegramm senden?
    }
    case 2: { // Garage offen
        // Licht  grün
        // telegramm senden?
    }
    case 3: { // Beide offen
        // Licht  rot
        // telegramm senden?
    }
}
Vorteil gegenüber mehrfachem Prüfen der Zustände ist, dass die Itemregistry exakt zweimal angesprochen wird, ansonsten kann das bis zu 8 mal passieren, mindestens aber zweimal. Das switch-case dürfte um Längen schneller sein als Bool'sche Algebra mit Bedingungen.
Die Rule muss nur triggern, sobald sich einer der beiden Kontaktzustände ändert, also zweimal changed als Triggerart und eben die beiden Items. Namen des zweiten Items habe ich geraten...

Re: Openhab 3 Rules / Code

Verfasst: 3. Jan 2022 21:08
von rmfausi
Danke erstmal für eure Hilfe. :-)
Ich werde mich die Tage nochmal dran setzen und mich mit euren Tipps beschäftigen. Die Lösung von udo1toni ist für mich sehr übersichtlich und habe glaube ich zumindest kapiert was er mir vorschlägt.

Gruß rmfausi

Re: Openhab 3 Rules / Code

Verfasst: 21. Feb 2022 06:45
von Andy089
Wollte mich nochmal kurz zurückmelden.

Der Mediacenter Server sowie squeezelite (v1.9.9-1392) laufen mit Openhab (sprach,-Tonausgabe) soweit stabil. Habe es jetzt einige Monate im Betrieb.
Anfangs hatte ich zwar die Probleme, dass der LMS die Lautsprecher immer vertauscht hat und sie nicht immer alle angezeigt hatte.

Die Squeezelite laufen bei mir auf 3 Raspberries, den Autostart von Squeezelite habe ich über Crontab mit @reboot realisiert.

Code: Alles auswählen

squeezelite -o sysdefault:CARD=AUDIO -n Names-des-Lautsprechers -s IP-Adresse-des-Servers
soweit kein Problem, der Autostart klappt soweit. Jedoch fingen dann die oben genannten Probleme an.
Mir ist dann irgendwann aufgefallen, dass die Lautsprecher in den Einstellungen von LMS keine MAC-Adresse haben.

Code: Alles auswählen

MAC-Adresse des Players: 00:00:00:00:00:00
Zum Testen, habe ich mir ein kleines Script erstellt:

Autostart-LAUT.sh

Code: Alles auswählen

Sleep 30
squeezelite -o sysdefault:CARD=AUDIO -n Names-des-Lautsprechers -s IP-Adresse-des-Servers
und das Script wieder mit Crontab @reboot starten lassen.
Jetzt haben die Lautsprecher ihre MAC Adresse und LMS schmeißt diese nicht mehr durcheinander und zeigt auch alle Player an :)

Re: Openhab 3 Rules / Code

Verfasst: 21. Feb 2022 12:01
von udo1toni
Du kannst die MAC auch über die Kommandozeile mitgeben :) Der Parameter heißt passenderweise -m.

Gewöhnlich übernimmt squeezelize beim Start automatisch die MAC der ersten Netzwerk Schnittstelle, aber manchmal gibt es da wohl Probleme. Ich könnte mir z.B. vorstellen, dass der Raspberry sowohl LAN als auch WLAN hat.
Du kannst die MAC frei wählen, aber sie sollte natürlich im eigenen Netz unbedingt eindeutig sein. Es gibt bei MAC so wie bei den IP-Adressen reservierte Bereiche, die nicht vergeben werden (die Hersteller haben festgelegte Adressbereiche, so dass man über einen Teil der MAC gewöhnlich den Hersteller des Chipsatzes festmachen kann). Ich bin jetzt gerade zu faul, das zu googlen.
Da Du nur jeweils eine Instanz von squeezelite laufen lässt, kommst Du ja aber auch gut mit der echten MAC des jeweiligen Systems zurecht. Auf das sleep kannst Du dann verzichten.