Hilfe gesucht, SQL Ergebnis zerlegen

Hi zusammen,

entweder habe ich gerade ne Denkblockade oder es ist einfach zu warm :rolleyes:

Meine Heizung liefert über den Bus Informationen, die auf einem Pi ausgewertet werden und in einer MySql DB gespeichert werden. Über eine Abfrage bekomme ich folgendes Ergebnis im Format: SensorID - Name - Wert Einheit

011-Außentemperatur-19.2°C
019-Betriebszeit-1608000min
020-Brennerstarts-44276
017-Flammenstrom-0µA
012-Gedämpfte Außentemperatur-22°C
023-Heizzeit-1498160min
002-Kessel-Ist-Temperatur-43°C
001-Kessel-Soll-Temperatur-7°C
024-Kesselpumpenmodulation-0%
016-Maximale Leistung-0%
015-Momentane Leistung-0%
010-Rücklauftemperatur-42.9°C
018-Systemdruck-1.7bar
025-Temperatur Ausgang Waermetauscher-45°C
005-Vorlauf HK1-Soll-Temperatur-5°C
004-Warmwasser-Ist-Temperatur-55.3°C
003-Warmwasser-Soll-Temperatur-10°C

Da es noch ein paar mehr Zeilen sind, habe ich überlegt wie ich diese Daten am einfachsten den Variablen in IPS zuweisen kann, ohne über ein ellenlanges CASE oder If then Else zu gehen, komme aber gerade auf keine brauchbare Lösung. Kann mir da mal jemand auf die Sprünge helfen ? :loveips:

Gruß
Jens

wenn in $data die Ausgabe steht, geht das z.B. so:

foreach (explode("
",$data) as $line) {
        if (preg_match('/^(\d+)-(.*)-([\d\.]+?)(.*)$/smU', $line,$row) ) {
                print "Sensor=$row[1],Name:$row[2],Wert:$row[3],Einheit:$row[4]
";
        }
}

Ergebnis:

Sensor=011,Name:Außentemperatur,Wert:19.2,Einheit:°C
Sensor=019,Name:Betriebszeit,Wert:1608000,Einheit:min
Sensor=020,Name:Brennerstarts,Wert:44276,Einheit:
Sensor=017,Name:Flammenstrom,Wert:0,Einheit:µA
Sensor=012,Name:Gedämpfte Außentemperatur,Wert:22,Einheit:°C
Sensor=023,Name:Heizzeit,Wert:1498160,Einheit:min
Sensor=002,Name:Kessel-Ist-Temperatur,Wert:43,Einheit:°C
Sensor=001,Name:Kessel-Soll-Temperatur,Wert:7,Einheit:°C
Sensor=024,Name:Kesselpumpenmodulation,Wert:0,Einheit:%
Sensor=016,Name:Maximale Leistung,Wert:0,Einheit:%
Sensor=015,Name:Momentane Leistung,Wert:0,Einheit:%
Sensor=010,Name:Rücklauftemperatur,Wert:42.9,Einheit:°C
Sensor=018,Name:Systemdruck,Wert:1.7,Einheit:bar
Sensor=025,Name:Temperatur Ausgang Waermetauscher,Wert:45,Einheit:°C
Sensor=005,Name:Vorlauf HK1-Soll-Temperatur,Wert:5,Einheit:°C
Sensor=004,Name:Warmwasser-Ist-Temperatur,Wert:55.3,Einheit:°C
Sensor=003,Name:Warmwasser-Soll-Temperatur,Wert:10,Einheit:°C

Tommi

Hi Tommi,

danke für die Antwort.
Ich habe mich da wohl unglücklich ausgedrückt.

Die einzelnen Felder bekomme ich ohne Probleme hin, (die Beispielausgabe sind die 4 Felder ID, Name, Wert und EInheit), mir geht’s jetzt darum die einzelnen Werte aus der Abfrage in die passenden Variablen in IPS zu bekommen, ohne 30 Zeilen „If then else“ oder ohne eine „Switch/Case“ Schleife mit 30 Einträgen.

Ich bin auf der Suche nach einer Idee, das Ganze über den Namen des Sensors oder über die ID des Sensors den IPS Variaben in einer einzigen Schleife zuzuweisen. Also generell nur die Werte, denn Namen und Einheit lege ich ja bei der Variablenerstellung fest.
ID ist nur eine zusätzliche Info, mit der man evtl. bei der Zuweisung einfacher umgehen kann, als mit dem Namen (wg. Sonderzeichen).

Gruß
Jens

ach so.Du kannst Dir ein Array mit dem Mapping der IDs anlegen und dann matchen


$ipsids=array('011'=>12345,'019'=>23456,...);
SetValue($ipsids[$sensor],$value);

Alternativ kannst Du auch über die Idents gehen, wenn Du die Variablen vorher entsprechend präpariert hast


$id=IPS_GetObjectByIdent($ident,$parent);
if ($id>0) SetValue($id,$value);

Letzteres mache ich in meinen Modulen schon relativ exzessiv.

Tommi

Guten Morgen,

das 2. Beispiel, genau das habe ich gesucht :slight_smile:

DANKE !

Ich glaube ich bin zu blöd dafür, was nehme ich denn als $ident ?? :confused:
Egal was ich bei $ident eingebe, es wird nicht gefunden. Mit IPS_GetVariableIDByName gehts aber einwandfrei !?

Gruß
Jens

Hast du den mit IPS_SetIdent auch einen gesetzt?
Zeig doch was du bisher hast.
Michael

Ah … da lag der Fehler.
Mir war die Funktion mit dem Ident nicht klar und in der Hilfe ist kein Verweis zueinander vorhanden :confused:
Deine Frage nach IPS_SetIdent hat dann meinen Knoten im Kopf gelöst :banghead:
Natürlich hatte ich das vorher nicht gemacht :rolleyes:

Gruß
Jens