FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Sailor am 16 Januar 2022, 20:45:59

Titel: Seltsames Resultat im notify
Beitrag von: Sailor am 16 Januar 2022, 20:45:59
Ein herzerfrischendes "Moin" vom achtern Diek vorweg!

Ich habe eine kleine Entdeckung beim Programmieren eines notifys gemacht, wo ich mal Eure Einschaetzung brauche ob das ein Bug oder Feature ist.

Ich moechte mit einem notify in einem String (und letztendliches im Reading)  folgenden Eintrag haben:

<table style="table-layout:fixed; border=1px; cellpadding=3; width=100%;" >

Dies habe ich mit folgenden Codes versucht zu realisieren:


my $htmlString = "<table style=\"table-layout:fixed; border=1px; cellpadding=3; width=100%;\" >";
my $htmlString = "<table style=\"table-layout:fixed\; border=1px\; cellpadding=3\; width=100%\;\" >";
my $htmlString = "<table style=\"table-layout:fixed" . chr(59) . "border=1px" . chr(59) . " cellpadding=3" . chr(59) . " width=100%" . chr(59) . "\" >";
my $htmlString = '<table style=\"table-layout:fixed; border=1px; cellpadding=3; width=100%; \">';


Alle Varianten spucken mir lediglich
<table style="table-layout:fixed
aus, weil das erste Semikolon als Perl - Delimiter interpretiert wird.

Wie bekomme ich den Perl-Interpreter dazu, das Semikolon im String zu ignorieren?

Wer an dem ganzen Code interessiert ist - Er liest 4 fhem-Calender--Device ein und stellt die naechsten 30 Tage tabelarisch dar.
Die Variante unten funktioniert, da ich das obige Problem dort noch nicht eingearbeitet habe.


UI_Calendar_..:lastUpdate.* {

Log 5, "UI_CalendarUpdate - ____________________________________________________";

my @CalendarDeviceList = ("UI_Calendar_MD","UI_Calendar_DD", "UI_Calendar_LD", "UI_Calendar_BD");

my $htmlString = "
<table border=\"1px\" cellpadding=\"3\" width=\"100%\" style=\"table-layout:fixed\">";


my @Month   = ("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December");
my @WeekDay = ("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

$htmlString .= "
<tr><td align=center style=\"font-size:20px\" width=\"7%\"><b>Date</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Papa</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Mama</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Sohn</b></td><td align=center style=\"font-size:20px\" width=\"20%\"><b>Tochter</b></td></tr>";

#For each table row
for (my $i = 0; $i < 32; $i++) {

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+(24*60*60*$i));


if ($wday == 0) {
$htmlString .= "
<tr><td align=right style=\"background-color:#ff0000\" style=\"word-break:break-all\">"
}

else {
$htmlString .= "
<tr><td align=right                                    style=\"word-break: break-all\">"
}


$htmlString .= $WeekDay[$wday] . ",<BR>" . sprintf("%02d", $mday) . "." . sprintf("%02d", ($mon+1)) . "." . sprintf("%04d", ($year+1900)) . "</td>";

# For each Calendar perform
foreach my $CurrentCalendar ( @CalendarDeviceList ) {

my $CalItem = fhem("get ". $CurrentCalendar . " events timeFormat:\"%H:%M\" format:text limit:when=" . $i . " format:custom=\"\$T1 \$D \$S\"" ,1);
my $CalItemString;

if (defined($CalItem)) {
my @CalItemsList = split("\n", $CalItem);

foreach my $CalItemsListEntry ( @CalItemsList ) {

my @CalItemsListEntrySplitoff = split(" ", $CalItemsListEntry);

if (($CalItemsListEntrySplitoff[0] eq "00:00") && (($CalItemsListEntrySplitoff[1] eq ("24h")) || ($CalItemsListEntrySplitoff[1] eq ("48h"))|| ($CalItemsListEntrySplitoff[1] eq ("72h")))) {

splice(@CalItemsListEntrySplitoff, 0, 2);
$CalItemString .= "AllDay: ";
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
else {
splice(@CalItemsListEntrySplitoff, 1, 1);
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
}
}
else {
$CalItemString = " ";
}

if ($wday == 0) {
$htmlString .= "<td align=left style=\"background-color:#ff0000\" style=\"word-break: break-all\">"
}
else {
$htmlString .= "<td align=left style=\"word-break: break-all\">"
}

$htmlString .= $CalItemString;
$htmlString .= "</td>";

}

$htmlString .= "</tr>";
}

$htmlString .= "</table>";

fhem("set UI_Calendar_All " . $htmlString);

return();
}


Gruß
    Sailor

Titel: Antw:Seltsames Resultat im notify
Beitrag von: DS_Starter am 16 Januar 2022, 20:58:44
Hmm..... Weiterer Versuch mit:


my $htmlString = qq{<table style="table-layout:fixed; border=1px; cellpadding=3; width=100%;">};


Ansonsten würde ich alles in eine sub in 99_myUtlis packen und nur die sub aufrufen. Würde sich vermutlich
ohnehin anbieten.

LG,
Heiko
Titel: Antw:Seltsames Resultat im notify
Beitrag von: TomLee am 16 Januar 2022, 21:02:39
"Innen" muss man die Semikola verdoppeln und wenn  man innen doppelte Quotes verwendet müssen die aussen einfache Quotes sein, ausser du hast innen eine Varable die aufgelöst werden muss, dann könnte man qq() verwenden.

Beide Varianten sollten mMn. klappen:

{ my $htmlString = q(<table style="table-layout:fixed;; border=1px;; cellpadding=3;; width=100%;;" >);; return $htmlString;;}

{ my $htmlString = '<table style="table-layout:fixed;; border=1px;; cellpadding=3;; width=100%;;" >';; return $htmlString;;}


Gruß

Thomas

edit:

Man muss die Semikola nur in der Kommandozeile verdoppeln, in der myUtils reichen einfache.

Titel: Antw:Seltsames Resultat im notify
Beitrag von: rudolfkoenig am 16 Januar 2022, 23:41:32
Meiner Meinung nach sollte alles was laenger als eine Zeile ist, oder mehrere Semikola beinhaltet, als Funktion in 99_myUtils.pm definiert werden. Syntax-Fehler sind in so verstaendlicher, und man muss nicht ueber Newline oder verdoppelte Semikola nachdenken. Selbst das Testen ist (etwas) einfacher.
Titel: Antw:Seltsames Resultat im notify
Beitrag von: Sailor am 18 Januar 2022, 11:03:37
Moin zusammen

Danke für Eure Hilfe.

Habe den Code zwar in die 99_myUtils.pm ausgelagert, aber selbst dort muss man
my $htmlString = "<table style=\"width:100%;; table-layout:fixed;;\">";

verwenden um folgendes zu erhalten:
<table style="width:100%; table-layout:fixed;">

Gruß
    Sailor
Titel: Antw:Seltsames Resultat im notify
Beitrag von: betateilchen am 18 Januar 2022, 12:33:26
Hallo Herr Nachbar,

kann es sein, dass Du Dir das Leben mal wieder unnötig schwer machst?


sub test {
my $htmlString = '<table style="width:100%; table-layout:fixed;">';
Debug $htmlString;
}


Das liefert mir im Logfile

DEBUG><table style="width:100%; table-layout:fixed;">
Titel: Antw:Seltsames Resultat im notify
Beitrag von: Sailor am 18 Januar 2022, 14:41:31
Auch Hallo Herr Nachbar  ;)

Zitat von: betateilchen am 18 Januar 2022, 12:33:26
Hallo Herr Nachbar,
kann es sein, dass Du Dir das Leben mal wieder unnötig schwer machst?

sub test {
my $htmlString = '<table style="width:100%; table-layout:fixed;">';
Debug $htmlString;
}


Das liefert mir im Logfile
DEBUG><table style="width:100%; table-layout:fixed;">

Warum einfach, wenn es klombisiert geht?  ;D

Wie oben schon beschrieben hat in meinem Versuch oben 'Bla;Bla' auch nur zu Bla gefuehrt.

Aber es funktioniert ja jetzt.

Anbei der Code für neugierige


###START########## Create TimeTable html Code ####################################################################START###
sub CodeTimetable() {

Log 5, "UI_CalendarUpdate - ____________________________________________________";

my @CalendarDeviceList = ("UI_Calendar_MD","UI_Calendar_DD", "UI_Calendar_LD", "UI_Calendar_BD");

my $htmlString = "
<table style=\"width:100%;; table-layout:fixed;;\">
";


my @Month   = ("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "Oktober", "November", "December");
my @WeekDay = ("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

$htmlString .= "
<tr>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=12%;; word-break:break-word;;\"><b>Date</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Papa</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Mama</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Sohn</b></td>
<td align=center style=\"border:1px solid;; padding:3px;; font-size:20px;; width=22%;; word-break:break-word;;\"><b>Tochter</b></td>
</tr>";

#For each table row
for (my $i = 0; $i < 32; $i++) {

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time+(24*60*60*$i));


if ($wday == 0) {
$htmlString .= "
<tr><td style=\"background-color:#ff0000;; border:1px solid;; padding:3px;; align:right;; word-break:break-word;;\">"
}

else {
$htmlString .= "
<tr><td <td style=\"                       border:1px solid;; padding:3px;; align:right;; word-break:break-word;;\">"
}


$htmlString .= $WeekDay[$wday] . ",<BR>" . sprintf("%02d", $mday) . "." . sprintf("%02d", ($mon+1)) . "." . sprintf("%04d", ($year+1900)) . "</td>";

# For each Calendar perform
foreach my $CurrentCalendar ( @CalendarDeviceList ) {

my $CalItem = fhem("get ". $CurrentCalendar . " events timeFormat:\"%H:%M\" format:text limit:when=" . $i . " format:custom=\"\$T1 \$D \$S\"" ,1);
my $CalItemString;

if (defined($CalItem)) {
my @CalItemsList = split("\n", $CalItem);

foreach my $CalItemsListEntry ( @CalItemsList ) {

my @CalItemsListEntrySplitoff = split(" ", $CalItemsListEntry);

if (($CalItemsListEntrySplitoff[0] eq "00:00") && (($CalItemsListEntrySplitoff[1] eq ("24h")) || ($CalItemsListEntrySplitoff[1] eq ("48h"))|| ($CalItemsListEntrySplitoff[1] eq ("72h")))) {

splice(@CalItemsListEntrySplitoff, 0, 2);
$CalItemString .= "AllDay: ";
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
else {
splice(@CalItemsListEntrySplitoff, 1, 1);
$CalItemString .= join(" ", @CalItemsListEntrySplitoff) . "<BR>";
}
}
}
else {
$CalItemString = " ";
}

if ($wday == 0) {
$htmlString .= "<td style=\"background-color:#ff0000;; border:1px solid;; padding:3px;; align:left;; word-break:break-word;;\">"
}
else {
$htmlString .= "<td style=\"                           border:1px solid;; padding:3px;; align:left;; word-break:break-word;;\">"
}

$htmlString .= $CalItemString;
$htmlString .= "</td>";

}

$htmlString .= "</tr>";
}

$htmlString .= "</table>";

fhem("set UI_Calendar_All " . $htmlString);

return();


}
####END########### Create TimeTable html Code #####################################################################END####



Liefert im dummy UI_Calendar_All einen html - String, der eine 30 Tage im voraus schauende Tabelle mit allen Calender Items anzeigt.

Gruß
    Sailor
Titel: Antw:Seltsames Resultat im notify
Beitrag von: betateilchen am 18 Januar 2022, 15:29:06
Zitat von: Sailor am 18 Januar 2022, 14:41:31
Wie oben schon beschrieben hat in meinem Versuch oben 'Bla;Bla' auch nur zu Bla gefuehrt.

kann man glauben, muss man aber nicht  8)
Titel: Antw:Seltsames Resultat im notify
Beitrag von: TomLee am 18 Januar 2022, 16:34:18
Ich habs nicht nochmal ausprobiert aber ich bleib bei meiner Meinung das du überall wo du den HTML-Code anhängst und dazu aussen doppelte Anführungszeichen verwendest ganz simpel einfache Anführungszeichen verwenden kannst und dir "innen" das verdoppeln der Semikola und das escapen der doppelten Anführungszeichen sparst.

Du könntest auch in dem Rest vom Code, ausnahmslos mein ich (habs nur überflogen), überall dort wo du doppelte Quotes verwendet hast, einfache nehmen.