Licht an/aus abhängig vom Status eines Sensors

Begonnen von Rohan, 18 Februar 2013, 21:37:16

Vorheriges Thema - Nächstes Thema

Rohan

Hallo zusammen,

ich habe ein Problem, bei dem ich einen Wink mit dem Zaunpfahl benötige...

Ich habe einen HomeMatic-Schaltaktor (genauer gesagt: Dimmer)


define EG.WZ.LEDdimmer CUL_HM 1C062D
...
attr EG.WZ.LEDdimmer model HM-LC-Dim1PWM-CV
...
attr EG.WZ.LEDdimmer subType dimmer
attr EG.WZ.LEDdimmer webCmd toggle:on:off:statusRequest
...


den ich in Abhängigkeit von einem Stromwirkleistungssensor (EM 1000)


define EG.WZ.EM8.TVAudio CUL_EM 8
attr EG.WZ.EM8.TVAudio room EG.WohnZ
...


steuern möchte. Sobald der Stromverbrauch über den "current"-Wert von 0.1 (= der Fernseher ist an) steigt, soll das Licht an- und ansonsten ausgeschaltet werden


# defines zum automatisierten on/off des Dimmers EG.WZ.LEDdimmer
define EG.WZ.LEDdimmer.State dummy
define EG.WZ.LEDdimmer.DimValue dummy
define EG.WZ.LEDdimmer_Notify notify EG.WZ.EM8.TVAudio:current:.* {\
  my $soll=ReadingsVal("EG.WZ.EM8.TVAudio", "current", 0);;\
  if($soll gt 0.1){\
    fhem "set EG.WZ.LEDdimmer 100";;\
  } else {\
    fhem "set EG.WZ.LEDdimmer 0";;\
  }\
}


Das funktioniert auch, aber das Ganze hat einen Haken: Der Strommesser liefert alle 5 Minuten den current-Wert und demzufolge wird dem Dimmer auch alle 5 Minuten der entsprechende Befehl 100 oder 0 gesendet. Das erzeugt unnötigen Funkverkehr und macht die Logs unnötig groß.

Meine Vorstellung/Idee: Ich bräuchte eine (globale) Variable (userReadings?) als Zustandsmerker (das obige "define EG.WZ.LEDdimmer.State dummy"??), die ich vorinitialisiere mit "0" und dann in der obigen if-Anweisung als 2. Bedingung abfrage und dort bei einer vorzunehmenden Änderung natürlich auch mit dem Wert 1 (bzw. erneut 0 ) belege.

Anmerkung:
Das Ganze wird später noch verfeinert / geändert, denn die Licht-Statusänderung erfolgt so erst in einem Zeitraum von 5 Minuten nach Änderung des Stromverbrauchswertes, zudem soll die Helligkeit / der Schaltzustand des Dimmers noch

1. abhängig von der Umgebungshelligkeit und / oder
2. Tageszeit und
3. auch ohne angeschaltetem TV

angesteuert werden. Aber das ist eine ganz andere Geschichte und sollte nicht Gegenstand der Antworten sein.

Danke und Gruß
Thomas

Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

MisterEltako

zum Initialisieren auf "0" musst du in die 99_Utils.pm oder eine andere 99_...Datei einfügen, da diese gleich beim Start geladen werden.

99_Utils.pm:
my $Var=("0");;

dann in Fhem.cfg
define Speicher notify <Device>:.* {\
  readingsBeginUpdate($main::defs{EG.WZ.EM8.TVAudio});;\
  readingsBulkUpdate($main::defs{EG.WZ.EM8.TVAudio}, 'Status_selbst', $Var));;\
  readingsEndUpdate($main::defs{EG.WZ.EM8.TVAudio},1);;\
}

Damit schaffst du einen neuen Readingseintrag im EG.WZ.EM8.TVAudio denn du auch mit:

ReadingsVal(EG.WZ.EM8.TVAudio,"Status_selbst", 0) abfragen kannst.

...defs{EG.WZ.EM8.TVAudio},1);; -> die 1 bedeutet es wird beim Setzen ein Event erzeugt, eine "0" würde keins erzeugen. Bzw. kann man den Wert auch nach obigen Beispiel verändern. Damit spart man sich einen zusätzlichen Dummy.

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

GoinAway

Ich kann das nicht programmieren, aber
ich würde das so ansetzen:

Wert holen,
Wert merken,
Helligheit setzen,
Wert holen,
Wert mit gemerkten vergleichen,
Wenn Wert gleich, dann nix setzen, ansonsten entsprechend setzen.

MisterEltako

Hi!

Ich habe sowas ähnliches mit großer Hilfe aus dem Forum schon Mal hinbekommen.
Versuch es vielleicht so:

define EM8.TV CUL_EM 8
attr EM8.TV room EG.WohnZ


# defines zum automatisierten on/off des Dimmers EG.WZ.LEDdimmer

define EG.WZ.LEDdimmer_Notify notify EM8.TV:current:.* {\
 readingsBeginUpdate($main::defs{EM8.TV});;\
 readingsBulkUpdate($main::defs{EM8.TV}, '1_oldHellWert', ReadingsVal('EM8.TV', '2_newHellWert', ''));;\
 readingsBulkUpdate($main::defs{EM8.TV}, '2_newHellWert', ReadingsVal("EM8.TV", 'current', ''));;\
 readingsEndUpdate($main::defs{EM8.TV},1);;\
 $newHell = ReadingsVal('EM8.TV', '2_newHellWert', 0);;\
 $oldHell = ReadingsVal('EM8.TV', '1_oldHellWert', 0);;\
 if ($newHell != $oldHell) {\
      Log 3, '....mach was...';;\
  } else {\
      Log 3, '....mach nix...';;\
  }\
}


Hierbei müssten in den Readings des EM8.TV-Devices 2 neue Einträge erscheinen in den der aktuell neu gemesse und der zuletzt gemessene Wert "gespeichert" werden.

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

jhohn

Das sollte doch funktionieren wenn Du den Wert des Dimmers abfragen und das dann in deine if-Schleife mit einbaust:

# defines zum automatisierten on/off des Dimmers EG.WZ.LEDdimmer
define EG.WZ.LEDdimmer.State dummy
define EG.WZ.LEDdimmer.DimValue dummy
define EG.WZ.LEDdimmer_Notify notify EG.WZ.EM8.TVAudio:current:.* {\
  my $soll=ReadingsVal("EG.WZ.EM8.TVAudio", "current", 0);;\
  my $dimmer = Value("EG.WZ.LEDdimmer");;\
  if($soll gt 0.1 && $dimmer ne "100"){\
    fhem "set EG.WZ.LEDdimmer 100";;\
  } else {\
    fhem "set EG.WZ.LEDdimmer 0";;\
  }\
}
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Rohan

Herzlichen Dank

an alle Ratgeber / Unterstützer. Ich kann leider erst heute Abend an die Übernahme der hier aufgezeigten verschiedenen Möglichkeiten gehen.

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

Rohan

Hallo zusammen,

soooo.... die erste Rückmeldung ...

Ich habe als erstes den Code von "jhohn" probiert. Diesen musste ich etwas anpassen:


# defines zum automatisierten on/off des Dimmers EG.WZ.LEDdimmer
define EG.WZ.LEDdimmer.MyState dummy
define EG.WZ.LEDdimmer.DimValue dummy
define EG.WZ.LEDdimmer_Notify notify EG.WZ.EM8.TVAudio:current:.* {\
  my $soll = ReadingsVal("EG.WZ.EM8.TVAudio", "current", 0);;\
  my $dimmer = ReadingsVal("EG.WZ.LEDdimmer", "state", 0);;\
  if($soll gt 0.1 && $dimmer ne "set_100"){\
    fhem "set EG.WZ.LEDdimmer 100";;\
    fhem "set EG.WZ.LEDdimmer.MyState on";;\
  } elsif ($soll lt 0.1 && $dimmer ne "set_0"){\
    fhem "set EG.WZ.LEDdimmer 0";;\
    fhem "set EG.WZ.LEDdimmer.MyState off";;\
  }\
}


Hinweis: Die Dummys schleppe ich erst mal weiter mit, denn es sind noch Änderungen vorgesehen.

Ich musste also nicht zusätzlich auf "100" und "0", sondern auf "set_100" und "set_0" prüfen.

Dadurch (incl. der vorgenommenen Änderungen) werden nur noch jeweils genau einmal 1 Einschaltbefehl und 1 Ausschaltbefehl an den Dimmer gesendet (sonst jeweils alle 5 Minuten). Selbst wenn der hier verwendete Dimmer zwischendurch offline geht (Netzteil ohne Strom) - und das ist (auch später) so vorgesehen - gibt es keine weiteren Log-Einträge.

Die anderen Lösungsansätze werde ich in den nächsten Tagen angehen.

Danke!
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

jhohn

ReadingsVal("EG.WZ.LEDdimmer", "state", 0) sollte das Gleiche sein wie Value("EG.WZ.LEDdimmer") ausser das bei einem fehlenden Wert dieser im ersten Fall auf 0 gesetzt wird (so habe ich das jedenfalls verstanden).

Ich habe keine Dimmer und kann das deshalb nicht wirklich beurteilen aber evtl. besteht der Status set_0 nur bis fhem mitbekommt dass der neue Wert an den Dimmer übermittelt wurde und wechselt danach auf 0 oder 0%. Das lässt sich ja einfach ausprobieren.
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Rohan

Hi,

Zitat von: jhohn schrieb am Mi, 20 Februar 2013 08:11ReadingsVal("EG.WZ.LEDdimmer", "state", 0) sollte das Gleiche sein wie Value("EG.WZ.LEDdimmer")

Möglich, aber bei ReadingsVal sehe ich ja, welchen Wert ("state") ich abfrage, bei Value fehlt (mir) diese Angabe. So ist es für mich besser les- und nachvollziehbar (die meisten Geräte haben ja mehrere Readings, woher weiß ich, welches davon ausgelesen wird).

Zitat... aber evtl. besteht der Status set_0 nur bis fhem mitbekommt dass der neue Wert an den Dimmer übermittelt wurde und wechselt danach auf 0 oder 0%.

Der "state" bleibt auch nach mehreren Kommunikationszyklen zwischen FHEM/HMLAN und dem Dimmer auf set_X.

ZitatDas lässt sich ja einfach ausprobieren.

Einfach ja, aber da der Dimmer schon in Produktion ist, müsste ich den Fernsehgenuss der Familie öfters stören und da gibt es teilweise Proteste ;) Ein An- / Aus-Testzyklus dauert ja mindestens 10 Minuten (TV aus, nach spätestens 5 Min. geht Dimmer aus, noch 5 Minuten warten, ob der Aus-Befehl wiederholt wird ... ).

Aber der nächste Dimmer kommt bald, denn die Teile / (Einsatz-)Möglichkeiten gefallen nicht nur mir ;) . Dann wird erst mal etwas mehr getestet, vor allem die virtuellen Kanäle, die man direkt mit anderen Aktoren / Sensoren verknüpfen kann.

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

jhohn

Ich zitiere mal die commandref:

To access the device states/attributes, use the following functions:

    Value(<devicename>)
    returns the state of the device (the string you see in paranthesis in the output of the list command).

    OldValue(<devicename>)
    OldTimestamp(<devicename>)
    returns the old value/timestamp of the device.

    ReadingsVal(<devicename>,<reading>,<defaultvalue>)
    Return the reading (the value in the Readings section of "list device")

    AttrVal(<devicename>,<attribute>,<defaultvalue>)
    Return the attribute of the device

    { Value("wz") }
    { OldValue("wz") }
    { time_str2num(OldTimestamp("wz")) }
    { ReadingsVal("wz", "measured-temp", "20")+0 }
    { ReadingsTimestamp("wz", "measured-temp", 0)}
    { AttrVal("wz", "room", "none") }
FHEM auf Synology Diskstation DS413j (DSM4.3), HM LAN Adapter
Steuerung für Nachtspeicheröfen:
Ladung:   HM-WDS10-TH-O, HM-LC-Sw4-DR, Weather-Modul
Gebläse: HM-CC-TC, HM-LC-SW1-FM, HM-Sec-RHS
FHEM auf FritzBox 7390 für Telefon Funktionen

Rohan

So...

ich habe mich für folgende Lösung entschieden:


define TVisOn dummy
set TVisOn off
define EG.WZ.TV_LED_Trafo_Notify_OnOff notify EG.WZ.IRcontrol1:EG.WZ.IRcontrol1_Btn01.* {\
  if ("%" =~ "Short" && ReadingsVal("TVisOn", "state", 0) ne "on" ){\
    fhem "set EG.WZ.TV_LED_Trafo on";;\
    fhem "set TVisOn on";;\
    Log 3, 'TV ist eingeschaltet worden';;\
  } else {\
    fhem "set EG.WZ.TV_LED_Trafo off";;\
    fhem "set TVisOn off";;\
    Log 3, 'TV ist ausgeschaltet worden';;\
  }\
}


Geholfen hat mir dabei dieses Posting. Danke auch dir, Rudolf.

Im FHEM-Wiki ist die Lösung mit Value statt ReadingsVal als erstes erwähnt bzw. eingearbeitet worden ;)

Ist zwar etwas abweichend von meiner Ursprungsfrage, aber ähnlich anwendbar.

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor