PartyModus im FTUI starten

Begonnen von n4rrOx, 23 April 2016, 20:50:20

Vorheriges Thema - Nächstes Thema

n4rrOx

Hi zusammen,

ich bin gerade auf der Suche, wie ich folgende Funktion sinnvoll im FTUI setzen kann:
https://forum.fhem.de/index.php?topic=28163.0

Mit dem Select Widget habe ich mir bereits einen "Timer" für Leuchten gebastelt, mit denen ich die Leuchte und die Leuchtdauer (on-for-timer) variabel setzen kann.

Leider komme ich nicht darauf, wie ich mit den Select Widgets einen Funktionsaufruf für die Heizung generieren und mit einem Link Widget wegschicken kann?

Aufruf der Funktion mit:

{aufheizen("Device","Temperatur","Stunden")}


Folgendes sollte in den Select Widgets gewählt werden können:
Device (z. B. Bad_Heizung, ...)
Temperatur (z. B. 20, 21, 22, ...)
Stunden (1h, 2h, 3h, ...)

Hat jemand einen Tipp, wie sowas funktionieren könnte?

setstate

#1
Könnte so etwas helfen? Mehrere Selects zur Auswahl, aber erst beim Klick auf OK wird das zusammengesetzte Command weggesendet

https://forum.fhem.de/index.php/topic,49248.msg409287.html#msg409287


<li data-row="1" data-col="4" data-sizex="2" data-sizey="2">
    <header>SELECT</header>
    <div data-type="select" data-items='["dummy1","dummy2","dummy3","dummy4"]' id="sendDev" class="notransmit w3x"></div>
    <div data-type="select" data-items='["param1","param2","param3","param4"]' id="sendParam" class="notransmit w3x"></div>
    <div data-type="input" id="sendValue" data-value="127" class="notransmit w3x centered"></div>
    <div data-type="link" class="round centered"
         data-width="80" data-height="40"
         data-color="white"
         data-background-color="green"
         data-icon="fa-feed"
         data-device="#sendDev"
         data-set="#sendParam"
         data-value="#sendValue">
        OK
    </div>
</li>


Zur Erklärung:
- Das Select-Widget sendet mit class="notransmit" keine Daten an FHEM nach der Auswahl
- Im Link-Widget sind die data-device, data-set und data-value keine Festwerte, sondern Referenzen auf andere HTML-Elemente im Document mit dessen ID (oder anderer CSS-Selector http://www.w3schools.com/cssref/css_selectors.asp), also wenn man schreibt data-device="#sendDev", bedeutet das: nimm als device den value vom Element mit der id="sendDev"

n4rrOx

Hallo setstate,

genau damit habe ich die "on-for-timer" Auswahl aufgebaut.
Dabei wird folgendes gesendet:
set <sendDev> <sendParam> <sendValue>

Wie bekomme ich das aber so geändert, dass ich einen zusammengesetzen data-cmd mit den 3 Variablen absetzen kann?

Das ist ja der Aufruf:
{aufheizen("Device","Temperatur","Stunden")}

setstate

ohh, das geht nicht mit den aktuellen Widgets. Man kann kein Command mit beliebigen Platzhaltern definieren/zusammenbauen

n4rrOx

Schade :S

Ist es möglich die Daten in ein Dummy zu schreiben, bei Änderung der readings den Aufruf mit den Daten des dummy neu zusammensetzen und aufzurufen?

Bestimmt....nur wie?

setstate

Zitat von: n4rrOx am 23 April 2016, 21:43:00
Schade :S

Ist es möglich die Daten in ein Dummy zu schreiben, bei Änderung der readings den Aufruf mit den Daten des dummy neu zusammensetzen und aufzurufen?

Bestimmt....nur wie?

Genau das wollte ich auch als Antwort schreiben  :D, aber ich habe auch kein Beispiel zum Posten und auch zu wenig Erfahrung damit. Aber im Forum hier gibt es ganz viele Spezialisten, die das sofort sagen können.

fhainz

Hallo!

Eine Idee:
Du legst dir einen Dummy an. Die Select Widgets lässt du auf jeweils ein reading des dummys zeigen. Anschließend brauchst du noch ein notify das durch den dummy triggert und prüft ob schon alle 3 werte vorhanden ist. Wenn ja wird dann die Funktion {aufheizen("Device","Temperatur","Stunden")}  aufgerufen.

Also so umgefähr:

define hzDummy dummy

setreading hzDummy device -
setreading hzDummy temperatur -
setreading hzDummy stunden -

define n.hzDummy notify hzDummy.* { }


Das DEF des notifys könnte so aussehen:

hzDummy.* {
  my $device = ReadingsVal("hzDummy","device","-");
  my $temp = ReadingsVal("hzDummy","temperatur","-");
  my $stunden = ReadingsVal("hzDummy","stunden","-");

  if( $device != "-" && $temp != "-" && $stunden != "-" ) {
    aufheizen($device,$temp,$stunden);
    fhem("setreading hzDummy device -");
    fhem("setreading hzDummy temperatur -");
    fhem("setreading hzDummy stunden -");
  } 
}


Das ganze ist ungetestet.

Grüße

n4rrOx

Hallo fhainz,

Danke für deinen Input! =)

Habe es gestern auch noch hinbekommen, allerdings ein wenig anders gelöst:
Habe (dummerweise :D) 3 dummys für die drei Variablen, da ich den Inhalt der select-Widgets immer nur in "state" oder "STATE" (?) geschrieben habe.
Werde es aber dahingehend ändern und mit setreading die 3 Readings nur eines dummys befüllen, das macht die Sache "kompakter".

Desweiteren habe ich keinen notify gebastelt, sondern rufe das Script nach der Auswahl der Parameter in den Selects (Raum, Temp, Dauer) mit einem Link-Widget auf:

<div data-type="link" onclick="setFhemStatus('{aufheizen()}')"
class="round centered"
data-width="80" data-height="40"
data-color="white"
data-background-color="green"
data-icon="fa-feed">
OK
</div>

Siehe auch angehängtes Bild.

Das Script für das Setzen der Thermostate habe ich ein wenig abgeändert.
Anstatt die Parameter beim Aufruf zu übergeben....
{aufheizen("Device","Temperatur","Stunden")}
habe ich nun immer den gleichen Aufruf im FTUI:
{aufheizen()}

Im Script selbst habe ich die Befüllung der Variable geändert von:
my ($device,$temperatur,$stunden) = @_;
auf:

# aufgerufene Parameter
my $device = ReadingsVal("PartyControl_Device", "state", "");
my $temperatur = ReadingsVal("PartyControl_Temp", "state", "");
my $stunden = ReadingsVal("PartyControl_Dauer", "state", "");

Dies werde ich anhand deines Beispiels noch anpassen auf einen Dummy =)

Beide Lösungsansätze haben Vor- und Nachteile:
Notify mit Zurücksetzen:
+ kein versehentliches Absetzen von Befehlen (da erst alle 3 Selects befüllt werden müssen)
- Anfangsauswahl mit "-" der Select Widgets

Zusätzliches Link-Widget ohne Zurücksetzen:
+ letzte Auswahl der Selects bereits "voreingestellt"
- versehentliches Drücken des Link Widgets setzt Befehl ab (da bereits Auswahl eingestellt)

@setstate
Leider wird beim Aufruf des Link-Widgets bei onclick keine Toast-Nachricht zur Bestätigen angezeigt.
Bekommt man diese irgendwie hin bzw. könntest du diese bei onclick ebenfalls hinzufügen? Ich finde die durchgängige Bestätigung von Eingaben sehr sinnvoll!

n4rrOx

Ähm .... FHEM macht gerade was es will^^

Habe die Selects geändert und einen neuen Dummy erstellt "PartyControl" mit den Readings "Device", "Temp" und "Dauer".
So soll es befüllt werden:

<div class="centered inline">
<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Device" data-set="Device"
data-items='["bad_Thermostat","sz_Thermostat","wz_Thermostat"]'
data-alias='["Bad","Schlafzimmer","Wohnzimmer"]'
class="w3x">
</div><br />
<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Temp" data-set="Temp"
data-items='["6.0","12.0","14.0","16.0","18.0","18.5","19.0","19.5","20.0","20.5","21.0","21.5","22.0","22.5","23.0"]'
data-alias='["6.0 °C","12.0 °C","14.0 °C","16.0 °C","18.0 °C","18.5 °C","19.0 °C","19.5 °C","20.0 °C","20.5 °C","21.0 °C","21.5 °C","22.0 °C","22.5 °C","23.0 °C"]'
class="w3x">
</div><br />
<div data-type="select" data-device="PartyControl" data-cmd="setreading" data-get="Dauer" data-set="Dauer"
data-items='["0.5","1","1.5","2","2.5","3","4","5","6","7","8","9","10","11","12","24","48"]'
data-alias='["0.5 h","1 h","1.5 h","2 h","2.5 h","3 h","4 h","5 h","6 h","7 h","8 h","9 h","10 h","11 h","12 h","24 h","48 h"]'
class="w3x">
</div><br />
<div data-type="link" onclick="setFhemStatus('{aufheizen()}')"
class="round centered"
data-width="80" data-height="40"
data-color="white"
data-background-color="green"
data-icon="fa-feed">
OK
</div>
</div>

Das komische ist, dass die Thermostate richtig in die Readings eingestellt werden, bei der Temp und Dauer klappt es nicht oO
In den Selects habe ich nur den ersten Wert von data-items zur Auswahl....
Nach dem Auswählen wird folgendes in den Dummy geschrieben:
Device:bad_Thermostat,sz_Thermostat,wz_Thermostat
Siehe dazu auch das angehängte Screenshot.

Wo ist der Fehler??? Ich finde keinen ....zumal es ja auch mit den Devices auch funktioniert???

setstate

#9
Wenn du eine Toastmessage haben willst, muss man diese einfach hinten mit dranhängen

v1.*
onclick="setFhemStatus('{aufheizen()}'); $.toast('Huhu ...');"

v 2.2
onclick="ftui.setFhemStatus('{aufheizen()}'); ftui.toast('Huhu ...');"

Besser ist es aber immer die vorhandenen Parameter zu benutzen, anstatt interne Funktionen direkt aufzurufen.

data-fhem-cmd=" ..."

Bei data-fhem-cmd ist die Toast-Message schon mit dabei.

Weil es durchaus sein kann, wie du oben siehst, dass interne Funktionen nach einem Update anders heißen, dann funktionieren deine Aufrufe nicht mehr.

n4rrOx

@setstate
Habe auf data-fhem-cmd umgestellt ;-)
Habe es im Wiki nicht gefunden, deshalb habe ich das onclick gewählt... Das mit den Toasts funktioniert nun =))

Leider verstehe ich aber immer noch nicht wo der Fehler bei der Befüllung des Dummys liegt, da Device (funktioniert) genauso befüllt wird wie Temp und Dauer (funktionieren nicht) ??

n4rrOx

Kann sich jemand das Verhalten beim Befüllen des Dummys drei Posts weiter oben erklären bzw. weiß wo mein Fehler liegt?