YAWN – Yet Another anWesenheitssimulatioN
Moderator: Co-Administratoren
Re: YAWN – Yet Another anWesenheitssimulatioN
!!! GELÖST !!!
Herzlichen Dank an Alle die mir bei meinem Problem weitergeholfen haben, das erste Skript läuft wieder.
Eigentlich ist es fast peinlich - ich habe auf ein Systemgerät im CUx referenziert, dass es gar nicht gab. Aktuell habe ich nur ein Gerät vom Typ 2800 (Timer). Im Skript wurde aber auf 2800002:x referenziert. Das die Wert-Übergabe an ein nicht vorhandenes Gerät einen Fehler verursacht, ist eigentlich ok. Nur finden muss man es.
Nochmal lieben Dank, eure Kommentaren und Einschätzungen haben mir bei der Fehlersuche geholfen, sonst würde ich da immer noch dran vorbeigucken.
Herzlichen Dank an Alle die mir bei meinem Problem weitergeholfen haben, das erste Skript läuft wieder.
Eigentlich ist es fast peinlich - ich habe auf ein Systemgerät im CUx referenziert, dass es gar nicht gab. Aktuell habe ich nur ein Gerät vom Typ 2800 (Timer). Im Skript wurde aber auf 2800002:x referenziert. Das die Wert-Übergabe an ein nicht vorhandenes Gerät einen Fehler verursacht, ist eigentlich ok. Nur finden muss man es.
Nochmal lieben Dank, eure Kommentaren und Einschätzungen haben mir bei der Fehlersuche geholfen, sonst würde ich da immer noch dran vorbeigucken.
--------------------------------------------
... (auf das Wichtigste gekürzte Signatur)
--------------------------------------------
... (auf das Wichtigste gekürzte Signatur)
--------------------------------------------
- shamen7777
- Beiträge: 79
- Registriert: 01.06.2015, 19:27
- Wohnort: Bergheim, Großraum Köln
Re: YAWN – Yet Another anWesenheitssimulatioN
Hallo Splunge,
deine Version für eine Anwesenheitssimulation kommt meiner Vorstelleung einer Simulation am nächsten dran.
Meine Rollladen werden über die Steuerung von funkleuchtturm gesteuert und habe hier auch das Kalender-Script V2.x installiert, um freie Tage und Feiertage sowie Wochenende zu berechnen.
Ich brauche soweit nur die Lichter im Haus zu steuern. Einen Wunderground Zugang habe ich. Da ich feste Zeiten habe wo ich zur Arbeit fahre brauche ich nicht unbedingt die Sonnenauf- und untergangszeiten zu benutzen. Die Zeit für Abends kann ich von der Rollladensteuerung übernehmen und dort eventuell 2 Stunden abziehen. Meine Frage nun, brauche ich das Twilight.tcl und das Freier_Tag-Script? UNd was müsste ich eventuell anpassen an den anderen Scripten und Programmen? Und wie hast du Plannung für einzelnen Aktionen gemacht und erstellt? Aus Excel etwas importiert?
Vielen Dank vorab für eine Unterstützung.
deine Version für eine Anwesenheitssimulation kommt meiner Vorstelleung einer Simulation am nächsten dran.
Meine Rollladen werden über die Steuerung von funkleuchtturm gesteuert und habe hier auch das Kalender-Script V2.x installiert, um freie Tage und Feiertage sowie Wochenende zu berechnen.
Ich brauche soweit nur die Lichter im Haus zu steuern. Einen Wunderground Zugang habe ich. Da ich feste Zeiten habe wo ich zur Arbeit fahre brauche ich nicht unbedingt die Sonnenauf- und untergangszeiten zu benutzen. Die Zeit für Abends kann ich von der Rollladensteuerung übernehmen und dort eventuell 2 Stunden abziehen. Meine Frage nun, brauche ich das Twilight.tcl und das Freier_Tag-Script? UNd was müsste ich eventuell anpassen an den anderen Scripten und Programmen? Und wie hast du Plannung für einzelnen Aktionen gemacht und erstellt? Aus Excel etwas importiert?
Vielen Dank vorab für eine Unterstützung.
MfG
Mirko
Homematic Komponenten:
CCU2 FW 2.49.18, geplant Homeputer; CUxD 2.3.3; CUxD Highcharts 1.4.5; XML-API 1.20; HQ WebUI 2.5.4; Programme drucken 1.2a; E-Mail 1.6.7c
Mirko
Homematic Komponenten:
CCU2 FW 2.49.18, geplant Homeputer; CUxD 2.3.3; CUxD Highcharts 1.4.5; XML-API 1.20; HQ WebUI 2.5.4; Programme drucken 1.2a; E-Mail 1.6.7c
-
- Beiträge: 7
- Registriert: 05.01.2015, 15:18
- Hat sich bedankt: 1 Mal
Re: YAWN – Yet Another anWesenheitssimulatioN
Wie in anderen Threads bereits erwähnt, die API von wunderground.com wurde abgeschaltet. Da diese API im TCL script Twilight.tcl benutzt wird hier die Frage ob es eine Alternative gibt. Wichtig für YAWN wäre doch nur die Sonnenauf- und Untergangszeiten, wenn ich das richtig verstehe?
Re: YAWN – Yet Another anWesenheitssimulatioN
Hallo Christian,
das hast du richtig verstanden. In meiner Ausführung nutzt YAWN nicht die wetterabhängigen Sonnenauf- und untergangszeiten, sondern den bürgerlichen bzw. Indoor Sonnenauf- bzw. untergang.
Wonderground oder alternative Wetterdienste sind also nicht zwingend notwendig.
Hier mal die für meine Zwecke angepasste Form der Twilight.tcl. Die Parameter beim Programmaufruf mittels CUxD.CMD_EXEC sollten natürlich noch entsprechend angepasst werden.
das hast du richtig verstanden. In meiner Ausführung nutzt YAWN nicht die wetterabhängigen Sonnenauf- und untergangszeiten, sondern den bürgerlichen bzw. Indoor Sonnenauf- bzw. untergang.
Wonderground oder alternative Wetterdienste sind also nicht zwingend notwendig.
Hier mal die für meine Zwecke angepasste Form der Twilight.tcl. Die Parameter beim Programmaufruf mittels CUxD.CMD_EXEC sollten natürlich noch entsprechend angepasst werden.
Code: Alles auswählen
#!/bin/tclsh
#Version 1.5d for YAWN without wunderground (extended weather handling)
#param 0 = Breitengrad (noerdlich)
#param 1 = Laengengrad (oestlich)
#param 2 = kuenstlicher Horizont
#
# Systemvariables to be set up in CCU:
# "Daemmerungszeiten" (Type Zeichenkette)
# "Daemmerung" (Type Werteliste: Nacht;Aufgang Astronomisch;Aufgang Nautisch;Aufgang Bürgerlich;Aufgang;Aufgang Indoor;Aufgang Wetterabhängig;Untergang Wetterabhängig;Untergang Indoor;Untergang;Untergang Bürgerlich;Untergang Nautisch;Untergang Astronomisch)
# "Tageslicht" (Type Zahl)
# "Sekunden_SA_Buergerlich" (Typ Zahl - 0 bis 2147483647)
# "Sekunden_SU_Buergerlich" (Typ Zahl - 0 bis 2147483647)
# "Sekunden_SA_Indoor" (Typ Zahl - 0 bis 2147483647)
# "Sekunden_SU_Indoor" (Typ Zahl - 0 bis 2147483647)
#only run once, check if locking port 60 is opened
if {[catch {socket -server unknown -myaddr 127.0.0.1 60} locksock]} then {
exit 0
}
source /www/addons/lcd_msg/daemonize.tcl
load tclrega.so
proc showTime x {
if {$x && $x != 2000000000} then {
return [clock format $x -format "%H:%M:%S"]
} else {
return "--:--:--"
}
}
proc log x {
puts $::logfile "[showTime [clock seconds]]: $x"
flush $::logfile
}
#define constants for the list access to make review easier
set NIGHT 0
set SR_ASTRONOMICAL 1
set SR_NAUTICAL 2
set SR_CIVIL 3
set SR_SUNRISE 4
set SR_INDOOR 5
set SR_WEATHER 6
set SS_WEATHER 7
set SS_INDOOR 8
set SS_SUNRISE 9
set SS_CIVIL 10
set SS_NAUTICAL 11
set SS_ASTRONOMICAL 12
proc getTimeDiff {dayofyear} {
return [expr {-0.171*sin(0.0337 * $dayofyear + 0.465) - 0.1299*sin(0.01787 * $dayofyear - 0.168)}]
}
proc calcTwilightTimes {latitude longitude timezone dayofyear horizon sunrisevar sunsetvar} {
upvar $sunrisevar sunrise
upvar $sunsetvar sunset
set timediff [expr {-0.171*sin(0.0337 * $dayofyear + 0.465) - 0.1299*sin(0.01787 * $dayofyear - 0.168)}]
set declination [expr {0.4095 * sin(0.016906 * ($dayofyear - 80.086) ) }]
set acosvar [expr ((sin($horizon/57.29578) - sin($latitude/57.29578)*sin($declination)) / (cos($latitude/57.29578)*cos($declination)))]
if {$acosvar <-1} {
set acosvar -1
log "Die Variable acosvar wurde auf -1 gesetzt, da ihr ursprünglicher Wert kleiner -1 war"
}
if {$horizon == -18} {
log "Die Variable acosvar muss zwischen -1 und 1, liegen und ist momentan $acosvar"
}
set suntime [expr {12*acos($acosvar)/3.141592}]
set sunrise [expr {[clock scan "0"] + round((12 - $timediff - $suntime - $longitude/15.0 + $timezone)*3600)}]
set sunset [expr {[clock scan "0"] + round((12 - $timediff + $suntime - $longitude/15.0 + $timezone)*3600)}]
}
proc getDayOfYear {timestamp} {
set dayofyear [string trimleft [clock format $timestamp -format "%j"] "0"]
#subtract the fractional part to the next leap-year february 29th from the current day of the year
set dayofyear [expr {$dayofyear - ([clock format $timestamp -format "%Y"]%4)/4.0 - ($dayofyear)/365.25/4.0}]
return $dayofyear
}
proc waitToTime {logfile destTime} {
set waittime [expr {1000*($destTime - [clock seconds])}]
if {$waittime > 0} then {
log "waiting [expr $waittime/1000] s until [clock format $destTime]"
#after is off of several seconds (exactly 1/1000?) after long waits, so wait 1% shorter and then wait again
after [expr { 990*($destTime - [clock seconds])}]
after [expr {1000*($destTime - [clock seconds])}]
} else {
log "not waiting [expr $waittime/1000] s until [clock format $destTime]"
}
}
proc displayValues {} {
uplevel {
set display "s. folgende Tabelle vom [clock format [lindex $twilight_times 6] -format "%d.%m."]"
append display "</div><br/><table border=\"1\" bordercolor=\"#000000\" style=\"background-color:#5d6373\" width=\"100%\">\r\n"
append display "<tr><td><b>Daemmerung</b></td><td><b>Morgens</b></td><td><b>Abends</b></td></tr>\r\n"
for {set j 1} {$j <= 6} {incr j} {
set insert "[lindex $twilight_descr $j]:"
if {$j == $i || $j == 12-$i} then {set insert "<b>$insert</b>"}
append display "<tr><td>$insert</td>"
set insert "[showTime [lindex $twilight_times [expr $j-1]]]"
if {$j == $i} then {set insert "<b>$insert</b>"}
if {$j == 6 && !$srw_set} then {set insert "<i>$insert</i>"}
append display "<td>$insert</td>"
set insert "[showTime [lindex $twilight_times [expr 12-$j]]]"
if {$j == 13-$i} then {set insert "<b>$insert</b>"}
if {$j == 6 && !$ssw_set} then {set insert "<i>$insert</i>"}
append display "<td>$insert</td></tr>\r\n"
#log "updating twilight time table: [showTime [lindex $twilight_times [expr $j-1]]] [showTime [lindex $twilight_times [expr 12-$j]]] [string map {: { }} [lindex $twilight_descr [expr $j-1]]]"
}
append display "</table></td>"
rega_script "dom.GetObject('Daemmerungszeiten').State('$display');"
rega_script "dom.GetObject('Sekunden_SA_Buergerlich').State('[lindex $twilight_times 2]');"
rega_script "dom.GetObject('Sekunden_SA_Indoor').State('[lindex $twilight_times 4]');"
rega_script "dom.GetObject('Sekunden_SU_Indoor').State('[lindex $twilight_times 7]');"
rega_script "dom.GetObject('Sekunden_SU_Buergerlich').State('[lindex $twilight_times 9]');"
}
}
#
# Main execution
#
set latitude [lindex $argv 0]
set longitude [lindex $argv 1]
set indoor_horizon [lindex $argv 2]
#some vars we need
set horizon_values [list 0 -18 -12 -6 [expr {- 50.0 / 60.0}] $indoor_horizon [expr {$indoor_horizon + 5.1}]]
set twilight_names [list night astronomical nautical civil standard indoor weather]
set twilight_descr [list Nacht Astronom. Nautisch Buergerlich Standard Indoor Wetterabh.]
while {1} {
set timezone [expr {([clock scan "0 UTC"] - [clock scan "0"]) / 3600.0}]
set now [clock seconds]
set twilight_midnight [expr {[clock scan "0"] + round((0 - [getTimeDiff [getDayOfYear $now]] - $longitude/15.0 + $timezone)*3600)}]
#get the day of the year as numeric value based on twilight midnight (time between midnight and twilight midnight belongs to day before)
set yesterday_offset 0
if {$now < $twilight_midnight} then {
#use time table from day before
set yesterday_offset 86400
}
set dayofyear [getDayOfYear [expr $now-$yesterday_offset]]
set writeday [string trimleft [clock format $now -format "%j"] "0"]
set deleteday [expr $writeday-14]
if {$deleteday <= 0} {
set jahr [clock format [clock seconds] -format "%Y"]
if {(int($jahr)-1) % 4 == 0 && ((int($jahr)-1) % 100 != 0 || (int($jahr)-1) % 400 == 0)} {
set deleteday [expr $deleteday + 366]
} else {
set deleteday [expr $deleteday + 365]
}
}
catch {file delete "/tmp/twilight.$deleteday.log"}
set logfile [open "/tmp/twilight.$writeday.log" w]
log "args: $argv"
if {$now < $twilight_midnight} then {log "twilight midnight not reached, using yesterdays time table"}
log "timezone: $timezone, twilight midnight: [showTime $twilight_midnight], dayofyear: $dayofyear"
set twilight_times ""
for {set i 1} {$i <= 6} {incr i} {
calcTwilightTimes $latitude $longitude $timezone $dayofyear [lindex $horizon_values $i] sunrise_time sunset_time
if {$sunrise_time == 0} then {
log "no [lindex $twilight_names $i] twilight here and now"
} elseif {$i != 6} then {
log "calculated twilight times: sunrise [clock format $sunrise_time -format "%d., %H:%M:%S"], sunset [clock format $sunset_time -format "%d., %H:%M:%S"] for [lindex $twilight_names $i] ($i)"
}
#do not append weather sunrise
if {$i != 6} then {
lappend twilight_times [expr $sunrise_time-$yesterday_offset]
}
#append indoor sunrise again to replace weather sunrise
if {$i == 5} then {
lappend twilight_times [expr $sunrise_time-$yesterday_offset+1]
}
#always append sunset
lappend twilight_times [expr $sunset_time-$yesterday_offset]
}
set twilight_times [lsort $twilight_times]
log "calculated twilight times: sunrise [clock format [lindex $twilight_times 5] -format "%d., %H:%M:%S"], sunset [clock format [lindex $twilight_times 6] -format "%d., %H:%M:%S"] for [lindex $twilight_names 6] (6)"
set srw_set 0
set ssw_set 0
displayValues
#in the following calculation, assume that the weather sunrise and sunset are always subsequently on the current dayofyear
for {set i 0} {$i < 12} {incr i} {
set next_time [lindex $twilight_times $i]
if {$i == 5 && [clock seconds] < [lindex $twilight_times 6]} then {
#sunrise weather
log "retrieving weather condition for sunrise"
calcTwilightTimes $latitude $longitude $timezone $dayofyear $indoor_horizon sunrise_weather dummy
set next_time $sunrise_weather
set srw_set 1
set twilight_times [lreplace $twilight_times 5 5 $sunrise_weather]
displayValues
log "weather sunrise at [showTime $next_time]"
}
if {[clock seconds] < $next_time && $next_time != 2000000000} then {
log "current twilight state $i ([lindex $twilight_descr [expr {6-abs($i-6)}]]), sunlight state [expr {6-abs($i-6)}], next at [showTime $next_time]"
rega_script "dom.GetObject('Daemmerung').State('$i');"
rega_script "dom.GetObject('Tageslicht').State('[expr {6-abs($i-6)}]');"
displayValues
waitToTime $logfile $next_time
}
if {$i == 6 && [clock seconds] < [lindex $twilight_times 7]} then {
#sunset weather
log "retrieving weather condition for sunset"
calcTwilightTimes $latitude $longitude $timezone $dayofyear $indoor_horizon dummy sunset_weather
set next_time $sunset_weather
set ssw_set 1
set twilight_times [lreplace $twilight_times 6 6 $sunset_weather]
displayValues
log "weather sunset at [showTime $next_time]"
waitToTime $logfile $next_time
}
}
rega_script "dom.GetObject('Daemmerung').State('12');"
rega_script "dom.GetObject('Tageslicht').State('0');"
log "twilight cycle completed for day of year $dayofyear, waiting until twilight midnight for next run"
waitToTime $logfile [expr {$twilight_midnight + 86400 - $yesterday_offset}]
close $logfile
}
if {[file exists /var/run/twilight.tcl.pid]} then {
catch {
set f [open /var/run/twilight.tcl.pid]
set filepid [read $f]
close $f
if {[pid] == $filepid} then {
file delete /var/run/twilight.tcl.pid
}
}
}
close $locksock
-
- Beiträge: 7
- Registriert: 05.01.2015, 15:18
- Hat sich bedankt: 1 Mal
Re: YAWN – Yet Another anWesenheitssimulatioN
Du bist der Beste! Vielen Dank für Dein Script
Musste nur noch eine Zeile anpassen, den Ort an dem der Daemonizer.tcl liegt von
in
Musste nur noch eine Zeile anpassen, den Ort an dem der Daemonizer.tcl liegt von
Code: Alles auswählen
source /www/addons/lcd_msg/daemonize.tcl
Code: Alles auswählen
source /usr/local/addons/TCL/Daemonizer.tcl
-
- Beiträge: 7
- Registriert: 05.01.2015, 15:18
- Hat sich bedankt: 1 Mal
Re: YAWN – Yet Another anWesenheitssimulatioN
Auf die Gefahr hin lästig zu sein - Bei der Durchsicht aller Programme und Scripte ist mir aufgefallen, das das Script 'MailLogfile.tcl' keine EMails mehr versendet. Das Script hatte mal funktioniert, ist allerdings einige Zeit her. Zwischenzeitlich haben die Mailprovider alle auf Verschlüsselung umgestellt SSL/TLS (Ja, das ist wirklich lange her aber der Code läuft ja auch schon ein paar Jahre). Das Homematic Addon EMail funktioniert, dort nutze ich Port 465 mit meinem Strato Account)
Probiert habe ich die Konfiguration für den Mailversand mit 2 Providern, GMX und Strato.
Wenn ich das Script auf der Konsole aufrufe bekomme ich, abhängig der eingestellten Ports, die Fehlermeldungen:
'FIREMAIL Error: premature end-of-file from server' Das dauert einige Sekunden, bei Auswahl Port 465, meine das müsste dann SSl sein (?) oder
'FIREMAIL Error: 530: Authentication required' bei Port 587.
Gibt es Tips wie ich den Fehler weiter einkreisen kann?
Probiert habe ich die Konfiguration für den Mailversand mit 2 Providern, GMX und Strato.
Wenn ich das Script auf der Konsole aufrufe bekomme ich, abhängig der eingestellten Ports, die Fehlermeldungen:
'FIREMAIL Error: premature end-of-file from server' Das dauert einige Sekunden, bei Auswahl Port 465, meine das müsste dann SSl sein (?) oder
'FIREMAIL Error: 530: Authentication required' bei Port 587.
Gibt es Tips wie ich den Fehler weiter einkreisen kann?
Re: YAWN – Yet Another anWesenheitssimulatioN
Aus den von dir genannten Gründen habe ich vor einiger Zeit bereits auf das Mail-AddOn umgestellt. Siehe auch viewtopic.php?f=18&t=13356&start=130#p384245
Bei mir (1&1) habe ich als Port 587 eingestellt.
Als Authentification ist "PLAIN" eingestellt und das Häkchen bei "Verschlüsselte Verbindung (TLS):" gesetzt.
Manche Provider verlangen zur Authentisierung, dass vor dem Versand einer Mail zuvor Emails über den Account abgerufen wurden. Das könnte zu deiner zweiten Fehlermeldung passen. Wie man das Problem lösen könnte, kann ich im Moment leider nicht beantworten.
Bei mir (1&1) habe ich als Port 587 eingestellt.
Als Authentification ist "PLAIN" eingestellt und das Häkchen bei "Verschlüsselte Verbindung (TLS):" gesetzt.
Manche Provider verlangen zur Authentisierung, dass vor dem Versand einer Mail zuvor Emails über den Account abgerufen wurden. Das könnte zu deiner zweiten Fehlermeldung passen. Wie man das Problem lösen könnte, kann ich im Moment leider nicht beantworten.
Re: YAWN – Yet Another anWesenheitssimulatioN
Hallo zusammen,
ich habe folgende Fehlermeldung und meine Zeiten werden nicht mehr aktualisiert:
unbekannte Meldung (CMD_SETS) 0, unbekannte Meldung (CMD_SETS) 0
19:39:44 23.07.2019 YAWN_AktionsListe
12,13,15,16,17
19:39:44 23.07.2019 TIMER_YAWN
unbekannte Meldung (TIMER_SET) 20, unbekannte Meldung (TIMER_GET) 1216.00s
19:43:05 23.07.2019 YAWN_EXCEC
unbekannte Meldung (CMD_SETS) 0, unbekannte Meldung (CMD_SETS) 0
Jemand ne Idee wo ich schauen könnte?
Danke
ich habe folgende Fehlermeldung und meine Zeiten werden nicht mehr aktualisiert:
unbekannte Meldung (CMD_SETS) 0, unbekannte Meldung (CMD_SETS) 0
19:39:44 23.07.2019 YAWN_AktionsListe
12,13,15,16,17
19:39:44 23.07.2019 TIMER_YAWN
unbekannte Meldung (TIMER_SET) 20, unbekannte Meldung (TIMER_GET) 1216.00s
19:43:05 23.07.2019 YAWN_EXCEC
unbekannte Meldung (CMD_SETS) 0, unbekannte Meldung (CMD_SETS) 0
Jemand ne Idee wo ich schauen könnte?
Danke
Re: YAWN – Yet Another anWesenheitssimulatioN
Hallo Blackeye,
entschuldige, dass ich mich jetzt erst melde, aber ich war im Urlaub...
Dem Thread-Verlauf entnehme ich, dass YAWN prinzipiell bei dir funktioniert hat aber seit kurzem plötzlich nicht mehr.
Hast du denn sonst noch etwas an deiner CCU geändert? Updates oder AddOns installiert/deinstalliert?
Die Fehlermeldungen würde ich CUxD zuordnen. Hat sich bei dir irgendwas an diesem AddOn geändert?
Gruß
Splunge
entschuldige, dass ich mich jetzt erst melde, aber ich war im Urlaub...
Dem Thread-Verlauf entnehme ich, dass YAWN prinzipiell bei dir funktioniert hat aber seit kurzem plötzlich nicht mehr.
Hast du denn sonst noch etwas an deiner CCU geändert? Updates oder AddOns installiert/deinstalliert?
Die Fehlermeldungen würde ich CUxD zuordnen. Hat sich bei dir irgendwas an diesem AddOn geändert?
Gruß
Splunge