Closed HomeAutoUser closed 4 years ago
@sidey79 bitte erkläre mir das. Ich kann dies nicht einschätzen.
Wie hast Du das denn gemacht, dass die Events geloggt werden?
Filelog? Fehlt da eventuell einfach die regex für die CAME Events?
Ich fügte den Test einfach ein und wunderte mich, das das Device den State aktualisierte und die anderen nicht. Ist das gewollte?
Wo ich es nachvollzogen habe, habe ich den Eventmonitor geöffnet und hatte den Dummy auf verbose 5.
Ich habe den Test mal laufen lassen:
2019.12.15 22:39:08 3: # Subtest: Checking Buttons_five_E
2019.12.15 22:39:08 3: 1..2
2019.12.15 22:39:08 3: ok 1 - check state reading
2019.12.15 22:39:08 3: ok 2 - check deviceCode reading
2019.12.15 22:39:08 3: ok 1 - Checking Buttons_five_E
2019.12.15 22:39:08 3: # Subtest: Checking CAME_TOP_432EV_EE
2019.12.15 22:39:08 3: 1..2
2019.12.15 22:39:08 3: not ok 1 - check state reading
2019.12.15 22:39:08 3: not ok 2 - check deviceCode reading
2019.12.15 22:39:08 3: not ok 2 - Checking CAME_TOP_432EV_EE
2019.12.15 22:39:08 3: # Subtest: Checking Chilitec_22640_AA80
2019.12.15 22:39:08 3: 1..2
2019.12.15 22:39:08 3: not ok 1 - check state reading
2019.12.15 22:39:08 3: not ok 2 - check deviceCode reading
2019.12.15 22:39:08 3: not ok 3 - Checking Chilitec_22640_AA80
2019.12.15 22:39:08 3: # Failed test 'check state reading'
2019.12.15 22:39:08 3: # at (eval 61) line 23.
2019.12.15 22:39:08 3: # got: '0'
2019.12.15 22:39:08 3: # expected: 'left_button'
2019.12.15 22:39:08 3: # Failed test 'check deviceCode reading'
2019.12.15 22:39:08 3: # at (eval 61) line 24.
2019.12.15 22:39:08 3: # got: '0'
2019.12.15 22:39:08 3: # expected: '11101110'
2019.12.15 22:39:08 3: # Looks like you failed 2 tests of 2.
2019.12.15 22:39:08 3: # Failed test 'Checking CAME_TOP_432EV_EE'
2019.12.15 22:39:08 3: # at (eval 61) line 26.
2019.12.15 22:39:08 3: # Failed test 'check state reading'
2019.12.15 22:39:08 3: # at (eval 61) line 36.
2019.12.15 22:39:08 3: # got: '0'
2019.12.15 22:39:08 3: # expected: 'power_on'
2019.12.15 22:39:08 3: # Failed test 'check deviceCode reading'
2019.12.15 22:39:08 3: # at (eval 61) line 37.
2019.12.15 22:39:08 3: # got: '0'
2019.12.15 22:39:08 3: # expected: '1010101010000000'
2019.12.15 22:39:08 3: # Looks like you failed 2 tests of 2.
2019.12.15 22:39:08 3: # Failed test 'Checking Chilitec_22640_AA80'
2019.12.15 22:39:08 3: # at (eval 61) line 40.
Komisch, der Unterschied besteht nur, das ich hier auf dem System die Devices schon angelegt habe.
Selber Test, nur optimiert und worauf ich aufbauen möchte.
sduino_dummy (
{
my %devices = (
"Buttons_five_E" => { "DEF" => "Buttons_five E",
"rmsg" => "MU;P0=250;P1=-492;P2=166;P3=-255;P4=491;P5=-8588;D=052121212121234121212121234521212121212341212121212345212121212123412121212123452121212121234121212121234;CP=0;",
"state" => "fan_off",
"deviceCode" => "1110 (off|off|off|on)"
},
"CAME_TOP_432EV_EE" => { "DEF" => "CAME_TOP_432EV EE",
"rmsg" => "MU;P0=-322;P1=136;P2=-15241;P3=288;P4=-735;P6=723;D=0123434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430;CP=3;R=27;",
"state" => "left_button"
},
"Chilitec_22640_AA80" => { "DEF" => "Chilitec_22640 AA80",
"rmsg" => "MS;P0=988;P1=-384;P2=346;P3=-1026;P4=-4923;D=240123012301230123012323232323232301232323;CP=2;SP=4;R=0;O;m=1;",
"state" => "power_on"
},
);
for my $key (keys %devices) {
subtest "Checking $key" => sub {
CommandDefMod(undef,"-temporary $key SD_UT ".$devices{$key}->{DEF});
my %signal_parts = SIGNALduino_Split_Message($devices{$key}->{rmsg},$targetHash->{NAME});
SIGNALduino_Parse_MU($targetHash, $targetHash, $targetHash->{NAME}, $devices{$key}->{rmsg},%signal_parts);
is(ReadingsVal($key ,"state","0"),$devices{$key}->{state},"check state reading");
is(ReadingsVal($key ,"deviceCode","0"),$devices{$key}->{deviceCode},"check deviceCode reading") if ($devices{$key}->{deviceCode});
sleep 3;
}
}
}
)
Ergebnis:
# Subtest: Checking CAME_TOP_432EV_EE
ok 1 - check state reading
1..1
ok 1 - Checking CAME_TOP_432EV_EE
# Subtest: Checking Buttons_five_E
ok 1 - check state reading
ok 2 - check deviceCode reading
1..2
ok 2 - Checking Buttons_five_E
# Subtest: Checking Chilitec_22640_AA80
ok 1 - check state reading
1..1
ok 3 - Checking Chilitec_22640_AA80
Das ist exakt die Ursache. Autocreate legt CAME_TOP_432EV_EE und auch Chilitec_22640_AA80 an. Danach kommen aber kein dispatch mehr um auch die Auswertung der Daten zu ermöglichen:
Es ist ja schonmal gut zu wissen woran es liegt. Liegt es also am UnitTest modul?
Nein, hat mit dem unittest Modul nichts zu tun. Es liegt leider an deinem Test.
Autocreate ist ja doch nicht im Spiel, da habe ich mich vertan. Beim CAME_TOP_432EV_EE ist es super simpel, Du hast %signal_parts nicht je subtest neu abgeholt.
Beim Chilitec_22640_AA80 muss es was anderes sein.
dummyDuino (
{
my $devicename = "Buttons_five_E";
subtest "Checking $devicename" => sub {
my $rmsg="MU;P0=250;P1=-492;P2=166;P3=-255;P4=491;P5=-8588;D=052121212121234121212121234521212121212341212121212345212121212123412121212123452121212121234121212121234;CP=0;";
my %signal_parts=SIGNALduino_Split_Message($rmsg,$targetHash->{NAME});
plan tests => 2;
CommandDefMod(undef,"-temporary Buttons_five_E SD_UT Buttons_five E");
SIGNALduino_Parse_MU($targetHash, $targetHash, $targetHash->{NAME}, $rmsg,%signal_parts);
is(ReadingsVal($devicename ,"state","0"),"fan_off","check state reading");
is(ReadingsVal($devicename ,"deviceCode","0"),"1110 (off|off|off|on)","check deviceCode reading");
sleep 3;
};
my $devicename = "CAME_TOP_432EV_EE";
subtest "Checking $devicename" => sub {
my $rmsg = "MU;P0=-322;P1=136;P2=-15241;P3=288;P4=-735;P6=723;D=0123434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430;CP=3;R=27;";
my %signal_parts=SIGNALduino_Split_Message($rmsg,$targetHash->{NAME});
plan tests => 2;
CommandDefMod(undef,"-temporary CAME_TOP_432EV_EE SD_UT CAME_TOP_432EV EE");
SIGNALduino_Parse_MU($targetHash, $targetHash, $targetHash->{NAME}, $rmsg,%signal_parts);
is(ReadingsVal($devicename ,"state","0"),"left_button","check state reading");
is(ReadingsVal($devicename ,"deviceCode","0"),"11101110","check deviceCode reading");
sleep 3;
};
my $devicename = "Chilitec_22640_AA80";
subtest "Checking $devicename" => sub {
my $rmsg = "MS;P0=988;P1=-384;P2=346;P3=-1026;P4=-4923;D=240123012301230123012323232323232301232323;CP=2;SP=4;R=0;O;m=1;";
my %signal_parts=SIGNALduino_Split_Message($rmsg,$targetHash->{NAME});
plan tests => 2;
CommandDefMod(undef,"-temporary Chilitec_22640_AA80 SD_UT Chilitec_22640 AA80");
SIGNALduino_Parse_MU($targetHash, $targetHash, $targetHash->{NAME}, $rmsg,%signal_parts);
is(ReadingsVal($devicename ,"state","0"),"power_on","check state reading");
is(ReadingsVal($devicename ,"deviceCode","0"),"1010101010000000","check deviceCode reading");
sleep 3;
}
};
);
@sidey79
nutze bitte mal die Testvorlage von dem hier https://github.com/fhem/UnitTest/issues/5#issuecomment-565850027
Da mache ich alle Befehle immer wieder gleich.
Ich kann bestätigen das es bei Chilitec_22640_AA80 nicht geht, aber bei den anderen JA. Nicht das im Modul ein Fehler vorliegt.... deswegen kam mit die Idee da was zu basteln. Das würde aber dem wiedersprechen, wenn ich manuell dispatche, das es da ankommt.
EDIT!!! HALT BITTE !!!!!!!!!!!!!!
SIGNALduino_Parse_MU($targetHash, $targetHash, $targetHash->{NAME}, $devices{$key}->{rmsg},%signal_parts);
geht bei MS nachrichten nicht grins
Ja das wollte ich dir auch gerade vorschlagen besser mal
SIGNALduino_Parse($targetHash, $targetHash, $targetHash->{NAME}, $devices{$key}->{rmsg});
zu verwenden. Da ist aber noch was. Moment....
Es muss "andere" Zusammenhänge nich geben wieso ein Event ausgelöst wird und wieso nicht. Der Test läuft nun Fehlerfrei mit den gewünschten Ergebnissen aber auf einmal erhalte ich bei keinem mehr eine Eventauslösung.
Am besten wäre es, wenn Du vor dem define ein delete auf das device machst. Dann hast Du immer die exakt gleiche Ausgangslage.
Da wird nichts dispatcht, da Du was dereferenzierst was keine Referenzen sind.
$devices{$key}->{deviceCode}
muss in $devices{$key}{deviceCode}
geändert werden.
usw.
Aber auch dann, funktioniert nur der 1. Test. Bei mir ist das der Chilitec_22640_AA80. Vielleicht klappt das mit der Schleife und dem subtest nicht.
dummyDuino (
{
my %devices = (
"Buttons_five_E" => { "DEF" => "Buttons_five E",
"rmsg" => "MU;P0=250;P1=-492;P2=166;P3=-255;P4=491;P5=-8588;D=052121212121234121212121234521212121212341212121212345212121212123412121212123452121212121234121212121234;CP=0;",
"state" => "fan_off",
"deviceCode" => "1110 (off|off|off|on)",
"plan" => 2 },
"CAME_TOP_432EV_EE" => { "DEF" => "CAME_TOP_432EV EE",
"rmsg" => "MU;P0=-322;P1=136;P2=-15241;P3=288;P4=-735;P6=723;D=0123434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430623434343064343430643434306234343430643434306434343062343434306434343064343430;CP=3;R=27;",
"state" => "left_button",
"plan" => 2
},
"Chilitec_22640_AA80" => { "DEF" => "Chilitec_22640 AA80",
"rmsg" => "MS;P0=988;P1=-384;P2=346;P3=-1026;P4=-4923;D=240123012301230123012323232323232301232323;CP=2;SP=4;R=0;O;m=1;",
"state" => "power_on",
"plan" => 1
},
);
for my $key (keys %devices) {
subtest "Checking $key" => sub {
plan => $devices{$key}{plan} if (exists($devices{$key}{plan}));
CommandDefMod(undef,"-temporary $key SD_UT ".$devices{$key}{DEF});
SIGNALduino_Parse($targetHash, $targetHash, $targetHash->{NAME}, "\002".$devices{$key}{rmsg}."\003");
is(ReadingsVal($key ,"state","0"),$devices{$key}{state},"check state reading");
is(ReadingsVal($key ,"deviceCode","0"),$devices{$key}{deviceCode},"check deviceCode reading") if ($devices{$key}{deviceCode});
}
} };
);
So klappt es
Ich habe noch einen plan mit eingebaut. Das könnte man aber auch dynamisch ausrechnen
Cool, besten Dank.
Ich vervollständige den Test und werde ihn auch hochladen ins Testverzeichnis. Ob wir Ihn dann einbinden würde ich später nochmal besprechen.
Er wird notwenidg, das wir das Modul ständig überwachen bei der Vielfalt denke ich nun.
Wenn er im Testverzeichnis gefunden wird, dann wird er auch angewendet.
Da sollte nichts gegen sprechen.
Muss der Dummyname dann noch speziell definiert werden oder automatisch ausgelesen werden? Ein fester Wert ist ja dann verkehrt.
Eine Definition namens dummyDuino ist in der Testumgebung bereits angelegt.
Gut, dann hätten wir das erstmal hier durch und können zum Tagesgeschäft wechseln. :-)
Thx
Wenn Du aber eh komplett neu anfängst, würde ich dir die Test2 Suite empfehlen :)
Die ist ein bisschen weiter entwickelt als Test::More.
TESTCODE:
Testergebnisse stimmen aber ...