IPS Daten auf externer Homepage darstellen

Guten Tag an alle,

ich habe da mal eine Frage, wie kann ich einzelne Variablenwerte auf externer Homepage darstellen.
Wozu will ich das? Ich möchte einem sehr eingeschränkten Freundes- und Gleichgesinnten Kreis Kennzahlen meiner Verbräuche zur Verfügung stellen. Homepage mit Login habe ich bereits, wie bekomme ich nun Daten aus IPS dorthin? Bitte um eure Ideen und Vorschläge.

Lg
Paul

Entweder du schiebst diese (z.B. per FTP oder HTTP Request) von IPS an deinen Server, oder dein Server holt diese (z.B. über JSON-RPC) von IPS ab.

paresy

Als Anregung, ich habe das durch ein zweites Webfront gemacht. Dort sind unkritische Daten ( zum Beispiel das Wetter) sogar ohne PW abrufbar

Danke für die raschen Antworten.

Das mit einer zweiten Webfront habe ich mir auch schon überlegt, müsste dann aber ganze Seiten Layouten, finde ich nicht so sexy. Ich will eigentlich nur einzelne Variablenwerte abrufen und in vorhandene Homepage einbauen, wie z.B. derzeitige Solar Vorlauf Temperatur oder Pufferspeicher Temp. also momentane Ist Werte aber halt aktuell. Für meine Homepage verwende ich übrigens Wordpress.
@Paresy könntest du das mit dem Json RPC etwas präzisieren? Bin eigentlich eine „blinde Nuss“ aber schrecke nicht davor zurück ohne Vorkenntnis an eine Sache ranzugehen. So quasi learning by doing.
Vielen Dank im Voraus!

Wenn du nicht unbedingt absolute Livedaten im Internet benötigst, ist es sicherer, dir eine HTML Seite mit dem gewünschten Inhalt über ein IPS Script zu erzeugen und die dann auf deinen Server hoch zu laden. Das könnte das Script ja z.B. alle 5 Minuten machen.

Doku gibt es direkt bei PHP: http://php.net/manual/de/book.ftp.php oder ein wenig hier Suchen bzw. Google bemühen.

paresy

Du kannst über die JSON API direkt auf alle Funktionen von iP-Symcon von extern zugreifen. Wenn Dein Webserver PHP unterstützt, dann ist das ganz einfach. Siehe: http://www.tdressler.net/ipsymcon/jsonapi.html#wrapper

Eisi2003

Servus

Sehr leicht geht das mittels soap.
Allerdings hat paresy mal verlauten lassen das diese Schnittstelle evtl. eingestellt wird.
Braucht angeblich auch mehr Resourcen als dieses RPC dingens. Für eine private Seite aber wohl irrelevant.

Hier auszugsweise der relevante CodeTeil:


<?php

$soap = new SoapClient("http://10.0.0.100:3773/wsdl/IIPSVariableManager");
$result= $soap->ReadVariableBoolean(32015 /*[Heizung\Relaisgruppe\Heizungspumpe]*/);

	
	$p_Heizung = $soap->ReadVariableBoolean(32015 /*[Heizung\Relaisgruppe\Heizungspumpe]*/);
	$p_Solar = $soap->ReadVariableBoolean(49893 /*[Heizung\Relaisgruppe\Solarpumpe]*/);
	$p_Puffer = $soap->ReadVariableBoolean(36885 /*[Heizung\Relaisgruppe\Pufferladepumpe]*/);
	$p_Brauchwasser = $soap->ReadVariableBoolean(49793 /*[Heizung\Relaisgruppe\Brauchwasserladepumpe]*/);
	$v_Solarbypass = $soap->ReadVariableBoolean(18632 /*[Heizung\Relaisgruppe\Ventil_Solarladung]*/);
?>


Suche auch im Forum mal nach soap. Da gibts einige Beispiele.

gruß
bb

Ich habe das Gleiche vor.
So habe ich es gemacht:

include('jsonrpc.inc.php');

$rpc = new JSONRPC("https://username:kennwort@server.domain.net:443/api/");
$buerotemp = $rpc->GetValueFloat(13252);
echo "Buerotemp: ".$buerotemp;

Und schon wird der Wert auf der Webseite angezeigt.

Gruß
Michael

Hab das mal mit Jquery und Ajax Scripten gebaut :

refresh.js anlegen :

var refreshId = setInterval(function()
{
     $('#01').load('infobox.php');
}, 1000);

Die PHP mit der ich meine Werte hole :
( Läuft direkt aufn IPS Webserver also ohne JSON … aber man könnte hier an der Stelle auch eine JSON Abfrage einfügen. )

infobox.php

$Value1 = GetValue(42389  /*[Vitotronic 200 KW2\Mitte\Temperaturen\Aussentemperatur]*/);
echo = $Value1

Das ganze dann in der HTML Datei im Header includen und in einen div Container stecken :

<script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script> 
<script src="jquery/js/refresh.js"></script>

<div id="01"></div>

Auf die Weise musst nicht die komplette Seite neu geladen werden wenn sich ein Wert verändert, sondern es ändern sich nur die Werte innerhalb des div Tags.

@woytkem

Und wo hast du das skript eingefügt?
Ich arbeite mit Wordpress mir ist bis jetzt noch nicht klar wie ich das machen soll.

Lg
Paul

Hi,

Ich habe diesen PHP Code einfach per Hand in meine HTML Seite eingebaut.
Wie gesagt…ich bin noch am ausprobieren aber an sich fuinktioniert es genau so…
Wie man das in Work Wordpress eingibt keine Ahung, aber ich bin sicher auch da gibt es PHP Funktionen

Hier mal ein Beispiel anderer Art:
Wir übermitteln die Temperaturwerte alle 5 Minuten von einem Raspberry an einen Webserver, der diese dann darstellt:

Erstelle einfach folgendes Script auf dem Server (index.php) in einem Verzeichnis oder einer Subdomain.
Rufe von IPS das Script dann zb. alle 5 minuten auf und übergib die Daten in der form:
http://meineseite.de/temp/?id=irgendeineid&temp=1.5555&pass=meinPass

Das Script speichert dann für den Node die Daten ab. hier für den Node iregendeineid = 1.555 grad celsius

Rufst Du das Script direkt auf also:
http://meineseite.de/temp/

liefert er alle daten zum durchklicken

per weitere parameter kannst du die temperaturausgabe noch formatieren.
bsp:
http://meineseite.de/temp/?id=irgendeineID&fontsize=15&font=Arial&background=EBEBEB&color=666666

Bisher nur Celsius ausgabe - kann man aber einfach anpassen.
Leider etwas quick and dirty. funktioniert aber gut.
hier ein live-Beispiel:
http://4-host.de/sc-fridingen/webcam-skihang/

eingebunden dann mit einem IFrame in Wordpress.


<?
 $c_pass = "meinPWD"; // Hier Kennwort setzen für Update

 $client = @$_GET["client"];
 $nodeid = @$_GET["id"];
 $pass   =  @$_GET["pass"];
 $temp   = @$_GET["temp"];
 $text   = intval(@$_GET["text"]); // Nur text ausgabe
 // Save Data to file
 if(!empty($temp) && !empty($nodeid) && ($pass == $c_pass)){
    $fc = Array("TEMP" => $temp, "TIME" => time());
    $fh = fopen("./".$client."_".$nodeid.".dat",w);
    fwrite($fh, serialize($fc));
    fclose($fh);
    echo "Update OK.";
    die; 
 }
?><?php if($text != 1){ ?>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">                
    <meta http-equiv="refresh" content="330" />	
    </head>
    <style type="text/css">
     *, body, div{
     margin: 0px;   
      font-family: Tahoma, Arial, Futura;
    }
    </style>
    
  <body>
<?php } ?><?php
 // Liste zeigen
 if(empty($nodeid)){
  foreach(glob("./*.dat") as $fn){
    $pi = pathinfo($fn);
    echo "Sensoren: <a href=\"?id=".$pi[filename]."\">".$pi[filename]."</a><br>";
  }
  die;
 }

// Ausgabe Temperatur
if(!empty($nodeid)){
  $fn = $nodeid.".dat";
  if(!file_exists($fn))die("ID- File not found!");
  $fh = fopen($fn,r); 
  $temp = unserialize(fread($fh, filesize($fn)));
  
  if($text != 1){
    $l_fs = (isset($_GET["fontsize"]))   ?$_GET["fontsize"]:20;
    $l_f  = (isset($_GET["font"]))   ?$_GET["font"]:"Tahoma, Trebuchet";  
    $l_bg = (isset($_GET["background"])) ?$_GET["background"]:"#FFFFFF";
    $l_fg = (isset($_GET["color"]))      ?$_GET["color"]:"#000000";
  
    echo '<div style="height:100%; width:100%;font-family:'.$l_f.';text-align:center;font-size: '.$l_fs.'px; background-color: '.$l_bg.'; color: '.$l_fg.'">
           '.round($temp["TEMP"],1).'°C <br>
           <small><small>('.date("d.m.Y, H:i",$temp["TIME"]).' Uhr)</small></small>
          </div>';
  } else {
    echo round($temp["TEMP"],1);
  }
} 
  
 
?><?php if($text != 1){ ?>
</body>
</html>
<?php  } ?>

Genau so war mein Hinweis weiter oben gedacht :).

Dein „aktuelles Live-Bild“ ist ein paar Tage alt, bei uns ist es schon dunkel :p.

Ja, hat wohl jemand mal wieder die Sicherung rausgenommen :wink:

Hier nur ein kurzes Update zu meinem Problem. Nein ich habe es noch immer nicht geschafft von meiner Homepage aus direkt Daten von IPS abzugreifen. Nach Hilfeschrei im Wordpress Forum bekam ich sehr nette Hilfestellung durch „Frank“. Das Problem liegt Gottseidank nicht bei mir sondern in den tiefen des Wordpress Programmes. Nun wird versucht den Bug zu fixen. Sowie dies geschafft ist werde ich es nochmals probieren. Gebe dann wieder ein Update.

So, nun habe ich die Lösung des Problems. Aber zu aller erst einen RIESEN Dank an Frank Staude vom Word press Blog, er hat die Lösung erarbeitet.

Nachstenden Code in die functions.php des Word Press Themes (oder besser Childthemes) kopieren, danach hat man einen neuen „Shortcode“ syncom zur verfügung dem muss man nur mehr die ID des Sensors übergeben.
(im Word Press auf Reiter „Design“ gehen. Dann auf Reiter Editor gehen. Dann in der Spalte ganz rechts unter Templates auf die zeile Theme-Funktionen klicken und im php Programm den nachstehenden Code einfügen.
Danach genügt auf der Homepage Seite wo man einen Sensor Wert haben möchte nur mehr nachstehenden Shortcode einfügen - fertig.

Beispiel:

Temperatur von 11553 ist: [syncom param=11553]

Liefert als Ausgabe:

Temperatur von 11553 ist: 46,3 °C

Code:

add_shortcode(‚syncom‘, ‚syncom‘);

function syncom( $atts ) {
extract( shortcode_atts( array(
‚param‘ => ‚‘,
), $atts ) );
$data_string = ‚{„jsonrpc“:„2.0“,„method“:„GetValueFormatted“,„params“:[‘.$param.’],„id“:„1“}’;
$ch = curl_init(‚http://deine IP Adresse:dein Port/api/‘);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, „POST“);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
‚Content-Type: application/json‘,
'Content-Length: ’ . strlen($data_string))
);
curl_setopt($ch, CURLOPT_USERPWD, ‚user id von ip Symcon Fernzugriff:Kennwort‘);

$result = json_decode(curl_exec($ch));   

return $result-&gt;result;

}

Für meine Zwecke reicht das einstweilen. Ich bin leider auch kein Programierer und kann die nachstehenden empfehlungen von Frank Staude leider auch nicht umsetzen. Sollte jemand im Blog dies können wäre ich froh wenn das jemand machen könnte.

[i]Damit das wirklich sauber ist sollte man mindestens

  • als Plugin implementieren
  • die Werte via TransientAPI cachen, damit nicht bei jedem Seitenabruf die API bemüht wird
  • Abprüfen auf Fehler
  • ggf weitere API Methoden implementieren
  • Pfad und Zugangsdaten über eine Optionsseite einpflegen.

Der Code zeigt nur das es geht, ist aber eigentlich noch nicht für Produktivsysteme geeignet.[/i]