Ankündigung

Einklappen
Keine Ankündigung bisher.

Radiowecker

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hi Jonofe,

    Thank you for all those infos, appreciated !

    Zitat von jonofe Beitrag anzeigen
    in French it should be apply=Afficher+horloge
    How did you get that ? Maybe playing with the language parameter and looking in the source code of the management page ? If so, I should have thought about that.

    Zitat von jonofe Beitrag anzeigen
    you should try the template from taxus
    Well, things are going weird.
    I re-tried the original syntax from Taxus, and it works fine, for all states. The clock display doesn't work anymore.
    The behaviour is irrational, I've the impression it is based on a previous state or command execution, but no clue as to which one.

    I'm the only one having Firmware: 1.67 (BETA) ?

    PS: If I want to play MP3 files, is it sufficient to copy the files somewhere on a remote web server like the example
    or is it mandatory to have a streaming application available on that remote web server ?

    Kommentar


      Zitat von Warichet Beitrag anzeigen
      How did you get that ? Maybe playing with the language parameter and looking in the source code of the management page ? If so, I should have thought about that.
      Yes, you have to analyse the html source. You have to find the source for the form. Here the example to show the clock

      Code:
      <form method="post" action="[COLOR=Red][B]/admin/cgi-bin/admin.cgi?f=show_clock&amp;n=../show_clock.html[/B][/COLOR]">
      <div class="apply_button">
      <input class="button" type="submit" value="[COLOR=Lime][B]Uhrzeit anzeigen[/B][/COLOR]" name="[B][COLOR=Blue]apply[/COLOR][/B]" />
      </div>
      </form>
      Now you can see the POST URL (marked in red), but you have to replace the &amp; by an &.
      And you can find out the name (blue) and the value (green) of the data to post. (replace each space by an +)
      With that, you should be able to control the musicpal web-interface functions by HTTP-POST calls.

      Zitat von Warichet Beitrag anzeigen
      I'm the only one having Firmware: 1.67 (BETA) ?
      I'm using the same FW.

      Zitat von Warichet Beitrag anzeigen
      PS: If I want to play MP3 files, is it sufficient to copy the files somewhere on a remote web server like the example

      or is it mandatory to have a streaming application available on that remote web server ?
      I think it should be sufficient to define an URL to an MP3 file as favourite and than call this favourite.

      Kommentar


        Hi Jonofe,

        Zitat von jonofe Beitrag anzeigen
        Yes, you have to analyse the html source. You have to find the source for the form. Here the example to show the clock
        Thank you for the hint.

        Zitat von jonofe Beitrag anzeigen
        I think it should be sufficient to define an URL to an MP3 file as favourite and than call this favourite.
        OK, I'll try it

        About the paradox between the samples mentionned here, it is definitely related to the FirmWare version. I've 1.67 (BETA)

        As mentionned before, I noticed some inconsistencies, bizarre behaviour.
        A concrete example is the "text display"
        This thing seems to work only once, not twice, but ... it seems to depend on the mode which it is in !
        So, if the clock is displayed and I issue the "display text" command, it works.
        A second "display text" command will not work, unless .... I switch to another mode, ie, hit the FAV button.
        So, I'm close to the end, if I could know how to remotely switch between modes.

        Any hint ?

        Here is my status:
        the following is working fine: favorits (radio), volume, brightness (all modes)
        clock doesn't work anymore (although it was working fine before)
        the following doesn't work well: display text
        to be done: stream a MP3 file

        Kommentar


          Hallo zuerst, an alle Forenmitglieder und Mitleser!
          Bis jetzt zähle ich mich auch zu den Mitlesern und Nutznießern dieses super Forums.
          Bisher konnte ich alle Informationen die ich benötigte mit der Suchfunktion und durch mitverfolgen der Beiträge erhalten.

          Jetzt steh ich allerdings auf dem Schlauch:
          Status: Glücklicher Besitzer eines HS und eines Musicpals mit installiertem Palmod und MPD.
          Über Telnet kann ich über "mpc add songname.mp3" einzelne Titel zu einer Playliste zusammenfügen und dann per "mpc save durchsage1" abspeichern.
          Zum verwenden der Playliste als Durchsage, müsste ich "mpc clear" und "mpc load durchsage1" eingeben und dann mit "mpc play" abspielen.
          Das mit der Playliste hat für mich den Vorteil, dass ich z.B. einen Gong und dann die eigentliche Durchsage zusammenhängen kann wie ich möchte.

          Mein Problem ist: Wie sende ich vom HS aus ein Telegramm dass z.B. "mpc play" ausführt?

          Herzlichen Dank, Wolfgang

          Zitat von ThorstenGehrig Beitrag anzeigen
          Hi
          das "palmod" ist zwar schlecht dokumentiert (meiner Meinung nach) - aber wenn man man Google´t findet man dass der "mpd"-Addon ein mächtiges tool ist.
          Damit kann man auch nur einen Song abspielen - ohne einen Loop zu haben. Ist ganz gut zu gebrauchen um eine "Durchsage" zu gestalten.
          Dazu muss man allerdings die Ansagen vorher irgendwo abspeichern (USB / Netzwerk:Samba) - in die mpd-Datenbank aufnehmen (mpc update) dann Playliste leeren (mpc clear) und song aufnehmen (mpc add "songname") - im zweifelsfall mit "mpc search any <suchstring>" suchen und dann mit "mpc play" abspielen.

          Kommentar


            Zitat von woda Beitrag anzeigen
            Status: Glücklicher Besitzer eines HS und eines Musicpals mit installiertem Palmod und MPD.
            Über Telnet kann ich über "mpc add songname.mp3" einzelne Titel zu einer Playliste zusammenfügen und dann per "mpc save durchsage1" abspeichern.
            Zum verwenden der Playliste als Durchsage, müsste ich "mpc clear" und "mpc load durchsage1" eingeben und dann mit "mpc play" abspielen.
            Das mit der Playliste hat für mich den Vorteil, dass ich z.B. einen Gong und dann die eigentliche Durchsage zusammenhängen kann wie ich möchte.

            Mein Problem ist: Wie sende ich vom HS aus ein Telegramm dass z.B. "mpc play" ausführt? 7
            Ich hab nen ganz alten Baustein den ich mal ne ganze Zeit erfolgreich genutzt hab. Da der aber nicht so "perfekt" ist wie er soll nutz ich den im Moment nicht. Ich hab aber bereits ein Konzept wie ich auch die Kommunikation mit mehreren MPD's die ihre Lieder von einer "ampache" Installtion bekommen. Wird aber sicher noch ein paar Wochen dauern bis ich damit anfange, da da noch ein "paar" ganz andere Dinge vorher kommen

            Code:
            # Kopf (Experte)
            ################
            5000|"MPD\MPD Connect Modul"|0|14|"E1 MPD-Receive"|"E2 Init"|"E3 playlist"|"E4 play"|"E5 stop"|"E6 next"|"E7 prev"|"E8 pause"|"E9 playid"|"E10 Volume"|"E11 Volume +"|"E12 Volume -"|"E13 Repeat"|"E14 Random"|10|"A1 MPD-Send"|"A2 Displaystatus"|"A3 Volume"|"A4 Repeat"|"A5 Random"|"A6 State"|"A7 Time playing"|"A8 Time Total"|"A9 Time Remain"|"A10 Error String"
            # Kopf (HS)
            ###########
            5001|14|10|1|10|0
            # Eingänge
            ##########
            5002|1|""|1
            5002|2|0|0
            5002|3|""|1
            5002|4|0|0
            5002|5|0|0
            5002|6|0|0
            5002|7|0|0
            5002|8|0|0
            5002|9|0|0
            5002|10|0|0
            5002|11|0|0
            5002|12|0|0
            5002|13|0|0
            5002|14|0|0
            # Variablen
            ###########
            5003|1|""|0
            5003|2|""|0
            5003|3|0|0      # Status: Volume
            5003|4|0|0      # Status: Repeat
            5003|5|0|0      # Status: Random
            5003|6|0|0      # Status: State
            5003|7|0|0      # Status: Time played
            5003|8|0|0      # Status: Time Total
            5003|9|""|0
            5003|10|""|0
             
            # Ausgänge
            ##########
            5004|1|""|0|1|1
            5004|2|""|0|2|1
            5004|3|0|0|2|0
            5004|4|0|0|2|0
            5004|5|0|0|2|0
            5004|6|0|0|2|0
            5004|7|0|0|2|0
            5004|8|0|0|2|0
            5004|9|0|0|2|0
            5004|10|""|0|2|1
             
            # Formeln
            #########
            # Daten empfangen
            ##################
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'Title:') <0)"|"''"|""|0|0|2|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'Title:') <0) and (__import__('string').find(EN[1], 'Name:'))"|"EN[1][__import__('string').find(EN[1], 'Name:')+6:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'Name:'))]"|""|0|0|2|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'Title:'))"|"EN[1][__import__('string').find(EN[1], 'Title:')+7:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'Title:'))]"|""|0|0|2|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'volume:'))"|"int(EN[1][__import__('string').find(EN[1], 'volume:')+8:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'volume:'))])"|""|0|0|3|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'repeat:'))"|"int(EN[1][__import__('string').find(EN[1], 'repeat:')+7:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'repeat:'))])"|""|0|0|4|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'random:'))"|"int(EN[1][__import__('string').find(EN[1], 'random:')+7:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'random:'))])"|""|0|0|5|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'state:'))"|"EN[1][__import__('string').find(EN[1], 'state:') +6:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'state:'))]"|""|0|0|9|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'time:'))"|"int(EN[1][__import__('string').find(EN[1], 'time:')+6:__import__('string').find(EN[1],':',__import__('string').find(EN[1], 'time:')+6)])"|""|0|0|7|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'Time:') <0)"|"int(0)"|""|0|0|8|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'Time:'))"|"int(EN[1][__import__('string').find(EN[1], 'Time:')+6:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'Time:')+6)])"|""|0|0|8|0
            5012|0|"EC[1] and (__import__('string').find(EN[1], 'error:'))"|"EN[1][__import__('string').find(EN[1], 'error:')+7:__import__('string').find(EN[1],chr(0x0a),__import__('string').find(EN[1], 'error:')+7)]"|""|0|0|10|0
             
            #State
            5012|0|"EC[1]"|"0"|""|0|0|6|0
            5012|0|"EC[1] and SC[9] and (__import__('string').find(SN[9],'play')!=-1)"|"1"|""|0|0|6|0
            5012|0|"EC[1] and SC[9] and (__import__('string').find(SN[9],'pause')!=-1)"|"2"|""|0|0|6|0
            5012|0|"SA[6]<>SN[6]"|"SN[6]"|""|6|0|0|0
             
            #playlist
            5012|0|"EC[3]"|"'clear\x0Aload ' + EN[3] + '\x0D\x0Aplay\x0d\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            #play
            5012|0|"EC[4]"|"'play\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            #stop
            5012|0|"EC[5]"|"'stop\x0D\x0Astatus\x0D\x0A'"|""|1|0|0|0
            #next
            5012|0|"EC[6] and EN[6]==1"|"'next\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            #prev
            5012|0|"EC[7] and EN[7]==1"|"'previous\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            #playid
            5012|0|"EC[9]"|"'playid ' + str(int(EN[9])) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
             
            #Volume
            5012|0|"EC[10]"|"'setvol ' + str(int(EN[10])) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[11] and EN[11]==1 and SN[3]<95"|"'setvol '+ str(int(SN[3] + 5)) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[12] and EN[12]==1 and SN[3]>5"|"'setvol '+ str(int(SN[3] - 5)) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[1] and SC[3]"|"SN[3]"|""|3|0|0|0
             
            #Repeat
            5012|0|"EC[13]"|"'repeat ' + str(int(EN[13])) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[1] and (EC[13]!=1) and SC[4]"|"SN[4]"|""|4|0|0|0
            #Random
            5012|0|"EC[14]"|"'random ' + str(int(EN[14])) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[1] and (EC[14]!=1) and SC[5]"|"SN[5]"|""|5|0|0|0
             
            #pause
            5012|0|"EC[8] and SN[6]>0"|"'pause ' + str(int(EN[8])) + '\x0D\x0Astatus\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            #Time
            5012|0|"EC[1] and SC[7]"|"SN[7]"|""|7|0|0|0
            5012|0|"EC[1] and SC[8]"|"SN[8]"|""|8|0|0|0
            #Remaining Time
            5012|0|"EC[1] and SC[7] and (SN[8]>SN[7])"|"SN[8]-SN[7]"|""|9|0|0|0
            #Error
            5012|0|"SC[10]"|"SN[10]"|""|10|0|0|0
            #Display String
            5012|0|"SC[7] and (__import__('string').find(EN[1],'http://',__import__('string').find(EN[1],'file:')+6,__import__('string').find(EN[1],'file:')+13)<0)"|"__import__('time').strftime('%M:%S',__import__('time').localtime(int(SN[7]))) + '/' + __import__('time').strftime('%M:%S',__import__('time').localtime(int(SN[8]))) + '  '  + str(SN[2])"|""|2|0|0|0
            5012|0|"SC[7] and (__import__('string').find(EN[1],'http://',__import__('string').find(EN[1],'file:')+6,__import__('string').find(EN[1],'file:')+13)>-1)"|"__import__('time').strftime('%M:%S',__import__('time').localtime(__import__('time').time())) + '  '+ str(SN[2])"|""|2|0|0|0
             
            ## Wenn Status nicht stop dann Refresh alle "1" Sek
            5012|0|"EC[1] and (SN[6]>0)"|"1"|"1"|0|1|0|0
             
            # Status abrufen
            5012|0|"OC[1] and (ON[1]==1)"|"'status\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
             
            # Init
            5012|0|"EC[2] and (EN[2]<>0)"|"'status\x0D\x0Acurrentsong\x0D\x0A'"|""|1|0|0|0
            5012|0|"EC[2] and (EN[2]<>0)"|"1"|"2"|0|1|0|0

            Fast vergessen:

            Der Eingang liegt auf dem Empfang einer Webabfrage auf port 6600 des mpd und der Ausgang auf dem Senden Feld
            Nils

            aktuelle Bausteine:
            BusAufsicht - ServiceCheck - Pushover - HS-Insight

            Kommentar


              Hoi
              Schon gesehen? Es gibt ein App dafür: 23.02.2010
              Ampache on the iPhone – in the app store now.
              Grüsse Bodo
              Fragen gehören ins Forum, und nicht in mein Postfach;
              EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

              Kommentar


                Hi,

                I'm talking to myself here (the best way to get some consensus )
                Zitat von Warichet Beitrag anzeigen
                I noticed some inconsistencies, bizarre behaviour.
                A concrete example is the "text display"
                This thing seems to work only once, not twice, but ... it seems to depend on the mode which it is in !
                That problem seems to be (at least partially) solved.
                I issue a "menu_collapse" before each "display text".
                Maybe not very elegant, but it works. I'd prefer to be able to explicitely select modes, but don't know how (yet).

                Also, the procedure to play a single MP3 file seems to have slightly changed with FW 1.67 (credit Taxus). One has to first enable the "extra menu" on the MusicPal, and there is an option "server" (not the media server !, just server, and fill-in the related menu, with computer name, share name, user name & password). From the MP, navigate to the server option, select one of those MP3 or WMA files which you have previously copied there, play it, save it to the fav. From then, it can be selected from the HomeServer just as any other MP fav.

                The clock is still not working. Rhâ
                Any hint ?

                Kommentar


                  Hab nochmal die dazu passende Webabfrage rausgekramt.

                  Damit man das auch nutzen kann.
                  Angehängte Dateien
                  Nils

                  aktuelle Bausteine:
                  BusAufsicht - ServiceCheck - Pushover - HS-Insight

                  Kommentar


                    Sprachdurchsagen mit dem Musikpal

                    So, dank Hilfe von Nils (wink mit dem Zaunpfahl) und dieses Forums hab ichs jetzt so zum laufen gebracht wie ich mir das vorgestellt habe:

                    Szenarium:
                    1. Der Musikpal läuft(oder auch nicht) mit beliebiger Tonquelle.
                    2. Alarm trifft ein.
                    3. Laufende Wiedergabe wird unterbrochen
                    4. Beliebige Durchsage oder auch Sequenz wird mit fester Lautstärke wiedergegeben.
                    5. Unterbrochene Wiedergabe wird mit alter Lautstärke fortgesetzt.

                    Lösung: Musikpal FW1.67, Palmod mit MPD Addon auf USB Stick installieren und gleich die benötigten Soundfiles mit auf den Stick packen.

                    Im Musikpal mit dem MPD die Sounds aktualisieren "/tmp/musikpal_addons/mpd/mpd/mpc update, dann jeweils mit "mpc add soundxx.mp3" die einzelenen Titel zu einer Playlist zusammenfügen und mit "mpc save meldungxx" abspeichern. natürlich können die Playlisten im m3u Format auch schon am PC erstellt werden. Achtung vor dem erstellen einer neuen Playliste mit "mpc clear" die Liste löschen.
                    Hilfe wird mit "mpc help" angezeigt.

                    Ablauf im HS: Sequenz anlegen die folgendes macht:

                    Musikpal-Status per Webabfrage abrufen.
                    Musikpal ausschalten falls er an war.
                    Lautstärke auf 15 setzten.
                    TCP Befehl an den MPD im Musikpal schicken der die Playliste aufruft und abspielt.
                    Lautstärke auf alten Wert aus der Statusabfrage zurückstellen.
                    Musikpal, falls er vorher an war wieder einschalten.

                    Dadurch dass der Musikpal in den Standby versetzt wird unterbricht er automatisch die Laufende Wiedergabe und setzt sie automatisch nach dem Einschalten wieder fort.
                    (Ja, die Wiedergabe der Durchsage passiert im "Standby")

                    Vielen Dank an das Forum und speziell an Nils.

                    P.S. Der gezeigte Lösungsweg ist alles andere als Optimal da er zeitlich starr abläuft und kein Feedback beinhaltet, aber fürs erste läufts.

                    Lösungen für Feedback gibts in diesem thread ja bereits, ich war nur zu faul (bzw. Meine Frau zu wichtig) um es umzusetzen.

                    Vorteil dieser Lösung ist, dass die gesamte Installation nur von USB Stick läuft und somit auch nach einem FW Update nichts gemacht werden muss.
                    Angehängte Dateien

                    Kommentar


                      Hi,
                      ich krame gerade mal diesen alten Thread hoch.
                      Zum Abspielen von dedizierten MP3-Sounds gibt es seid Firmware 1.68beta auch die Möglichkeit direkt per http-aufruf dedizierte Soundfiles abzuspielen.
                      IMHO einfacher als sich mit mpc auseinandersetzen zu müssen...

                      Für ein MP3:
                      http://musicpal/admin/cgi-bin/ipc_se.../webserver.mp3

                      Für einen dedizierten Webstream:
                      http://musicpal/admin/cgi-bin/ipc_se...8aabc&id=26583

                      Damit muss man nicht mehr Favoriten vorbelegen und dann den passenden Favorit abrufen - sondern kann direkt den gewünschten Stream aufrufen.
                      Die Links kann man z.B. aus der Favoritenliste einfach herauskopieren...

                      Gruß
                      Thorsten

                      PS: Ich suche noch 2 MusicPals für meine Bäder - kennt jemand seriöse Bezugsquellen oder will seinen (gut erhaltenen) MusicPal verkaufen?

                      Kommentar


                        Zitat von ThorstenGehrig Beitrag anzeigen
                        IMHO einfacher als sich mit mpc auseinandersetzen zu müssen...

                        Für ein MP3:
                        http://musicpal/admin/cgi-bin/ipc_se.../webserver.mp3

                        Für einen dedizierten Webstream:
                        http://musicpal/admin/cgi-bin/ipc_se...8aabc&id=26583
                        Hallo,

                        das hört sich sehr gut an und funktioniert bei mir mit dem zweiten link Beispiel.
                        Kann man auch eine Datei welche sich auf dem USB Stick befindet abspielen?
                        falls ja, was muss ich anstelle von http.... angeben?

                        gruss
                        Marcel
                        seit: 11'08 KNX / 04'09 HS3 / 12'09 WG mit 21 Temp & 4 Feuchtesensoren / 10'10 Enocean mit 15 Fenstergriffe Hoppe / 02'11 MBus2Serial Gas-Wasserzähler
                        HS3: 99% / VISU: PV 99%, iPad 99%
                        60 Akt. Linie1 / 14 Akt. Linie2

                        Kommentar


                          Hallo Zusammen,
                          bin über den Thread zufällig gestolpter ... das MusicPal klingt ja wirklich so als ob ich es unbedingt bräuchte ...
                          Hat jemand eine funktionierende Bezugsquelle parat ? Gibt es evtl. schon Nachfolgemodelle ?
                          Danke schon mal.

                          Kommentar


                            Hoi

                            Das Ding gibt es leider nicht mehr.
                            Derzeit nicht verfügbar.
                            Ob und wann dieser Artikel wieder vorrätig sein wird, ist unbekannt.
                            Vielleicht ein gebasteltes Gerät mit raspberry pi oder ähnlich...
                            Grüsse Bodo
                            Fragen gehören ins Forum, und nicht in mein Postfach;
                            EibPC-Fan; Wiregate-Fan; Timberwolf-Fan mit 30x 1-Wire Sensoren;

                            Kommentar


                              Bodo, danke dir (für die leider schlechten Nachrichten).
                              Nun gut, ich habe mir jetzt ein altes SqueezeBox Radio Modell (Neugerät) bestellt und werde das mit einem NAS betreiben. Ich bin schon gespannt und hoffe damit zufrieden zu sein. Es geht mir hauptsächlich um Anbindung Wecker <-> KNX. Falls ich damit glücklich bin, könnte ich mir auch eine Squeezebox Touch für die Zukunft vorstellen.
                              Ich denke, auch wenn die Squeezebox in der alten Form sterben wird lohnt es sich trotzdem noch diese einzusetzen. Hab zwar nur eure Threads bisher dazu gelesen, aber die Möglichkeiten klingen super.

                              Kommentar


                                Für Freunde der SqueezeBox: diese ist derzeit bei voelkner im Weihnachtsangebot.
                                Gruß
                                Frank

                                Soziologen sind nützlich, aber keiner will sie. Bei Informatikern und Administratoren ist es umgekehrt.

                                Kommentar

                                Lädt...
                                X