Modernisierte Swift-Version von mac2mqtt fuer aktuelle macOS-Versionen:
mac2mqttd= Daemon (MQTT + macOS Steuerung)mac2mqtt-ui= Menu-Bar App (Start/Stop/Restart, Settings, Logs)
- Publiziert:
status/alivestatus/volumestatus/mutestatus/battery(nur bei Macs mit internem Akku)status/power_source(ac_poweroderbattery, nur bei Macs mit internem Akku)status/display(true= Monitor an,false= Monitor aus)status/display_changed_at(ISO-8601-Zeitstempel des letzten Monitor-Statuswechsels)status/locked(true= Benutzer-Session ist gesperrt)status/media_playing(true= Wiedergabe laeuft,false= pausiert/gestoppt)
- Reagiert auf:
command/volumecommand/mutecommand/sleepcommand/shutdowncommand/displaysleepcommand/displaywakecommand/display(sleepoderwake)command/say(Payload wird per macOS-Sprachausgabe vorgelesen; laufende Wiedergabe und Mute werden vorher pausiert/geaendert und danach wiederhergestellt)command/notification(Payload als Text oder JSON:{"title":"Titel","message":"Text"}; erscheint immer als Vordergrund-Dialog)command/screensaver(Name eines nachinstallierten.saver)command/app(App per Payload als Name/Pfad/Bundle-ID starten oder aktivieren)command/media_playback(play,pauseodertoggle)command/play_pause(Alias fuertoggle)
Damit kannst du z.B. unter <base>/<computerName>/status/display sehen, ob mindestens ein angeschlossener Monitor aktiv ist, und unter <base>/<computerName>/status/display_changed_at, wann dieser Zustand zuletzt gewechselt hat.
Auf Macs ohne internen Akku werden status/battery und status/power_source nicht veroeffentlicht; vorhandene retained Werte werden einmal geloescht.
Apps koennen per Payload als Name (Safari), Bundle-ID (com.apple.Safari), Pfad (/Applications/Safari.app) oder JSON ({"name":"Safari"}) gestartet bzw. aktiviert werden.
Der Media-Status hat ein eigenes Polling-Intervall (intervals.mediaSeconds, Standard: 1), damit Play/Pause schneller erkannt wird als Display- oder Battery-Status.
Topic-Schema:
<base>/<computerName>/status/... und <base>/<computerName>/command/...
Genau fuer deinen Use Case:
cd /Users/USERNAME/mac2mqtt-modern
./build-app.shDanach liegt die App hier:
/Users/USERNAME/mac2mqtt-modern/dist/Mac2MQTT.app
Die App dann einfach nach Programme ziehen.
Das Finder-/Remote-Symbol wird dabei automatisch als App-Icon gesetzt.
Beim ersten Start Service in der Menu-Bar macht die App alles selbst:
- installiert
mac2mqttdnach~/mac2mqtt/ - legt
~/mac2mqtt/mac2mqtt.yamlan (falls nicht vorhanden) - erzeugt und startet den
launchdLaunchAgent
cd /Users/USERNAME/mac2mqtt-modern
swift build -c releaseBinaries liegen danach unter:
./.build/release/mac2mqttd./.build/release/mac2mqtt-ui
- Arbeitsordner anlegen:
mkdir -p /Users/USERNAME/mac2mqtt- Daemon und Config kopieren:
cp ./.build/release/mac2mqttd /Users/USERNAME/mac2mqtt/
cp ./mac2mqtt.yaml.example /Users/USERNAME/mac2mqtt/mac2mqtt.yaml
chmod +x /Users/USERNAME/mac2mqtt/mac2mqttdmac2mqtt.yamlanpassen.
Hinweis: Fuer User-Hintergrunddienste ist LaunchAgents der moderne und sichere Weg.
cp ./com.example.mac2mqttd.plist /Users/USERNAME/Library/LaunchAgents/com.example.mac2mqttd.plistDann in der plist USERNAME ersetzen und laden:
launchctl bootstrap gui/$(id -u) /Users/USERNAME/Library/LaunchAgents/com.example.mac2mqttd.plist
launchctl enable gui/$(id -u)/com.example.mac2mqttd
launchctl kickstart -k gui/$(id -u)/com.example.mac2mqttdStoppen:
launchctl bootout gui/$(id -u)/com.example.mac2mqttd/Users/USERNAME/mac2mqtt/mac2mqttd --config /Users/USERNAME/mac2mqtt/mac2mqtt.yamlDie UI verwaltet launchd fuer dich und schreibt Config/Plist automatisch an die richtigen Stellen.
cd /Users/USERNAME/mac2mqtt-modern
./.build/release/mac2mqtt-uiDann in der Menu-Bar:
Settingsfuer MQTT-Host, Topics und Poll-IntervalleStart Service/Stop Service/Restart ServiceLogsfuer stdout/stderr vom Daemon
Wenn du die UI als klickbare App haben willst:
mkdir -p Mac2MQTTUI.app/Contents/MacOS
cp ./.build/release/mac2mqtt-ui Mac2MQTTUI.app/Contents/MacOS/mac2mqtt-ui
cat > Mac2MQTTUI.app/Contents/Info.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>mac2mqtt-ui</string>
<key>CFBundleIdentifier</key>
<string>com.example.mac2mqtt-ui</string>
<key>CFBundleName</key>
<string>Mac2MQTTUI</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSUIElement</key>
<true/>
</dict>
</plist>
EOF
open ./Mac2MQTTUI.appDie MQTT-Topics sind bewusst kompatibel zur bisherigen mac2mqtt-Logik gehalten, damit bestehende Automationen weiter funktionieren.