# USV über COMPort auslesen/steuern

**URL:** <https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628>\
**Category:** Skripte, PHP, SQL (Fragen)\
**Created:** [26. März 2010 um 14:09 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628 "2010-03-26T14:09:54Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 14:09 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/1 "2010-03-26T14:09:54Z")

</div>

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? 😕

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! 😃

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](http://winmust.sourceforge.net/)), 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… 😃

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

 ![WinPower.jpg](https://community.symcon.de/uploads/default/original/3X/0/b/0b1526d447cdda8e4660727ba38d5178e6909475.jpeg)

[WinMust\_Source.zip](https://community.symcon.de/uploads/short-url/sgEU1rM7EP7AH8UTHP0HK2T96L1.zip) (150 KB)

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [26. März 2010 um 14:27 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/2 "2010-03-26T14:27:17Z")

</div>

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.

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

```

„M“ – Daten abfragen

Wenn es so ist, probier es mal mit

```php
RegVar_SendText(12345, chr(M));

```

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 15:11 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/3 "2010-03-26T15:11:44Z")

</div>

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? 😕

[UPSCOMPortBase.cs.txt](https://community.symcon.de/uploads/short-url/3Ux2HTko25nmIy6nAVrK05IyvfT.txt) (8.14 KB)

[UPSInterfaceBase.cs.txt](https://community.symcon.de/uploads/short-url/1uL5NHpEfPvk7SgyFqdRYefr0KQ.txt) (8.66 KB)

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [26. März 2010 um 15:29 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/4 "2010-03-26T15:29:05Z")

</div>

Ich bin kein Experte.

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

```php
RegVar_SendText(12345, "M");

```

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

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 16:04 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/5 "2010-03-26T16:04:36Z")

</div>

Ok, jetzt ist die Fehlermeldung weg! 🙂

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

Ich habe den Code

```php

//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…

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [26. März 2010 um 16:07 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/6 "2010-03-26T16:07:41Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 18:27 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/7 "2010-03-26T18:27:40Z")

</div>

Klappt leider immer noch nicht…☹

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:

```php

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

```

und der Registervariable als Zielskript zuordnen

1. Neues Skript erstellen mit folgendem Inhalt:

```php
RegVar_SendText(18833 /*[Serial Port\Register Variable]*/, "Q1");

```

„Q1“ habe ich aus dem Protokoll, welches [hier](http://networkupstools.org/protocols/megatec.html) 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 😕

Grüße  
Simon

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [26. März 2010 um 18:32 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/8 "2010-03-26T18:32:27Z")

</div>

passt schon.

```php
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.

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 19:07 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/9 "2010-03-26T19:07:29Z")

</div>

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?

 ![Meldung.jpg](https://community.symcon.de/uploads/default/original/3X/c/1/c1157297895c84e948ff2fd46f483e8771e857b7.jpeg)

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [26. März 2010 um 19:21 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/10 "2010-03-26T19:21:15Z")

</div>

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](http://www.ip-symcon.de/service/dokumentation/modulreferenz/registervariable/)

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

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [26. März 2010 um 19:55 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/11 "2010-03-26T19:55:37Z")

</div>

Super, danke!

Werd ich morgen gleich probieren!!

Grüße  
Simon

---

<div class="post-metadata">

**Author:** ![Simon](https://community.symcon.de/letter_avatar_proxy/v4/letter/s/f07891/32.png) [@Simon](https://community.symcon.de/u/Simon)\
**Post date:** [29. März 2010 um 13:24 UTC](https://community.symcon.de/t/usv-ueber-comport-auslesen-steuern/21628/12 "2010-03-29T13:24:39Z")

</div>

Hat bestens funktioniert!

Musste allerdings die Stringlänge auf 47 setzen…

Grüße  
Simon
