• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Mac als Infodisplay nutzen, Netzwerkverbindung per Script "prüfen"

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
Hallo,

in einem Geschäft soll auf einem MacMini eine Powerpoint-Präsentation als Endlosschleife laufen (Werbung, Kundeninfos, aktuelle Veranstaltungen etc.).

Der Mac soll zeitgesteuert hochfahren, sich die tagesaktuelle Präsentation vom Server kopieren, diese als Endlosschleife abspielen und dann abhängig nach Wochentag zu einer bestimmten Uhrzeit wieder runterfahren. Für den Mac wurde eine Freigabe auf dem Server erstellt, von der er sich die Präsentation kopieren "darf", der Mac ist aber nicht Mitglied in der Windows-Domäne.

Der Mac fährt per Systemeinstellung "Energiesparen" zeitgesteuert hoch, den Rest erledigt dann das folgende AppleScript, welches in den Startobjekten liegt und eigentlich auch zuverlässig funktioniert (auch wenn man das Script vielleicht "eleganter" gestalten könnte).

Code:
-- Mac hochfahren
-- Wochentag prüfen
set Wochentag to (current date) as string
-- Wochtentag verarbeiten
if (Wochentag contains "Sonntag") then
    tell application "Finder"
        shut down
    end tell
else
    -- Verbindung zum Server herstellen
    -- Freigabe einbinden
    tell application "Finder"
        activate
        mount volume "smb://User:[email protected]/Daten"
    end tell
    delay 2

    -- bestehende Präsentation loeschen
    do shell script "rm /Users/MacMiniEingang/Desktop/Kundendisplay.ppsx"
    delay 2

    -- neue Präsentation kopieren
    do shell script "cp /Volumes/Daten/Kundendisplay/Kundendisplay.ppsx /Users/MacMiniEingang/Desktop"
    delay 5

    -- Präsentation starten
tell application "Microsoft PowerPoint"
        open "/Users/macminieingang/Desktop/Kundendisplay.ppsx"
    end tell
end if


-- Mac ausschalten
-- PowerPoint beenden
-- Wochentag prüfen
if (Wochentag contains "Samstag") then
    -- Zeitwert Saison 66480
    -- Zeitwert Nebensaison 64680
    repeat until ((current date)'s time) > 66480
    end repeat
    tell application "Microsoft PowerPoint"
        activate
        tell application "System Events"
            key code 53
            delay 2
            key code 53
            delay 2
            key code 12 using {command down}
        end tell
    end tell
else
    -- Zeitwert Saison 70080
    -- Zeitwert Nebensaison 68280
    repeat until ((current date)'s time) > 70080
    end repeat
    tell application "Microsoft PowerPoint"
        activate
        tell application "System Events"
            key code 53
            delay 2
            key code 53
            delay 2
            key code 12 using {command down}
        end tell
    end tell
end if
delay 2
-- Mac herunterfahren
tell application "Finder"
    shut down
end tell

Manchmal ist es jedoch so, dass die Verbindung mit dem Netzwerk scheitert (vermutlich schlechter W-Lan-Empfang). In diesem Fall bricht das Script dann mit der Fehlermeldung ab, dass die Verbindung mit dem Netzwerk gescheitert ist oder so ähnlich. Wenn man den Mac dann per Netzschalter ausschaltet und wieder neu starten lässt, funktioniert die Verbindung mit dem Netzwerk meist.

Tritt dieser Fall ein (Netzwerk reagiert nicht bzw. dass keine Verbindung möglich ist), dann soll das Script die beiden folgenden Schritte "bestehende Präsentation löschen" und "neue Präsentation kopieren" auslassen und beim Schritt "Präsentation starten" weiter machen. Der Mac soll dann quasi bis zum nächsten Neustart die alte, lokal vorhandene Präsentation abspielen.

Hat hier jemand eine Ahnung, wie man das Umsetzen könnte? Wichtig ist, dass der Mac alles eigenständig ohne "manuellen" Benutzerzugriff ausführt, da dieser wie schon gesagt mehr oder wenig unbeaufsichtigt laufen soll.

Ich bin da mit meinem Latein ehrlich gesagt am Ende (das obige Script hab ich mir per Google zusammengesucht, recht viel mehr Ahnung von AppleScript als die obigen Befehle hab ich nicht).

Wäre echt super, wenn mir da wer helfen könnte!

Gruß, Franz
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Ich habe dein Skript mal überarbeitet, und ein paar Dinge verbessert:

Code:
property istNebensaison : true-- true falls Nebensaison, false falls Saison
property server : "192.168.2.100" -- IP-Adresse des Servers
property freigabe : "Daten" -- Name der Freigabe


-- Mac hochfahren
-- Wochentag prüfen
set Wochentag to weekday of (current date) as string
-- Wochtentag verarbeiten
if (Wochentag is "Sunday") then
   tell application "Finder"
       shut down
   end tell
   return --Skript beenden
end if

-- Verbindung zum Server 5 mal prüfen:
set online to false
repeat 5 times
   if checkServer(server) then
       set online to true
   end if
   delay 1
end repeat

if online then
   -- Freigabe verbinden:
   mount volume "smb://User:Passwort@" & server & "/" & freigabe
   -- max. 5s warten, bis Freigabe verbunden ist:
   repeat 5 times
       delay 1
       -- sobald Freigabe vorhanden, Datei kopieren
       if (list disks) contains freigabe then
           tell application "Finder"
               -- Datei kopieren:
               duplicate POSIX file "/Volumes/" & freigabe & "/Kundendisplay/Kundendisplay.ppsx" to POSIX file "/Users/MacMiniEingang/Desktop/" with replacing
           end tell
           exit repeat -- Schleife abbrechen
       end if
   end repeat
end if

delay 5

-- Präsentation starten
tell application "Microsoft PowerPoint"
   open "/Users/macminieingang/Desktop/Kundendisplay.ppsx"
end tell

-- Mac ausschalten
-- PowerPoint beenden
-- Wochentag prüfen
if (Wochentag is "Saturday") then
   set zeit to 66480 -- Zeitwert Saison Samstag 66480
   if istNebensaison then
       set zeit to 64680 -- Zeitwert Nebensaison Samstag 64680
   end if
else
   set zeit to 70080 -- Zeitwert Saison Wochentag 70080
   if istNebensaison then
       set zeit to 68280 -- Zeitwert Nebensaison Wochentag 68280
   end if
end if

-- warten:
repeat until ((current date)'s time) > zeit
   delay 1 -- weniger Prozessorauslastung
end repeat

-- Powerpoint beenden:
tell application "Microsoft PowerPoint"
   close presentation 1
   quit
end tell

delay 2

-- Mac herunterfahren
tell application "Finder"
   shut down
end tell


-- Handler: prüft, ob der Server erreichbar ist. Gibt true oder false zurück
on checkServer(ServerIP)
   try
       do shell script "ping -t2 -c1 " & ServerIP
       return true
   on error
       return false
   end try
end checkServer

Folgende Dinge haben sich verändert:
- funktioniert nun unabhängig von der Systemsprache oder des Datumformats
- vor dem Verbinden wird 5 mal im Abstand von einer Sekunde geprüft, ob der
Server erreichbar ist. Falls nicht, wird die lokale Präsentation gestartet.
- anstatt Löschen und Kopieren wird nun kopiert und ersetzt.
- festlegen von Haupt- und Nebensaison am Anfang vom Skript
- nicht mehr abhängig von Bedienungshilfen (System Events)
- Performanceverbesserungen

Das Skript ist nicht getestet, es können daher Fehler auftreten.
 

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
Hallo,

vielen Dank schon mal dafür.

Ich werde das ganze dann nach meinem Urlaub (Ende September) testen und mich nochmal melden.

Gruß, Franz
 

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
Guten Abend,
Sorry für die späte Rückmeldung. Ich hatte leider heute erst Zeit, das Script mal zu testen.
Leider funktioniert es nicht so, wie es soll.
Der Startvorgang ist im Vergleich zu meinem Script deutlich länger. Wenn das Netzwerk verfügbar ist, dann wird die bestehende Präsentation gestartet, eine neue Version vom Server wird nicht kopiert.

Ist das Netzwerk hingegen nicht verfügbar (hab ich durch das Ausstecken der Airport Express provoziert), dann passiert gar nix. Der Mac bootet ganz normal bis zum Desktop und das war es.

Woran könnte das liegen?
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Startvorgang dauert länger:
Ja, im worst-case dauert es 20s. Wenn das Skript funktioniert, werde ich das noch optimieren.

Neue Präsentation wird nicht kopiert:
Eventuell wird das Laufwerk nicht schnell genug gemountet. Da musst du mal die Wartezeit etwas anpassen.

Präsentation startet nicht:
Da hat sich am Code nichts geändert. Ich habe den Code nochmal getestet und anfangs wurde auch bei mir nur Powerpoint gestartet, nicht aber die Präsentation. Warum weiss ich aber nicht, eventuell ein Bug von Powerpoint. Du kannst alternativ mal den "Präsentation starten"-Teil ersetzen mit

Code:
-- Präsentation starten
tell application "Microsoft PowerPoint"
    open "/Users/macminieingang/Desktop/Kundendisplay.pptx"
    set thePresentation to active presentation's slide show settings
    run slide show thePresentation
end tell

Dazu muss die Präsentation als .pptx-Datei gespeichert werden.


Erscheinen denn Fehlermeldungen?
 

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
Guten Abend,
danke für deine Rückmeldung.
Ich hab jetzt nochmal an dem Script herumgedoktort. Ich hab diverse Elemente aus deinem Skript in mein bestehendes eingebaut. Das teste ich morgen und schau, ob es funktioniert.

Ich melde mich dann nochmal und werde dann auch mein Ergebnis hochladen.

Bzgl. deiner letzten Frage: Nein, Fehlermeldungen erscheinen keine, es passiert lediglich gar nix. Der Mac zeigt den Desktop an und das war's.
 

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
So, hier endlich die umgebaute Version des Skripts:

Code:
property server : "192.168.xxx.xxx" -- IP-Adresse des Servers
property freigabe : "Daten" -- Name der Freigabe
property istNebensaison : true -- true falls Nebensaison, false falls Saison

-- Warten, bis Mac vollständig hochgefahren ist
delay 3

-- Wochentag prüfen
set Wochentag to weekday of (current date) as string
-- wenn Sonntag ist, Mac wieder ausschalten
if (Wochentag is "Sunday") then
    tell application "Finder"
        shut down
    end tell
    return
end if

-- Verbindung zum Server prüfen
checkServer(server)
on checkServer(server)
    try
        set t to do shell script "ping -o -c 1 " & server
        if t contains "0% packet loss" then
            return true
        else
            return false
        end if
    on error
        return false
    end try
end checkServer

set online to false
if checkServer(server) then
    set online to true
end if

if online then
    -- Freigabe Verbinden
    mount volume "smb://user:pw@" & server & "/" & freigabe
    -- max. 5 Sekunden warten, bis Freigabe verbunden ist
    repeat 5 times
        delay 1
        -- sobald Freigabe verbunden ist, bestehende Präsentation löschen und neue Präsentation kopieren
        if (list disks) contains freigabe then
            tell application "Finder"
                do shell script "rm /Users/MacMiniEingang/Desktop/Kundendisplay.ppsx"
                delay 1
                do shell script "cp /Volumes/Daten/Kundendisplay/Kundendisplay.ppsx /Users/MacMiniEingang/Desktop"
                delay 1
            end tell
            exit repeat
        end if
    end repeat
end if

delay 2

-- Präsentation starten
tell application "Microsoft PowerPoint"
    open "/Users/MacMiniEingang/Desktop/Kundendisplay.ppsx"
end tell

-- Mac ausschalten
-- Wochentag prüfen
if (Wochentag is "Saturday") then
    set zeit to 66480 -- Zeitwert Saison Samstag 66480
    if istNebensaison then
        set zeit to 64680 -- Zeitwert Nebensaison Samstag 64680
    end if
else
    set zeit to 70080 -- Zeitwert Saison Wochentag 70080
    if istNebensaison then
        set zeit to 68280 -- Zeitwert Nebensaison Wochentag 68280
    end if
end if

-- warten:
repeat until ((current date)'s time) > zeit
    delay 1 -- weniger Prozessorauslastung
end repeat

-- Präsentation beenden
tell application "Microsoft PowerPoint"
    activate
    tell application "System Events"
        key code 53
        delay 1
        key code 53
        delay 1
        key code 12 using {command down}
    end tell
end tell


-- Mac herunterfahren
tell application "Finder"
    shut down
end tell

Das Skript funktioniert jetzt genau so, wie es soll. Fehlermeldungen kommen hier keine mehr, Verbindung zum Server klappt und falls nicht, wird die lokale Präsentation wiedergegeben.

Zum Punkt "Präsentation beenden": Da habe ich wieder auf meinen Ansatz zurückgegriffen. Den genannten Vorschlag mit "close presentation 1" hatte ich selbst bereits getestet. Das funktioniert aber irgendwie nicht; vermutlich hat das Skript das Problem, die bildschirmfüllende, in Endlosschleife laufende Präsentation nicht beenden zu können oder PowerPoint stellt sich da quer.
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
2 kleine Dinge habe ich noch geändert:

- Im Abschnitt "Verbindung zum Server prüfen" ist die Abfrage "checkServer(server)" unnötig. Außerdem ist die Variable "online" unnötig, weil checkServer(server) schon true oder false zurückgibt.

- Den Shell-Befehl zum Löschen und Kopieren der Presentation habe ich in ein do shell script hineingepackt und mit && verbunden. Das && bewirkt, dass der zweite Befehl erst nach dem erfolgreichen Ende des ersten Befehls startet. Dadurch sparst du dir ein delay 1 und kannst sicher gehen, dass die alte Präsentation auch wirklich gelöscht ist.

Code:
property server : "192.168.xxx.xxx" -- IP-Adresse des Servers
property freigabe : "Daten" -- Name der Freigabe
property istNebensaison : true -- true falls Nebensaison, false falls Saison

-- Warten, bis Mac vollständig hochgefahren ist
delay 3

-- Wochentag prüfen
set Wochentag to weekday of (current date) as string
-- wenn Sonntag ist, Mac wieder ausschalten
if (Wochentag is "Sunday") then
    tell application "Finder"
        shut down
    end tell
    return
end if

-- Verbindung zum Server prüfen

if checkServer(server) then
    -- Freigabe Verbinden
    mount volume "smb://user:pw@" & server & "/" & freigabe
    -- max. 5 Sekunden warten, bis Freigabe verbunden ist
    repeat 5 times
        delay 1
        -- sobald Freigabe verbunden ist, bestehende Präsentation löschen und neue Präsentation kopieren
        if (list disks) contains freigabe then
            tell application "Finder"
                do shell script "rm /Users/MacMiniEingang/Desktop/Kundendisplay.ppsx && cp /Volumes/Daten/Kundendisplay/Kundendisplay.ppsx /Users/MacMiniEingang/Desktop"
                delay 1
            end tell
            exit repeat
        end if
    end repeat
end if

delay 2

-- Präsentation starten
tell application "Microsoft PowerPoint"
    open "/Users/MacMiniEingang/Desktop/Kundendisplay.ppsx"
end tell

-- Mac ausschalten
-- Wochentag prüfen
if (Wochentag is "Saturday") then
    set zeit to 66480 -- Zeitwert Saison Samstag 66480
    if istNebensaison then
        set zeit to 64680 -- Zeitwert Nebensaison Samstag 64680
    end if
else
    set zeit to 70080 -- Zeitwert Saison Wochentag 70080
    if istNebensaison then
        set zeit to 68280 -- Zeitwert Nebensaison Wochentag 68280
    end if
end if

-- warten:
repeat until ((current date)'s time) > zeit
    delay 1 -- weniger Prozessorauslastung
end repeat

-- Präsentation beenden
tell application "Microsoft PowerPoint"
    activate
    tell application "System Events"
        key code 53
        delay 1
        key code 53
        delay 1
        key code 12 using {command down}
    end tell
end tell


-- Mac herunterfahren
tell application "Finder"
    shut down
end tell


on checkServer(server)
    try
        set t to do shell script "ping -o -c 1 " & server
        if t contains "0% packet loss" then
            return true
        else
            return false
        end if
    on error
        return false
    end try
end checkServer
 
  • Like
Reaktionen: franz-ro

franz-ro

Hildesheimer Goldrenette
Registriert
03.03.08
Beiträge
676
Hallo,

danke für deine erneute Korrektur.

Funktioniert jetzt wie schon gesagt bisher ohne jegliche Fehler, Abstürze o.ä.

Ich hab nur noch eine kleine Frage zur Verständnis: Wieso steht das "on checkServer (server)" ganz am Ende des Skripts?

Ich dachte immer, dass das Script in der Reihenfolge abgearbeitet wird, in der die Befehle eingegeben werden? Ich kenne diesen Ablauf halt noch aus der Zeit, in der ich hobbymäßig mit TurboPascal unter MS-DOS Programme gebastelt habe (ja, das ist schon sehr lange her ...).

Grüße, Franz
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
on checkServer(server) ist ein sogenannter Handler. Das ist eine Subroutine, die im Skript mit checkServer(server) aufgerufen werden kann (auch mehrmals). Wo der Handler definiert wird, ist egal, entscheidend ist der Aufruf. Der Übersicht halber empfiehlt es sich aber, den Handler am Ende anzufügen.

Subroutinen benutzt man normalerweise, um redundanten Code zu vermeiden oder um Code besser lesbar und verständlicher zu machen. In diesem Fall ist checkServer(server) ein Handler, den ich in mehreren Skripten verwende und so nur noch kopieren muss.