Fhem Zustand in PHP Variable speichern

Begonnen von nightstorm99, 19 April 2016, 21:17:27

Vorheriges Thema - Nächstes Thema

nightstorm99

Hallo,

hat jemand eine Lösung, wie ich mit dem Tablet-UI eine FHEM Status auslese und dieses dann in eine PHP Variable bekomme.
Brauche dieses um bestimmte Teile des Designs ein und auszublenden.

Danke
Gruß Denny

setstate

Wie und wann rufst du die PHP Seite auf? Nachdem FTUI komplett geladen ist?
Ich würde dem PHP Aufruf einen Parameter mitgeben meineSeite.php?Wert=acht&Dings=aus und dann auf PHP Seite benutzen <?php
echo $_GET['Wert'];


Im FTUI Client kannst du mit JS alle Werte von FHEM so bekommen

var myWert = ftui.deviceStates['dummy1'].STATE.val

Man kann aber auch auf der ClientSeite mit JS bzw. jQuery Teile ausblenden mit $('#myPart').hide();

nightstorm99

Zitat von: setstate am 19 April 2016, 22:05:16
Wie und wann rufst du die PHP Seite auf? Nachdem FTUI komplett geladen ist?
Ich würde dem PHP Aufruf einen Parameter mitgeben meineSeite.php?Wert=acht&Dings=aus und dann auf PHP Seite benutzen <?php
echo $_GET['Wert'];


Im FTUI Client kannst du mit JS alle Werte von FHEM so bekommen

var myWert = ftui.deviceStates['dummy1'].STATE.val

Man kann aber auch auf der ClientSeite mit JS bzw. jQuery Teile ausblenden mit $('#myPart').hide();

Hallo,

und danke.
Muss ich schauen ob ich das so gebrauchen kann.

Gruß
Denny

nightstorm99

Hallo setstate,

also wenn ich folgendes in meinem Code einbaue:
Zitatvar myWert = ftui.deviceStates['Unwetterzentrale'].WarnCount.val;
(Also ich möchte vom UWZ Modul das WarnCount Reading)

bekomme ich in der Console immer folgenden Fehler:
wetter_warnung.php:483 Uncaught TypeError: Cannot read property 'Unwetterzentrale' of undefined(anonymous function) @ wetter_warnung.php:483

Mache ich da was falsch???
Bin noch bei Version 1.0 von FTUI !!!

Danke und Gruß
Denny

setstate

version 1.* dann so

var myWert = deviceStates['Unwetterzentrale'].WarnCount.val;

nightstorm99

Guten Morgen setstate,

jetzt findet er zwar das Device, aber meckert über das Reading???
wetter_warnung.php:444 Uncaught TypeError: Cannot read property 'STATE' of undefined
wetter_warnung.php:444 Uncaught TypeError: Cannot read property 'WarnCount' of undefined
Wenn ich es auf "STATE" ändere meckert er auch.
Was könnte da noch falsch sein???


Danke und Gruß
Denny

setstate

Jetzt wird es schwierig von der Ferne ...
Erste Vermutung: Zeit Dimension
Wann und wo fragst du das Reading ab? Ist es zum Abfragezeitpunkt schon gefüllt? Wenn du die Abfrage beim Programmstart eingebaut hast, ist es unwahrscheinlich, dass dann die Abfrage vom Server schon wieder zurück ist und das Objekt gefüllt hat. Wenn du aber das per Button auslösen kannst und etwas wartest, müsste es klappen.
An welcher Stelle ist deine Abfrage eingebaut. Gib mal ein paar Codeausschnitte mit Zeilennummern und Filename.

Man kann auch mit console.log(deviceStates); das ganze Objekt ausgeben lassen und dann den ganzen Baum durchforsten. Dann sieht man, was da ist und was nicht.

nightstorm99

So hier mal meine PHP Datei:
<!DOCTYPE html>
<html lang="de">

<?php require_once ("head.php"); ?>
<body>

<div class="gridster">
<ul>
<style>
#room_wetter_warnung #bg {
color: rgb(170,105,0) !important;
border: 3px
}
</style>

<?php require_once ("layout.php"); ?>
<!--============================================================================================================================================================================== -->
<li data-row="2" data-col="2" data-sizex="3" data-sizey="3">
<header style="font-size: 150%;">Wetterwanung Deutschland</header>
<table align="center">
<tr>
<td>
<div data-type="image" data-url="http://www.unwetterzentrale.de/images/map/deutschland_index.png" data-size="85%"></div>
</td>
</tr>
</table>

</li>
<!--================================================================================================================================================================================ -->
<li data-row="2" data-col="6" data-sizex="3" data-sizey="3">
<header style="font-size: 150%;">Wetterwarnung Brandenburg</header>
<table align="center">
<tr>
<td>
<div data-type="image" data-url="http://www.unwetterzentrale.de/images/map/brandenburg_index.png" data-size="85%"></div>
</td>
</tr>
</table>
</li>
<!--============================================================================================================================================================================== -->

<?php require_once ("wetter_menu.php"); ?>

<!--============================================================================================================================================================================= -->

<li data-row="5" data-col="2" data-sizex="3" data-sizey="2">
<header style="font-size: 150%;">Wetterwarnung 1</header>
<table align="center" width="90%">
<!--<tr>
<td colspan="2">
<div data-type="label"
data-device="Unwetterzentrale"
data-get="Warn_0_LongText"
class="darker medium">
</div>
</td>
</tr>//-->
<script type="text/javascript">
var myWert = deviceStates['Unwetterzentrale'].WarnCount.val;
if(myWert > 0){
document.write('<tr>');
document.write('<td>');
document.write('<div data-type="image" data-device="Unwetterzentrale" data-get="Warn_0_IconURL" data-size="100px"> </div>');
document.write('</td>');
document.write('<td>');
document.write('<div data-type="label" data-device="Unwetterzentrale" data-get="Warn_0_ShortText" class="darker large"></div>');
document.write('</td>');
document.write('</tr>');
document.write('<tr>');
document.write('<td colspan="2">');
document.write('<div data-type="label" data-device="Unwetterzentrale" data-get="Warn_0_LongText" class="darker medium"></div>');
document.write('</td>');
document.write('</tr>');
document.write('</tr>');
}
</script>
</table>

</li>

<!--============================================================================================================================================================================= -->

<li data-row="5" data-col="6" data-sizex="3" data-sizey="2">
<header style="font-size: 150%;">Wetterwarnung 2</header>
<table align="center" width="90%">
<!--<tr>
<td colspan="2">
<div data-type="label"
data-device="Unwetterzentrale"
data-get="Warn_0_LongText"
class="darker medium">
</div>
</td>
</tr>//-->
<tr>
<td>
<script type="text/javascript">
var myWert = ftui.deviceStates['Unwetterzentrale'].Warn_1_IconURL.val;
var wertLen = myWert.length;
if(wertLen > 2){
   document.write('<div data-type="image" data-device="Unwetterzentrale" data-get="Warn_1_IconURL" data-size="100px"> </div>');
   }
</script>
</td>
<td>
<div data-type="label"
data-device="Unwetterzentrale"
data-get="Warn_1_ShortText"
class="darker large">
</div>
</td>
</tr>
<tr>
<td colspan="2">
<div data-type="label"
data-device="Unwetterzentrale"
data-get="Warn_1_LongText"
class="darker medium">
</div>
</td>
</tr>
</table>

</li>
</ul>
</div>
</body>
</html>



Ich muss dazu sagen, mit Javascript habe ich keine Erfahrung.
Aber was jetzt etwas logisch klingt, dass er noch keine Antwort hat, wo ich es auswerte.

Müsste ich die Abfrage des Zustands, dann am Anfang machen und später im Code den Vergleich?


Danke und Gruß
Denny

setstate

Ja definitiv zum falschen Zeitpunkt. Wenn das Dokument im Client fertig gerendert wurde, ist noch keine der FTUI Routinen durchgelaufen. Da gibt es noch keine Daten.

Man könnte den Part  serverseitig komplett ersteinmal unsichtbar machen und dann im Client  auf ein Event lauschen, was kommt, wenn alle Daten aktualisiert wurden. Wenn das Event kommt entscheidet man dann ob die Sektion dann sichtbar werden soll oder nicht. Das ist der Weg auf dem Client. Ab FTUI Version 2.2

        $(document).on("updateDone",function(){
           // so something
        });


Man könnte es aber auch auf Server Seite schon entscheiden. Entweder man fragt per PHP bei Fhem direkt an, oder beim Aufruf der PHP Seite wird vom Client ein Parameter mitgegeben. Das klappt aber bloß bei Unterseiten, nicht bei einer Startseite wie z.B. index.php

Thorsten Pferdekaemper

Hi,
ist es nicht auch so, dass in deviceStates sowieso nur Devices und Readings enthalten sind, die in irgendeinem FTUI-Widget benutzt werden? Das könnte auch ein Problem sein.
Ich würde in so einem Fall das ganze komplett per PHP machen. ...zumindest solange die Abfrage nur einmal beim Seitenaufbau gebraucht wird.
Gruß,
   Thorsten
FUIP

nightstorm99

Zitat von: Thorsten Pferdekaemper am 27 April 2016, 11:49:44
Hi,
ist es nicht auch so, dass in deviceStates sowieso nur Devices und Readings enthalten sind, die in irgendeinem FTUI-Widget benutzt werden? Das könnte auch ein Problem sein.
Ich würde in so einem Fall das ganze komplett per PHP machen. ...zumindest solange die Abfrage nur einmal beim Seitenaufbau gebraucht wird.
Gruß,
   Thorsten

Ja einmal am Start würde reichen, ist ja nur eine Unterseite!

Beim UWZ Modul gibt es ein Icon für das Unwetter, dass zeige ich über ein Image Widget an.
Sind nun keine Warnungen, existiert das Reading aber nicht und auf der Webseite entsteht ein kleines leeres Feld wo "img" drin steht.

Könnte ich dieses auch anders umgehen oder wie müsste ich die Abfrage auf PHP umbauen??

Vielen Dank
Gruß Denny

viegener

Auch für solche Szenarien verwende ich das FTUI-Servermodul:
https://forum.fhem.de/index.php/topic,43110.0.html

Ich weiss, dass das kein php ist, aber um Readings oder andere FHEM-Elemente ins HTML zu bringen ist das relativ einfach.
Ein "if" basierend auf FHEM-Werten steht auf meienr Todo-liste und ich köntne das sicher kurzfristig hinzufügen um Teile auszublenden.

Jetzt schon ist es möglich den Wert ins HTML einzubinden und dann im HTML/JS (oder auch im PHP) abhängig von dem Wert zu reagieren.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

setstate

In der Version 1.x stimmt es, deviceStates hat nur die Devices und Readings der benutzten Widgtes. Ab Version 2 wird alles geholt.


Du könntest dem Image ein
class="autohide" verpassen. Dann wird das Element im Falle von nicht verfügbaren Readings ausgeblendet.


Thorsten Pferdekaemper

Zitat von: nightstorm99 am 27 April 2016, 12:12:20
Könnte ich dieses auch anders umgehen oder wie müsste ich die Abfrage auf PHP umbauen??
Ich habe das zwar noch nicht gemacht, aber ich würde es mit jsonlist2 (siehe Commandref) versuchen. Das liefert einen json-String. In PHP gibt es eine Standard-Funktion, die json in  eine PHP-Datenstruktur wandelt.

Zitat von: setstate am 27 April 2016, 12:19:27
In der Version 1.x stimmt es, deviceStates hat nur die Devices und Readings der benutzten Widgtes. Ab Version 2 wird alles geholt.
Oha, dauert das nicht etwas lange? Ich hätte da bedenken, wenn mein FHEM blockiert bis alle Readings aller Devices geholt wurden.

Gruß,
   Thorsten
FUIP

setstate

Die getjson2 Abfrage ist in 1,5 Sekunden bei mir da, für alles. Finde ich besser als wie in der 1.x Version, wo ich mehrere Anfragen an Fhem pro Reading geben musste, weil es AFIK keinen Abfrage Parameter als Liste (z.B. als JSON) gibt. Man kann nur Räume auswählen oder Devices mit Wildcards angeben.