FHEM Forum

FHEM => Automatisierung => Thema gestartet von: h-man-kl am 14 April 2016, 08:37:47

Titel: Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 14 April 2016, 08:37:47
Hallo zusammen,
inzwischen hb ich es hinbekommen ein paar Makros aus meiner alten FHZ Steuerung nach fhem zu übersetzen und hab nun ein Konstrukt, was a) nicht so ganz funktioniert und b) stelle ich mir die Frage ob das auch einfacher geht...
Ziel: In Abhängigkeit vom Dämmerungssensor soll von einem Bewegungsmelder das Treppenlicht geschaltet werden. Es soll immer langsam hochgedimmt werden, dann für eine gewisse Zeit an sein und dann wieder langsam runtergedimmt werden. (alles mit FS20 Komponenten)
Je nachdem wie spät es ist soll dann noch die Helligkeit unterschiedlich sein.

Das unten angehängte Konstrukt dimmt zwar "Abends" langsam hoch, aber es wird nicht runtergedimmt sondern direkt ausgeschaltet. Die Variante "Nachts" funktioiniert garnicht :-(

Könnt ihr mir sagen ob ich das so überhaupt richtig durchdacht habe oder ob das Codetechnisch auch einfacher / komfortabler geht....
Der inhalt meines notify "n_TreppenlichtEG" sieht so aus:

FS20.Bewegungsmelder.Treppenhaus.S {
if (Value ("FS20.Daemmerung.S1") eq "off") { goto ende; };
if ($hour >=21 && $hour <=7) { goto dimNachts; };
if ($hour >=8 && $hour <21) { goto dimAbends; };
goto ende;

dimNachts:
  fhem ("set FS20.DimmerTreppenhaus.E dim30% 3");
  fhem("sleep 45; set FS20.DimmerTreppenhaus.E dim6% 10");
  fhem("sleep 60; set FS20.DimmerTreppenhaus.E off");
goto ende;
 
dimAbends:
  fhem ("set FS20.DimmerTreppenhaus.E dim50% 3");
  fhem("sleep 60; set FS20.DimmerTreppenhaus.E dim6% 10");
  fhem("sleep 60; set FS20.DimmerTreppenhaus.E off");
goto ende;
 
ende:
}


VIELEN DANK!
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: justme1968 am 14 April 2016, 10:36:32
ich meine es gibt kein dim6% kommando. es muss dim06% heissen. und es gibt auch keinen zweiten parameter nach der dim stufe.

es gibt keine zahl die gleichzeitig größer gleich 21 und kleiner gleich 7 ist. deshalb geht nachts nicht. an dieser stelle brauchst du ein ||.

einzelne fhem(...) aufrufe sind unabhängig voneinander. d.h. bei:   fhem("sleep 60; set FS20.DimmerTreppenhaus.E dim6% 10");
  fhem("sleep 60; set FS20.DimmerTreppenhaus.E off");
laufen beide timer gleichzeitig los und es nach ablauf der 60 sekunden wird direkt nach dem dim kommando fast gleichzeitig auch off gesendet.

wenn wenn du eine sequenz von kommandos mit diversen sleep dazwischen abarbeiten möchtest musst du alles in den gleichen fhem(...) aufruf stecken. also etwa so:fhem("set FS20.DimmerTreppenhaus.E dim50%; sleep 60; set FS20.DimmerTreppenhaus.E dim06%; sleep 60; set FS20.DimmerTreppenhaus.E off;");

ob die goto wirklich lesbarer sind als den code direkt in ein if/elsif/else einzubauen liegt vermutlich sehr im Auge des Betrachters:if( Value("FS20.Daemmerung.S1") eq "off" ) {
  #mach nichts
} elsif( $hour >=21 || $hour <=7 ) { #nachts
fhem(...);
} else { #sonst
  fhem(...);
}


gruss
  andre
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: h-man-kl am 14 April 2016, 11:00:46
Ich liebe dieses Forum!

dim06% ist natürlich richtig. Einen zweiten Parameter für die Zeit in der das passieren soll gibt es aber tatsächlich. Habe ich aus dem beispiel für ein Wakeuplight hier aus dem Forum. Das funktioniert ja auch beim hochdimmen.
Das mit den || wusste ich nicht und wird un umgesetzt.
So langsam verstehe ich auch endlich wie die Befehle abgearbeitet werden, wenn natürlich alle Befehle gleichzeitig laufen, dann muss das in eine Zeile hintereinander....

Ich werde es umsetzen und berichten!
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: h-man-kl am 14 April 2016, 11:50:15
Sodele...
:-) Läuft!

sowohl in deiner Variante als auch in miener goto-Variante und mit dem zweiten Parameter beim Dimmer! so wollte ich das!

FS20.Bewegungsmelder.Treppenhaus.S {
if (Value ("FS20.Daemmerung.S1") eq "off") { goto ende; };
if ($hour >=21 || $hour <=7) { goto dimNachts; };
if ($hour >=8 || $hour <=20) { goto dimAbends; };
goto ende;

dimNachts:
  fhem ("set FS20.DimmerTreppenhaus.E dim31% 3; sleep 45; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");
goto ende;
 
dimAbends:
  fhem("set FS20.DimmerTreppenhaus.E dim50% 3; sleep 60; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");
goto ende;
 
ende:
}



nochmals Danke!!! - ich hab bestimmt noch mehr Probleme ;-)

Gruß H-man
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: justme1968 am 14 April 2016, 21:53:08
schön. nur noch eine sache: die dritte bedingung musst du mit && (und) schreiben. nur die zweite mit || (oder).

das geht bei dir nur zufällig weil die alles was außerhalb von 8-20 uhr ist schon vorher abgefangen wird.

gruss
  andre
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: h-man-kl am 19 April 2016, 14:44:42
ok, danke, dann änder ich das mal.
da scheint eh och ein fehler drin zu sein, denn nach 22 uhr geht klei licht an :-(
Titel: Antw:Treppenlichtsteuerung - geht das nicht einfacher?
Beitrag von: h-man-kl am 21 April 2016, 08:50:49
Hallo,
ich hoffe mir kann nochmal jemand weiterhelfen.
es wird ab 21Uhr einfach kein Licht geschatet. Egal ob ich mit goto oder mit doif arbeite. Also vermute ich, dass es an der Definition des Zeitraumes liegt. 
Ich könnte jetzt wahrschenlich den Zeitraum von 21 bis 7 in zwei aufteilen von 21-23 und von 0-7, aber das geht doch sicher auch "schöner"....

nochmas DANKE!

Gruß
H-man
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 22 April 2016, 07:12:42
ich werde hier noch verrückt.... und versuche nochmal die Sache zu erklären mit der Hoffnung, dass mir jemand sagen kann wo ich Fehler mache.
Gegeben: FS20 Dämmerungssensor, der ein on und ein off liefert; FS20 Bewegungsmelder, der  60sec auf on geht und dann wieder auf off (wird auch so in der Weboberfläche angezeigt), FS20 Dimmer.
Alle Geräte für sich funktionieren und sind so eingebunden, dass ich sie steurn kann bzw. den Stats sehen kann.

Ich möche wenn der Dämmerungssensor "on" ist und der Bewegungsmelder auslöst in Abhängigkeit von der Uhrzeit das Licht steuern.
Abends: Hochdimmen auf 50% Pause runterdimmen
Nachts: Hochdimmen auf 31% Pause runterdimmen

Irgendwie klappt es nicht richtig. entweder es wird der falsche Wert gedimmt, oder garnicht gedimmt oder es wird keine Pause gemacht.
Also habe ich gestern alles zerpflückt und neu angefangen => ich bekomme es nicht so hin wie ich es möchte.

Was  geht:
Mein notify "n_TreppenhauslichtEG" sieht jetzt so aus:

FS20.BewegungsmelderTreppenhausEG.S1 {
if (Value ("FS20.Daemmerung.S1") eq "on") {fhem ("set FS20.DimmerTreppenhaus.E dim31% 3; sleep 45; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");};
}


Dummerweise wird das ausgeführt sobald der Bewegungsmelder angeht und wenn er ausgeht.... :-(
Irgendwo hier im Forum hab ich gelesen, dass man beim erstellen des notify auch Parameter mitgeben kann. Testweise habe ich dann das ganze so angelegt:
define n_TreppenhauslichtEG notify FS20.BewegungsmelderTreppenhausEG.S1:on .....
Daraufhin ging das Licht nicht mehr an.

Ich bin für jede Hilfe Dankbar!

Gruß
H-Man

Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 22 April 2016, 07:19:52
Vielleicht solltest Du erstmal im Eventmonitor schauen wie genau der Event aus schaut der vom BM kommt.
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 22 April 2016, 10:49:23
So, ein wenig bin ich weiter.... (das mit dem eventmonitor war garnicht so verkehrt - auch wenn ich damit nicht alle Fragen beantworten kann)
Der Bewegungsmelder sednet kein "on" sondern ein "on-for-timer 60".
Hochdimmen etc. beim einschalten und nix machen beim ausschalten klappt hiermit:
FS20.BewegungsmelderTreppenhausEG.S1 {
if ((Value ("FS20.Daemmerung.S1") eq "on") && (Value ("FS20.BewegungsmelderTreppenhausEG.S1") eq "on-for-timer 60")) {fhem ("set FS20.DimmerTreppenhaus.E dim31% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");};
}


Meine nächste Bausstelle ist also die Zeitgeschichte. Folgendes habe ich gemacht:

FS20.BewegungsmelderTreppenhausEG.S1 {
if ((Value ("FS20.Daemmerung.S1") eq "off"){
#mach nichts
}

elsif (( $hour >=21 || $hour <=6 ) && (Value ("FS20.BewegungsmelderTreppenhausEG.S1") eq "on-for-timer 60")) {fhem ("set FS20.DimmerTreppenhaus.E dim31% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");};}

else (Value ("FS20.BewegungsmelderTreppenhausEG.S1") eq "on-for-timer 60") {fhem ("set FS20.DimmerTreppenhaus.E dim50% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;");};}

}


Das Ergbnis ist, dass genau garnix mehr passiert, wenn der Bewegungsmelder auslöst.

Gruß & Danke
H-Man
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 22 April 2016, 11:19:38
Warum machst Du es so umständlich was das triggern an geht. Wenn Du nichts anderes brauchst/das notify nur anspringen soll bei on-for-timer 60 dann lass doch Dein notify nur darauf anspringen


FS20.BewegungsmelderTreppenhausEG.S1:on-for-timer.* { 

         if ((Value ("FS20.Daemmerung.S1") ne "off") {

                   if ( $hour >= 21 && $hour <= 6 ) {
                                 fhem "set FS20.DimmerTreppenhaus.E dim31% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off";
                   } else {
                                fhem "set FS20.DimmerTreppenhaus.E dim50% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;
                   }
         }
}
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 22 April 2016, 12:36:19
Erstmal vielen Dank für deine Geduld :-)
Warum ich es so umständlich mache? Gute Frage - ich bin noch nicht so lange mit fhem unterwegs und versuche einefach eine funktionierende Lösung zu finden - wenn es einfacher / besser geht und mir das jemand sagt, nehme ich das gerne an.

ich habe deinen Code 1:1 kopiert => wenn ich nun - wie gehabt - "set FS20.BewegungsmelderTreppenhausEG.S1 on-for-timer 60" in die Eingabezeile tippe, passiert wieder NIX. Im Eventmonitor steht lediglich, dass der Bewegungsmelder auf 60 Sekunden an gesetzt wurde.....

und dann hab ich gesehen dass eine ) fehlt! Hinter ne"off") dort hab ich sie hingesetzt und nun scheint es - zumindest beim simulieren - zu funktionieren!

Gruß
H-Man

PS: Nochwas zum vereinfachen: wie kann ich denn ein Notify aus eine anderen heraus aufrufen?  Ich habe verschiedene Sensoren, die das Treppenhauslicht steuern sollen. Kann ich ein notify bauen, was nur den teil ab "if ((Value..."  beinhaltet und das lasse ich vom Bewegungsmelder oder einem Schalter oder was anderem aufrufen? Oder wäre es geschickter für jeden Sensor ein eigenes notify zu bauen?

Nochmals Danke!
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 22 April 2016, 12:39:46
Dann verändern mal das


FS20.BewegungsmelderTreppenhausEG.S1:on-for-timer.* {


in das


FS20.BewegungsmelderTreppenhausEG.S1:.on-for-timer.* {
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 22 April 2016, 12:46:32
du warst schneller als ich mit meinem edit.....  Der Punkt war aber nicht nötig
kannst du mir trotzdem noch oben das beantworten ?  :-)
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 22 April 2016, 12:58:54
Zitat von: h-man-kl am 22 April 2016, 12:46:32
du warst schneller als ich mit meinem edit.....
aller wo ist bei den Zeilen der Unterschied?

Eigentlich viel schlimmer, ich habe eine zuviel gemacht. lach



FS20.BewegungsmelderTreppenhausEG.S1:on-for-timer.* { 

         if (Value ("FS20.Daemmerung.S1") ne "off") {

                   if ( $hour >= 21 && $hour <= 6 ) {
                                 fhem "set FS20.DimmerTreppenhaus.E dim31% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off";
                   } else {
                                fhem "set FS20.DimmerTreppenhaus.E dim50% 3; sleep 50; set FS20.DimmerTreppenhaus.E dim06% 10; sleep 10; set FS20.DimmerTreppenhaus.E off;
                   }
         }
}


Was Deine Frage zur Regex an geht verweise ich mal hier hin (https://ragnar-f.github.io/docs/misc/RegEx-QuickRef.htm)
Kleiner Tip. Wenn ein Notify anspringt ändert sich immer der STATE. Passiert das nicht ist was faul an der Regex.
Zweitens - Springt das Notify an, macht aber nicht das was es soll, schaut man als erstes ins Logfile. Da stand bestimmt ne Fehlermeldung wegen der vergessenen Klammer.

Dein Schaltungswunsch muß ich mir mal in Ruhe durchlesen
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 22 April 2016, 13:03:51
Zitat von: h-man-kl am 22 April 2016, 12:36:19
PS: Nochwas zum vereinfachen: wie kann ich denn ein Notify aus eine anderen heraus aufrufen?  Ich habe verschiedene Sensoren, die das Treppenhauslicht steuern sollen. Kann ich ein notify bauen, was nur den teil ab "if ((Value..."  beinhaltet und das lasse ich vom Bewegungsmelder oder einem Schalter oder was anderem aufrufen? Oder wäre es geschickter für jeden Sensor ein eigenes notify zu bauen?

Nochmals Danke!

Hier wäre es sinnvoll ein eigenes Perlscript zu schreiben. 99_myUtils_lightcontrol.pm
Darin baust Du eine sub ein welche Du durch das notify aufrufen lässt. Wenn es nicht exobitant viele Events fabriziert kannst Du alle Devices welche dafür überwacht werden sollen in ein Notify packen.
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 25 April 2016, 09:07:51
Danke nochmals fr die Hilfe.
Ich hab das jetzt wie folgt gelöst:

Anlegen eines Dummy Treppenhausbeleuchtung.
Das notify hört auf den Dummy
Den Dummy setze ich durch die schiedenen Sender auf "on-for-timer xy" (Bewegungsmelder, Taster, Garagentor etc.)

Ob das die optimale Lösung ist, weilß ich noch ncht, aber es funktioniert schonmal

Gruß
H-Man
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: CoolTux am 25 April 2016, 09:53:02
Guten Morgen,

Es ist ein Anfang. Später wenn Du mehr Erfahrung hast kannst Du es ja umbauen.
Für FHEM ist es egal ob das notify oder die PerlSub den Code enthält. Für bessere Übersicht und einfach weil man es so macht wäre es für die Zukunft überlegenswert eine 99_myUtils dafür an zu legen.
Ich habe zum Beispiel eine sehr komplexe Lichtsteuerung. Je nach Tageszeit, Dämmerungsgrad und Anwesenheit schalten Lichter an, oder aus, oder es werden Scenen gesetzt.



Grüße
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 26 April 2016, 10:31:33
Moin,
vielen Dank nochmal für die Hilfe.
Ich werde mich erstmal langsam vortasten und versuche mal alle meine Komponenten einzubinden.

Gruß
H-Man
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: Per am 26 April 2016, 14:11:37
Zitat von: h-man-kl am 22 April 2016, 12:36:19PS: Nochwas zum vereinfachen: wie kann ich denn ein Notify aus eine anderen heraus aufrufen?  Ich habe verschiedene Sensoren, die das Treppenhauslicht steuern sollen. Kann ich ein notify bauen, was nur den teil ab "if ((Value..."  beinhaltet und das lasse ich vom Bewegungsmelder oder einem Schalter oder was anderem aufrufen? Oder wäre es geschickter für jeden Sensor ein eigenes notify zu bauen?
Geschickter wäre es, wenn du die Namensgebung so vornimmst, dass aus zusammengehörige Sensoren und Aktoren erkennbar sind. Dann kannst du mit notify/DOIF $NAME/$DEVICE arbeiten und brauchst nur ein (1) notify/DOIF. Schaltzeiten und -helligkeiten, so unterschiedlich, kannst du in Userreadings unterbringen.
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: h-man-kl am 27 April 2016, 08:24:54
Hallo Per,
also irgendwie verstehe ich deinen Text überhaupt nicht....
Was meinst d mit zusammengehörig? Die Sensoren schalten bei mir nichts direkt, es läuft alles über Fhem

Gruß
H-Man
Titel: Antw:Treppenlichtsteuerung - ich dreh noch durch...
Beitrag von: Per am 27 April 2016, 16:21:04
Zitat von: h-man-kl am 27 April 2016, 08:24:54Was meinst d mit zusammengehörig? Die Sensoren schalten bei mir nichts direkt, es läuft alles über Fhem
Schon klar, aber ich hatte deinen Text falsch in Erinnerung, dachte an mehrere Sensoren für mehrere Leuchten.

Zitat von: h-man-kl am 22 April 2016, 12:36:19wie kann ich denn ein Notify aus eine anderen heraus aufrufen?  Ich habe verschiedene Sensoren, die das Treppenhauslicht steuern sollen. Kann ich ein notify bauen, was nur den teil ab "if ((Value..."  beinhaltet und das lasse ich vom Bewegungsmelder oder einem Schalter oder was anderem aufrufen? Oder wäre es geschickter für jeden Sensor ein eigenes notify zu bauen?

Nicht 1:1 nutzbar, aber vllt. als Idee:
define Hoflicht.Timer DOIF (([Taster600s] eq "on") (set Licht on) ( ) ( ) (set Licht aus) \
DOELSEIF (([Taster400s] eq "an" and [?$SELF] < 600) (set Licht on) ( ) (set Licht aus) \
DOELSEIF ([Taster200s] eq "an" and [?$SELF] < 400) (set Licht on) (set Licht aus)
attr Hoflicht.Timer cmdState 600,400,200,0|400,200,0|200,0
attr Hoflicht.Timer wait 0,200,200,200:0,200,200:0,200
attr Hoflicht.Timer initialize 0
attr Hoflicht.Timer do resetwait


Kann man bestimmt noch optimieren (selftimer), ist mir aber ohne Testsystem zu heikel zum Einstellen. Deshalb bin ich mir mit do resetwait nicht 100% sicher.