SET-Befehl als Trigger für notify oder DOIF möglich?

Begonnen von heikoh81, 25 Dezember 2015, 12:56:46

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

zunächst wünsche ich allen Frohe Weihnachten.
Ich poste hier, weil mein Problem zwar durch Homematic verursacht wird, ich es aber mit einer programmierten eigenen Funktion lösen möchte.
Es ist aus meiner Sicht also eher ein Programmierproblem als ein Homematic-Problem.

Mein Problem:

  • Von meinen 16 Rolladen-Aktoren HM-LC-Bl1PBU-FM gehen manche manchmal, aber nicht immer auf MISSING ACK.
  • Sende ich den Befehl aber einfach aus dem WEBIF nochmal, reagiert der Aktor sofort, und MISSING ACK ist auch wieder weg.
(2. HMLAN möchte ich vermeiden, weil meistens funktioniert es ja mit einem.)

Ich möchte nun also ein Notify, das bei Absetzen des Befehls SET RolladenX 100 nach einiger Zeit prüft, ob der Aktor tatsächlich diesen State an.
Wenn nein, soll derselbe Befehl nochmal gesendet werden.
Es müsste sowohl den Namen des Aktors als auch den SET-Prozent-Wert variable verarbeiten können, weil diese Werte ja beliebig sein können.

Ich habe keine Idee, wie ich den SET-Befehl als Trigger für ein notify verwenden kann.
Oder geht das gar nicht?
Kein Problem wäre es für mich, dann das zeitverzögerte define und die Abfrage des Zustands drum herum zu programmieren.

Viele Grüße,
Heiko

jensb

Hallo Heiko,

es könnte funktionieren, wenn du statt eines notify (je nach Programmieraufwand ggf. 16) DOIFs verwendest mit dem Zustand "MISSING ACK" als Schaltbedingung. Über das DOIF Attribut "repeatcmd" bekommst du bei Bedarf auch eine automatische Wiederholung.

Grüße,
Jens
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

heikoh81

#2
Ok, das wäre eine Idee, und DOIF bringt die Zeitverzögerung von Haus aus als Option mit.

Aber woher weiß das DOIF das CMD aus repeatcmd?
So wie ich die commandref löse, kann man damit nur einen Befehl wiederholen, der explizit angegeben wurde.
Könnte mir jemand hierfür ein Beispiel geben?

Notlösung wäre, den SET-Wert in einen Dummy je Aktor zu schreiben und ihn dann dort vom DOIF als Befehl abgreifen zu lassen.

jensb

ZitatAber woher weiß das DOIF das CMD aus repeatcmd?
Das Attribut kann mehrere Werte aufnehmen, mit ":" getrennt. Die Zuordnung erfolgt nach der Kommando-Reihenfolge im DOIF (siehe dazu auch deutsche Version der Commandref).

Grüße,
Jens

FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

Ellert

Zitat von: heikoh81 am 25 Dezember 2015, 14:07:55
Ok, das wäre eine Idee, und DOIF bringt die Zeitverzögerung von Haus aus als Option mit.

Aber woher weiß das DOIF das CMD aus repeatcmd?
So wie ich die commandref löse, kann man damit nur einen Befehl wiederholen, der explizit angegeben wurde.
Könnte mir jemand hierfür ein Beispiel geben?

Notlösung wäre, den SET-Wert in einen Dummy je Aktor zu schreiben und ihn dann dort vom DOIF als Befehl abgreifen zu lassen.

Ist es nicht so, dass der Aktor ein Reading hat, dass bei MISSING ACK einen Wert "set_xx" hat?
Dann geht das etwa so:
DOIF ([Aktor:<Reading mit MISSING ACK>] eq "MISSING ACK") (set Aktor [Aktor:<Reading mit set_xx>:d])

heikoh81

@Ellert:
Genau das DOIF-Beispiel wäre, was ich suche.
Sendet man einen Befehl an ein Homematic-Device, steht im STATE "SET_100".
Sonst steht halt bei STATE "MISSING ACK".
Mir ist nicht bekannt, ob der ursprüngliche Befehl irgendwo gespeichert wird.
Der Befehl kommt ja nicht beim Device an - folglich kann er dort eigentlich nirgends stehen.

Ellert

Ich habe keinen HM-Rolladen-Aktor ich habe die Readings mal geraten. Ich habe HM-Heizkörperventile, da steht set_xx in einem Temperatur-Reading und das MISSING_ACK  wohl auch im STATE.

Hast Du das Attribut expert mal auf Maximum gestellt und mit getCnfig mal versucht mehr Readings anzuzeigen?
Vielleicht kanst Du mit "regSet intKeyVisib visib" noch was sichtbarmachen.
Oder Du versuchst mit OldValue("Aktor") "set_xx" auszulesen.


Ellert

Nachtrag: DOIF ([Aktor] eq "MISSING ACK") (set Aktor {(OldValue("Aktor"))})

heikoh81

#8
@Ellert:
Super, das probiere ich jetzt mal testweise aus. Ich berichte dann.
Vielen Dank.

Update:
Das DOIF würde funktionieren, aber:
{(OldValue("Aktor"))} liefert leider nicht den Wert set_on, sondern nur "ResndFail".
So bekomme ich den Befehl also leider nicht isoliert.

Ellert

Zitat von: Ellert am 25 Dezember 2015, 19:43:38
Nachtrag: DOIF ([Aktor] eq "MISSING ACK") (set Aktor {(OldValue("Aktor"))})

Du musst nur noch das "set_" weg filtern http://perldoc.perl.org/functions/substr.html
{(substr(OldValue("Aktor"),4))}

heikoh81

Ja, schon, das wäre kein Problem.
Aber in OldValue steht zum Zeitpunkt, wo DOIF getriggert wird, leider nicht mehr der Befehl, sondern schon "ResndFail".
Deshalb bekomme ich den Befehl ja erst gar nicht ausgelesen, zumindest nicht mit OldValue...

Oder doch irgendwie?

frank

eventuell hilft es schon, die rolläden nicht gleichzeitig zu schalten.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Ellert

Zitat von: heikoh81 am 26 Dezember 2015, 12:21:05
Ja, schon, das wäre kein Problem.
Aber in OldValue steht zum Zeitpunkt, wo DOIF getriggert wird, leider nicht mehr der Befehl, sondern schon "ResndFail".
Deshalb bekomme ich den Befehl ja erst gar nicht ausgelesen, zumindest nicht mit OldValue...

Oder doch irgendwie?
Dann Trigger doch auf "ResndFail", bzw. den ersten Fehlerstatus nach "set_xxx" und nimm OldValue.

heikoh81

Ok, das ist eine super Idee, ich verwende jetzt mal "ResndFail".
Ich melde mich wieder, kann den Fehler nicht reproduzieren, deshalb kann es dauern.

Die Rolladen werden schon aus Einbruchschutzgründen im Abstand von 30-60 Sekunden angesteuert - das kann also nicht die Ursache sein.
Es läuft eigentlich immer nur ein Rolladen gleichzeitig, genau wie wenn ich diese von Hand kurbeln würde :-)

Was aber ein Fakt ist: der betreffende Aktor steckt direkt über einem anderen, die beiden Rolladen-Schalter waren in 2 direkt benachbarten Unterputzdosen.
Eventuell stört sich da was.
Andererseits hatte ich im Obergeschoss das Problem früher auch schon bei einzeln positionierten Aktoren, was damals der Grund für die Anschaffung eines 2. HMLAN war.
Seither aber nicht mehr...

frank

#14
ZitatDie Rolladen werden schon aus Einbruchschutzgründen im Abstand von 30-60 Sekunden angesteuert - das kann also nicht die Ursache sein.
Es läuft eigentlich immer nur ein Rolladen gleichzeitig, genau wie wenn ich diese von Hand kurbeln würde :-)
perfekt.

ZitatWas aber ein Fakt ist: der betreffende Aktor steckt direkt über einem anderen, die beiden Rolladen-Schalter waren in 2 direkt benachbarten Unterputzdosen.
Eventuell stört sich da was.
das ist sicher das problem. falls noch nicht probiert, könnte ein grösseres attr msgRepeat bei diesen devices helfen.

oder die antenne vom hmlan befreien, um noch besseren funk zu bekommen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html