'****************************************************************************** ' CCHC : C-Control HomeCommander 2.0d : (c) 2007-2008 Fabian Schneider ' Dieses Programm dient der Überwachung diverser Vorgänge im Haus, z.B. Alarm- ' kontakte, Temperaturwerte, Pumpvorgänge etc. Die gesammelten Daten werden im ' seriellen EEPROM der C-Control mitgeloggt und können bei Bedarf aus der Ferne ' mittels eines Modems ausgelesen werden. Dazu muss an die RS232-Schnittstelle ' ein beliebiges Modem angeschlossen werden. Optional kann das Modem Caller-ID ' (CLIP) unterstützen, dann besteht die Möglichkeit, Anrufe nur von einer ' bestimmten Gegenstelle anzunehmen. In jedem Falle wird nach Annahme des Rufs ' ein PIN-Code abgefragt. Die Bedienung erfolgt von der Gegenseite aus über ' einfaches Terminalprogramm oder über eine separate Windows-GUI, die eine ' komfortablere (Maus-)bedienung und außerdem Klartextausgaben bietet. ' Daneben erfüllt C-Control HomeCommander die Ansteuerung einer Nebenuhr, ' bekannt aus dem C-Control Clockwork Commander, dessen Beschreibung nun folgt. '****************************************************************************** ' DCF77-gesteuerte Ansteuerung einer "Nebenuhr" (Bahnhofsuhr) mit polwendenden ' Minutenimpulsen inklusive Speicherung des letzten Zeigerstandes im EEPROM ' für die automatische Nachführung fehlender Impulse nach einer Spannungs- ' unterbrechung. ' Beim ersten Start oder wenn das EEPROM unsinnige Werte enthält, nimmt das ' Programm den Zeigerstand "Zwölf Uhr" an und stellt, ausgehend von diesem ' Zeigerstand, die Uhr auf die aktuelle DCF77-Zeit. ' Über einen am Port 16 angeschlossenen Taster kann die Uhr minutenweise ' vorgestellt werden, um Differenzen der Zeigerstellung zum gespeicherten ' Zeigerstand zu korrigieren (bei Verwendung des Tasters wird der Wert im ' EEPROM *nicht* verändert). ' Die Relais müssen so angeschlossen werden, dass das Relais an port[7] ' eine positive Spannung von 12-24V (je nach Uhrwerk) schaltet, und das ' Relais an port[8] die entsprechende negative Spannung. Die Länge des ' Minutenimpulses beträgt 0,6 Sekunden im Normalbetrieb und 0,5 Sekunden im ' Stellbetrieb. Bei Verwendung des Stelltasters wird der Impuls solange ' ausgegeben, bis der Taster losgelassen wird. ' Seit Version 1.2 ist zusätzlich die Ausgabe eines "Big Ben"-ähnlichen ' Glockenschlags alle 15 Minuten mit Gongtönen zur vollen Stunde möglich. ' Zur Konfiguration dienen Ports 9 und 10: Sind beide HIGH (offen, kein ' Jumper gesteckt), so ertönt das Schlagwerk nur tagsüber (8 - 22 Uhr). ' Wird Port 9 auf LOW gejumpert, ist das Schlagwerk vollständig deaktiviert. ' Wird Port 10 auf LOW gejumpert, ertönt das Schlagwerk immer (auch nachts). ' Mehr Informationen unter: www.f-schneider.de.vu '****************************************************************************** ' === Konstantendefinitionen ================================================== define pin 1234 ' PIN-Code für den Fernzugriff (-32767 bis 32767) ' === Variablendefinitionen =================================================== define currpos word[1] ' Aktuelle Zeigerposition (0 = 12:00 bis 719 = 11:59) define savedpos word[2] ' Zeigerposition im EEPROM (s.o.) define dcfpos word[3] ' Zeigerposition von DCF77 (Sollzeit) define count byte[7] ' Allgemeine (Zähl-)variable define schlag byte[8] ' Zähler für Glockenschläge define m byte[9] ' Hilfsvariable define s byte[10] ' Hilfsvariable define event byte[11] ' Letztes Ereignis define duration byte[12] ' Dauer des Kondenswasser-Pumpvorgangs, eigtl. des ' Zustandes "Füllhöhe über Maximalpegel" (Schwimmer) define in_word word[7] ' Von der RS232-Schnittstelle gelesene Zahl (Word) define x_word word[8] ' Word-Variable für diverse Zwecke define mdm_clip_aware bit[179] ' Zwischenspeicher für die Zustände der Kontakte: define new_alm1 bit[180] define new_alm2 bit[181] define new_pumpe_kw bit[182] define new_pumpe_zi bit[183] define new_pumpe_he bit[184] define old_alm1 bit[185] define old_alm2 bit[186] define old_pumpe_kw bit[187] define old_pumpe_zi bit[188] define old_pumpe_he bit[189] define polarity bit[190] ' Polarität des LETZTEN gesendeten Impulses ' (ON = positiv, OFF = negativ) define imp_done bit[191] ' Impuls in der 00. Sekunde abgearbeitet? define set_done bit[192] ' Zeitkorrektur in der 23. Minute abgearbeitet? ' --- Portdefinitionen -------------------------------------------------------- define modem port[1] ' Externes Relais 1 (zum Einschalten des Modems) define rel2 port[2] ' Externes Relais 2 (für zukünftige Zwecke) define imp_pos port[7] ' Digitalport für den positiven Minutenimpuls define imp_neg port[8] ' Digitalport für den negativen Minutenimpuls define sw1 port[16] ' Taster zum Vorstellen der Uhr. define sw2 port[9] ' Jumper zum vollständigen Abschalten des Schlagwerks define sw3 port[10] ' Jumper zum ständigen Aktivieren des Schlagwerks ' (auch nachts)! Ist dieser nicht gesteckt (-> HIGH). ' so ist das Schlagwerk von 22 - 8 Uhr deaktiviert. define sw4 port[11] ' Jumper zum Überspringen der DCF-Wartezeit (Debug) define alm1 port[3] ' Alarmkontakt 1 (auf 0 gebrückt bei Alarm) define alm2 port[4] ' Alarmkontakt 1 (auf 0 gebrückt bei Alarm) define pumpe_kw port[5] ' Eingangskontakt für Kondenswasserpumpe ' (auf 0 gebrückt, wenn Füllhöhe über Maximalpegel) define pumpe_zi port[6] ' Eingangskontakt für Zirkulationspumpe Warmwasser ' (auf 0 gebrückt, wenn Pumpe läuft) define pumpe_he port[12] ' Eingangskontakt für Zirkulationspumpe Heizkreis ' (auf 0 gebrückt, wenn Pumpe läuft) define temp1 ad[1] ' Temperaturfühler 1 define temp2 ad[2] ' Temperaturfühler 2 ' ----------------------------------------------------------------------------- ' Momentan noch freie Ports: 13 14 15 AD1-8 ' ----------------------------------------------------------------------------- ' === Hauptprogramm =========================================================== ' Polarität des letzten Impulses sowie der letzten Zeigerstellung vor ' Wiederanlegen der Spannung aus dem EEPROM lesen. imp_pos = OFF imp_neg = OFF rel2 = OFF modem = OFF gosub init_modem old_alm1 = ON old_alm2 = ON old_pumpe_kw = ON old_pumpe_zi = ON old_pumpe_he = ON open# for read input# polarity input# savedpos ' Zählen, wie viel schon im EEPROM stand currpos = 0 #countnext if eof then goto countend input# dcfpos 'Zweckentfremdet currpos = currpos + 1 'Zweckentfremdet goto countnext #countend event = 0 if (savedpos > 719) or (savedpos < 0) then event = 12 if savedpos = 12345 then goto full_reset goto normal_reset #full_reset savedpos = 0 polarity = OFF open# for write print# 0 print# 0 close# #normal_reset if event = 12 then savedpos = 0 ' Reset-Routine: Nach Anschließen der Spannung piepst der Beeper für ~2 Sek. ' Wird während dieser Zeit die Spannung wieder entfernt, sind alle Werte ' auf Null und die Uhr geht beim nächsten Start von der Zeigerposition 0 aus. pause 70 beep 250,0,0 open# for write print# 0 print# 12345 pause 85 beep 0,0,0 open# for write print# polarity print# savedpos if currpos < 3 then close# gosub do_log ' Ende der Reset-Routine ------------------------------------------------------ For dcfpos = 0 to 1200 ' Auf DCF77-Empfänger warten (~4 Minuten) pause 10 if not sw1 then gosub short_imp ' Dabei manuelles Stellen erlauben und... if not sw4 then gosub bypass_dcf ' ...mit Taster an Port 11 alles übergehen next #bypass_dcf dcfpos = 0 ' ----------------------------------------------------------------------------- ' Wir nehmen an dass die Zeiger da stehen, wo sie vor Unterbrechung der ' Spannung standen. Auf dieser Annahme basiert die ganze Logik. Wenn das ' Uhrwerk zwischendurch anderweitig verstellt wurde, wird sich die Uhr ' letztendlich auf eine falsche Zeit einstellen und annehmen diese sei ' richtig. Wenn sie diesen Zustand eingenommen hat, kann mit dem Taster ' die Position der Zeiger wiederum an den Stand im EEPROM angeglichen werden! ' Also hier die Annahme: currpos = savedpos #setclock ' Loop zum Stellen der Uhr. ' Zeigerposition aus DCF77-Zeit errechnen gosub getpos ' Wenn Zeigerpositionen stimmen, direkt in den Hauptloop springen. ' Dies ist der Fall wenn setclock mindestens einmal durchlaufen wurde oder ' aber die Zeigerposition zufällig schon stimmt (sehr unwahrscheinlich). ' Falls die Zeigerposition maximal 200 Minuten "vorgeht", wird die Uhr ' nicht gestellt, sondern die entsprechende Anzahl an Minuten gewartet. ' Das spart Strom und Schreibzyklen und schont die Mechanik. if (currpos > dcfpos) and ((currpos - dcfpos) <= 200) then gosub drink_tea if (currpos < 60) and (dcfpos > 620) then gosub drink_tea if (currpos > dcfpos) and ((currpos - dcfpos) > 200) then dcfpos = dcfpos + 720 if currpos = dcfpos then set_done = ON if currpos = dcfpos then goto clockwork for currpos = savedpos + 1 to dcfpos gosub short_imp pause 10 next currpos = currpos mod 720 dcfpos = dcfpos mod 720 open# for write print# polarity print# currpos savedpos = currpos goto setclock ' Programmschleife (CLOCKWORK) ------------------------------------------------ ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #clockwork m = minute s = second new_alm1 = alm1 new_alm2 = alm2 new_pumpe_kw = pumpe_kw new_pumpe_zi = pumpe_zi new_pumpe_he = pumpe_he ' Nachsehen, ob ein Anruf vorliegt gosub get_modem_ring ' Wenn Minute voll, dann Impuls ausgeben if (s >= 0) and (s <= 2) and (not imp_done) then gosub impuls if (s > 49) and (s < 55) then imp_done = OFF ' Alle 3 Minuten schauen wir nach, ob unsere Zeit noch stimmt. if ((m mod 3) = 0) and (not set_done) then goto setclock if ((m mod 3) = 2) then set_done = OFF ' Wenn Stelltaster gedrueckt, dann Impuls ausgeben if not sw1 then gosub man_imp ' Liegt ein Ereignis vor (Pumpe, Alarmkontakte)? event = 0 if (not new_alm1) and (old_alm1) then event = 20 if (new_alm1) and (not old_alm1) then event = 21 if (not new_alm2) and (old_alm2) then event = 22 if (new_alm2) and (not old_alm2) then event = 23 if (new_pumpe_kw) and (not old_pumpe_kw) then event = 30 if (not new_pumpe_zi) and (old_pumpe_zi) then event = 32 if (new_pumpe_zi) and (not old_pumpe_zi) then event = 33 if (not new_pumpe_he) and (old_pumpe_he) then event = 35 if (new_pumpe_he) and (not old_pumpe_he) then event = 36 gosub do_log old_alm1 = new_alm1 old_alm2 = new_alm2 old_pumpe_kw = new_pumpe_kw old_pumpe_zi = new_pumpe_zi old_pumpe_he = new_pumpe_he ' Noch ein bisschen Strom sparen... pause 2 ' Schleife wiederholen goto clockwork ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' === Unterprogramme ========================================================== ' --- impuls ------------------------------------------------------------------ ' Stellt die Uhr eine Minute weiter und sichert Zeigerposition im EEPROM ' ----------------------------------------------------------------------------- #impuls imp_neg = OFF ' Erst einmal beide Relais ausschalten, da sich die imp_pos = OFF ' Ports vorher im hochohmigen Zustand befunden haben. if polarity = ON then imp_neg = ON if polarity = OFF then imp_pos = ON pause 25 ' Länge des Impulses: 600 Millisekunden imp_neg = OFF imp_pos = OFF ' Polarität für den nächsten Impuls invertieren. polarity = not polarity ' Zeigerposition um 1 erhöhen. Falls 12:00-Stellung (720) erreicht ist, ' wieder auf Null zurücksetzen. currpos = currpos + 1 if currpos = 720 then currpos = 0 ' Polarität und Zeigerposition im EEPROM speichern. open# for write print# polarity print# currpos savedpos = currpos ' Damit wir wissen: Der Wert im EEPROM ist aktuell. imp_done = ON event = 0 if ((hour mod 4) = 0) and (minute = 0) then event = 40 if ((hour mod 4) = 2) and (minute = 0) then event = 41 if (not pumpe_kw) then duration = duration + 1 if duration >= 3 then event = 31 if (event = 31) or (pumpe_kw) then duration = 0 gosub do_log ' Zwischen 22:00 und 22:30 das Modem für Fernwartung einschalten if (hour = 22) and (minute = 0) then gosub init_modem if (hour = 22) and (minute = 30) then modem = OFF ' Schlagwerk? if (not sw2) or (((hour > 21) or (hour < 9)) and (sw3)) then return if minute = 0 then gosub st_schlag if minute = 15 then gosub vs_schlag if minute = 30 then gosub hs_schlag if minute = 45 then gosub ds_schlag return 'impuls ' --- man_imp ----------------------------------------------------------------- ' Stellt die Uhr eine Minute weiter und sichert NICHT die Zeigerposition! ' Die Polarität wird jedoch gespeichert. ' ----------------------------------------------------------------------------- #man_imp imp_neg = OFF ' Erst einmal beide Relais ausschalten, da sich die imp_pos = OFF ' Ports vorher im hochohmigen Zustand befunden haben. if polarity = ON then imp_neg = ON if polarity = OFF then imp_pos = ON ' Wir halten den Impuls solange, bis die Taste wieder losgelassen wird! ' Somit ermöglichen wir dem Benutzer, die Uhr so schnell zu stellen wie ' die Trägheit der Mechanik dies ermöglicht: wait sw1 ' = off imp_neg = OFF imp_pos = OFF ' Polarität für den nächsten Impuls invertieren. polarity = not polarity ' Polarität im EEPROM speichern. open# for write print# polarity savedpos = currpos ' Damit wir wissen: Der Wert im EEPROM ist aktuell. return 'man_imp ' --- short_imp --------------------------------------------------------------- ' Gibt einen kürzeren Minutenimpuls aus (0,5 Sekunden) für den Stellbetrieb. ' Es wird nicht die Zeigerposition gespeichert. ' ----------------------------------------------------------------------------- #short_imp imp_neg = OFF ' Erst einmal beide Relais ausschalten, da sich die imp_pos = OFF ' Ports vorher im hochohmigen Zustand befunden haben. if polarity = ON then imp_neg = ON if polarity = OFF then imp_pos = ON pause 25 ' Länge des Impulses: 0,5 Sekunden imp_neg = OFF imp_pos = OFF ' Polarität für den nächsten Impuls invertieren. polarity = not polarity return 'short_imp ' --- getpos ------------------------------------------------------------------ ' Berechnet aus dem aktuellen Wert der Echtzeituhr (DCF77-Empfänger) die ' Sollposition für das Uhrwerk. Diese wird in dcfpos gespeichert. ' ----------------------------------------------------------------------------- #getpos dcfpos = (hour mod 12) * 60 + minute return 'getpos ' --- drink_tea --------------------------------------------------------------- ' "Abwarten und Tee trinken": Wir warten einfach ab, bis die Zeigerposition ' wieder stimmt. Anstatt die Uhr z.B. bei der Winterzeitumstellung 11 Stunden ' vorzustellen, warten wir doch lieber 1 Stunde ab. ' ----------------------------------------------------------------------------- #drink_tea #loop gosub getpos gosub get_modem_ring ' Wenn Stelltaster gedrueckt, dann Impuls ausgeben if not sw1 then gosub man_imp pause 3 if dcfpos <> currpos then goto loop imp_done = ON return 'drink_tea ' --- do_log ------------------------------------------------------------------ ' Ein Ereignis ins Log schreiben. ' ----------------------------------------------------------------------------- #do_log if event = 0 then return if event = 40 then count = temp1 if event = 41 then count = temp2 open# for append dcfpos = event shl 8 dcfpos = dcfpos or count if filefree then print# dcfpos dcfpos = hour shl 8 dcfpos = dcfpos or minute if filefree then print# dcfpos dcfpos = month shl 8 dcfpos = dcfpos or day if filefree then print# dcfpos close# beep 250,2,0 gosub getpos return 'do_log ' --- init_modem -------------------------------------------------------------- ' Das Modem einschalten und auf ankommende Anrufe vorbereiten. ' ----------------------------------------------------------------------------- #init_modem modem = ON pause 120 baud R4800 print "AT&D0 \V0 S0=2 S28.7=1" 'Modem initialisieren gosub get_modem_ok ' Die folgenden Befehle werden nur benötigt, wenn erkannt werden soll, ob das ' Modem CLIP-fähig ist (Caller-ID). Momentan wird jedoch die Caller-ID des ' Anrufers ohnehin nicht ausgewertet, sodass diese Abfragen nur Platz belegen. ' print "AT#CID=1" ' gosub get_modem_ok ' if event = 0 then mdm_clip_aware = ON ' print "AT+VCID=1" ' gosub get_modem_ok ' if event = 0 then mdm_clip_aware = ON return 'init_modem ' --- get_modem_ok ------------------------------------------------------------ ' Auf die Antwort "OK" vom Modem warten. ' ----------------------------------------------------------------------------- #get_modem_ok event = 11 if rxd then goto receive_ok return #receive_ok gosub remote_get_byte if in_word <> 79 then return ' "O" gosub remote_get_byte if in_word <> 75 then return ' "K" gosub remote_get_byte if in_word <> 13 then return ' gosub remote_get_byte if in_word <> 10 then return ' event = 0 return 'get_modem_ok ' --- get_modem_ring ---------------------------------------------------------- ' Den String "RING" vom Modem erkennen. ' ----------------------------------------------------------------------------- #get_modem_ring if rxd then goto receive_ring else return #receive_ring gosub remote_get_byte if in_word <> 82 then return ' "R" gosub remote_get_byte if in_word <> 73 then return ' "I" gosub remote_get_byte if in_word <> 78 then return ' "N" gosub remote_get_byte if in_word <> 71 then return ' "G" gosub remote_get_byte if in_word <> 13 then return ' gosub remote_get_byte if in_word <> 10 then return ' beep 253,12,0 beep 319,12,0 goto remote_login return 'get_modem_ring ' === Fernwartung ============================================================= ' Ab hier beginnen die Routinen für die Fernwartung (Modemverbindung aktiv). ' Nach Ende der Verbindung wird zurückgesprungen und davon ausgegangen, dass ' die Routine clockwork "alles schon wieder richten" wird (d.h. die Nebenuhr ' nachstellen etc.). ' --- remote_login ------------------------------------------------------------ ' Anruf entgegennehmen und PIN abfragen (Login) ' ----------------------------------------------------------------------------- #remote_login x_word = 0 #receive_connect if x_word > 12000 then goto connect_error x_word = x_word + 1 if not rxd then goto receive_connect gosub remote_get_byte if in_word <> 67 then goto receive_connect ' "C" gosub remote_get_byte if in_word <> 79 then goto connect_error ' "O" gosub remote_get_byte if in_word <> 78 then goto connect_error ' "N" gosub remote_get_byte if in_word <> 78 then goto connect_error ' "N" gosub remote_get_byte if in_word <> 69 then goto connect_error ' "E" gosub remote_get_byte if in_word <> 67 then goto connect_error ' "C" gosub remote_get_byte if in_word <> 84 then goto connect_error ' "T" pause 50 beep 160,8,0 gosub flush_buffer print print "-- CCHC 2.0 --" print "Login: "; gosub remote_get_word if in_word = -1 then goto connect_timeout event = 3 if in_word <> pin then goto remote_logout event = 0 print "Login @ ";hour;":";minute;":";second;" ";day;".";month;".";year print "Willkommen!" gosub remote_print_help #main_menu if in_word <> -1 then print "CCHC> "; in_word = -1 gosub flush_buffer gosub remote_get_word if in_word > 9 then print "Fehleingabe" if in_word = 1 then gosub remote_dump_values if in_word = 2 then gosub remote_dump_log if in_word = 3 then gosub short_imp if in_word = 3 then print "Uhr 1 min vorgestellt" if in_word = 4 then gosub remote_set_currpos if in_word = 5 then gosub remote_rel2_on if in_word = 6 then gosub remote_rel2_off if in_word = 7 then gosub remote_clear_log if in_word = 8 then gosub remote_print_help if in_word = 9 then goto remote_logout if in_word = 0 then print if in_word = -1 then goto connect_timeout goto main_menu #connect_timeout print "Timeout" #connect_error event = 2 goto remote_logout 'return 'remote_login ' --- remote_get_word --------------------------------------------------------- ' Eine Zahl vom Modem lesen ' ----------------------------------------------------------------------------- #remote_get_word in_word = -1 for count = 1 to 200 if rxd then input in_word if in_word <> -1 then return pause 10 next return 'remote_get_word ' --- remote_get_byte --------------------------------------------------------- ' Auf ein Byte vom Modem warten ' ----------------------------------------------------------------------------- #remote_get_byte in_word = -1 for count = 0 to 255 if rxd then get in_word ' if in_word <> -1 then put in_word if in_word <> -1 then count = 255 next return 'remote_get_word ' --- remote_dump_values ------------------------------------------------------ ' Aktuelle Messwerte über das Modem ausgeben ' ----------------------------------------------------------------------------- #remote_dump_values print print "Zeigerpos.:", currpos print "Schlagwerk:", if sw3 = OFF then print "IMMER "; if sw2 = OFF then print "AUS" else print "AN" print "Alarm 1:", alm1 print "Alarm 2:", alm2 print "Schwimmer KW:", pumpe_kw print "Pumpe Zirk.:", pumpe_zi print "Pumpe Heiz.:", pumpe_he print "Temp. 1:", temp1 print "Temp. 2:", temp2 return 'remote_dump_values ' --- remote_dump_log --------------------------------------------------------- ' Komplettes Ereignis-Log über das Modem ausgeben ' ----------------------------------------------------------------------------- #remote_dump_log open# for read input# in_word input# in_word dcfpos = 0 print print "#", "Event", "Wert", "Zeit", "Datum" #dumpnext if eof then goto dumpend dcfpos = dcfpos + 1 print dcfpos, input# in_word print (in_word shr 8), (in_word and 255), if (not eof) then input# in_word print (in_word shr 8); ":"; (in_word and 255), if (not eof) then input# in_word print (in_word and 255); "."; (in_word shr 8); "." goto dumpnext #dumpend print dcfpos; " Eintraege" return 'remote_dump_log ' --- remote_clear_log -------------------------------------------------------- ' Komplettes Ereignis-Log löschen ' ----------------------------------------------------------------------------- #remote_clear_log open# for write print# polarity print# currpos close# print "Log geloescht" event = 7 gosub do_log event = 0 return 'remote_clear_log ' --- remote_print_help ------------------------------------------------------- ' Hilfetext (Auswahlmenü) ausgeben. ' ----------------------------------------------------------------------------- #remote_print_help print print "1 Aktuelle Werte" print "2 Log" print "3 Uhr +1 min" print "4 Uhr Pos. setzen" print "5 Relais 2 ein" print "6 Relais 2 aus" print "7 Log loeschen" print "8 Diese Hilfe" print "9 Logout" return 'remote_print_help ' --- remote_set_currpos ------------------------------------------------------ ' Physikalische Zeigerposition der Nebenuhr über Modem neu setzen. ' ----------------------------------------------------------------------------- #remote_set_currpos print "Pos.? "; in_word = -1 gosub remote_get_word print if in_word = -1 then return currpos = in_word open# for write print# polarity print# currpos savedpos = currpos ' Damit wir wissen: Der Wert im EEPROM ist aktuell. return 'remote_set_currpos ' --- remote_rel2_on ---------------------------------------------------------- ' Relais 2 über Fernwartung einschalten. ' ----------------------------------------------------------------------------- #remote_rel2_on rel2 = ON print "Relais 2 ein" event = 26 gosub do_log return 'remote_rel2_on ' --- remote_rel2_off --------------------------------------------------------- ' Relais 2 über Fernwartung ausschalten. ' ----------------------------------------------------------------------------- #remote_rel2_off rel2 = OFF print "Relais 2 aus" event = 27 gosub do_log return 'remote_rel2_off ' --- remote_logout ----------------------------------------------------------- ' Fernwartungs-Sitzung beenden (Logout) ' ----------------------------------------------------------------------------- #remote_logout gosub do_log beep 640,8,0 print "Logout @ ";hour;":";minute;":";second;" ";day;".";month;".";year pause 60 print "+++ATZ" pause 40 gosub init_modem pause 30 if not ((hour = 22) and (minute >= 0) and (minute <= 30)) then modem = OFF return 'remote_logout ' --- flush_buffer ------------------------------------------------------------ ' Schittstellenpuffer leeren ' ----------------------------------------------------------------------------- #flush_buffer if rxd then get in_word if rxd then goto flush_buffer in_word = -1 return 'flush_buffer ' === Schlagwerk ============================================================== ' Ab hier beginnen die Ton- und Melodiedefinitionen für das "Schlagwerk". ' Die Uhr simuliert den Schlag des "Big Ben" und verwendet dafür 4 verschiedene ' Melodievarianten. Diese werden nach folgendem Schema abgespielt: ' ' Variante 1 = Viertelstunden ' Variante 1 + 2 = Halbe Stunden, ' Variante 1 + 2 + 3 = Dreiviertelstunden, ' Variante 1 + 2 + 3 + Stundenschlag = Volle Stunden ' ----------------------------------------------------------------------------- ' --- vs_schlag --------------------------------------------------------------- ' Viertelstundenschlag ' ----------------------------------------------------------------------------- #vs_schlag gosub melody_1 return 'vs_schlag ' --- hs_schlag --------------------------------------------------------------- ' Halbstundenschlag ' ----------------------------------------------------------------------------- #hs_schlag gosub melody_1 gosub melody_2 return 'hs_schlag ' --- ds_schlag --------------------------------------------------------------- ' Dreiviertelstundenschlag ' ----------------------------------------------------------------------------- #ds_schlag gosub melody_1 gosub melody_2 gosub melody_3 return 'ds_schlag ' --- st_schlag --------------------------------------------------------------- ' Stundenschlag ' ----------------------------------------------------------------------------- #st_schlag gosub melody_1 gosub melody_2 gosub melody_3 for schlag = 1 to (((hour + 11) mod 12) + 1) gosub gong pause 50 next return 'st_schlag ' --- melody_1 ---------------------------------------------------------------- ' Ausgabe der "Big Ben"-Melodie am BEEP-Port, Variante 1 ' ----------------------------------------------------------------------------- #melody_1 beep 319,2,0 beep 253,27,10 beep 402,2,0 beep 319,27,10 beep 358,2,0 beep 284,27,10 beep 536,2,0 beep 426,32,49 return 'melody_1 ' --- melody_2 ---------------------------------------------------------------- ' Ausgabe der "Big Ben"-Melodie am BEEP-Port, Variante 2 ' ----------------------------------------------------------------------------- #melody_2 beep 536,2,0 beep 426,25,12 beep 358,2,0 beep 284,25,12 beep 319,2,0 beep 253,25,12 beep 402,2,0 beep 319,32,49 return 'melody_2 ' --- melody_3 ---------------------------------------------------------------- ' Ausgabe der "Big Ben"-Melodie am BEEP-Port, Variante 3 ' ----------------------------------------------------------------------------- #melody_3 beep 319,2,0 beep 253,25,12 beep 358,2,0 beep 284,25,12 beep 402,2,0 beep 319,25,12 beep 536,2,0 beep 426,32,49 return 'melody_3 ' --- gong ------------------------------------------------------------------- ' Ausgabe eines sonoren "Glockenschlages" (Stundenschlag) am BEEP-Port ' ----------------------------------------------------------------------------- #gong beep 2146,2,0 beep 1073,2,0 beep 716,2,0 beep 568,2,0 beep 478,2,0 for count = 1 to 9 beep 426,2,0 beep 1072,3,0 next return 'gong