Gelöst: Setzen cuxd-Gerät mit curl in raspberry-bash ausführen

Virtualisierte CCU für Raspberry Pi und Clones

Moderator: Co-Administratoren

Antworten
bastel04
Beiträge: 4
Registriert: 10.10.2023, 21:14
System: Alternative CCU (auf Basis OCCU)

Gelöst: Setzen cuxd-Gerät mit curl in raspberry-bash ausführen

Beitrag von bastel04 » 10.10.2023, 21:39

Hallo,

seit einiger Zeit nutze ich bei Shellys die Funktion, ein Zustand eines Gerät in cuxd, z.B. bei Tastendruck, zu ändern:

In Shelly-Webinterface (z.B. "Url to be hit when the button is switched ON"):

Code: Alles auswählen

http://192.168.178.11:8181/cuxd.exe?ret=dom.GetObject('CUxD.CUX4000001:13.SET_STATE').State(1)
Geht wunderbar, wenn cuxd-Gerät (also hier cux4000001 mit Kanal 13) und obige URL zueinander passen.

Das Gleiche möchte ich in der Bash (auf Raspberry-Seite, nicht auf pivCCU-Seite!) machen, mit curl, da ich einige Auswertungen leider über Shell-Skripte (veraltet, aber ich kann kein php...) fahre:

Code: Alles auswählen

curl --request PUT --insecure "http://192.168.178.11:8181/cuxd.exe?ret=dom.GetObject(%27CUxD.CUX2801003:6.SET_STATE%27).State(0)"
oder

Code: Alles auswählen

curl --data-urlencode "ret=dom.GetObject('CUxD.CUX2801003:6.SET_STATE').State(0)" "http://192.168.178.11:8181/cuxd.exe"
Egal, was ich mache (also bei curl reinschreibe, sofern syntaktisch richtig), ich bekomme immer nur zurück:

Code: Alles auswählen

curl: (7) Failed to connect to 192.168.178.11 port 8181: Verbindungsaufbau abgelehnt
Gebe ich im Browser

Code: Alles auswählen

"http://192.168.178.11:8181/cuxd.exe?ret=dom.GetObject('CUxD.CUX2801003:6.SET_STATE).State(0)"
erhalte ich:

Code: Alles auswählen

<xml>
   <exec>/cuxd.exe</exec>
   <sessionId/>
   <httpUserAgent>User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 OPR/99.0.0.0</httpUserAgent>
   <ret>true</ret>
</xml>
Hat jemand eine Idee?
Ich hatte schon das URL-Encoding im Verdacht (z.B. %27 statt '), aber es ändert nichts. Oder emuliert das Shelly-Webinterface noch mehr, was ich nicht nachgebildet hat? Dann könnte die Lösung/Idee evtl. auch zu mühselig sein...
Zuletzt geändert von bastel04 am 19.10.2023, 17:16, insgesamt 2-mal geändert.

Benutzeravatar
Henke
Beiträge: 1526
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: Setzen cuxd-Gerät mit curl in raspberry-bash ausführen

Beitrag von Henke » 11.10.2023, 01:05

PUT ist falsch, das sollte POST sein oder einfach weglassen.

bastel04
Beiträge: 4
Registriert: 10.10.2023, 21:14
System: Alternative CCU (auf Basis OCCU)

Re: Gelöst: Setzen cuxd-Gerät mit curl in raspberry-bash ausführen

Beitrag von bastel04 » 15.10.2023, 12:02

Danke, das bringt aber keine Änderung.

Nach tagelanger Neuinstallation von pivCCU auf Raspberry OS Bookworm (64 Bit), gemäß Anleitung und WLAN-Bridge, konnte ich das Thema als Nebeneffekt lösen:
1. Der Zugriff per curl funktionierte immer auch direkt in einer Shell auf meinem PC, folgender Befehl:

Code: Alles auswählen

Mac:~ Benutzer xyz$ curl -v --data-urlencode "ret=dom.GetObject('CUxD.CUX2801003:6.SET_STATE').State(0)" "http://192.168.178.11:8181/cuxd.exe"
*   Trying 192.168.178.11:8181...
* Connected to 192.168.178.11 (192.168.178.11) port 8181 (#0)
> POST /cuxd.exe HTTP/1.1
> Host: 192.168.178.11:8181
> User-Agent: curl/7.87.0
> Accept: */*
> Content-Length: 71
> Content-Type: application/x-www-form-urlencoded
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, must-revalidate, no-transform, max-age=0
< Content-Type: text/xml; charset=iso-8859-1
< Content-Length: 110
< Date: Sat, 14 Oct 2023 22:58:29 GMT
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< X-Robots-Tag: none
< X-Download-Options: noopen
< X-Permitted-Cross-Domain-Policies: none
< Referrer-Policy: no-referrer
< 
* Connection #0 to host 192.168.178.11 left intact
<xml><exec>/cuxd.exe</exec><sessionId></sessionId><httpUserAgent>User-Agent: curl/7.87.0</httpUserAgent></xml>
D.h., Aufruf von curl funktioniert und gibt auch eine Rückgabe, siehe

Code: Alles auswählen

<xml><exec>/cuxd.exe</exec>....</xml>
Lösung:
  1. Aufruf des Befehls immer URL-encoded, also Hochkomma ' entsprechend durch %27 ersetzen, entweder direkt (im Kommando) oder per Parameter --date-urlencoded
    (Parameter -v kann auch weggelassen werden, liefert nur mehr (Debug-) Ausgabe, sonst Ausgaben per -s unterdrücken)
    Also (mit bereits korrekter IP-Adresse (CCU_IP) bei aktiver WLAN-Bridge br0):
    1. Code: Alles auswählen

      curl -v --data-urlencode "ret=dom.GetObject('CUxD.CUX2801003:6.SET_STATE').State(0)" "http://192.168.253.2:8181/cuxd.exe"
      Oder
    2. curl -v -d "ret=dom.GetObject(%27CUxD.CUX2801003:6.SET_STATE%27).State(0)" "http://192.168.253.2:8181/cuxd.exe"
  2. Korrekte IP-Adresse für CCU bei direktem Zugriff im raspberry (z.B. über Shell Skript)
    Ich verwende WLAN mit der Bridge br0 für pivccu, aufgesetzt gemäß Anleitung https://github.com/alexreinert/piVCCU/b ... up/wlan.md. Damit ist die Adresse 192.168.253.2 (CCU_IP) und nicht 192.168.178.11 (von außen über WLAN), siehe auch die Routing-Tabelle in /etc/network/if-up.d/pivccu
Hinweis für Installation Raspberry OS Bookworm (no desktop environment, 64 Bit):
  1. Anscheinend ist iptables nicht enthalten. Daher die Routing-Tabelle erst aufsetzen, wenn iptables installiert wurde, mit
    sudo systemctl install iptables
    .
  2. Bei mir funktionierte der Zugriff nur über die Einbindung von wpa_supplicant:
    1. in /etc/wpa_supplicant Datei wpa_supplicant.conf erzeugen mit SSID und PSK (und WPA2 (PSK) mit key_mgmt):

      Code: Alles auswählen

      	network={
              ssid="Netzwerkname"
              key_mgmt=WPA-PSK
              psk="meinschluessel"
      	}
      
    2. wpa_supplicant.conf in /etc/network/interfaces einbinden (dann entfällt dort SSID und Schlüssel):

      Code: Alles auswählen

      	  
      		source-directory /etc/network/interfaces.d
      
      		auto lo
      		iface lo inet loopback
      
      		allow-hotplug wlan0
      		#auto wlan0
      		iface wlan0 inet dhcp
      		  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
      		  
      		# Brücke zwischen WLAN und pivCCU3
      		auto br0
      		iface br0 inet static
      		  bridge_ports none
      		  bridge_fd    0
      		  address      192.168.253.1
      		  netmask      255.255.255.0
      
    3. Code: Alles auswählen

      sudo systemctl restart networking
      Dann sollte das Netzwerk ohne Fehler neu starten...
      Achtung: Dies alles am besten mit Monitor und Tastatur direkt am Raspberry, der Remote-Zugriff über ssh läuft dann noch nicht...

Antworten

Zurück zu „piVCCU“