Hallo,
um ein GSM Modul SIM800 mit einem Ardu pro Mini zu betreiben suche ich
eine Library, damit ich solche Sachen wie AT-String-Parser nicht selbst
schreiben muss. Mir reicht schon den Parser für meine eigenen sms
schreiben zu müssen mit denen das Gerät gesteuert wird, habe leider eine
innere Abwehr gegen Stringverarbeitung bei C. Es gibt da wohl etliches
Libs wie ich inzwischen weiss.
Ich brauche auf jeden Fall die Abfrage des Batteriestatus und die
Möglichkeit die RTC abzufragen, sowie alle sms Funktionen. Die Uhrzeit
wird wohl bei der Netzeinwahl an das Modul übertragen und kann im uC
verwendet werden. Bisher keine Lib gefunden, die alles drin hat.
Habt ihr da eine Empfehlung welche schlanke Lib ich einbinden kann? 30kb
sind verfügbar, sollte also keine so aufgeblähte wie die FONA von
Adafruit sein,
Gruss,
Christian
Ich hab mir sowas für meine Alarmsau gerade in Assembler selbst
gebastelt. So schwer ist es nicht.
Die Abfrage der Uhrzeit (das Modul bekommt die Uhrzeit nach der Einwahl
aus dem Netz) und des Batteriestatus ist ein einfaches AT-Kommando
(AT+CCLK und AT+CBC). Das braucht man nur senden und das Modul antwortet
entsprechend.
(Den Batteriestatus brauche ich bei meiner AlarmSau nicht, das Modul
läuft mit einem 4V Regler aus den 5V, die widerum aus den 12V eines
Bleiakkus gespeist werden, der aus dem 230V nachgeladen wird.)
Hi,
mit Arduino dreh ich noch ab, ohne gescheiten Debugger (man reiche mir
meine Cortexe wieder....). Gerade mit Strings wo man tausendmal was
ausprobieren muss.
Die erste Lib von einem Türken namens Arslan lief direkt schon nicht.
Oder nur halb. Da man nicht weiss, was da genau nicht läuft schreibe ich
es jetzt slebst.
Aber selbst hier scheitert es schon, weil ich nicht genau weiss, was da
exakt rauskommt, selbst wenn da
AT
OK
Ist das nun AT\r\nOK oder AT\r\nOK\r\n oder... oder oder...
auf dem Serial Monitor steht.... grrrrr.....
[quote]mit Arduino dreh ich noch ab, ohne gescheiten Debugger[/quote]
Ich hab praktisch auf einem Arduino eine ganze Kommunikation mit einem
ESP8266 hingekriegt nur mit dem Serial Monitor als Hilfe :-) So schwer
ist das nicht.
derjaeger schrieb:> Ich hab praktisch auf einem Arduino eine ganze Kommunikation mit einem> ESP8266 hingekriegt nur mit dem Serial Monitor als Hilfe :-) So schwer> ist das nicht.
Ja, als ich anfing auf dem Z80 gabs nur ne rote LED als Debugger, und
nen Taster wo man Single Steppen konnte.... so 1984 war das als Asm
Progis och per Hand umgerechnet wurden in ner Tabelle :-(((((
Ich fand das beim Arduino super .. ich musste mich nicht um Strings
kümmern oder um eine Serial Kommunikation .. alles war da ich musste nur
die Befehle verschicken und vergleichen.
Warum benutzt du char* ? Nimm doch String ...
Mach doch folgendes ..
derjaeger schrieb:> Nimm doch String ...
Bei "String" behauptet man dass das Probleme geben könnte in einem Forum
wo ich grad guckte.... ich nehm lieber das was ich verstehe und sehen
kann.
.read liest nur ein zeichen übrigens und .readstring finde ich nicht
dokumentiert.
Also auf die Altmodische...
p = response;
while (*p) {
Serial.print(*(p++),HEX);
Serial.println(" ");
}
Ich bin auf einem Arduino Nano und ESP8266 prima mit String klar
gekommen, das hat die gleiche AT-Syntax wie dein Modul.
Alles ich praktisch immer gemacht habe waren nur die folgenden 3
Befehle:
Jedenfalls klappt das jetzt, sehr seltsam.... man beachte das strcmp....
das jetzt noch eine do while rein und ein timeout mit millies und dann
müsste das spielen... und ich verstehe es auch noch.
Chris J. schrieb:> Aber selbst hier scheitert es schon, weil ich nicht genau> weiss, was da exakt rauskommt
Damit hatte ich auch beim ESP822 gekämpft, zudem sich die Details eine
Zeitlang mit jedem Firmware Release änderten. Ich kenne die Problematik
aber auch von älteren GSM Modems, weil ich vor einigen Jahen ein Linux
Programm schrieb, dass mit so ziemlich allen GSM Modems funktionieren
sollte.
Ich empfehle folgende Methode: Schreibe Dir eine Funktion, die ein
Kommando sendet und dann bis zu n Millisekunden auf ein bestimmtes Wort
in der Response wartet. Zum Beispiel:
char responseBuffer[100];
bool gotOk = send_command("ATZ\r\n", "Ok", 500, responseBuffer,
sizeof(responseBuffer));
Die Funktion soll in diesem Fall "ATZ" senden, dann bis zu 500ms lang
auf "Ok" warten. Wenn das soweit klappte, liefert sie ein true zurück,
sonst false. Der responseBuffer ist optional und wird mit der kompletten
Antwort befüllt, oder mit so vielen Zeichen wie hinein passen. Falls der
Buffer zu klein ist, werden die überschüssigen empfangenen Zeichen
einfach verworfen.
Und jetzt kommt der entscheidende Trick: Nachdem die Funktion das
erwartete Stichwort empfangen hat, empfängt sie zusätzlich solange alle
weiteren Zeichen, bis 100ms nicht mehr kommt. Diese 100ms kannst du
ruhig hardcodieren, die wirst du kaum ändern wollen.
Wenn das Modem nicht mit dem erwarteten Stichwort (Ok) antwortet, wartet
die Funktion bis zu 500ms und liefert dann die Fehlermeldung zurück. Die
kann man dann z.B. auf einem Display anzeigen.
Auf diese Weise wartest du nach jedem erfolgreichen Kommando immer lange
genug, bis das Modem seine komplette Antwort gegeben hat. Erst danach
wird dein Programm das nächste Kommando senden. Und das ist wichtig,
weil es sonst die Synchronisation zum Modem verlieren würde, so dass es
irgendwann die Antworten nicht mehr zu den richtigen Kommando zuordnen
würde.
Wie die Zeilenumbrüche in der Antwort des Modems aussehen, ist
irrelevant. Ich gehe da sogar noch einen Schritt weiter und ersetze
einfach alle \r durch \n und verwerfe wiederholt aufeinanderfolgende \n.
So vereinheitliche ich das Format der Antwort.
derjaeger schrieb:> as ist F("AT\r\n") ? Warum nicht einfach println("AT") ?
Das F legt den String ins Flash, sonst liegt der dauernd im Ram. Kommt
vor allen Strings bei mir, zumindest den größeren.
Ich probiere deines mal aus morgen, jetzt Ende... Netflix gucken....
Sleepy Hollow :-)
Stefanus F. schrieb:> Damit hatte ich auch beim ESP822 gekämpft, zudem sich die Details eine> Zeitlang mit jedem Firmware Release änderten. Ich kenne die Problematik> aber auch von älteren GSM Modems, weil ich vor einigen Jahen ein Linux> Programm schrieb, dass mit so ziemlich allen GSM Modems funktionieren> sollte.
Stefanus, ich danke Dir ertsmal für deine Mühe und deine Hilfe.... echt
top! Ich schaue es mir morgen mal genau an und werde dann so verfahren
um die Routinen sicher zu machen, dass sich da nichts aufhängt. Das SIM
lässt sich ja auch updaten was die Firmware angeht aber mich brauch eh
nur sms und das langt. Wird ein überwachungsgerät mit Radar sensor, was
ich per sms steuern will.
Nochmal danke! Hast was gut!
Chris J. schrieb:> Leider quasselt das Ding beim Starten auch noch ohne gefragt worden zu> sein, was echt nervt.
Da fällt mir ein, was ich vergessen habe:
Bevor du ein Kommando sendest, leere den Empfangspuffer der seriellen
Schnittstelle. Damit du nicht irgendwelche vorherigen Zwischenrufe des
Modems irrtümlicherweise als Antwort interpretierst.
Na, wenn die mit jeder neuen Firmware irgendwelche /r mehr einbringen,
dann werden sich ja die Hersteller der Librarys freuen.... dass sie die
alle in die Tonne hauen können.
Bis ich mit ATE0 das Echo abschalte bleibt das auch so. Ausgaben wie
von CPOL? sind ohnehin kaum zu interpretieren, das fehlt dann doch etwas
ein Linux mit seinem awk, sed und anderen Sachen.
Das kennst du aber auch, oder?
https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm
Hallo Stefanus,
wenn man erstmal drin ist, dann fluppt es ganz fix! Das Zauberwort
heisst
strstr! leider kommt man nicht umher den Puffer immer wieder zu prüfen,
da das Teil auch ungefragt quasselt, vor allem wenn man die RTC gesetzt
hat quatscht es immer wieder mal ungefragt.
>>Leider quasselt das Ding beim Starten auch noch ohne gefragt worden zu
sein, was echt nervt.
Können Bootloader Nachrichten sein.
Der EPS8266 quasselt beim Starten (wenn RESET losgelassen wird) für mehr
als 350 ms irgendwelche Bootnachrichten ... unglaublich
derjaeger schrieb:> Können Bootloader Nachrichten sein.> Der EPS8266 quasselt beim Starten (wenn RESET losgelassen wird) für mehr> als 350 ms irgendwelche Bootnachrichten ... unglaublich
Der SIm800 quakt aber deutlich mehr..... vor allem wenn man die Uhrzeiut
gesetzt hat, das muss aber abgeschaltet werden, geht gar nicht!
Chris J. schrieb:> vor allem wenn man die Uhrzeiut gesetzt hat, das muss aber abgeschaltet> werden, geht gar nicht!
Oder man muss sich einen anständigen Parser für die Antworten von dem
Ding schreiben, der auch unerwartete Ausgaben tolerieren und von
relevanten Informationen trennen kann.
Der sollte natürlich auch mit jeder beliebigen Variante von
Zeilentrennern zurechtkommen, und nicht sklavisch "\r\n" erwarten.
Dann stört auch ein Firmwareupdate nicht.
Ich finde sehr gut, dass du hier nicht die String Klasse verwendet hast,
um die einzelnen Zeichen einzusammeln. Sie wäre deutlich ineffizienter
und mit Strings kann man auch sehr schnell unerwartete
Speicher-Fragmentierung erzeugen.
Der delay(500) gefällt mir aber nicht. Damit verlangsamst du die
Kommunikation unnötig. Ich würde das eher so angehen:
1
charresponse[64];
2
uint8_tcnt=0;
3
uint8_tsuccess=0;
4
5
// Flush the serial buffer
6
while(Serial.available())
7
{
8
Serial.read();
9
yield();
10
}
11
12
// Send command
13
serialSIM800.print(atc);
14
15
// Wait up to 500ms for the expected token
16
longstart=millis();
17
while(millis()-start<500)
18
{
19
if(serialSIM800.available())
20
{
21
// Always read out the serial buffer
22
// even if the response buffer is full
23
charc=serialSIM800.read();
24
if(cnt<sizeof(response)-1)
25
{
26
response[cnt++]=c;
27
response[cnt]='\0';
28
if(strstr(response,token))
29
{
30
success=1;
31
break;
32
}
33
}
34
}
35
yield();
36
}
37
38
// Receive 100ms additional characters after the token
39
longstart=millis();
40
while(millis()-start<100)
41
{
42
if(serialSIM800.available())
43
{
44
// Always read out the serial buffer
45
// even if the response buffer is full
46
charc=serialSIM800.read();
47
if(cnt<sizeof(response)-1)
48
{
49
response[cnt++]=c;
50
response[cnt]='\0';
51
}
52
}
53
yield();
54
}
55
56
if(success)
57
{
58
debugln(F(" -> Token erkannt!"));
59
}
60
else
61
{
62
debugln(F(" -> Token NICHT erkannt!"));
63
}
64
65
returnsuccess;
(Ich habe den Code nicht getestet, das überlasse ich Dir)
Ok, habe ich übernommen, muss man trotzdem warten, 9600 baud sind nicht
das Schnellste, sonst saugt man den Puffer leer bevor das letzte Zeichen
da ist.
Rufus Τ. F. schrieb:> Oder man muss sich einen anständigen Parser für die Antworten von dem> Ding schreiben, der auch unerwartete Ausgaben tolerieren und von> relevanten Informationen trennen kann.
Ich denke in prof. Anwendungen wird solch ein parser eh alles Int
gesteuert heraus holen und die Antworten dann fein säuberlich zerlegt in
structs ablegen. Aber für den haus Gebrauch sollte es reichen sich nur
das heraus zu picken was man braucht und alle andere ignorieren. Und
dafür taugt die Funktion strstr(hay, needle) eben recht gut. Kommt das
was man erwartet ist es ok, wenn nicht Pech, dann while (1) Rote Led
blinken:
Kann man eigentlich diese blinkende rote LED auf den Modulen abschalten?
Bei einem überwachungsgerät zwar nützlich zur Disgnose aber weniger im
Betrieb.
Chris J. schrieb:> Ok, habe ich übernommen, muss man trotzdem warten,> 9600 baud sind nicht das Schnellste, sonst saugt man> den Puffer leer bevor das letzte Zeichen da ist.
Das war schon so beabsichtigt. Deswegen ja die while Schleife.
Hast du ne Ahnung wie man es hinkriegen kann, dass das Modul sich eine
eingehende Telefonnummer merkt und die dann als Ziel verwendet für sms?
Ich möchte die Anlage anrufen vom Handy, je nachdem welche ich grad habe
und dann soll er auch auf die Nummer jeweils antworten. Ich weiss noch
nicht, wie man bei einem eingehenden Anruf die Nummer herausfinden kann,
die angerufen hat.
Notfalls schicke ich auch ne sms, wie beim Tracker mit begin und diese
enthält ja auch wohl die Info wer die geschickt hat. Anrufen wäre aber
billiger, weil ich da nicht abnehmen muss.
Nee, weiß ich nicht. Smartphones zeigen ja die Rufnummer des Anrufers
an. Ich nehme an, dass dieses GSM modem das auch irgendwie kann. Oder
man kann vielleicht die Historie der letzten Anrufer abfragen.
Das kann das GSM-Modul nicht alleine.
Meine AlarmSau macht sowas ähnliches, sind aber mehrere Schritte.
1. das GSM-Modul meldet eine ankommende SMS an den Controller
2. der Controller holt sich eine Liste der gespeicherten SMS
(braucht man für die Speicherplatz-Nummer
3. der Controller holt sich die SMS vom Speicherplatz
4. der Controller prüft, ob die Telefonnummer der SMS bekannt ist und
wenn ja, ob der User die Berechtigung für die Status-SMS hat
5. falls ja wird die Status-SMS zurückgeschickt (enthält so Daten wie
Schärfungszustand, Netz- und Akkukontrolle, Alarmschleifen-Status)
6. die SMS wird mit der Speicherplatznummer vom Modul gelöscht
Ich möchte dich mit deiner "AlarmSau" nicht verstimmen aber das geht
ganz einfach und nicht so, wie beschrieben.
INT auf RING Pin oder Polling.
AT-CLIP=1
aktiviert die URC Meldungen
Beim Klingeln (RING = LOW) wird der String
+CLIP: "Nummer", Zusatzinfos erzeugt, den man ausliest und zerteilt
Fertig.
Alternativ pollt man auf das Wort RING in der Ausgabe des Moduls.
Chris J. schrieb:>> Oder man muss sich einen anständigen Parser für die Antworten von dem>> Ding schreiben, der auch unerwartete Ausgaben tolerieren und von>> relevanten Informationen trennen kann.>> Ich denke in prof. Anwendungen wird solch ein parser eh alles Int> gesteuert heraus holen und die Antworten dann fein säuberlich zerlegt in> structs ablegen. Aber für den haus Gebrauch sollte es reichen sich nur> das heraus zu picken was man braucht und alle andere ignorieren.
Äh, nein. Ein professioneller Parser besteht nicht daraus, zu wissen,
wieviele Bytes ankommen und nur so viele Bytes zu lesen und dann stur in
eine Struct zu packen. Das gibt es allerdings auch.
Wenn man es richtig machen will, dann definiert man die zu parsende
Grammatik und generiert einen Parser dafür.
Ben B. schrieb:> Dann hab ich nicht verstanden, was er will.
Er will sein gerät aus der Ferne aktivieren. Da SMS für ihn Geld kosten,
will er das Gerät durch einen Anruf aktivieren. Einmal klingeln lassen,
dann macht es irgendwas und schickt eine Antwort per SMS an die
Rufnummer, die es aktiviert hat.
S. R. schrieb:> Wenn man es richtig machen will, dann definiert man die zu parsende> Grammatik und generiert einen Parser dafür.
Ich denke ein Blick in das Datenbuch reicht um um zu verstehen, dass Du
damit eine längere Zeit deines Lebens verbringen wirst, die Dir niemand
bezahlt.
Chris J. schrieb:> Ich denke ein Blick in das Datenbuch reicht um um zu verstehen, dass Du> damit eine längere Zeit deines Lebens verbringen wirst, die Dir niemand> bezahlt.
Ich muss nicht den gesamten AT-Befehlssatz inklusive sämtlicher
historischen und herstellerspezifischen Bestandteile parsen, sondern nur
den Teil, der mich interessiert. Und den Rest ignorieren.
Besser als strstr() auf nur mäßig definierte Buffer loszulassen ist das
allemale.
Wer mal mit dem Typen zu tun hatte, also ganz direkt life merkt zwar
schnell dass das ein Soziopath ist - aber programmieren kann er.
Trotzdem wurde er als Externer aus dem Projekt entlassen, weil keiner
mit ihm klar kam.
Gibt es alles schon für den ARM. Müsste nur portiert werden:
https://github.com/MaJerle/GSM_AT_commands_parser/tree/master/00-GSM_LIBRARY
Chris J. schrieb:> Wer mal mit dem Typen zu tun hatte, also ganz direkt life merkt zwar> schnell dass das ein Soziopath ist - aber programmieren kann er.> Trotzdem wurde er als Externer aus dem Projekt entlassen, weil keiner> mit ihm klar kam.
Wer ist "er"?
Egal. Weisst Du wie man einen eingehenden Anruf, der nicht abgenommen
wurden auf Besetzt kriegt?
ATH?
AT+CHUP?
Das Netz gibt dazu nicht viel her. Bin grad bei der Rufannahme und
Unterscheidung ob Anruf oder sms. Sprenge schon die 10kb Grenze :-)
Chris J. schrieb:>> Wer mal mit dem Typen zu tun hatte, also ganz direkt life merkt zwar>> schnell dass das ein Soziopath ist - aber programmieren kann er.>> Trotzdem wurde er als Externer aus dem Projekt entlassen, weil keiner>> mit ihm klar kam.Stefanus F. schrieb:> Wer ist "er"?Chris J. schrieb:> Egal.
Das ist keine akzeptable Antwort für so eine heftige Aussage.
Egal wen du meinst, solltest du vor dem Lästern an folgendes denken: Die
allermeisten Ü40 jährigen Computer Experten hatten in ihrer Jugend-Zeit
keine Chance auf eine ordentliche Berufsausbildung, weil es diese
schlicht nicht gab. Sie haben den Umgang mit dem Computer autodidaktisch
gelernt, und zwar ohne Internet, ohne Youtube und ohne Aliexpress.
Außerdem kostete ein anständiger Computer damals noch ein Monatsgehalt.
Was denkst du, was das für Menschen sind, die ihre gesamte Freizeit mit
der Erforschung der Computertechnik verbracht haben? Ich würde sie als
Kellerkinder bezeichnen, oder Männer mit wenig Freunden.
Die einen kommen gut mit Menschen klar, die andere eher mit Maschinen.
Erst seit Einführung der vernetzten Kommunikation in all ihren
Ausprägungen (Fido Netz, Usenet, Email, Whatsapp, Facebook, ...)
verschwimmen die Grenzen. Heute kan mann den ganzen Tag vor dem Computer
hocken um Menschen zu kontaktieren. Damals hockte man jedoch vor dem
Computer, um Menschen aus dem Weg zu gehen oder weil man einfach keine
Freunde hatte.
Das Wort "Soziopath" ist aber schon harter Tobak, das sollte man nicht
ohne Nachdenken benutzen.
> Weisst Du wie man einen eingehenden Anruf, der nicht abgenommen> wurden auf Besetzt kriegt?
Ich glaube, mit ATH. Aber solche Details können Gerätespezifisch
unterschiedlich sein. Meine praktischen Erfahrungen mit GSM Modems
endeten vor 10 Jahren mit Geräten, die man heute nicht mehr kaufen kann.
> Das Netz gibt dazu nicht viel her.
Hast du keine Bedienungsanleitung? Irgendwo muss der Hersteller doch
seinen Befehlssatz dokumentiert haben.
Stefan, wir kommen etwas vom Thema ab. Ich habe eine Weile im Jahre 2000
als Asic Entwickler (VHDL) bei einem japanischen Konzern gearbeitet und
hatte noch in der Probezeit den Eindruck, dass um mich herum eine Reihe
Voll-Fach-Idioten sitzt, die man besser nicht auf die Menschheit los
lässt. Arroganz, Rivalität und masslose Selbstüberschätzung prägten den
Arbeitstag. Das schlimmste Arbeitsklima was ich je erlebt habe, bevor
ich von Automotive nach Automation wechselte. Nerds, die mit niemandem
ein normales Wort reden konnten, weil sie aus ihren Welten gar nicht
mehr auftauchten. Der Begriff "Nerd" trifft es besser, weil bei
Soziolpath noch eine Empathielosigkeit und schizophrene Komponente zu
hinzu kommt.
Ich habs schon, es geht mit ATH0. Macht jedenfalls mehr Spass es selbst
zu schreiben als Dinge zu benutzen, die man nicht versteht und die auch
nicht unbedingt funktionieren.
AT+GSMBUSY
Reject incoming call
Wie du siehst brauchte ich dafür 5 Minuten.
Tja, und deswegen klappt das auch nicht damit den aktiven Ruf
abzulehnen. Auf die Idee kam ich auch schon :-)
Stefanus F. schrieb:> Wie du siehst brauchte ich dafür 5 Minuten.
Ich habe so das dunkle Gefühl, dass Chris hier schon unter anderem Namen
angemeldet war. Sowohl das Verhalten, als auch ein paar Aussagen passen
zu einer anderen Person mit ähnlichem Namen.
S. R. schrieb:> Ich habe so das dunkle Gefühl, dass Chris hier schon unter anderem Namen> angemeldet war. Sowohl das Verhalten, als auch ein paar Aussagen passen> zu einer anderen Person mit ähnlichem Namen.
Ich bin seit 2004 hier, habe den Thread "Zeigt her Eure Kunstwerke"
damals ins Leben gerufen und ich heisse immer noch Christian. Und ja,
wir kennen uns von früher, Z80 und so. Und manche hier können sich auch
nicht benehmen, das ist richtig.
Ben B. schrieb:> Die Abfrage der Uhrzeit (das Modul bekommt die Uhrzeit nach der Einwahl> aus dem Netz) und des Batteriestatus ist ein einfaches AT-Kommando> (AT+CCLK und AT+CBC). Das braucht man nur senden und das Modul antwortet> entsprechend.
Hallo Ben,
ich habe mir zwar etwas Forenabstinenz verordnet aber nach vielen
Stunden Programmierarbeit funktioniert mein Wachhund theoretisch.
Zumindest die Kommunikation mit dem Handy klappt in beide Richtungen.
Ich kann die Kiste fernsteuern mit einfachen Kommandos. 16kb C-Code, ca
2000 Zeilen.
Aber..... der Sensor produziert ständig Fehlarlarme, ist quasi nicht
verwendbar. Nach vielen Tests steht soviel fest, dass dieser RCWL 0516
und das GSM Modul sich nicht direkt nebeneinander vertragen. Selbst 4cm
Abstand reichen nicht. Kaum steckt es in der Platine fängt der Sensor
Ausgang an zu flackern, bis zum Dauer-EIN Im Sleep Mode und wenn das GSM
abgezogen ist beruhigt er sich und funktioniert.
Damit nicht viele Stunden Arbeit umsonst waren frage ich mal wie Du das
Problem gelöst hast?
Gruss,
Christian
Bitte entschuldige, aber ich bin nicht damit einverstanden, wie ihr bei
dem "Projekt" eure Mitarbeiter behandelt - z.B. rausschmeißen und als
Soziopathen abstempeln anstatt mal zu überlegen woher die Probleme
vielleicht kommen könnten und evtl. zu helfen - und daher bleibt mir
nur, Dir mit Deinen eigenen Problemen noch viel Spaß zu wünschen.