[gelöst] Mobile Blitzer via HTTPMOD auslesen

Begonnen von t1me2die, 19 März 2018, 09:30:25

Vorheriges Thema - Nächstes Thema

t1me2die

Einen sonnigen guten Morgen,

ich versuche zur Zeit die mobilen Blitzer von der Seite www.verkehrslage.de auszulesen.

Dazu nutze ich den HTTPMOD:

Internals:
BUSY 0
CHANGED
DEF http://www.verkehrslage.de/Hamburg/mobile%20Blitzer 600
DeleteIfUnmatched 1
Interval 600
LASTSEND 1521445461.0572
MainURL http://www.verkehrslage.de/Hamburg/mobile%20Blitzer
ModuleVersion 3.4.2 - 10.2.2018
NAME Blitzer
NR 617
STATE ???
TRIGGERTIME 1521446061.05582
TRIGGERTIME_FMT 2018-03-19 08:54:21
TYPE HTTPMOD
addr https://www.verkehrslage.de:443
auth 0
buf
code 200
compress 1
conn
data
displayurl https://www.verkehrslage.de/Hamburg/mobile%20Blitzer
header
host www.verkehrslage.de
httpheader HTTP/1.1 200 OK
Date: Mon, 19 Mar 2018 07:46:37 GMT
Server: Apache/2.4.10 (Debian)
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 39232
Connection: close
Content-Type: text/html; charset=UTF-8
httpversion 1.0
hu_blocking 0
hu_filecount 196
hu_port 443
hu_portSfx ignoreredirects 0
loglevel 4
path /Hamburg/mobile%20Blitzer
protocol https
redirects 1
timeout 2
url https://www.verkehrslage.de/Hamburg/mobile%20Blitzer
value 0
QUEUE:
READINGS:
2018-03-19 08:44:21 Straßenname-1 August-Krogmann-Straße
2018-03-19 08:44:21 Straßenname-2 Klein Flottbeker Weg
2018-03-19 08:44:21 Straßenname-3 Sülldorfer Brooksweg
2018-03-19 08:44:21 Straßenname-4 Walddörferstraße
2018-03-19 08:44:21 String '[{\"id\":\"742073862\",\"lat\":\"53.614182\",\"lat_s\":\"53.6\",\"lng\":\"10.114728\",\"lng_s\":\"10.1\",\"state\":\"\",\"city\":\"Hamburg\",\"street\":\"August-Krogmann-Stra\\u00dfe\",\"content\":\"3962308760\",\"backend\":\"0-9541199\",\"type\":\"1\",\"vmax\":\"30\",\"counter\":\"0\",\"create_date\":\"2018-03-19 08:31:07\",\"confirm_date\":\"2018-03-19 08:31:07\",\"gps_status\":\"-\",\"info\":{\"count_180d\":null},\"polyline\":\"\"},{\"id\":\"742073756\",\"lat\":\"53.553566\",\"lat_s\":\"53.6\",\"lng\":\"9.877564\",\"lng_s\":\"9.9\",\"state\":\"Hamburg\",\"city\":\"Hamburg\",\"street\":\"Klein Flottbeker Weg\",\"content\":\"3962289839\",\"backend\":\"0-9541120\",\"type\":\"1\",\"vmax\":\"30\",\"counter\":\"2\",\"create_date\":\"2018-03-19 08:21:05\",\"confirm_date\":\"2018-03-19 08:33:51\",\"gps_status\":\"-\",\"info\":{\"count_180d\":\"0\"},\"polyline\":\"\"},{\"id\":\"742073637\",\"lat\":\"53.582275\",\"lat_s\":\"53.6\",\"lng\":\"10.095384\",\"lng_s\":\"10.1\",\"state\":\"Hamburg\",\"city\":\"Hamburg\",\"street\":\"Waldd\\u00f6rferstra\\u00dfe\",\"content\":\"3962262692\",\"backend\":\"0-9541035\",\"type\":\"1\",\"vmax\":\"30\",\"counter\":\"1\",\"create_date\":\"2018-03-19 08:06:39\",\"confirm_date\":\"2018-03-19 08:30:31\",\"gps_status\":\"-\",\"info\":{\"count_180d\":\"3\"},\"polyline\":\"\"},{\"id\":\"742073528\",\"lat\":\"53.576904\",\"lat_s\":\"53.6\",\"lng\":\"9.762631\",\"lng_s\":\"9.8\",\"state\":\"Hamburg\",\"city\":\"Hamburg\",\"street\":\"S\\u00fclldorfer Brooksweg\",\"content\":\"3962228533\",\"backend\":\"0-9540916\",\"type\":\"1\",\"vmax\":\"50\",\"counter\":\"2\",\"create_date\":\"2018-03-19 07:47:41\",\"confirm_date\":\"2018-03-19 08:31:07\",\"gps_status\":\"-\",\"info\":{\"count_180d\":\"1\"},\"polyline\":\"\"}]';
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url http://www.verkehrslage.de/Hamburg/mobile%20Blitzer
value 0
defptr:
readingBase:
Straßenname-1 reading
Straßenname-2 reading
Straßenname-3 reading
Straßenname-4 reading
String reading
readingNum:
Straßenname-1 01
Straßenname-2 01
Straßenname-3 01
Straßenname-4 01
String 02
readingOutdated:
readingSubNum:
Straßenname-1 -1
Straßenname-2 -2
Straßenname-3 -3
Straßenname-4 -4
requestReadings:
update:
Straßenname-1 reading 01-1
Straßenname-2 reading 01-2
Straßenname-3 reading 01-3
Straßenname-4 reading 01-4
String reading 02
sslargs:
Attributes:
DbLogExclude .*
enableControlSet 1
event-on-change-reading Straßenname-1
reading01DeleteIfUnmatched 1
reading01Name Straßenname
reading01RegOpt g
reading01Regex Hamburg, (.*), \(<a href
reading02Name String
reading02Regex <script>\n var json_str =(.*)
room Verkehr
userattr get01CheckAllReadings:0,1 reading01DeleteIfUnmatched reading01Name reading01RegOpt reading01Regex reading02Name reading02Regex
verbose 2


Durch den ersten Regex erhalte ich meine Straßennamen (diese sind Alphabetisch sortiert).

Nun möchte ich auch gerne noch die GPS Koordinaten auslesen.

Dazu habe ich mit folgenden Regex auf regex101.com experimentiert:

lat\\":\\"(.........)|lng\\":\\"(........)


Dieser liefert mir in einzelnen Groups die GPS Koordinaten zurück.
Dummerweise ist in dem JSON String die Reihenfolge der Straßen nicht identisch mit Regex01.
Innerhalb des JSON String befinden sich auch die Straßennamen leider bereiten mir hier die Unicode Sonderzeichen Probleme, weswegen ich die Straßennamen nicht 1:1 miteinander vergleichen kann.

Ich denke, am einfachsten wäre es, den JSON String von Unicode -> UTF-8 umzuformen, danach dann:

lat
lng
street

auszulesen und als Reading darzustellen.

Ich weiß nicht, ob ich auf dem richtigen Weg bin, vielleicht könnt ihr mich ja auf die richtige Bahn bringen.

Gruß
Mathze

@Edit: Habe den String nun via Perl-Code aufbereitet.

Fhemschorsch

Hi,
da Du Deinen Thread schon als "gelöst" gekennzeichnet hast: Hast Du das mit den Koordinaten bereits gelöst und erfolgreich weiterverarbeitet? Ich vermute mal, Du willst Deinen Arbeitsweg o.ä. als Koordinatenrange anlegen und dann Benachrichtigungen aussteuern, sobald ein neuer Blitzer kommt, korrekt?

steffen83

Magst du deine Lösung vielleicht teilen?

Heißt du möchtest einfach nur für deinen Ort immer die mobilen Blitzer angezeigt bekommen richtig?
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

t1me2die

#3
Moin ihr Zwei,

ich bin von meiner Anfangsidee ein wenig abgewichen.
Früher wollte ich Anhand der GPS Koordinaten den jeweiligen Ort bestimmen, leider habe ich es nicht so recht hinbekommen die GPS Koordinaten in einen Ortsnamen umzuwandeln.

Daher habe ich mir nun eine Routine (oder auch mehrere) in meiner 99_myUtils geschrieben.
Alles läuft via Telegram, sprich ich schreibe nur noch "Blitzer Hamburg", "Blitzer A1", "Blitzer Mecklemburg-Vorpommern", "Blitzer Berlin", ... und erhalte kurz danach eine Nachricht mit allen Blitzern "schön" aufbereitet.

Ich kann zwischen "Festen" und "Mobilen" Blitzern unterscheiden.

Meine beiden Routinen schauen wie folgt aus, diese können nicht 1:1 übernommen werden, es muss noch etwas Feintuning vorgenommen werden, unteranderem fehlt die Rountine getEmoji($), welche ich weiter unten noch anhänge!
Diese Routinen erstellen nur die Devices, wenn man diese auch noch als eine Telegram Nachricht erhalten möchte, muss man weitere Vorkehrungen treffen, siehe weiter unten.

Zwei Screenshots siehe Anhang.


##################################################################################################
# Ermittelt die mobilen / festen Blitzer
##################################################################################################

sub getBlitzer($$)
{
    my ($message,$id) = @_;
    my $space = 0;
    my @array = "";
    my @ort    = "";
    my $ort1   = "";
    my $feste  = 0;
    my $mobile = 0;
   
    $ort[1] = "";
    if ($message eq "Feste Blitzer")
    {
        $feste = 1;
        $ort[0] = "";
        $ort[1] = "";
    }
    elsif ($message eq "Blitzer")
    {
        $mobile = 1;   
        $ort[0] = "";
        $ort[1] = "";
    }
    else
    {
        # Wenn ein Leerzeichen gefunden wurde
        $space = index($message,' ');
        for (my $i = 0; $i < 10; $i++)
        {
            $space = index($message,' ');
            if ($space != -1)
            {
                @array[$i] = substr($message,0,$space);
                $message = substr($message,$space+1);
            }
            else
            {
                @array[$i] = substr($message,0);
                last;
            }
        }   
        foreach(@array)
        {
            if ($_ =~ /Feste/g)
            { $feste = 1; }
            elsif ($_ =~ /Blitzer/g)
            { $mobile = 1; }
            else
            {
                if ($ort[0] eq "")
                { $ort[0] = $_; }
                else
                { $ort[1] = $_; }
            }
       
        }
    }
   
    if ($ort[1] ne "")
    {   $ort1 = $ort[0] ."_" .$ort[1]; }   
    elsif ($ort[1] eq "")
    {   $ort1 = $ort[0]; }   
   
    # Prüfe, ob das Objekt für den Blitzer existiert
    my ($error,$device) = checkHTTPMODBlitzer($feste,$mobile,$ort1);
   
    # Wenn kein Fehler vorhanden ist Daten auslesen
    if ($error != -1)
    {
        if ($error == 0)
        { return getInfoBlitzer($device); }
        elsif ($error == 1)
        {
            fhem "define temp_Blitzer at +00:00:07 { fhem \"set Telegram message \\\@$id \" .getInfoBlitzer(\"$device\") }";
            return "" .getEmoji(55) ."Sekunde, ich sammle alle Informationen!";
        }
    }
    # Device konnte nicht angelegt werden
    elsif($error == -1)
    {
        return "Gereat konnte nicht angelegt werden";
    }
   
}

##################################################################################################
# Errormeldungen:
# -1 = Device konnte nicht angelegt werden
#  0 = Device ist schon vorhanden
#  1 = Device wurde erfolgreich angelegt
##################################################################################################
sub checkHTTPMODBlitzer($$$)
{
    my($feste,$mobile,$ort) = @_;
    my $error = "";
    my $device = "";
    my $link = "";
   
    # Feste Blitzer + Ortsname
    if ($feste == 1 and $mobile == 1 and $ort ne "")
    {
        $device = "fb_" .$ort;
        $link = "https://www.verkehrslage.de/".$ort."/feste+Blitzer";
    }
    # mobile Blitzer + Ortsname
    elsif ($feste == 0 and $mobile == 1 and $ort ne "")
    {
        $device = "mb_" .$ort;
        $link = "https://www.verkehrslage.de/".$ort."/mobile+Blitzer";       
    }
    # Feste Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 1 and $mobile == 0 and $ort eq "")
    {
        $device = "fb_Hamburg";
        $ort    = "Hamburg";
        $link = "https://www.verkehrslage.de/Hamburg/feste+Blitzer";       
    }
    # mobile Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 0 and $mobile == 1 and $ort eq "")
    {
        $device = "mb_Hamburg"; 
        $link = "https://www.verkehrslage.de/Hamburg/mobile+Blitzer";
    }
   
    # Device ist noch nicht angelegt
    $device =~ s/-/_/g;
    if (Value("$device") eq "")
    {
        if(substr($device,0,3) eq "mb_")
        {
            fhem "  define $device HTTPMOD $link 600 ;
                    attr $device room Verkehr ;
                    attr $device enableControlSet 1 ;
                    attr $device reading01Name String ;
                    attr $device reading01Regex <script>\\n  var json_str = (.*) ;
                    attr $device reading01RegOpt g ;
                    attr $device reading01DeleteIfUnmatched 1 ;
                    attr $device reading02Name Strassenname ;
                    attr $device reading02Regex $ort, (.*), \\(<a href ;
                    attr $device reading02RegOpt g  ;
                    attr $device reading02DeleteIfUnmatched 1 ;
                    define t_delete_Blitzer_$device at +01:00:00 { fhem \"delete $device\" }
                    ";   
        }
        elsif(substr($device,0,3) eq "fb_")
        {
            $ort =~ s/_/+/g;
            fhem "  define $device HTTPMOD $link 600 ;
                    attr $device room Verkehr ;
                    attr $device enableControlSet 1 ;
                    attr $device reading01Name Strassenname ;
                    attr $device reading01Regex $ort, (.*), \\(<a href ;
                    attr $device reading01RegOpt g ;
                    attr $device reading01DeleteIfUnmatched 1 ;
                    define t_delete_Blitzer_$device at +01:00:00 { fhem \"delete $device\" }
                    "; 
        }
        if (Value("$device") eq "")
        { $error = -1;
          return ($error, "");
        }
        else
        { $error = 1;
          return ($error, $device);
        }   
    }
    # Device ist schon vorhanden
    else
    {
        $error = 0;
        return ($error, $device);
    }   
   
}


Wie man sehen kann arbeite ich mit HTTPMOD und lege die Devices in dem Raum "Verkehr" an, damit der Raum nicht unnötig zugemüllt wird, werden diese Devices 1h nach Erstellung auch wieder gelöscht, möchte ungern dutzende Devices haben, die alle 10Minuten die Daten abfragen (dies kann man nach seinen Wünschen überarbeiten!).


Wenn man nun die Informationen aus den Devices noch auslesen möchte, habe ich mir dazu eine weitere Routine gebaut:


# ------------------------------------------------------------------------ #
# Ermittelt die aktuellen Blitzer in Hamburg                               #
# ------------------------------------------------------------------------ #

sub getInfoBlitzer($)
{
    my ($device) = @_;
    my $reading;
    my @Blitzer;
    my $pfad;
    my $error = 0;
    my $strasse = "";
    my $txt ="";
    my $vmax = 0;
    my $kmh  = "";
    my $space = 0;
    my $len = "";
    my $str1 = (ReadingsVal("$device","String",""));
   
    if(substr($device,0,3) eq "mb_")
    {
        for (my $i = 0; $i <=15 ; $i++)
        {
            my $l_str = index($str1,'street');
            my $r_str = index($str1,'content');
            my $l_lat = index($str1,'lat');
            my $r_lat = index($str1,'lat_s');
            my $l_lng = index($str1,'lng');
            my $r_lng = index($str1,'lng_s'); 
            my $l_vmax  = index($str1,'vmax');
            my $r_vmax  = index($str1,'counter');
            my $l_id  = index($str1,'{"id"');
            my $r_id  = rindex($str1,'{"id"');
           
            if ($l_str eq "-1")
                { $error = "1"; }
            else
                { $error = "0";  }
            if ($error eq "0")
            {
                my $abc = substr($str1,$l_str+11,$r_str-$l_str-16);
                $abc =~ s/\\\\u00df/ß/g;
                $abc =~ s/\\\\u00e4/ä/g;
                $abc =~ s/\\\\u00f6/ö/g;
                $abc =~ s/\\\\u00fc/ü/g;
                $abc =~ s/\\\\u00dc/Ü/g;
                $abc =~ s/\\\\u00d6/Ö/g;
                #$vmax = substr($str1,$l_vmax+9,2);
                $vmax = substr($str1,$l_vmax+9,$r_vmax-$l_vmax-14);
                $len  = length($vmax);
                if ($len == 2)
                {
                    if ($vmax =~ /^\d\d$/)
                    { $kmh = $vmax ."km/h"; }
                    else
                    { $kmh = "Rotlichtüberwachung"; }
                }
                elsif ($len == 3)
                {
                    if ($vmax =~ /^\d\d\d$/)
                    { $kmh = $vmax ."km/h"; }               
                }
                if ($abc !~ /Oldesloer Straße/i)
                {
                    if ($strasse eq "")
                    { $strasse = "\n " .getEmoji(40) ." $abc ($kmh) " .getEmoji(8) ." \ngoogle.de/maps/place/" .substr($str1,$l_lat+8,$r_lat-$l_lat-13) ."+" .substr($str1,$l_lng+8,$r_lng-$l_lng-13) ." " .getEmoji(41);
                    }
                    else
                    { $strasse =  "$strasse\n " .getEmoji(40) ." $abc ($kmh) " .getEmoji(8) ." \ngoogle.de/maps/place/" .substr($str1,$l_lat+8,$r_lat-$l_lat-13) ."+" .substr($str1,$l_lng+8,$r_lng-$l_lng-13) ." " .getEmoji(41);
                    }
                    $str1 = substr($str1,$r_str+90);
                }
            }
        }   
        if ($strasse eq "")
        {
            $txt = "Es sind keine mobile Blitzer gemeldet, gib GUMMI " .getEmoji(10) ." " .getEmoji(4);
        }
        else
        {
            $txt = getEmoji(13) ." " .getEmoji(53) . " " .getEmoji(13) ." Fahr vorsichtig, zur Zeit sind folgende mobile Blitzer aktiv: " .$strasse;   
        }
    }
    elsif(substr($device,0,3) eq "fb_")
    {
        for (my $i = 0; $i <=50 ; $i++)
        {
            if ($i == 0)
            { $reading = "Strassenname"; }
            else
            { $reading = "Strassenname-" .$i; }
       
            if (ReadingsVal("$device",$reading,"") ne "")
            {
                $Blitzer[$i] = (ReadingsVal("$device",$reading,""));
            }
        }
        foreach(@Blitzer)
        {
            if ($strasse eq "")
            { $strasse = $_; }
            else
            { $strasse =  "$strasse" ."\n* " .$_; }
        }
   
        if ($strasse eq "")
        {   
            $txt = "Es sind keine festen Blitzer gemeldet, gib GUMMI :D";
        }
        else
        {
            $txt = "Fahr vorsichtig, zur Zeit sind folgende feste Blitzer aktiv: \n* " .$strasse;   
        }   
    }   
       
    return $txt;
   
}


In $txt findet sich dann zum Schluss der aufbereitete String, welchen ich via Telegram versende.


Hier ist die getEmoji Routine, welche mir lediglich die gewünschten Smileys liefert, diese Routine hat keinerlei Einfluss auf die Ermittlung der Blitzer!


# ------------------------------------------------------------------------ #
# Ermittel den jeweiligen Emoji                                            #
# ------------------------------------------------------------------------ #

sub getEmoji($)
{
    my ($emoji) = @_;
    my $emojibyte = "";
   
    if ($emoji == 1)
    {     
        $emojibyte = "\xF0\x9F\x98\x81"; #GRINNING FACE WITH SMILING EYES
        return $emojibyte;
    }
    elsif ($emoji == 2)
    {     
        $emojibyte = "\xF0\x9F\x98\x8B"; #FACE SAVOURING DELICIOUS FOOD
        return $emojibyte;
    }
    elsif ($emoji == 3)
    {     
        $emojibyte = "\xF0\x9F\x98\x8D"; #SMILING FACE WITH HEART-SHAPED EYES
        return $emojibyte;
    }
    elsif ($emoji == 4)
    {     
        $emojibyte = "\xF0\x9F\x99\x88"; #SEE-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 5)
    {     
        $emojibyte = "\xF0\x9F\x99\x89"; #HEAR-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 6)
    {     
        $emojibyte = "\xF0\x9F\x99\x8A"; #SPEAK-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 7)
    {     
        $emojibyte = "\xF0\x9F\x99\x8B"; #HAPPY PERSON RAISING ONE HAND
        return $emojibyte;
    }
    elsif ($emoji == 8)
    {     
        $emojibyte = "\xF0\x9F\x9A\x93"; #POLICE CAR
        return $emojibyte;
    }
    elsif ($emoji == 9)
    {     
        $emojibyte = "\xF0\x9F\x9A\x97"; #AUTOMOBILE(RED)
        return $emojibyte;
    }
    elsif ($emoji == 10)
    {     
        $emojibyte = "\xF0\x9F\x9A\x99"; #AUTOMOBILE(BLUE)
        return $emojibyte;
    }
    elsif ($emoji == 11)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA5"; #HORIZONTAL TRAFFIC LIGHT
        return $emojibyte;
    }
    elsif ($emoji == 12)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA7"; #CONSTRUCTION SIGN
        return $emojibyte;
    }
    elsif ($emoji == 13)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA8"; #POLICE CARS REVOLVING LIGHT
        return $emojibyte;
    }
    elsif ($emoji == 14)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA9"; #TRIANGULAR FLAG ON POST
        return $emojibyte;
    }
    elsif ($emoji == 15)
    {     
        $emojibyte = "\xF0\x9F\x9A\xB6"; #PEDESTRIAN
        return $emojibyte;
    }
    elsif ($emoji == 16)
    {     
        $emojibyte = "\x30\xE2\x83\xA3"; #Zahl 0
        return $emojibyte;
    }
    elsif ($emoji == 17)
    {     
        $emojibyte = "\x31\xE2\x83\xA3"; #Zahl 1
        return $emojibyte;
    }
    elsif ($emoji == 18)
    {     
        $emojibyte = "\x32\xE2\x83\xA3"; #Zahl 2
        return $emojibyte;
    }
    elsif ($emoji == 19)
    {     
        $emojibyte = "\x33\xE2\x83\xA3"; #Zahl 3
        return $emojibyte;
    }
    elsif ($emoji == 20)
    {     
        $emojibyte = "\x34\xE2\x83\xA3"; #Zahl 4
        return $emojibyte;
    }
    elsif ($emoji == 21)
    {     
        $emojibyte = "\x35\xE2\x83\xA3"; #Zahl 5
        return $emojibyte;
    }
    elsif ($emoji == 22)
    {     
        $emojibyte = "\x36\xE2\x83\xA3"; #Zahl 6
        return $emojibyte;
    }
    elsif ($emoji == 23)
    {     
        $emojibyte = "\x37\xE2\x83\xA3"; #Zahl 7
        return $emojibyte;
    }
    elsif ($emoji == 24)
    {     
        $emojibyte = "\x38\xE2\x83\xA3"; #Zahl 8
        return $emojibyte;
    }
    elsif ($emoji == 25)
    {     
        $emojibyte = "\x39\xE2\x83\xA3"; #Zahl 9
        return $emojibyte;
    }
    elsif ($emoji == 26)
    {     
        $emojibyte = "\xF0\x9F\x94\x9F"; #Zahl 10
        return $emojibyte;
    }
    elsif ($emoji == 27)
    {     
        $emojibyte = "\xF0\x9F\x8F\xA0"; #Haus
        return $emojibyte;
    }
    elsif ($emoji == 28)
    {     
        $emojibyte = "\xF0\x9F\x8F\xA1"; #Haus mit Garten
        return $emojibyte;
    }
    elsif ($emoji == 29)
    {     
        $emojibyte = "\xF0\x9F\x90\x94"; #Hahn
        return $emojibyte;
    }
    elsif ($emoji == 30)
    {     
        $emojibyte = "\xF0\x9F\x90\x98"; #Elefant
        return $emojibyte;
    }
    elsif ($emoji == 31)
    {     
        $emojibyte = "\xF0\x9F\x90\xA2"; #Schildkröte
        return $emojibyte;
    }
    elsif ($emoji == 32)
    {     
        $emojibyte = "\xF0\x9F\x90\xAC"; #Delphin
        return $emojibyte;
    }
    elsif ($emoji == 33)
    {     
        $emojibyte = "\xF0\x9F\x90\xB3"; #Wal
        return $emojibyte;
    }
    elsif ($emoji == 34)
    {     
        $emojibyte = "\xF0\x9F\x90\xBB"; #Teddy
        return $emojibyte;
    }
    elsif ($emoji == 35)
    {     
        $emojibyte = "\xF0\x9F\x91\x89"; #Finger zeigt nach rechts
        return $emojibyte;
    }
    elsif ($emoji == 36)
    {     
        $emojibyte = "\xF0\x9F\x91\x8D"; #Daumen hoch
        return $emojibyte;
    }
    elsif ($emoji == 37)
    {     
        $emojibyte = "\xF0\x9F\x91\x8E"; #Daumen runter
        return $emojibyte;
    }
    elsif ($emoji == 38)
    {     
        $emojibyte = "\xF0\x9F\x92\xA9"; #Kackhaufen
        return $emojibyte;
    }
    elsif ($emoji == 39)
    {     
        $emojibyte = "\xF0\x9F\x93\x85"; #Kalender
        return $emojibyte;
    }
    elsif ($emoji == 40)
    {     
        $emojibyte = "\xF0\x9F\x93\x8C"; #Pin
        return $emojibyte;
    }
    elsif ($emoji == 41)
    {     
        $emojibyte = "\xF0\x9F\x93\x8D"; #ROUND PUSHPIN
        return $emojibyte;
    }
    elsif ($emoji == 42)
    {     
        $emojibyte = "\xE2\x9B\xBD"; #Zapfsäule
        return $emojibyte;
    }
    elsif ($emoji == 43)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA6"; #Ampel
        return $emojibyte;
    }
    elsif ($emoji == 44)
    {     
        $emojibyte = "\xF0\x9F\x90\x8F"; #Schaf
        return $emojibyte;
    }
    elsif ($emoji == 45)
    {     
        $emojibyte = "\xF0\x9F\x98\x9A"; #KISSING FACE WITH CLOSED EYES
        return $emojibyte;
    }
    elsif ($emoji == 46)
    {     
        $emojibyte = "\xF0\x9F\x98\x98"; #FACE THROWING A KISS
        return $emojibyte;
    }
    elsif ($emoji == 47)
    {     
        $emojibyte = "\xF0\x9F\x98\xB3"; #Große Augen
        return $emojibyte;
    }
    elsif ($emoji == 48)
    {     
        $emojibyte = "\xE2\x9C\x88"; #Flugzeug
        return $emojibyte;
    }
    elsif ($emoji == 49)
    {     
        $emojibyte = "\xE2\x9C\x94"; #HEAVY CHECK MARK
        return $emojibyte;
    }
    elsif ($emoji == 50)
    {     
        $emojibyte = "\xE2\x9C\x96"; #HEAVY MULTIPLICATION X
        return $emojibyte;
    }
    elsif ($emoji == 51)
    {     
        $emojibyte = "\xF0\x9F\x9A\xAA"; #Tür
        return $emojibyte;
    }
    elsif ($emoji == 52)
    {     
        $emojibyte = "\xF0\x9F\x92\xA1"; #Lampe
        return $emojibyte;
    }   
    elsif ($emoji == 53)
    {     
        $emojibyte = "\xE2\x9A\xA0"; #Achtung
        return $emojibyte;
    }   
    elsif ($emoji == 54)
    {     
        $emojibyte = "\xE2\x98\x9D"; #Zeigefinger
        return $emojibyte;
    }   
    elsif ($emoji == 55)
    {     
        $emojibyte = "\xE2\x8F\xB3"; #Sanduhr
        return $emojibyte;
    }       
    elsif ($emoji == 56)
    {     
        $emojibyte = "\xE2\x9D\x93"; #rotes Fragezeichen
        return $emojibyte;
    }           
    elsif ($emoji == 57)
    {     
        $emojibyte = "\xE2\x9E\xA1"; #Pfeilzeichen nach rechts
        return $emojibyte;
    }     
    elsif ($emoji == 58)
    {     
        $emojibyte = "\xF0\x9F\x8D\xB9"; #Cocktail
        return $emojibyte;
    }   
    elsif ($emoji == 59)
    {     
        $emojibyte = "\xF0\x9F\x8C\xB4"; #Palme
        return $emojibyte;
    }       
    elsif ($emoji == 60)
    {     
        $emojibyte = "\xF0\x9F\x90\xA0"; #tropischer Fisch
        return $emojibyte;
    }       
    elsif ($emoji == 61)
    {     
        $emojibyte = "\xF0\x9F\x8F\x84"; #Surfer
        return $emojibyte;
    }       
}


Die Routinen habe ich natürlich sehr auf meine Bedürfnisse angepasst, via Copy & Paste kann man diese nicht einfach so übernehmen.
Ihr könnt Euch das ja einfach mal so anschauen, falls ihr Fragen habt, kann ich gerne genauer darauf eingehen.

Gruß
Mathze

steffen83

Klingt echt super. Ich hätte mir das so vorgestellt:
Ich verlasse das Haus und in dem Moment bekomme ich die Push Meldung dass in meiner Stadt folgende mobile Blitzer vorhanden sind....
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

accessburn

Das als Modul wäre der Hammer :-)
Würde ich auch so einbauen, hab nur keine Ahnung davon  ;D
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

t1me2die

#6
Zitat von: steffen83 am 06 Juni 2018, 14:38:17
Klingt echt super. Ich hätte mir das so vorgestellt:
Ich verlasse das Haus und in dem Moment bekomme ich die Push Meldung dass in meiner Stadt folgende mobile Blitzer vorhanden sind....

Genau so mache ich es aus. Wenn ich das Haus verlasse, bekomme ich direkt eine Nachricht, wo die Blitzer stehen  ;)

Anscheinend ist ja etwas Interesse da, ob dies für ein Modul reicht, wage ich zu bezweifeln.

Ihr könnt den Code ja mal in eure 99_myUtils knallen und dann schauen wir mal, wo Fehler vorhanden sind.

Eigentlich braucht ihr nur Telegram einrichten, einen notify der eingehende Nachrichten überwacht (optional, falls man Nachrichten an Telegram schicken möchte!).

Zuerst sollte der define für Telegram vorhanden sein (bzw. eingerichtet sein laut Wiki)

define Telegram TelegramBot


Der notify könnte ungefähr so ausschauen:

define getMessageTelegram notify Telegram:msgId:.* { checkMessage() }


Nun braucht ihr nur noch eine Routine, welches die eingehenden Nachrichten prüft (Achtung, habe diese Routine kurz gekürzt und nicht getestet, da meine Routine deutlich mehr Nachrichten prüfen kann!)

# -- Prüft die eingehende Nachricht
sub checkMessage()
{
my $id = ReadingsVal("Telegram","msgPeerId","");
my $alias = ReadingsVal("Telegram","msgPeer","");
my $message = ReadingsVal("Telegram","msgText","");

        if (($message =~ /Blitzer/g) and ($message ne "Hilfe Blitzer"))
        {
            fhem "set Telegram message \@$id " .getBlitzer($message,$id);
        }
        elsif ($message eq "Hilfe Blitzer")
        {
            fhem "set Telegram message \@$id "  .getEmoji(56) ." Blitzer-Hilfe:\n\n"
                                                .getEmoji(57) ." [Blitzer/Feste Blitzer] [Stadt/Bundesland]\n\n"
                                                .getEmoji(57) ." Es ist möglich als optionale Angabe auch eine Stadt oder Bundesland anzugeben.\n\n"
                                                .getEmoji(57) ." Beispiel: Blitzer Parchim \n (Zeigt alle mobilen Blitzer von Parchim an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Feste Blitzer Parchim \n (Zeigt alle festen Blitzer von Parchim an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Bad Segeberg Blitzer \n (Zeigt alle mobilen Blitzer von Bad Segeberg an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Bad Segeberg Feste Blitzer \n (Zeigt alle festen Blitzer von Bad Segeberg an!)";           
        }
}


Nun sollte es möglich sein, die Blitzer abzufragen.

Am besten "Hilfe Blitzer" via Telegram senden und dann erscheint eine "kleine" Hilfe.

Falls ihr soweit gekommen seid, schauen wir mal weiter  :)

Gruß
Mathze

PS.: Falls hier unerwarteterweise doch mehr Interesse aufkommen sollte, muss ein Mod wohl den Thread verschieben.

accessburn

Geht einwandfrei! :D

Aaaaaber... Ort neben Frankfurt: Bad Homburg von der Höhe. Er macht Ärger, wahrscheinlich das ö.
Kann ich da was machen?
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Brice

FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

Fhemschorsch

Vielen Dank, das ist ja echt der Hammer!

Ich bin leider nicht so der oberbegnadete Programmierer, aber ich werde mir mal anschauen, ob man irgendwie einen Koordinatenkorridor (z.B. Weg zur Arbeit) vorgeben kann, in dem er die mobilen Blitzer rückmeldet. Bei mir ist es leider Bundeslandübergreifend (Schleswig-Holstein nach Hamburg-Nord), da interessiert mich der mobile Blitzer in Süd- oder Osthamburg auch nicht mehr wirklich.

t1me2die

#10
An so einen Ortsnamen habe ich natürlich nicht gedacht...
Hab kurz mal nen update gemacht und nur grob getestet.

Für Alle, die gerade neu dazukommen und Interesse haben dies auch mal auszuprobieren:

1. Telegram laut Wiki einrichten

define Telegram TelegramBot


2. Einen notify / doif (wie ihr mögt) anlegen der auf eingehende Nachrichten reagiert

define getMessageTelegram notify Telegram:msgId:.* { checkMessage() }


3. In der 99_myUtils nun die Routine einfügen, die durch das notify aufgerufen wird (diese könnte wie folgt ausschauen!)
Optional ist hier der Aufruf der Emoji's, welche man selber anpassen könnte. Wenn man den Aufruf der Emoji's raus nimmt, kann man Step 4 überspringen, ansonsten benötigt man Step 4, damit es keinen Compile-Fehler gibt.

# -- Prüft die eingehende Nachricht
sub checkMessage()
{
my $id = ReadingsVal("Telegram","msgPeerId","");
my $alias = ReadingsVal("Telegram","msgPeer","");
my $message = ReadingsVal("Telegram","msgText","");

        if (($message =~ /Blitzer/g) and ($message ne "Hilfe Blitzer"))
        {
            fhem "set Telegram message \@$id " .getBlitzer($message,$id);
        }
        elsif ($message eq "Hilfe Blitzer")
        {
            fhem "set Telegram message \@$id "  .getEmoji(56) ." Blitzer-Hilfe:\n\n"
                                                .getEmoji(57) ." [Blitzer/Feste Blitzer] [Stadt/Bundesland]\n\n"
                                                .getEmoji(57) ." Es ist möglich als optionale Angabe auch eine Stadt oder Bundesland anzugeben.\n\n"
                                                .getEmoji(57) ." Beispiel: Blitzer Parchim \n (Zeigt alle mobilen Blitzer von Parchim an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Feste Blitzer Parchim \n (Zeigt alle festen Blitzer von Parchim an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Bad Segeberg Blitzer \n (Zeigt alle mobilen Blitzer von Bad Segeberg an!)\n\n"
                                                .getEmoji(57) ." Beispiel: Bad Segeberg Feste Blitzer \n (Zeigt alle festen Blitzer von Bad Segeberg an!)";           
        }
}


4. Optional ist hier die Routine für die Emoji's

# ------------------------------------------------------------------------ #
# Ermittel den jeweiligen Emoji                                            #
# ------------------------------------------------------------------------ #

sub getEmoji($)
{
    my ($emoji) = @_;
    my $emojibyte = "";
   
    if ($emoji == 1)
    {     
        $emojibyte = "\xF0\x9F\x98\x81"; #GRINNING FACE WITH SMILING EYES
        return $emojibyte;
    }
    elsif ($emoji == 2)
    {     
        $emojibyte = "\xF0\x9F\x98\x8B"; #FACE SAVOURING DELICIOUS FOOD
        return $emojibyte;
    }
    elsif ($emoji == 3)
    {     
        $emojibyte = "\xF0\x9F\x98\x8D"; #SMILING FACE WITH HEART-SHAPED EYES
        return $emojibyte;
    }
    elsif ($emoji == 4)
    {     
        $emojibyte = "\xF0\x9F\x99\x88"; #SEE-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 5)
    {     
        $emojibyte = "\xF0\x9F\x99\x89"; #HEAR-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 6)
    {     
        $emojibyte = "\xF0\x9F\x99\x8A"; #SPEAK-NO-EVIL MONKEY
        return $emojibyte;
    }
    elsif ($emoji == 7)
    {     
        $emojibyte = "\xF0\x9F\x99\x8B"; #HAPPY PERSON RAISING ONE HAND
        return $emojibyte;
    }
    elsif ($emoji == 8)
    {     
        $emojibyte = "\xF0\x9F\x9A\x93"; #POLICE CAR
        return $emojibyte;
    }
    elsif ($emoji == 9)
    {     
        $emojibyte = "\xF0\x9F\x9A\x97"; #AUTOMOBILE(RED)
        return $emojibyte;
    }
    elsif ($emoji == 10)
    {     
        $emojibyte = "\xF0\x9F\x9A\x99"; #AUTOMOBILE(BLUE)
        return $emojibyte;
    }
    elsif ($emoji == 11)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA5"; #HORIZONTAL TRAFFIC LIGHT
        return $emojibyte;
    }
    elsif ($emoji == 12)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA7"; #CONSTRUCTION SIGN
        return $emojibyte;
    }
    elsif ($emoji == 13)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA8"; #POLICE CARS REVOLVING LIGHT
        return $emojibyte;
    }
    elsif ($emoji == 14)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA9"; #TRIANGULAR FLAG ON POST
        return $emojibyte;
    }
    elsif ($emoji == 15)
    {     
        $emojibyte = "\xF0\x9F\x9A\xB6"; #PEDESTRIAN
        return $emojibyte;
    }
    elsif ($emoji == 16)
    {     
        $emojibyte = "\x30\xE2\x83\xA3"; #Zahl 0
        return $emojibyte;
    }
    elsif ($emoji == 17)
    {     
        $emojibyte = "\x31\xE2\x83\xA3"; #Zahl 1
        return $emojibyte;
    }
    elsif ($emoji == 18)
    {     
        $emojibyte = "\x32\xE2\x83\xA3"; #Zahl 2
        return $emojibyte;
    }
    elsif ($emoji == 19)
    {     
        $emojibyte = "\x33\xE2\x83\xA3"; #Zahl 3
        return $emojibyte;
    }
    elsif ($emoji == 20)
    {     
        $emojibyte = "\x34\xE2\x83\xA3"; #Zahl 4
        return $emojibyte;
    }
    elsif ($emoji == 21)
    {     
        $emojibyte = "\x35\xE2\x83\xA3"; #Zahl 5
        return $emojibyte;
    }
    elsif ($emoji == 22)
    {     
        $emojibyte = "\x36\xE2\x83\xA3"; #Zahl 6
        return $emojibyte;
    }
    elsif ($emoji == 23)
    {     
        $emojibyte = "\x37\xE2\x83\xA3"; #Zahl 7
        return $emojibyte;
    }
    elsif ($emoji == 24)
    {     
        $emojibyte = "\x38\xE2\x83\xA3"; #Zahl 8
        return $emojibyte;
    }
    elsif ($emoji == 25)
    {     
        $emojibyte = "\x39\xE2\x83\xA3"; #Zahl 9
        return $emojibyte;
    }
    elsif ($emoji == 26)
    {     
        $emojibyte = "\xF0\x9F\x94\x9F"; #Zahl 10
        return $emojibyte;
    }
    elsif ($emoji == 27)
    {     
        $emojibyte = "\xF0\x9F\x8F\xA0"; #Haus
        return $emojibyte;
    }
    elsif ($emoji == 28)
    {     
        $emojibyte = "\xF0\x9F\x8F\xA1"; #Haus mit Garten
        return $emojibyte;
    }
    elsif ($emoji == 29)
    {     
        $emojibyte = "\xF0\x9F\x90\x94"; #Hahn
        return $emojibyte;
    }
    elsif ($emoji == 30)
    {     
        $emojibyte = "\xF0\x9F\x90\x98"; #Elefant
        return $emojibyte;
    }
    elsif ($emoji == 31)
    {     
        $emojibyte = "\xF0\x9F\x90\xA2"; #Schildkröte
        return $emojibyte;
    }
    elsif ($emoji == 32)
    {     
        $emojibyte = "\xF0\x9F\x90\xAC"; #Delphin
        return $emojibyte;
    }
    elsif ($emoji == 33)
    {     
        $emojibyte = "\xF0\x9F\x90\xB3"; #Wal
        return $emojibyte;
    }
    elsif ($emoji == 34)
    {     
        $emojibyte = "\xF0\x9F\x90\xBB"; #Teddy
        return $emojibyte;
    }
    elsif ($emoji == 35)
    {     
        $emojibyte = "\xF0\x9F\x91\x89"; #Finger zeigt nach rechts
        return $emojibyte;
    }
    elsif ($emoji == 36)
    {     
        $emojibyte = "\xF0\x9F\x91\x8D"; #Daumen hoch
        return $emojibyte;
    }
    elsif ($emoji == 37)
    {     
        $emojibyte = "\xF0\x9F\x91\x8E"; #Daumen runter
        return $emojibyte;
    }
    elsif ($emoji == 38)
    {     
        $emojibyte = "\xF0\x9F\x92\xA9"; #Kackhaufen
        return $emojibyte;
    }
    elsif ($emoji == 39)
    {     
        $emojibyte = "\xF0\x9F\x93\x85"; #Kalender
        return $emojibyte;
    }
    elsif ($emoji == 40)
    {     
        $emojibyte = "\xF0\x9F\x93\x8C"; #Pin
        return $emojibyte;
    }
    elsif ($emoji == 41)
    {     
        $emojibyte = "\xF0\x9F\x93\x8D"; #ROUND PUSHPIN
        return $emojibyte;
    }
    elsif ($emoji == 42)
    {     
        $emojibyte = "\xE2\x9B\xBD"; #Zapfsäule
        return $emojibyte;
    }
    elsif ($emoji == 43)
    {     
        $emojibyte = "\xF0\x9F\x9A\xA6"; #Ampel
        return $emojibyte;
    }
    elsif ($emoji == 44)
    {     
        $emojibyte = "\xF0\x9F\x90\x8F"; #Schaf
        return $emojibyte;
    }
    elsif ($emoji == 45)
    {     
        $emojibyte = "\xF0\x9F\x98\x9A"; #KISSING FACE WITH CLOSED EYES
        return $emojibyte;
    }
    elsif ($emoji == 46)
    {     
        $emojibyte = "\xF0\x9F\x98\x98"; #FACE THROWING A KISS
        return $emojibyte;
    }
    elsif ($emoji == 47)
    {     
        $emojibyte = "\xF0\x9F\x98\xB3"; #Große Augen
        return $emojibyte;
    }
    elsif ($emoji == 48)
    {     
        $emojibyte = "\xE2\x9C\x88"; #Flugzeug
        return $emojibyte;
    }
    elsif ($emoji == 49)
    {     
        $emojibyte = "\xE2\x9C\x94"; #HEAVY CHECK MARK
        return $emojibyte;
    }
    elsif ($emoji == 50)
    {     
        $emojibyte = "\xE2\x9C\x96"; #HEAVY MULTIPLICATION X
        return $emojibyte;
    }
    elsif ($emoji == 51)
    {     
        $emojibyte = "\xF0\x9F\x9A\xAA"; #Tür
        return $emojibyte;
    }
    elsif ($emoji == 52)
    {     
        $emojibyte = "\xF0\x9F\x92\xA1"; #Lampe
        return $emojibyte;
    }   
    elsif ($emoji == 53)
    {     
        $emojibyte = "\xE2\x9A\xA0"; #Achtung
        return $emojibyte;
    }   
    elsif ($emoji == 54)
    {     
        $emojibyte = "\xE2\x98\x9D"; #Zeigefinger
        return $emojibyte;
    }   
    elsif ($emoji == 55)
    {     
        $emojibyte = "\xE2\x8F\xB3"; #Sanduhr
        return $emojibyte;
    }       
    elsif ($emoji == 56)
    {     
        $emojibyte = "\xE2\x9D\x93"; #rotes Fragezeichen
        return $emojibyte;
    }           
    elsif ($emoji == 57)
    {     
        $emojibyte = "\xE2\x9E\xA1"; #Pfeilzeichen nach rechts
        return $emojibyte;
    }     
    elsif ($emoji == 58)
    {     
        $emojibyte = "\xF0\x9F\x8D\xB9"; #Cocktail
        return $emojibyte;
    }   
    elsif ($emoji == 59)
    {     
        $emojibyte = "\xF0\x9F\x8C\xB4"; #Palme
        return $emojibyte;
    }       
    elsif ($emoji == 60)
    {     
        $emojibyte = "\xF0\x9F\x90\xA0"; #tropischer Fisch
        return $emojibyte;
    }       
    elsif ($emoji == 61)
    {     
        $emojibyte = "\xF0\x9F\x8F\x84"; #Surfer
        return $emojibyte;
    }       
}


5. Nun braucht ihr auch noch die Hauptroutine getBlitzer, welche das Anlegen / Prüfen der Devices erledigt und zu guter letzt auch den Prozess des Auslesens anstößt:

##################################################################################################
# Ermittelt die mobilen / festen Blitzer
##################################################################################################

sub getBlitzer($$)
{
    my ($message,$id) = @_;
    my $space = 0;
    my @array = "";
    my @ort    = "";
    my $ort1   = "";
    my $feste  = 0;
    my $mobile = 0;
my $z      = 0;
   
    $ort[1] = "";
    if ($message eq "Feste Blitzer")
    {
        $feste = 1;
        $ort[0] = "";
        $ort[1] = "";
    }
    elsif ($message eq "Blitzer")
    {
        $mobile = 1;   
        $ort[0] = "";
        $ort[1] = "";
    }
    else
    {
        # Wenn ein Leerzeichen gefunden wurde
        $space = index($message,' ');
        for (my $i = 0; $i < 10; $i++)
        {
            $space = index($message,' ');
            if ($space != -1)
            {
                @array[$i] = substr($message,0,$space);
                $message = substr($message,$space+1);
            }
            else
            {
                @array[$i] = substr($message,0);
                last;
            }
        }   
        foreach(@array)
        {
            if ($_ =~ /Feste/g)
            { $feste = 1; }
            elsif ($_ =~ /Blitzer/g)
            { $mobile = 1; }
if ($_ !~/^Feste$/ and $_ !~/^Blitzer$/ and $z == 0)
{ $z = 1;
              $ort1 = $_;
}
            elsif ($_ !~/^Feste$/ and $_ !~/^Blitzer$/ and $z == 1)
            { $ort1 = $ort1 ."+" .$_;
            }
        }
    }
   
    # Prüfe, ob das Objekt für den Blitzer existiert
    my ($error,$device) = checkHTTPMODBlitzer($feste,$mobile,$ort1);
   
    # Wenn kein Fehler vorhanden ist Daten auslesen
    if ($error != -1)
    {
        if ($error == 0)
        { return getInfoBlitzer($device); }
        elsif ($error == 1)
        {
            fhem "define temp_Blitzer at +00:00:07 { fhem \"set Telegram message \\\@$id \" .getInfoBlitzer(\"$device\") }";
            return "" .getEmoji(55) ."Sekunde, ich sammle alle Informationen!";
        }
    }
    # Device konnte nicht angelegt werden
    elsif($error == -1)
    {
        return "Gereat konnte nicht angelegt werden";
    }
   
}


6. Es fehlt nun noch die Routine, die das HTTPMOD Device mit allen regex im Raum "Verkehr" anlegt.
Hier können weitere Attribute hinzugefügt oder entfernt werden.
(Info: Nach 1h wird das Device wieder gelöscht, wenn ein Device dauerhaft vorhanden sein soll, muss hier manuell eingegriffen werden!)

##################################################################################################
# Errormeldungen:
# -1 = Device konnte nicht angelegt werden
#  0 = Device ist schon vorhanden
#  1 = Device wurde erfolgreich angelegt
##################################################################################################
sub checkHTTPMODBlitzer($$$)
{
    my($feste,$mobile,$ort) = @_;
    my $error = "";
    my $device = "";
    my $link = "";
   
    # Feste Blitzer + Ortsname
    if ($feste == 1 and $mobile == 1 and $ort ne "")
    {
        $device = "fb_" .$ort;
        $link = "https://www.verkehrslage.de/".$ort."/feste+Blitzer";
    }
    # mobile Blitzer + Ortsname
    elsif ($feste == 0 and $mobile == 1 and $ort ne "")
    {
        $device = "mb_" .$ort;
        $link = "https://www.verkehrslage.de/".$ort."/mobile+Blitzer";       
    }
    # Feste Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 1 and $mobile == 0 and $ort eq "")
    {
        $device = "fb_Hamburg";
        $ort    = "Hamburg";
        $link = "https://www.verkehrslage.de/Hamburg/feste+Blitzer";       
    }
    # mobile Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 0 and $mobile == 1 and $ort eq "")
    {
        $device = "mb_Hamburg"; 
        $link = "https://www.verkehrslage.de/Hamburg/mobile+Blitzer";
    }
   
    # Device ist noch nicht angelegt
    $device =~ s/-/_/g;
    $device =~ s/\+/_/g;
$device =~ s/ö/oe/g;
$device =~ s/Ö/Oe/g;
$device =~ s/ü/ue/g;
$device =~ s/Ü/Ue/g;
$device =~ s/ä/ae/g;
$device =~ s/Ä/Ae/g;
$device =~ s/ö/oe/g;
$device =~ s/Ö/Oe/g;
$device =~ s/ö/oe/g;
$device =~ s/Ö/Oe/g;
$device =~ s/ß/ss/g;
$ort    =~ s/\+/ /g;

    if (Value("$device") eq "")
    {
        if(substr($device,0,3) eq "mb_")
        {
            fhem "  define $device HTTPMOD $link 600 ;
                    attr $device room Verkehr ;
                    attr $device enableControlSet 1 ;
                    attr $device reading01Name String ;
                    attr $device reading01Regex <script>\\n  var json_str = (.*) ;
                    attr $device reading01RegOpt g ;
                    attr $device reading01DeleteIfUnmatched 1 ;
                    attr $device reading02Name Strassenname ;
                    attr $device reading02Regex $ort, (.*), \\(<a href ;
                    attr $device reading02RegOpt g  ;
                    attr $device reading02DeleteIfUnmatched 1 ;
                    define t_delete_Blitzer_$device at +01:00:00 { fhem \"delete $device\" }
                    ";   
        }
        elsif(substr($device,0,3) eq "fb_")
        {
            #$ort =~ s/_/+/g;
            fhem "  define $device HTTPMOD $link 600 ;
                    attr $device room Verkehr ;
                    attr $device enableControlSet 1 ;
                    attr $device reading01Name Strassenname ;
                    attr $device reading01Regex $ort, (.*), \\(<a href ;
                    attr $device reading01RegOpt g ;
                    attr $device reading01DeleteIfUnmatched 1 ;
                    define t_delete_Blitzer_$device at +01:00:00 { fhem \"delete $device\" }
                    "; 
        }
        if (Value("$device") eq "")
        { $error = -1;
          return ($error, "");
        }
        else
        { $error = 1;
          return ($error, $device);
        }   
    }
    # Device ist schon vorhanden
    else
    {
        $error = 0;
        return ($error, $device);
    }   
   
}


7. Nun benötigen wir nur noch die Routine, welche die Daten aus dem jeweiligen HTTPMOD Device ausliest:

# ------------------------------------------------------------------------ #
# Ermittelt die aktuellen Blitzer in Hamburg                               #
# ------------------------------------------------------------------------ #

sub getInfoBlitzer($)
{
    my ($device) = @_;
    my $reading;
    my @Blitzer;
    my $pfad;
    my $error = 0;
    my $strasse = "";
    my $txt ="";
    my $vmax = 0;
    my $kmh  = "";
    my $space = 0;
    my $len = "";
    my $str1 = (ReadingsVal("$device","String",""));
   
    if(substr($device,0,3) eq "mb_")
    {
        for (my $i = 0; $i <=15 ; $i++)
        {
            my $l_str = index($str1,'street');
            my $r_str = index($str1,'content');
            my $l_lat = index($str1,'lat');
            my $r_lat = index($str1,'lat_s');
            my $l_lng = index($str1,'lng');
            my $r_lng = index($str1,'lng_s'); 
            my $l_vmax  = index($str1,'vmax');
            my $r_vmax  = index($str1,'counter');
            my $l_id  = index($str1,'{"id"');
            my $r_id  = rindex($str1,'{"id"');
           
            if ($l_str eq "-1")
                { $error = "1"; }
            else
                { $error = "0";  }
            if ($error eq "0")
            {
                my $abc = substr($str1,$l_str+11,$r_str-$l_str-16);
                $abc =~ s/\\\\u00df/ß/g;
                $abc =~ s/\\\\u00e4/ä/g;
                $abc =~ s/\\\\u00f6/ö/g;
                $abc =~ s/\\\\u00fc/ü/g;
                $abc =~ s/\\\\u00dc/Ü/g;
                $abc =~ s/\\\\u00d6/Ö/g;
                #$vmax = substr($str1,$l_vmax+9,2);
                $vmax = substr($str1,$l_vmax+9,$r_vmax-$l_vmax-14);
                $len  = length($vmax);
                if ($len == 2)
                {
                    if ($vmax =~ /^\d\d$/)
                    { $kmh = $vmax ."km/h"; }
                    else
                    { $kmh = "Rotlichtüberwachung"; }
                }
                elsif ($len == 3)
                {
                    if ($vmax =~ /^\d\d\d$/)
                    { $kmh = $vmax ."km/h"; }               
                }
                if ($abc !~ /Oldesloer Straße/i)
                {
                    if ($strasse eq "")
                    { $strasse = "\n " .getEmoji(40) ." $abc ($kmh) " .getEmoji(8) ." \ngoogle.de/maps/place/" .substr($str1,$l_lat+8,$r_lat-$l_lat-13) ."+" .substr($str1,$l_lng+8,$r_lng-$l_lng-13) ." " .getEmoji(41);
                    }
                    else
                    { $strasse =  "$strasse\n " .getEmoji(40) ." $abc ($kmh) " .getEmoji(8) ." \ngoogle.de/maps/place/" .substr($str1,$l_lat+8,$r_lat-$l_lat-13) ."+" .substr($str1,$l_lng+8,$r_lng-$l_lng-13) ." " .getEmoji(41);
                    }
                    $str1 = substr($str1,$r_str+90);
                }
            }
        }   
        if ($strasse eq "")
        {
            $txt = "Es sind keine mobile Blitzer gemeldet, gib GUMMI " .getEmoji(10) ." " .getEmoji(4);
        }
        else
        {
            $txt = getEmoji(13) ." " .getEmoji(53) . " " .getEmoji(13) ." Fahr vorsichtig, zur Zeit sind folgende mobile Blitzer aktiv: " .$strasse;   
        }
    }
    elsif(substr($device,0,3) eq "fb_")
    {
        for (my $i = 0; $i <=50 ; $i++)
        {
            if ($i == 0)
            { $reading = "Strassenname"; }
            else
            { $reading = "Strassenname-" .$i; }
       
            if (ReadingsVal("$device",$reading,"") ne "")
            {
                $Blitzer[$i] = (ReadingsVal("$device",$reading,""));
            }
        }
        foreach(@Blitzer)
        {
            if ($strasse eq "")
            { $strasse = $_; }
            else
            { $strasse =  "$strasse" ."\n* " .$_; }
        }
   
        if ($strasse eq "")
        {   
            $txt = "Es sind keine festen Blitzer gemeldet, gib GUMMI :D";
        }
        else
        {
            $txt = "Fahr vorsichtig, zur Zeit sind folgende feste Blitzer aktiv: \n* " .$strasse;   
        }   
    }   
       
    return $txt;
   
}



Wenn nun alles funktioniert hat, kann man eine Nachricht an seinen Telegrambot schreiben mit "Hilfe Blitzer" und erhält eine "grobe" Anleitung, wie man den Bot befüttern muss, damit man die aktuellen Blitzer mitgeteilt bekommt.

z.B.:

* Blitzer Hamburg (ermittelt alle mobilen Blitzer von Hamburg)
* Feste Blitzer Hamburg (ermittelt alle festen Blitzer von Hamburg)
* Blitzer Homburg vor der Höhe (ermittelt alle mobilen Blitzer von Homburg vor der Höhe)
* Feste Blitzer Homburg vor der Höhe (ermittelt alle festen Blitzer von Homburg vor der Höhe)
* Feste Blitzer Berlin (ermittelt alle festen Blitzer von Berlin)
* Blitzer Berlin (ermittelt alle mobilen Blitzer von Berlin)
* Blitzer A1 (ermittelt alle mobilen Blitzer auf der A1)
* Feste Blitzer A1 (ermittelt alle festen Blitzer auf der A1)
* Blitzer Bayern (ermittelt alle mobilen Blitzer im Bundesland "Bayern")


Zur Info:
Zur Zeit habe ich es eingestellt, dass maximal 15 mobile Blitzer geladen werden (wegen der Übersicht), dies kann man auch erhöhen, dazu einfach die Schleife in der Routine "getInfoBlitzer" von 15 auf die gewünschte Anzahl hochschrauben!
Bei den festen Blitzern ermittelt er maximal 50!

Falls das soweit klappt, würde ich gerne einen neuen Thread unter "Codeschnipsel" aufmachen und diesen Post als groben Leitfaden nutzen, was haltet ihr davon?

Im Anhang findet sich das Beispiel von Bad Homburg vor der Höhe.

PS.: Falls Interesse besteht, ich habe für die Ermittlung der Spritpreise eine ähnliche Routine geschrieben, siehe Screenshots. Könnte diese dann auch veröffentlichen  :)

Gruß
Mathze

t1me2die

Zitat von: Fhemschorsch am 06 Juni 2018, 22:18:59
Vielen Dank, das ist ja echt der Hammer!

Ich bin leider nicht so der oberbegnadete Programmierer, aber ich werde mir mal anschauen, ob man irgendwie einen Koordinatenkorridor (z.B. Weg zur Arbeit) vorgeben kann, in dem er die mobilen Blitzer rückmeldet. Bei mir ist es leider Bundeslandübergreifend (Schleswig-Holstein nach Hamburg-Nord), da interessiert mich der mobile Blitzer in Süd- oder Osthamburg auch nicht mehr wirklich.

Es gibt die App Geofancy (auf jeden Fall für iOS), die App teilt via Webhook die jeweils angelegten Orte direkt an FHEM mit, dazu einfach mal ins Wiki schauen (https://wiki.fhem.de/wiki/GEOFANCY).
Ich habe z.B. einen Radius um meine Arbeit angelegt, sobald dieser Radius verlassen wird, erhalte ich automatisch via Telegram die mobilen Blitzer.

Gruß
Mathze

steffen83

Mathze! Mega geil!
Läuft super per Copy Paste :-)
Raspberry Pi 3 (Noobs, aktuelle Fhem und Pilight) | FHEMduino | HM-OCCU-SDK | HM-Sec-SCo | HM-Sec-SD-2 | HM-CC-RT-DN | HM-LC-Bl1PBU-FM

t1me2die

Meistens ist es ja so, dass man die Blitzer immer für einen bestimmten Ort haben möchte, z.B. "Hamburg", "Berlin", "Bremen", "Schwerin", ....
Damit man nicht jedes mal "Blitzer Schwerin" schreiben muss, empfiehlt es sich beim 1. mal das delete-Device (welches nach 1h automatisch das angelegte Device wieder löscht) manuell unter dem Raum "Unsorted" zu löschen, sodass das Device weiterhin bestehen bleibt!

1.
Nun sollte das Device "mb_Ortsname" im Raum Verkehr weiterhin bestehen bleiben.

2.
In der Routine "checkHTTPMODBlitzer" muss nun noch der Ortsname angepasst werden (zur Zeit steht da fb_Hamburg und mb_Hamburg)

Zitat
# Feste Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 1 and $mobile == 0 and $ort eq "")
    {
        $device = "fb_Hamburg";
        $ort    = "Hamburg";
        $link = "https://www.verkehrslage.de/Hamburg/feste+Blitzer";       
    }
    # mobile Blitzer ohne Ortsname -> Hamburg
    elsif ($feste == 0 and $mobile == 1 and $ort eq "")
    {
        $device = "mb_Hamburg"; 
        $link = "https://www.verkehrslage.de/Hamburg/mobile+Blitzer";
    }


3.
Wenn das erledigt ist, sollte es reichen, wenn man Blitzer oder Feste Blitzer schreibt und man erhält dann automatisch die Liste für den unter Punkt 2 eingetragenen Ort.

4.
Durch diesen fest ausgewählten Ort kann man nun z.B. sich automatisch eine Nachricht zusenden lassen, wenn man das Haus verlässt (Bluetooth Anwesenheit, o.ä. Anwesenheitserkennungen...)
Dazu benötigt man nur noch ein Statement an der jeweiligen Stelle. Hier muss nur noch die Variable $nr durch die Telegram ID ersetzt werden. Dies kann man dynamisch ermitteln oder einfach fest im Quellcode reinschreiben. Je nach dem was man machen möchte!

fhem "set Telegram message \@$nr " .getBlitzer("Blitzer","");


Falls ihr Probleme haben solltet, schauen wir uns das mal genauer an  :)

Gruß
Mathze

binford6000

Hallo Mathze,
wirklich tolle Arbeit! Ich würde mich auch freuen wenn du die ganzen Codeschnipsel
in ein Modul gießen würdest!  Damit wäre eine einfachere Integration in FHEM möglich,
anpassbare Dialogtexte per attr usw.
Emojis können btw. auch direkt im Code drinstehen...
set TelegramBot msg 😉 geht auch einwandfrei!

ZitatVielen Dank, das ist ja echt der Hammer!

Ich bin leider nicht so der oberbegnadete Programmierer, aber ich werde mir mal anschauen, ob man irgendwie einen Koordinatenkorridor (z.B. Weg zur Arbeit) vorgeben kann, in dem er die mobilen Blitzer rückmeldet. Bei mir ist es leider Bundeslandübergreifend (Schleswig-Holstein nach Hamburg-Nord), da interessiert mich der mobile Blitzer in Süd- oder Osthamburg auch nicht mehr wirklich.

@Fhemschorsch: Mich teilt auch dein Schicksal: Ich starte in RLP, fahre ein Stück durch Hessen und lande wieder in RLP.
Habe aber auch Geofencing mit livetracking im Einsatz. Hätte also auch immer den aktuellen Standort parat. Aber so ein Korridor
wäre schon was feines... :-)

Aber wie gesagt, tolle Arbeit und weiter so Mathze!
VG Sebastian