Und schon wieder Müllabfuhr-Visualisierung

Begonnen von Vize, 27 Juli 2015, 18:24:33

Vorheriges Thema - Nächstes Thema

BlackStone

#15
Zitat von: Vize am 16 August 2015, 13:15:39
Hallo zusammen,

hier noch mal auf die Schnelle meine Variante...

Als erstes lasse ich mir auch nur die Wochentage der Abholung in das dummy du_muelltermine schreiben, die maximal 7 Tage in der Zukunft liegen:
99_myUtils, Beispiel Papier
[......]
    if ($dayDiff >= 0 && $dayDiff <= 7) { fhem("setreading du_muelltermine Papiertonne_Tag $WoTag"); }
[...]


[....]
Gruß
Andreas

So ähnlich habe ich auch schon rum probiert, Lustigerweise wusste ich nicht das perl das && versteht. hab da nur mal hier und da in perl rumstubbert, und meist klappt das, bin eher auf php und c und vb unterwegs. ^^


edit:/

Jetzt habe ich es so wie es mir gefällt. ^^

in der fhem.cfg
define muellkalender Calendar ical file ./www/muellkalender.ics 86400
define no_muelltermine notify muellkalender:modeUpcoming.* { muelltermine("$EVENT") }
define du_muelltermine dummy
define muellabfuhr readingsGroup du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack\
du_muelltermine:Restmuell_dTag,Biotonne_dTag,Papiertonne_dTag,GelberSack_dTag
attr muellabfuhr nonames 1
attr muellabfuhr style style='text-align:center'
attr muellabfuhr valueFormat { return $VALUE if ( $VALUE ne '88');; return undef;; }
attr muellabfuhr valueIcon { Biotonne => 'dustbin@green', GelberSack => 'dustbin@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@black'}


in der 99_myUtils.pm

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use Time::Local;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my @days = qw/So Mo Di Mi Do Fr Sa/;


foreach my $uid (@uids) {




   my $Kalendertext = fhem("get muellkalender summary $uid");

   
   
   if ($Kalendertext =~ /Blaue Tonne/)
   {
      my $dt = fhem("get muellkalender start $uid");
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);;
      if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
      {
         $dtPapier = $eventDate;
         my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
         my $date = $SplitDt[0];
         my @date = split /\./,$date;
         my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
         my @date1 = split /\./,$SplitDt[0];
         my $wday1 = "$wday" . " : "  . "$date1[0]"."."."$date1[1]";
         if ($dayDiff >= 0 && $dayDiff <= 7) {
         fhem("setreading du_muelltermine Papiertonne $dayDiff");
         fhem("setreading du_muelltermine Papiertonne_dTag $wday1");
         }else{
         fhem("setreading du_muelltermine Papiertonne 88");
         fhem("setreading du_muelltermine Papiertonne_dTag 88");
         }
       }
   };
   if ($Kalendertext =~ /Gelbe Tonne/) {
      my $dt = fhem("get muellkalender start $uid");
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);;
      if ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
      {
         $dtGelberSack = $eventDate;
         my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
         my $date = $SplitDt[0];
         my @date = split /\./,$date;
         my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
         my @date1 = split /\./,$SplitDt[0];
         my $wday1 = "$wday" . " : "  . "$date1[0]"."."."$date1[1]";
        if ($dayDiff >= 0 && $dayDiff <= 7) {
         fhem("setreading du_muelltermine GelberSack $dayDiff");
         fhem("setreading du_muelltermine GelberSack_dTag $wday1");
         }else{
         fhem("setreading du_muelltermine GelberSack 88");
         fhem("setreading du_muelltermine GelberSack_dTag 88");
         }
       }
   };
   if ($Kalendertext =~ /Reststoff/) {
      my $dt = fhem("get muellkalender start $uid");
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);;
      if ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
      {
          $dtRestmuell = $eventDate;
          my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
          my $date = $SplitDt[0];
          my @date = split /\./,$date;
          my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
          my @date1 = split /\./,$SplitDt[0];
          my $wday1 = "$wday" . " : "  . "$date1[0]"."."."$date1[1]";
          if ($dayDiff >= 0 && $dayDiff <= 7) {
          fhem("setreading du_muelltermine Restmuell $dayDiff");
          fhem("setreading du_muelltermine Restmuell_dTag $wday1");
          }else{
          fhem("setreading du_muelltermine Restmuell 88");
          fhem("setreading du_muelltermine Restmuell_dTag 88");
          }
        }
   };
   if ($Kalendertext =~ /Biotonne/) {
      my $dt = fhem("get muellkalender start $uid");
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);;
      if ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
      {
         $dtBiomuell = $eventDate;
         my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
         my $date = $SplitDt[0];
         my @date = split /\./,$date;
         my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
         my @date1 = split /\./,$SplitDt[0];
         my $wday1 = "$wday" . " : "  . "$date1[0]"."."."$date1[1]";
         if ($dayDiff >= 0 && $dayDiff <= 7) {
         fhem("setreading du_muelltermine Biotonne $dayDiff");
         fhem("setreading du_muelltermine Biotonne_dTag $wday1");
         }else{
         fhem("setreading du_muelltermine Biotonne 88");
         fhem("setreading du_muelltermine Biotonne_dTag 88");
         }       
        };
   };
}
}

1;
 
die 88 da drin ist nur ein helferlein. und es werden die nächsten 7 tage angezeigt.

Vize

Zitat von: kvo1 am 16 August 2015, 19:23:24
Könnest Du mal Deine gesamte 99_myUtils posten ?

Moin und bitteschön...

Gruß
Andreas

Vize

#17
N'Abend,

möchte hier noch kurz meine angepasste Version zeigen, damit das Ganze nach meiner Vorstellung ausschaut...Danke nochmal an alle, die geholfen haben!!!

Folgender code nun in der 99_myUtils, um den Müllkalender auszuwerten und die kommenden Termine in das dummy du_muellabfuhr zu schreiben:
sub
KalenderDatum($$)
{
my ($KalenderName, $KalenderUid) = @_;
my $dt = fhem("get $KalenderName start $KalenderUid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
return $ret;
}

sub
muellabfuhr ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my $Wochentag = '';
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);

foreach my $uid (@uids)
{
  my $Kalendertext = fhem("get muellkalender summary $uid");
  if ($Kalendertext =~ /Papiertonne/)
  {
   my $eventDate = KalenderDatum('muellkalender', $uid);
   if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
   {
    $dtPapier = $eventDate;
    my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
    my $wd = (localtime $dtPapier)[6];
    $Wochentag = $wd;
    my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
    if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Papiertonne $dayDiff $WoTag"); }
   }
  };
  if ($Kalendertext =~ /Gelber Sack/)
  {
   my $eventDate = KalenderDatum('muellkalender', $uid);
   if ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
   {
    $dtGelberSack = $eventDate;
    my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
    my $wd = (localtime $dtGelberSack)[6];
    $Wochentag = $wd;
    my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
    if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr GelberSack $dayDiff $WoTag"); }
   }
  };
  if ($Kalendertext =~ /Restabfall/)
  {
   my $eventDate = KalenderDatum('muellkalender', $uid);
   if ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
   {
    $dtRestmuell = $eventDate;
    my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
    my $wd = (localtime $dtRestmuell)[6];
    $Wochentag = $wd;
    my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
    if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Restmuell $dayDiff $WoTag"); }
   }
  };
  if ($Kalendertext =~ /Biotonne/)
  {
   my $eventDate = KalenderDatum('muellkalender', $uid);
   if ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
   {
    $dtBiomuell = $eventDate;
    my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
    my $wd = (localtime $dtBiomuell)[6];
    $Wochentag = $wd;
    my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
    if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Biotonne $dayDiff $WoTag"); }
   }
  };
}
}


DEF des notifies no_muellabfuhr:
muellkalender:modeUpcoming.* { muellabfuhr("$EVENT") }

Das dummy-Device heißt du_muellabfuhr.

Und die readingsGroup rg_muellabfuhr mit folgenden Einstellungen:
DEF
du_muellabfuhr:.*

Attribute:
valueFormat
-> damit werden nur readings angezeigt, die einstellige Ziffern <= 7 besitzen, ergo nur die Termine der nächsten Woche
{ return $VALUE if ($VALUE =~ /\b[0-7]\b/); return undef; }

valueIcon
-> damit die entsprechenden Tonnensymbole gezeigt werden
{ Biotonne => 'dustbin@green', GelberSack => 'bag@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@grey' }

valuePrefix
-> damit (nur) der Wochentag vor dem Tonnensymbol steht
{ " ".(split / /, ReadingsVal ($DEVICE,$READING,0))[1]." " }

Dann sieht das alles wie im Anhang aus...

Vielleicht kan's ja jemand gebrauchen oder als Inspirationshilfe benutzen  ;)

Gruß
Andreas

Edit sagt: Zwei Sachen noch vergessen...
In der readingsGroup noch nonames und notime auf 1 setzen...

kvo1

Moin BlackStone/Vize,

Danke für Eure Hilfe!
ich glaube mein Problem ist der Aufbau meiner ics-Datei und somit die richtige Selektion der Daten
innerhalb der SUB ...
Hier mal ein Auszug.....aus der Datei

BEGIN:VEVENT
UID:20150714T000011CEST-0793B2l4hR@www.bsr.de
DTSTAMP:20150713T220010Z
CATEGORIES:BSR Abholung
DESCRIPTION:Abholung Hausmüll
DTSTART;VALUE=DATE:20150819
LOCATION:Hauptst. 110\,
SUMMARY:Abholung Hausmüll
END:VEVENT

Das ist (derzeit) noch recht einfach , gibt nur eine "Müllart" .

Habt Ihr ne Idee oder kann mir jemand (zum Nachsehen) seine ics Datei senden

... ich bin wild entschlossen.... muss doch irgendwie gehen.


danke
kvo1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

kvo1

Moin BlackStone/Vize,

:-[ Kaum macht man es richtig , schon geht es  ;)

habe das Beispiel von BlackStone genommen und meine "Müllbeschreibung" hinterlegt

if ($Kalendertext =~ /Abholung Hausmüll/)

und schon gibt es eine Tonne und das Datum "Mi : 19.08"

Bin schwer begeistert, jetzt mal Feintunning !

kvo1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

BlackStone

#20
so ist es mir auch am anfang gegangen, es wollte nix anzeigen. bis ich in der ics mit notepad++ herum gestöbert habe.

nur die richtigen stellen raussuchen und schon fluppt es, und scheinbar hat jeder landkreis da seine eigene suppe gekocht.
bei uns steht tatsächlich für fürs altpapier der begriff "Blaue Tonne drin". auf der arbeit, bei uns, ca 30 km von hier steht Papier drin. so geht es immer weiter. Restmüll statt Schwarze Tonne. das lustigste war statt Grüne Tonne bei uns , etwas Gartenmüll oder Biogut.da kann man schon mal kirre werden.

also man muss da schon zwangsweise immer anpassen, wie die dinger in der ics drin stehen.


edit:/
jedoch hat vize auch die namens abfrage drin. ;)
if ($Kalendertext =~ /Gelber Sack/)
steht bei mir seit anfang jan. als Gelbe Tonne ;D

kvo1

#21
Hallo BlackStone/Vize,

leider habe ich mich wohl zu früh gefreut, habe noch folgendes Problem.
Ich habe das nach dem Beispiel von BlackStone eingerichtet und hatte Anfangs nur in der 99_myUtils.pm

if ($Kalendertext =~ /Blaue Tonne/)
gegen
if ($Kalendertext =~ /Abholung Hausmüll/)

Dann dachte ich, das die Änderung besser bei

if ($Kalendertext =~ /Abholung Hausmüll/) paßt
also gegen
if ($Kalendertext =~ /Abholung Hausmüll/) ersetzt und habe das oben wieder zurück gedreht

Jetzt bekommen ich aber beiden Mülltonnen angezeigt für den gleichen Tag, die blaue Tonne und
die Restmülltone (bei mir rot)  :'( 
Es gibt auch 2 Readings (vielleicht lösche ich das erste per Hand einfach mal) ?

Hat jemand eine Idee ?
danke
kvo1

Edit:
mir ist noch aufgefallen, daß das dummy du_muelltermine bei "STATE" keine sinnvollen Werte enthält , nur ???
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

kvo1

Hallo

deletereading du_muelltermine Papiertonne_dTag

deletereading du_muelltermine Papiertonne

und schon sind die beiden readings weg  ;)
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

Vize

#23
Hallo kvo1,

ja, die (nicht mehr gebrauchten) readings muss man einmalig im dummy löschen...die werden ja auch durch die sub in der 99_myUtils quasi "per Hand" geschrieben.

Falls du irgendwas im STATE im dummy brauchst, kannst du das über stateFormat anpassen, ansonsten stehen da halt die drei ???. Das dummy hat ja in diesem Falle auch nicht wirklich einen STATE.

Frage meinerseits:
Klappt alles bei dir, ohne dass du ein DTEND für deine Termine in der ics-Datei hast (sehe in deinem Auszug nur das DTSTART)?

Gruß
Andreas

kvo1

ZitatFrage meinerseits:
Klappt alles bei dir, ohne dass du ein DTEND für deine Termine in der ics-Datei hast (sehe in deinem Auszug nur das DTSTART)?

Gruß
Andreas

Hallo Vize,
ja bisher habe ich keine Probleme mit dem fehlenden  DTEND !

habe mal per Hand in meine ics-Datei noch einen Termin für den "GelberSack" reingebastelt (22.8) , wird
auch angezeigt. ;)
Jetzt würde ich das mal so laufen lassen (morgen ist Termin für Restmüll) und schauen wie es dann aussieht!

gruss
kvo1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

Vize

#25
Genau, schau dann mal bitte, ob die abgelaufenen Termine dann aus der redingsGroup verschwinden...

Dein "Hausmülltermin" müsste ja dann ab dem 20.08. nicht mehr angezeigt werden.

Gruß
Andreas

BlackStone

bei mir war es die grüne tonne, die ist, nu ordnungsgemäß weg, und nur noch die gelbe in der list. läuft bei mir also wie geplant.  ;D

Vize

@BlackStone

Kannst du mal bitte einen kompletten Termin aus deiner ics-Datei posten, also alles, was zwischen BEGIN:VEVENT und END:VEVENT steht?

Gruß
Andreas

BlackStone

#28
ich hänge dir mal nen url zur quelle dran. ;)
da ich die ics nicht, verändert habe, nur geladen und auf die beere geschubst.
http://www.landkreis-aurich.de/abfuhrplan20150.html
dort auf Brookmerland und dann Kirchweg
(von Am Sandkasten bis Kienholzstraße)

BEGIN:VEVENT
UID:20150818T122259CEST-926702RDrl@landkreis-aurich.de
DTSTAMP:20150818T102259Z
CATEGORIES:Abfuhrtermine
DESCRIPTION:Bitte stellen Sie Ihre Abfälle bis 6.30 Uhr an die Straße.\n
\nAchten Sie darauf\, dass Ihre Bio-\, Rest- und Altpapiertonne auf der fÊ ݲ die Leerung festgelegten Straßenseite stehen\, und zwar mit der Deckel
öffnung zur Straße\, maximal zwei Meter vom Fahrbahnrand entfernt
DTSTART;VALUE=DATE:20150821
LOCATION:Brookmerland / 2015 für Brookmerland\, Kirchweg
SUMMARY:Abfuhr: Gelbe Tonne
URL:http://www.landkreis-aurich.de
END:VEVENT

und das ist die gelbe Tonne aus den screens.

kvo1

da gibt es auch kein DTEND nur


DTSTART;VALUE=DATE:20150826

@Vize, hast Du damit den Probleme ?

kvo1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB