Somfy RTS + CUXD => Homematic (ohne Aktor)

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

tinamausi
Beiträge: 101
Registriert: 07.04.2011, 17:37

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von tinamausi » 25.02.2018, 11:22

Hallo chka

bei mir stürzt er nicht mehr ab, was ich beobachtet habe, wenn zu viele befehle kommen das er 1 Rollo mal nicht ansteuert. 2 Befehle funktionieren Problemlos nur 3 innerhalb von ca.2 Sekunden klappen nicht. Befehle müssen dann erneut ausgeführt werden.
Abstürzte passieren wahrscheinlich nur mit nanoculs (Selbstbaucul).
Dank comtel2000 sind die Abstürze Geschichte.

Tinamausi
Asustinker S mit RaspiMatic, CUX Version 2.2.0 mit 2 Selbstbau Cul (433/868 MHz), Raspi3 mit Display 7" und ioBroker
70 Kanäle in 36 Geräten und 51 CUxD-Kanäle in 17 CUxD-Geräten

chka
Beiträge: 2483
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 302 Mal
Danksagung erhalten: 116 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von chka » 25.02.2018, 12:24

Ok danke das ist auch ab und an bei mir so!
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

chka
Beiträge: 2483
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 302 Mal
Danksagung erhalten: 116 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von chka » 25.02.2018, 13:49

bei mir funktioniert es leider nicht,
beim ersten mal starten aus dem terminal bekomme ich folgenden Fehler:
syntax error in expression "int(false)"
while executing
"expr int($remote_counter)"
invoked from within
"set remote_counter [expr int($remote_counter)]"
(file "/usr/local/addons/rollo/somfy.tcl" line 103)
Die Line ist bei mir eine andere als im original, ich schalte noch ein Relais an

Code: Alles auswählen

set remote_counter [expr int($remote_counter)]
Der Fehler kommt beim auslesen der variable, danach wird wohl doch noch in die variable ein wert geschrieben: bei mir ist es dann 1211,
starte ich jetzt wieder das script bricht er ab:

Code: Alles auswählen

process: '1211' not finished - sleep for 2 sec.
still busy -> abort
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

tinamausi
Beiträge: 101
Registriert: 07.04.2011, 17:37

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von tinamausi » 25.02.2018, 15:28

Hallo chka

ich habe das Skript ausgetauscht, die Zahl in der variabel sieht gut aus, sie wird dann wieder gelöscht.

Tinamausi
Asustinker S mit RaspiMatic, CUX Version 2.2.0 mit 2 Selbstbau Cul (433/868 MHz), Raspi3 mit Display 7" und ioBroker
70 Kanäle in 36 Geräten und 51 CUxD-Kanäle in 17 CUxD-Geräten

chka
Beiträge: 2483
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 302 Mal
Danksagung erhalten: 116 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von chka » 25.02.2018, 18:02

ich bekomme es nicht hin,

ich habe mir mal ein test Programm gebastelt aus den Änderungen.
Lösche ich den Inhalt der variable kommt der Fehler, danach wird einmal in die variable geschrieben.
Gelöscht wird leider nichts, beim erneuten ausführen;
process: '5039' not finished - sleep for 2 sec.
still busy -> abort

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so

proc rega_read {obj} {
  set cmd "var value = dom.GetObject('$obj').Value();"
  array set values [rega_script $cmd]
  return $values(value)
}

# read previous pid
set somfy_pid [rega_read SOMFY_PID]

if {$somfy_pid != ""} {
  puts "process: '$somfy_pid' not finished - sleep for 2 sec."
  after 2000 { set state done }
  vwait state

  # try again
  set somfy_pid [rega_read SOMFY_PID]
  if {$somfy_pid != ""} {
    puts "still busy -> abort"
    exit 1
  }
}

# update current pid
set somfy_pid [pid]
rega_script dom.GetObject('SOMFY_PID').State('$somfy_pid');

# free pid lock after 2000ms
after 2000 {
 rega_script dom.GetObject('SOMFY_PID').State('');
 set state done
}

incr remote_counter
rega_script dom.GetObject('CUxD.$device_name.SEND_CMD').State('Ys$device_remote_enc$device_cmd_hex$remote_counter_hex$device_remote_id');
rega_script dom.GetObject('$device_sysvar_name').State('$remote_counter');

vwait state
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

comtel2000
Beiträge: 25
Registriert: 21.02.2018, 10:53
Danksagung erhalten: 2 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von comtel2000 » 25.02.2018, 21:43

chka hat geschrieben:ich bekomme es nicht hin,

ich habe mir mal ein test Programm gebastelt aus den Änderungen.
Lösche ich den Inhalt der variable kommt der Fehler, danach wird einmal in die variable geschrieben.
Gelöscht wird leider nichts, beim erneuten ausführen;
process: '5039' not finished - sleep for 2 sec.
still busy -> abort
@chka,
die Systemvariable wird nur automatisch gelöscht, wenn das script ohne fehler bis zum ende durchläuft. Wenn einmal ein Problem aufgetreten ist, muss sie manuell resetet werden (Inhalt löschen)
Ich versuche das Script noch zu optimieren um ggf. auf die zusätzliche Variable zu verzichten.

chka
Beiträge: 2483
Registriert: 13.02.2012, 20:23
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 302 Mal
Danksagung erhalten: 116 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von chka » 25.02.2018, 22:06

Habe es eben noch mal mit deinem original script versucht, es funktioniert.
Habe in der Anpassung bei mir einen Fehler drin.

Was du bitte noch mal einarbeiten solltest, den Abbruch irgendwie zu umgehen. Da müssen mehr versuche möglich sein nicht nur einer nach 2000ms.
Wenn das script nicht nach der pause neu gestartet wird, müsste doch eine variable direkt im code reichen ohne den weg über die systemvariable gehen.

Aber der weg ist gut. :idea: :D
RaspberryMatic - CuL 868mHz- CuxDemon - PioTek Tracker - Velux mit KLF200 und Somfy Anbindung- io.Broker auf Proxmox NUC6I3SYH i3-6100U RAM: 40Gig Crucial 8GB DDR4 CT2K8G4SFS824A + 32GB DDR4CT32G4SFD8266

comtel2000
Beiträge: 25
Registriert: 21.02.2018, 10:53
Danksagung erhalten: 2 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von comtel2000 » 25.02.2018, 22:26

die Anzahl der Versuche kann einfach erhöht werden, bringt aber nicht wirklich Vorteile. Der Verzögerungen stauen sich auf un legen evtl. das ganze System lahm. Bei der Variable kann man auf eine globale tcl env. ausweichen. Problem ist aber dann, dass der Reset auch nur über tcl script erfolgen kann.

btw. ein doppeltes Ausführen sollte immer soweit möglich in der CCU (Programm) verhindert werden.
Bei direkter Gerätesteuerung greift dann zur Not der Lock im script.

Kann das bestätigt werden, dass nur nanoCUL's betroffen sind? Evtl. gibt es eine elegantere Lösung in der CUL firmware?

Sheldor
Beiträge: 9
Registriert: 11.09.2017, 22:32

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von Sheldor » 26.02.2018, 22:13

Hallo,

ich komme leider nicht weiter. Vielleicht kann mir ein weiter helfen.
Wie beschrieben habe ich eine neue Systemvariable namens "SOMFY_PID" angelegt und das Script durch den neuen ausgetauscht. Doch leider funktioniert nichts. Wenn ich den Script wieder durch den alten austausche läuft alles.

mein aktueller funktionierender Skript:

Code: Alles auswählen

#!/bin/tclsh
#tclsh /usr/local/addons/rollo/somfy.tcl CUX2801004:1 WohnGrF STOP A0 AA0001
#tclsh /usr/local/addons/rollo/somfy.tcl CUX4000001:1 WohnGrF $VALUE$ A0 AA0001
load tclrega.so

#set device_name "CUX4000001"

set device_name [lindex $argv 0]
set device_sysvar_name [lindex $argv 1]
set device_cmd [lindex $argv 2]
set device_remote_enc [lindex $argv 3]
set device_remote_id [lindex $argv 4]

# command-line for reading rolling counter sysvar
set cmd "var remote_counter = dom.GetObject(\"$device_sysvar_name\").Value();"
# read sysvar
array set values [rega_script  $cmd  ]

set remote_counter $values(remote_counter)
# convert to integer
set remote_counter [ expr int($remote_counter)]
#puts $remote_counter   
# convert to HEX
set remote_counter_hex [ format %04X $remote_counter ]
#puts $remote_counter_hex

switch $device_cmd {
   "OPEN" { set device_cmd_hex "20" }
   "1000" { set device_cmd_hex "20" }
   "CLOSE" { set device_cmd_hex "40" }
   "0" { set device_cmd_hex "40" }
   "PROG" { set device_cmd_hex "80" }
   "MY" { set device_cmd_hex "10" }
   "500" { set device_cmd_hex "10" }
   "STOP" { set device_cmd_hex "11" }
   default { puts "WRONG SOMFY COMMAND" }
}
set somfy_cmd "\"Ys$device_remote_enc$device_cmd_hex$remote_counter_hex$device_remote_id\""
puts $somfy_cmd
set cmd "dom.GetObject(\"CUxD.$device_name.SEND_CMD\").State($somfy_cmd);"
puts $cmd

#array set values [ rega_script  $cmd  ]

rega_script  $cmd

#rega_script { dom.GetObject("CUxD.CUX4000001:1.SEND_CMD").State("YsA0200018ABCDEF");}

set remote_counter [ expr $remote_counter + 1 ]
puts $remote_counter

set cmd ""
append cmd "var i = dom.GetObject('$device_sysvar_name');"
append cmd "i.State('$remote_counter');"

array set values [rega_script  $cmd  ]


und hier der neu eingefügte Skript der nicht funktioniert

Code: Alles auswählen

#!/bin/tclsh
load tclrega.so

proc rega_read {obj} {
  set cmd "var value = dom.GetObject('$obj').Value();"
  array set values [rega_script $cmd]
  return $values(value)
}

# read previous pid
set somfy_pid [rega_read SOMFY_PID]

if {$somfy_pid != ""} {
  puts "process: '$somfy_pid' not finished - sleep for 2 sec."
  after 2000 { set state done }
  vwait state

  # try again
  set somfy_pid [rega_read SOMFY_PID]
  if {$somfy_pid != ""} {
    puts "still busy -> abort"
    exit 1
  }
}

# update current pid
set somfy_pid [pid]
rega_script dom.GetObject('SOMFY_PID').State('$somfy_pid');

# free pid lock after 2000ms
after 2000 {
 rega_script dom.GetObject('SOMFY_PID').State('');
 set state done
}

# get args
set device_name [lindex $argv 0]
set device_sysvar_name [lindex $argv 1]
set device_cmd [lindex $argv 2]
set device_remote_enc [lindex $argv 3]
set device_remote_id [lindex $argv 4]

# get rolling counter
set remote_counter [rega_read $device_sysvar_name]

# convert to hex
set remote_counter [expr int($remote_counter)]
set remote_counter_hex [format %04X $remote_counter]

switch $device_cmd {
   "OPEN" { set device_cmd_hex "20" }
   "1000" { set device_cmd_hex "20" }
   "CLOSE" { set device_cmd_hex "40" }
   "0" { set device_cmd_hex "40" }
   "PROG" { set device_cmd_hex "80" }
   "MY" { set device_cmd_hex "10" }
   "500" { set device_cmd_hex "10" }
   "STOP" { set device_cmd_hex "11" }
   default { 
     puts "unknown command: $device_cmd"
     exit 1
   }
}

incr remote_counter
rega_script dom.GetObject('CUxD.$device_name.SEND_CMD').State('Ys$device_remote_enc$device_cmd_hex$remote_counter_hex$device_remote_id');
rega_script dom.GetObject('$device_sysvar_name').State('$remote_counter');

vwait state


wäre nett wenn mir jemand helfen würde.



Gruß

comtel2000
Beiträge: 25
Registriert: 21.02.2018, 10:53
Danksagung erhalten: 2 Mal

Re: Somfy RTS + CUXD => Homematic (ohne Aktor)

Beitrag von comtel2000 » 27.02.2018, 00:29

Hallo,
nach dem Anlegen von SOMFY_PID ist der Inhalt: ??? und muss erst einmalig manuell gelöscht werden. Danach sollte das Script ohne Probleme laufen.

Antworten

Zurück zu „CUxD“