Problem mit Splitbefehl

Begonnen von crissiloop, 19 März 2013, 22:15:52

Vorheriges Thema - Nächstes Thema

crissiloop

Ich versuche mir mit Google-Kalenderevents den Status von Dummies setzen zu lassen.
Solange nur ein Kalenderevent zu einer Zeit vorhanden ist, funktioniert es auch. Sind aber 2 Events zur gleichen Zeit vorhanden klappt es nicht mehr und ich bekomme die folgende Meldung im Log:

Kalender_Christian_Start return value: Unknown command {\
Kalenderstart("qkbb3pr82gj3ptejvrsti0inr0googlecom, try help
Unknown command sl5envs7hmh4gnfe0g73n2gu3cgooglecom");\
}, try help


die UIDs sind die beiden Events, um welche es sich handelt.

Die Funktion in meinre MyUtils.pm schaut wie folgt aus:
sub
Kalenderstart ($)
{
my ($EVTPART1) = @_;
my @uids=split(/;/,$EVTPART1);
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
if ($Kalendertext =~ m"Urlaub") {
fhem("setstate Urlaub_dummy 1");
};
if ($Kalendertext =~ m"Besuch") {
fhem("setstate Gast_dummy 1");
};
};
}


Und aufgerufen wird es:
define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {
Kalenderstart("%EVTPART1");
}


Laut dem Post: Link liegt es wohl am Semikolon als Trennung der UIDS.
Aber die Lösung, im Calendar-Modul den Trenner zu ändern stellt für mich keine Lösung dar.
Hat jemand eine Idee?

Christian
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

MisterEltako

Hi!

versuch doch erstmal zu loggen was überhaupt getestet wird und welche Werte in den Variablen stehen:

sub
Kalenderstart ($)
{
   my ($EVTPART1) = @_;
   my @uids=split(/;/,$EVTPART1);
        Log 3, "Eventpart1: $EVTPART1";
   foreach my $uid (@uids) {
      my $Kalendertext = fhem("get Kalender_Christian summary $uid");
      Log 3, "uid: $uid;
                if ($Kalendertext =~ m"Urlaub") {
         fhem("setstate Urlaub_dummy 1");
      };
      if ($Kalendertext =~ m"Besuch") {
         fhem("setstate Gast_dummy 1");
      };
   };
}

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

ThomasL

Hallo,

ich mach das einfach so:

define Heizungcheck at *00:13 { if(index((fhem "get Hauskalender full modeStart"),"Heizung")>0){fhem "set dHeizung on"} else {fhem "set dHeizung off"}}

Wenn eine Event "Heizung" im Kalender enthalten ist, wird der Dummy gesetzt.

Grüße
Thomas

MisterEltako

Noch eine Idee:

Versuche es bitte mit

my @uids=split(/\;/,$EVTPART1);
oder:
my @uids=split(/[;]/,$EVTPART1);

[;] .... besagt das auch ein Semikolon als Trenner fungieren darf.

Funktioniert es dann?


MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

crissiloop

Hallo MisterEltako,
danke für deine Hinweise, aber leider scheint das Semikolon bei 2 gleichzeitigen Ereignissen bereits den Aufruf der Funktion zu zerschießen.

Funktion wurde um die Logeinträge ergänzt:
sub
Kalenderstart ($)
{
my ($EVTPART1) = @_;
        Log 3, "Eventpart1 ohne Split: $EVTPART1";
my @uids=split(/[;]/,$EVTPART1);
        Log 3, "Eventpart1: $EVTPART1";
foreach my $uid (@uids) {
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
                Log 3, "uid: $uid";
if ($Kalendertext =~ m"Urlaub") {
fhem("setstate Urlaub_dummy 1");
};
if ($Kalendertext =~ m"Besuch") {
fhem("setstate Gast_dummy 1");
};
};
}



Mit einem Event sind die Logeinträge sauber vorhanden und auch der Dummy wird gesetzt:
013.03.20 18:44:33 3: Eventpart1: 011mfi0j3ihdphi71e90po59logooglecom
2013.03.20 18:44:33 3: get Kalender_Christian summary 011mfi0j3ihdphi71e90po59logooglecom : Urlaub
2013.03.20 18:44:33 3: uid: 011mfi0j3ihdphi71e90po59logooglecom


Und bei 2 gleichzeitigen Events die bekannte Fehlermeldung:
2013.03.20 18:52:00 3: Kalender_Christian_Start return value: Unknown command {\
Kalenderstart("35mv9m3oipaljjetg5uuijqqacgooglecom, try help
Unknown command hrfbl5orrenj0ufnv9jovc1u5cgooglecom");\
}, try help


Ich habe leider auch keine Idee mehr! Also das Semikolon zu escapen scheint nicht zu funktionieren, in \073 geht es auch nicht?

Christian
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

MisterEltako

Hi!
Ich habe den Kalender bisher nicht benutzt. Deswegen habe ich Mal versucht vereinfacht zu simulieren. In der Annahme das der Kalenderstring wie u.g. aussieht:

define Tester dummy
define Test_Kalender notify Tester {\
Kalenderstart("Test");;\
}

sub
Kalenderstart ($)
{
    my $EVTPART1 = "011mfi0j3ihdphi71e90po59logooglecom;hrfbl5orrenj0ufnv9jovc1u5cgooglecom";
    Log 3, "Eventpart1: $EVTPART1";
    my @uids=split(/';'/,$EVTPART1);
     foreach my $uid (@uids) {
                Log 3, "uid: $uid";
     };
}

kommt bei mir im Log:
2013.03.20 21:24:15 3: Eventpart1: 011mfi0j3ihdphi71e90po59logooglecom;hrfbl5orrenj0ufnv9jovc1u5cgooglecom
2013.03.20 21:24:15 3: uid: 011mfi0j3ihdphi71e90po59logooglecom
2013.03.20 21:24:15 3: uid: hrfbl5orrenj0ufnv9jovc1u5cgooglecom

Der Fehler liegt an der Übergabe der Parameter von fhem.cfg zu myUtils.pm:
Kalenderstart (011mfi0j3ihdphi71e90po59logooglecom;hrfbl5orrenj0ufnv9jovc1u5cgooglecom);
bringt das von dir geannte Problem.

Es müsste also ein Parameterübergabe eines Strings mit Semikolon gelöst werden. Oder du kannst versuchen in Fhem.cfg bereits zu spliten und damit das Semikolon entfernen.


MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

crissiloop

Hallo,
also ich habe es auch nochmal mit einem Dummy versucht und festgestellt, dass auch die Übergabe von "Test;Test2" an die Funktion glatt geht und der Splitbefehlt ohne Probleme funktioniert. Auch ohne Escapen des Semikolons.

Habe das Notify mal umgebaut zum Loggen:
Kalender_Christian:modeStarted.*googlecom.* {
Log 3,"Evenpart 0 ist: %EVTPART0";
Log 3,"Evenpart 1 ist: %EVTPART1";
}


Bei einem Eintrag alles gut:
2013.03.21 17:43:00 3: Evenpart 0 ist: modeStarted:
2013.03.21 17:43:00 3: Evenpart 1 ist: d55j13mgo2bicjdnr311addkjkgooglecom

Aber bei 2 gleichzeitigen Ereignissen geht das Problem wieder los.
Im Eventmonitor passiert folgendes:
2013-03-21 17:52:00 Calendar Kalender_Christian modeStarted: fvq5t4dq33ob46rku093rckge0googlecom;gf9ji766p8s986djk9r24l824ogooglecom

Aber im Logfile kommt dann wieder folgende Meldung:

2013.03.21 17:52:00 3: Kalender_Christian_Start return value: Unknown command {\
Log, try help
Unknown command gf9ji766p8s986djk9r24l824ogooglecom";\
}, try help

Das heißt er ließt nicht mal das $EVTPART0 mehr aus.
Wie komme ich denn an die beiden mit Semikolon getrennten UIDS ran?
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

rudolfkoenig

Das stufe ich hiermit als Bug ein: notify kann keine events mit einem ; verarbeiten,
jedenfalls nicht wie gedacht, s.u.

Das Problem ist, dass FHEM zuerst im {} alle $EVTPARTn ersetzt, damit wird dann AnalyzeCommandChain aufgerufen, der wiederum ziemlich primitiv nach ; sucht, um es in Kommandos zu trennen. Da der Bug grundlegender Natur ist, sehe ich keinen kurzfristigen Fix.

Es gibt ein haessliches (weil fhem Internas ausnutzendes) Workaround:
define n notify Kalender_Christian:modeStarted.*googlecom.*\
 { Log 3, "Event: $defs{@}{CHANGED}[0]" }

wobei statt 0 evtl. auch andere Zahlen verwendet werden muessen (haengt vom Modul ab, das Calendar Modul kenne ich nicht). Sinnvollerweise sollte man mit "@" eine Funktion aus 99_myUtils.pm aufrufen, und split&co da vornehmen. Um die Test-Wartezeiten zu verkuerzen kann man sowas mit
trigger Kalender_Christian modeStarted text1;;text2

testen.

crissiloop

Ok,
danke für die Info Rudolf. Ich werde das mal versuchen, auch wenn mir das zum Verstehen im Moment zu hoch ist.

Aber vielleicht ist ja dann doch die Lösung, die Trenner im Calendar-Modul zu ändern in Kommas.
So hat es Marcus ja laut Post Link auch selber gelöst.

Aber ich wollte ungern in einem Modul rumfummeln und dann mit dem Update ist es wieder weg.

Vielleicht kann Boris da mal drauf schaun, ob dies möglich wäre?

Gruß
Christian
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

rudolfkoenig

Mit der neuen Schreibweise (siehe http://forum.fhem.de/index.php?t=msg&goto=70240&rid=8#msg_70240) sollte das Problem mit dem ; geloest sein.

crissiloop

Vielen Dank Rudolf,

es funktioniert nun wie gewünscht:

2013.03.26 19:01:00 3: Eventpart1 ohne Split: bntblsrap040ti4icgr395tdesgooglecom;pepe1mi4b77v3qo3q9dk2m9rtkgooglecom
2013.03.26 19:01:00 3: uid: bntblsrap040ti4icgr395tdesgooglecom
2013.03.26 19:01:00 3: get Kalender_Christian summary bntblsrap040ti4icgr395tdesgooglecom : Besuch
2013.03.26 19:01:00 3: uid: pepe1mi4b77v3qo3q9dk2m9rtkgooglecom
2013.03.26 19:01:00 3: get Kalender_Christian summary pepe1mi4b77v3qo3q9dk2m9rtkgooglecom : Urlaub


Christian
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT