Hauptmenü

Garagentorsteuerung

Begonnen von crazy_penguin, 06 Januar 2015, 23:06:30

Vorheriges Thema - Nächstes Thema

crazy_penguin

Hallo zusammen,

ich habe eine etwas umfangreiche Frage zu einem Problem.

Ich frage mittels eines HM-SCI-3-FM und zwei Reedkontakten den Zustand meines Garagentors ab.

Ich habe zwei virtuelle Schalter definiert (Garage_auf & Garage_zu) um definitiv die Garage zu schließen oder zu öffnen.
Da das Garagentor Impuls gesteuert ist (nur eine Taste), muss ich diesen Umweg gehen.
Im definierten Zustand ist das auch kein Problem und funktioniert ohne Probleme. Mir fehlt aber der kleine Baustein, wenn das Garagentor in einem undefinierten Zustand befindet. Dann kann es ein, dass wenn der Taster Ausgelöst wird das Tor nicht zu sondern auf fährt.

Ich habe versucht den Taster auszulösen und mit sleep die entsprechende Zeit zu warten, die das Tor benötigt, um zu zufahren. Allerdings aktualisieren sich die Zustände des HM-SCI-3-FM erst dann wenn das Skript beendet ist. Sprich diese Option fällt leider aus.

Wie kann ich prüfen?
Kann ich die Funktion nochmals aufrufen und haben sich die Zustände dann geändert?

Garage_zu2 {
  if ((Value("Garage_Tor_zu") eq "closed") && (Value("Garage_Tor_auf") eq "open")) {
      sendMeJabberMessage("Garage2 ist bereits zu %") ;
  } elsif ((Value("Garage_Tor_zu") eq "closed") && (Value("Garage_Tor_auf") eq "closed")) {
      sendMeJabberMessage("Garage2: Status unbekannt!!!") ;
  } elsif ((Value("Garage_Tor_zu") eq "open") && (Value("Garage_Tor_auf") eq "closed")) {
      sendMeJabberMessage("Garage zu2 %") ;
      fhem("set Taster_Garage off") ;
  } else {
      <fehlende Funktion>
  };
  fhem("setstate Garage_zu2 off")
}

Vielen Dank schon mal Vorab.


crazy_penguin

Sorry ich habe die Definition falsch dargestellt.

Ich habe bereits weiter experimentiert. Leider ohne Erfolg.
By the way "Taster_Garage" wird automatisch nach 1s auf off gesetzt.

define Garage_zu2 FS20 11114444 1f
attr Garage_zu2 dummy 6
attr Garage_zu2 group Schalter
attr Garage_zu2 room Garage


define act_on_Garage_zu2 notify Garage_zu2:on {\
  fhem("setstate Garage_zu2 off");;\
  if ((Value("Garage_Tor_zu") eq "closed") && (Value("Garage_Tor_auf") eq "open")) {\
      sendMeJabberMessage("Garage2 ist bereits zu %") ;;\
  } elsif ((Value("Garage_Tor_zu") eq "closed") && (Value("Garage_Tor_auf") eq "closed")) {\
      sendMeJabberMessage("Garage2: Status unbekannt!!!") ;;\
  } elsif ((Value("Garage_Tor_zu") eq "open") && (Value("Garage_Tor_auf") eq "closed")) {\
      sendMeJabberMessage("Garage zu2 %") ;;\
      fhem("set Taster_Garage on") ;;\
  } else {\
      sendMeJabberMessage("Garage zu2 else %") ;;\
      fhem("set Taster_Garage on") ;;\
      sleep 20;;\
      fhem("set Garage_zu2 on");;\
  };;\
}


frank

hallo,

wie wäre es mit folgendem ablauf:

du definierst für deine dummys 2 weitere zustände. "set_auf" und "set_zu". wenn du nun über deinen dummy den befehl "zu" absetzt, setzt dein dummy-notify den befehl zum schliessen des tors und den dummyzustand "set_zu".

ein weiteres notify kontrolliert den zustand des tores. natürlich must du die events des hm-sci mit event-on-change-reading bearbeiten, damit es nur bei änderung das notify triggert. ausserdem solltest du im notify auf die übergebenen events des sci reagieren mit zb $evtpart1 und nicht über eine abfrage mit readingsval() oder value(). im notify überprüfst du dann das event der torlage mit dem dummyzustand. wenn also event=zu und dummyzustand=set_zu, kann nun der dummyzustand auf "zu" gesetzt werden. wenn das event=auf ist, musst du das tor halt nochmal schalten.

nur mal so als prinzip.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

AK-868

Ich verstehe dein Problem auch nicht so ganz. Warum sollte dein Tor stehen bleiben?
Das beide Kontakte closed senden ist doch auch unwahrscheinlich weil vermutlich technisch nicht möglich.

Ich hab nen Dummy erstellt. Ich überwache mit einem Reedkontakt. Ergo ich weiß nicht ob das Tor ganz auf ist, was mir auch nicht wichtig ist weil beim reinfahren sehe ich ob ich da durch passe oder nicht. Ok bei mir könnte man noch eine Prüfung einbauen ob das Tor schon auf ist und dann nicht wieder zufahren. Aber naja ich sehe es ja im State. Mann könnte jetzt noch eine Abfrage nach Zeit x einbauen die Prüft ob das Tor zu ist und der Dummy auf Schliessen steht nochmal das Tor zu triggern.

Dummy

Garagentor WebCmd Öffnen Schliessen

notify_Garage

Garagentor:(Öffnen|Schliessen) {
fhem ("set tast_Garagentor on-for-timer 3");
}

notify_Garage_openclosed

sens_Tor:(open|closed) {
fhem ("setstate Garagentor %");
}
Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


crazy_penguin

Hallo ihr zwei,

Danke schon mal für die Antworten. Es kommt zwar nicht vor, dass das Tor auf einmal stehen bleib oder ahnliches. Ich möchte sicherstellen, dass das Tor definitiv mit einem Tasten druck geschlossen wird.

Ich habe zwar das eine oder andere mit FHEM realisiert aber leider noch keine komplizierten Abläufe oder Verkettungen.

@ AK-868: Wie könnte ich eine solche zeitgesteuert abfrage einbaurn?

@frank: Wie gestellte ich eine Abfrage die nicht über readingsval() oder value() funktioniert? Kannst du mir dazu ein Bsp. geben?

AK-868

Hi,

ich hab hier ein Bsp. von woanders her jetzt müsstest du noch nen readignsval dort einbauen. Musst mal experimentieren ob das auch in der klammer läuft.

Das hier funktioniert:
fhem("define verzoegert_tornochauf at +00:00:34 set XXX on");;\

das hier mal probieren. Ka ob das so richtig ist ;)

fhem("define verzoegert_TV_an at +00:00:34 if(ReadingsVal("TV", "state", "Aus") eq "on") {set garagenschalter on-for-timer 1});;\

grüße
Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


Pfriemler

Ich habe eine ähnliche Problematik, nutze zur Zustandsüberwachung bislang einen Neigungssensor. Da der aber Schwierigkeiten hat, aus der Blechgarage zum HMLAN zu kommen, wird's wohl bald ein SCI-3 mit Torendlagenschaltern werden.

Ich habe einen Dummy GaragentorZustand, der die Zustände open, closed, move und moving kennt.
Die Zustände Open und Closed werden durch den Neigungssensor gesetzt, bzw. durch den SCI-3
Ein Notify überwacht den Zustand auf "Move" und setzt bei Eintreffen einen 1-s-Steuerimpuls über einen Batterieaktor an den Antrieb ab
Ein weiteres Notify überwacht den Zustand dieses Batterieaktors - wird dieser "on", dann wird GaragentorZustand auf "moving" gesetzt. Das kann bei mir auch lokal durch Betätigen eines (herausgeführten) Tasters an der Garagenwand geschehen.
Diese etwas komplizierte Kette hat praktische Vorteile: Der GaragentorZustand bzw. sein Icon kann auf der Weboberfläche per "move" eine Bewegung des Garagentors auslösen. Wenn FHEM den Aktor nicht erreicht und dieser dadurch nicht auslöst, bleibt der Zustand auf "move" stehen - es gibt also ein Problem. Dann kann man durch einen neuen Tipps versuchen erneut zu triggern, z.B.
FHEM erfährt so auch, dass das Garagentor "manuell" bewegt wurde. Auch hier müssen die Endlagenschalter den Zustand wieder "klären" auf "open" bzw. "closed".

Ob das nach einer bestimmten Zeit auch eintritt, könnte man mit einem Watchdog überwachen und ggf. eine Warnung absetzen. Das kann ja passieren, wenn das Tor durch ein Hindernis gestoppt wurde.

Dann gibt es noch einen Dummy GaragentorWunsch, der auf "open" oder "close" gesetzt werden kann. Notifys mit Fallabfragen lösen nun einen Fahrvorgang nur aus, wenn sich das Tor nicht in den Endlagen "closed" bzw. "open" befindet, anderenfalls wird der Dummy auf "WasNotClosed" bzw. "...Open" gesetzt ... nur als Info.

Man könnte das noch erweitern, indem man die letzte Bewegung irgendwie zwischenmerkt, um so auch aus Zwischenzuständen eine Bewegung zu erreichen. Meist liegt bei unvollständigen Fahrvorgängen aber ein lokales Problem vor, das man besser in Augenschein nimmt und den Zustand dann gezielt klärt.

Externe Taster oder FHEM-interne Prozesse müssen nun nur den Dummy GaragentorWunsch setzen - den Rest regelt die "Zustandsmaschine".
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

frank

ZitatWie gestellte ich eine Abfrage die nicht über readingsval() oder value() funktioniert? Kannst du mir dazu ein Bsp. geben?
hier mal ein beispiel. das notify wird von einem dummy "SwitchES01_bootModus" getriggert. der kann im state "on, off, auto" melden. im eventmonitor sieht ein on-event so aus:

2015-01-08 11:02:53.691 dummy SwitchES01_bootModus on

wenn das notify getriggert/aufgerufen wird, enthält die variable $EVENT => "on". das wird dann mit if geprüft. siehe commandref.

define n_SwitchES_bootModus notify SwitchES01_bootModus {\
  if(OldValue($NAME) ne $EVENT) {\
    my $old_cndTxDecAbove = ReadingsVal("SwitchES01_SenU","R-cndTxDecAbove",0);;\
    my $new_cndTxDecAbove;;\
    if($EVENT eq "off") {\
      $new_cndTxDecAbove = 0;;\
    }\
    elsif($EVENT eq "on") {\
      $new_cndTxDecAbove = 200;;\
    }\
    elsif($EVENT eq "auto") {\
      $new_cndTxDecAbove = (ReadingsVal("SwitchES01_Sw","level",0) == 100)?200:0;;\
    }\
    if($new_cndTxDecAbove != $old_cndTxDecAbove) {\
      fhem("set SwitchES01_SenU regSet cndTxDecAbove $new_cndTxDecAbove");;\
      fhem("set SwitchES01_SenU getConfig");;\
      my $modus = $new_cndTxDecAbove?"ON":"OFF";;\
      Log 1,"----- BOOTMODE ----- set mode on SwitchES01 to $modus";;\
    }\
  }\
}
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

crazy_penguin

Tach Post!

Die Idee mit dem Watchdog gefällt mir.

Heute Abend werde ich mich mal daran setzten.

Vom Prinzip her, müsste ich eigentlich nur einen Watchdog definieren und diese nur durch mein Notify, wenn das Ereignis "open&open" eintritt, in den Zustand defined verseten. Der Schaut ob das Tor zu ist, wenn nicht löst dieser einfach nochmal aus.

Dadurch sollte auch sicher gestellt sein das ich nicht in eine Schleife laufe.

Ich werde berichten.

crazy_penguin

Hallo zusammen,

das mit dem Dummy gefällt mir gut. Ich habe das gleich mit eingebaut.
Mit dem Watchdog muss ich nochmal sehen woran es hapert.
Aber hier schon mal vor ab mein Zwischenstand.



define Garage_zu2 FS20 11114444 1f
attr Garage_zu2 devStateIcon .*:control_arrow_down:on
attr Garage_zu2 dummy 6
attr Garage_zu2 group Schalter
attr Garage_zu2 icon fts_garage_door_100
attr Garage_zu2 room Garage



define act_on_Garage_zu2 notify Garage_zu2:on {\
  my $s_status_garagen_tor = Value("Garagentor_Status");;\
  fhem("setstate Garage_zu2 off");;\
  if ( $s_status_garagen_tor eq "closed" ) {\
      sendMeJabberMessage("Garagentor ist bereits zu!") ;;\
      fhem("setstate WD_Garage_zu2 defined") ;;\
  } elsif ( $s_status_garagen_tor eq "error" ) {\
      sendMeJabberMessage("Garagentor: Status undefiniert!!!") ;;\
      fhem("setstate WD_Garage_zu2 defined") ;;\
  } elsif ( $s_status_garagen_tor eq "open" ) {\
      sendMeJabberMessage("Garagentor wird geschlossen.") ;;\
      fhem("set Taster_Garage on") ;;\
  } else {\
      sendMeJabberMessage("Garagentor wird bewegt") ;;\
      fhem("set Taster_Garage on") ;;\
  };;\
}
attr act_on_Garage_zu2 room Garage,System


define WD_Garage_zu2 watchdog Garage_zu2:on 00:00:30 Garage_Tor_zu:closed {\
  my $s_status_garagen_tor = Value("Garagentor_Status");;\
  if ($s_status_garagen_tor eq "open") {\
      sendMeJabberMessage("Garagentor wird geschlossen.") ;;\
      fhem("set Taster_Garage on") ;;\
  } elsif ($s_status_garagen_tor eq "closed") {\
      fhem("") ;;\
  } else {\
      sendMeJabberMessage("Garagentor kontrollieren!!!") ;;\
  };;\
  fhem("setstate WD_Garage_zu2 defined") ;;\
}\

attr WD_Garage_zu2 room Garage
define Garagentor_Status dummy
attr Garagentor_Status devStateIcon open:fts_garage_door_10 closed:fts_garage_door_100 move:fts_garage_door_50 error:control_x
attr Garagentor_Status group Status
attr Garagentor_Status icon fts_garage
attr Garagentor_Status room Garage
attr Garagentor_Status setList State:open,closed,move,error


define act_on_Garage_Tor notify Garage_Tor_(zu|auf):(open|closed) {\
  my $s_status_garage_zu = Value("Garage_Tor_zu");;\
  my $s_status_garage_auf = Value("Garage_Tor_auf");;\
  if ( ($s_status_garage_zu eq "closed") && ($s_status_garage_auf eq "open") ) {\
      fhem("set Garagentor_Status closed") ;;\
  } elsif ( ($s_status_garage_zu eq "open") && ($s_status_garage_auf eq "open") ) {\
      fhem("set Garagentor_Status move") ;;\
  } elsif ( ($s_status_garage_zu eq "open") && ($s_status_garage_auf eq "closed") ) {\
      fhem("set Garagentor_Status open") ;;\
  } else {\
      fhem("set Garagentor_Status error") ;;\
  };;\
}
attr act_on_Garage_Tor room Garage