WS500 auslesen (PostgreSQL)

Hallo

um die Werte der WS500 in IPS nutzen zu können dachte ich mir, ein kleines PHP Script zu schreiben, welches die Werte aus der DB ausliesst und dann in IPS zur Verfügung stellt.
Soweit so gut, denn die letzten Werte haben in den entsprechenden Tabellen ja immer die höchste OID.
Als absoluter PHP „Nix-Versteher“ stehe ich jetzt aber vor dem Problem, wie ich per „Select“ einen Wert aus einer Tabellen auslesen kann, aber nur den in der Zeile mit der höchsten OID.

Meine Idee war jetzt:

$oid = pg_query($dbconn, "SELECT max(oid) FROM outside_temp");
$WS500_Temperature_Out = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = $oid");

In einem anderen Script habe ich gesehen, dass das auch mit einer „for“ Schliefe geht, die alle Tabellen durch geht und das ganze in einer Art Array ausgibt, aber da komme ich nicht weiter, deswegen dachte ich mir, ich mache die „unschönere“ Art.

Das ganze sollte doch funktionieren, oder?
Ich bekomme hier laufen Fehlermeldungen wenn ich mir die WS500_Temperature_Out Variable dann per „print“ ausgeben lasse:

Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near „id“ at character 59 in C:\Programme\IP-SYMCON\web\wetter_aktuell.php on line 141

sorry, aber von PHP habe ich nicht wirklich eine Ahnung.

Danke

Andre

noch mal das ganze Script:

<?php



// true wenn negativ, false wenn postiv
function is_neg ($num) {
   return $num < 0;
}

// Verbindungsaufbau und Auswahl der Datenbank, Anmeldeinformationen
// todo: password entsprechend dem lokalen Kennwort des DB Benutzers postgres ändern
// standardmäßig weather
$dbconn = pg_connect("host=localhost dbname=elvws500 user=postgres password=xxxxxxx")
   or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());

// HTML header
echo "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 4.0 transitional//EN\">
";
echo "<HTML>
";
echo "<HEAD>
";
echo "</HEAD>
";


$oid = pg_query($dbconn, "SELECT max(oid) FROM outside_temp");


// $WS500_isRaining =
// $WS500_Rain =
// $WS500_Pressure =
// $WS500_Humidity_Out =
$WS500_Temperature_Out = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = $oid");
// $WS500_Windforce =
// $WS500_Winddirection =
// $WS500_Windfluctuation =

print $WS500_Temperature_Out;

//}

echo "</BODY>
";
echo "</HTML>
";

// Verbindung schliessen
pg_close($dbconn);
?>

Hallo,

mit PG kann ich Dir leider nicht helfen, aber in mySQL wuerde es so gehen:


Select wert,id,timestamp from tabelle order by timestamp [ASC/DSC] limit 1;

Select … selectiere
wert… Wert des Eintrages
id … ID des Eintrages
timestamp… Zeitstempel des Eintrages
from tabelle … aus der Datenbanktabelle
order by timestamp… sortiert nach dem Zeitstempel
[ASC/DSC] Reihenfolge auf/absteigend glaube ich
limit 1… ein einzelnen Datensatz zurueckgeben

Gruss Torro

hmm, ich habe das mit der höchten OID jetzt mal in eine Abfrage gepackt:

$WS500_Temperature_Out = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp)");

Scheint ohne Probleme zu funktionieren, nur der ausgegebene Wert irritiert mich, denn da steht nicht die aktuelle Temperatur, sonden

Resource id #3
:confused:

ich habe mal „gegoogelt“, aber alle Beiträge zu diesem Tehma verweisen auf arrays, die ich doch garnicht benutze.

Danke

„Ein Blick ins Gesetz erleichtert die Rechtsfindung“

Bei uns nunmal das PHP Handbuch :slight_smile:

http://php3.de/manual/de/ref.pgsql.php

Besonders auf „pg_fetch_array“ achten :slight_smile:

paresy

Hallo paresy

zwischenzeitlich bin ich da auch irgendwie hingekommen. Ich dachte das funktioniert bei PostgreSQL genauso wie bei MySQL, falsch gedacht :frowning:

Na, dann werde ich mich doch mal damit beschäftigen, es sei denn, jemand erbarmt sich mit mir, bin eher ein „Editor“ als ein „Author“ :slight_smile:

Andre

Nunja… PqSQL ist funktioniert unter PHP wie MySQL :slight_smile:

Was passiert denn, wenn du diesen Code hier nimmmst:



...

$WS500_Temperature_Out = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp)");  

// Ergebnisse in HTML ausgeben
echo "<table>
";
while ($line = pg_fetch_array($WS500_Temperature_Out, null, PGSQL_ASSOC)) {
    echo "	<tr>
";
    foreach ($line as $col_value) {
        echo "		<td>$col_value</td>
";
    }
    echo "	</tr>
";
}
echo "</table>
";

...


paresy

damit geht es, obwohl ich den PHP Code ehrlich gesagt nicht verstehe.

Das Original Script, welches ich genutzt hatte hatte immer die letzten Werte (all, die die KS500 bringt) in einer Tabelle ausgegeben.
Da war neu menge mit „Switch“, und „Array“ drin. vielleicht sollte ich mir das originale noch mal ansehen …

Andre

Ich würde mich nicht auf die Annahme, das die oid immer wächst, verlassen.
Besser ist es, auf eine entsprechend eindeutige Spalte der Tabelle zurückzugreifen (autoincrement oder Datum/Zeit). Die abfrage ist die gleiche
mit dem subselect.
Bei mir zum Beispiel für die Anzeige der maximalen Helligkeit:

select * from helligkeit where menge=(select max(menge) from helligkeit);

datum | zeit | menge | dauer | sflag | flag
------------±---------±-------±------±------±-----
2004-06-20 | 13:32:30 | 150000 | 19.04 | 0 |
(1 Zeile)

und den letzten Wert:

select * from helligkeit where datum+zeit=(select max(datum+zeit) from helligkeit);

datum | zeit | menge | dauer | sflag | flag
------------±---------±------±------±------±-----
2006-07-24 | 20:57:06 | 3260 | 46.59 | 0 |
(1 Zeile)

(diese Abfrage mit der Feldverkettung geht so aber nur bei postgresql !!)

Tommi

Leute,

Eure :
SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp);

schreibt sich lieber als:
SELECT TOP 1 weatherdata FROM outside_temp ORDER BY oid DESC;
und braucht keine 2 queries fur das gleiche resultat.

Top 1 ??? Kenne ich (noch nicht)

SELECT TOP 1 weatherdata FROM outside_temp ORDER BY oid DESC;

mein psql (version 8.1.4) auch nicht::frowning:
wetter=> select top 1 data from helligkeit order by menge desc;
ERROR: syntax error at or near „1“ bei Zeichen 12
ZEILE 1: select top 1 data from helligkeit order by menge desc;

Mein mysql (5.0.22) kennt das auch noch nicht:
mysql> select top 1 data from light order by lux desc;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚1 data from light order by lux desc‘ at line 1

Tommi

Sorry …
Access SQL <> mySQL :o

SELECT weatherdata FROM outside_temp LIMIT 1,1 ORDER BY oid DESC;

LIMIT gleicht TOP, also hier neuester oben (ORBER BY … DESC)
und LIMIT 1,1 nimm die erste reiche ab den ersten record.
(zugabe : LIMIT 1,5 hies nimm das erste record ab den 5-en record also gibt es den 5-en record zuruck; LIMIT 5,10 gibt records 10-14 zuruck)
notiz: immer LIMIT mit ORDER BY clause nutzen :wink:

Entschuldige

Hallo Leutz

so wie es aussieht, machen das was ich machen möchte (WS500 / 300 Werte in IPS bearbeiten) ja doch schon einige.
Klar will ich mich mehr mit PHP beschäftigen, mein Problem ist nur die Zeit.

Macht das hier schon jemand? Könnte jemand (Tommi?) die Scripte mal zur Verfügung stellen?

Danke

Andre

Hallo Fredtje,

das hatte ich schon mal ganz am Anfang des Threads inkl. Erkalerung geschrieben. Aber: Er benutzt eben nicht mySQL, sondern pgSQL. Und genau da ist es etwas anders.

Gruss Torro

isch habe gar keine ws500… Deshalb kann ich auch keine fertigen Scripte zum Auslesen einer ws500 liefern. Dafür habe ich eine ws2500pc, mit der ich meine pgsql-db füttere. Wenn da einer was haben will, gerne.

Tommi

Hallo zusammen

so, fertig. Ist wahrscheinlich nicht die beste Art das zu machen, aber es funktioniert (naja fast):

<?php

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : import_ws500
Trigger  : none
Interval : 5 minutes
Description:   Run this script every 5 Minutes to get the lastest values
               out of the WS500's PostgrSQL Database for use in
               IPS
*/



$dbconn = pg_connect("host=localhost dbname=elvws500 user=postgres password=xxxxxxxx")
   or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());


$WS500_isRaining_t = pg_query($dbconn, "SELECT israining FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Rain_t = pg_query($dbconn, "SELECT raincounter FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Pressure_t = pg_query($dbconn, "SELECT weatherdata FROM airpressure WHERE oid = (SELECT max(oid) FROM airpressure)");
$WS500_Humidity_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_hum WHERE oid = (SELECT max(oid) FROM outside_hum)");
$WS500_Temperature_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp)");
$WS500_Windforce_t = pg_query($dbconn, "SELECT weatherdata FROM windforce WHERE oid = (SELECT max(oid) FROM windforce)");
$WS500_Winddirection_t = pg_query($dbconn, "SELECT degree FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");
$WS500_Windfluctuation_t = pg_query($dbconn, "SELECT fluctuation FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");

$WS500_isRaining = pg_fetch_result($WS500_isRaining_t, 0, 0);
$WS500_Rain = pg_fetch_result($WS500_Rain_t, 0, 0);
$WS500_Pressure = pg_fetch_result($WS500_Pressure_t, 0, 0);
$WS500_Humidity_Out = pg_fetch_result($WS500_Humidity_Out_t, 0, 0);
$WS500_Temperature_Out = pg_fetch_result($WS500_Temperature_Out_t, 0, 0);
$WS500_Windforce = pg_fetch_result($WS500_Windforce_t, 0, 0);
$WS500_Winddirection = pg_fetch_result($WS500_Winddirection_t, 0, 0);
$WS500_Windfluctuation = pg_fetch_result($WS500_Windfluctuation_t, 0, 0);

pg_close($dbconn);
?>

Mein Problem ist jetzt nur, dass wenn ich das Script in IPS laufen lasse, die Variablen nicht mit den Ergebnissen gesetzt werden. Wenn ich die einfach per „Echo oder print“ in HTML ausgebe geht alles, nur in IPS nicht.
DIe Variablen habe ich entsprechend angelegt: siehe Anhang

Habe ich da einen Denkfehler?

Andre

Aller Anfang ist schwer :slight_smile:

IP-Symcon Variablen <> PHP Variablen

http://www.ipsymcon.de/wiki/index.php/SetValueBoolean
http://www.ipsymcon.de/wiki/index.php/SetValueInteger
http://www.ipsymcon.de/wiki/index.php/SetValueFloat
http://www.ipsymcon.de/wiki/index.php/SetValueString

paresy

@paresey: Mist, da warste mit Deinem Wissen wieder schneller wie ich mit meinem Erfolgserlebnis :slight_smile:

Ich habe es nun hinbekommen!!!

Was mir aufgefallen ist:
Im Editor werden die „(interger)“ und die „(float)“ Einträge schön farblich gekennzeichnet, der „(boolean“) aber nicht.

hier das fertige Script, für alle die, die wich ich keine Ahnung haben und bessere Editoren aus Authoren sind:

<?php

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : import_ws500
Trigger  : none
Interval : 5 minutes
Description:   Run this script every 5 Minutes to get the lastest values
               out of the WS500's PostgrSQL Database for use in
               IPS
*/



$dbconn = pg_connect("host=localhost dbname=elvws500 user=postgres password=xxxxxxxx")
   or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());


$WS500_isRaining_t = pg_query($dbconn, "SELECT israining FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Rain_t = pg_query($dbconn, "SELECT raincounter FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Pressure_t = pg_query($dbconn, "SELECT weatherdata FROM airpressure WHERE oid = (SELECT max(oid) FROM airpressure)");
$WS500_Humidity_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_hum WHERE oid = (SELECT max(oid) FROM outside_hum)");
$WS500_Temperature_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp)");
$WS500_Windforce_t = pg_query($dbconn, "SELECT weatherdata FROM windforce WHERE oid = (SELECT max(oid) FROM windforce)");
$WS500_Winddirection_t = pg_query($dbconn, "SELECT degree FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");
$WS500_Windfluctuation_t = pg_query($dbconn, "SELECT fluctuation FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");

$WS500_isRaining = pg_fetch_result($WS500_isRaining_t, 0, 0);
$WS500_Rain = pg_fetch_result($WS500_Rain_t, 0, 0);
$WS500_Pressure = pg_fetch_result($WS500_Pressure_t, 0, 0);
$WS500_Humidity_Out = pg_fetch_result($WS500_Humidity_Out_t, 0, 0);
$WS500_Temperature_Out = pg_fetch_result($WS500_Temperature_Out_t, 0, 0);
$WS500_Windforce = pg_fetch_result($WS500_Windforce_t, 0, 0);
$WS500_Winddirection = pg_fetch_result($WS500_Winddirection_t, 0, 0);
$WS500_Windfluctuation = pg_fetch_result($WS500_Windfluctuation_t, 0, 0);

SetValueBoolean("WS500_isRaining", (boolean)$WS500_isRaining);
SetValueInteger("WS500_Rain", (integer)$WS500_Rain);
SetValueFloat("WS500_Pressure", (float)$WS500_Pressure);
SetValueInteger("WS500_Humidity_Out", (integer)$WS500_Humidity_Out);
SetValueFloat("WS500_Temperature_Out", (float)$WS500_Temperature_Out);
SetValueFloat("WS500_Windforce", (float)$WS500_Windforce);
SetValueInteger("WS500_Winddirection", (integer)$WS500_Winddirection);
SetValueFloat("WS500_Windfluctuation", (float)$WS500_Windfluctuation);


pg_close($dbconn);
?>

Einen RIESEN DANK an alle, die mir hier mit Tips, Tricks und Tritten in die richtige Richtung geholfen haben.

Andre

kleine Korrektur, da in der Datenbank bei „isRaining“ immer nur ein „f“ zurückkommt:

<?php

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : import_ws500
Trigger  : none
Interval : 5 minutes
Description:   Run this script every 5 Minutes to get the lastest values
               out of the WS500's PostgrSQL Database for use in
               IPS
*/



$dbconn = pg_connect("host=localhost dbname=elvws500 user=postgres password=xxxxxxxx")
   or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());


$WS500_isRaining_t = pg_query($dbconn, "SELECT israining FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Rain_t = pg_query($dbconn, "SELECT raincounter FROM rainfall WHERE oid = (SELECT max(oid) FROM rainfall)");
$WS500_Pressure_t = pg_query($dbconn, "SELECT weatherdata FROM airpressure WHERE oid = (SELECT max(oid) FROM airpressure)");
$WS500_Humidity_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_hum WHERE oid = (SELECT max(oid) FROM outside_hum)");
$WS500_Temperature_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE oid = (SELECT max(oid) FROM outside_temp)");
$WS500_Windforce_t = pg_query($dbconn, "SELECT weatherdata FROM windforce WHERE oid = (SELECT max(oid) FROM windforce)");
$WS500_Winddirection_t = pg_query($dbconn, "SELECT degree FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");
$WS500_Windfluctuation_t = pg_query($dbconn, "SELECT fluctuation FROM winddirection WHERE oid = (SELECT max(oid) FROM winddirection)");

$WS500_isRaining = pg_fetch_result($WS500_isRaining_t, 0, 0);
$WS500_Rain = pg_fetch_result($WS500_Rain_t, 0, 0);
$WS500_Pressure = pg_fetch_result($WS500_Pressure_t, 0, 0);
$WS500_Humidity_Out = pg_fetch_result($WS500_Humidity_Out_t, 0, 0);
$WS500_Temperature_Out = pg_fetch_result($WS500_Temperature_Out_t, 0, 0);
$WS500_Windforce = pg_fetch_result($WS500_Windforce_t, 0, 0);
$WS500_Winddirection = pg_fetch_result($WS500_Winddirection_t, 0, 0);
$WS500_Windfluctuation = pg_fetch_result($WS500_Windfluctuation_t, 0, 0);

if ($WS500_isRaining == "f") {
   SetValueBoolean("WS500_isRaining", (boolean)FALSE);
   }else {
   SetValueBoolean("WS500_isRaining", (boolean)TRUE);
   }

SetValueInteger("WS500_Rain", (integer)$WS500_Rain);
SetValueFloat("WS500_Pressure", (float)$WS500_Pressure);
SetValueInteger("WS500_Humidity_Out", (integer)$WS500_Humidity_Out);
SetValueFloat("WS500_Temperature_Out", (float)$WS500_Temperature_Out);
SetValueFloat("WS500_Windforce", (float)$WS500_Windforce);
SetValueInteger("WS500_Winddirection", (integer)$WS500_Winddirection);
SetValueFloat("WS500_Windfluctuation", (float)$WS500_Windfluctuation);


pg_close($dbconn);
?>

In der neuen Version von Weather Professional haben die das DB Layout geändert.

anbei das angepasste Script:


<?php

/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : import_ws500
Trigger  : none
Interval : 5 minutes
Description:   Run this script every 5 Minutes to get the lastest values
               out of the WS500's PostgrSQL Database for use in
               IPS
*/



$dbconn = pg_connect("host=localhost dbname=elvws500 user=postgres password=weather")
   or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());


$WS500_isRaining_t = pg_query($dbconn, "SELECT israining FROM rainfall WHERE savetime = (SELECT max(savetime) FROM rainfall)");
$WS500_Rain_t = pg_query($dbconn, "SELECT raincounter FROM rainfall WHERE savetime = (SELECT max(savetime) FROM rainfall)");
$WS500_Pressure_t = pg_query($dbconn, "SELECT weatherdata FROM airpressure WHERE savetime = (SELECT max(savetime) FROM airpressure)");
$WS500_Humidity_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_hum WHERE savetime = (SELECT max(savetime) FROM outside_hum)");
$WS500_Temperature_Out_t = pg_query($dbconn, "SELECT weatherdata FROM outside_temp WHERE savetime = (SELECT max(savetime) FROM outside_temp)");
$WS500_Humidity_In_t = pg_query($dbconn, "SELECT weatherdata FROM inside_hum WHERE savetime = (SELECT max(savetime) FROM inside_hum)");
$WS500_Temperature_In_t = pg_query($dbconn, "SELECT weatherdata FROM inside_temp WHERE savetime = (SELECT max(savetime) FROM inside_temp)");
$WS500_Windforce_t = pg_query($dbconn, "SELECT weatherdata FROM windforce WHERE savetime = (SELECT max(savetime) FROM windforce)");
$WS500_Winddirection_t = pg_query($dbconn, "SELECT degree FROM winddirection WHERE savetime = (SELECT max(savetime) FROM winddirection)");
$WS500_Windfluctuation_t = pg_query($dbconn, "SELECT fluctuation FROM winddirection WHERE savetime = (SELECT max(savetime) FROM winddirection)");

$WS500_isRaining = pg_fetch_result($WS500_isRaining_t, 0, 0);
$WS500_Rain = pg_fetch_result($WS500_Rain_t, 0, 0);
$WS500_Pressure = pg_fetch_result($WS500_Pressure_t, 0, 0);
$WS500_Humidity_Out = pg_fetch_result($WS500_Humidity_Out_t, 0, 0);
$WS500_Temperature_Out = pg_fetch_result($WS500_Temperature_Out_t, 0, 0);
$WS500_Humidity_In = pg_fetch_result($WS500_Humidity_In_t, 0, 0);
$WS500_Temperature_In = pg_fetch_result($WS500_Temperature_In_t, 0, 0);

$WS500_Windforce = pg_fetch_result($WS500_Windforce_t, 0, 0);
$WS500_Winddirection = pg_fetch_result($WS500_Winddirection_t, 0, 0);
$WS500_Windfluctuation = pg_fetch_result($WS500_Windfluctuation_t, 0, 0);

if ($WS500_isRaining == "f") {
   SetValueBoolean("WS500_isRaining", (boolean)FALSE);
   }else {
   SetValueBoolean("WS500_isRaining", (boolean)TRUE);
   }

SetValueInteger("WS500_Rain", (integer)$WS500_Rain);
SetValueFloat("WS500_Pressure", (float)$WS500_Pressure);
SetValueInteger("WS500_Humidity_Out", (integer)$WS500_Humidity_Out);
SetValueFloat("WS500_Temperature_Out", (float)$WS500_Temperature_Out);
SetValueInteger("WS500_Humidity_In", (integer)$WS500_Humidity_In);
SetValueFloat("WS500_Temperature_In", (float)$WS500_Temperature_In);
SetValueFloat("WS500_Windforce", (float)$WS500_Windforce);
SetValueInteger("WS500_Winddirection", (integer)$WS500_Winddirection);
SetValueFloat("WS500_Windfluctuation", (float)$WS500_Windfluctuation);


pg_close($dbconn);
?>