Antwort einer seriellen Einheit zerlegen

Hallo,
hoffen alle haben die Weihnachtsfeiertage gut überstanden, sind reichlich beschenkt worden und haben vielleicht die Zeit genutzt um den WAF ihrer Hausautomatisierung etwas zu erhöhen :wink:

Ich werde nicht ganz schlau aus der Art und weise wie man am besten empfangene Daten einer Seriellen Einheit verarbeitet?

Sende ich meiner Heizungssteuerung die charfolge „z“ „e“ „p“ über den seriellen port bekomme ich folgendes in windows Hyperterminal



Name	Circuit	Value
202	1	0020,1
201	1	0001,2
180	1	00020
181	1	00016
203	1	0050,2
230	1	0056,1
204	1	0045,1
231	1	00050
175	1	00015
176	1	00001
179	1	00018
177	1	00010
178	1	00090
183	1	00015
182	1	-00015
184	1	00090
185	1	00060
186	1	00096
187	1	00003
010	1	00001
011	1	-00015
012	1	00060
014	1	00017
015	1	00010
020	1	00001
021	1	00000
022	1	00001
023	1	00001
024	1	00001
030	1	00050
035	1	-00020
036	1	00000
037	1	00025
052	1	00000
085	1	00000
141	1	00000
174	1	00009


Das ist ja eine „schöne Antwort“ weil dort alle parameter drin sind die für mich von Nutzen sind.
Was wäre der beste Lösungsansatz diese Antwort zu bearbeiten? Jeden Linie stellt einen parameter dar
Name Circuit Value
die aktuellen Werte würd ich nun gern jeweils in eine Variable legen die so heisst wie der Parameter, zB Variable 203=50,2 gradC (Vorlauftemp)
Circuit ist irellevant da ich nur einen Kreislauf habe

Bin mir nicht sicher ob cutchars hier genutzt werden können, glaube nicht! Ich denke das Ergebnis muss mit PHP zerstückelt werden und dann line für line in die Variablen gepeist werden, nur wie speichere ich das obige zwischen?
Register variable?
bleibt die formatierung so erhalten?
Sollte man eine textdatei als zwischenspeicher nutzen? wie kommt die „Antwort“ in die textdatei?

viele Fragen, bin ein wenig ratlos

Übrigens kann jeder Parameter auch einzeln abgefragt werden indem ich zB den Gerät die zeichenfolge „r“ „203“ „1“
Antwort:


> r 203 1
Name	Circuit	Value
203	1	0050,2
> 

gruss
Torsten

Hi,

also ein Teillösung kann ich dir da geben.

Wenn du in einer Variable deine Ausgabe hast dann kannst du das in PHP folgendermaßen zerlegen:



// $input enthält die die Rückgabewerte von dem Kommando "zep"


$ausgabedaten=array();

/*
 Hier wird der Rückgabewert ersteinmal in einzelne Zeilen zerlegt
*/
foreach(explode("
",$input) AS $zeile){
//Jetzt jede Zeile in 3 Teile Zerlegen (name,circuit,value)
list($name,$circuit,$value)=explode("	",trim($zeile));

// Hier den Wert umwandeln in eine "echte" Fließkommazahl umwandeln.
// Komma durch Punkt ersetzen, dann als Float wandeln.
$value=(float)str_replace(",",".",$value);

$ausgabedaten[$name]=$value;
}

// Nun solltest du an deine Daten  folgendermaßen rankommen:
echo $ausgabedaten[203]; // gibt dir "50.2" aus
// usw usw

Hi, danke für die schnelle Antwort,
so richtig will das nicht funktionieren weil PHP die explode Zeichen nicht finden kann.
Kann es sein das Hyperterminal irgendwas mit am format ändert?

wenn ich einen serial sniffer dazwischen schalte sieht es so aus:


> p

NameCircuitValue

20210019,4

20110001,5

180100020

181100016

20310055,5

23010054,6

20410048,9

231100050

175100015

176100001

179100018

177100010

178100090

183100015

1821-00015

184100090

185100060

186100096

187100003

010100001

0111-00015

012100060

014100017

015100010

020100001

021100000

022100001

023100001

024100001

030100050

0351-00020

036100000

037100025

052100000

085100000

141100000

174100009

189100006

196100000

197100000

198100001

199100015

> 



da sind keine tabs, dann sollte ich wohl besser „substr“ anwenden oder?

Hallo TORSTENG,
habe mal etwas probiert …

<?
$objINFO = IPS_GetObject($IPS_SELF);
//$VariablenParentID = $objINFO['ParentID'];
$VariablenParentID = $objINFO['ObjectID'];

//TEST1 - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - -
$input =
"Name	Circuit	Value
202	1	0020,1
201	1	0001,2
180	1	00020
181	1	00016
141	1	00000
174	1	00009";
     
foreach(explode("
",$input) AS $zeile)
    {
     list($name,$circuit,$value) = explode("	",trim($zeile));
     $value=(float)str_replace(",",".",$value);

     if (is_numeric($name) == true)
		  {
         $name = "PARMETER_" . $circuit . "_" . $name;
         SetValueFloat(CreateVariableByName($VariablenParentID, $name, 2, ""), $value);
		  }
    }
//ENDE - TEST1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

//TEST2 - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - -
$input =
"NameCircuitValue

90210019,4

90110001,5

980100020

981100016

90310055,5

93010054,6


";

foreach(explode((chr(13).chr(10)),$input) AS $zeile)
    {
	  if (strlen($zeile) >= 5)
		  {
         $name    = substr(trim($zeile),0,3);
         $circuit = substr(trim($zeile),3,1);
         $value   = substr(trim($zeile),4);

         $value=(float)str_replace(",",".",$value);

         if (is_numeric($name) == true)
		      {
             $name = "PARMETER_" . $circuit . "_" . $name;
             SetValueFloat(CreateVariableByName($VariablenParentID, $name, 2, ""), $value);
		      }
		  }
    }
//ENDE - TEST2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

//FUNCTION zum erzeugen einer Variablen über Namen * * * * * * * * * * * * * * *

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

?>

… Du empfängst doch die Daten über eine RegVar (RegisterVariable), da kannst Du auch sonst im DEBUG (Hex-Modus) mal schauen wie der Datenstream dann wirklich bei IPS ankommt !!

tgusi74

jep das werde ich gleich mal morgen früh machen, sag schon mal 1000 Dank für die interessanten Ansätze, da wird sich bestimmt etwas machen lassen, meld mich sofort

gruss
torsteng

hi, hier mal ein copy/paste des debug window nach dem senden des „p“ (also abfage der Parameterliste mit Werten)

hex


30-12-2009 07:11:21.00 |          TRANSMITTED | 70 
30-12-2009 07:11:21.00 |          TRANSMITTED | 0A 
30-12-2009 07:11:21.00 |             RECEIVED | 70 0A 
30-12-2009 07:11:21.00 |             RECEIVED | 4E 61 6D 65 09 43 69 72 63 75 69 74 09 56 
30-12-2009 07:11:21.00 |             RECEIVED | 61 6C 75 65 0D 32 30 32 09 31 09 
30-12-2009 07:11:21.00 |             RECEIVED | 30 30 31 38 2C 34 0D 32 30 31 09 31 09 
30-12-2009 07:11:21.00 |             RECEIVED | 30 30 30 30 2C 37 0D 31 38 30 09 31 09 
30-12-2009 07:11:21.00 |             RECEIVED | 30 30 30 31 39 0D 31 38 31 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 30 31 36 0D 32 30 33 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 34 33 2C 33 0D 32 33 30 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 34 32 2C 30 0D 32 30 34 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 33 39 2C 34 0D 32 33 31 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 30 35 30 0D 31 37 35 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 30 31 35 0D 31 37 36 09 31 09 
30-12-2009 07:11:22.00 |             RECEIVED | 30 30 30 30 31 0D 31 37 39 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 31 38 0D 31 37 37 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 31 30 0D 31 37 38 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 39 30 0D 31 38 33 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 31 35 0D 31 38 32 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 2D 30 30 30 32 30 0D 31 38 34 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 39 30 0D 31 38 35 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 36 30 0D 31 38 36 09 31 09 
30-12-2009 07:11:23.00 |             RECEIVED | 30 30 30 39 36 0D 31 38 37 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 30 33 0D 30 31 30 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 30 31 0D 30 31 31 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 2D 30 30 30 31 35 0D 30 31 32 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 36 30 0D 30 31 34 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 31 37 0D 30 31 35 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 31 30 0D 30 32 30 09 31 09 
30-12-2009 07:11:24.00 |             RECEIVED | 30 30 30 30 31 0D 30 32 31 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 30 30 0D 30 32 32 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 30 31 0D 30 32 33 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 30 31 0D 30 32 34 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 30 31 0D 30 33 30 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 35 30 0D 30 33 35 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 2D 30 30 30 32 30 0D 30 33 36 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 30 30 0D 30 33 37 09 31 09 
30-12-2009 07:11:25.00 |             RECEIVED | 30 30 30 32 35 0D 30 35 32 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 30 0D 30 38 35 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 30 0D 31 34 31 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 30 0D 31 37 34 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 39 0D 31 38 39 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 36 0D 31 39 36 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 30 0D 31 39 37 09 31 09 
30-12-2009 07:11:26.00 |             RECEIVED | 30 30 30 30 30 0D 31 39 38 09 31 09 
30-12-2009 07:11:27.00 |             RECEIVED | 30 30 30 30 31 0D 31 39 39 09 31 09 
30-12-2009 07:11:27.00 |             RECEIVED | 30 30 30 31 35 0D 
30-12-2009 07:11:27.00 |             RECEIVED | 3E 20 

ascii


30-12-2009 07:11:21.00 |          TRANSMITTED | p
30-12-2009 07:11:21.00 |          TRANSMITTED | 

30-12-2009 07:11:21.00 |             RECEIVED | p

30-12-2009 07:11:21.00 |             RECEIVED | Name	Circuit	V
30-12-2009 07:11:21.00 |             RECEIVED | alue
202	1	
30-12-2009 07:11:21.00 |             RECEIVED | 0018,4
201	1	
30-12-2009 07:11:21.00 |             RECEIVED | 0000,7
180	1	
30-12-2009 07:11:21.00 |             RECEIVED | 00019
181	1	
30-12-2009 07:11:22.00 |             RECEIVED | 00016
203	1	
30-12-2009 07:11:22.00 |             RECEIVED | 0043,3
230	1	
30-12-2009 07:11:22.00 |             RECEIVED | 0042,0
204	1	
30-12-2009 07:11:22.00 |             RECEIVED | 0039,4
231	1	
30-12-2009 07:11:22.00 |             RECEIVED | 00050
175	1	
30-12-2009 07:11:22.00 |             RECEIVED | 00015
176	1	
30-12-2009 07:11:22.00 |             RECEIVED | 00001
179	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00018
177	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00010
178	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00090
183	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00015
182	1	
30-12-2009 07:11:23.00 |             RECEIVED | -00020
184	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00090
185	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00060
186	1	
30-12-2009 07:11:23.00 |             RECEIVED | 00096
187	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00003
010	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00001
011	1	
30-12-2009 07:11:24.00 |             RECEIVED | -00015
012	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00060
014	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00017
015	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00010
020	1	
30-12-2009 07:11:24.00 |             RECEIVED | 00001
021	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00000
022	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00001
023	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00001
024	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00001
030	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00050
035	1	
30-12-2009 07:11:25.00 |             RECEIVED | -00020
036	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00000
037	1	
30-12-2009 07:11:25.00 |             RECEIVED | 00025
052	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00000
085	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00000
141	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00000
174	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00009
189	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00006
196	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00000
197	1	
30-12-2009 07:11:26.00 |             RECEIVED | 00000
198	1	
30-12-2009 07:11:27.00 |             RECEIVED | 00001
199	1	
30-12-2009 07:11:27.00 |             RECEIVED | 00015

30-12-2009 07:11:27.00 |             RECEIVED | > 


Damit solltest Du glücklich werden (Erweiterung von http://www.ip-symcon.de/forum/f18/registervariable-erklaerung-8872/#post73132):

if ($IPS_SENDER == "RegisterVariable") // wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
{
    $data  = RegVar_GetBuffer($IPS_INSTANCE); // bereits im Puffer der RegisterVariable-Instanz vorhandene Daten in $data kopieren
    $data .= $IPS_VALUE; // neu empfangene Daten an $data anhängen

    if (strpos($data, chr(0x0D))) // wenn das Trennzeichen 0x0D in $data gefunden worden ist
    {
        $datasets = explode(chr(0x0D), $data); // $data in durch 0x0D separierte Datensätze zerlegen
        for ($i = 0; $i < count($datasets) - 1; $i++) // alle nicht durch 0x0D terminierten Datensätze verarbeiten
        {
            $parts = explode(chr(0x09), $datasets[$i]); // Datensatz mit Trennzeichen 0x09 zerlegen
            if (count($parts) == 3 && $parts[0] != "Name") // Datensätze filtern: Gültige Datensätze müssen genau drei Teile haben und der erste Teil darf nicht "Name" enthalten
            {
                $key = (int)$parts[0]; // Schlüssel
                $value = (double)str_replace(",", ".", $parts[2]); // Wert
                echo $key." = ".$value."
"; // Schlüssel-Wert-Paar ausgeben
            }
        }
        $data = $datasets[count($datasets) - 1]; // $data auf den Inhalt des letzten und damit unvollständigen Datensatzes setzen
    }

    RegVar_SetBuffer($IPS_INSTANCE, $data); // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
}

Hi,
nachdem ich den Jahreswechsel mit einer fiesen Magengeschichte verschlafen habe, konnte ich nun obiges script ausprobieren und auf anhieb funktionierte es.
Horst: ich danke dir!

frohes neues Jahr an alle auch wenns ein wenig spät dafür ist :wink: