Anwesenheit in Rule auswerten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Anwesenheit in Rule auswerten

Beitrag von Boxana »

Hallo,
ich habe eine Gruppe in der über Homkit die Anwesenheit geschickt wird.

Code: Alles auswählen

// Anwesenheit über Homkit
Group:Switch:OR(ON,OFF) gall_at_home "Anwesenheitserkennung" 
// Geräte
Switch Anwesenheit_CH "CH_Anwesenheit" <socket> (gall_at_home) ["Switchable"]
Switch Anwesenheit_RI "RI_Anwesenheit" <socket> (gall_at_home) ["Switchable"]
Switch Anwesenheit_JA "JA_Anwesenheit" <socket> (gall_at_home) ["Switchable"]
Switch Anwesenheit_MA "MA_Anwesenheit" <socket> (gall_at_home) ["Switchable"]

Ich möchte gerne eine Rule die auslöst wenn keiner da ist, also dann wenn "gall_at_home" OFF ist. Das sollte doch OFF sein wenn alle auf OFF schalten oder?

Ich würde es so anfangen:

Code: Alles auswählen

rule "Garagentor Keiner Zuhause"
when
    Item gall_at_home  changed to OFF
    then
Ich habe gelesen ich kann auch die member einer Gruppe mit

Code: Alles auswählen

Group:Number:COUNT(".*")
zählen.
Wie würde ich das den in einer Event Auswertung abfragen?
z.B.

Code: Alles auswählen

Item gall_at_home  changed to "2"
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Anwesenheit in Rule auswerten

Beitrag von peter-pan »

Es gibt hier einige Möglichkeiten. Je nachdem was man machen möchte und wo man ansetzen will.
In deinem Fall mit den Switch-Items könnte ein Gruppen-Item so aussehen:

Code: Alles auswählen

Group:Switch:COUNT("OFF")    gall_at_home "Anwesenheit [%d]"    
was bedeuted, du bekommst alle Items gezählt, die OFF sind.

Dein Beispiel (Group:Switch:OR(ON,OFF)) bringt so lange ON bis alle OFF sind.

Du kannst das Ganze aber auch über "Group.Members" erledigen. Ein paar schöne Beispiele von Udo findest du hier. Dazu gibt es aber sicherlich noch eine ganze Reihe andere Beispiele, je nachdem wasdu per Regel auswerten willst.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: Anwesenheit in Rule auswerten

Beitrag von Boxana »

ich würde gerne eine regel erstellen mit der ich dann in aktion treten möchte wenn keiner da ist.

Ich dachte mit dem count kann ich bei 0 starten darum die frage wie man dieses auswertet.

Ich habe es so versucht:

Code: Alles auswählen

Item gall_at_home  changed to "2"
oder kann ich die das switch item auch so uberwachen?

Code: Alles auswählen

Item gall_at_home  changed to OFF/code]

und dann noch eine frage zu den Beispielen.

[code]logInfo("logCount","eingeschaltet sind {} items",gSwitchgroup.members.filter[m|m.state == ON].size)
was macht "logInfo"
und ich sehe oft das etwas dur eine pipe geschickt wird "m|m.state"
warum macht man das ?
Openhab auf einem Qnap NAS
Gruß
Christian

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

Re: Anwesenheit in Rule auswerten

Beitrag von udo1toni »

Ich kopiere hie mal die ganze Rule hin:

Code: Alles auswählen

rule "log count"
when
    Member of gSwitchgroup changed
then
    logInfo("logCount","eingeschaltet sind {} items",gSwitchgroup.members.filter[m|m.state == ON].size)
    logInfo("logCount","ausgeschaltet sind {} items",gSwitchgroup.members.filter[m|m.state == OFF].size)
    logInfo("logCount","uninitialisiert sind {} items",gSwitchgroup.members.filter[m|m.state == NULL].size)
end
logInfo(Logger,Message) erzeugt einen Logeintrag in openhab.log, mit dem Level INFO, unter der Voraussetzung, dass das Loglevel für den angegebenen Logger auch mindestens INFO ist.
Logger ist der Name des Loggers (wobei das nur ein Teil des Loggernamen ist), Message ist die eigentliche Nachricht.
Die geschweiften Klammen werden als Platzhalter für einen Variablenwert betrachtet, dieser wird dann als weiterer Parameter angegeben.
In der vorliegenden Rule ist das gSwitchgroup.members.filter[].size .size ergibt die Anzahl Einträge der zugehörigen Liste. Die Liste besteht in dem Fall aus den members, die aber gefiltert werden.
Der Filterausdruck m | m.state == ON bedeutet: Nimm jedes Element und lade es ins Objekt m. Prüfe ob die Bedingung m.state == ON zutrifft. Wenn ja, lass das Element in der Liste, wenn nein lösche das Element von der Liste.

Links vom | steht also, wie das Objekt heißen soll, welches rechts vom | verwendet wird. Man kann auch noch links eine zweite Variable angeben (mit Komma getrennt), die enthält dann die Nummer auf der Liste (also bei einer Liste mit 10 Einträgen erhöht sich diese Variable bei jedem Durchlauf um eins, von 0 bis 9).
Das Lambda (das ist der Teil zwischen [ und ]) darf auch mehrere Befehle beinhalten. Beim Filter ist das eher nicht sinnvoll, man könnte aber auch noch mit forEach[] jedes der gefilterten Elemente ausgeben, z.B. so:

Code: Alles auswählen

gSwitchgroup.members.filter[m|m.state == ON].forEach[i, j |
    logInfo("logCount","das {} Element heißt {}",j+1,i.name)
]
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Anwesenheit in Rule auswerten

Beitrag von peter-pan »

Hallo Christian,

mir hat das Beispiel von Udo mit dem logInfo und des darin verpackten "Lambda (Group-Member)" halt so gut gefallen, deshalb habe ich das gewählt. Udo hat dir aber das Ganze, dann ja schön aufgelöst.Es ging ja eigentlich nicht um das "logInfo" sondern um die Group-Members (Lambda)

Für eine Lösung mit einem Group-Item habe ich dir hier mal ein Beispiel aus meinem SetUp zusammen gestellt.

.items

Code: Alles auswählen

Group:Switch:OR(ON,OFF)  gGTags  "Gruppe Abwesenheit [%s]"
Switch                   GTag_1  "G-Tag Peter [%s]"   <switch>    (gGTags)    { channel="mqtt:topic:fritz:presence:GTag_1", autoupdate="true" }
Switch                   GTag_2  "iTAGClaudi [%s]"    <switch>    (gGTags)    { channel="mqtt:topic:fritz:presence:GTag_2", autoupdate="true" }
.rules

Code: Alles auswählen

rule "Info Mail"
 when 
  Item gGTags changed to OFF
 then
  val mailActions = getActions("mail","mail:smtp:tonline-smtp")
      mailActions.sendMail("meine.mail@provider.de", "Abwesenheit", "Alle haben das Haus verlassen")
      logInfo("Mail Info", "E-mail verschickt")
end
In der Regel habe ich als Trigger das Gruppen-Item als Trigger-Item definiert.
Wenn ein Item auf OFF geht, bleibt das Gruppen-Item auf ON. Wenn das zweite Item auf OFF geht und das erste Item OFF ist (also beide OFF sind ;) ), geht auch das Gruppen-Item auf OFF.

Dadurch wird nun der Trigger ausgelöst und eine E-Mail verschickt und eine Info im Logger ausgegeben.

Code: Alles auswählen

2020-03-13 13:58:52.942 [INFO ] [pse.smarthome.model.script.Mail Info] - E-mail verschickt
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: Anwesenheit in Rule auswerten

Beitrag von Boxana »

Ich weiss nicht was der grund ist aber bei mir geht es nicht.

Ich habe eigentlich alles so gemacht wie ihr geschrieben hab und auch schon andere Konstellation probiert aber es geht nicht.
Das kommt im log:

Code: Alles auswählen

 Rule 'Garagentor Keiner Zuhause': An error occurred during the script execution: index=1, size=1
Das ist der Trigger:

Code: Alles auswählen

Item gall_at_home changed to OFF

Das die Gruppe:

Code: Alles auswählen

Group:Switch:OR(ON,OFF)	gall_at_home	"Anwesenheitserkennung"
// Geräte
Switch					Anwesenheit_CHr	"CHr_Anwesend"			<frontdoor>	(gall_at_home)	["Switchable"]
Switch					Anwesenheit_RIk	"RIk_Anwesend"			<frontdoor>	(gall_at_home)	["Switchable"]
Switch					Anwesenheit_JAq	"JAq_Anwesend"			<frontdoor>	(gall_at_home)	["Switchable"]
Switch					Anwesenheit_MAu	"MAu_Anwesendt"			<frontdoor>	(gall_at_home)	["Switchable"]

Wenn ich das so definiere geht es:

Code: Alles auswählen

Item gall_at_home changed 
Aber es Triggert so natürlich auch wenn von alle außer Haus zurück zu einer da :-(
Openhab auf einem Qnap NAS
Gruß
Christian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: Anwesenheit in Rule auswerten

Beitrag von Boxana »

Ich habe den Fehler gefunden aber hätte nicht erwartet dass das den Fehler auslöst,

Code: Alles auswählen

rule "Garagentor Keiner Zuhause"
when
    Item gall_at_home changed
    then
    

    if (Garagen_Tor_oben.state == ON )  {
    GA_To_zu_Stop.sendCommand(ON)
    logInfo("Alle Abwesend, Garage wird gesclossen.")
    }
  
end

Code: Alles auswählen

logInfo("Alle Abwesend, Garage wird gesclossen.")
war es.
Openhab auf einem Qnap NAS
Gruß
Christian

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

Re: Anwesenheit in Rule auswerten

Beitrag von udo1toni »

Der Befehl logInfo(String,String) verlangt zwingend exakt zwei Parameter. Dabei ist der erste Parameter der letzte Teil der Logger ID, der zweite String ist die geloggte Nachricht.
Also statt

Code: Alles auswählen

logInfo("Alle Abwesend, Garage wird geschlossen.")
einfach

Code: Alles auswählen

logInfo("away","Alle Abwesend, Garage wird geschlossen.")
Das ergibt dann die Logger ID org.openhab.model.script.away.

Der Witz daran ist, dass man jederzeit zur Laufzeit von openHAB diese Zeile inaktiv schalten kann, ohne weitere Vorkehrungen, einfach anhand der Logger ID. Es gibt als logBefehle in der Rules DSL logDebug(), logInfo(), logWarn und logError() (in aufsteigender Reihenfolge; Standard ist der logLevel INFO, so dass logDebug() nicht ausgeführt wird. Setzt man den logLevel dann auf DEBUG, werden diese Meldungen auch ausgegeben, in der anderen Richtung kann man das logLevel auf WARN, ERROR oder gar OFF setzen, um entsprechend weniger Meldungen im Log zu sehen zu bekommen. Deshalb ist es sinnvoll, die Logger ID per Rule oder zumindest per Funktion zu definieren (z.B. eine ID für alle Zeitsteuerungen).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Anwesenheit in Rule auswerten

Beitrag von peter-pan »

Boxana hat geschrieben: 13. Mär 2020 18:02 Wenn ich das so definiere geht es:

Item gall_at_home changed

Aber es Triggert so natürlich auch wenn von alle außer Haus zurück zu einer da
Wenn du den Trigger (gall_at_home) ohne Bedingung (ON/OFF) benutzt, dann wird die Regel natürlich immer gezündet, wenn sich der Status verändert. D.h., wenn alle weg sind geht der Status auf OFF und die Regel wird getriggert. Wenn einer wieder kommt,geht der Status natürlich wieder auf ON und die Regel wird wieder getriggert.

Deshalb musst du explizit auf OFF prüfen, also "Item gall_at_home changed to OFF", damit die Regel auch wirklich nur triggert, wenn alle weg sind.

Oder du kannst, das ganz auch in den Script-Block verlagern und noch eine If-Bedingung vor/um deine jetzige Bedingung herumbauen.

Aber so wie ich deine Regel verstehe, willst du, dass das Garagentor automatisch schliesst, wenn der letzte das Haus verlassen hat und es noch offen ist. Aber Achtung!! Bitte den zeitlichen Versatz zwischen Haus verlassen und Garage schliessen berücksichtigen, nicht dass dir das Garagentor während der Ausfahrt auf's Dach fällt :o ;)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
Boxana
Beiträge: 125
Registriert: 19. Feb 2020 16:24
Answers: 0

Re: Anwesenheit in Rule auswerten

Beitrag von Boxana »

Also danke Udo für die Erläuterung. Das wird noch dauern bis ich das alles beherrsche, da such ich lieber Fehler wie z.B. Java und Zeit. :-)
Aber ich hoffe ich darf noch einige male fragen.



Hallo Peter P.,
auch ein dank an dich für deine Beispiele 👍
Ich kläre die Abwesenheit mit dem Apple Homkit Automationen und die sind um einiges zuverlässiger wie die Fritzbox Geschichte. Die Iphone‘e loggen sich zwischendurch mal aus was mir mit Homkit noch nicht passiert ist. außerdem ist es nicht wlan abhängig sondern gps gestützt und so ein radius von ca. 100m um den Mittelpunkt vom Haus hat.
Wenn dann doch mal die Garage zu geht, ist ja immer noch eine Sicherung für unbeaufsichtigtes Schließen eingebaut. 😂
Openhab auf einem Qnap NAS
Gruß
Christian

Antworten