FHEM Forum

FHEM => Sonstiges => Thema gestartet von: heig am 25 Mai 2016, 11:22:57

Titel: HTTPMOD, JSON + Abfallkalender
Beitrag von: heig am 25 Mai 2016, 11:22:57
Hallo Forum,
seit ein paar Wochen setze ich FHEM nun ein und bin total begeistertet - wie so viele ;)

Auch die Visualisierung mit dem TabletUI findet ich super - insbesondere Zusatzinfos wie den Abfallkalender. In meinem Fall ist es nun so, dass es kein iCal File gibt sondern ich die Daten Online abfragen kann und als JSON bekomme. Das JSON kann ich dann auch wunderbar mit HTTPMOD auslesen. Aber nun hakt es auch schon. Perl ist echt nicht meine Welt (bin eher so bei PHP zu Hause ;))

Kurz zu meinem Problem. Das ist die Datenstrutkur:

[
{"id":"41954300","title":"Bioabfall","trash_name":"SZ_BIO","day":"2016-05-31","description":"","color":"999999"},
{"id":"41956162","title":"Restabfall (bis 240l)","trash_name":"SZ_R","day":"2016-06-07","description":"","color":"2F4F4F"},
{"id":"41955232","title":"Gelber Sack","trash_name":"SZ_G","day":"2016-06-07","description":"","color":"FFFF00"},
{"id":"41953709","title":"Altpapier (120l, 240l)","trash_name":"SZ_P","day":"2016-06-08","description":"","color":"999999"},
{"id":"41954335","title":"Bioabfall","trash_name":"SZ_BIO","day":"2016-06-14","description":"","color":"999999"},
{"id":"41956197","title":"Restabfall (bis 240l)","trash_name":"SZ_R","day":"2016-06-21","description":"","color":"2F4F4F"},
{"id":"41955266","title":"Gelber Sack","trash_name":"SZ_G","day":"2016-06-21","description":"","color":"FFFF00"},
{"id":"41954370","title":"Bioabfall","trash_name":"SZ_BIO","day":"2016-06-28","description":"","color":"999999"},
{"id":"41955300","title":"Gelber Sack","trash_name":"SZ_G","day":"2016-07-05","description":"","color":"FFFF00"},
{"id":"41956232","title":"Restabfall (bis 240l)","trash_name":"SZ_R","day":"2016-07-05","description":"","color":"2F4F4F"},
{"id":"41954405","title":"Bioabfall","trash_name":"SZ_BIO","day":"2016-07-12","description":"","color":"999999"},
{"id":"41953744","title":"Altpapier (120l, 240l)","trash_name":"SZ_P","day":"2016-07-13","description":"","color":"999999"},
{"id":"41956267","title":"Restabfall (bis 240l)","trash_name":"SZ_R","day":"2016-07-19","description":"","color":"2F4F4F"},
{"id":"41955334","title":"Gelber Sack","trash_name":"SZ_G","day":"2016-07-19","description":"","color":"FFFF00"},
]


Lese ich das ganze mit extractAllJSON aus sehe ich folgendes:
(Anhang)

Das ist nun aber Doof. (denke ich) denn ich muss ja immer das nächste Datum für den Gelben Sack z.B. ermitteln. Da wäre es ja schön ein Reading zu haben, was dieses Datum wieder gibt.
Wie bekomme ich denn jetzt das erste Datum das es für den trash_name SZ_G gibt in ein separates Reading? Kann ich mit einer kleinen Funktion einfach alle Daten für trash_name=SZ_G ausgeben lassen und das kleinste in ein Reading schreiben?

Ich hoffe ihr versteht was ich will  :)
Titel: Antw:HTTPMOD, JSON + Abfallkalender
Beitrag von: frank am 25 Mai 2016, 13:25:36
mit regex würde ich folgendes machen:

1. attr extractAllJson löschen
2. für jede müllart ein pärchen aus attr readingXXName und attr readingXXRegex definieren

zb für restmüll
attr blabla reading01Name Restmüll
atrr blabla reading01Regex SZ_R","day":"([^"]+)


vielleicht funktionieren keine umlaute bei den readingnamen. wenn der nächste termin immer oben steht, sollte dieser auch gefunden werden. testen kann man schön bei regex101.com
Titel: Antw:HTTPMOD, JSON + Abfallkalender
Beitrag von: heig am 25 Mai 2016, 15:12:10
Hi,
danke für den Input. Ich hab jetzt aber eine andere Lösung gefunden. Nicht ganz clean, aber erstmal gehts soweit...

sub AbfallDaten()
{
my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
my @SuchTexte = ("SZ_BIO", "SZ_G", "SZ_R", "SZ_P");
my $json = get('MEINEURL');
my $index = 0;
my $arrayref = decode_json $json;
my $t = time;

for (my $i=0; $i<4; $i++){
foreach my $item( @$arrayref ) {
   
    if($item->{'trash_name'} eq $SuchTexte[$i] && $index eq 0){
    $index++;
    my $date=str2time($item->{'day'});
    my $diff = floor(($date - $t) / 60 / 60 / 24 +1);

    fhem("setreading MuellterminDummy $Tonnen[$i] $diff");
 
    } #IF
   
} #foreach
$index=0;

} #for
}


dazu dann noch ein at das die Funktion aufruft und es läuft...