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.
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?
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?
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
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....
Das als Modul wäre der Hammer :-)
Würde ich auch so einbauen, hab nur keine Ahnung davon ;D
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.
Geht einwandfrei! :D
Aaaaaber... Ort neben Frankfurt: Bad Homburg von der Höhe. Er macht Ärger, wahrscheinlich das ö.
Kann ich da was machen?
ö=oe
Bad Homburg von der Hoehe
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.
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
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
Mathze! Mega geil!
Läuft super per Copy Paste :-)
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
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
Hallo Mathze,
super Sache das!!!!!!! Macht Spass, man kann das ganze ja auch in die Telegrambot Favoriten packen, dann muss man nur einmal auf das kommando im Telegram Fenster tippen.
Siehe Favoriten für Kommandos: https://wiki.fhem.de/wiki/TelegramBot#Favoriten_f.C3.BCr_Kommandos_anlegen
(Ganz unten in diesem text mal mein Beispiel, ich übergebe allerdings meiner sub checkMessage das Event)
Noch 4 Sachen, die mir aufgefallen sind:
1) Wenn ich {getBlitzer("Blitzer Bayern","")} in fhem eingebe, also nach mobilen Blitzern in Bayern suche, kommen folgende Informationen, da fehlt aber der Ort, hier im Beispiel "Eching". Ohne den Ort weiss man aber gar nicht wo sich die E53 befindet und ob der Blitzer relevant für mich ist.
ZitatE53 (70km/h)
google.de/maps/place/48.317365+11.632915
im Webbrowser erscheint aber der Blitzer mit Strasse und Ort:
ZitatEching, E53, (Karte)
2) Ebenso bei den festen Blitzern: Kann man bei der langen Liste der festen Blitzer evtl auch vorne den Ort, und hinten den link zur Karte anhängen? Für München kommt zum Beispiel für feste Blitzer:
Zitat* A99
* B2R
* B2R
* B2R
* B2r Richard-Strauss-Tunnel
da kann man aber nicht draus ersehen, welcher Ort, wo die drei B2R Blitzer stecken. Wenn man den Ort hätte wüsste man ob man durch diesen Ort fährt, und evtl noch den Google maps link hätte, könnte man kurz nachschauen.
Auf der Website sind die Karten mit dabei:
ZitatMünchen, B2R, (Karte)
München, B2R, (Karte)
München, B2R, (Karte)
3) Wenn man aus Versehen "Blitzer Hamburg" statt "Blitzer Hamburg" eingibt (also aus Versehen 2 Leerzeichen anstatt einem Leerzeichen), wird ein device
Zitatmb__Hamburg: Defined with URL https://www.verkehrslage.de/+Hamburg/mobile+Blitzer and interval 600
angelegt, und dann werden keine Blitzer für +Hamburg gefunden. Da muss man an der Leerzeichenerkennung was ändern, ich bin aber nicht der Experte.
4) Ich würde
define t_delete_Blitzer_$device at ....
in
defmod t_delete_Blitzer_$device at ....
ändern, weil fhem sich sonst evtl beschwert, das es das t_... device schon gibt (Gut, ich gebe zu ich habe manuell das HTTPMOD device gelöscht,, und dann gab es das t_... at device natürlich noch, da hat FHEM sich dann beim neu-anlegen beschwert.)
Mein Beispiel für Telegram Favoriten (Raw definition):
attr Telegram favorites [Mobile Blitzer M]={checkMessage("Blitzer München")};;\
/[Feste Blitzer M]={checkMessage("Feste Blitzer München")};;\
/[Mobile Blitzer H]={checkMessage("Blitzer Hamburg")};;\
/[Feste Blitzer H]={checkMessage("Feste Blitzer Hamburg")};;
Beste Grüsse!
Hab mal bisschen weiter gespielt. Also das Favoriten-Ding funktioniert bei Telegram leider nicht, alle anderen Favoriten funktionieren nach wie vor:
Zitat{checkMessage("Blitzer"):: - Ergebnis: Too many arguments for main::checkMessage at (eval 317168) line 1, near "Blitzer"
Des weiteren ist es mir jetzt zweimal passiert das danach plötzlich alle "room" verstellt waren, es existiert nur noch "Verkehr" und "unsorted" und in Verkehr sind aaaaalle Devices drin die ich besitze.
Großes, dickes aua...
Mit soviel Resonanz habe ich nun aber gar nicht gerechnet :o
Zuerst einmal ein kleiner Fix um das Problem mit doppelten Leerzeichen zu beheben!
Einfach die Rountine "getBlitzer($$)" durch folgende ersetzen.
##################################################################################################
# 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);
$message =~ s/^\s+//;
}
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 "defmod 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";
}
}
Die Abfrage der festen Blitzer für ein ganzes Bundesland funktioniert nur bei ganz wenigen Bundesländern (Hamburg, Bremen & Berlin).
Bei allen anderen Bundesländern funktioniert meine Regex nicht!
Das liegt damit zusammen, dass ich bei den festen Blitzern die Readings auslese die mir HTTPMOD bereitgestellt hat, mit dem jeweiligen RegEx.
Bei den mobilen Blitzern arbeite ich mit dem JSON String, welcher mir viel mehr Flexibilität gewährt.
(Ich muss dazu auch sagen, dass feste Blitzer nie mein Hauptaugenmerkt waren, da man die meisten festen Blitzer eh kennt!)
Habe die Routine "getInfoBlitzer" um den jeweiligen Ort erweitert. Der Ort wird nur dann angezeigt, wenn es sich um ein Bundesland mit mehr als einem Ort handelt!
(Bei Hamburg, Bremen und Berlin ist dies überflüssig!)Habe die Routine kurzerhand umgeschrieben.
Die festen Blitzer habe ich nun auch auf JSON umgestellt (alte fb_Devices, sollten zu Beginn einmal gelöscht werden!)
Des Weiteren habe ich den Code etwas überarbeitet und verkürzt.
# ------------------------------------------------------------------------ #
# Ermittelt die aktuellen Blitzer in Hamburg #
# ------------------------------------------------------------------------ #
sub getInfoBlitzer($)
{
my ($device) = @_;
my $reading;
my @Blitzer;
my $pfad;
my $error = 0;
my $strasse = "";
my $city ="";
my $txt ="";
my $vmax = 0;
my $kmh = "";
my $space = 0;
my $len = "";
my $bundesland = 0;
my $zaehler = 0;
my $str1 = (ReadingsVal("$device","String",""));
if ((substr($device,3) eq "Brandenburg")
or (substr($device,3) eq "Baden-Würtetemberg")
or (substr($device,3) eq "Bayern")
or (substr($device,3) eq "Hessen")
or (substr($device,3) eq "Mecklemburg-Vorpommern")
or (substr($device,3) eq "Niedersachsen")
or (substr($device,3) eq "Nordrhein-Westfalen")
or (substr($device,3) eq "Rheinland-Pfalz")
or (substr($device,3) eq "Schleswig-Holstein")
or (substr($device,3) eq "Saarland")
or (substr($device,3) eq "Sachsen")
or (substr($device,3) eq "Sachsen-Anhalt")
or (substr($device,3) eq "Thüringen"))
{
$bundesland = 1;
}
# Bei mobilen Blitzern maximal 15Stück anzeigen
# Bei festen Blitzern maximal 100Stück anzeigen
# Mobile Blitzer werden im String anders aufbereitet
if(substr($device,0,3) eq "mb_")
{ $zaehler = 15; }
elsif(substr($device,0,3) eq "fb_")
{ $zaehler = 100; }
for (my $i = 0; $i <=$zaehler ; $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"');
my $l_city = index($str1,'city');
my $r_city = rindex($str1,'street');
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;
$city = substr($str1,$l_city+9,$l_str-$l_city-14);
$city =~ s/\\\\u00df/ß/g;
$city =~ s/\\\\u00e4/ä/g;
$city =~ s/\\\\u00f6/ö/g;
$city =~ s/\\\\u00fc/ü/g;
$city =~ s/\\\\u00dc/Ü/g;
$city =~ s/\\\\u00d6/Ö/g;
$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 ($bundesland == 1)
{ $abc = $city .", " .$abc;
}
if ($abc !~ /Oldesloer Straße/i)
{
if(substr($device,0,3) eq "mb_")
{
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);
}
}
elsif(substr($device,0,3) eq "fb_")
{
if ($strasse eq "")
{ $strasse = "$abc ($kmh) "; }
else
{ $strasse = "$strasse\n* $abc ($kmh) "; }
}
}
}
$str1 = substr($str1,$r_str+180);
}
if ($strasse eq "" and (substr($device,0,3) eq "mb_"))
{ $txt = "Es sind keine mobile Blitzer gemeldet, gib GUMMI " .getEmoji(10) ." " .getEmoji(4);
}
elsif ($strasse ne "" and (substr($device,0,3) eq "mb_"))
{ $txt = getEmoji(13) ." " .getEmoji(53) . " " .getEmoji(13) ." Fahr vorsichtig, zur Zeit sind folgende mobile Blitzer aktiv: " .$strasse;
}
elsif ($strasse eq "" and (substr($device,0,3) eq "fb_"))
{ $txt = "Es sind keine festen Blitzer gemeldet, gib GUMMI " .getEmoji(10) ." " .getEmoji(4);
}
elsif ($strasse ne "" and (substr($device,0,3) eq "fb_"))
{ $txt = getEmoji(13) ." " .getEmoji(53) . " " .getEmoji(13) ." Fahr vorsichtig, zur Zeit sind folgende feste Blitzer aktiv: \n* " .$strasse;
}
return $txt;
}
Ich werde, wenn ich mal etwas Zeit bei dem schönen Wetter finde die "Festen Blitzer" auch auf den JSON String umbauen. Das Problem bei festen Blitzern ist die Anzahl, ich könnte theoretisch auch hier jeden Blitzer mit den GPS Koordinaten aufbauen, jedoch würde ich dadurch die Telegram Nachricht unleserlich in die Länge ziehen.
Allein Hamburg hat schon gefühlt mehr als 40 Blitzer, wenn ich da nun mehr als den reinen Straßennamen anzeige würde, würde man sich in der Telegram Nachricht "tot" scrollen.
Ich werde mir da nochmal Gedanken drüber machen, aber wie schon weiter oben gesagt, liegt mein Hauptaugenmerk auf den "mobilen Blitzern", da diese ja für uns Autofahrer unerwarteter kommen als "feste Blitzer" ;D
Um die Routine "getInfoBlitzer" verwenden zu können muss auch die Routine "checkHTTPMODBlitzer" angepasst werden!
Feste Blitzer haben nun ein zusätzliches RegEx spendiert bekommen, welches mir den JSON String in einem Reading ablegt, sodass ich diesen direkt auswerten kann :)
##################################################################################################
# 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 ;
defmod 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 String ;
attr $device reading01Regex 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 ;
defmod 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);
}
}
Zur Info:
- Anzahl der mobilen Blitzer = 15
- Anzahl der festen Blitzer = 100
Ich muss auch aufpassen, dass ich die maximale Zeichenlänge der zulässigen Telegram Nachricht nicht sprenge :)
Zu dem Thema Telegram Favouriten kann ich "noch" nichts sagen, da ich bisher diese Funktion nicht nutze!
Was da bei deinen Räumen passiert ist, kann ich nicht sagen jedoch vermute ich das Problem eher beim Telegram Modul, da ich keinerlei Räume lösche o.ä.
Gruß
Mathze
Zitat von: accessburn am 08 Juni 2018, 07:40:06
Hab mal bisschen weiter gespielt. Also das Favoriten-Ding funktioniert bei Telegram leider nicht, alle anderen Favoriten funktionieren nach wie vor:
Des weiteren ist es mir jetzt zweimal passiert das danach plötzlich alle "room" verstellt waren, es existiert nur noch "Verkehr" und "unsorted" und in Verkehr sind aaaaalle Devices drin die ich besitze.
Großes, dickes aua...
Ich weiß jetzt nicht genau, wie deine checkMessage Routine ausschaut, aber meine Routine wird OHNE Parameter aufgerufen!
Innerhalb der checkMessage Routine prüfe ich den letzten "msgText" aus dem Telegram Device!
Gruß
Mathze
Hm, das sieht gut aus. Allerdings gefällt mir das dauernde Anlegen und Löschen der Devices nicht so sehr. Gibt es einen bestimmten Grund, dass das so gelöst wurde ?
LG
pah
Zitat von: Prof. Dr. Peter Henning am 08 Juni 2018, 14:37:42
Hm, das sieht gut aus. Allerdings gefällt mir das dauernde Anlegen und Löschen der Devices nicht so sehr. Gibt es einen bestimmten Grund, dass das so gelöst wurde ?
LG
pah
Beim testen (damals) ist mir aufgefallen, dass ich immer mehr den Überblick über all die angelegten Devices verliere / verloren habe.
Des Weiteren war / bin ich mir unsicher, ob es für FHEM relevant ist, ob er 1x alle 10Minuten per HTTPMOD eine Abfrage macht, oder ob evtl. 30,40, oder noch mehr Devices eine Abfrage machen.
Mir ist zwar bewusst, dass nicht alle Devices in der selben Sekunde die Abfrage machen, jedoch erzeugt dies ja auch Traffic auf der Webseite des Anbieters oder?
Theoretisch kann man das löschen 1Stunde nachdem die Abfrage via Telegram abgeschickt wurde auch einfach rausnehmen.
Ich persönlich empfand es für meine Bedürfnisse jedoch angenehmer nur die Tag täglichen Devices weiterhin bestehen zu lassen :)
Gruß
Mathze
Nein, das ist anders gemeint. Vor allem deshalb, weil die ganzen HTTPMOD-Abfragen ziemlich viel Zeit kosten und deshalb keinesfalls in der Hauptschleife von FHEM landen sollten. Ich hielte es für sinnvoll, EINE abfragende Instanz zu haben, die (von mir aus ale 10 Minuten) eine (z.B. je nach aktueller Position) leicht veränderte Abfrage sendet und die relevanten Daten intern verwaltet. Wir haben vor ca. 12 Jahren ein ganzes Geoinformationssystem gebaut, ich denke, ich werde mich der aktuellen Fragestellung mal annehmen.
Melde mich, sobald ich etwas habe.
LG
pah
Hallo,
nach der Idee aus diesem Thread habe ich das etwas anders umgesetzt. Mir ging es aber um die Anzeige auf meinem Tablet. Siehe:
https://forum.fhem.de/index.php/topic,90014.0.html
Gruß
Bismosa
Hallo zusammen
Ich bin häufig in der Schweiz unterwegs resp. ich wohne auch da. Auf Verkehrslage.de sehe ich zwar die Blitzer, Baustellen und solche Sachen auch in meinem Gebiet. Leider schaffe ich es jedoch nicht, diese abzufragen. Sprich mit Z.b Hamburg klappt es, aber Zürich kann ich nicht nehmen. Weiss jemand ob das mit einem anderen Syntax geht?
Gruess und Danke für die Hilfe
Zitat von: Mumpitz am 06 August 2018, 23:30:33
Hallo zusammen
Ich bin häufig in der Schweiz unterwegs resp. ich wohne auch da. Auf Verkehrslage.de sehe ich zwar die Blitzer, Baustellen und solche Sachen auch in meinem Gebiet. Leider schaffe ich es jedoch nicht, diese abzufragen. Sprich mit Z.b Hamburg klappt es, aber Zürich kann ich nicht nehmen. Weiss jemand ob das mit einem anderen Syntax geht?
Gruess und Danke für die Hilfe
Wie / Wo siehst du die Blitzer auf Verkehrslage.de? Mir wäre es neu, wenn die auch die Blitzer außerhalb von DE haben. Bzw. kann ich keine Städte o.ä. außerhalb von DE auswählen.
Gib mir mal ein konkretes Beispiel, wo / wie du die Blitzer siehst.
Gruß
Mathze
Zitat von: t1me2die am 07 August 2018, 09:18:13
Wie / Wo siehst du die Blitzer auf Verkehrslage.de? Mir wäre es neu, wenn die auch die Blitzer außerhalb von DE haben. Bzw. kann ich keine Städte o.ä. außerhalb von DE auswählen.
Gib mir mal ein konkretes Beispiel, wo / wie du die Blitzer siehst.
Gruß
Mathze
Auf der Homepage in den Bereich der Schweiz, zB unterhalb des Bodensee zoomen und Blitzer aktivieren...
Da kann ich leider zur Zeit nicht helfen.
Ich weiß nicht, wie ich die Blitzer ohne Städtenamen auslesen kann.
Gruß
Mathze
Hallo,
eine Lösung habe ich hier auch nicht wirklich. Vielleicht kannst Du aber das Beispiel von mir etwas umstricken: https://forum.fhem.de/index.php/topic,90014.0.html
Ich rufe auch nicht die Seite von www.verkehrslage.de auf, sondern frage mit Hilfe von Koordinaten die Blitzer direkt ab.
Gruß
Bismsoa
Wie kann man sich die aktuellen festen und mobilen Blitzer z.B jeden Tag um 6 Uhr auf Telegram schicken lassen?
Zitat von: lapidu am 16 Oktober 2018, 18:55:02
Wie kann man sich die aktuellen festen und mobilen Blitzer z.B jeden Tag um 6 Uhr auf Telegram schicken lassen?
So:
defmod blitzer_at at +*06:00:00 msg push Aktuelle Blitzer:\n[blitzer:PushText]
Wenn blitzer dein dummy device ist.
Wobei es hier doch um die mobilen Blitzer geht... :o
VG Sebastian
Hab kein dummy device. Nur das was in den forderen Seiten beschrieben ist. Ich kann über meinen Telegrambot die Blitzer abfragen.
Sorry, falscher Thread. Meinte den hier:
https://forum.fhem.de/index.php/topic,90014.0.html
Basiert aber auf diesem hier...
VG Sebastian
Zitat von: t1me2die am 07 Juni 2018, 11:50:49
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)
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
Hallo Mathze,
also erstmal
TAUSEND DANK für deine gigantische Arbeit!!!!!!! Echt klasse gemacht. Fällt dir eine Möglichkeit ein statt nur einem "Standard-Ort" (aus deinem Beispiel "Schwerin") auch mehrere Orte so anzulegen und eine Nachricht damit zu befüllen? Der Hintergrund ist der, dass ich morgens durch 5 Orte muss und ggf. nicht 5 mal die Nachricht "~Keine Blitzer gefunden~" generieren möchte. Wäre toll wenn du eine Idee hättest.
Und nochmals vielen Dank für deine tolle Arbeit!
Moin Floriky,
bismosa hat hier im Forum basierend auf meiner Idee alles auf Geo-Koordinaten umgebaut, da er wohl so ein ähnliches Problem hatte wie du.
Schau mal hier: https://forum.fhem.de/index.php/topic,90014.0.html (https://forum.fhem.de/index.php/topic,90014.0.html)
Wenn du einen Koordinatenbereich festlegst, welchen du jeden Tag passierst (deine 5 Ortschaften, die du durchquerst) dann kann man sich recht einfach die die jeweiligen Blitzer mitteilen lassen.
Ich muss zugeben, dass sich meine Routinen für das ermitteln der Blitzer mittlerweile stark verändert haben und ich diese sehr an meine Bedürfnisse (Geofancy, Telegram-Standortbestimmung, feste Orte) angepasst habe.
Ließ Dir am besten mal den o.g. Thread durch, ich denke das sollte so ziemlich das sein, was du brauchst / suchst ;)
Gruß
Mathze
Zitat von: t1me2die am 16 Januar 2019, 12:49:24
Moin Floriky,
bismosa hat hier im Forum basierend auf meiner Idee alles auf Geo-Koordinaten umgebaut, da er wohl so ein ähnliches Problem hatte wie du.
Schau mal hier: https://forum.fhem.de/index.php/topic,90014.0.html (https://forum.fhem.de/index.php/topic,90014.0.html)
Wenn du einen Koordinatenbereich festlegst, welchen du jeden Tag passierst (deine 5 Ortschaften, die du durchquerst) dann kann man sich recht einfach die die jeweiligen Blitzer mitteilen lassen.
Ich muss zugeben, dass sich meine Routinen für das ermitteln der Blitzer mittlerweile stark verändert haben und ich diese sehr an meine Bedürfnisse (Geofancy, Telegram-Standortbestimmung, feste Orte) angepasst habe.
Ließ Dir am besten mal den o.g. Thread durch, ich denke das sollte so ziemlich das sein, was du brauchst / suchst ;)
Gruß
Mathze
Hallo Mathze,
vielen Dank für deine Antwort und den Link zum Thread. Werde mich gleich mal ans "Durcharbeiten" machen. Dir einen schönen Tag!
Ganz grob:
Schau auf Google Maps, such Dir deinen Startpunkt raus Lat/Lon.
Such Dir deinen Endpunkt raus Lat/Lon.
Diese vier Koordinaten bilden dann ein Rechteck / Viereck.
Alles was in diesem Bereich gemeldet ist kann man recht einfach per API direkt abfragen:
https://cdn2.atudo.net/api/1.0/vl.php?type=0,1,2,3,4,5,6&box=52.605153,10.224384,52.836461,10.693572
Diesen Link kannst du bsp. als HTTPMOD Device anlegen, als RegEx nimmst du den ganzen String bsp.:
attr HTTPMODNAME reading01Name String
attr HTTPMODNAME reading01Regex {(.*)}
Damit sollte ein Reading mit dem Namen "String" angelegt werden.
Die Koordinaten im Link findest du im angehängten Bild wieder.
Das Ergebnis (String) ist ein JSON String, den du einfach extrahieren kannst, Schlagwort "expandJSON".
Gruß
Mathze
Hallo in der Runde,
stehe gerade auf dem Schlauch.
Das hier habe ich in meinem Listing: Internals:
DEF 5
FUUID 5cb080bc-f33f-4b3a-1a6c-5787d38be416be41
NAME Blitzer_Mainz
NR 464
STATE Defined
TYPE Blitzer
refreshIntervall 5
tempRadius
OLDREADINGS:
READINGS:
2019-04-12 14:49:59 Anzeige 1
2019-04-12 15:04:02 NextUpdate Fri Apr 12 15:09:02 2019
2019-04-12 14:49:59 html <html> <p align='left'>Aktuelle Blitzer:<br>00 Mederhof L 75 Max. 100 km/h ( 26.9 km ) !! <br></p></html>
2019-04-12 15:04:03 lastUpdate Fri Apr 12 15:04:03 2019
2019-04-12 15:04:03 status ok
Attributes:
Ausgabe number,{OR,suburb,city_district,town,village,},road,building,[Max.],vmax,[km/h],[(],distanceShort,[km],[)],[!!],newline
HTML_Before <html> <p align='left'>Aktuelle Blitzer:<br>
HTML_Without <html> <p align='left'>Keine Blitzer in der Nähe</p></html>
area_bottomLeft_latitude 48.6846846846847
area_bottomLeft_longitude 7.51937965734501
area_topRight_latitude 49.3153153153153
area_topRight_longitude 8.48062034265499
createAllReadings 0
createNoHTML 0
createUpdateReading 1
home_latitude 49,9928617
home_longitude 8,2472526
icon message_attention
radius 35
room Blitzer
Der Blitzer, der ausgegeben wird ist allerdings in Baden-Würthenberg, das passt gar nicht. Wo liegt der Fehler?
Hallo!
Ich glaube Dein Beitrag ist im falschen Thread....
home_latitude 49,9928617
home_longitude 8,2472526
Nicht mit Komma, sondern bitte mit Punkt festlegen.
Gruß
Bismosa