sendCommand vs. postUpdate

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
HiG
Beiträge: 136
Registriert: 16. Jun 2021 13:39
Answers: 0

sendCommand vs. postUpdate

Beitrag von HiG »

MoinZen...

wie funktionieren die beiden denn nun genau. Ich dachte immer...

- postUpdate löst keine Changed-Events aus
- sendCommand schon

Nun habe ich in einer Rule 2 Switches gesetzt. Den einen mit PostUpdate den anderen mit SendCommand

Code: Alles auswählen

rule "testx"
when
  Time cron "0 47 08 ? * MON-SUN"
then
  sTest.sendCommand(ON)
  sTest1.postUpdate(ON)
  logInfo("Test",sTest.state.toString)
  logInfo("Test",sTest1.state.toString)
end
Erzeugt folgende Ausgabe

Code: Alles auswählen

2022-02-10 08:47:22.162 [INFO ] [org.openhab.core.model.script.Test  ] - ON
2022-02-10 08:47:22.166 [INFO ] [org.openhab.core.model.script.Test  ] - OFF
und folgende Logausgabe...

Code: Alles auswählen

2022-02-10 08:47:22.169 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'sTest' received command ON
2022-02-10 08:47:22.173 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'sTest1' changed from OFF to ON
In Rules auswerten kann ich demnach nur SendCommand....oder hab ich da nen Denkfehler?

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: sendCommand vs. postUpdate

Beitrag von peter-pan »

Das ist, soweit ich weiss, nur für gebundene Items interessant (also mit Channel). Bei "sendCommand" wird der entsprechende Kanal über die Änderung informiert, bei "postUpdate" nicht.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: sendCommand vs. postUpdate

Beitrag von udo1toni »

Also mal ganz einfach:

postUpdate enthält das Wort Update. Was uns dazu führt, dass eine Rule mit dem Trigger received update davon ausgelöst wird. changed wird nur dann triggern, wenn sich der Status geändert hat. Das ist potenziell beim Befehl postUpdate der Fall, aber nicht zwingend.
sendCommand enthält das Wort Command. Was uns dazu führt, dass eine Rule mit dem Trigger received command davon ausgelöst wird.
Und jetzt kommt leider sofort ein und. eigentlich ein großes und. also ein UND ;)
UND das normale Verhalten von openHAB ist es, bei einem sendCommand unmittelbar im Anschluss selbsttätig ein postUpdate hinterherzuschieben, wobei das postUpdate dann vom vermuteten Resultat des sendCommand abhängt. Beispiel: MySwitch.sendCommand(ON) -> es wird ein postUpdate(ON) gesendet. 2. Beispiel: MyDimmer.sendCommand(ON) -> es wird ein postUpdate(100) gesendet, denn ein Dimmer Item kennt keinen Status ON (!!!).
Dieses Verhalten kann mit dem Parameter autoupdate="false" unterbunden werden. Der Parameter gehört zum Item, nicht zum Channel (wird regelmäßig falsch gemacht).

Also postUpdate wirkt auf den Status, sendCommand sendet einen Befehl. Da openHAB im Normalzustand übereifrig ist, wird dadurch indirekt auch der Status gesetzt.

Dasss Deine logInfo Befehle für das Item sTest1 den Status OFF ausgeben, obwohl Du doch vorher ein ON gesendet hast, liegt daran, dass openHAB asynchron arbeitet. Die Rule erteilt den Befehl postUpdate und wartet nicht darauf, dass dieser Befehl abgearbeitet wird. stattdessen macht sie sofort mit den nächsten Befehlen weiter.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

klaus1
Beiträge: 95
Registriert: 11. Jan 2022 13:48
Answers: 0

Re: sendCommand vs. postUpdate

Beitrag von klaus1 »

Ich hab bspw. eine http Binding switch variable die ich in einer rule umsetzen möchte.
Klappt nur mit sendCommand(ON).
Bei postUpdate(ON) wird zwar im Event Log alles geschrieben, aber der Switch wird nicht umgesetzt.

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: sendCommand vs. postUpdate

Beitrag von udo1toni »

Und jetzt noch eine Frage daraus machen... ;)

Wie gesagt:
postUpdate() verändert den Status des Items, mehr nicht.
sendCommand() sendet einen Befehl in Richtung der verlinkten Channel, mehr nicht.

Wenn autoupdate auf true gesetzt ist (das ist das default Verhalten), erzeugt openHAB im Anschluss an ein sendCommand() automatisch ein dazu passendes postUpdate().
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Hoggle
Beiträge: 218
Registriert: 16. Dez 2017 10:49
Answers: 0

Re: sendCommand vs. postUpdate

Beitrag von Hoggle »

Ich hab da mal eine kleine Nachfrage:
Ist es richtig, das , wenn ich items habe die nicht an einen Channel gebunden sind, es "reicht" ein postUpdate(ON) zu senden und wenn ich ein Item habe, das zum Beispiel einen Aktor schalten möchte, ich unbedingt sendCommand(ON) schicken muß? Würde ich also z.B. den Status eines Switch mit postUpdate(ON) anschalten, die Lampe, die per Channel aber daran gebunden wurde, würde nicht angeschaltet werden?
Kann man also sagen, das ich immer, wenn ich ungebundene Items verändern möchte immer postUpdate() reicht?
Wann macht dies bei gebundenen Items denn Sinn? - Oder habe ich mal wieder alles falsch verstanden :roll:
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: sendCommand vs. postUpdate

Beitrag von udo1toni »

Siehe mein voriger Post...

postUpdate() setzt nur den Status des Items, sendCommand() sendet nur einen Befehl an das Item.

Daraus ergeben sich verschiedene Events.
sendCommand -> das Event received command wird generiert.
postUpdate -> das Event received update wird generiert.
Sollte sich bei postUpdate der Status des Items geändert haben, wird zusätzlich noch das Event changed generiert.

Beim Event received command wird openHAB als Default daraus ein postUpdate mit dem neuen Status generieren, es sei denn, man schaltet dieses Verhalten über die Metadaten aus (autoupdate=false)

Grundsätzlich wird ein Item nur einen Befehl an verlinkte Channel weiterleiten. (Grundsätzlich => es gibt Ausnahmen).

Also nein, nur weil ein Item nicht verlinkt ist, heißt das nicht, dass ein postUpdate reicht. Vielleicht hast Du ja im Hintergrund eine Rule, die auf ein received command für dieses Item reagiert. Es kommt halt drauf an, was Du erreichen willst, eine Statusänderung, oder einen Befehl ausführen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

FrSeLo
Beiträge: 11
Registriert: 27. Mär 2024 20:42
Answers: 0

Re: sendCommand vs. postUpdate

Beitrag von FrSeLo »

Hallo zusammen,

ich habe auch eine Frage zu dem Thema :)
wie muss das sendCommand aussehen?
ich habe ein HTTP Binding

Code: Alles auswählen

UID: http:url:ETAXMLSolarMin
label: ETA XML Set Solar Min
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://IP:8080/user/var/
  delay: 0
  stateMethod: GET
  refresh: 20
  commandMethod: POST
  contentType: text/xml
  timeout: 3000
  bufferSize: 2048
channels:
  - id: ETASolarSetMin
    channelTypeUID: http:number
    label: ETA Solar Set Min
    description: ""
    configuration:
      mode: READWRITE
      unit: °C
      stateContent: value=input
      commandTransformation: XSLT:eta_numeric.xsl
      stateExtension: 120/10221/0/0/12187
      escapedUrl: false
      commandExtension: 120/10221/0/0/12187
      stateTransformation: XSLT:eta_numeric.xsl
Im Channel gibt es noch das Feld "Status-Inhalt" mit dem ich noch nichts anfangen kann :(

Das ITEM sieht so aus:

Code: Alles auswählen

label: ETA Solar Set Min
type: Number:Temperature
category: temperature
groupNames: []
tags:
  - Measurement
Meine Situation:
Das Item zeigt den Wert (die Temperatur) in der richtigen Dimmension und Maßeiheit soweit alles OK.
Ich möchte das Item mit einem JavaScript bearbeiten.
ich kann den Wert lesen

Code: Alles auswählen

items.getItem('ETA_XML_Set_Solar_Min_ETA_Solar_Set_Min').numericState
alles OK
beim schreiben hänge ich gerade

Code: Alles auswählen

items.getItem('ETA_XML_Set_Solar_Min_ETA_Solar_Set_Min').postUpdate(50)
-> wie oben beschrieben es wird das Item geändert aber nicht an das Thing weiter gemeldet. Beim nächsten Aktualisierungsintervall wird der Wert vom Thing wieder überschrieben.

Wie muss ich das sendCommand notieren?

Code: Alles auswählen

items.getItem('ETA_XML_Set_Solar_Min_ETA_Solar_Set_Min').sendCommand("<value>50</value>"); 
--erfolglos

Code: Alles auswählen

items.getItem('ETA_XML_Set_Solar_Min_ETA_Solar_Set_Min').sendCommand(50); 
--erfolglos


Rest aufruf: http://192.168.188.24:8080/user/var/120/10221/0/0/12187

Code: Alles auswählen

<eta version="1.0">
<value advTextOffset="0" unit="°C" uri="/user/var/120/10221/0/0/12187" strValue="30" scaleFactor="10" decPlaces="0">300</value>
</eta>
Wenn ich zb.über RESTer die URL mit Post aufrufe und in den Body "Value=600" schreibe ist das OK.
wie setze ich das im sendCommand um? oder ist das der falche Weg

Benutzeravatar
udo1toni
Beiträge: 13989
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: sendCommand vs. postUpdate

Beitrag von udo1toni »

Zuallererst: Du definierst im Channel die state-und Commandfelder jeweils identisch. Das ist mit hoher Wahrscheinlichkeit falsch.
Der stateContent erscheint mir unsinnig, der wird allenfalls gebraucht, wenn Du den Status über PUT oder POST holst, das ist aber nicht der Fall.
In der commandExtension musst Du einen passenden Platzhalter definieren.
Was mich etwas irritiert, ist, dass es kein Feld commandContent gibt (ist aber so, hab extra in der Doku nachgeschaut). Vermutlich muss die Channelkonfiguration also eher so aussehen:

Code: Alles auswählen

UID: http:url:ETAXMLSolarMin
label: ETA XML Set Solar Min
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://IP:8080/user/var/
  delay: 0
  stateMethod: GET
  refresh: 20
  commandMethod: POST
  contentType: text/xml
  timeout: 3000
  bufferSize: 2048
channels:
  - id: ETASolarSetMin
    channelTypeUID: http:number
    label: ETA Solar Set Min
    description: ""
    configuration:
      mode: READWRITE
      unit: °C
      stateExtension: 120/10221/0/0/12187
      escapedUrl: false
      commandExtension: 120/10221/0/0/12187/value=%2$s
      stateTransformation: XSLT:eta_numeric.xsl
Ob das so stimmt, kann ich aber nicht testen, ist also ohne Gewähr...

Aus einer Rule heraus sendest Du dann den nackten Zahlenwert, also

Code: Alles auswählen

items.getItem('ETA_XML_Set_Solar_Min_ETA_Solar_Set_Min').sendCommand(50)
Tipp an der Stelle: Tu Dir einen Gefallen und denke Dir bessere (kürzere, nicht redundante) Item Namen aus. Im Item ist von XML nichts zu sehen, hat also nichts im Itemnamen zu suchen. Der Rest ist fast vollständig doppelt....
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

FrSeLo
Beiträge: 11
Registriert: 27. Mär 2024 20:42
Answers: 0

Re: sendCommand vs. postUpdate

Beitrag von FrSeLo »

mit Comanndextension wird der Post falsch zusammen gebaut

2024-04-04 17:10:04.821 [WARN ] [p.internal.http.HttpResponseListener] - Requesting 'http://192.168.188.24:8080/user/var/120 ... 7/value=50' (method='POST', content='org.eclipse.jetty.client.util.StringContentProvider@70e58b57') failed: 400 Bad Request

Antworten