FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dt2510 am 16 Oktober 2019, 11:29:15

Titel: Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 11:29:15
Ich versuche gerade alle für das Raumklima eines Raumes relevanten Informationen in einem dummy zusammenzufassen

- Temperatur (wenn vorhanden von einem Thermostat, welches den Heizkörper regelt - ansonsten anderer Temperatursensor)
- Luftfeuchtigkeit
- bis zu 3 weitere Temperaturwerte (ich habe viele Multisensoren im Einsatz)
- bis zu 4 Fenster (open/closed Status)
- Heizkörperthermostat (Ventilstellung, ... noch nicht ganz klar, was ich alles brauche)

Meine Idee war mittels attr <Dummy> userReadings die Werte aus den einzelnen Sensoren/Aktoren zu übernehmen (ich hab' mal mit Temperatur/Luftfeuchtigkeit angefangen)

attr rooms0rehearsalroom userReadings roomTemperature {ReadingsVal(FGSD002_ID31,"temperature","--")},
roomHumidity {ReadingsVal(PHPAT02_ID32,"humidity","--")}


Leider wird auch bei Änderung der Messwerte kein Reading erzeugt. Ist das generell bei Dummies so ?

Alternativ könnte ich eine structure erstellen mit allen beteiligten Geräten (der Status der structure wäre irrelevant) und dort per userReading die Messwerte übernehmen. Dort muss man allerdings höllisch aufpassen, dass man sich keine Readings der beteiligten Geräte überschreibt (also - wie oben - lieber "roomTemperature" statt "temperature" als userReading).
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: MadMax-FHEM am 16 Oktober 2019, 11:35:51
Wie eigentlich zu lesen sein sollte: userreadings reagiert nur auf Events des EIGENEN Devices...

Was du willst geht mit Notify oder at (und Sub in myUtils)...

Gruß, Joachim
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: Beta-User am 16 Oktober 2019, 11:37:53
Was spricht denn gegen readingsGroup?

(Und was ich schon immer loswerden wollte: Bitte Threads nach [gelöst] nicht schließen, sondern (wie in den angepinnten Beiträgen auch empfohlen) offen lassen...)
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 11:42:26
readingsGroup müsste ich mir mal ansehen ...
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 12:04:53
Ich habe jetzt mal eine readingsGroup definiert

define rooms0rehearsalroom readingsGroup FGSD002_ID31:temperature PHPAT02_ID32:humidity
setuuid rooms0rehearsalroom 5da6e717-f33f-b646-1449-89cc52bd576999a7
attr rooms0rehearsalroom mapping {'FGSD002_ID31.temperature' => 'roomTemperature', 'PHPAT02_ID32.humidity' => 'roomHumidity'}


Wie man sehen kann, werden die Werte auch korrekt angezeigt. Leider habe ich keine Möglichkeit diese mit TABLETUI weiter zu verwenden, da es im Device rooms0rehearsalroom keine Readings roomTemperature bzw. roomHumidity gibt.

Hier mal ein List des Devices
Internals:
   DEF        FGSD002_ID31:temperature PHPAT02_ID32:humidity
   FUUID      5da6e717-f33f-b646-1449-89cc52bd576999a7
   NAME       rooms0rehearsalroom
   NR         356
   NTFY_ORDER 50-rooms0rehearsalroom
   STATE      Initialized
   TYPE       readingsGroup
   mayBeVisible 1
   CONTENT:
     FGSD002_ID31 1
     PHPAT02_ID32 1
   CONTENT2:
   DEVICES:
     ARRAY(0x83d0780)
     ARRAY(0x83d0768)
   Helper:
     DBLOG:
       FGSD002_ID31.temperature:
         logdb:
           TIME       1571220096.64316
           VALUE      <html>21.4 C</html>
       PHPAT02_ID32.humidity:
         logdb:
           TIME       1571220109.2726
           VALUE      <html>57.58 %</html>
   fhem:
     lastDefChange 20
     last_update 1571219968.80518
   helper:
     DEF       
     mapping:
       FGSD002_ID31.temperature roomTemperature
       PHPAT02_ID32.humidity roomHumidity
     positions:
       FGSD002_ID31.temperature 1:1
       PHPAT02_ID32.humidity 2:1
     recalc:
       undef
       ARRAY(0x8363210)
     values:
       formated:
         undef
         ARRAY(0x8efbb88)
       orig:
         undef
         ARRAY(0x8963b30)
       prefixsuffix:
         undef
         ARRAY(0x8e69020)
Attributes:
   mapping    {'FGSD002_ID31.temperature' => 'roomTemperature', 'PHPAT02_ID32.humidity' => 'roomHumidity'}


Habe ich was vergessen oder funktioniert das so nicht ?
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: MadMax-FHEM am 16 Oktober 2019, 12:20:51
Willst du eine Übersicht über bestimmte Dinge "an einem Ort" (in einem Device), dann sollte readingsGroup passen...

...oder willst du andere Namen für Readings?

Dann userreadings ABER halt beim jeweiligen Device...
...für die Übersicht dann halt wieder readingsGroup (mit den "neuen" Namen)...

Oder eben per at oder Notify die Werte so im Dummy (Übersicht oder zu was auch immer) setzen, wie du möchtest...

Gruß, Joachim
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: Beta-User am 16 Oktober 2019, 12:26:10
Was bringt diese ganze "Umpackerei"? Ist das für TabletUI notwendig? (Stand das irgendwo?) readingsGroup ist für FHEMWEB...

Ohne das näher beleuchtet zu haben, glaube ich nicht, dass es für TabletUI nicht eine cleverere Lösung gibt, als "alles" in einen Dummy umzupacken, nur damit in jedem Raum mit dieselben Readingnamen gearbeitet werden kann, zumal es scheinbar dann wieder eine Vielzahl von Varianten zu geben scheint, wie viele/welche Readings vorhanden sind...
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 12:40:54
Notwendig ist es natürlich nicht, aber es erleichtert die Arbeit. Ich kann in TABLETUI mit Includes arbeiten, das heißt ich habe einen HTML-Code der variabel mit Inhalt gefüllt wird. So kann ich die Anzeige einmal Programmieren und für jeden Raum einfach mit der zum Raum gehörigen Variable (z.B. einem Dummy) anzeigen lassen.

hier mal ein Beispiel:
<div class="module">
  <table width="100%" height="50vh" border="0">
    <colgroup><col width="20%"><col width="80%"></colgroup>
    <tr class="dim20">
      <td class="module_icon"><div data-type="include" data-url="symbols/symbol.inc" data-parameter='{"dataIcon":"fs-temperature_humidity","dataColor":"symbol_ok"}'></div></td>
      <td class="paragraph text_right">Raumklima</td>
    </tr>
    <tr>
      <td class="text_center"></div></td>
      <td>
        <table width="100%" height="50vh" border="0">
          <colgroup><col width="75%"><col width="25%"></colgroup>
          <tr style="height:4vh;">
            <td class="text_3 text_center"><div data-type="include" data-url="labels/labelTemperature.inc" data-parameter='{"dataDevice":"dataTemperatureDevice"}'></div></td>
            <td class="module_icon"><div data-type="include" data-url="symbols/symbolTemperature.inc" data-parameter='{"dataDevice":"dataTemperatureDevice"}'></div></td>
          </tr>
          <tr style="height:4vh;">
            <td class="text_3 text_center"><div data-type="include" data-url="labels/labelHumidity.inc" data-parameter='{"dataDevice":"dataHumidityDevice"}'></div></td>
            <td class="module_icon"><div data-type="include" data-url="symbols/symbolHumidity.inc" data-parameter='{"dataDevice":"dataHumidityDevice"}'></div></td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
</div>


Über data-parameter lassen sich zum Beispiel Gerätenamen (hier: dataDevice) übergeben. Da man das ganze auch schachteln kann (ein Include ruft ein anderes auf), kann ich relativ einfach mit einem <div>-Tag einen kompletten Raum darstellen bzw. die Darstellung für alle Räume zentral anpassen ohne jeden einzelnen HTML Code bearbeiten zu müssen.

Auf der HTML Seite des Raumes steht im obigen Beispiel dann nur noch

<div data-type="include" data-url="modules/moduleRoomClimate.inc" data-parameter='{"dataTemperatureDevice":"FGSD002_ID31","dataHumidityDevice":"PHPAT02_ID32"}'></div>

Könnte ich alle benötigten Werte in irgend einer Form zusammenfassen, könnte ich schon in FHEMWEB festlegen, was im jeweiligen Raum angezeigt wird.
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: Beta-User am 16 Oktober 2019, 12:52:24
OK, das ist einigermaßen nachvollziehbar.

Aber wenn du schon vereinzelst, brauchst du letztlich sowieso irgend eine Art Eventhandler. Dann würde ich aber dazu neigen, gleich jeweils separate Devices zu nutzen, (über die sich die Dinge dann z.B. auch unmittelbar schalten lassen), und die eigentliche "Hardware" dann nicht mehr im jeweiligen Hauptraum anzuzeigen. Das wäre dann m.E. mit ReadingsProxy am einfachsten zu realisieren.

Aber irgendwo muß für so eine Lösung halt umgepackt werden, entweder (ganz "hinten") bei TabletUI, oder eben vorgelagert via ReadingsProxy oder notify. Der Aufwand ist vermutlich fast derselbe, egal, wo man es macht. Aber die ganze Umpackerei (in FHEM) bedeutet letztlich, dass alles unübersichtlicher wird, also würde ich mir das daher eher sparen...

(Eventuell kann FUIP da helfen, das sortiert zumindest die Readings eines Raums auch wieder in einen FTUI-Raum, wenn ich es richtig verstanden habe).
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 13:00:05
Zitat von: MadMax-FHEM am 16 Oktober 2019, 12:20:51
Willst du eine Übersicht über bestimmte Dinge "an einem Ort" (in einem Device), dann sollte readingsGroup passen...

...oder willst du andere Namen für Readings?

Dann userreadings ABER halt beim jeweiligen Device...
...für die Übersicht dann halt wieder readingsGroup (mit den "neuen" Namen)...

Oder eben per at oder Notify die Werte so im Dummy (Übersicht oder zu was auch immer) setzen, wie du möchtest...

Gruß, Joachim

Ich könnte also z.B. folgendes notify anlegen
define TemperatureChange notify .*:temperature:.* {SetRoomTemperature("$NAME")}

Im Modul 99_myUtils.pm definiere ich dann eine Prozedur SetRoomTemperature($), die in den betroffenen Dummies den neuen Temperaturwert einstellt.
Ich müsste nur den Namen des Devices, auf dessen Temperaturänderung reagiert wird, im Dummy z.B. als userAttr hinterlegen.
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 13:06:25
Zitat von: Beta-User am 16 Oktober 2019, 12:52:24
OK, das ist einigermaßen nachvollziehbar.

Aber wenn du schon vereinzelst, brauchst du letztlich sowieso irgend eine Art Eventhandler. Dann würde ich aber dazu neigen, gleich jeweils separate Devices zu nutzen, (über die sich die Dinge dann z.B. auch unmittelbar schalten lassen), und die eigentliche "Hardware" dann nicht mehr im jeweiligen Hauptraum anzuzeigen. Das wäre dann m.E. mit ReadingsProxy am einfachsten zu realisieren.

Aber irgendwo muß für so eine Lösung halt umgepackt werden, entweder (ganz "hinten") bei TabletUI, oder eben vorgelagert via ReadingsProxy oder notify. Der Aufwand ist vermutlich fast derselbe, egal, wo man es macht. Aber die ganze Umpackerei (in FHEM) bedeutet letztlich, dass alles unübersichtlicher wird, also würde ich mir das daher eher sparen...

(Eventuell kann FUIP da helfen, das sortiert zumindest die Readings eines Raums auch wieder in einen FTUI-Raum, wenn ich es richtig verstanden habe).

Ich hab mein FHEMWEB schon ziemlich strukturiert, insofern ist es nicht so unübersichtlich. Ich denke die Kombination notify/99_myUtils.pm/Dummy ist für mich am geeignetsten.
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: MadMax-FHEM am 16 Oktober 2019, 13:32:46
Zitat von: dt2510 am 16 Oktober 2019, 13:00:05
Ich könnte also z.B. folgendes notify anlegen
define TemperatureChange notify .*:temperature:.* {SetRoomTemperature("$NAME")}

Im Modul 99_myUtils.pm definiere ich dann eine Prozedur SetRoomTemperature($), die in den betroffenen Dummies den neuen Temperaturwert einstellt.
Ich müsste nur den Namen des Devices, auf dessen Temperaturänderung reagiert wird, im Dummy z.B. als userAttr hinterlegen.

Ja so oder so ähnlich.
Du könntest auch ein Notify für temperature, humidity, ... nehmen.

Dann beim Sub-Aufruf $EVENT (da steht irgendwo der Wert drin / gut den kann man auch in der Sub mit dem Devicenamen abfragen ;)  ) und $NAME übergeben und dann über $EVENT eben rausdröseln, ob es temperature, humidity, ... war und dann entsprechend die Werte im Dummy (oder wo auch immer) setzen...

Aber ich gebe Beta-User recht zu viel "Umpackerei" ist dann irgendwann auch...

Gruß, Joachim
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: Beta-User am 16 Oktober 2019, 13:49:24
Hmmm, ich mach' ja sowas auch hin und wieder, via $NAME und dortigen Angaben den Namen des eigentlichen Zielgeräts ermitteln usw..

Aber ganz ernsthaft: für eine großflächige Anwendung halte ich das nicht für besonders gut, es erzeugt durch die Indirektionen doch erheblich mehr Last als ein Eventhandler, der genau ein Reading "umpackt" (ReadingsProxy).

Vielleicht wäre es an der Stelle eine bessere Idee, das Include so zu gestalten, dass das z.B. aus einem zentralen Dummy pro Raum (bzw. dortigen userAttr) abliest, wo welche Angabe zu finden ist? Also ein Attribut für "temperature", das dann den Namen des Devices und den Readingnamen enthält? usw.... Oder gleich für alles nur einen Dummy, der das für alle Räume beinhaltet?
Titel: Antw:Probleme mit userReadings in einem dummy
Beitrag von: dt2510 am 16 Oktober 2019, 14:00:05
Ich hab' es zum Test folgendermaßen gelöst

notify Definitionen
define temperatureChange notify .*:temperature:.* {SetRoomTemperature("$NAME")}
setuuid temperatureChange 5da6faea-f33f-b646-07ed-7d86da7acc432ee3

define humidityChange notify .*:humidity:.* {SetRoomHumidity("$NAME")}
setuuid humidityChange 5da6ff23-f33f-b646-27d7-31164b43472a3549


dummy Definition
define rooms0rehearsalroom dummy
setuuid rooms0rehearsalroom 5da6ffc7-f33f-b646-eae0-2f4e62af8fd2bc9b
attr rooms0rehearsalroom userattr temperatureDevice humidityDevice
attr rooms0rehearsalroom group Raum
attr rooms0rehearsalroom humidityDevice PHPAT02_ID32
attr rooms0rehearsalroom room Raum_UG_Proberaum
attr rooms0rehearsalroom temperatureDevice FGSD002_ID31


99_myUtil.pm
sub SetRoomTemperature($) {
  my ($myDevice) = @_;
  my $myTemperature = ReadingsVal($myDevice,"temperature","--");
  foreach my $myRoom (devspec2array("TYPE=dummy:FILTER=group=Raum")) {
    if (AttrVal($myRoom,"temperatureDevice","") eq $myDevice) {
      fhem("setreading ".$myRoom." roomTemperature ".$myTemperature);     
    }
  }
}

sub SetRoomHumidity($) {
  my ($myDevice) = @_;
  my $myHumidity = ReadingsVal($myDevice,"humidity","--");
  foreach my $myRoom (devspec2array("TYPE=dummy:FILTER=group=Raum")) {
    if (AttrVal($myRoom,"humidityDevice","") eq $myDevice) {
      fhem("setreading ".$myRoom." roomHumidity ".$myHumidity);     
    }
  }
}


Bisher werden die Readings in meinem Dummy korrekt gesetzt wenn sich etwas verändert. Ich denke das werde ich für jeden meiner Räume so umsetzen.
Es gibt mit Sicherheit eine elegantere und/oder Resourcen schonendere Lösung, aber diese funktioniert und ist für mich nachvollziehbar.