YAWN – Yet Another anWesenheitssimulatioN

User stellen ihre Haussteuerung vor

Moderator: Co-Administratoren

honeoe
Beiträge: 25
Registriert: 06.07.2015, 13:05
Wohnort: 51.xx 7.xx
Hat sich bedankt: 1 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von honeoe » 06.03.2018, 22:35

!!! GELÖST !!!

Herzlichen Dank an Alle die mir bei meinem Problem weitergeholfen haben, das erste Skript läuft wieder.

Eigentlich ist es fast peinlich :oops: - 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)
--------------------------------------------

Benutzeravatar
shamen7777
Beiträge: 79
Registriert: 01.06.2015, 19:27
Wohnort: Bergheim, Großraum Köln

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von shamen7777 » 15.06.2018, 13:25

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.
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

ChristianS
Beiträge: 7
Registriert: 05.01.2015, 15:18
Hat sich bedankt: 1 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von ChristianS » 08.03.2019, 21:11

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?

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 08.03.2019, 21:42

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.

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

ChristianS
Beiträge: 7
Registriert: 05.01.2015, 15:18
Hat sich bedankt: 1 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von ChristianS » 08.03.2019, 22:04

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

Code: Alles auswählen

source /www/addons/lcd_msg/daemonize.tcl
in

Code: Alles auswählen

source /usr/local/addons/TCL/Daemonizer.tcl

ChristianS
Beiträge: 7
Registriert: 05.01.2015, 15:18
Hat sich bedankt: 1 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von ChristianS » 10.03.2019, 19:31

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?

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 10.03.2019, 20:48

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.

Benutzeravatar
Blackeye
Beiträge: 547
Registriert: 15.08.2015, 16:33
Hat sich bedankt: 2 Mal

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von Blackeye » 23.07.2019, 20:21

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

Benutzeravatar
splunge
Beiträge: 65
Registriert: 10.04.2013, 22:43

Re: YAWN – Yet Another anWesenheitssimulatioN

Beitrag von splunge » 11.08.2019, 20:16

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

Antworten

Zurück zu „Projektvorstellungen“