USV über COMPort auslesen/steuern

Hallo IPS-Community, ich glaub’ ich brauche eure Hilfe…

Ich habe eine USV der Marke „Mustek PowerMust 1000 USB - USV - 1000 VA“. Diese kann über USB und COM-Port ausgelesen bzw. gesteuert werden. Dazu gibt es die Originalsoftware „WinPower“, mit der alle aktuellen Daten und Parameter angesehen werden können (Screenshot unten).

Nun möchte ich genau diese Daten (Spannung, Ladezustand Batterie, Temperatur usw.) in IPS auswerten. Dazu gibt es 2 Möglichkeiten:
A) Daten aus dem Logfile der Software parsen und in IPS einlesen
B) Datenaustausch über den COM-Port

Möglichkeit A wäre natürlich die einfachste, da aber leider nicht alle Parameter bzw. Daten in das Logfile geschrieben werden (es fehlt z.B. Temperatur), fällt diese Version leider weg.

Bleibt Möglichkeit B! Und genau da liegt mein Problem: ich habe keine Ahnung wie ich das anstellen soll… Bin zwar nicht gerade ein PHP-Anfänger, aber mit dem Auslesen von Daten über RS232 habe ich noch keine Erfahrung.

Nun meine Frage an euch: Wie bekomme ich einen (für mich lesbaren Datenstring), welchen ich dann mit PHP aufsplitten und in Variablen schreiben kann? :confused:

Habe schon im Forum gesucht, doch leider bin ich nirgends weitergekommen. Es gibt haufenweise Skripts, die Daten über das Logfile einzulesen, doch über RS232 habe ich nichts gefunden (zumindest nichts, was mir in meine Augen weiterhilft). Ich weiß, dass alles mit dem Befehl „COMPort_SendText“ abgefragt werden kann, doch wohin diese Daten fliegen leider nicht. Und dann war da noch die Rede von Checksumme usw. => GAME OVER! :smiley:

Was ich bisher gemacht habe:

  1. Com Port Instanz hinzugefügt (Baudrate: 2400!)
  2. Registervariable auf Com Port
    So, wie geht es nu weiter?

Habe im Internet noch eine weitere Software gefunden (WinMust - Simple UPS Status Monitor), mit der man die USV auslesen/steuern kann. Der Quellcode dieser Software ist glücklicherweise frei zugänglich (habe ihn unten angefügt), sodass sicher einige von euch damit was anfangen können.

Soweit ich das verstehe, werden mit dem Skript „UPSCOMPortBase.cs“ die Daten ausgelesen und mit dem Skript „UPSInterfaceBase.cs“ ausgewertet. Weiters glaub ich gibt es 5 verschiedene Text-Befehle um mit der USV zu kommunizieren:
„M“ – Daten abfragen
„Q1“ – Packet Style A
„F“ – Packet Style B
“Q” – Toggle Alarm
“T” – USV testen

Hat jemand von euch sowas schon mal realisiert? Vielleicht ein kleines Skript, das mir weiterhelfen könnte?

Nochmals zum Verständnis: Ich suche kein Skript, mit dem man das „lesbare“ Ergebnis in z.B. Variablen schreiben kann (das schaff’ ich dann schon ;)), sondern wie man zu lesbaren Daten überhaupt kommt, sodass diese weiterverarbeitet werden können. Solte dies in eurem Skript schon dabei sein, sage ich auch nicht nein… :smiley:

Bitte um eine Schritt-für-Schritt Anleitung für „Noch-Nicht-IPS-Experten“. Bin mir sicher, dass dies auch für viele andere User interessant ist, vor allem die allgemeine Vorgangsweise…

Freu mich auf eure Antworten!

Grüße
Simon

WinMust_Source.zip (150 KB)

Hallo Simon,

ist das Protokoll bekannt wenn ja, sollte es kein Problem sein. Ansonsten wirst Du wohl selber die Daten zusammen stückeln müssen.

Ein Script brauchts Du noch, welches Du der Registervariable zuordnest.

Könnte z.B. so aussehen.

//Registervariable auslesen
     $datenFrame = $IPS_VALUE;
IPS_LogMessage($IPS_SELF, $IPS_VALUE);

„M“ – Daten abfragen

Wenn es so ist, probier es mal mit

RegVar_SendText(12345, chr(M));

Oh, das ging ja schnell…

Klappt leider noch nicht! Es kommt die Fehlermeldung: „Use of undefined constant M…“

Vielleicht habe ich da was vertauscht (bin kein Experte :D)! Könntest du dir mal die beiden Skripte (unten angehängt) ansehen? Diese sind von der Auslese-Software mit offenem Code… Vielleicht lässt sich da was herausfiltern!

Ein Experte wie du sieht wahrscheinlich sofort, wie der Hase läuft…

Übrigens: Warum wird die Abfrage nicht mit COMPort_sendtext gemacht? :confused:

UPSCOMPortBase.cs.txt (8.14 KB)

UPSInterfaceBase.cs.txt (8.66 KB)

Ich bin kein Experte.

mach mal anstatt chr(M) nur „M“ also

RegVar_SendText(12345, "M");

Du kannst auch über den Comport senden, ist egal.

Ok, jetzt ist die Fehlermeldung weg! :slight_smile:

Doch wie sehe ich jetzt, ob die Datenabfrage erfolgreich war?

Ich habe den Code


//Registervariable auslesen
$datenFrame = $IPS_VALUE;
IPS_LogMessage($IPS_SELF, $IPS_VALUE);

in ein neues Skript kopiert und der Registervariable zugeordnet!

Sobald ich nun mit RegVar_SendText(<ID-RegVar>, „M“); eine Abfrage mache, müsste das Skript doch getriggert werden, oder? Passiert aber nicht…

wenn was zurück kommen sollte, siehst Du es unter Meldungen mit der Script ID

Klappt leider immer noch nicht…:frowning:

Ich bin mir sicher, dass hier der Fehler vor dem PC sitzt, da die Originalsoftware problemlos mit der USV kommuniziert!

Also:

  1. Instanz „Serial Port“ hinzufügen
  2. Registervariable hinzufügen mit dem „Serial Port“ als übergeordnete Instanz
  3. Neues Skript erstellen mit folgendem Inhalt:

//Registervariable auslesen
$datenFrame = $IPS_VALUE;
IPS_LogMessage($IPS_SELF, $IPS_VALUE); 

und der Registervariable als Zielskript zuordnen

  1. Neues Skript erstellen mit folgendem Inhalt:
RegVar_SendText(18833  /*[Serial Port\Register Variable]*/, "Q1");

„Q1“ habe ich aus dem Protokoll, welches hier zu finden ist.

  1. Letztes Skript ausführen und damit sollte ein Ergebnis zurückkommen… (zumindest in der Meldungsübersicht)! Ist das so korrekt?

Ich fürchte, dass hier noch andere Einstellungen zu machen sind :confused:

Grüße
Simon

passt schon.

RegVar_SendText(18833  /*[Serial Port\Register Variable]*/, "Q1".chr(13));  

mach mal deine Registervariable auf und klick auf Debug und Haken in HEX setzen, da siehst Du mehr und gleich.

Jooo, jetzt funkts :D:D Super, vielen Dank!!

Wie bekomme ich aber jetzt den gesamten Dantenstring? Sodass ich alle Werte in verschiedene Variablen schreiben kann?

prima. Jetzt kommst Du her und setzt die Daten in den Buffer der Registervariable und zwar bis 46 dann ist der String zuEnde. Dazu hat Horst was schönes geschrieben. Wenn Du damit nicht zurecht kommst, kannst Du mir auch die Daten per PM senden so wie sie in der RegVar ankommen.

RegisterVariable - IP-Symcon :: Automatisierungssoftware

das 2te Beispiel sollte passen, die Länge auf 46 anpassen.

Super, danke!

Werd ich morgen gleich probieren!!

Grüße
Simon

Hat bestens funktioniert!

Musste allerdings die Stringlänge auf 47 setzen…

Grüße
Simon