Ich suche eine Möglichkeit, den Client einer Visualisierung eindeutig zu identifizieren.
Konkret geht es darum, dass Belege abhängig vom Gerät auf jeweils einem anderen Drucker ausgedruckt werden sollen.
Die Identifizierung kann z.B. die MAC-Adresse oder auch die IP-Adresse sein.
Die Möglichkeit, für die Geräte jeweils eine eigene Visu zu erstellen und dann $_IPS[‚CONFIGURATOR‘] abzufragen ist mir bekannt. Leider müssen dann aber die Positionen und Grössen der Kacheln für jede einzelne Visualisierung neu konfiguriert werden.
Vielleicht stehe ich auf dem Schlauch und habe das Problem überhaupt nicht verstanden: Die Visualisierung läuft doch im Browser und der entweder nativ auf einem Gerät oder virtualisiert im Terminalserver. Diesen Sessions kann man dann eigene Drucker zuweisen.
Die Belege werden in einem Script auf dem Symcon-Server erzeugt und sollten dann je nach Client an verschiedene Drucker gesendet werden (via Druckserver). Das heisst, die Belege sind nie auf dem Client-System.
Es geht eigentlich noch weiter: ich möchte bei bestimmten Geräten je nach dem WO sie sich befinden, einen anderen Drucker wählen.
Hier die konkrete Situation:
Wir haben ein Hotel, das sich auf einem doch ziemlich grossen Grundstück befindet. Wenn ich einen Beleg am System in der Cafeteria anfordere, soll der auf dem Ticket-Drucker der Cafeteria gedruckt werden. Wenn ich den Beleg am System an der Reception anfordere, soll er auf dem Ticket-Drucker der Reception gedruckt werden. Wenn ich den Beleg z.B. von meinem Mobiltelefon anfordere, soll er auf dem am nächsten liegenden Drucker gedruckt werden.
Eigentlich könnte ich die Probleme erschlagen, wenn ich wüsste WO sich der Client befindet. Das kann ich relativ einfach über UniFi ermitteln, benötige dazu aber die IP-Adresse oder die MAC-Adresse. Deshalb meine initiale Frage.
Die Clients könnten mit einem kleinen Python-Script die WLAN Konfiguration auslesen und die MAC des APs mitsamt einer UID (Benutzername, Gerätename, MAC) an einen kleinen Server (ist in Python auch halbwegs schnell geschrieben) via TCP oder sogar nur UDP übertragen. Der Server schreibt das in eine Datei die Du dann auslesen kannst.
Die IP-Adresse und die MAC-Adresse zu kriegen ist einfach. Auch das Übertragen derselben an den Symcon-Server wäre nicht kompliziert. Aber wie soll mir das weiter helfen? Ich weiss ja noch immer nicht, welcher Client den Beleg anfordert.
Hm… Ich war bislang der Meinung, dass Symcon ein Client-Server Modell ist und das Rendern der Visualisierung immer auf dem Client stattfindet. Wenn das (wie und wo auch immer, vielleicht schreibst Du was dazu) auf dem Server stattfindet dann müssen auf dem Server aber auch pro Client eine Renderinstanz laufen die frei in ihrer Druckerzuweisung ist.
Oder laufe ich jetzt völlig in die Irre? Ich nutze Symcon eher als Datenlogger, dass man mit dem Produkt sowas wie eine Faktura schreiben kann ist (noch) fern meines Wissens.
Ich erstelle die Belege als PDF-Dokument aus einem PHP-Script. Für Symcon gibts also gar nichts zu rendern. Also auf dem Server eine PDF-Library installiert, mit Hilfe dieser eine PDF-Datei erstellt und via Print-Server ausdrucken. Alles, was der Client also machen muss, ist das Script anzustossen.
Und ja, klar kann man mit Symcon auch z.B. Rechnungen oder was auch immer schreiben. Ist ein Client/Server-Entwicklungssystem, da gibt es fast keine Grenzen.
Der abgestrippte Kontext ist also, dass es in der Visu (Client) einen Druck-Button gibt der in Symcon (Server) ein PHP Script (Server) auslöst welches dann eine Druckausgabe (Server) macht.
Da wäre meine Idee hilfreich, so würde ich jetzt erstmal innerhalb von Symcon ein PHP Script schreiben was alle Variablen [0…x] in eine Datei dumpt und dann schauen, was Symcon über die Clients weiss.
Wenn da nichts herauskommt, gib nochmal Bescheid. Es gibt eine Lösung, aber dazu musst Du im Ernstfall nochmal einen separaten Serverprozess programmieren.
Mir würde noch ein Weg einfallen, der aber auch etwas von hinten-durchs-knie-ins-auge ist:
Du legst einen Hook im Webhook-Control an, der dann z.b. unter symcon-ip:3777/hook/print erreichbar ist.
Du ordnest diesem Hook ein Symcon-Script zu. In diesem Script kannst du dann mittels der Systemvariable $_SERVER['REMOTE_ADDR'] die IP-Adresse des Clients auslesen, der den Hook ausgelöst hat. Damit könntest du dann innerhalb dieses Scripts deine gewünschte Druck-Aktion ausführe.
Jetzt musst du noch irgendwie die Hook-URL aus der VISU oder dem WebFront aufrufbar machen: Dies könntest du z.B. über eine HTML-Box machen, in der einfach ein Html-Button angezeigt wird, der als Aktion die Hook-URL aufruft.
Wichtig ist zu beachten, dass du im Hook-Skript selbst für eine Authentifizierung sorgen musst, da es von jedem (wenn du den Connect-Dienst benutzt, also auch von jedem aus dem Internet) aufrufbar ist.
Ich habe mal mit get_defined_vars gespielt. Die Variablen, die im Script zur Verfügung gestellt werden, geben nicht wirklich was über den Cient her.
Ja, die Idee mit dem Webhook und der Systemvariablen $_SERVER[‚REMOTE_ADDR‘] hatte ich auch schon. Sollte funktionieren, ist halt nicht so elegant, wie wenn die Information von Symcon selber zur Verfügung gestellt würde. Aber ist ein Ansatz, den ich wohl etwas weiterverfolgen werde.
Vielen Dank erstmal allen Beteiligten!
Laut Doku ist doch $_IPS['CONFIGURATOR'] verfügbar. Somit wäre die einfachste Idee pro Terminal eine Kopie der Visualisierung zu erstellen und darüber den Client eindeutig identifizieren. Ggf. direkt mit dem IP-Autostart Feature koppelt.
Ja, die Variable kenn ich, so mache ich es aktuell.
Wie ich im ersten Post schrieb ist es einfach etwas mühsam, dass die Einstellungen der Grössen und Positionierungen der Kacheln jeweils für jede einzelne Visualisierungs-Instanz wiederholt werden. Diesen Aufwand versuche ich zu vermeiden.
Eine andere Lösung wäre natürlich, wenn ich die Konfiguration der Grössen und Positionen der Kacheln irgendwie kopieren könnte. Dazu habe ich aber bisher nichts gefunden.
Genau das wollen wir bald anbieten. Ich glaub nicht dass es bis zur 8.0 klappt, aber zur 8.1. Du könntest aber stand heute per Visu_GetSnapshot und Visu_SaveGridConfiguration etwas zaubern.