Straßenverkehr Blitzer: Unterschied zwischen den Versionen

Aus FHEMWiki
K ("source" Tags auf "syntaxhighlight" umgestellt.)
 
(13 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
{{Infobox Modul|
{{Infobox Modul|
|ModPurpose=Geschwindigkeitsüberwachung Blitzer
|ModPurpose=Geschwindigkeitsüberwachung Blitzer
|ModType=x
|ModType=x
|ModCmdRef=blitzer
|ModCmdRef=blitzer
|ModForumArea=Sonstige Systeme
<!--|ModForumArea=Sonstige Systeme-->
|ModFTopic=99070
|ModTechName=98_Blitzer.pm
|ModTechName=98_Blitzer.pm
|ModOwner=bismosa
|ModOwner={{Link2FU|30971|bismosa}}
}}
}}


@Wiki-Admin:
'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) über ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.
* Link auf bismosa fehlt
 
* Link auf https://forum.fhem.de/index.php/topic,99070.0.html fehlt
== Features ==
* Die Ausgabe ist frei über Attribute konfigurierbar.
* HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.
* Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.
* Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.
* Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).
* Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.
* Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.
 
== Modul integrieren ==
Das inoffizielle Modul ist in jeweils aktueller Version auf Github verfügbar.  


'''Straßenverkehr Blitzer''' ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) ein Internet Portal abfragt und für den Umkreis des eigenen Standorts auflistet.
Die Installation des Moduls erfolgt über den [[update]]-Befehl:


== Funktion ==
<nowiki>update all https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt</nowiki>
Geleistet wird die listenförmige Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr innerhalb Deutschlands - bezogen auf eine anzugebende Koordinate sowie Radius um diese Koordinate.


== Modul integrieren ==
Mit dem obigen Befehl kann das Modul auch anschließend manuell aktualisiert werden.
Das Modul ist in jeweils aktueller Version auf Github verfügbar. Es ist zunächst in den FHEM-Update-Prozess zu integieren:


<source lang="html">
Das Modul kann folgendermaßen in den automatischen FHEM-Update-Prozess eingebunden werden (siehe auch [[Update#Repository-Verwaltung|Repository-Verwaltung mit update]]):
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_all.txt
<syntaxhighlight lang="html">
update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt
update check
update check
update all
update all
</source>
</syntaxhighlight>


== Definition ==
== Definition ==
<source lang="html">
<syntaxhighlight lang="html">
 
define <Name> Blitzer <Interval>
</source>
</syntaxhighlight>
 
Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.
 
'''Ab hier ist veralteter Code ohne Modul, aber funktional!'''
 
Vom gleichen Autoren gibt es mit gleicher Funktionalität nun ein inoffizielles Modul: https://forum.fhem.de/index.php/topic,90014.0.html
 
Der [[{{PAGENAME}}|Code "Blitzer"]] (Autor: {{Link2FU|30971|bismosa}}]) ist ein Code zur listenförmigen Anzeige mobiler Geschwindigkeitsüberwachungen (Radarfallen) im Straßenverkehr. Er kann problemlos in [[FHEM Tablet UI]] genutzt werden. 2019-02 wurde es geprüft und war funktional.
 
Es wird ausdrücklich auf den Thread {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}} im FHEM-Forum verwiesen: Im ersten Beitrag pflegt der Autor den Code nach.
 
==Funktionalität==
Ausgehend von einer vorgegebenen Koordinate werden alle gemeldeten Blitzer im beliebigen Umkreis (bis 99 Kilometer) aufgelistet. Zusätzlich existiert ein Reading "Anzeige": "0", wenn keine Blitzer im definierten Umkreis vorliegen, "1" wenn dort Blitzer vorliegen.
 
==Code mit Erläuterungen==
<source lang="html">
defmod blitzer dummy
attr blitzer userattr lat lng maxkm
attr blitzer icon ampel_rot
attr blitzer lat 51.8644
attr blitzer lng 12.6346
attr blitzer maxkm 25
attr blitzer stateFormat Text
attr blitzer room 61 Verkehr
</source>
 
Damit wird die Definition des basierenden Dummy-Devices vorgenommen. Hier ist die Mittelpunktskoordinate (lat/lon) an die eigenen Bedürfnisse anzupassen: HIer bin ich, welche Blitzer sind im Umkreis? - "maxkm" definiert den Radius um die Koordinate, in dessen Kreisfläche alle gemeldeten Blitzer gelistet werden sollen. "room" kann den eigenen Bedürfnissen angepasst werden.
 
<source lang="html">
defmod httpmod_blitzer HTTPMOD https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=51.6,12.1,52.0,13.0 0
attr httpmod_blitzer userattr getData getHeader1 getHeader2 getURL reading01DeleteIfUnmatched reading01JSON reading01Name reading01Regex reading02Name reading02RegOpt reading02Regex reading03JSON reading03Name readingEncode requestHeader1 requestHeader2 setParseResponse:0,1
attr httpmod_blitzer enableControlSet 1
attr httpmod_blitzer extractAllJSON 1
attr httpmod_blitzer getHeader1 Content-Type: application/json
attr httpmod_blitzer getHeader2 Accept: */*
attr httpmod_blitzer readingEncode utf8
attr httpmod_blitzer room 61 Verkehr
</source>
 
Mit dieser Device wird die Internetabfrage definiert. Der "room" kann an eigene Befürfnisse angepasst werden. Die Definition selbst (defmod httpmod_blitzer) '''muss''' angepasst werden, es geht um den letzten Teil: "box=51.6,12.1,52.0,13.0 0". Gedanklich bildet man ein Quadrat um die Mittelpunktkoordinate. Für die ersten beiden Parameter bestimmt man die Koordinate der linken unteren Ecke. Für die beiden folgenden Parameter bestimmt man die Koordinaten der rechten oberen Ecke und trägt auch sie ein. Dabei muss man nicht sehr genau vorgehen: Ein ungefähres Rechteck reicht völlig. - Die abschließende Null '''muss''' unverändert bleiben: Der Abruf wird von einem Script gesteuert.
 
<source lang="html">
defmod at_Blitzer at +*00:10:00 {\
        fhem("deletereading httpmod_blitzer .*", 1);;\
        fhem("set httpmod_blitzer reread");;;;\
    fhem("sleep 2;; {getBlitzer};;");;;;\
}
attr at_Blitzer room 99_System
</source>
 
Dieser Code-Teil sollte nicht geändert werden: Alle 10 Minuten werden alle Readings (Blitzer) gelöscht und via Web der aktuelle Stand erfragt.
 
==99_myUtils.pm==
In 99_myUtils.pm muss ein längerer Codeblock eingefügt werden. Er sollte ganz unten vor dem Codeteil
 
<source lang="perl">
1;
</source>
stehen.
 
<source lang="perl">
################################################################
###                        Blitzer                          ###
################################################################
sub getBlitzer(){
    my $httpDev = "httpmod_blitzer";
    my $BlitzerDev = "blitzer";
    my $lat = AttrVal($BlitzerDev,"lat",undef);
    my $lng = AttrVal($BlitzerDev,"lng",undef);
my $maxkm = AttrVal($BlitzerDev,"maxkm",undef);
    if (!defined $lat){
        Log 5,"[getBlitzer] lat ist nicht definiert!";
    }
    if (!defined $lng){
        Log 5,"[getBlitzer] lng ist nicht definiert!";
    }
if (!defined $maxkm){
        Log 5,"[getBlitzer] maxkm ist nicht definiert!";
    }
    # Da unbekannt ist, wie viele es gibt...durchprobieren
    my @Liste;
    for(my $i=1;$i<100;$i++){
        my $num = sprintf("%02d", $i);
        Log 5,"[getBlitzer] Reading: $num";
        my $Poi_lat = ReadingsVal($httpDev,"pois_".$num."_lat",undef);
        my $Poi_lng = ReadingsVal($httpDev,"pois_".$num."_lng",undef);
        last if !defined $Poi_lat;
#Log 1,"[getBlitzer] Reading: $Poi_lat";
        last if !defined $Poi_lng;
        Log 5,"[getBlitzer] lat/lng: $Poi_lat $Poi_lng";
        my $Poi_street = ReadingsVal($httpDev,"pois_".$num."_street","keine");
        my $Poi_vmax = ReadingsVal($httpDev,"pois_".$num."_vmax","kA");
        if (!defined $Poi_vmax){
            $Poi_vmax = ".";
        }
        if ($Poi_vmax eq ""){
            $Poi_vmax = ".";
        }
        Log 5,"[getBlitzer] $Poi_street $Poi_vmax";
             
        #Entfernung zur Home-Koordinate (Luftlinie)
        #Berechnung nach: https://www.kompf.de/gps/distcalc.html
        #Einfache Variante
        my $dx = 71.5 * abs($lng - $Poi_lng);
        my $dy = 111.3 * abs($lat - $Poi_lat);
my $distance = sqrt($dx * $dx + $dy * $dy);
     
#MaxEntfernung einbeziehen
if (not $distance > $maxkm){
Log 5,"[getBlitzer] distance: $distance";
        push @Liste, [ $distance, $Poi_street, $Poi_vmax, $Poi_lat, $Poi_lng ];
} else {
Log 5,"[getBlitzer] $distance > $maxkm";
}
     
    }
    my $out = join(", ", @Liste)."\n";
    Log 5,"[getBlitzer] $out";
    my @ListeSort = sort {$a->[0] <=> $b->[0]} @Liste;
    $out = join(", ", @ListeSort)."\n";
    Log 5,"[getBlitzer] $out";
 
    #Eintragen ins Dummy-Device
    #Eintragungen erst löschen
    fhem("deletereading $BlitzerDev .*", 1);
 
    my $Text="";
    my $Anzahl = scalar(@ListeSort);
    for (my $i=0;$i<$Anzahl;$i++) {
        my $num = sprintf("%02d", $i);
        Log 5,"[getBlitzer] Num: $num";
        fhem("setreading $BlitzerDev ".$num."Entfernung ".$ListeSort[$i][0]);
        fhem("setreading $BlitzerDev ".$num."Strasse ".$ListeSort[$i][1]);
        fhem("setreading $BlitzerDev ".$num."VMax ".$ListeSort[$i][2]);
     
        #Ort
        fhem("sleep 1; \{getBlitzerOrte(".$ListeSort[$i][3].",".$ListeSort[$i][4].",'$num','$BlitzerDev')};");
     
    }
    fhem("sleep 3; \{getBlitzerText('$BlitzerDev')};");
    #fhem("setreading $BlitzerDev Text $Text");
 
}
sub getBlitzerOrte($$$$){
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1
    my $Poi_lat = shift;
    my $Poi_lng = shift;
    my $num = shift;
    $num = sprintf("%02d", $num);
    my $BlitzerDev = shift;
my $hash = {};
  $hash->{'blitzerdev'} = $BlitzerDev;
$hash->{'num'} = $num;
my $param = {
          url        => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,
          timeout    => 5,
          method    => "GET",            # Lesen von Inhalten
  hash      => $hash,            # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
          header    => "",
          callback  =>  \&getBlitzerOrteCallback  # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
    };
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json
 
    HttpUtils_NonblockingGet($param);      # Starten der HTTP Abfrage. Es gibt keinen Return-Code.
 
}
sub getBlitzerOrteCallback($) {
    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $BlitzerDev = $hash->{blitzerdev};
my $num = $hash->{num};
 
    if($err ne "")      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err";  # Eintrag fürs Log
    }
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};
#Log 1,"$data";
 
my $Stadtteil = "";
my $Stadt = "";
my ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;
if ((!defined $Stadtteil) or ($Stadtteil eq "")){
#Log 1, "[getBlitzerOrteCallback] search city_district";
      ($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";
    }
if ((!defined $Stadtteil) or ($Stadtteil eq "")){
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";
Log 5, "[getBlitzerOrteCallback] ".$param->{url};
Log 5, "[getBlitzerOrteCallback] $data";
      $Stadtteil = ".";
    }
      my ($Stadt) = $data =~ m/city":"([^"]+)"/;
if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] search village $data";
        ($Stadt) = $data =~ m/town":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadt";
    }
if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] search village $data";
        ($Stadt) = $data =~ m/village":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadt";
    }
    if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] $Stadt";
Log 5, "[getBlitzerOrteCallback] ".$param->{url};
Log 5, "[getBlitzerOrteCallback] $data";
      $Stadt = ".";
    }
    my ($building) = $data =~ m/building":"([^"]+)"/;
    if ((!defined $building) or ($building eq "")){
        $building = ".";
    }
    Log 5,"[getBlitzerOrteCallback] $Stadt $Stadtteil $building";
    #Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];
if ($Stadt eq "."){$Stadt = " "};
if ($Stadtteil eq "."){$Stadtteil = " "};
    fhem("setreading $BlitzerDev ".$num."Ort $Stadt $Stadtteil");
fhem("setreading $BlitzerDev ".$num."Building $building");
}
sub getBlitzerText($){
    my $BlitzerDev = shift;
    my $Text="<html> <p align='left'>";
    my $SollAnzeige=0;
    for(my $i=0;$i<100;$i++){
        my $num = sprintf("%02d", $i);
        my $Entf = ReadingsVal($BlitzerDev,$num."Entfernung",undef);
last if !defined $Entf;
my $Ort = ReadingsVal($BlitzerDev,$num."Ort",".");
if ($Ort eq "."){$Ort = " "};
my $building = ReadingsVal($BlitzerDev,$num."Building",0);
if ($building eq "."){$building = " "};
        my $Strasse = ReadingsVal($BlitzerDev,$num."Strasse"," ");
        my $VMax = ReadingsVal($BlitzerDev,$num."VMax"," ");
        if (not $Text eq "<html> <p align='left'>"){
            $Text = $Text."\n <br>"; 
        }
        $Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";
        $SollAnzeige=1;
    }
$Text = $Text."</p></html>";
    fhem("setreading $BlitzerDev Text $Text");
    fhem("setreading $BlitzerDev Anzeige $SollAnzeige");
}
</source>


Von besonderem Interesse ist hier die Zeile
Sodann ist '''wesentlich''', dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:
<syntaxhighlight lang="html">
attr <Name> home_latitude 51.8
attr <Name> home_longitude 12.6
attr <Name> radius 25
</syntaxhighlight>


<source lang="perl">
== Formatierung der Ausgabe ==
$Text = $Text."$num $Ort $Strasse $building Max $VMax km/h (".sprintf("%.1f", "$Entf")."km) !!";
Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:
</source>
<syntaxhighlight lang="html">
attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline
</syntaxhighlight>


Diese Zeile kann man den eigenen Bedürfnissen anpassen, beispielhaft so:
Ein Beispiel für den großstädtischen Raum:
<source lang="perl">
<syntaxhighlight lang="html">
$Text = $Text."$Ort $Strasse $building $VMax km/h";
attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline
</source>
</syntaxhighlight>
Dieser Version ist günstiger für [[FHEM Tablet UI|FTUI]], da die Zeilenausgaben kürzer ist.


==Code für FTUI==
=== Spezielle Einträge ===
<source lang="html">
*number      Nummerierung
<div data-type="label"
* newline      Neue Zeile
    data-device="blitzer"
* [Freitext]      Beliebiger Text. Dieser wird ohne die Klammern übernommen.
    data-get="Text">
* distance      Abstand des Blitzers von der Home-Koordinate (Luftlinie)
</source>
* distanceShort  Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle
* {OR        ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt
* }        Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.


==Hinweis==
Es können beliebig viele Werte so verknüpft werden.
Es gibt mehrere Anpassungsvorschäge. Diese sind im Forum zu finden: {{Link2Forum|Topic=90014|LinkText=Blitzer anzeigen}}. Fragen zum Code bitte dort stellen.


Screenshot fehlt
Welche Werte vorhanden sind, kann mit
<syntaxhighlight lang="html">
get <Blitzer-Device> allReadings <Optional:Nummer>
</syntaxhighlight>
überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.


[[Kategorie:Code_Snippets]]
== Links ==
[[Kategorie:FHEM Tablet UI|Blitzer]]
Das Modul verwendet Daten von
* http://www.verkehrslage.de (https://cdn2.atudo.net)
* https://nominatim.openstreetmap.org

Aktuelle Version vom 4. November 2021, 12:22 Uhr

blitzer
Zweck / Funktion
Geschwindigkeitsüberwachung Blitzer
Allgemein
Typ Inoffiziell
Details
Dokumentation Thema
Modulname 98_Blitzer.pm
Ersteller bismosa
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Straßenverkehr Blitzer ist ein Modul, welches mobile Verkehrsüberwachungsanlagen (aka Blitzer) über ein Internet Portal abfragt und für den Umkreis des eigenen Standorts listenförmig im Straßenverkehr innerhalb Deutschlands auflistet - bezogen auf eine anzugebende Koordinate, um den Radius um diese Koordinate.

Features

  • Die Ausgabe ist frei über Attribute konfigurierbar.
  • HTML-Code bzw. plaintext ist als Ausgabeformat einstellbar.
  • Es kann mit einem set <Blitzer-Device> Update <Optional:LAT> <Optional:LONG> auch eine neue Koordinate vorgegeben werden.
  • Der Bereich, der bei Verkehrslage.de abgefragt wird, kann vom Modul berechnet werden.
  • Es kann ein Reading erzeugt werden, welches bei vorhanden Blitzern eine "1" und sonst eine "0" anzeigt (praktisch z.B. um in FTUI Bereiche auszublenden, wenn kein Blitzer gemeldet wurde).
  • Es kann die maximale Anzahl an anzuzeigenden Blitzern festgelegt werden.
  • Es kann ein Text festgelegt werden, wenn kein Blitzer in der Nähe ist.

Modul integrieren

Das inoffizielle Modul ist in jeweils aktueller Version auf Github verfügbar.

Die Installation des Moduls erfolgt über den update-Befehl:

update all https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt

Mit dem obigen Befehl kann das Modul auch anschließend manuell aktualisiert werden.

Das Modul kann folgendermaßen in den automatischen FHEM-Update-Prozess eingebunden werden (siehe auch Repository-Verwaltung mit update):

update add https://raw.githubusercontent.com/bismosa/FHEM/master/controls_Blitzer.txt
update check
update all

Definition

define <Name> Blitzer <Interval>

Das Intervall hat die Basis "Minuten". Sofern kein Intervall angegeben ist, wird nicht automatisch aktualisiert.

Sodann ist wesentlich, dass die gewünschte Ausgangskoordinate sowie der gewünschte Radius in den Attributen gesetzt werden, beispielhaft:

attr <Name> home_latitude 51.8
attr <Name> home_longitude 12.6
attr <Name> radius 25

Formatierung der Ausgabe

Über das Attribut "Ausgabe" wird gesteuert, welche je Blitzer verfügbaren Informationen ausgegeben werden sollen. Ein Beispiel mit wenigen Informationen, für den ländlichen Raum geeignet:

attr <Name> Ausgabe {OR,suburb,city_district,town,village,},road,building,vmax,[km/h],newline

Ein Beispiel für den großstädtischen Raum:

attr <Name> Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline

Spezielle Einträge

  • number Nummerierung
  • newline Neue Zeile
  • [Freitext] Beliebiger Text. Dieser wird ohne die Klammern übernommen.
  • distance Abstand des Blitzers von der Home-Koordinate (Luftlinie)
  • distanceShort Abstand des Blitzers von der Home-Koordinate (Luftlinie) eine Kommastelle
  • {OR ODER-Verknüpfung. Wenn ein Wert vorhanden ist, werden die nachfolgenden (bis zur geschweiften Klammer) nicht berücksichtigt
  • } Ende der ODER-Verknüpfung. Muss zwingend gesetzt werden, wenn eine ODER-Verknüpfung enthalten ist.

Es können beliebig viele Werte so verknüpft werden.

Welche Werte vorhanden sind, kann mit

get <Blitzer-Device> allReadings <Optional:Nummer>

überprüft werden. Wird eine Nummer mitgegeben, werden nur die entsprechenden Einträge ausgegeben.

Links

Das Modul verwendet Daten von