ABFALL_getEvents.pm 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. # $Id: ABFALL_getEvents.pm 11023 2018-06-13 12:34:34Z uniqueck $
  2. # *** WARNING: DO NOT MODIFY *** This is a generated Perl source code!
  3. #
  4. # Generated by LF-ET 2.1.5 (171120a), http://www.lohrfink.de/lfet
  5. # From decision table
  6. # "/data/github/fhem/fhem-abfall/lfet/ABFALL_getEvents.lfet"
  7. # 13.06.2018 12:33
  8. #
  9. # Changes to this code resulting from refactorings can be synchronised
  10. # with LF-ET using the function "Scrapbook Import".
  11. #
  12. # Prolog Decision Table ---->
  13. package main;
  14. use strict;
  15. use warnings;
  16. use POSIX;
  17. use Time::Local;
  18. use Time::Piece;
  19. sub ABFALL_getEvents_Initialize($$)
  20. {
  21. my ($hash) = @_;
  22. }
  23. sub ABFALL_getEvents_skipEvent($@) {
  24. my ($hash, @val) = @_;
  25. my $event = join(' ', @val);
  26. my $name = $hash->{NAME};
  27. my $skip = 0;
  28. my $filter = AttrVal($name,"filter","");
  29. if ($filter ne "") {
  30. # skip event of filter conditions - start
  31. my @filterArray=split( ',' ,$filter);
  32. foreach my $eachFilter (@filterArray) {
  33. # fix from fhem forum user justme1968 to support regex for filter
  34. Log3 $name, 5, "skipEvent($name) - event($event) - filter($eachFilter)";
  35. if ($eachFilter =~ m'^/(.*)/$' && $event =~ m/$1/ ) {
  36. $skip = 1;
  37. } elsif (index($event, $eachFilter) != -1) {
  38. $skip = 1;
  39. }
  40. } # end foreach
  41. } # end if filter
  42. # skip event of filter conditions - end
  43. Log3 $name, 5, "skipEvent($name) - $event" if ($skip);
  44. return $skip;
  45. } # end skipEvent
  46. sub ABFALL_getEvents($) {
  47. my ($hash) = @_;
  48. my @terminliste ;
  49. my $name = $hash->{NAME};
  50. my @calendernamen = split( ",", $hash->{KALENDER});
  51. my $calendername = "";
  52. my $uid = "";
  53. my @termine;
  54. my @starts;
  55. my @summarys;
  56. my @locations;
  57. my @descriptions;
  58. my $cleanReadingRegex = AttrVal($name,"abfall_clear_reading_regex","");
  59. my $calendarNamePraefix = AttrVal($name,"calendarname_praefix","1");
  60. my %replacement = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss" );
  61. my $replacementKeys= join ("|", keys(%replacement));
  62. my $wdMapping = AttrVal($name,"weekday_mapping","Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag");
  63. my $date_style = AttrVal($name, "date_style","date");
  64. my @days = split("\ ", $wdMapping);
  65. Log3 $name, 5, "ABFALL_getEvents($name) - weekDayMapping ($wdMapping)" ;
  66. my $calIndex = 0;
  67. my $eventIndex = 0;
  68. my $startTimeIndex = 0;
  69. my $step = 1;
  70. # to search for a event with same summary
  71. my $foundItem = ();
  72. while ($step != -1) {
  73. # Prolog Decision Table <----
  74. # Condition C01/01: step / 1 / calendar step
  75. if (
  76. $step eq 1
  77. )
  78. {
  79. # Condition C02: has more calendars
  80. if (
  81. $calIndex < scalar(@calendernamen)
  82. )
  83. {
  84. # Rule R01 ---->
  85. # Trace ---->
  86. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 1, 19";
  87. # Trace <----
  88. # Action A01: next calendar
  89. $calendername = $calendernamen[$calIndex];
  90. $calIndex++;
  91. # Action A04: get next uids for events
  92. @termine = split(/\n/,CallFn($calendername, "GetFn", $defs{$calendername},("-", 'events', 'format:custom="$U"', 'series:next')));
  93. $eventIndex = 0;
  94. my $size = scalar(@termine);
  95. Log3 $name, 5, "ABFALL_getEvents($name) - size of events: $size";
  96. # Action A13/02: step / 2 / event step
  97. $step = 2;
  98. # Rule R01 <----
  99. }
  100. else
  101. {
  102. # Rule R02 ---->
  103. # Trace ---->
  104. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 2, 19";
  105. # Trace <----
  106. # Action A12: sort list of events
  107. Log3 $name, 5, "Vor Sortieren";
  108. foreach my $a (@terminliste) {
  109. Log3 $name, 5, $a->{readingName};
  110. }
  111. @terminliste = sort {$a->{readingName} cmp $b->{readingName}} @terminliste;
  112. Log3 $name, 5, "Nach Sortieren";
  113. foreach my $a (@terminliste) {
  114. Log3 $name, 5, $a->{readingName};
  115. }
  116. # Action A13/01: step / E / end step
  117. $step = -1;
  118. # Rule R02 <----
  119. }
  120. # Condition C01/02: step / 2 / event step
  121. }
  122. elsif (
  123. $step eq 2
  124. )
  125. {
  126. # Condition C03: has more events
  127. if (
  128. $eventIndex < scalar(@termine)
  129. )
  130. {
  131. # Rule R03 ---->
  132. # Trace ---->
  133. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 3, 19";
  134. # Trace <----
  135. # Action A02: next uid
  136. $uid = $termine[$eventIndex];
  137. $eventIndex++;
  138. Log3 $name,5,"ABFALL_getEvents - next uid : $uid";
  139. $startTimeIndex = 0;
  140. # Action A05: get start times for uid
  141. @starts = split(/\n/,CallFn($calendername, "GetFn", $defs{$calendername},("-","events", 'format:custom="$T1"', 'filter:uid=="'.$uid.'"')));
  142. # Action A06: get summaries for uid
  143. @summarys = split(/\n/,CallFn($calendername, "GetFn", $defs{$calendername},("-","events", 'format:custom="$S"', 'filter:uid=="'.$uid.'"')));
  144. # Action A07: get locations for uid
  145. @locations = split(/\n/, CallFn($calendername, "GetFn", $defs{$calendername},("-","events", 'format:custom="$L"', 'filter:uid=="'.$uid.'"')));
  146. # Action A08: get descriptions for uid
  147. @descriptions = split(/\n/, CallFn($calendername, "GetFn", $defs{$calendername},("-","events", 'format:custom="$DS"', 'filter:uid=="'.$uid.'"')));
  148. # Action A13/03: step / 3 / start time step
  149. $step = 3
  150. # Rule R03 <----
  151. }
  152. else
  153. {
  154. # Rule R04 ---->
  155. # Trace ---->
  156. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 4, 19";
  157. # Trace <----
  158. # Action A13/04: step / 1 / calendar step
  159. $step = 1
  160. # Rule R04 <----
  161. }
  162. # Condition C01/03: step / 3 / start time step
  163. }
  164. elsif (
  165. $step eq 3
  166. )
  167. {
  168. # Condition C04: has more start times
  169. if (
  170. $startTimeIndex < scalar(@starts)
  171. )
  172. {
  173. # Rule R05 ---->
  174. # Trace ---->
  175. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 5, 19";
  176. # Trace <----
  177. # Action A03: next start time
  178. $startTimeIndex++;
  179. # Action A13/05: step / 4 / check start time step
  180. $step = 4;
  181. # Rule R05 <----
  182. }
  183. else
  184. {
  185. # Rule R06 ---->
  186. # Trace ---->
  187. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 6, 19";
  188. # Trace <----
  189. # Action A13/02: step / 2 / event step
  190. $step = 2;
  191. # Rule R06 <----
  192. }
  193. # Condition C01/04: step / 4 / check start time step
  194. }
  195. elsif (
  196. $step eq 4
  197. )
  198. {
  199. # Condition C05: is actual start time valid
  200. if (
  201. defined($starts[$startTimeIndex - 1]) && !($starts[$startTimeIndex - 1] eq '')
  202. )
  203. {
  204. # Prolog Condition C06 ---->
  205. my @SplitDt = split(/ /,$starts[$startTimeIndex - 1]);
  206. my @SplitDate = split(/\./,$SplitDt[0]);
  207. my @SplitTime = split(/\:/,$SplitDt[1]);
  208. my $eventDate = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
  209. my $dayDiff = floor(($eventDate - time) / 60 / 60 / 24 + 1);
  210. # Prolog Condition C06 <----
  211. # Condition C06: is start time in the past
  212. if (
  213. $dayDiff < 0
  214. )
  215. {
  216. # Rule R07 ---->
  217. # Trace ---->
  218. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 7, 19";
  219. # Trace <----
  220. # Action A13/03: step / 3 / start time step
  221. $step = 3
  222. # Rule R07 <----
  223. }
  224. else
  225. {
  226. # Condition C07: is filter defined
  227. if (
  228. AttrVal($name, "filter", "") ne ""
  229. )
  230. {
  231. # Condition C08: filter type = include
  232. if (
  233. AttrVal($name,"filter_type","include") eq "include"
  234. )
  235. {
  236. # Condition C09: match filter
  237. if (
  238. ABFALL_getEvents_skipEvent($hash,$summarys[$startTimeIndex - 1])
  239. )
  240. {
  241. # Condition C10: clean summary with regex
  242. if (
  243. $cleanReadingRegex
  244. )
  245. {
  246. # Rule R08 ---->
  247. # Trace ---->
  248. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 8, 19";
  249. # Trace <----
  250. # Action A09: clean summary with regex
  251. $summarys[$startTimeIndex-1] =~ s/$cleanReadingRegex//g;
  252. # Action A13/06: step / 5 / search for duplicate step
  253. $step = 5;
  254. # Rule R08 <----
  255. }
  256. else
  257. {
  258. # Rule R09 ---->
  259. # Trace ---->
  260. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 9, 19";
  261. # Trace <----
  262. # Action A13/06: step / 5 / search for duplicate step
  263. $step = 5;
  264. # Rule R09 <----
  265. }
  266. }
  267. else
  268. {
  269. # Rule R10 ---->
  270. # Trace ---->
  271. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 10, 19";
  272. # Trace <----
  273. # Action A13/03: step / 3 / start time step
  274. $step = 3
  275. # Rule R10 <----
  276. }
  277. }
  278. else
  279. {
  280. # Condition C09: match filter
  281. if (
  282. ABFALL_getEvents_skipEvent($hash,$summarys[$startTimeIndex - 1])
  283. )
  284. {
  285. # Rule R11 ---->
  286. # Trace ---->
  287. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 11, 19";
  288. # Trace <----
  289. # Action A13/03: step / 3 / start time step
  290. $step = 3
  291. # Rule R11 <----
  292. }
  293. else
  294. {
  295. # Condition C10: clean summary with regex
  296. if (
  297. $cleanReadingRegex
  298. )
  299. {
  300. # Rule R12 ---->
  301. # Trace ---->
  302. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 12, 19";
  303. # Trace <----
  304. # Action A09: clean summary with regex
  305. $summarys[$startTimeIndex-1] =~ s/$cleanReadingRegex//g;
  306. # Action A13/06: step / 5 / search for duplicate step
  307. $step = 5;
  308. # Rule R12 <----
  309. }
  310. else
  311. {
  312. # Rule R13 ---->
  313. # Trace ---->
  314. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 13, 19";
  315. # Trace <----
  316. # Action A13/06: step / 5 / search for duplicate step
  317. $step = 5;
  318. # Rule R13 <----
  319. }
  320. }
  321. }
  322. }
  323. else
  324. {
  325. # Condition C10: clean summary with regex
  326. if (
  327. $cleanReadingRegex
  328. )
  329. {
  330. # Rule R14 ---->
  331. # Trace ---->
  332. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 14, 19";
  333. # Trace <----
  334. # Action A09: clean summary with regex
  335. $summarys[$startTimeIndex-1] =~ s/$cleanReadingRegex//g;
  336. # Action A13/06: step / 5 / search for duplicate step
  337. $step = 5;
  338. # Rule R14 <----
  339. }
  340. else
  341. {
  342. # Rule R15 ---->
  343. # Trace ---->
  344. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 15, 19";
  345. # Trace <----
  346. # Action A13/06: step / 5 / search for duplicate step
  347. $step = 5;
  348. # Rule R15 <----
  349. }
  350. }
  351. }
  352. }
  353. else
  354. {
  355. # Rule R16 ---->
  356. # Trace ---->
  357. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 16, 19";
  358. # Trace <----
  359. # Action A13/03: step / 3 / start time step
  360. $step = 3
  361. # Rule R16 <----
  362. }
  363. }
  364. else
  365. {
  366. # Prolog Condition C11 ---->
  367. $foundItem = ();
  368. foreach my $item (@terminliste ){
  369. my $tempText= $item->{summary};
  370. my $tempCalName= $item->{calendar};
  371. my $actualText = "";
  372. if (defined($summarys[$startTimeIndex - 1])) {
  373. $actualText = $summarys[$startTimeIndex - 1];
  374. $actualText =~ s/\\,/,/g;
  375. }
  376. if ($tempText eq $actualText && $tempCalName eq $calendername) {
  377. $foundItem = $item;
  378. }
  379. last if ($foundItem);
  380. }
  381. # Prolog Condition C11 <----
  382. # Condition C11: is event with summary present
  383. if (
  384. $foundItem
  385. )
  386. {
  387. # Prolog Condition C12 ---->
  388. my @SplitDt = split(/ /,$starts[$startTimeIndex - 1]);
  389. my @SplitDate = split(/\./,$SplitDt[0]);
  390. my @SplitTime = split(/\:/,$SplitDt[1]);
  391. my $eventDate = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
  392. my $dayDiff = floor(($eventDate - time) / 60 / 60 / 24 + 1);
  393. # Prolog Condition C12 <----
  394. # Condition C12: is event start newer than founded event
  395. if ($dayDiff < $foundItem->{days} && $eventDate > time)
  396. {
  397. # Rule R17 ---->
  398. # Trace ---->
  399. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 17, 19";
  400. # Trace <----
  401. # Action A11: update existing event
  402. my $eventLocation = "";
  403. if (defined($locations[$startTimeIndex - 1])) {
  404. $eventLocation = $locations[$startTimeIndex - 1];
  405. }
  406. my $eventDescription = "";
  407. if (defined($descriptions[$startTimeIndex - 1])) {
  408. $eventDescription = $descriptions[$startTimeIndex - 1];
  409. }
  410. my @SplitDt = split(/ /,$starts[$startTimeIndex - 1]);
  411. my @SplitDate = split(/\./,$SplitDt[0]);
  412. my @SplitTime = split(/\:/,$SplitDt[1]);
  413. my $eventDate = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
  414. my $eventDateFormatted = $SplitDt[0];
  415. if ($date_style eq "dateTime") {
  416. $eventDateFormatted = $SplitDt[0] . " " . $SplitDt[1];
  417. }
  418. my $dayDiff = floor(($eventDate - time) / 60 / 60 / 24 + 1);
  419. my $weekday = (localtime($eventDate))[6];
  420. my $wdayname = $days[$weekday];
  421. $foundItem->{uid} = $uid;
  422. $foundItem->{start} = $starts[$startTimeIndex - 1];
  423. $foundItem->{weekday} = $wdayname;
  424. $foundItem->{location} = $eventLocation;
  425. $foundItem->{description} = $eventDescription;
  426. $foundItem->{date} = $eventDate;
  427. $foundItem->{dateFormatted} = $eventDateFormatted;
  428. $foundItem->{days} = $dayDiff;
  429. # Action A13/03: step / 3 / start time step
  430. $step = 3
  431. # Rule R17 <----
  432. }
  433. else
  434. {
  435. # Rule R18 ---->
  436. # Trace ---->
  437. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 18, 19";
  438. # Trace <----
  439. # Action A13/03: step / 3 / start time step
  440. $step = 3
  441. # Rule R18 <----
  442. }
  443. }
  444. else
  445. {
  446. # Rule R19 ---->
  447. # Trace ---->
  448. Log3 $name, 5, "ABFALL_getEvents($name) - ABFALL_getEvents, 20180613.123304, 19, 19";
  449. # Trace <----
  450. # Action A10: put new event
  451. my $cleanReadingName = $summarys[$startTimeIndex - 1];
  452. if ($calendarNamePraefix) {
  453. $cleanReadingName = $calendername . "_" . $cleanReadingName;
  454. }
  455. # prepare reading name from summary of event
  456. $cleanReadingName =~ s/($replacementKeys)/$replacement{$1}/eg;
  457. $cleanReadingName =~ tr/a-zA-Z0-9\-_//dc;
  458. $summarys[$startTimeIndex - 1] =~ s/\\,/,/g;
  459. $cleanReadingName =~ s/\\,/,/g;
  460. my $eventLocation = "";
  461. if (defined($locations[$startTimeIndex - 1])) {
  462. $eventLocation = $locations[$startTimeIndex - 1];
  463. }
  464. my $eventDescription = "";
  465. if (defined($descriptions[$startTimeIndex - 1])) {
  466. $eventDescription = $descriptions[$startTimeIndex - 1];
  467. }
  468. my @SplitDt = split(/ /,$starts[$startTimeIndex - 1]);
  469. my @SplitDate = split(/\./,$SplitDt[0]);
  470. my @SplitTime = split(/\:/,$SplitDt[1]);
  471. my $eventDate = timelocal($SplitTime[2],$SplitTime[1],$SplitTime[0],$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
  472. my $eventDateFormatted = $SplitDt[0];
  473. if ($date_style eq "dateTime") {
  474. $eventDateFormatted = $SplitDt[0] . " " . $SplitDt[1];
  475. }
  476. my $dayDiff = floor(($eventDate - time) / 60 / 60 / 24 + 1);
  477. my $weekday = (localtime($eventDate))[6];
  478. my $wdayname = $days[$weekday];
  479. Log3 $name, 5, "ABFALL_getEvents($name) - calendar($calendername) - uid($uid) - start($starts[$startTimeIndex - 1]) - days($dayDiff) - text($summarys[$startTimeIndex - 1]) - location($eventLocation) - description($eventDescription) - readingName($cleanReadingName)";
  480. push @terminliste, {
  481. uid => $uid,
  482. start => $starts[$startTimeIndex - 1],
  483. weekday => $wdayname,
  484. summary => $summarys[$startTimeIndex - 1],
  485. location => $eventLocation,
  486. description => $eventDescription,
  487. readingName => $cleanReadingName,
  488. date => $eventDate,
  489. days => $dayDiff,
  490. calendar => $calendername,
  491. dateFormatted => $eventDateFormatted
  492. };
  493. # Action A13/03: step / 3 / start time step
  494. $step = 3
  495. # Rule R19 <----
  496. }
  497. }
  498. # Epilog Decision Table ---->
  499. } # end while
  500. return @terminliste;
  501. }
  502. 1;
  503. # Epilog Decision Table <----
  504. # End of generated Perl source code
  505. # Generated by LF-ET 2.1.5 (171120a), http://www.lohrfink.de/lfet