98_MSwitch - Support

Begonnen von Byte09, 25 März 2018, 12:19:58

Vorheriges Thema - Nächstes Thema

Torsten_MG

Wenn ich jetzt nichts übersehen habe, sind alle Klammern da.

Hier mal der Code direkt aus der myUtils
sub
Fahrplan()
{
my $richtung = "";
my $uhrzeit = "";
my $min = "";
my $linie = "";
my $i = 0;
my $j = 0;
my $k = 0;
{fhem("deletereading richtung_od Bus.*")};
{fhem("deletereading richtung_ry Bus.*")};
do
{
        $richtung =  ReadingsVal("Od_Gymn","departure_" . $i . "_text","<undef>");
$uhrzeit =  ReadingsVal("Od_Gymn","departure_" . $i . "_time_human_readable","<undef>");
$linie =  ReadingsVal("Od_Gymn","departure_" . $i . "_number","<undef>");
$min = ReadingsVal("Od_Gymn","departure_" . $i . "_timeInMinutes","<undef>");
{fhem("setreading richtung_od Marker 0")};
{fhem("setreading richtung_ry Marker 0")};

        if ($richtung ne "<undef>")
       {
if($richtung eq "Mön. Clemens-August-Str." || $richtung eq "Mönchengl Nievelsteinstr." || $richtung eq "MG Rheydt Hbf" || $richtung eq "Mönchengl. Rostocker Straße" || $richtung eq "Mönchengladb. Wickrath Markt" || $richtung eq "MG Regiopark 3")
{fhem("setreading richtung_od Bus$j $richtung");
fhem("setreading richtung_od Bus_zeit$j $uhrzeit");
fhem("setreading richtung_od Bus_linie$j $linie");
fhem("setreading richtung_od Bus_min$j $min");
fhem("setreading richtung_od Marker 1")
}
if(ReadingsVal("richtung_od","Marker","") ne "1")
{$j--}
if($richtung eq "Mönchengl. Künkelstraße" || $richtung eq "Mönchengladbach Marienplatz" || $richtung eq "MG Hbf /Europaplatz" || $richtung eq "Mönchengl. Am Hommelsbach" || $richtung eq "Mönchengl. Künkelstraße")
{fhem("setreading richtung_ry Bus$k $richtung");
fhem("setreading richtung_ry Bus_zeit$k $uhrzeit");
fhem("setreading richtung_ry Bus_linie$k $linie");
fhem("setreading richtung_ry Bus_min$k $min");
fhem("setreading richtung_ry Marker 1")
}
if(ReadingsVal("richtung_ry","Marker","") ne "1")
{$k--}
}
$i++;
$j++;
$k++;
}while($richtung ne "<undef>")
}

Byte09

Zitat von: Torsten_MG am 10 August 2018, 16:48:32
Wenn ich jetzt nichts übersehen habe, sind alle Klammern da.

Hier mal der Code direkt aus der myUtils
sub
Fahrplan()
{
my $richtung = "";
my $uhrzeit = "";
my $min = "";
my $linie = "";
my $i = 0;
my $j = 0;
my $k = 0;
{fhem("deletereading richtung_od Bus.*")};
{fhem("deletereading richtung_ry Bus.*")};
do
{
        $richtung =  ReadingsVal("Od_Gymn","departure_" . $i . "_text","<undef>");
$uhrzeit =  ReadingsVal("Od_Gymn","departure_" . $i . "_time_human_readable","<undef>");
$linie =  ReadingsVal("Od_Gymn","departure_" . $i . "_number","<undef>");
$min = ReadingsVal("Od_Gymn","departure_" . $i . "_timeInMinutes","<undef>");
{fhem("setreading richtung_od Marker 0")};
{fhem("setreading richtung_ry Marker 0")};

        if ($richtung ne "<undef>")
       {
if($richtung eq "Mön. Clemens-August-Str." || $richtung eq "Mönchengl Nievelsteinstr." || $richtung eq "MG Rheydt Hbf" || $richtung eq "Mönchengl. Rostocker Straße" || $richtung eq "Mönchengladb. Wickrath Markt" || $richtung eq "MG Regiopark 3")
{fhem("setreading richtung_od Bus$j $richtung");
fhem("setreading richtung_od Bus_zeit$j $uhrzeit");
fhem("setreading richtung_od Bus_linie$j $linie");
fhem("setreading richtung_od Bus_min$j $min");
fhem("setreading richtung_od Marker 1")
}
if(ReadingsVal("richtung_od","Marker","") ne "1")
{$j--}
if($richtung eq "Mönchengl. Künkelstraße" || $richtung eq "Mönchengladbach Marienplatz" || $richtung eq "MG Hbf /Europaplatz" || $richtung eq "Mönchengl. Am Hommelsbach" || $richtung eq "Mönchengl. Künkelstraße")
{fhem("setreading richtung_ry Bus$k $richtung");
fhem("setreading richtung_ry Bus_zeit$k $uhrzeit");
fhem("setreading richtung_ry Bus_linie$k $linie");
fhem("setreading richtung_ry Bus_min$k $min");
fhem("setreading richtung_ry Marker 1")
}
if(ReadingsVal("richtung_ry","Marker","") ne "1")
{$k--}
}
$i++;
$j++;
$k++;
}while($richtung ne "<undef>")
}


ja, du hast recht .

es gibt einen fehler bei der verarbeitung des perlcodes, und zwar werde "||" intern  falsch behandelt . gib mir eine stunde zeit , ich behebe das.

gruss Byte09

Torsten_MG

Zusätzlich muß ja dieser Code um 5sek verzögert abgesetzt werden.

Byte09

Zitat von: Torsten_MG am 10 August 2018, 17:34:46
Zusätzlich muß ja dieser Code um 5sek verzögert abgesetzt werden.

so , nimm den code bitte aus freecmd "cmd2" raus .
drücke dann "add action for freecmd"

dort fügst du den code bitte in "cmd1" ein und gibst darunterbei cmd1 delay 00:00:05 ein.
modify actions drücken.

den trigger für cmd 2 nimmst du bitte ganz raus.

wenn alles gespeichert ist mach bitteein update , ich habe probehalber mal v1.71a eingespielt . reload 98_MSwitch.pm.

danach versuch bitte mal ob es geht und sag mir bescheid.

parallel richt ich jetzt auch mal die ganzen dummys ein

gruss Byte09




Torsten_MG

Mit dem Code funktioniert es noch nicht.

Aber mit dem 2. freecmd und den 5sek und den Aufruf {Fahrplan()} funktionierts

Byte09

Zitat von: Torsten_MG am 10 August 2018, 17:58:36
Mit dem Code funktioniert es noch nicht.

Aber mit dem 2. freecmd und den 5sek und den Aufruf {Fahrplan()} funktionierts

ok ,dann lass es bitte erstmal so , ich muss das in ruhe durchtesten. muss dafür aber auch noch module installieren , die ich nicht nutze.

ich melde mich sobald ich es habe.

gruss Byte09

Torsten_MG

Kein Streß, es funktioniert ja erstmal!!

Byte09

Zitat von: Torsten_MG am 10 August 2018, 18:05:48
Kein Streß, es funktioniert ja erstmal!!

noch eine kleinigkeit umgebaut, geht jetzt bei mir mit V1.71b.

danke für deine Geduld.

gruss Byte09

Torsten_MG

Zitat von: Byte09 am 10 August 2018, 18:39:37
noch eine kleinigkeit umgebaut, geht jetzt bei mir mit V1.71b.
Perfekt! Funktioniert!

Zitat von: Byte09 am 10 August 2018, 18:39:37
danke für deine Geduld.

Kein Problem! Ich habe zu danken, für das super Modul


Torsten_MG

#354
Guten morgen,

mir ist da gerade noch ein Problem bei einem schon laufendem MSwitch aufgefallen.

#V V1.71b
#S .Device_Affected -> FL_Lampe-AbsCmd1,FL_Lampe-AbsCmd2,FL_Lampe_D-AbsCmd1,FL_Lampe_D-AbsCmd2
#S .Device_Affected_Details -> FL_Lampe-AbsCmd1,MSwitchtoggle,no_action,on/off,,delay1,delay1,000000,000000,[$EVENT]#[sp]eq#[sp]"FL_Taster1#[dp]state#[dp]FL_Taster1_02"#[sp]OR#[sp][$EVENT]#[sp]eq#[sp]"FL_Taster1#[dp]state#[dp]FL_Taster1_01"#[sp]OR#[sp][$EVTPART1]#[sp]eq#[sp]"FL_Taster2_01"#[sp]OR#[sp][$EVTPART1]#[sp]eq#[sp]"FL_Taster2_02",,0,0,1|FL_Lampe-AbsCmd2,pct,no_action,50 30 0.1,,delay1,delay1,000000,000000,[$EVTPART1]#[sp]eq#[sp]"FL_Taster2_Motion"#[sp]AND#[sp][$EVTPART2]#[sp]eq#[sp]"trigger_cnt"#[sp]AND#[sp][[FL_Lampe_D#[dp]Licht_an]-[FL_Lampe_D#[dp]Licht_aus]]#[sp]AND#[sp][FL_Lampe#[dp]state]#[sp]eq#[sp]"off",,0,0,1|FL_Lampe_D-AbsCmd1,on,no_action,,,delay1,delay1,000000,000000,[FL_Lampe#[dp]state]#[sp]eq#[sp]"on",,0,0,1|FL_Lampe_D-AbsCmd2,off,no_action,,,delay1,delay1,000000,000000,[FL_Lampe#[dp]state]#[sp]eq#[sp]"off",,0,0,1
#S .Device_Events -> no_trigger
#S .First_init -> done
#S .Trigger_Whitelist -> FL_Taster1,FL_Taster2_01,FL_Taster2_02,FL_Taster2_Motion
#S .Trigger_cmd_off -> no_trigger
#S .Trigger_cmd_on -> no_trigger
#S .Trigger_condition ->
#S .Trigger_off -> no_trigger
#S .Trigger_on -> *
#S .Trigger_time ->
#S .V_Check -> V 0.4
#S Trigger_device -> all_events
#S Trigger_log -> off
#S last_event -> FL_Taster2_Motion:state:noMotion
#S state -> on
#A MSwitch_Include_MSwitchcmds -> 1
#A MSwitch_Expert -> 1
#A MSwitch_Extensions -> 1
#A MSwitch_Include_Webcmds -> 1
#A MSwitch_Debug -> 0
#A MSwitch_Include_Devicecmds -> 1
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
#A MSwitch_Delete_Delays -> 1
#A MSwitch_Lock_Quickedit -> 1
#A MSwitch_Mode -> Full
#A MSwitch_Activate_MSwitchcmds -> 1
#A room -> 01_Flur->Licht,MSwitch
#A MSwitch_Inforoom -> MSwitch
#A MSwitch_Help -> 0


Und zwar bei dem Bereich wo ich den Bewegungsmelder einsetze.

Ich frage ja mit
[$EVTPART1] eq "FL_Taster2_Motion" AND [$EVTPART2] eq "trigger_cnt" AND [[FL_Lampe_D:Licht_an]-[FL_Lampe_D:Licht_aus]] AND [FL_Lampe:state] eq "off"
die Bedingungen ab und Schalte die Lampe mit
MSwitch 'cmd1': Set pct 50 30 1

für 30sek. mit einer leuchtkraft von 50%

Mir ist nun aufgefallen,

daß wenn nach ablauf der 30sek. sich noch jemand im erfassungsbereich des BWM befindet, dann ändert sich der Zustand der Bedingungen nicht, was so auch erwünscht ist. Aber die Lampe geht nicht an. Erst, wenn nach weiteren 30sek, immer noch jemand im Erfassungsbereich ist, geht die Lampe an.

Beispiel:

um 6:10:24 Uhr wird der BWM ausgelöst, die Lampe geht an
um 6:10:54 Uhr geht die Lampe wieder aus, obwohl noch jemand im Erfassungsbereich ist und die Events haben sich nicht geändert.
um 6:11:24 Uhr geht die Lampe wieder an, weil immer noch jemand im Erfassungsbereich des BWM ist.

Am BWM kann es ja nicht liegen, da die Events sich ja nicht ändern. Den minInterval habe ich auch auf 30sek. stehen


EDIT:

Wo holt sich der MSwitch eigentlich die Info FL_Taster2_Motion:trigger_cnt:243 im EVENT her? Das trigger_cnt staht ja auch im [EVTPART2] welches ich abfrage. Ich kann diese Zeile weder im FL_Taster2 noch im FL_Taster2_Motion finden. Ich wollte nämlich mal mit hilfe eines notify ausprobieren, ob es am MSwitch liegt, oder ob ich mit dem notify auch diesen Effekt habe. Aber das trigger_cnt finde ich in beiden devices nicht

Byte09

#355
Zitat von: Torsten_MG am 12 August 2018, 06:18:23
Guten morgen,

mir ist da gerade noch ein Problem bei einem schon laufendem MSwitch aufgefallen.

#V V1.71b
#S .Device_Affected -> FL_Lampe-AbsCmd1,FL_Lampe-AbsCmd2,FL_Lampe_D-AbsCmd1,FL_Lampe_D-AbsCmd2
#S .Device_Affected_Details -> FL_Lampe-AbsCmd1,MSwitchtoggle,no_action,on/off,,delay1,delay1,000000,000000,[$EVENT]#[sp]eq#[sp]"FL_Taster1#[dp]state#[dp]FL_Taster1_02"#[sp]OR#[sp][$EVENT]#[sp]eq#[sp]"FL_Taster1#[dp]state#[dp]FL_Taster1_01"#[sp]OR#[sp][$EVTPART1]#[sp]eq#[sp]"FL_Taster2_01"#[sp]OR#[sp][$EVTPART1]#[sp]eq#[sp]"FL_Taster2_02",,0,0,1|FL_Lampe-AbsCmd2,pct,no_action,50 30 0.1,,delay1,delay1,000000,000000,[$EVTPART1]#[sp]eq#[sp]"FL_Taster2_Motion"#[sp]AND#[sp][$EVTPART2]#[sp]eq#[sp]"trigger_cnt"#[sp]AND#[sp][[FL_Lampe_D#[dp]Licht_an]-[FL_Lampe_D#[dp]Licht_aus]]#[sp]AND#[sp][FL_Lampe#[dp]state]#[sp]eq#[sp]"off",,0,0,1|FL_Lampe_D-AbsCmd1,on,no_action,,,delay1,delay1,000000,000000,[FL_Lampe#[dp]state]#[sp]eq#[sp]"on",,0,0,1|FL_Lampe_D-AbsCmd2,off,no_action,,,delay1,delay1,000000,000000,[FL_Lampe#[dp]state]#[sp]eq#[sp]"off",,0,0,1
#S .Device_Events -> no_trigger
#S .First_init -> done
#S .Trigger_Whitelist -> FL_Taster1,FL_Taster2_01,FL_Taster2_02,FL_Taster2_Motion
#S .Trigger_cmd_off -> no_trigger
#S .Trigger_cmd_on -> no_trigger
#S .Trigger_condition ->
#S .Trigger_off -> no_trigger
#S .Trigger_on -> *
#S .Trigger_time ->
#S .V_Check -> V 0.4
#S Trigger_device -> all_events
#S Trigger_log -> off
#S last_event -> FL_Taster2_Motion:state:noMotion
#S state -> on
#A MSwitch_Include_MSwitchcmds -> 1
#A MSwitch_Expert -> 1
#A MSwitch_Extensions -> 1
#A MSwitch_Include_Webcmds -> 1
#A MSwitch_Debug -> 0
#A MSwitch_Include_Devicecmds -> 1
#A MSwitch_Ignore_Types -> notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul
#A MSwitch_Delete_Delays -> 1
#A MSwitch_Lock_Quickedit -> 1
#A MSwitch_Mode -> Full
#A MSwitch_Activate_MSwitchcmds -> 1
#A room -> 01_Flur->Licht,MSwitch
#A MSwitch_Inforoom -> MSwitch
#A MSwitch_Help -> 0


Und zwar bei dem Bereich wo ich den Bewegungsmelder einsetze.

Ich frage ja mit
[$EVTPART1] eq "FL_Taster2_Motion" AND [$EVTPART2] eq "trigger_cnt" AND [[FL_Lampe_D:Licht_an]-[FL_Lampe_D:Licht_aus]] AND [FL_Lampe:state] eq "off"
die Bedingungen ab und Schalte die Lampe mit
MSwitch 'cmd1': Set pct 50 30 1

für 30sek. mit einer leuchtkraft von 50%

Mir ist nun aufgefallen,

daß wenn nach ablauf der 30sek. sich noch jemand im erfassungsbereich des BWM befindet, dann ändert sich der Zustand der Bedingungen nicht, was so auch erwünscht ist. Aber die Lampe geht nicht an. Erst, wenn nach weiteren 30sek, immer noch jemand im Erfassungsbereich ist, geht die Lampe an.

Beispiel:

um 6:10:24 Uhr wird der BWM ausgelöst, die Lampe geht an
um 6:10:54 Uhr geht die Lampe wieder aus, obwohl noch jemand im Erfassungsbereich ist und die Events haben sich nicht geändert.
um 6:11:24 Uhr geht die Lampe wieder an, weil immer noch jemand im Erfassungsbereich des BWM ist.

Am BWM kann es ja nicht liegen, da die Events sich ja nicht ändern. Den minInterval habe ich auch auf 30sek. stehen


EDIT:

Wo holt sich der MSwitch eigentlich die Info FL_Taster2_Motion:trigger_cnt:243 im EVENT her? Das trigger_cnt staht ja auch im [EVTPART2] welches ich abfrage. Ich kann diese Zeile weder im FL_Taster2 noch im FL_Taster2_Motion finden. Ich wollte nämlich mal mit hilfe eines notify ausprobieren, ob es am MSwitch liegt, oder ob ich mit dem notify auch diesen Effekt habe. Aber das trigger_cnt finde ich in beiden devices nicht

ich muss das nachher mal anhand deiner config durchspielen , hat letztendlich wohl aber damit zu tun , dass die lampe nach 30 sekunden ausgeht , wenn kein neues event mit motion kommt. dieses scheint aber auch erst erneut nach den 30 sekunden zu kommen ?! da muss einfach das timing passen , das heisst , die lampen müssen mindestens solange an sein , bis der melder ( zumindest theoretisch ) en erneutes motion melden kann, est dann kann auch ein erneutes setzen der timer für die lampe erfolgen.

kurz: solange in den 30 sekunden brenndauer kein erneutes event erfolgt , schaltet er die lampen ( richtigerweise ) ab.

ich werde mich aber heute nochmal damit beschäftigen und melde mich dann nochmal , stehe aber gerade erstmal mit meinen eigenen bewegungsmeldern auf kriegsfuss  ;)

edit:

ZitatEDIT:

Wo holt sich der MSwitch eigentlich die Info FL_Taster2_Motion:trigger_cnt:243 im EVENT her? Das trigger_cnt staht ja auch im [EVTPART2] welches ich abfrage. Ich kann diese Zeile weder im FL_Taster2 noch im FL_Taster2_Motion finden. Ich wollte nämlich mal mit hilfe eines notify ausprobieren, ob es am MSwitch liegt, oder ob ich mit dem notify auch diesen Effekt habe. Aber das trigger_cnt finde ich in beiden devices nicht

das ist ein Event, welches von zugehörigem Modul erzeugt wird ( handelt sich ja um einen Homematicschalter mi BWM - glaube ich ) - insofern muss es auch im Eventmonitor auftauchen .

gruss Byte09

Torsten_MG

Wenn nach dem ersten Motion keine Bewegung kommt, geht der BWM nach 30ek. Auf nomotion. Ist aber permanent Bewegung vor dem BWM bleibt er bei motion. Aber erst 60sek  nach dem 1. schalten geht die Lampe wieder an.

Also: eine Bewegung, Lampe geht an. 30sek später geht auf nomotion und Lampe geht aus.

Dauerhafte Bewegung: motion on. Nach 30sek geht Lampe aus, aber weiterhin motion on. Nach weiteren 30sek. Lampe geht an und weiterhin motion on.

Gesendet von meinem SM-J730F mit Tapatalk


Byte09

#357
Zitat von: Torsten_MG am 12 August 2018, 10:07:17
Wenn nach dem ersten Motion keine Bewegung kommt, geht der BWM nach 30ek. Auf nomotion. Ist aber permanent Bewegung vor dem BWM bleibt er bei motion.

genau das ist das problem , er bleibt bei motion , aber es wird kein neues event generiert , auf das reagiert werden kann .

da muss entweder im bewegungsmelder dafür gesorgt werden , dass ei neues event generiert wird ( per event on-...regel ) , weiss aber nicht ob des bei deinen Meldern geht, oder es muss im MSwitch eine entsprechende prüfung stattfinden.

reagiert werden kann nur auf ein erzeugtes event . wird keines generiert , sondern es nur nicht geändert , gibt es erstmal nichts , worauf reagiert werden kann.

ich schaue es mir nachher an.

gruss Byte09 

Byte09

#358
versuch bitte mal , ob du es lösen kannst , indem du bei deinem bewegungsmelder das attribut "attr <device> event-min-interval reading1:minInterval1" entsprechend setzt .

du musst halt dafür sorgen , dass das event erneut kommt, bevor die 30 sekunden abgelaufen sind.

nicht so schön ist dabei , dass natürlich eine entsprechende systemlast erzeugt wird.

alternativ müsstest du das MSwitch komplett umbauen , und zwar so , dass die lampen nicht schon von vornherein mit einem timer gesetzt werden , sondern diese "nur" angeschaltet werden. dann muss nach 30 sekunden geprüft werden, ob das reading noch auf motion steht , wenn nicht -> lampen aus , wenn ja -> erneute prüfung naxh 30 sekunden.
das geht auch alles in einem device, ist aber schon etwas komplizierter.

alternativ2 kannst du auch bei dem event motion nur "anschalten" , und wenn das event nomotion kommt "abschalten". dann bist du halt an die internen vorgaben des bewegungsmelders gebunden , wielange es dauert, bis das event "nomotion" kommt. ich glaube aber bei den homematic kannst du das über die register ändern (?).

gruss Byte09

edit: du triggerst auch nicht wirklich auf motion, obwohl dieses event ja kommen sollte , sondern irgendwie "hintenrum" (  bei den conditions ) . das sollte auch mal geändert werden , das das alles unnötig verkompliziert. Gerne kannst du mich dazu anrufen , das übersteigt hier den rahmen , bzw verkompliziert es nochmals

Byte09

alternativ3: du gaukelst demMSwitch über set MSwitch fakeevent .... vor, das ein Event "motion" ankommt, wenn nach 29 sekunden der state des melders noch auf motion steht. Ist m.E die einfachste lösung in diesem Fall , sollten wir ggf. aber auch telefonieren.

gruss Byte09