HomeMatic CCU2 bei ELV bestellen

Somfy RTS + CUXD => Homematic (ohne Aktor)

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

Werbung


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

Beitragvon tinamausi » 25.02.2018, 12: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
Raspi3 mit RaspiMatic, CUX Version 1.12 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
tinamausi
 
Beiträge: 99
Registriert: 07.04.2011, 17:37

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

Beitragvon chka » 25.02.2018, 13:24

Ok danke das ist auch ab und an bei mir so!
CCU2 - Watchdog Watchdog2- CuL V2 868mHz- CuxDemon - PioTek Tracker - Veluxe und Somfy Anbinung- io.Broker aufm ESX 6.5
chka
 
Beiträge: 1255
Registriert: 13.02.2012, 21:23

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

Beitragvon chka » 25.02.2018, 14: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
CCU2 - Watchdog Watchdog2- CuL V2 868mHz- CuxDemon - PioTek Tracker - Veluxe und Somfy Anbinung- io.Broker aufm ESX 6.5
chka
 
Beiträge: 1255
Registriert: 13.02.2012, 21:23

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

Beitragvon tinamausi » 25.02.2018, 16:28

Hallo chka

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

Tinamausi
Raspi3 mit RaspiMatic, CUX Version 1.12 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
tinamausi
 
Beiträge: 99
Registriert: 07.04.2011, 17:37

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

Beitragvon chka » 25.02.2018, 19: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
CCU2 - Watchdog Watchdog2- CuL V2 868mHz- CuxDemon - PioTek Tracker - Veluxe und Somfy Anbinung- io.Broker aufm ESX 6.5
chka
 
Beiträge: 1255
Registriert: 13.02.2012, 21:23

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

Beitragvon comtel2000 » 25.02.2018, 22: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.
comtel2000
 
Beiträge: 7
Registriert: 21.02.2018, 11:53

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

Beitragvon chka » 25.02.2018, 23: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
CCU2 - Watchdog Watchdog2- CuL V2 868mHz- CuxDemon - PioTek Tracker - Veluxe und Somfy Anbinung- io.Broker aufm ESX 6.5
chka
 
Beiträge: 1255
Registriert: 13.02.2012, 21:23

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

Beitragvon comtel2000 » 25.02.2018, 23: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?
comtel2000
 
Beiträge: 7
Registriert: 21.02.2018, 11:53

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

Beitragvon Sheldor » 26.02.2018, 23: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ß
Sheldor
 
Beiträge: 9
Registriert: 11.09.2017, 22:32

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

Beitragvon comtel2000 » 27.02.2018, 01: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.
comtel2000
 
Beiträge: 7
Registriert: 21.02.2018, 11:53

VorherigeNächste

Zurück zu CUxD

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste







© homematic-forum.de & Lizenzgebern. Alle Rechte vorbehalten. Alle Bilder & Texte auf dieser Seite sind Eigentum
der jeweiligen Besitzer und dürfen ohne deren Einwilligung weder kopiert noch sonstwie weiter verwendet werden.