Frage zum Bewegungsmelder HmIP-SMI

Moderator: seppy

Antworten
Orakel
Beiträge: 24
Registriert: 30. Jul 2018 05:56

Frage zum Bewegungsmelder HmIP-SMI

Beitrag von Orakel »

Hallo zusammen,
ich versuche gerade den HomematicIP Bewegungsmelder HmIP-SMI mit openhab2 zu konfigurieren.
Meine CCU2 hat ihn auch ohne Probleme erkannt und in openhab2 wurde er auch anstandslos hinzugefügt.
Ich habe schon einen Bewegungsmelder von Homematic ( HM-Sen-MDIR-O-2) in Betrieb.
Mein Problem ist nun das der IP BWM jedes mal die Steckdose ein und aus schalten wenn man an ihm vorbei geht. Ich möchte das aber erst ab einem bestimmten Helligkeitswert.
Der Helligkeitswert wird mir auch im BasicUI angezeigt und auch das eine Bewegung erkannt wird.

Die Rule für den HomematicIP BWM sieht wie folgt aus:

Code: Alles auswählen

rule "React on Begungsmelder Innen (BegeungsmelderInnen) change/update"
when
    Item BewegungsmelderInnenBewegung received update
then
    if(BewegungsmelderInnenBewegung.state == ON)
    
    {
    sendCommand(TP_L1_Switch, ON)
    logInfo("Helligkeit2", "Helligkeitswert"+BewegungsmelderInnenIllumination.state)
    }

    else
    sendCommand(TP_L1_Switch, OFF)

end
bei dieser Regel schaltet der BWM jedes mal die TPLinkSteckdose1 und zeigt mir im LogViewer den aktuellen Helligkeitswert

ändere ich den Code in

Code: Alles auswählen

rule "React on Begungsmelder Innen (BegeungsmelderInnen) change/update"
when
    Item BewegungsmelderInnenBewegung received update
then
    if(BewegungsmelderInnenIllumination.state < 30 && BewegungsmelderInnenBewegung.state == ON)
    
    {
    sendCommand(TP_L1_Switch, ON)
    logInfo("Helligkeit2", "Helligkeitswert"+BewegungsmelderInnenIllumination.state)
    }

    else
    sendCommand(TP_L1_Switch, OFF)

end
funktioniert es plötzlich nicht mehr, bzw es wird immer nur der TP_L1_Switch, OFF befehl im LogViewer angezeigt, auch die logInfo wird nicht mehr im LogViewer angegeben. Diese Regel funktioniert aber bei dem Homematic Bewegungsmelder aussen einwandfrei, dort wird die Lampe erst geschaltet wenn der Wert der Helligkeit kleiner als der angegebene Wert ist.

hat jemand eine Idee woran es liegen könnte ?

gruß
Orakel

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

Re: Frage zum Bewegungsmelder HmIP-SMI

Beitrag von udo1toni »

Was für ein Itemtyp ist BewegungsmelderInnenIllumination?
Du könntest übrigens auf "changed to ON" triggern lassen, damit sparst Du Dir das erste if bzw. brauchst Du dann nur noch die Helligkeit abzufragen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Orakel
Beiträge: 24
Registriert: 30. Jul 2018 05:56

Re: Frage zum Bewegungsmelder HmIP-SMI

Beitrag von Orakel »

hallo und danke für deine antwort,
also meine items sehen wie folgt aus :

Code: Alles auswählen

//Bewegungsmelder Flur Innen

Number BewegungsmelderInnen "Signalstärke [%.1f dB]" <network> {channel="homematic:HmIP-SMI:ccu:00091709AC007D:0#SIGNAL_STRENGTH"}
Number BewegungsmelderInnenIllumination "Helligkeit" {channel="homematic:HmIP-SMI:ccu:00091709AC007D:1#ILLUMINATION"}
Switch BewegungsmelderInnenBewegung "Bewegung [MAP(bewegmeldmap.map):%s]" {channel="homematic:HmIP-SMI:ccu:00091709AC007D:1#MOTION"}
Switch BewegungsmelderInnenLowBattery "Batterie" {channel="homematic:HmIP-SMI:ccu:00091709AC007D:0#LOW_BAT"}
String BewegungsmelderInnenBatteryTyp "BatterieTyp" {channel="homematic:HmIP-SMI:ccu:00091709AC007D:0#BATTERY_TYPE"}
Switch BewegungsmelderInnenMotionDetectionActive "Bewegungserkennung aktiv" {channel="homematic:HmIP-SMI:ccu:00091709AC007D:1#MOTION_DETECTION_ACTIVE"}
Die Illumination ist ein Number Item und gibt mir einen Wert für die Helligkeit aus.
In der Sitemap wir z.b. 20 angezeigt.
Das MotionDetectionActive item ist und Switch, ist dieser auf OFF, wird keine Bewegung vom Bewegungsmelder erkannt und somit auch nichts geschaltet. Ist das MotionDetectionActive item ON erkennt der Bewegungsmelder die Bewegung egal bei welcher Helligkeit.
Meine Idee war nun die MotionDetectionActive durch die Illumination einzuschalten und zwar wenn der Wert <10 ist und bei einem Wert >10 wieder auszuschalten. Leider Funktioniert das mit den Regeln aus meinem ersten Posting nicht.
Der Wert der Helligkeit(illumination) wird aber im LogView bei veränderungen und auch beim infoLog bei ausführung der Regel angezeigt.
habe nunmal versucht das ganze in 2 getrennte Regeln zu packen

Code: Alles auswählen

rule "motiondetection EIN"

when
  Item BewegungsmelderInnenIllumination received update

  then
  if(BewegungsmelderInnenIllumination.state.toString < 10)
  {
      logInfo("Helligkeit2", "Helligkeitswert zu klein " + BewegungsmelderInnenIllumination.state.ToString)
      sendCommand(BewegungsmelderInnenMotionDetectionActive, ON)
  }
    
  end


rule "motiondetection AUS"

when 
Item BewegungsmelderInnenIllumination received update
then 
if(BewegungsmelderInnenIllumination.state.toString > 10)
{
  logInfo("Helligkeit3","Helligkeit ist größer als " + BewegungsmelderInnenIllumination.state.ToString)
  sendCommand(BewegungsmelderInnenMotionDetectionActive, OFF)
}
end
aber bisher hatte ich noch keinen erfolg

gruß
Orakel

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

Re: Frage zum Bewegungsmelder HmIP-SMI

Beitrag von udo1toni »

Code: Alles auswählen

if(BewegungsmelderInnenIllumination.state.toString < 10)
Seit wann kann ein String kleiner (oder größer) als ein Zahlenwert sein?

Eine hoffentlich funktionierende Variante sollte so aussehen:

Code: Alles auswählen

rule "Bewegung erkannt"
when
    Item BewegungsmelderInnenBewegung changed
then
    if(BewegungsmelderInnenBewegung.state == ON)
        if((BewegungsmelderInnenIllumination.state as Number) < 10)
            TP_L1_Switch.sendCommand(ON)
    else
        if(TP_L1_Switch.state == ON)
            TP_L1_Switch.sendCommand(OFF)
end
Das Ausschalten erfolgt immer, wenn keine Bewegung erkannt wird. Das Einschalten erfolgt, sobald Bewegung erkannt wird und der numerische Wert der Helligkeit kleiner 10 ist.

Allerdings könnte es sein, dass Du nicht glücklich mit der Lösung bist, denn wenn kurzzeitig keine Bewegung erkannt wird, schaltet das Licht unmittelbar ab. Deshalb sieht man normalerweise einen Timeout vor, also z.B.: "Schalte bei Bewegungserkennung das Licht ein, falls die Helligkeit untere 10 ist. Schalte das Licht aus, falls eine Minute keine Bewegung erkannt wurde oder die Helligkeit zwischenzeitlich über 20 gestiegen ist." Das sähe dann so aus:

Code: Alles auswählen

var Timer tMotion = null

rule "Bewegung erkannt"
when 
    Item BewegungsmelderInnenBewegung changed or                          // Bewegung Anfang oder Ende bzw.
    Item BewegungsmelderInnenIllumination changed                         // Helligkeit geändert
then
    val Number nBright = BewegungsmelderInnenIllumination.state as Number
    if(BewegungsmelderInnenBewegung.state == ON && nBright < 10) {        // Bewegung und zu dunkel
        if(TP_L1_Switch.state != ON)                                      // Licht noch aus
            TP_L1_Switch.sendCommand(ON)                                  // Licht an!
        if(tMotion === null)                                              // Timer noch nicht initialisiert
            tMotion = createTimer(now.plusMinutes(10),[|                  // Falls 10 Minuten keine Meldung vom Bewegungsmelder kommt
                if(TP_L1_Switch.state != OFF)                             // Falls Licht an
                    TP_L1_Switch.sendCommand(OFF)                         // Licht aus!
                tMotion === null                                          // Timer deinitialisieren
            ])
        else                                                              // Timer läuft schon
            tMotion.reschedule(now.plusMinutes(10))                       // Timerablauf neu setzen
    } else if(BewegungsmelderInnenBewegung.state == ON && nBright > 20)   // Bewegung aber zu hell
        tMotion.reschedule(now.plusSeconds(1))                            // Timerablauf neu setzen
    else if(BewegungsmelderInnenBewegung.state == OFF)                    // Keine Bewegung
        tMotion.reschedule(now.plusMinutes(1))                            // Timerablauf neu setzen
end
Die Theorie dazu: Die Rule löst jedesmal aus, wenn es eine Helligkeitsänderung oder eine Zustandsänderung der Bewegung gibt.
Wenn Bewegung erkannt wurde und die Helligkeit unterschritten ist, schaltet das Licht ein, falls noch nicht geschehen. Anschließend wird geprüft, ob der Timer schon existiert. Falls nicht, wird er mit 10 Minuten Timeout angelegt. Falls also der Bewegungsmelder 10 Minuten nichts von sich gibt, schaltet das Licht aus.
Falls der Timer schon existiert, wird er einfach nach hinten geschoben, denn der Melder hat ja Bewegung erkannt.
Falls zwar Bewegung erkannt wurde, die Helligkeit aber inzwischen gestiegen ist, wird das Licht nach einer Sekunde abgeschaltet (die zeit ist so kurz gewählt, weil ich nicht weiß, wie häufig der Helligkeitssensor Änderungen sendet).
Falls Keine Bewegung erkannt wurde, wird der Timeout auf eine Minute herabgesetzt.

Das Hauptproblem bei solchen Logiken ist, alle Eventualitäten zu erfassen und passend zu reagieren, also: Was soll passieren, falls
  • der Bewegungsmelder keine Telegramme mehr sendet?
  • die Helligkeit sinkt, aber bereits Bewegung detektiert wurde?
  • Bewegung detektiert wurde, aber die Helligkeit gestiegen ist?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Orakel
Beiträge: 24
Registriert: 30. Jul 2018 05:56

Re: Frage zum Bewegungsmelder HmIP-SMI

Beitrag von Orakel »

hallo udo1toni,
danke für deine mühen, werde das ganze heute abend mal austesten.
bin gestern noch erfolgreich gewesen (hoffe ich zu mindest) muss noch abwarten ob der Switch heute bei helligkeit wieder ausgeht.
meine regeln sehen jetzt wie folgt aus, geht bestimmt auch einfacher aber so hab ich es immerhin hinbekommen

Code: Alles auswählen

rule "motiondetection EIN"

when
  Item BewegungsmelderInnenIllumination received update

  then
  if((BewegungsmelderInnenIllumination.state as Number)< 10)
  {
      logInfo("Helligkeit2", "Helligkeitswert zu klein " + BewegungsmelderInnenIllumination.state)
      sendCommand(BewegungsmelderInnenMotionDetectionActive, ON)
  }
    
  end


rule "motiondetection AUS"

when 
Item BewegungsmelderInnenIllumination received update
then 
if((BewegungsmelderInnenIllumination.state as Number)> 10)
{
  logInfo("Helligkeit3","Helligkeit ist größer als " + BewegungsmelderInnenIllumination.state)
  sendCommand(BewegungsmelderInnenMotionDetectionActive, OFF)
}
end

Code: Alles auswählen

rule "React on Begungsmelder Innen (BegeungsmelderInnen) change/update"
when
    Item BewegungsmelderInnenBewegung received update
then
    if(BewegungsmelderInnenMotionDetectionActive.state == ON && BewegungsmelderInnenBewegung.state == ON)
    
    {
    sendCommand(TP_L1_Switch, ON)
    logInfo("HelligkeitInnen", "Helligkeitswert"+BewegungsmelderInnenIllumination.state)
    }

    else
    sendCommand(TP_L1_Switch, OFF)

end
gruß
Orakel

bugfix
Beiträge: 1
Registriert: 22. Dez 2020 01:34

Re: Frage zum Bewegungsmelder HmIP-SMI

Beitrag von bugfix »

Hallo Orakel,
hier noch ein (offensichtlich später) Nachbrenner zu deinem Problem.
Ab der HmIP-SMI Firmware Version 1.4.8 ist deine gewünschte Funktionalität von Hause aus in den HmIP-SMI Geräten integriert.
Du brauchst also nur noch in der Geräte Konfiguration (web GUI) deiner CCU rein und dort die Parameter direkt einstellen.
So entlastest du deinen CCU Server/Service und den openHAB Server/Service um ein Vielfaches!

Mit freundlichen Grüßen

bugfix

Antworten