├── src ├── TODO.txt ├── Baggages │ ├── pics │ │ ├── OR.png │ │ ├── AND.png │ │ ├── NAND.png │ │ ├── NOR.gif │ │ ├── NOT.gif │ │ ├── RSFF.png │ │ ├── XNOR.gif │ │ └── XOR.gif │ ├── Help_de │ │ ├── LOG-Breitengrad.md │ │ ├── LOG-Laengengrad.md │ │ ├── LOG-oder-bei-Wert.md │ │ ├── LOG-Watchdog-aktivieren.md │ │ ├── LOG-Eingang-ist-EIN-bei-Wert.md │ │ ├── LOG-Von-Wert.md │ │ ├── LOG-Zeitzone.md │ │ ├── LOG-oder-bei-Szene.md │ │ ├── LOG-oder-wenn-Wert-gleich.md │ │ ├── LOG-Bis-Wert.md │ │ ├── LOG-Diagnoseobjekt-anzeigen.md │ │ ├── LOG-Eingang-ist-EIN-bei-Szene.md │ │ ├── LOG-Eingang-ist-EIN-wenn-Wert-gleich.md │ │ ├── LOG-Grad.md │ │ ├── LOG-Zeit-fuer-Treppenlicht.md │ │ ├── LOG-Naechste-Zeile-auswerten.md │ │ ├── LOG-Sonnen-auf-untergang.md │ │ ├── LOG-Absolute-Angabe.md │ │ ├── LOG-Wert-fuer-AUS-ermitteln-als.md │ │ ├── LOG-Wert-fuer-EIN-ermitteln-als.md │ │ ├── LOG-Wert-fuer-Eingang-wird-ermittelt-durch.md │ │ ├── LOG-Absolute-Ausgabe.md │ │ ├── LOG-Eingang-ist-konstant.md │ │ ├── LOG-Ausgang-hat-eine-Treppenlichtfunktion.md │ │ ├── LOG-Art-der-Verbindung.md │ │ ├── LOG-Benutzerformeln.md │ │ ├── LOG-Ausgang-schaltet-zeitverzoegert.md │ │ ├── LOG-Auswahlfelder-fuer-Feiertage.md │ │ ├── LOG-Beschreibung-der-Benutzerformel.md │ │ ├── LOG-Relative-Angabe.md │ │ ├── LOG-Wert-EIN-intern-weiterleiten.md │ │ ├── LOG-Wert-AUS-intern-weiterleiten.md │ │ ├── LOG-Beschreibung-interner-Eingang.md │ │ ├── LOG-Nummer-des-zusaetzlichen-KO.md │ │ ├── LOG-Urlaubsbehandlung-aktivieren.md │ │ ├── LOG-DPT-des-Kommunikationsobjekts.md │ │ ├── LOG-Buzzer.md │ │ ├── LOG-Physikalische-Adresse.md │ │ ├── LOG-AUSschalten-wird-verzoegert-um.md │ │ ├── LOG-EINschalten-wird-verzoegert-um.md │ │ ├── LOG-Eingang-Trigger.md │ │ ├── LOG-Beschreibung-des-Kanals.md │ │ ├── LOG-Sichtbare-Kanaele.md │ │ ├── LOG-In-Betrieb-senden-alle.md │ │ ├── LOG-Nach-Neustart-Urlaubsinfo-lesen.md │ │ ├── LOG-Wert-fuer-EIN-senden-als-3-Byte-RGB.md │ │ ├── LOG-Treppenlicht-kann-verlaengert-werden.md │ │ ├── LOG-Beschreibung-Ausgang.md │ │ ├── LOG-AUS-Telegramm-wird-wiederholt-alle.md │ │ ├── LOG-EIN-Telegramm-wird-wiederholt-alle.md │ │ ├── LOG-Schaltwert.md │ │ ├── LOG-Benutzerformel-aktiv.md │ │ ├── LOG-Alarmausgabe-Buzzer-oder-LED-trotz-Sperre-schalten.md │ │ ├── LOG-Kommentar.md │ │ ├── LOG-Monat.md │ │ ├── LOG-Beschreibung-der-Zeitschaltuhr.md │ │ ├── LOG-Nach-Neuberechnung-Feiertagsinfo-senden.md │ │ ├── LOG-Beschreibung-Eingang.md │ │ ├── LOG-Loetpad-A-B-C-entspricht.md │ │ ├── LOG-Loetpad-A--B--C-entspricht.md │ │ ├── LOG-Wert-fuer-AUS-senden-als-3-Byte-RGB.md │ │ ├── LOG-Wochentage.md │ │ ├── LOG-Eingang-wird-gelesen-alle.md │ │ ├── LOG-Treppenlicht-kann-ausgeschaltet-werden.md │ │ ├── LOG-Akustischer-Signalgeber-vorhanden-Buzzer.md │ │ ├── LOG-Wochentag.md │ │ ├── LOG-Kanal-deaktivieren-zu-Testzwecken.md │ │ ├── LOG-Tag.md │ │ ├── LOG-Wert-fuer-AUS-senden-als.md │ │ ├── LOG-Zahlenwert.md │ │ ├── LOG-Zeit-bis-der-Kanal-nach-einem-Neustart-aktiv-wird.md │ │ ├── LOG-Verfuegbare-Kanaele.md │ │ ├── LOG-Wert-fuer-EIN-senden-als.md │ │ ├── LOG-Internen-Eingang-als-Trigger-nutzen-ist-immer-logisch-EIN.md │ │ ├── LOG-Optischer-Signalgeber-vorhanden-RGB-LED.md │ │ ├── LOG-Nummer-des-Kommunikationsobjekts.md │ │ ├── LOG-Art-der-Verknuepfung.md │ │ ├── LOG-Eingang-vorbelegen-mit.md │ │ ├── LOG-Internen-Eingang-verbinden-mit-Kanal-Nr.md │ │ ├── LOG-Uhrzeit-und-Datum-nach-einem-Neustart-vom-Bus-lesen.md │ │ ├── LOG-Internen-Eingang-verbinden-mit-Kanalausgang-Nr.md │ │ ├── LOG-Stunde.md │ │ ├── LOG-Minute.md │ │ ├── LOG-Ausgang-wiederholt-zyklisch.md │ │ ├── LOG-Feiertage-auf-dem-Bus-verfuegbar-machen.md │ │ ├── LOG-Logik-auswerten.md │ │ ├── LOG-Schaltzeiten-fortsetzen-von-Kanal.md │ │ ├── LOG-Zeit-bis-das-Geraet-nach-einem-Neustart-aktiv-wird.md │ │ ├── LOG-Darauffolgendes-AUS-fuehrt-zu.md │ │ ├── LOG-Darauffolgendes-EIN-fuehrt-zu.md │ │ ├── LOG-Uhrzeit-und-Datum-empfangen-ueber.md │ │ ├── LOG-Treppenlicht-blinkt-im-Rhythmus.md │ │ ├── LOG-Typ-der-Zeitschaltuhr.md │ │ ├── LOG-DPT-fuer-Ausgang.md │ │ ├── LOG-Interner-Eingang-n.md │ │ ├── LOG-Sommerzeit-ermitteln-durch.md │ │ ├── LOG-Eingang-n.md │ │ ├── LOG-Wiederholungsfilter.md │ │ ├── LOG-Feiertagsbehandlung.md │ │ ├── LOG-Tor-geht-sofort-wieder-zu.md │ │ ├── LOG-Sendeverhalten-fuer-Ausgang.md │ │ ├── LOG-Erneutes-EIN-fuehrt-zu.md │ │ ├── LOG-Erneutes-AUS-fuehrt-zu.md │ │ ├── LOG-Eigenes-KO-anzeigen.md │ │ ├── LOG-Urlaubsbehandlung.md │ │ ├── LOG-Benutzerformel-testen.md │ │ ├── LOG-DPT-fuer-Eingang.md │ │ ├── LOG-Beim-oeffnen-vom-Tor-wird.md │ │ ├── LOG-Beim-schliessen-vom-Tor-wird.md │ │ ├── LOG-Nur-so-lange-zyklisch-lesen-bis-erstes-Telegramm-eingeht.md │ │ ├── LOG-Wert-fuer-AUS-an-ein-zusaetzliches-KO-senden.md │ │ ├── LOG-Wert-fuer-EIN-an-ein-zusaetzliches-KO-senden.md │ │ ├── LOG-Logik-sendet-ihren-Wert-weiter.md │ │ ├── LOG-Kommunikationsobjekt-fuer-Eingang.md │ │ ├── LOG-Falls-Vorbelegung-aus-dem-Speicher-nicht-moeglich-oder-nicht-gewuenscht-dann-vorbelegen-mit.md │ │ ├── LOG-Logik-Operation.md │ │ ├── LOG-Eingangswert-speichern-und-beim-naechsten-Neustart-als-Vorbelegung-nutzen.md │ │ ├── LOG-Bei-Neustart-letzte-Schaltzeit-nachholen.md │ │ ├── LOG-Wert-fuer-AUS-senden.md │ │ ├── LOG-Wert-fuer-EIN-senden.md │ │ ├── LOG-Zeitbezug.md │ │ ├── LOG-Definition-der-Benutzerformel.md │ │ ├── LOG-Uebersicht-interne-KO.md │ │ └── LOG-Dokumentation.md │ └── Icons │ │ ├── chevron-right-box-outline.png │ │ └── dots-horizontal-circle-outline.png ├── TimerRestore.h ├── KnxHelper.h ├── ModuleVersionCheck.h ├── PCA9632.h ├── TimerRestore.cpp ├── TimerHoliday.h ├── KnxHelper.cpp ├── SunRiSet.h ├── tinyexpr.h ├── Timer.h ├── Logic.h ├── Logikmodul.script.js ├── Logikmodul.input-intko.part.xml ├── LogicValue.h ├── PCA9632.cpp ├── Logikmodul.userformula.part.xml ├── LogicFunctionUser.cpp └── Timer.cpp ├── doc ├── pics │ ├── PIO2.png │ ├── Szene.PNG │ ├── Urlaub.PNG │ ├── Ausgang.PNG │ ├── Feiertage.PNG │ ├── Hysterese.PNG │ ├── InfoPower.PNG │ ├── Kanalbaum.PNG │ ├── Konstante.png │ ├── LedColor.PNG │ ├── Schaltuhr.PNG │ ├── Vorschau.png │ ├── AusgangAUS.png │ ├── AusgangEIN.png │ ├── EingangDPT1.png │ ├── Einzelwerte.png │ ├── InfoEeprom.PNG │ ├── LogikSendet.PNG │ ├── Logikseite.PNG │ ├── ResetDevice.PNG │ ├── Uebersicht.PNG │ ├── Verzögerung.PNG │ ├── Dateiauswahl.png │ ├── Eingangseite.PNG │ ├── Git-Pull-Fetch.png │ ├── Logiktrigger.png │ ├── RelativDimmen.png │ ├── Rueckkopplung.PNG │ ├── Tagesschaltuhr.PNG │ ├── Tonwiedergabe.PNG │ ├── Tordefinition.png │ ├── Treppenlicht.PNG │ ├── Uebersicht-KO.png │ ├── WertEinSenden.PNG │ ├── Wertintervall.PNG │ ├── Zwangsführung.PNG │ ├── ZyklischSenden.PNG │ ├── Benutzerfunktion.png │ ├── InternerAusgang.png │ ├── InternerEingang.PNG │ ├── Jahresschaltuhr.PNG │ ├── Logikauswertung.png │ ├── Logikdefinition.png │ ├── Standardformeln.PNG │ ├── Standardformeln2.PNG │ ├── Ausgangskonverter.PNG │ ├── Differenzhysterese.PNG │ ├── Differenzintervall.PNG │ ├── EingangVorbelegen.png │ ├── WertSendenProzent.PNG │ ├── Wiederholungsfilter.PNG │ ├── BestehendesKoWarnung.png │ └── WertAnEinZusätzlichesKOSenden.png ├── examples │ ├── bsp03 │ │ ├── bsp03a-e1-zaehlwert.png │ │ ├── bsp03b-e1-zaehler.png │ │ ├── bsp03b-ko-belegung.png │ │ ├── bsp03b-e2-konstante-1.png │ │ ├── bsp03a-o-geraet-schalten.png │ │ ├── bsp03a-e2-einschaltsignal.png │ │ ├── bsp03b-o-betriebssekunden.png │ │ ├── bsp03b-i-interne-verknuepfung.png │ │ ├── bsp03a-betriebssekundenzaehler.png │ │ └── bsp03b-betriebssekundenzaehler-zaehlen.png │ ├── bsp05 │ │ ├── bsp05-ko-belegung.png │ │ ├── bsp05-a-ohne-funktion.png │ │ ├── bsp05-e1-zyklisch-lesen.png │ │ └── bsp05-read-nach-neustart.png │ ├── bsp06 │ │ ├── bsp06-1-farbe-lila.png │ │ ├── bsp06-ko-uebersicht.png │ │ ├── bsp06-1a-farbe-intern.png │ │ ├── bsp06-iko-uebersicht.png │ │ ├── bsp06-1e1-farbe-setzen.png │ │ └── bsp06-2a-effekt-intern.png │ ├── bsp04 │ │ ├── bsp04b-minutentrigger.png │ │ ├── bsp04b-s-schaltzeiten.png │ │ ├── bsp04c-duscherkennung.png │ │ ├── bsp04a-e2-minutentrigger.png │ │ ├── bsp04b-a-minuetlich-triggern.png │ │ ├── bsp04c-a-duschen-hat-begonnen.png │ │ ├── bsp04a-e1-aktuelle-luftfeuchte.png │ │ ├── bsp04c-e1-aktuelle-luftfeuchte.png │ │ ├── bsp04c-e2-vorherige-luftfeuchte.png │ │ ├── bsp04a-duscherkennung-vergleichswert.png │ │ └── bsp04a-a-duscherkennung-vergleichswert.png │ ├── bsp02 │ │ ├── bsp02a-szenen-controller.png │ │ ├── bsp02a-szenen-controller-a.png │ │ ├── bsp02a-szenen-controller-e1.png │ │ ├── bsp02a-szenen-controller-e2.png │ │ └── bsp02a-szenen-controller-ko.png │ └── bsp01 │ │ ├── bsp01e-schalten-alle-3-tage-tor.png │ │ ├── bsp01f-schalten-alle-3-tage-ga.png │ │ ├── bsp01d-schalten-alle-3-tage-reset.png │ │ ├── bsp01e-schalten-alle-3-tage-tor-e2.png │ │ ├── bsp01e-schalten-alle-3-tage-tor-i.png │ │ ├── bsp01e-schalten-alle-3-tage-tor-o.png │ │ ├── bsp01c-schalten-alle-3-tage-addierer.png │ │ ├── bsp01d-schalten-alle-3-tage-reset-e1.png │ │ ├── bsp01d-schalten-alle-3-tage-reset-o.png │ │ ├── bsp01a-schalten-alle-3-tage-schaltzeit.png │ │ ├── bsp01c-schalten-alle-3-tage-addierer-e1.png │ │ ├── bsp01c-schalten-alle-3-tage-addierer-e2.png │ │ ├── bsp01c-schalten-alle-3-tage-addierer-i.png │ │ ├── bsp01c-schalten-alle-3-tage-addierer-o.png │ │ ├── bsp01a-schalten-alle-3-tage-schaltzeit-i.png │ │ ├── bsp01a-schalten-alle-3-tage-schaltzeit-o.png │ │ ├── bsp01b-schalten-alle-3-tage-tagestrigger.png │ │ ├── bsp01b-schalten-alle-3-tage-tagestrigger-i.png │ │ └── bsp01b-schalten-alle-3-tage-tagestrigger-o.png ├── technical │ ├── Diagnose.txt │ ├── Schaltzeitpunkt-nachholen.txt │ └── Zeitschaltuhr-Konzept.txt ├── concept │ └── Text-Replacement-DPT16.txt ├── examplesConfigTransfer │ └── Betriebszeitzaehler.txt └── Applikationsbeschreibung-Editieren.md ├── .gitignore ├── library.json ├── README.md ├── .vscode └── tasks.json ├── .clang-format ├── lib └── README ├── include └── README └── .travis.yml /src/TODO.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/pics/PIO2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/PIO2.png -------------------------------------------------------------------------------- /doc/pics/Szene.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Szene.PNG -------------------------------------------------------------------------------- /doc/pics/Urlaub.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Urlaub.PNG -------------------------------------------------------------------------------- /doc/pics/Ausgang.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Ausgang.PNG -------------------------------------------------------------------------------- /doc/pics/Feiertage.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Feiertage.PNG -------------------------------------------------------------------------------- /doc/pics/Hysterese.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Hysterese.PNG -------------------------------------------------------------------------------- /doc/pics/InfoPower.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/InfoPower.PNG -------------------------------------------------------------------------------- /doc/pics/Kanalbaum.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Kanalbaum.PNG -------------------------------------------------------------------------------- /doc/pics/Konstante.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Konstante.png -------------------------------------------------------------------------------- /doc/pics/LedColor.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/LedColor.PNG -------------------------------------------------------------------------------- /doc/pics/Schaltuhr.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Schaltuhr.PNG -------------------------------------------------------------------------------- /doc/pics/Vorschau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Vorschau.png -------------------------------------------------------------------------------- /doc/pics/AusgangAUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/AusgangAUS.png -------------------------------------------------------------------------------- /doc/pics/AusgangEIN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/AusgangEIN.png -------------------------------------------------------------------------------- /doc/pics/EingangDPT1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/EingangDPT1.png -------------------------------------------------------------------------------- /doc/pics/Einzelwerte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Einzelwerte.png -------------------------------------------------------------------------------- /doc/pics/InfoEeprom.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/InfoEeprom.PNG -------------------------------------------------------------------------------- /doc/pics/LogikSendet.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/LogikSendet.PNG -------------------------------------------------------------------------------- /doc/pics/Logikseite.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Logikseite.PNG -------------------------------------------------------------------------------- /doc/pics/ResetDevice.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/ResetDevice.PNG -------------------------------------------------------------------------------- /doc/pics/Uebersicht.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Uebersicht.PNG -------------------------------------------------------------------------------- /doc/pics/Verzögerung.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Verzögerung.PNG -------------------------------------------------------------------------------- /src/Baggages/pics/OR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/OR.png -------------------------------------------------------------------------------- /doc/pics/Dateiauswahl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Dateiauswahl.png -------------------------------------------------------------------------------- /doc/pics/Eingangseite.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Eingangseite.PNG -------------------------------------------------------------------------------- /doc/pics/Git-Pull-Fetch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Git-Pull-Fetch.png -------------------------------------------------------------------------------- /doc/pics/Logiktrigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Logiktrigger.png -------------------------------------------------------------------------------- /doc/pics/RelativDimmen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/RelativDimmen.png -------------------------------------------------------------------------------- /doc/pics/Rueckkopplung.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Rueckkopplung.PNG -------------------------------------------------------------------------------- /doc/pics/Tagesschaltuhr.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Tagesschaltuhr.PNG -------------------------------------------------------------------------------- /doc/pics/Tonwiedergabe.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Tonwiedergabe.PNG -------------------------------------------------------------------------------- /doc/pics/Tordefinition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Tordefinition.png -------------------------------------------------------------------------------- /doc/pics/Treppenlicht.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Treppenlicht.PNG -------------------------------------------------------------------------------- /doc/pics/Uebersicht-KO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Uebersicht-KO.png -------------------------------------------------------------------------------- /doc/pics/WertEinSenden.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/WertEinSenden.PNG -------------------------------------------------------------------------------- /doc/pics/Wertintervall.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Wertintervall.PNG -------------------------------------------------------------------------------- /doc/pics/Zwangsführung.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Zwangsführung.PNG -------------------------------------------------------------------------------- /doc/pics/ZyklischSenden.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/ZyklischSenden.PNG -------------------------------------------------------------------------------- /src/Baggages/pics/AND.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/AND.png -------------------------------------------------------------------------------- /src/Baggages/pics/NAND.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/NAND.png -------------------------------------------------------------------------------- /src/Baggages/pics/NOR.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/NOR.gif -------------------------------------------------------------------------------- /src/Baggages/pics/NOT.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/NOT.gif -------------------------------------------------------------------------------- /src/Baggages/pics/RSFF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/RSFF.png -------------------------------------------------------------------------------- /src/Baggages/pics/XNOR.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/XNOR.gif -------------------------------------------------------------------------------- /src/Baggages/pics/XOR.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/pics/XOR.gif -------------------------------------------------------------------------------- /doc/pics/Benutzerfunktion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Benutzerfunktion.png -------------------------------------------------------------------------------- /doc/pics/InternerAusgang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/InternerAusgang.png -------------------------------------------------------------------------------- /doc/pics/InternerEingang.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/InternerEingang.PNG -------------------------------------------------------------------------------- /doc/pics/Jahresschaltuhr.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Jahresschaltuhr.PNG -------------------------------------------------------------------------------- /doc/pics/Logikauswertung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Logikauswertung.png -------------------------------------------------------------------------------- /doc/pics/Logikdefinition.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Logikdefinition.png -------------------------------------------------------------------------------- /doc/pics/Standardformeln.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Standardformeln.PNG -------------------------------------------------------------------------------- /doc/pics/Standardformeln2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Standardformeln2.PNG -------------------------------------------------------------------------------- /doc/pics/Ausgangskonverter.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Ausgangskonverter.PNG -------------------------------------------------------------------------------- /doc/pics/Differenzhysterese.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Differenzhysterese.PNG -------------------------------------------------------------------------------- /doc/pics/Differenzintervall.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Differenzintervall.PNG -------------------------------------------------------------------------------- /doc/pics/EingangVorbelegen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/EingangVorbelegen.png -------------------------------------------------------------------------------- /doc/pics/WertSendenProzent.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/WertSendenProzent.PNG -------------------------------------------------------------------------------- /doc/pics/Wiederholungsfilter.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/Wiederholungsfilter.PNG -------------------------------------------------------------------------------- /doc/pics/BestehendesKoWarnung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/BestehendesKoWarnung.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Breitengrad.md: -------------------------------------------------------------------------------- 1 | ### Breitengrad 2 | 3 | In dem Feld wird der Breitengrad des Standortes eingegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Laengengrad.md: -------------------------------------------------------------------------------- 1 | ### Längengrad 2 | 3 | In dem Feld wird der Längengrad des Standortes eingegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-oder-bei-Wert.md: -------------------------------------------------------------------------------- 1 | ### oder bei Wert 2 | 3 | Hier wird ein weiterer Wert der Werteliste angegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Watchdog-aktivieren.md: -------------------------------------------------------------------------------- 1 | ### Watchdog aktivieren 2 | 3 | Mit einem 'Ja' wird der Watchdog eingeschaltet. 4 | 5 | -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03a-e1-zaehlwert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03a-e1-zaehlwert.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-e1-zaehler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-e1-zaehler.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-ko-belegung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-ko-belegung.png -------------------------------------------------------------------------------- /doc/examples/bsp05/bsp05-ko-belegung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp05/bsp05-ko-belegung.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-1-farbe-lila.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-1-farbe-lila.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-ko-uebersicht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-ko-uebersicht.png -------------------------------------------------------------------------------- /doc/pics/WertAnEinZusätzlichesKOSenden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/pics/WertAnEinZusätzlichesKOSenden.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-e2-konstante-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-e2-konstante-1.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04b-minutentrigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04b-minutentrigger.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04b-s-schaltzeiten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04b-s-schaltzeiten.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04c-duscherkennung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04c-duscherkennung.png -------------------------------------------------------------------------------- /doc/examples/bsp05/bsp05-a-ohne-funktion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp05/bsp05-a-ohne-funktion.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-1a-farbe-intern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-1a-farbe-intern.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-iko-uebersicht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-iko-uebersicht.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-ist-EIN-bei-Wert.md: -------------------------------------------------------------------------------- 1 | ### Eingang ist EIN bei Wert 2 | 3 | Hier wird ein Wert der Werteliste angegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Von-Wert.md: -------------------------------------------------------------------------------- 1 | ### Von-Wert 2 | 3 | Hier wird der Von-Wert (also die untere Grenze) eines Wertebereichs angegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zeitzone.md: -------------------------------------------------------------------------------- 1 | ### Zeitzone 2 | 3 | Für die korrekte Berechnung der Zeit wird die Zeitzone des Standortes benötigt. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-oder-bei-Szene.md: -------------------------------------------------------------------------------- 1 | ### oder bei Szene 2 | 3 | Hier wird eine weitere Szene angegeben, die ausgewertet werden soll. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-oder-wenn-Wert-gleich.md: -------------------------------------------------------------------------------- 1 | ### oder wenn Wert gleich 2 | 3 | Hier wird ein weiterer Wert zum Vergleich angegeben. 4 | 5 | -------------------------------------------------------------------------------- /doc/examples/bsp02/bsp02a-szenen-controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp02/bsp02a-szenen-controller.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03a-o-geraet-schalten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03a-o-geraet-schalten.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04a-e2-minutentrigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04a-e2-minutentrigger.png -------------------------------------------------------------------------------- /doc/examples/bsp05/bsp05-e1-zyklisch-lesen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp05/bsp05-e1-zyklisch-lesen.png -------------------------------------------------------------------------------- /doc/examples/bsp05/bsp05-read-nach-neustart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp05/bsp05-read-nach-neustart.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-1e1-farbe-setzen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-1e1-farbe-setzen.png -------------------------------------------------------------------------------- /doc/examples/bsp06/bsp06-2a-effekt-intern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp06/bsp06-2a-effekt-intern.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Bis-Wert.md: -------------------------------------------------------------------------------- 1 | ### Bis-Wert 2 | 3 | Hier wird der Bis-Wert (also die obere Grenze) eines Wertebereichs angegeben. 4 | 5 | 6 | -------------------------------------------------------------------------------- /doc/examples/bsp02/bsp02a-szenen-controller-a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp02/bsp02a-szenen-controller-a.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03a-e2-einschaltsignal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03a-e2-einschaltsignal.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-o-betriebssekunden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-o-betriebssekunden.png -------------------------------------------------------------------------------- /src/Baggages/Icons/chevron-right-box-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/Icons/chevron-right-box-outline.png -------------------------------------------------------------------------------- /doc/examples/bsp02/bsp02a-szenen-controller-e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp02/bsp02a-szenen-controller-e1.png -------------------------------------------------------------------------------- /doc/examples/bsp02/bsp02a-szenen-controller-e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp02/bsp02a-szenen-controller-e2.png -------------------------------------------------------------------------------- /doc/examples/bsp02/bsp02a-szenen-controller-ko.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp02/bsp02a-szenen-controller-ko.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-i-interne-verknuepfung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-i-interne-verknuepfung.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04b-a-minuetlich-triggern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04b-a-minuetlich-triggern.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04c-a-duschen-hat-begonnen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04c-a-duschen-hat-begonnen.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Diagnoseobjekt-anzeigen.md: -------------------------------------------------------------------------------- 1 | ### Diagnoseobjekt anzeigen 2 | 3 | Mit einem 'Ja' wird das KO 7 'Diagnoseobjekt' freigeschaltet. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-ist-EIN-bei-Szene.md: -------------------------------------------------------------------------------- 1 | ### Eingang ist EIN bei Szene 2 | 3 | Hier wird eine Szene angegeben, die ausgewertet werden soll. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-ist-EIN-wenn-Wert-gleich.md: -------------------------------------------------------------------------------- 1 | ### Eingang ist EIN wenn Wert gleich 2 | 3 | Hier wird ein zu vergleichender Wert angegeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Grad.md: -------------------------------------------------------------------------------- 1 | ### Grad 2 | 3 | In dieser Spalte wird der Sonnenwinkel über oder unter dem Horizont eingestellt als Winkel in Grad. 4 | 5 | -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01f-schalten-alle-3-tage-ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01f-schalten-alle-3-tage-ga.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03a-betriebssekundenzaehler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03a-betriebssekundenzaehler.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04a-e1-aktuelle-luftfeuchte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04a-e1-aktuelle-luftfeuchte.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04c-e1-aktuelle-luftfeuchte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04c-e1-aktuelle-luftfeuchte.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04c-e2-vorherige-luftfeuchte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04c-e2-vorherige-luftfeuchte.png -------------------------------------------------------------------------------- /src/Baggages/Icons/dots-horizontal-circle-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/src/Baggages/Icons/dots-horizontal-circle-outline.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-e2.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-i.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01e-schalten-alle-3-tage-tor-o.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zeit-fuer-Treppenlicht.md: -------------------------------------------------------------------------------- 1 | ### Zeit für Treppenlicht 2 | 3 | Hier gibt man die Zeit an, die das Treppenlicht eingeschaltet bleiben soll. 4 | 5 | -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset-e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset-e1.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01d-schalten-alle-3-tage-reset-o.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04a-duscherkennung-vergleichswert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04a-duscherkennung-vergleichswert.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-e1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-e1.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-e2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-e2.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-i.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01c-schalten-alle-3-tage-addierer-o.png -------------------------------------------------------------------------------- /doc/examples/bsp03/bsp03b-betriebssekundenzaehler-zaehlen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp03/bsp03b-betriebssekundenzaehler-zaehlen.png -------------------------------------------------------------------------------- /doc/examples/bsp04/bsp04a-a-duscherkennung-vergleichswert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp04/bsp04a-a-duscherkennung-vergleichswert.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Naechste-Zeile-auswerten.md: -------------------------------------------------------------------------------- 1 | ### Nächste Zeile auswerten 2 | 3 | Wird die Checkbox angeklickt, wird die Zeile mit dem Wert ausgewertet, sonst nicht. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Sonnen-auf-untergang.md: -------------------------------------------------------------------------------- 1 | ### Sonnen auf-/untergang 2 | 3 | In dieser Spalte werden Stunden eingestellt als Versatz zum Sonnenauf- oder -untergang. 4 | 5 | -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit-i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit-i.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01a-schalten-alle-3-tage-schaltzeit-o.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger-i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger-i.png -------------------------------------------------------------------------------- /doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger-o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenKNX/OFM-LogicModule/HEAD/doc/examples/bsp01/bsp01b-schalten-alle-3-tage-tagestrigger-o.png -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Absolute-Angabe.md: -------------------------------------------------------------------------------- 1 | ### Absolute Angabe 2 | 3 | Als Eingabe wird die Nummer des Logikkanals erwartet, dessen Zeitschaltuhr fortgesetzt werden soll. 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-AUS-ermitteln-als.md: -------------------------------------------------------------------------------- 1 | ### Wert für AUS ermitteln als 2 | 3 | Der Wert des Ausgangs wird ermittelt durch die Berechnung der eingestellten Funktion. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-EIN-ermitteln-als.md: -------------------------------------------------------------------------------- 1 | ### Wert für EIN ermitteln als 2 | 3 | Der Wert des Ausgangs wird ermittelt durch die Berechnung der eingestellten Funktion. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-Eingang-wird-ermittelt-durch.md: -------------------------------------------------------------------------------- 1 | ### Wert für Eingang wird ermittelt durch 2 | 3 | Mit dem Auswahlfeld wird der passende Zahlenkonverter ausgewählt. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Absolute-Ausgabe.md: -------------------------------------------------------------------------------- 1 | ### Absolute Ausgabe 2 | 3 | Bei relativer Angabe wird die absolute Nummer des Kanals ausgerechnet, dessen Zeitschaltuhr fortgesetzt werden soll. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-ist-konstant.md: -------------------------------------------------------------------------------- 1 | ### Eingang ist konstant 2 | 3 | Der Eingang wird mit diesem konstanten Wert vorbelegt (z.B. um in Formeln weiter verrechnet zu werden). 4 | 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | **/*.knxprod 7 | **/*.debug.xml 8 | release/* 9 | doc/In-eigener-Sache.md 10 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Ausgang-hat-eine-Treppenlichtfunktion.md: -------------------------------------------------------------------------------- 1 | ### Ausgang hat eine Treppenlichtfunktion 2 | 3 | Wird hier ein "Ja" ausgewählt, erscheinen die Parameter für die Treppenlichtfunktion. 4 | 5 | -------------------------------------------------------------------------------- /doc/technical/Diagnose.txt: -------------------------------------------------------------------------------- 1 | Befehle: 2 | v - Firmware-Version 3 | s - Save-Buffer count 4 | l - Diagnose logik channel (leading zero necessary) 5 | > E11E20I11I2xA1 6 | > A1 B0 C1 Dx Q1 <-- der wird es -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Art-der-Verbindung.md: -------------------------------------------------------------------------------- 1 | ### Art der Verbindung 2 | 3 | Man kann die Angabe absolut machen (direkt die Nummer des Logikkanals) oder relativ (wie viele Kanäle vor- oder zurückzuspringen sind). 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Benutzerformeln.md: -------------------------------------------------------------------------------- 1 | ### Benutzerformeln 2 | 3 | Es ist möglich, bis zu 30 Benutzerformeln in der ETS-Applikation zu definieren und diese im Ausgangskonverter eines jeden Logikkanals verwenden. 4 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Ausgang-schaltet-zeitverzoegert.md: -------------------------------------------------------------------------------- 1 | ### Ausgang schaltet zeitverzögert 2 | 3 | Wird hier ein "Ja" ausgewählt, kann man im Folgenden angeben, was mit folgenden EIN- bzw. AUS-Signalen passieren soll. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Auswahlfelder-fuer-Feiertage.md: -------------------------------------------------------------------------------- 1 | ### Auswahlfelder für Feiertage 2 | 3 | Durch Auswahlfelder kann bestimmt werden, ob dieser Feiertag bei der Feiertagsinfo und bei den Zeitschaltuhren berücksichtigt werden soll. 4 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-der-Benutzerformel.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung der Benutzerformel 2 | 3 | Hier sollte eingetragen werden, was die Benutzerformel macht. Dieser Text dient der reinen Dokumentation und wird nicht zum Logikmodul übertragen. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Relative-Angabe.md: -------------------------------------------------------------------------------- 1 | ### Relative Angabe 2 | 3 | Als Eingabe wird Anzahl der Kanäle erwartet, die vor- oder zurückzuspringen sind. Dabei meint eine negative Zahl ein zurückspringen Richtung 1, eine positive Zahl ein Vorspringen Richtung 99. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-EIN-intern-weiterleiten.md: -------------------------------------------------------------------------------- 1 | ### Wert EIN intern weiterleiten 2 | 3 | Wird dieses Auswahlfeld gewählt, wird ein für diesen Ausgang ermitteltes EIN-Signal an alle internen Eingänge weitergeleitet, die mit diesem Ausgang verbunden sind. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-AUS-intern-weiterleiten.md: -------------------------------------------------------------------------------- 1 | ### Wert AUS intern weiterleiten 2 | 3 | Wird dieses Auswahlfeld gewählt, wird ein für diesen Ausgang ermitteltes AUS-Signal an alle internen Eingänge weitergeleitet, die mit diesem Ausgang verbunden sind. 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-interner-Eingang.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung interner Eingang 2 | 3 | Diese Feld erlaubt eine kurze Beschreibung, wozu dieser Eingang verwendet wird. Es hat keinen Einfluss auf die Funktion des Eingangs und dient rein zu Dokumentationszwecken. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Nummer-des-zusaetzlichen-KO.md: -------------------------------------------------------------------------------- 1 | ### Nummer des zusätzlichen KO 2 | 3 | Hier wird die Nummer des Kommunikationsobjekts angegeben, über die der Wert zusätzlich gesendet werden soll. Das kann ein beliebiges KO (Eingang oder Ausgang) des Gerätes sein. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Urlaubsbehandlung-aktivieren.md: -------------------------------------------------------------------------------- 1 | ### Urlaubsbehandlung aktivieren? 2 | 3 | Mit einem "Ja" wird ein Kommunikationsobjekt freigeschaltet, über das ein Urlaubstag dem Modul mitgeteilt werden kann. Ein "EIN" besagt, dass der aktuelle Tag ein Urlaubstag ist. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-DPT-des-Kommunikationsobjekts.md: -------------------------------------------------------------------------------- 1 | ### DPT des Kommunikationsobjekts 2 | 3 | 4 | Hier wird der DPT des KO erwartet, dessen Wert übernommen und über den Ausgang des Logikkanals gesendet werden soll. Falls dieser DPT anders ist als der DPT des Ausgangs, wird generisch konvertiert. 5 | 6 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Buzzer.md: -------------------------------------------------------------------------------- 1 | ### Buzzer 2 | 3 | Das Logikmodul unterstützt 3 verschiedene Töne bzw. Lautstärken für den Buzzer. 4 | In den Eingabefeldern kann man die Tonfrequenzen für die einzelnen Töne für Laut/Mittel und Leise angeben. Über die Tonhöhe werden indirekt auch die Lautstärken gesteuert. 5 | 6 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Physikalische-Adresse.md: -------------------------------------------------------------------------------- 1 | ### Physikalische Adresse 2 | 3 | 4 | Hier wird eine physikalische Adresse in der üblichen Punkt-Notation erwartet. Das KNX-Gerät mit dieser physikalischen Adresse wird zurückgesetzt. 5 | 6 | Dies entspricht genau der Funktion "Gerät zurücksetzen" in der ETS. 7 | 8 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-AUSschalten-wird-verzoegert-um.md: -------------------------------------------------------------------------------- 1 | ### AUSschalten wird verzögert um 2 | 3 | Wird hier eine Zahl größer 0 eingegeben, wird das AUS-Signal entsprechend der eingestellten Zeit verzögert am Ausgang des Funktionsmoduls ausgegeben. 4 | 5 | Wird eine 0 eingegeben, findet keine Verzögerung statt. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-EINschalten-wird-verzoegert-um.md: -------------------------------------------------------------------------------- 1 | ### EINschalten wird verzögert um 2 | 3 | Wird hier eine Zahl größer 0 eingegeben, wird das EIN-Signal entsprechend der eingestellten Zeit verzögert am Ausgang des Funktionsmoduls ausgegeben. 4 | 5 | Wird eine 0 eingegeben, findet keine Verzögerung statt. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-Trigger.md: -------------------------------------------------------------------------------- 1 | ### Eingang-Trigger 2 | 3 | Man kann die Eingänge ankreuzen, auf die die Logikauswertung reagieren soll. Nur wenn ein Telegramm von einem dieser Eingänge kommt, wird die Logikauswertung angestoßen und das Ergebnis ermittelt und an den nächsten Funktionsblock weitergeleitet. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-des-Kanals.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung des Kanals 2 | 3 | Der hier vergebene Name hat keinen funktionalen Einfluss, erlaubt es aber, dem Kanal einen eigenen Namen zu geben, und ihn so leichter wiederzufinden. Der Name wird im Kanalbaum dargestellt und statt des Standardtextes "..." genommen. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Sichtbare-Kanaele.md: -------------------------------------------------------------------------------- 1 | ### Sichtbare Kanäle 2 | 3 | Um die Applikation übersichtlicher zu gestalten, kann hier ausgewählt werden, wie viele Logikkanäle in der Applikation sichtbar und editierbar sind. Die Maximalanzahl der Kanäle hängt von der Firmware des Gerätes ab, dass das Logikmodul verwendet. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-In-Betrieb-senden-alle.md: -------------------------------------------------------------------------------- 1 | ### In Betrieb senden alle 2 | 3 | Das Gerät kann einen Status "Ich bin noch in Betrieb" über das KO 1 senden. Hier wird das Sendeintervall eingestellt. 4 | 5 | Sollte hier eine 0 angegeben werden, wird kein "In Betrieb"-Signal gesendet und das KO 1 steht nicht zur Verfügung. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Nach-Neustart-Urlaubsinfo-lesen.md: -------------------------------------------------------------------------------- 1 | ### Nach Neustart Urlaubsinfo lesen? 2 | 3 | Erscheint nur, wenn "Urlaubsbehandlung aktivieren?" auf "Ja" steht. 4 | 5 | Hier kann angegeben werden, ob nach einem Neustart des Moduls die Information, ob der aktuelle Tag ein Urlaubstag ist, vom Bus gelesen werden soll. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-EIN-senden-als-3-Byte-RGB.md: -------------------------------------------------------------------------------- 1 | ### Wert für EIN senden (als 3 Byte RGB) 2 | 3 | 4 | Hier wird die Farbe bestimmt, deren Wert gesendet werden soll. Wird die Farbe Schwarz gewählt (#000000), entspricht das einem Ausschalt-Signal. Für die Auswahl der Farbe kann auch ein Farbauswahldialog verwendet werden. 5 | 6 | -------------------------------------------------------------------------------- /doc/concept/Text-Replacement-DPT16.txt: -------------------------------------------------------------------------------- 1 | T: 15°, H: AUS 2 | T: %2.0E1°, H: %(EIN|AUS)E2 3 | 01234567890123 567890123456789 4 | 5 | Nicht Heizen 6 | %(Heizen|Nicht Heizen)E1% 7 | %(|Nicht )E1%Heizen 8 | 01234567890123 567890123456789 9 | 10 | 17.5°C, 249 Lux 11 | %2.1E1%°C, %3.0E2% Lux 12 | 01234567890123 567890123456789 13 | 14 | Regen: Ja, stark -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Treppenlicht-kann-verlaengert-werden.md: -------------------------------------------------------------------------------- 1 | ### Treppenlicht kann verlängert werden 2 | 3 | Wählt man hier "Ja", führt ein erneutes EIN-Signal am Eingang des Funktionsblocks zum erneuten Anlaufen der Zeitzählung bei 0. Somit wird die Treppenlichtzeit zurückgesetzt und beginnt von neuem, die Treppenlichtzeit wurde somit verlängert. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-Ausgang.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung Ausgang 2 | 3 | Diese Einstellung hat keine funktionale Auswirkung, erlaubt es aber, dem Ausgang einen Text zu geben, um ihn einfacher zu finden. 4 | 5 | Der eingegebene Text erscheint auf dem Ausgang-Tag des Logikkanals und als Name des Kommunikationsobjekts, das diesem Ausgang zugeordnet ist. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-AUS-Telegramm-wird-wiederholt-alle.md: -------------------------------------------------------------------------------- 1 | ### AUS-Telegramm wird wiederholt alle 2 | 3 | Das Feld erscheint nur, wenn bei "Ausgang wiederholt zyklisch" ein "Ja" ausgewählt wurde. 4 | 5 | Die hier eingegebene Zahl bestimmt das Zeitintervall, in dem dem das AUS-Signal wiederholt wird. 6 | 7 | Die Eingabe einer 0 deaktiviert eine Wiederholung. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-EIN-Telegramm-wird-wiederholt-alle.md: -------------------------------------------------------------------------------- 1 | ### EIN-Telegramm wird wiederholt alle 2 | 3 | Das Feld erscheint nur, wenn bei "Ausgang wiederholt zyklisch" ein "Ja" ausgewählt wurde. 4 | 5 | Die hier eingegebene Zahl bestimmt das Zeitintervall, in dem dem das EIN-Signal wiederholt wird. 6 | 7 | Die Eingabe einer 0 deaktiviert eine Wiederholung. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Schaltwert.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Wert (Logik) 2 | 3 | Ist sowohl bei Tagesschaltuhr und Jahresschaltuhr vorhanden. 4 | 5 | In dieser Spalte wird der Wert eingestellt, den der Schaltpunkt an den Ausgang senden soll. Dieser (rein boolesche) Wert durchläuft dann das normale Ausgangs-Processing des Logikkanals und steht am Ausgangs-KO zur Verfügung. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Benutzerformel-aktiv.md: -------------------------------------------------------------------------------- 1 | ### Benutzerformel aktiv 2 | 3 | Mit dieser Checkbox aktiviert man die entsprechende Benutzerformel. Eine eventuell in der Firmware implementierte Benutzerfunktion mit der gleichen Nummer wird deaktiviert. Es erscheinen 2 Eingabefelder, eines um die Benutzerformel zu beschreiben und eines, um die Benutzerformel einzugeben. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Alarmausgabe-Buzzer-oder-LED-trotz-Sperre-schalten.md: -------------------------------------------------------------------------------- 1 | ### Alarmausgabe (Buzzer oder LED trotz Sperre schalten)? 2 | 3 | Wenn die Einstellung aktiviert ist, wird eine akustische oder optische Ausgabe trotz Sperre vorgenommen. 4 | 5 | So können bestimmte Töne oder RGB-Anzeigen als Alarm definiert werden. Alarme können nicht durch entsprechende Sperren abgeschaltet werden. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Kommentar.md: -------------------------------------------------------------------------------- 1 | ### Kommentar 2 | 3 | Hier kann man einen Freitext eingeben, der die Logik beschreibt. Dieser Text kann mehrzeilig sein. Leider unterstützt die ETS von sich aus keine mehrzeiligen Texte. Mit dem Button unter der Textbox kann man alle Eingaben der Zeichenfolge '\n' in neue Zeilen umwandeln lassen. 4 | 5 | Ein Kommentar kann aus maximal 512 Zeichen bestehen. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Monat.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Monat 2 | 3 | Ist nur bei der Jahresschaltuhr vorhanden. 4 | 5 | In dieser Spalte wird der Monat eingestellt, an dem geschaltet werden soll. 6 | 7 | Wird hier der Wert "jeder" ausgewählt, wird der Schaltpunkt jeden Monat ausgeführt, natürlich unter Berücksichtigung des angegebenen Tages. So kann man Monatlich wiederkehrende Aktionen definieren. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-der-Zeitschaltuhr.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung der Zeitschaltuhr 2 | 3 | Diese Feld erlaubt eine kurze Beschreibung, wozu diese Zeitschaltuhr verwendet wird. Es hat keinen Einfluss auf die Funktion und dient rein zu Dokumentationszwecken. Der Text wird in der Seitenbeschreibung statt dem Wort "unbenannt" genommen und erlaubt so ein einfacheres wiederfinden der Zeitschaltuhr. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Nach-Neuberechnung-Feiertagsinfo-senden.md: -------------------------------------------------------------------------------- 1 | ### Nach Neuberechnung Feiertagsinfo senden? 2 | 3 | Erscheint nur, wenn "Feiertage auf dem Bus verfügbar machen?" auf "Ja" steht. 4 | 5 | Hier kann angegeben werden, ob ein neuer Feiertag aktiv auf den Bus gesendet wird. Falls "Nein" eingestellt ist, wird der Feiertag trotzdem berechnet, muss aber mit einem Lese-Request aktiv vom KO gelesen werden. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beschreibung-Eingang.md: -------------------------------------------------------------------------------- 1 | ### Beschreibung Eingang 2 | 3 | Dieses Feld hat keine funktionale Auswirkung. Es erlaubt den Eingang zu benennen und diesen so leichter wiederzufinden, erhöht somit die Übersichtlichkeit. 4 | 5 | Der hier angegebene Text erscheint in der Seitenbeschreibung "Eingang n: unbenannt" statt dem Wort "unbenannt" und als Name des Kommunikationsobjektes, das zu diesem Eingang gehört. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Loetpad-A-B-C-entspricht.md: -------------------------------------------------------------------------------- 1 | ### RGB-LED 2 | 3 | Da RGB-LED unterschiedliche Pin-Belegungen für die Farben Rot, Grün und Blau haben, kann es passieren, dass man nach dem anlöten der LED feststellt, dass man falsche Farben präsentiert bekommt. 4 | 5 | An dieser Stelle kann man die Pinbelegung für Rot/Grün/Blau in verschiedenen Permutationen einstellen und so softwareseitig mögliche Belegungsprobleme beseitigen. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Loetpad-A--B--C-entspricht.md: -------------------------------------------------------------------------------- 1 | ### RGB-LED 2 | 3 | Da RGB-LED unterschiedliche Pin-Belegungen für die Farben Rot, Grün und Blau haben, kann es passieren, dass man nach dem anlöten der LED feststellt, dass man falsche Farben präsentiert bekommt. 4 | 5 | An dieser Stelle kann man die Pinbelegung für Rot/Grün/Blau in verschiedenen Permutationen einstellen und so softwareseitig mögliche Belegungsprobleme beseitigen. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-AUS-senden-als-3-Byte-RGB.md: -------------------------------------------------------------------------------- 1 | ### Wert für AUS senden (als 3 Byte RGB) 2 | 3 | Das Feld erscheint nur, wenn für "DPT für Ausgang" ein "DPT 323.xxx (3-Byte-Wert)" ausgewählt wurde. 4 | 5 | Hier wird die Farbe bestimmt, deren Wert gesendet werden soll. Wird die Farbe Schwarz gewählt (#000000), entspricht das einem Ausschalt-Signal. Für die Auswahl der Farbe kann auch ein Farbauswahldialog verwendet werden. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wochentage.md: -------------------------------------------------------------------------------- 1 | ### Spalten: Mo, Di, Mi, Do, Fr, Sa, So 2 | 3 | Sind nur bei der Jahresschaltuhr vorhanden. 4 | 5 | Die Spalten sind nur eingabebereit, wenn in der Spalte Typ der Wert "Wochentag" ausgewählt wurde. 6 | 7 | Man kann die Wochentage auswählen, an den für diesen Schaltpunkt geschaltet werden soll, natürlich unter Berücksichtigung der restlichen Angaben. So kann man Aktionen an bestimmten Wochentagen definieren. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-wird-gelesen-alle.md: -------------------------------------------------------------------------------- 1 | ### Eingang wird alle n Sekunden gelesen (0=nicht zyklisch lesen) 2 | 3 | Erscheint nur, wenn bei "Kommunikationsobjekt für Eingang" der Wert "Eigenes KO" ausgewählt ist. 4 | 5 | Manche Geräte können nicht von sich aus zyklisch senden. Hier kann man einstellen, dass ein Eingang aktiv den Wert zyklisch liest. In den Feld kann man angeben, wie viele Sekunden zwischen 2 Leseintervallen vergehen sollen. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Treppenlicht-kann-ausgeschaltet-werden.md: -------------------------------------------------------------------------------- 1 | ### Treppenlicht kann ausgeschaltet werden 2 | 3 | Wählt man hier ein "Ja", führt ein AUS-Signal am Eingang des Funktionsmoduls zum sofortigen Beenden des Treppenlichts und einem AUS-Signal am Ausgang des Funktionsmoduls. 4 | 5 | Ist ein "Nein" ausgewählt, wird ein AUS-Signal am Eingang des Funktionsmoduls ignoriert und hat keine Auswirkungen, solange das Treppenlicht eingeschaltet ist. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Akustischer-Signalgeber-vorhanden-Buzzer.md: -------------------------------------------------------------------------------- 1 | ### Akustischer Signalgeber vorhanden (Buzzer)? 2 | 3 | Das Logikmodul unterstützt auch die Ausgabe von Pieptönen mittels eines Buzzers. Mit einem Haken in diesem Feld wird angegeben, ob ein Buzzer installiert ist. 4 | 5 | Gleichzeitig wird ein Kommunikationsobjekt freigeschaltet, mit dem man die Soundausgabe sperren kann. Damit kann man verhindern, dass z.B. nachts Töne ausgegeben werden. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wochentag.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Wochentag 2 | 3 | Ist nur bei der Tagesschaltuhr vorhanden. 4 | 5 | In dieser Spalte wird der Wochentag eingestellt, an dem der Schaltpunkt ausgeführt werden soll. Es kann nur genau ein Wochentag ausgewählt werden. 6 | 7 | Wird hier der Wert "jeder" ausgewählt, wird der Schaltpunkt an jedem Wochentag ausgeführt, natürlich unter Berücksichtigung der restlichen Angaben. So kann man täglich wiederkehrende Aktionen definieren. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Kanal-deaktivieren-zu-Testzwecken.md: -------------------------------------------------------------------------------- 1 | ### Kanal deaktivieren (zu Testzwecken) 2 | 3 | Dieser Logikkanal ist außer Funktion. Er kann vollständig definiert sein und keine Einstellung geht verloren, aber der Ausgang wird kein Telegramm senden. Dies bietet die Möglichkeit, zu Testzwecken einen bereits parametrierten Logikkanal inaktiv zu setzen, um zu schauen, ob er die Ursache für eventuelles Fehlverhalten im Haus ist. Kann zur Fehlersuche hilfreich sein. 4 | 5 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Tag.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Tag 2 | 3 | Ist nur bei der Jahresschaltuhr vorhanden. 4 | 5 | Die Spalte ist nur eingabebereit, wenn in der Spalte Typ der Wert "Tag" ausgewählt wurde. 6 | 7 | In dieser Spalte wird der Tag eingestellt, an dem geschaltet werden soll. 8 | 9 | Wird hier der Wert "jeder" ausgewählt, wird der Schaltpunkt jeden Tag ausgeführt, natürlich unter Berücksichtigung des angegebenen Monats. So kann man täglich wiederkehrende Aktionen definieren. 10 | 11 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-AUS-senden-als.md: -------------------------------------------------------------------------------- 1 | ### Wert für AUS senden als 2 | 3 | Das Feld erscheint nur, wenn für "Wert für AUS senden" ein "Ja - Wert vorgeben" ausgewählt wurde. 4 | 5 | Hier wird ein konstanter Wert erwartet, der zu dem Ausgewählten DPT für den Ausgang passt. Dieser eingegebene Wert wird auf den KNX-Bus bei einem AUS-Signal gesendet. 6 | 7 | Man kann dies z.B. auch zur Invertierung nutzen, indem bei einem DPT 1 für ein AUS-Signal der Wert EIN gesendet wird und umgekehrt. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zahlenwert.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Wert (als E1) 2 | 3 | Ist sowohl bei Tagesschaltuhr und Jahresschaltuhr vorhanden. 4 | 5 | In dieser Spalte wird der Wert eingestellt, den der Schaltpunkt als Zahl repräsentieren soll. Es ist nur 1 Byte (0-255) möglich. 6 | Im Ausgangskonverter kann der Wert so angesprochen werden wie bei normalen Logiken der Wert vom Eingang E1. Man kann diesen Wert also über den Ausgang senden lassen, in Formeln verrechnen oder in Benutzerformeln als E1 nutzen. 7 | 8 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zeit-bis-der-Kanal-nach-einem-Neustart-aktiv-wird.md: -------------------------------------------------------------------------------- 1 | ### Zeit bis der Kanal nach einem Neustart aktiv wird 2 | 3 | Neben "Allgemeine Parameter -> Zeit bis das Gerät nach einem Neustart aktiv wird" kann auch noch pro Kanal eine Startverzögerung sinnvoll sein. 4 | 5 | 6 | Die Verzögerungszeit wird hier angegeben. 7 | 8 | **Anmerkung:** Auch wenn man hier technisch bis zu 16.000 Stunden Verzögerung angeben kann, sind nur Einstellungen im Sekundenbereich sinnvoll. 9 | 10 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Verfuegbare-Kanaele.md: -------------------------------------------------------------------------------- 1 | ### Verfügbare Kanäle 2 | 3 | Um die Applikation übersichtlicher zu gestalten, kann hier ausgewählt werden, wie viele Logikkanäle in der Applikation verfügbar und editierbar sind. Die Maximalanzahl der Kanäle hängt von der Firmware des Gerätes ab, dass das Logikmodul verwendet. 4 | 5 | Die ETS ist auch schneller in der Anzeige, wenn sie weniger (leere) Kanäle darstellen muss. Insofern macht es Sinn, nur so viele Kanäle anzuzeigen, wie man wirklich braucht. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-EIN-senden-als.md: -------------------------------------------------------------------------------- 1 | ### Wert für EIN senden als 2 | 3 | 4 | Das Feld erscheint nur, wenn für "Wert für EIN senden" ein "Ja - Wert vorgeben" ausgewählt wurde. 5 | 6 | Hier wird ein konstanter Wert erwartet, der zu dem Ausgewählten DPT für den Ausgang passt. Dieser eingegebene Wert wird auf den KNX-Bus bei einem EIN-Signal gesendet. 7 | 8 | Man kann dies z.B. auch zur Invertierung nutzen, indem bei einem DPT 1 für ein EIN-Signal der Wert AUS gesendet wird und umgekehrt. 9 | 10 | -------------------------------------------------------------------------------- /library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "OFM-LogicModule", 3 | "version": "3.8.0", 4 | "description": "Logic module for the knx stack, can be embedded in an ETS application", 5 | "homepage": "https://openknx.de", 6 | "authors": { 7 | "name": "OpenKNX", 8 | "email": "info@openknx.de", 9 | "url": "https://openknx.de", 10 | "maintainer": true 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/OpenKNX/OFM-LogicModule" 15 | } 16 | } -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Internen-Eingang-als-Trigger-nutzen-ist-immer-logisch-EIN.md: -------------------------------------------------------------------------------- 1 | ### Internen Eingang als Trigger nutzen (ist immer logisch EIN) 2 | 3 | Man kann einen internen Eingang auch als reinen Trigger nutzen, unabhängig von seinem Wert. Dies entspricht genau dem Eingangskonverter eines Normalen (KO-Basierten) Eingangs. 4 | 5 | Wird diese Funktion gewählt, wird jeder Wert, den der Eingang bekommt, in ein EIN gewandelt und damit die Logik getriggert. Falls die Logik ein AUS erfordert, kann man den Eingang invertiert aktivieren. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Optischer-Signalgeber-vorhanden-RGB-LED.md: -------------------------------------------------------------------------------- 1 | ### Optischer Signalgeber vorhanden (RGB-LED)? 2 | 3 | Das Logikmodul unterstützt auch die Ausgabe eines Lichtsignals mittels einer RGB-LED. Mit einem Haken in diesem Feld wird angegeben, ob eine RGB-LED installiert ist. 4 | 5 | Gleichzeitig wird ein Kommunikationsobjekt freigeschaltet, mit dem man die Lichtausgabe sperren kann. Damit kann man verhindern, dass z.B. nachts die LED leuchtet. Oder man schaltet die LED nur bei Präsenz ein und schont damit die Leuchtkraft der LED. 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | OpenKNX - LogicModule 2 | === 3 | 4 | Implementation of a knx logic module with up to 99 logic channels based on the [knx stack](https://github.com/OpenKNX/knx), a fork from [thelsing](https://github.com/thelsing/knx). 5 | 6 | Application description (including a feature overview) can be found [here](https://github.com/OpenKNX/OFM-LogicModule/blob/v1/doc/Applikationsbeschreibung-Logik.md). 7 | 8 | It supports the SAMD and RP2040 version of the stack. 9 | 10 | It is a PlatformIO project and needs a working ETS >=5.7 installed on the same PC. 11 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Nummer-des-Kommunikationsobjekts.md: -------------------------------------------------------------------------------- 1 | ### Nummer des Kommunikationsobjekts 2 | 3 | Hier steht immer die Nummer des Kommunikationsobjekts, das als Eingang für diesen Kanal fungiert. 4 | 5 | Falls ein neues Kommunikationsobjekt erzeugt wurde, ist die Nummer nicht änderbar und nur zur Information. 6 | 7 | Falls ein bestehendes Kommunikationsobjekt genutzt werden soll, wird in dem Feld die Nummer des zu nutzenden Kommunikationsobjekts angegeben. Dieses KO muss existieren und es darf nicht ausgeblendet sein. Es muss keine GA mit dem Objekt verbunden sein. 8 | 9 | -------------------------------------------------------------------------------- /doc/technical/Schaltzeitpunkt-nachholen.txt: -------------------------------------------------------------------------------- 1 | Es wird erstmal der korrekte Tag festgestellt 2 | Dann wird die Uhrzeit in eine Liste eingetragen: 3 | - 15:17 -> 1517 4 | - 23:45 -> 2345 5 | - *:05 -> 23:05 -> 2305 6 | - 20:* -> 20:59 -> 2059 7 | 8 | In dem Beispiel gewinnt dann 2345. 9 | 10 | Also folgendermaßen durch die Liste gehen: 11 | - Zeit ermitteln: 12 | - Sonnenauf- oder Untergang 13 | - offset dazurechnen 14 | - * für Stunde wird 23 15 | - * für Minute wird 59 16 | - ist Zeit größer (später) als bisherige 17 | - Schaltwert merken 18 | 19 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Art-der-Verknuepfung.md: -------------------------------------------------------------------------------- 1 | ### Art der Verknüpfung 2 | 3 | Hier wird ausgewählt, wie die Verknüpfung erfolgen soll. 4 | 5 | #### absolut 6 | 7 | Wenn absolut ausgewählt wird, muss die Nummer des Kanals, dessen Ausgang mit diesem Eingang verknüpft werden soll, angegeben werden. 8 | 9 | #### relativ 10 | 11 | Wenn relativ ausgewählt wird, muss angegeben werden, wie viele Kanäle vor (positive Zahl) oder zurück (negative Zahl) der Kanal liegt, dessen Ausgang mit diesem Eingang verknüpft werden soll. In einem weiteren Feld wird die Nummer des Zielkanals ausgerechnet und ausgegeben. 12 | 13 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-vorbelegen-mit.md: -------------------------------------------------------------------------------- 1 | ### Eingang vorbelegen mit 2 | 3 | 4 | Dieses Auswahlfeld erlaubt eine Vorbelegung mit einem festgelegten Wert beim Neustart des Logikmoduls. 5 | 6 | #### nichts (undefiniert) 7 | 8 | Der Eingang wird nicht vorbelegt und bleibt undefiniert, bis ein erstes Telegramm vom KNX-Bus empfangen wird. 9 | 10 | #### AUS (0) 11 | 12 | Der Eingang wird konstant mit einer 0 vorbelegt und hat somit sofort einen definierten Zustand. 13 | 14 | #### EIN (1) 15 | 16 | Der Eingang wird konstant mit einer 1 vorbelegt und hat somit sofort einen definierten Zustand. 17 | 18 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Internen-Eingang-verbinden-mit-Kanal-Nr.md: -------------------------------------------------------------------------------- 1 | ### Internen Eingang verbinden mit Kanal Nr. 2 | 3 | Als Eingabe wird hier die Nummer der Logik erwartet, deren Ausgang als interner Eingang genutzt werden soll. Solange der Eingang nicht verbunden ist (Wert im Eingabefeld ist 0) erscheint eine Warnmeldung, dass der Eingang inaktiv (undefiniert) ist. 4 | 5 | Es kann auch der Ausgang des aktuellen Kanals als interner Eingang verwendet werden. Da dies aber schwer abzusehende Seiteneffekte haben kann, die im Falle einer Schleife auch den Bus mit vielen Telegrammen fluten können, erscheint in einem solchen Fall eine Warnung: 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Uhrzeit-und-Datum-nach-einem-Neustart-vom-Bus-lesen.md: -------------------------------------------------------------------------------- 1 | ### Uhrzeit und Datum nach einem Neustart vom Bus lesen 2 | 3 | Nach einem Neustart können Uhrzeit und Datum auch aktiv über Lesetelegramme abgefragt werden. Mit diesem Parameter wird bestimmt, ob Uhrzeit und Datum nach einem Neustart aktiv gelesen werden. 4 | 5 | Wenn dieser Parameter gesetzt ist, wird die Uhrzeit und das Datum alle 20-30 Sekunden über ein Lesetelegramm vom Bus gelesen, bis eine entsprechende Antwort kommt. Falls keine Uhr im KNX-System vorhanden ist oder die Uhr nicht auf Leseanfragen antworten kann, sollte dieser Parameter auf "Nein" gesetzt werden. 6 | 7 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Internen-Eingang-verbinden-mit-Kanalausgang-Nr.md: -------------------------------------------------------------------------------- 1 | ### Internen Eingang verbinden mit Kanalausgang Nr. 2 | 3 | Als Eingabe wird hier die Nummer der Logik erwartet, deren Ausgang als interner Eingang genutzt werden soll. Solange der Eingang nicht verbunden ist (Wert im Eingabefeld ist 0) erscheint eine Warnmeldung, dass der Eingang inaktiv (undefiniert) ist. 4 | 5 | Es kann auch der Ausgang des aktuellen Kanals als interner Eingang verwendet werden. Da dies aber schwer abzusehende Seiteneffekte haben kann, die im Falle einer Schleife auch den Bus mit vielen Telegrammen fluten können, erscheint in einem solchen Fall eine Warnung: 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Stunde.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Stunde/Grad 2 | 3 | Ist sowohl bei Tagesschaltuhr und Jahresschaltuhr vorhanden. 4 | 5 | In dieser Spalte werden Stunden eingestellt, entweder als absolute Uhrzeit oder als Versatz zum Sonnenauf- oder -untergang. 6 | 7 | Wird hier der Wert "jede" ausgewählt, wird der Schaltpunkt jede Stunde ausgeführt, natürlich unter Berücksichtigung der angegebenen Minuten. So kann man stündlich wiederkehrende Aktionen definieren. Der Wert "jede" steht nur zur Verfügung, wenn der Zeitbezug auf "Zeitpunkt" steht. 8 | 9 | Bei Sonnenstandsangaben (Winkel über/unter dem Horizont) wird in dieser Spalte der Winkel angegeben. 10 | 11 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Minute.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Minute 2 | 3 | Ist sowohl bei Tagesschaltuhr und Jahresschaltuhr vorhanden. 4 | 5 | In dieser Spalte werden Minuten eingestellt, entweder als absolute Uhrzeit oder als Versatz zum Sonnenauf- oder -untergang. 6 | 7 | Wird hier der Wert "jede" ausgewählt, wird der Schaltpunkt jede Minute ausgeführt, natürlich unter Berücksichtigung der angegebenen Stunde. So kann man minütlich wiederkehrende Aktionen definieren. Der Wert "jede" steht nur zur Verfügung, wenn der Zeitbezug auf "Zeitpunkt" steht. 8 | 9 | Bei Sonnenstandsangaben (Winkel über/unter dem Horizont) wird in dieser Spalte der Winkelbruchteil in (Winkel-)Minuten angegeben. 10 | 11 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "OpenKNXproducer Documentation", 8 | "type": "shell", 9 | "command": "~/bin/OpenKNXproducer.exe", 10 | "args": [ 11 | "baggages", 12 | "--DocFileName", 13 | "doc/Applikationsbeschreibung-Logik.md", 14 | "--BaggagesDir", 15 | "src/Baggages/Help_de", 16 | "--Prefix", 17 | "LOG" 18 | ], 19 | "problemMatcher": [], 20 | "group": "test" 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /src/TimerRestore.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /*********************************** 4 | * 5 | * This timer is just use for timer restore function during startup 6 | * 7 | * *********************************/ 8 | 9 | #include "Timer.h" 10 | 11 | class TimerRestore : public Timer 12 | { 13 | private: 14 | TimerRestore(); 15 | ~TimerRestore(); 16 | TimerRestore(const TimerRestore&); // make copy constructor private 17 | TimerRestore &operator=(const TimerRestore&); // prevent copy 18 | void doDayCalculations(); 19 | uint16_t mDayIteration = 0; 20 | 21 | public: 22 | // singleton! 23 | static TimerRestore &instance(); 24 | void setup(Timer &iTimer); 25 | void decreaseDay(); 26 | uint16_t getDayIteration(); 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /doc/examplesConfigTransfer/Betriebszeitzaehler.txt: -------------------------------------------------------------------------------- 1 | OpenKNX,cv1,0xA012:0x31/LOG:0x33/1§f~Name=Betriebsstundenz%C3%A4hler%20Schalten§f~Logic=4§f~Trigger=0§f~TriggerGateClose=1§f~TriggerGateOpen=3§f~NameInput1=Z%C3%A4hlerwert§f~E1=1§f~E1Dpt=13§f~E1UseOtherKO=1§f~E1OtherKO:2=925§f~E1DefaultExt=2§f~E1LowDpt12:1=0§f~E1HighDpt12:1=10§f~NameInput2=Einschaltsignal§f~E2=1§f~NameOutput=Ger%C3%A4t%20schalten§;OpenKNX 2 | OpenKNX,cv1,0xA012:0x31/LOG:0x33/2§f~Name=Betriebsstundenz%C3%A4hler%3A%20Z%C3%A4hlen§f~Logic=2§f~OInternalOff=0§f~Trigger=0§f~I1Name=Schaltausgang%20Ger%C3%A4t§f~I1=1§f~I1Function=1§f~NameOutput=Betriebssekunden§f~ORepeatOnBase=0§f~ORepeatOnTime=1§f~ORepeat=1§f~OOutputFilter=3§f~ODpt=13§f~OOnBuzzer=8§f~OOnAll=8§f~OOnFunction=18§f~OOnKOSend=1§f~OOnKOSendNumber=920§f~OOffBuzzer=0§f~OOffAll=0§;OpenKNX 3 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Ausgang-wiederholt-zyklisch.md: -------------------------------------------------------------------------------- 1 | ### Ausgang wiederholt zyklisch 2 | 3 | Wird hier ein "Ja" ausgewählt, kann man im Folgenden angeben, in welchen Zeitintervallen die EIN- bzw. AUS-Signale wiederholt werden sollen. 4 | 5 | Man kann sowohl das EIN- wie auch das AUS-Signal in unterschiedlichen Zeitintervallen wiederholen lassen. 6 | 7 | > **Achtung:** Auch wenn es möglich ist, eine Zeitbasis von 1/10 Sekunden zu wählen, sollte man vorsichtig mit Wiederholungsintervallen unter 1 Minute umgehen, da man damit sehr leicht den KNX-Bus lahmlegen kann. 8 | 9 | Man kann natürlich auch nur das EIN- oder das AUS-Signal wiederholen lassen. 10 | 11 | In dem oben dargestellten Bildschirmausschnitt würde das EIN-Signal alle 15 Minuten wiederholt werden, das AUS-Signal jede Stunde. 12 | 13 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Feiertage-auf-dem-Bus-verfuegbar-machen.md: -------------------------------------------------------------------------------- 1 | ### Feiertage auf dem Bus verfügbar machen? 2 | 3 | Ein "Ja" bei dieser Einstellung schaltet 2 Kommunikationsobjekte frei. Über diese Kommunikationsobjekte wird die Nummer eines Feiertags gesendet. Jede gesendete Nummer entspricht genau einem Feiertag, die Nummern entsprechen denen in der Liste von Feiertagseinstellungen (siehe vorheriges Bild). 4 | 5 | * KO 16 (Welcher Feiertag ist heute?) sendet, wenn der aktuelle Tag ein Feiertag ist, 6 | * KO 17 (Welcher Feiertag ist morgen?) sendet, wenn der nächste Tag ein Feiertag ist. 7 | 8 | Beide Kommunikationsobjekte (16 und 17) werden immer kurz nach Mitternacht (aber nicht exakt um Mitternacht) neu berechnet. Sie senden eine 0, wenn kein Feiertag ist und sich der Wert geändert hat. 9 | 10 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Logik-auswerten.md: -------------------------------------------------------------------------------- 1 | ### Logik auswerten 2 | 3 | Es ist notwendig, einer Logikverknüpfung zu sagen, wie sie mit undefinierten Eingängen umgehen soll. 4 | 5 | 6 | #### auch wenn noch nicht alle Werte gültig sind 7 | 8 | Die logische Verknüpfung betrachtet alle undefinierten Eingänge als ob sie mit "inaktiv" parametriert wären. Ein UND mit 3 Eingängen, das von den einer undefiniert ist, wird bereits ein EIN senden, wenn die 2 restlichen Eingänge EIN sind. 9 | 10 | Ein TOR mit einem undefinierten Dateneingang oder einem undefinierten Toreingang kann nicht sinnvoll funktionieren und sendet dann gar nichts. 11 | 12 | #### erst wenn alle Werte gültig sind 13 | 14 | Die logische Verknüpfung wird erst dann einen Wert ermitteln, wenn an allen Eingängen gültige Werte vorliegen. 15 | 16 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Schaltzeiten-fortsetzen-von-Kanal.md: -------------------------------------------------------------------------------- 1 | ### Schaltzeiten fortsetzen von Kanal 2 | 3 | Wenn bei einem Schaltkanal nicht genügend Schaltzeiten vorhanden sind oder man Jahres- und Tagesschaltuhren kombinieren möchte, dann kann man mehrere Zeitschaltuhr-Kanäle zu einem verbinden. Es werden dann alle Aktionen über die erste (unverbundene) Zeitschaltuhr abgehandelt. Die verbundene Zeitschaltuhr dient nur dazu, zusätzliche Schaltzeiten anzugeben. 4 | 5 | Als Verbindung wird die Nummer des Schaltzeituhr-Kanals angegeben, der fortgesetzt werden soll. Es können auch mehrere Kanäle verbunden werden, dies muss dann immer als Fortsetzung der Fortsetzung formuliert werden, also 3 ist die Fortsetzung von 10, 5 die Fortsetzung von 3, 15 die Fortsetzung von 5 usw. 6 | 7 | Die Verbindung kann absolut oder relativ formuliert werden. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zeit-bis-das-Geraet-nach-einem-Neustart-aktiv-wird.md: -------------------------------------------------------------------------------- 1 | ### Zeit bis das Gerät nach einem Neustart aktiv wird 2 | 3 | Hier kann man festlegen, wie viel Zeit vergehen soll, bis das Gerät nach einem Neustart seine Funktion aufnimmt. Dabei ist es egal, ob der Neustart durch einen Busspannungsausfall, einen Reset über den Bus, durch ein Drücken der Reset-Taste oder durch den Watchdog ausgelöst wurde. 4 | 5 | Da das Gerät prinzipiell (sofern parametriert) auch Lesetelegramme auf den Bus senden kann, kann mit dieser Einstellung verhindert werden, dass bei einem Busneustart von vielen Geräten viele Lesetelegramme auf einmal gesendet werden und so der Bus überlastet wird. 6 | 7 | **Anmerkung:** Auch wenn man hier technisch bis zu 16.000 Stunden Verzögerung angeben kann, sind nur Einstellungen im Sekundenbereich sinnvoll. 8 | 9 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Darauffolgendes-AUS-fuehrt-zu.md: -------------------------------------------------------------------------------- 1 | ### Darauffolgendes AUS führt zu 2 | 3 | Dieses Auswahlfeld erscheint nur, wenn eine EINschaltverzögerung stattfinden soll. 4 | 5 | Während das Funktionsmodul ein EIN-Signal verzögert, muss definiert werden, wie ein weiteres AUS-Signal während der Verzögerung behandelt werden soll. 6 | 7 | ##### Verzögerung bleibt bestehen 8 | 9 | Während eine Verzögerung von einem EIN-Signal aktiv ist, führt ein darauffolgendes AUS-Signal zu keiner Reaktion, es wird ignoriert. Das EIN-Signal wird nach der eingestellten Verzögerungszeit gesendet. 10 | 11 | ##### Verzögerung beenden ohne zu schalten 12 | 13 | Kommt während eine Verzögerung eines EIN-Signals aktiv ist ein AUS-Signal, wird die Verzögerung beendet und das EIN-Signal ignoriert. Auch das AUS-Signal wird nicht gesendet, da der Ausgang des Funktionsmoduls ja bereits aus war. 14 | 15 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Darauffolgendes-EIN-fuehrt-zu.md: -------------------------------------------------------------------------------- 1 | ### Darauffolgendes EIN führt zu 2 | 3 | Dieses Auswahlfeld erscheint nur, wenn eine AUSschaltverzögerung stattfinden soll. 4 | 5 | Während das Funktionsmodul ein AUS-Signal verzögert, muss definiert werden, wie ein weiteres EIN-Signal während der Verzögerung behandelt werden soll. 6 | 7 | ##### Verzögerung bleibt bestehen 8 | 9 | Während eine Verzögerung von einem AUS-Signal aktiv ist, führt ein darauffolgendes EIN-Signal zu keiner Reaktion, es wird ignoriert. Das AUS-Signal wird nach der eingestellten Verzögerungszeit gesendet. 10 | 11 | ##### Verzögerung beenden ohne zu schalten 12 | 13 | Kommt während eine Verzögerung eines AUS-Signals aktiv ist ein EIN-Signal, wird die Verzögerung beendet und das AUS-Signal ignoriert. Auch das EIN-Signal wird nicht gesendet, da der Ausgang des Funktionsmoduls ja bereits an war. 14 | 15 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Uhrzeit-und-Datum-empfangen-ueber.md: -------------------------------------------------------------------------------- 1 | ### Uhrzeit und Datum empfangen über 2 | 3 | Dieses Gerät kann Uhrzeit und Datum vom Bus empfangen. Dabei kann man wählen, ob man Uhrzeit über ein Kommunikationsobjekt und das Datum über ein anders empfangen will oder beides, Uhrzeit und Datum, über ein kombiniertes Kommunikationsobjekt. 4 | 5 | #### Zwei getrennte KO Uhrzeit und Datum 6 | 7 | Wählt man diesen Punkt, wird je ein Kommunikationsobjekt für Uhrzeit (DPT 10) und Datum (DPT 11) bereitgestellt. Der KNX-Zeitgeber im System muss die Uhrzeit und das Datum für die beiden Kommunikationsobjekte liefern können. 8 | 9 | #### Ein kombiniertes KO Uhrzeit/Datum 10 | 11 | Wählt man diesen Punkt, wir ein kombiniertes Kommunikationsobjekt für Uhrzeit/Datum (DPT 19) bereitgestellt. Der KNX-Zeitgeber im System muss die kombinierte Uhrzeit/Datum entsprechend liefern können. 12 | 13 | -------------------------------------------------------------------------------- /src/KnxHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | // enum supported dpt 6 | #define VAL_DPT_1 0 7 | #define VAL_DPT_2 1 8 | #define VAL_DPT_5 2 9 | #define VAL_DPT_5001 3 10 | #define VAL_DPT_6 4 11 | #define VAL_DPT_7 5 12 | #define VAL_DPT_8 6 13 | #define VAL_DPT_9 7 14 | #define VAL_DPT_16 8 15 | #define VAL_DPT_17 9 16 | #define VAL_DPT_232 10 17 | #define VAL_DPT_10 11 // Time 18 | #define VAL_DPT_11 12 // Date 19 | #define VAL_DPT_12 13 20 | #define VAL_DPT_13 14 21 | #define VAL_DPT_14 15 22 | #define VAL_DPT_19 16 // Date-Time 23 | #define VAL_DPT_3 17 24 | 25 | Dpt &getDPT(uint8_t iDptIndex); 26 | 27 | #define VAL_TIMEBASE_SECONDS 0x0000 28 | #define VAL_TIMEBASE_MINUTES 0x4000 29 | #define VAL_TIMEBASE_HOURS 0x8000 30 | #define VAL_TIMEBASE_TENTH_SECONDS 0xC000 31 | 32 | #define VAL_TIME_MASK 0x3FFF 33 | #define VAL_TIMEBASE_MASK 0xC000 34 | 35 | uint32_t getDelayPattern(uint16_t iParamIndex, bool iAsSeconds = false); 36 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Treppenlicht-blinkt-im-Rhythmus.md: -------------------------------------------------------------------------------- 1 | ### Treppenlicht blinkt im Rhythmus 2 | 3 | Bei einer Eingabe einer Zahl größer 0 wird, solange das Treppenlicht eingeschaltet ist, in dem angegebenen Takt der Ausgang des Funktionsmoduls abwechselnd ein EIN- und ein AUS-Signal erzeugt. Ist der Takt z.B. 2 Sekunden, wird nach 2 Sekunden von EIN auf AUS gewechselt, nach wieder 2 Sekunden dann von AUS auf EIN und so fort. Sobald das Treppenlicht beendet ist, sei es durch den Ablauf der Treppenlichtzeit oder durch ein AUS-Signal von Außen, wird das Blinken beendet und ein finales AUS-Signal gesendet. 4 | 5 | Bei der Eingabe einer 0 wird die Blinkfunktion deaktiviert. 6 | 7 | Der Bildschirmausschnitt oben zeigt ein Beispiel für ein 3-maliges Blinken in einer Sekunde, wobei die einzelnen Blinkzyklen nur 0,2 Sekunden dauern. Wenn man den Ausgang mit einem Buzzer verbindet, erhält man eine akustische Rückmeldung (3 mal Piep) für z.B. einen Fehlerfall. 8 | 9 | -------------------------------------------------------------------------------- /src/ModuleVersionCheck.h: -------------------------------------------------------------------------------- 1 | #include "versions.h" 2 | 3 | // Change the following 3 lines and adopt to your module names 4 | #define ModuleVersion_ModuleName "LogicModule" 5 | #define ModuleVersion_knxprod_h LOG_ModuleVersion 6 | #define ModuleVersion_version_h MODULE_LogicModule_ETS 7 | 8 | // ATTENTION: This file is evaluated during build, by OpenKNXproducer and some build scripts. 9 | // No changes needed behind this point 10 | #define VALUE_TO_STRING(x) #x 11 | #define VALUE(x) VALUE_TO_STRING(x) 12 | 13 | #if ModuleVersion_knxprod_h != ModuleVersion_version_h 14 | #pragma message "\n\n\nYou need to >>> INCREASE YOUR <<< ETS ApplicationVersion and manually synchronize op:verify of " ModuleVersion_ModuleName " to " VALUE(ModuleVersion_version_h) "\n\n(see https://github.com/OpenKNX/OpenKNX/wiki/Versionierung-von-Modulen-(OFM)#fehler-vom-compiler )\n\n\n" 15 | #pragma GCC error "\n\nETS Application Version problem (see next message)\n\n" 16 | #endif 17 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Typ-der-Zeitschaltuhr.md: -------------------------------------------------------------------------------- 1 | ### Typ der Zeitschaltuhr 2 | 3 | Es werden folgende Typen von Zeitschaltuhren unterstützt: 4 | 5 | * Tagesschaltuhr: Erlaubt die Angabe von Wochentag, Stunde und Minute und ist somit für tägliche/wöchentliche Schaltungen gedacht. Diese Schaltuhr erlaubt 8 Schaltzeiten zu definieren. 6 | * Jahresschaltuhr: Erlaubt die Angabe von Monat, Tag, Wochentag, Stunde und Minute und ist somit für seltener im Jahr/Monat vorkommende Schaltungen gedacht. Diese Schaltuhr erlaubt 4 Schaltzeiten zu definieren. 7 | * Tagesschaltuhr (verbunden): Wie Tagesschaltuhr, nur werden die Schaltzeiten dieser Zeitschaltuhr mit einer anderen Zeitschaltuhr verbunden und als eine Einheit behandelt. 8 | * Jahresschaltuhr (verbunden): Wie Jahresschaltuhr, nur werden die Schaltzeiten dieser Zeitschaltuhr mit einer anderen Zeitschaltuhr verbunden und als eine Einheit behandelt. 9 | 10 | Verbundene Zeitschaltuhren erlauben es, mehr als die möglichen 4 oder 8 Schaltzeiten zu definieren. 11 | 12 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-DPT-fuer-Ausgang.md: -------------------------------------------------------------------------------- 1 | ### DPT für Ausgang 2 | 3 | Dieses Auswahlfeld legt den DPT für den Ausgang fest. Unterstützt werden: 4 | 5 | * DPT 1: binärer Wert 6 | * DPT 2: Zwangsführung 7 | * DPT 3: Dimmen 8 | * DPT 5: vorzeichenlose Zahl (0 bis 255) 9 | * DPT 5.001: Prozentzahl (0 bis 100) 10 | * DPT 6: vorzeichenbehaftete Zahl (-128 bis 127) 11 | * DPT 7: vorzeichenlose Zahl (0 bis 65.535) 12 | * DPT 8: vorzeichenbehaftete Zahl (-32.768 bis 32.767) 13 | * DPT 9: Gleitkommawert (-670.760,96 bis 670.760,96) 14 | * DPT 12: vorzeichenlose Zahl (0 bis 4294967296) 15 | * DPT 13: vorzeichenbehaftete Zahl (-2.147.483.648 bis 2.147.483.647) 16 | * DPT 14: Gleitkommawert (-1.000.000.000.000 bis 1.000.000.000.000) 17 | * DPT 16: Text (bis 14 Byte) 18 | * DPT 17: Szenen Nummer (1-64) 19 | * DPT 232: RGB-Wert (3*8 Bit Rot-, Grün-, Blauwert) 20 | 21 | Je nach gewähltem DPT unterscheiden sich die folgenden Felder leicht. Es werden erst mal die Parameter beschrieben, die für alle DPT passen und anschließend die DPT-spezifischen. 22 | 23 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Interner-Eingang-n.md: -------------------------------------------------------------------------------- 1 | ### Interner Eingang 3/4 2 | 3 | Es handelt sich um interne Eingänge, die mit einem Ausgang eines anderen Kanals verbunden sind. Jeder interne Eingang kann durch die Auswahlfelder deaktiviert bzw. normal oder invertiert (negiert) aktiviert werden. 4 | 5 | #### inaktiv 6 | 7 | Steht ein interner Eingang auf inaktiv, kann er nicht genutzt werden und er hat keinen Einfluss auf die logische Verknüpfung. 8 | 9 | #### normal aktiv 10 | 11 | Es erscheint eine eigene Seite für die Verknüpfung dieses Eingangs mit einem anderen Kanalausgang. Der Wert des Kanalausgangs wird direkt der oben ausgewählten logischen Operation zur Verfügung gestellt. 12 | 13 | #### invertiert aktiv 14 | 15 | Es erscheint eine eigene Seite für die Verknüpfung dieses Eingangs mit einem anderen Kanalausgang. Der Wert des Kanalausgangs wird invertiert (negiert), bevor er der oben ausgewählten logischen Operation zur Verfügung gestellt wird. Invertieren (negieren) heißt, dass ein EIN-Signal zu einem AUS-Signal wird und umgekehrt. 16 | 17 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Sommerzeit-ermitteln-durch.md: -------------------------------------------------------------------------------- 1 | ### Sommerzeit ermitteln durch 2 | 3 | Hier kann man eine der verfügbaren Möglichkeiten auswählen, mit der das Logikmodul ermitteln kann, ob gerade die Sommerzeit aktiv ist. 4 | 5 | ##### Kommunikationsobjekt 'Sommerzeit aktiv' 6 | 7 | Wird diese Option ausgewählt, muss über das Kommunikationsobjekt 'Sommerzeit aktiv' dem Logikmodul mitgeteilt werden, ob gerade die Sommerzeit aktiv ist. 8 | 9 | ##### Kombiniertem Datum/Zeit-KO (DPT 19) 10 | 11 | Erscheint nur, wenn der Datum- bzw. Zeitempfang über ein kombiniertes Datum/Zeit-KO (DPT 19) gewählt worden ist. 12 | 13 | Wenn der Datum- bzw. Zeitempfang über ein kombiniertes Datum/Zeit-KO (DPT 19) gewählt worden ist, kann dieses Zeittelegramm auch die Information enthalten, ob gerade die Sommerzeit aktiv ist. Wenn der Zeitgeber im System diese Information mit dem DPT 19-Telegramm mitschicken kann, sollte diese Option gewählt werden. 14 | 15 | ##### Interne Berechnung 16 | 17 | Diese Option berechnet anhand der eingestellten Zeitzone die Sommerzeit. 18 | 19 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingang-n.md: -------------------------------------------------------------------------------- 1 | ### Eingang 1/2 2 | 3 | Jeder Eingang kann durch die Auswahlfelder deaktiviert bzw. normal oder invertiert (negiert) aktiviert werden. 4 | 5 | #### inaktiv 6 | 7 | Steht ein Eingang auf inaktiv, kann er nicht genutzt werden und es steht kein KO zur Verfügung, um ein Telegramm an diesen Eingang zu schicken. 8 | 9 | #### normal aktiv 10 | 11 | Für diesen Eingang erscheint ein Kommunikationsobjekt. Detailangaben zu diesem Eingang erfolgen auf einer eigenen Seite. Der aus den Einstellungen für den Eingang ermittelte binäre Wert wird direkt der oben ausgewählten logischen Operation zur Verfügung gestellt. 12 | 13 | #### invertiert aktiv 14 | 15 | Für diesen Eingang erscheint ein Kommunikationsobjekt. Detailangaben zu diesem Eingang erfolgen auf einer eigenen Seite. Der aus den Einstellungen für den Eingang ermittelte binäre Wert wird invertiert (negiert), bevor er der oben ausgewählten logischen Operation zur Verfügung gestellt wird. Invertieren (negieren) heißt, dass ein EIN-Signal zu einem AUS-Signal wird und umgekehrt. 16 | 17 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | #Generated from Visual Studio settings 2 | --- 3 | BasedOnStyle: llvm 4 | BreakBeforeBraces: Custom 5 | BraceWrapping: 6 | AfterClass: true 7 | AfterControlStatement: true 8 | AfterCaseLabel: true 9 | AfterEnum: true 10 | AfterFunction: true 11 | AfterNamespace: true 12 | AfterStruct: true 13 | AfterUnion: true 14 | AfterExternBlock: true 15 | BeforeCatch: true 16 | BeforeElse: true 17 | BeforeWhile: true 18 | BeforeLambdaBody: false 19 | SplitEmptyFunction: true 20 | SplitEmptyRecord: true 21 | SplitEmptyNamespace: true 22 | IndentBraces: false 23 | ColumnLimit: 0 24 | IndentWidth: 4 25 | NamespaceIndentation: All 26 | TabWidth: 4 27 | DerivePointerAlignment: true 28 | IndentCaseLabels: true 29 | AllowShortCaseLabelsOnASingleLine: true 30 | AllowShortEnumsOnASingleLine: true 31 | AllowShortFunctionsOnASingleLine: All 32 | AllowShortIfStatementsOnASingleLine: OnlyFirstIf 33 | AllowShortLambdasOnASingleLine: All 34 | ConstructorInitializerIndentWidth: 4 35 | ContinuationIndentWidth: 4 36 | UseTab: Never 37 | IndentPPDirectives: BeforeHash 38 | ... -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wiederholungsfilter.md: -------------------------------------------------------------------------------- 1 | ### Wiederholungsfilter 2 | 3 | Das Auswahlfeld erlaubt das Ausfiltern von unerwünschten Wiederholungen. 4 | 5 | #### Alle Wiederholungen durchlassen 6 | 7 | Es wird nichts gefiltert, sowohl mehrfach aufeinanderfolgende EIN-Signale wie auch mehrfach aufeinanderfolgende AUS-Signale werden durchgelassen und stehen auf Ausgang des Funktionsmoduls zur Verfügung. 8 | 9 | #### Nur EIN-Wiederholungen durchlassen 10 | 11 | Mehrfach aufeinanderfolgende EIN-Signale werden durchgelassen. Wenn mehrere AUS-Signale aufeinanderfolgen, wird nur das erste AUS-Signal zum Ausgang des Funktionsmoduls durchgelassen. 12 | 13 | #### Nur AUS-Wiederholungen durchlassen 14 | 15 | Mehrfach aufeinanderfolgende AUS-Signale werden durchgelassen. Wenn mehrere EIN-Signale aufeinanderfolgen, wird nur das erste EIN-Signal zum Ausgang des Funktionsmoduls durchgelassen. 16 | 17 | #### Keine Wiederholungen durchlassen 18 | 19 | Alle Wiederholungen von EIN- oder AUS-Signalen werden ignoriert, es wird immer nur das erste EIN- oder AUS-Signal durchgelassen. Somit stehen am Ausgang des Funktionsmoduls effektiv nur Signalwechsel zur Verfügung. 20 | 21 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Feiertagsbehandlung.md: -------------------------------------------------------------------------------- 1 | ### Feiertagsbehandlung 2 | 3 | Erscheint nur bei Zeitschaltuhren, die nicht verbunden sind. Bei verbundenen Zeitschaltuhren gilt die Definition der ersten (nicht verbundenen) Zeitschaltuhr. 4 | 5 | Über dieses Auswahlfeld kann man definieren, wie sich die Zeitschaltuhr (also alle Schaltpunkte) bei einem Feiertag verhalten. 6 | 7 | #### Feiertage nicht beachten 8 | 9 | Für diese Zeitschaltuhr ist die Feiertagsinformation nicht relevant. Ein Feiertag wird nicht beachtet, die Schaltzeitpunkte werden normal ausgeführt. 10 | 11 | #### An Feiertagen nicht schalten 12 | 13 | An einem Feiertag wird diese Zeitschaltuhr ignoriert und nicht ausgeführt. Dies ist dann eine Zeitschaltuhr für "normale" Tage. 14 | 15 | #### Nur an Feiertagen schalten 16 | 17 | Diese Zeitschaltuhr wird nur an einem Feiertag ausgeführt und nicht an anderen Tagen. Somit ist dies eine Zeitschaltuhr für reine Feiertage. 18 | 19 | #### Feiertage wie Sonntage behandeln 20 | 21 | Bei dieser Zeitschaltuhr werden die Schaltzeiten normal behandelt, an einem Feiertag werden aber die Schaltzeiten für einen Sonntag ausgeführt, unabhängig von dem Wochentag des Feiertages. 22 | 23 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Tor-geht-sofort-wieder-zu.md: -------------------------------------------------------------------------------- 1 | ### Tor geht sofort wieder zu 2 | 3 | Ein Tor bleibt normalerweise offen, nachdem ein EIN-Telegramm am Toreingang empfangen wurde. Erst bei einem AUS-Telegramm am Toreingang geht das Tor wieder zu. 4 | 5 | Wird "Tor geht sofort wieder zu" gewählt, geht das Tor beim Empfang eines EIN-Telegramms auf und danach sofort wieder zu. Es wird somit nicht auf ein AUS-Telegramm gewartet. 6 | 7 | Man nennt einen solchen Eingang auch Impulseingang. Durch einen solchen Impulseingang kann man eine Taktung/Synchronisation der Werte erreichen, die am Eingang anliegen. 8 | 9 | So kann z.B. ein Wert am Eingang, egal wie oft er sich ändert, nur jede Minute zum Ausgang durchgeschaltet werden. Oder ein Wert wird nur durchgelassen, wenn der Benutzer eine Taste betätigt. 10 | 11 | Wenn man den Toreingang invertiert, kann man ein Tor realisieren, dass beim Empfang einer 0 kurz auf und sofort wieder zu geht. 12 | 13 | > Abstrakt betrachtet entspricht ein Tor mit einem Impulseingang einem Tor mit einem normalen Eingang, vor den ein Treppenlicht geschaltet wurde, das sofort (z.B. nach 0.1 Sekunden) abläuft. Das Tor sendet dann nur beim öffnen, nichts beim schließen. 14 | 15 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Sendeverhalten-fuer-Ausgang.md: -------------------------------------------------------------------------------- 1 | ### Sendeverhalten für Ausgang 2 | 3 | In dieser Auswahlbox kann für den Ausgangskonverter festgelegt werden, ob das wiederholte Senden des gleichen Wertes erlaubt ist oder nicht. 4 | 5 | Dies darf nicht mit dem Wiederholungsfilter verwechselt werden. 6 | 7 | Der Wiederholungsfilter arbeitet mit den logischen Werten EIN und AUS, die in der Logikverarbeitung verwendet werden. 8 | Der Ausgangskonverter übersetzt den logischen Wert z.B. in das Ergebnis einer Formel, die aus den beiden Eingangswerten berechnet wird, also einer Zahl eines anderen DPT. Das Sendeverhalten arbeitet mit dem zuletzt durch das KO gesendeten Wert und vergleicht diesen mit dem neu zu sendenden Wert. Je nachdem, wie das Sendeverhalten eingestellt ist, wird dann gesendet oder nicht. 9 | 10 | #### Alle Werte senden 11 | 12 | Jeder Wert wird auf den Bus gesendet, auch wenn er gleich dem zuletzt gesendetem Wert ist. Das ist das Standardverhalten. 13 | 14 | #### Nur geänderte Werte senden 15 | 16 | Der neu zu sendende Wert wird passend zum DPT des KO gewandelt und mit dem bisherigen KO-Wert vergleichen. Nur wenn sich die Werte unterscheiden, wird der neue Wert gesendet. 17 | 18 | 19 | -------------------------------------------------------------------------------- /lib/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project specific (private) libraries. 3 | PlatformIO will compile them to static libraries and link into executable file. 4 | 5 | The source code of each library should be placed in a an own separate directory 6 | ("lib/your_library_name/[here are source files]"). 7 | 8 | For example, see a structure of the following two libraries `Foo` and `Bar`: 9 | 10 | |--lib 11 | | | 12 | | |--Bar 13 | | | |--docs 14 | | | |--examples 15 | | | |--src 16 | | | |- Bar.c 17 | | | |- Bar.h 18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html 19 | | | 20 | | |--Foo 21 | | | |- Foo.c 22 | | | |- Foo.h 23 | | | 24 | | |- README --> THIS FILE 25 | | 26 | |- platformio.ini 27 | |--src 28 | |- main.c 29 | 30 | and a contents of `src/main.c`: 31 | ``` 32 | #include 33 | #include 34 | 35 | int main (void) 36 | { 37 | ... 38 | } 39 | 40 | ``` 41 | 42 | PlatformIO Library Dependency Finder will find automatically dependent 43 | libraries scanning project source files. 44 | 45 | More information about PlatformIO Library Dependency Finder 46 | - https://docs.platformio.org/page/librarymanager/ldf.html 47 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Erneutes-EIN-fuehrt-zu.md: -------------------------------------------------------------------------------- 1 | ### Erneutes EIN führt zu 2 | 3 | Dieses Auswahlfeld erscheint nur, wenn eine EINschaltverzögerung stattfinden soll. 4 | 5 | Während das Funktionsmodul ein EIN-Signal verzögert, muss definiert werden, wie ein weiteres EIN-Signal während der Verzögerung behandelt werden soll. 6 | 7 | ##### Verzögerung bleibt bestehen 8 | 9 | Während eine Verzögerung von einem EIN-Signal aktiv ist, werden darauffolgende EIN-Signale ignoriert. Nur das erste EIN-Signal wird verzögert und nach der festgelegten Zeit weitergesendet. 10 | 11 | ##### Verzögerung wird verlängert 12 | 13 | Während eine Verzögerung von einem EIN-Signal aktiv ist, führt ein darauffolgendes EIN-Signal zum Neustart der Verzögerungszeit. Somit läuft die Verzögerung erneut an. Dies hat zur Folge, dass das letzte EIN-Signal verzögert weitergeleitet wird und faktisch alle vorhergehenden ignoriert werden. 14 | 15 | ##### Sofort schalten ohne Verzögerung 16 | 17 | Kommt während eine Verzögerung eines EIN-Signals aktiv ist ein weiteres EIN-Signal, wird die Verzögerung sofort beendet und das zweite EIN-Signal sofort weitergeleitet. So kann man eine Aktion, die automatisiert verzögert laufen soll, durch ein manuelles Signal sofort beginnen lassen. 18 | 19 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Erneutes-AUS-fuehrt-zu.md: -------------------------------------------------------------------------------- 1 | ### Erneutes AUS führt zu 2 | 3 | Dieses Auswahlfeld erscheint nur, wenn eine AUSschaltverzögerung stattfinden soll. 4 | 5 | Während das Funktionsmodul ein AUS-Signal verzögert, muss definiert werden, wie ein weiteres AUS-Signal während der Verzögerung behandelt werden soll. 6 | 7 | ##### Verzögerung bleibt bestehen 8 | 9 | Während eine Verzögerung von einem AUS-Signal aktiv ist, werden darauffolgende AUS-Signale ignoriert. Nur das erste AUS-Signal wird verzögert und nach der festgelegten Zeit weitergesendet. 10 | 11 | ##### Verzögerung wird verlängert 12 | 13 | Während eine Verzögerung von einem AUS-Signal aktiv ist, führt ein darauffolgendes AUS-Signal zum Neustart der Verzögerungszeit. Somit läuft die Verzögerung erneut an. Dies hat zur Folge, dass das letzte AUS-Signal verzögert weitergeleitet wird und faktisch alle vorhergehenden ignoriert werden. 14 | 15 | ##### Sofort schalten ohne Verzögerung 16 | 17 | Kommt während eine Verzögerung eines AUS-Signals aktiv ist ein weiteres AUS-Signal, wird die Verzögerung sofort beendet und das zweite AUS-Signal sofort weitergeleitet. So kann man eine Aktion, die automatisiert verzögert ausgeschaltet werden soll, durch ein manuelles Signal sofort beenden. 18 | 19 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eigenes-KO-anzeigen.md: -------------------------------------------------------------------------------- 1 | ### Eigenes KO anzeigen? 2 | 3 | Dieses Auswahlfeld ist standardmäßig vorausgewählt und führt dazu, dass das zu diesem Ausgang zugehörige Kommunikationsobjekt in der Liste der Kommunikationsobjekte angezeigt wird. Wird die Auswahl entfernt, wird auch das KO nicht mehr angezeigt. War bereits vorher eine GA diesem KO zugewiesen, fragt die ETS, ob man diese Gruppenadresse auch entfernen möchte. In der gleichen Zeile wird die Nummer des eigenen KO angezeigt und eine Zusatzinformation, falls es nicht in der KO-Liste erscheint. 4 | 5 | In früheren Versionen vom Logikmodul wurde die Anzeige vom eigenen KO intern berechnet. Es gibt aber Fälle, in denen das KO als "angezeigt" berechnet wird, obwohl man es verstecken möchte (z.B. bei internen KO-Verknüpfungen). Um dieses zu erlauben, wurde die automatische Berechnung der Sichtbarkeit entfernt und eine manuelle Auswahl erlaubt. 6 | 7 | Nach einem Update von einer älteren Version sind alle KO sichtbar, auch wenn sie vor dem Update unsichtbar waren. Hier ist eine manuelle Aktion notwendig, um die nicht benötigten KO auszublenden. 8 | 9 | Für Spezialfunktionen wie "Gerät zurücksetzen", "Tonwiedergabe (Buzzer)" oder "RGB-LED schalten" wird kein KO benötigt und kann über diese Auswahlbox ausgeblendet werden. 10 | 11 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Urlaubsbehandlung.md: -------------------------------------------------------------------------------- 1 | ### Urlaubsbehandlung 2 | 3 | Erscheint nur bei Zeitschaltuhren, die nicht verbunden sind und unter "Urlaub/Feiertage" die Einstellung "Urlaubsbehandlung aktivieren?" mit "Ja" eingestellt wurde. Bei verbundenen Zeitschaltuhren gilt die Definition der ersten (nicht verbundenen) Zeitschaltuhr. 4 | 5 | Über dieses Auswahlfeld kann man definieren, wie sich die Zeitschaltuhr (also alle Schaltpunkte) bei einem Urlaubstag verhalten. Ein Urlaubstag muss dem Modul extern über das KO 4 mitgeteilt werden. 6 | 7 | #### Urlaub nicht beachten 8 | 9 | Für diese Zeitschaltuhr ist die Urlaubsinformation nicht relevant. Ein Urlaubstag wird nicht beachtet, die Schaltzeitpunkte werden normal ausgeführt. 10 | 11 | #### Bei Urlaub nicht schalten 12 | 13 | An einem Urlaubstag wird diese Zeitschaltuhr ignoriert und nicht ausgeführt. Dies ist dann eine Zeitschaltuhr für "normale" Tage. 14 | 15 | #### Nur bei Urlaub schalten 16 | 17 | Diese Zeitschaltuhr wird nur an einem Urlaubstag ausgeführt und nicht an anderen Tagen. Somit ist dies eine Zeitschaltuhr für reine Urlaubstage. 18 | 19 | #### Urlaub wie Sonntag behandeln 20 | 21 | Bei dieser Zeitschaltuhr werden die Schaltzeiten normal behandelt, an einem Urlaubstag werden aber die Schaltzeiten für einen Sonntag ausgeführt, unabhängig vom Wochentag des Urlaubstages. 22 | 23 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Benutzerformel-testen.md: -------------------------------------------------------------------------------- 1 | ### Benutzerformel testen 2 | 3 | Mit dieser Checkbox aktiviert man die Möglichkeit, bereits in der ETS vor der Programmierung und vor der Ausführung eigene Formeln zu testen und bereits definierte Benutzerformeln auf das korrekte Ergebnis zu überprüfen. 4 | 5 | Hierzu kann eine beliebige Formel im Feld Formeldefinition eingegeben werden. Durch drücken der Taste "Formel rechnen" wird eine Direktverbindung zum Gerät aufgebaut, die Formel dort berechnet und das Ergebnis in der ETS dargestellt. 6 | 7 | Um eine bereits definierte Benutzerformel zu berechnen, gibt man z.B. B10(4,7,15) ein. Das führt die Benutzerformel 10 mit den Argumenten E1=4, E2=7 und A=15 aus und präsentiert das Ergebnis. 8 | 9 | > Achtung: Um eine Benutzerformel B*n* aus der Testformel heraus aufzurufen, muss die Benutzerformel B*n* von der ETS zum Gerät übertragen worden sein (sprich: Das Gerät muss mit dieser Formel programmiert worden sein). Das liegt daran, dass zwar zum Testen von Formeln die aktuelle Testformel zum Gerät direkt übertragen wird, aber die Übertragungskapazität nicht ausreicht, um alle anderen Formeln auch gleich mit zu übertragen. Somit müssen diese bereits vorher über "Programmieren" übertragen worden sein. Trotz dieser Einschränkung kann man Formeln auf diese Weise relativ schnell auf ihre korrekte Berechnung hin prüfen. 10 | 11 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-DPT-fuer-Eingang.md: -------------------------------------------------------------------------------- 1 | ### DPT für Eingang 2 | 3 | Dieses Auswahlfeld legt den DPT für den Eingang fest. Unterstützt werden: 4 | 5 | * DPT 1: binärer Wert 6 | * DPT 2: Zwangsführung 7 | * DPT 3: Dimmen relativ 8 | * DPT 5: vorzeichenlose Zahl (0 bis 255) 9 | * DPT 5.001: Prozentzahl (0 bis 100) 10 | * DPT 6: vorzeichenbehaftete Zahl (-128 bis 127) 11 | * DPT 7: vorzeichenlose Zahl (0 bis 65.535) 12 | * DPT 8: vorzeichenbehaftete Zahl (-32.768 bis 32.767) 13 | * DPT 9: Gleitkommawert (-670.760,96 bis 670.760,96) 14 | * DPT 12: vorzeichenlose Zahl (0 bis 4294967296) 15 | * DPT 13: vorzeichenbehaftete Zahl (-2.147.483.648 bis 2.147.483.647) 16 | * DPT 14: Gleitkommawert (-1.000.000.000.000 bis 1.000.000.000.000) 17 | * DPT 17: Szenen Nummer (1-64) 18 | * DPT 232: RGB-Wert (0-16.777.216) 19 | 20 | Für jeden DPT erscheint ein passender Konverter, mit dem man den gewünschten Eingangs-DPT nach DPT 1 wandeln kann. Die gesamte weitere Verarbeitung des Eingangssignals erfolgt binär, also auf Basis von DPT 1. 21 | 22 | > **Wichtig:** Wenn ein bestehendes Kommunikationsobjekt genutzt wird, muss der hier eingestellte DPT dem DPT des bestehenden KO entsprechen! Das kann nicht automatisch von der Applikation ermittelt werden. Wenn hier etwas falsch eingestellt wird und der falsche Eingangskonverter benutzt wird, kann der Logikkanal nicht korrekt funktionieren. 23 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beim-oeffnen-vom-Tor-wird.md: -------------------------------------------------------------------------------- 1 | ### Beim öffnen vom Tor wird 2 | 3 | Das Auswahlfeld erscheint nur, wenn als logische Operation TOR gewählt wurde. 4 | 5 | Mit dem Auswahlfeld kann man einstellen, ob das Tor zusätzliche Telegramme verschicken soll, wenn es gerade geöffnet wird (Toreingang geht auf EIN). 6 | 7 | Normalerweise ist das Tor entweder geöffnet oder geschlossen. Ein geöffnetes Tor kann nicht nochmal öffnen. Wird also wiederholt ein EIN-Signal an den Toreingang gesendet, werden die folgenden Einstellungen nur beim ersten EIN (beim wirklichen öffnen) berücksichtigt, nicht bei den Folgetelegrammen. 8 | 9 | Nach einem Neustart ist das Tor weder geöffnet noch geschlossen, das erste EIN-Telegramm am Toreingang führt somit auf jeden Fall zum öffnen und zur Berücksichtigung der folgenden Einstellungen. 10 | 11 | #### nichts gesendet 12 | 13 | Beim öffnen vom Tor wird nichts gesendet, erst das nächste Telegramm am Dateneingang wird gesendet. 14 | 15 | #### AUS gesendet 16 | 17 | Beim öffnen vom Tor wird immer ein AUS-Signal gesendet. 18 | 19 | #### EIN gesendet 20 | 21 | Beim öffnen vom Tor wird immer ein EIN-Signal gesendet. 22 | 23 | #### Eingangswert gesendet 24 | 25 | Beim öffnen vom Tor wird der Eingangswert gesendet. Damit kann man erreichen, dass das letzte Signal, das vom Tor blockiert worden ist, nach dem öffnen doch noch durchkommt. 26 | 27 | -------------------------------------------------------------------------------- /src/PCA9632.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Marlin 3D Printer Firmware 3 | * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] 4 | * 5 | * Based on Sprinter and grbl. 6 | * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | /* 24 | * Driver for the Philips PCA9632 LED driver. 25 | * Written by Robert Mendon Feb 2017. 26 | */ 27 | 28 | #ifndef __PCA9632_H__ 29 | #define __PCA9632_H__ 30 | 31 | #include "Arduino.h" 32 | #include "Wire.h" 33 | 34 | void PCA9632_SetColor(const byte r, const byte g, const byte b); 35 | 36 | #endif // __PCA9632_H__ 37 | 38 | // ETS LED 39 | // rot gruen 40 | // gruen blau 41 | // blau rot 42 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Beim-schliessen-vom-Tor-wird.md: -------------------------------------------------------------------------------- 1 | ### Beim schließen vom Tor wird 2 | 3 | Das Auswahlfeld erscheint nur, wenn als Logik-Operation TOR gewählt wurde und das Tor nicht sofort nach dem Öffnen geschlossen wird. 4 | 5 | Mit dem Auswahlfeld kann man einstellen, ob das Tor zusätzliche Telegramme verschicken soll, wenn es gerade geschlossen wird (Toreingang geht auf AUS). 6 | 7 | Normalerweise ist das Tor entweder geöffnet oder geschlossen. Ein geschlossenes Tor kann nicht nochmal schließen. Wird also wiederholt ein AUS-Signal an den Toreingang gesendet, werden die folgenden Einstellungen nur beim ersten AUS (beim wirklichen schließen) berücksichtigt, nicht bei den Folgetelegrammen. 8 | 9 | Nach einem Neustart ist das Tor weder geöffnet noch geschlossen, das erste AUS-Telegramm am Toreingang führt somit auf jeden Fall zum schließen und zur Berücksichtigung der folgenden Einstellungen. 10 | 11 | #### nichts gesendet 12 | 13 | Beim schließen vom Tor wird nichts gesendet. 14 | 15 | #### AUS gesendet 16 | 17 | Beim schließen vom Tor wird immer ein AUS-Signal gesendet. 18 | 19 | #### EIN gesendet 20 | 21 | Beim schließen vom Tor wird immer ein EIN-Signal gesendet. 22 | 23 | #### Eingangswert gesendet 24 | 25 | Beim schließen vom Tor wird der Eingangswert gesendet. Da dieser Wert ja faktisch schon mal gesendet worden ist (als das Tor noch offen war), ist das effektiv eine einmalige Wiederholung des letzten Wertes. 26 | 27 | -------------------------------------------------------------------------------- /src/TimerRestore.cpp: -------------------------------------------------------------------------------- 1 | #include "TimerRestore.h" 2 | #include "Arduino.h" 3 | #include "OpenKNX.h" 4 | 5 | TimerRestore::TimerRestore() 6 | { 7 | mNow.tm_year = 120; 8 | mNow.tm_mon = 0; 9 | mNow.tm_mday = 1; 10 | mNow.tm_wday = 3; 11 | mktime(&mNow); 12 | mTimeDelay = millis(); 13 | } 14 | 15 | TimerRestore::~TimerRestore() 16 | { 17 | } 18 | 19 | TimerRestore &TimerRestore::instance() 20 | { 21 | static TimerRestore sInstance; 22 | return sInstance; 23 | } 24 | 25 | void TimerRestore::setup(Timer &iTimer) 26 | { 27 | mDayIteration = 0; 28 | mNow = iTimer.mNow; 29 | mLongitude = iTimer.mLongitude; 30 | mLatitude = iTimer.mLatitude; 31 | mTimeValid = tmValid; 32 | holiday.updateDate(mNow, false); 33 | doDayCalculations(); 34 | } 35 | 36 | void TimerRestore::decreaseDay() 37 | { 38 | mNow.tm_mday -= 1; 39 | // Jeder ältere Tag als "Heute" wird 40 | // mit dem Tagesende (25:59:59) betrachtet 41 | mNow.tm_hour = 23; 42 | mNow.tm_min = 59; 43 | mNow.tm_sec = 59; 44 | doDayCalculations(); 45 | } 46 | 47 | void TimerRestore::doDayCalculations() 48 | { 49 | mktime(&mNow); 50 | mDayIteration += 1; 51 | // printDebug("TimerRestore: Day %02d.%02d.%02d\n", this->getDay(), this->getMonth(), this->getYear()); 52 | 53 | calculateSunriseSunset(); 54 | 55 | holiday.updateDate(mNow, false); 56 | } 57 | 58 | uint16_t TimerRestore::getDayIteration() 59 | { 60 | return mDayIteration; 61 | } -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Nur-so-lange-zyklisch-lesen-bis-erstes-Telegramm-eingeht.md: -------------------------------------------------------------------------------- 1 | ### Nur so lange zyklisch lesen, bis erstes Telegramm eingeht 2 | 3 | Erscheint nur, wenn bei "Eingang wird alle n Sekunden gelesen" ein Wert größer 0 eingegeben wurde. 4 | 5 | Standardmäßig wird zyklisches lesen ununterbrochen durchgeführt. Mit einem 'Ja' kann man hier festlegen, dass nur so lange zyklisch gelesen wird, bis ein erstes Telegramm eingeht, dass den Wert bestimmt. Das kann sowohl ein Antworttelegramm (GroupValueResponse) wie auch ein Schreibtelegramm (GroupValueWrite) sein. 6 | 7 | Diese Funktion wird vor allem nach einem Neustart des gesamten KNX-Busses von Nutzen sein, da Lesetelegramme womöglich nicht sofort beantwortet werden können, falls das antwortende Gerät sich selbst noch in der Startphase befindet. Hier kann man diese Lesetelegramme so lange wiederholen lassen, bis sie beantwortet werden können, anschließend kann ohne aktives Nachfragen auf normale Schreibtelegramme reagiert werden. 8 | 9 | Dies erlaubt es, eine KNX-Anlage nach einem Neustart relativ schnell in einen Zustand zu versetzen, bei dem alle Initialisierungen erfolgt sind und alle Funktionen erwartungskonform ausgeführt werden. 10 | 11 | > **Tipp:** Auch wenn die Logik selbst den gelesenen Wert nicht braucht, kann man mit der Funktion andere Geräte unterstützen, die selbst nicht nach einem Neustart lesen können. Denn auf das Antworttelegramm kann nicht nur das lesende Gerät reagieren, sondern alle Geräte am Bus. 12 | 13 | -------------------------------------------------------------------------------- /include/README: -------------------------------------------------------------------------------- 1 | 2 | This directory is intended for project header files. 3 | 4 | A header file is a file containing C declarations and macro definitions 5 | to be shared between several project source files. You request the use of a 6 | header file in your project source file (C, C++, etc) located in `src` folder 7 | by including it, with the C preprocessing directive `#include'. 8 | 9 | ```src/main.c 10 | 11 | #include "header.h" 12 | 13 | int main (void) 14 | { 15 | ... 16 | } 17 | ``` 18 | 19 | Including a header file produces the same results as copying the header file 20 | into each source file that needs it. Such copying would be time-consuming 21 | and error-prone. With a header file, the related declarations appear 22 | in only one place. If they need to be changed, they can be changed in one 23 | place, and programs that include the header file will automatically use the 24 | new version when next recompiled. The header file eliminates the labor of 25 | finding and changing all the copies as well as the risk that a failure to 26 | find one copy will result in inconsistencies within a program. 27 | 28 | In C, the usual convention is to give header files names that end with `.h'. 29 | It is most portable to use only letters, digits, dashes, and underscores in 30 | header file names, and at most one dot. 31 | 32 | Read more about using header files in official GCC documentation: 33 | 34 | * Include Syntax 35 | * Include Operation 36 | * Once-Only Headers 37 | * Computed Includes 38 | 39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html 40 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Continuous Integration (CI) is the practice, in software 2 | # engineering, of merging all developer working copies with a shared mainline 3 | # several times a day < https://docs.platformio.org/page/ci/index.html > 4 | # 5 | # Documentation: 6 | # 7 | # * Travis CI Embedded Builds with PlatformIO 8 | # < https://docs.travis-ci.com/user/integration/platformio/ > 9 | # 10 | # * PlatformIO integration with Travis CI 11 | # < https://docs.platformio.org/page/ci/travis.html > 12 | # 13 | # * User Guide for `platformio ci` command 14 | # < https://docs.platformio.org/page/userguide/cmd_ci.html > 15 | # 16 | # 17 | # Please choose one of the following templates (proposed below) and uncomment 18 | # it (remove "# " before each line) or use own configuration according to the 19 | # Travis CI documentation (see above). 20 | # 21 | 22 | 23 | # 24 | # Template #1: General project. Test it using existing `platformio.ini`. 25 | # 26 | 27 | # language: python 28 | # python: 29 | # - "2.7" 30 | # 31 | # sudo: false 32 | # cache: 33 | # directories: 34 | # - "~/.platformio" 35 | # 36 | # install: 37 | # - pip install -U platformio 38 | # - platformio update 39 | # 40 | # script: 41 | # - platformio run 42 | 43 | 44 | # 45 | # Template #2: The project is intended to be used as a library with examples. 46 | # 47 | 48 | # language: python 49 | # python: 50 | # - "2.7" 51 | # 52 | # sudo: false 53 | # cache: 54 | # directories: 55 | # - "~/.platformio" 56 | # 57 | # env: 58 | # - PLATFORMIO_CI_SRC=path/to/test/file.c 59 | # - PLATFORMIO_CI_SRC=examples/file.ino 60 | # - PLATFORMIO_CI_SRC=path/to/test/directory 61 | # 62 | # install: 63 | # - pip install -U platformio 64 | # - platformio update 65 | # 66 | # script: 67 | # - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N 68 | -------------------------------------------------------------------------------- /src/TimerHoliday.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /*********************************** 4 | * 5 | * Do all time relevant processing in logicmodule 6 | * 7 | * *********************************/ 8 | 9 | #include "OpenKNX.h" 10 | #include 11 | #include 12 | #include 13 | 14 | #define REMOVED 0 15 | #define EASTER -1 16 | #define ADVENT -2 17 | 18 | 19 | struct sDay 20 | { 21 | int8_t day; 22 | int8_t month; 23 | 24 | bool operator==(const sDay &other) const { 25 | return (day == other.day && month == other.month); 26 | } 27 | }; 28 | 29 | class TimerHoliday 30 | { 31 | private: 32 | struct tm mTimeHelper; 33 | 34 | int16_t mYearTick = -1; // easter calculation happens each time year changes 35 | int8_t mMonthTick = -1; // sunrise/sunset calculation happens each time the month changes 36 | int8_t mDayTick = -1; // sunrise/sunset calculation happens each time the day changes 37 | 38 | const std::string logPrefix(); 39 | 40 | void calculateEaster(uint16_t lYear); 41 | void calculateAdvent(int tm_year); 42 | 43 | protected: 44 | static const uint8_t cHolidaysCount = 35; 45 | static sDay cHolidays[cHolidaysCount]; 46 | 47 | // force update on first holiday calculation 48 | uint8_t mHolidayToday = 255; 49 | uint8_t mHolidayTomorrow = 255; 50 | 51 | sDay mEaster = {0, 0}; // easter sunday 52 | sDay mAdvent = {0, 0}; // fourth advent 53 | 54 | sDay getDayByOffset(int8_t iOffset, sDay &iDate, uint16_t year); 55 | 56 | public: 57 | bool calculateHolidays(uint16_t year, int8_t month, int8_t day, bool iDebugOutput = false); 58 | 59 | void setup(); 60 | // void loop(); 61 | void updateDate(tm mNow, bool sendHolidays = true); 62 | 63 | sDay *getEaster(); 64 | char *getTimeAsc(); 65 | uint8_t holidayToday(); 66 | uint8_t holidayTomorrow(); 67 | void sendHoliday(); 68 | }; 69 | 70 | -------------------------------------------------------------------------------- /src/KnxHelper.cpp: -------------------------------------------------------------------------------- 1 | #include "KnxHelper.h" 2 | 3 | static Dpt sDpt[] = { 4 | Dpt(1, 1), 5 | Dpt(2, 1), 6 | Dpt(5, 10), 7 | Dpt(5, 1), 8 | Dpt(6, 1), 9 | Dpt(7, 1), 10 | Dpt(8, 1), 11 | Dpt(9, 2), 12 | Dpt(16, 1), 13 | Dpt(17, 1), 14 | Dpt(232, 600), 15 | Dpt(10, 1, 1), 16 | Dpt(11, 1), 17 | Dpt(12, 1), 18 | Dpt(13, 1), 19 | Dpt(14, 1), 20 | Dpt(19, 1), 21 | Dpt(5, 10)}; // DPT3 is sent as a number 22 | 23 | Dpt &getDPT(uint8_t iDptIndex) 24 | { 25 | return sDpt[iDptIndex]; 26 | } 27 | 28 | /*********************************************************** 29 | * calculate delay from 2 byte delay pattern used in knxprod 30 | * iAsSeconds: true=return seconds, false=return milliseconds 31 | * first 2 bit: 32 | * 00 - seconds 33 | * 01 - minutes 34 | * 10 - hours 35 | * 11 - seconds/10 36 | * 37 | * remaining 14 bit: uint14 38 | */ 39 | uint32_t getDelayPattern(uint16_t iParamIndex, bool iAsSeconds /* = false */) 40 | { 41 | 42 | uint16_t lParam = knx.paramWord(iParamIndex); 43 | uint16_t lTime = lParam & VAL_TIME_MASK; 44 | 45 | switch (lParam & VAL_TIMEBASE_MASK) 46 | { 47 | case VAL_TIMEBASE_TENTH_SECONDS: 48 | return (iAsSeconds) ? lTime / 10 : lTime * 100; 49 | break; 50 | case VAL_TIMEBASE_SECONDS: 51 | return (iAsSeconds) ? lTime : lTime * 1000; 52 | break; 53 | case VAL_TIMEBASE_MINUTES: 54 | return (iAsSeconds) ? lTime * 60 : lTime * 60000; 55 | break; 56 | case VAL_TIMEBASE_HOURS: 57 | // for hour, we can only cover 1193 hours, we allow just 1000 here 58 | if (lTime > 1000) 59 | lTime = 1000; 60 | return (iAsSeconds) ? lTime * 3600 : lTime * 3600000; 61 | break; 62 | 63 | default: 64 | return 0; 65 | break; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-AUS-an-ein-zusaetzliches-KO-senden.md: -------------------------------------------------------------------------------- 1 | ### Wert für AUS an ein zusätzliches KO senden 2 | 3 | Ein Ausgang kann seinen AUS-Wert nicht nur über das ihm zugewiesene KO senden, sondern auch zusätzlich an ein internes KO. Das bedeutet, der Wert wird in ein beliebiges KO des Gerätes (nicht nur des Logikmoduls) geschrieben, ohne dass dafür eine GA-Verknüpfung notwendig ist. 4 | 5 | > Wichtig: Der DPT des Ziel-KO muss der gleiche sein wie der DPT des Ausgangs. Falls nicht, sind die Ergebnisse nicht abschätzbar. 6 | 7 | 8 | #### Eigenes KO 9 | 10 | Das ist der Standardwert und bedeutet, dass der Wert des Ausgangs an das KO, dass für diesen 11 | Ausgang vorgesehen ist, gesendet wird. 12 | 13 | Zu Informationszwecken wird die Nummer des KO angegeben, das diesem Ausgang zugeordnet ist. 14 | 15 | #### Absolutes KO 16 | 17 | Wird absolutes KO ausgewählt, kann man die Nummer des KO angeben, an das der Wert des Ausgangs gesendet wird. Das kann ein beliebiges KO des Gerätes sein, auf dem das Logikmodul läuft. Es können auch KO anderer Module angegeben werden. 18 | 19 | Ist eine GA mit dem eigenen KO des Ausgangs verknüpft, wird der Wert des Ausgangs auch an diese GA gesendet. 20 | 21 | #### Relatives KO 22 | 23 | Wie bei "Absolutes KO" wird der Wert des Ausgangs an ein anderes KO gesendet. Man gibt aber einen relativen Wert (Offset) ein und die Nummer des Ziel-KO wird ausgerechnet. Den berechneten Wert sieht man zur Information direkt hinter dem Eingabefeld. 24 | 25 | Relative KO sind von Vorteil, wenn man häufiger mit Logiken arbeitet, die aus mehreren Logikkanälen bestehen (Logikblock). Verbindet man die Logiken eines Logikblocks über relative KO-Verknüpfungen, können diese Logikblöcke innerhalb des Logikmoduls verschoben werden oder auf ein anderes Logikmodul kopiert werden (mittels Konfigurationstransfer), ohne dass die KO-Verknüpfungen invalidiert werden. 26 | 27 | Ist eine GA mit dem eigenen KO des Ausgangs verknüpft, wird der Wert des Ausgangs auch an diese GA gesendet. 28 | 29 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-EIN-an-ein-zusaetzliches-KO-senden.md: -------------------------------------------------------------------------------- 1 | ### Wert für EIN an ein zusätzliches KO senden 2 | 3 | 4 | Ein Ausgang kann seinen EIN-Wert nicht nur über das ihm zugewiesene KO senden, sondern auch zusätzlich an ein internes KO. Das bedeutet, der Wert wird in ein beliebiges KO des Gerätes (nicht nur des Logikmoduls) geschrieben, ohne dass dafür eine GA-Verknüpfung notwendig ist. 5 | 6 | > Wichtig: Der DPT des Ziel-KO muss der gleiche sein wie der DPT des Ausgangs. Falls nicht, sind die Ergebnisse nicht abschätzbar. 7 | 8 | 9 | #### Eigenes KO 10 | 11 | Das ist der Standardwert und bedeutet, dass der Wert des Ausgangs an das KO, dass für diesen 12 | Ausgang vorgesehen ist, gesendet wird. 13 | 14 | Zu Informationszwecken wird die Nummer des KO angegeben, das diesem Ausgang zugeordnet ist. 15 | 16 | #### Absolutes KO 17 | 18 | Wird absolutes KO ausgewählt, kann man die Nummer des KO angeben, an das der Wert des Ausgangs gesendet wird. Das kann ein beliebiges KO des Gerätes sein, auf dem das Logikmodul läuft. Es können auch KO anderer Module angegeben werden. 19 | 20 | Ist eine GA mit dem eigenen KO des Ausgangs verknüpft, wird der Wert des Ausgangs auch an diese GA gesendet. 21 | 22 | #### Relatives KO 23 | 24 | Wie bei "Absolutes KO" wird der Wert des Ausgangs an ein anderes KO gesendet. Man gibt aber einen relativen Wert (Offset) ein und die Nummer des Ziel-KO wird ausgerechnet. Den berechneten Wert sieht man zur Information direkt hinter dem Eingabefeld. 25 | 26 | Relative KO sind von Vorteil, wenn man häufiger mit Logiken arbeitet, die aus mehreren Logikkanälen bestehen (Logikblock). Verbindet man die Logiken eines Logikblocks über relative KO-Verknüpfungen, können diese Logikblöcke innerhalb des Logikmoduls verschoben werden oder auf ein anderes Logikmodul kopiert werden (mittels Konfigurationstransfer), ohne dass die KO-Verknüpfungen invalidiert werden. 27 | 28 | Ist eine GA mit dem eigenen KO des Ausgangs verknüpft, wird der Wert des Ausgangs auch an diese GA gesendet. 29 | 30 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Logik-sendet-ihren-Wert-weiter.md: -------------------------------------------------------------------------------- 1 | ### Logik sendet ihren Wert weiter 2 | 3 | Diese Auswahlbox erlaubt eine Detaillierte Einstellung des Verhaltens. 4 | 5 | #### Nur bei geändertem Ergebnis 6 | 7 | Das Ergebnis der Logikauswertung wird nur dann weitergeschickt, wenn sich das Ergebnis geändert hat. Dazu wird das zuvor ermittelte Ergebnis der Logik (wichtig: nicht das Ergebnis am Ausgang des Logikkanals) herangezogen und mit dem aktuellen Ergebnis verglichen. Weicht es ab, wird das gerade ermittelte Ergebnis weitergeleitet. 8 | 9 | #### Nur bei geändertem Ergebnis, aber erstes Telegramm immer senden 10 | 11 | Diese Einstellung hat ein spezifisches Verhalten beim Neustart der Logik. Bei einem Neustart ist nicht klar, was "geändertes Ergebnis" heißt. Mit dieser Einstellung sagt man klar, dass das erste Ergebnis der Logik immer als "geändert" behandelt wird und so weitergeschickt wird. Gleichzeitig stellt das Ergebnis den Vergleichswert für die nächste Logikoperation dar, anhand dessen ein "geändertes Ergebnis" festgestellt werden kann. 12 | 13 | #### Nur bei geändertem Ergebnis, aber erstes Telegramm nicht senden 14 | 15 | Diese Einstellung hat ein spezifisches Verhalten beim Neustart der Logik. Bei einem Neustart ist nicht klar, was "geändertes Ergebnis" heißt. Mit dieser Einstellung sagt man klar, dass das erste Ergebnis der Logik immer als "nicht geändert" behandelt wird und somit nicht weitergeschickt wird. Gleichzeitig stellt das Ergebnis den Vergleichswert für die nächste Logikoperation dar, anhand dessen ein "geändertes Ergebnis" festgestellt werden kann. 16 | 17 | #### bei allen Eingangstelegrammen 18 | 19 | Sobald ein neues Eingangstelegramm eintrifft, wird das Ergebnis der logischen Verknüpfung ermittelt und an den nächsten Funktionsblock weitergeleitet. 20 | 21 | #### bei allen Eingangstelegrammen, aber erstes Telegramm nicht senden 22 | 23 | Sobald ein neues Eingangstelegramm eintrifft, wird das Ergebnis der logischen Verknüpfung ermittelt und an den nächsten Funktionsblock weitergeleitet. Allerdings wird das erste Telegramm nach einem Neustart unterdrückt. Damit kann man vermeiden, dass mögliche Statusmeldungen bei einem Neustart ungewollt Logiken bzw. Folgelogiken auslösen. 24 | 25 | #### bei folgenden Eingangstelegrammen 26 | 27 | 28 | Es erscheint eine Liste mit allen aktiven Eingängen. 29 | -------------------------------------------------------------------------------- /src/SunRiSet.h: -------------------------------------------------------------------------------- 1 | // Implementation of Sun Rise and Set Times based on SUNRISET.C by Paul Schlyter 1989-2013. 2 | // Original C code available at https://www.stjarnhimlen.se/comp/sunriset.c (copy in sunriset.c.txt) 3 | // was modified for C++ and OpenKNX. 4 | // For detailed explaination/documentation see https://www.stjarnhimlen.se/comp/riset.html 5 | 6 | #pragma once 7 | 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | 14 | // #define SUN_SUNRISE 0x00 15 | // #define SUN_SUNSET 0x01 16 | 17 | /* 18 | struct sTime 19 | { 20 | int8_t minute; 21 | int8_t hour; 22 | }; 23 | 24 | struct sDay 25 | { 26 | int8_t day; 27 | int8_t month; 28 | }; 29 | */ 30 | 31 | class SunRiSet 32 | { 33 | 34 | 35 | protected: 36 | /* 37 | sTime mSunrise; 38 | sTime mSunset; 39 | void calculateSunriseSunset(); 40 | void convertToLocalTime(double iTime, sTime *eTime); 41 | */ 42 | 43 | public: 44 | static int sunRiseSet(int year, int month, int day, double lon, double lat, 45 | double altit, int upper_limb, double *rise, double *set); 46 | private: 47 | static void sunPos(double d, double *lon, double *r); 48 | static void sunRadDec(double d, double *RA, double *dec, double *r); 49 | static double revolution(double x); 50 | static double rev180(double x); 51 | static double GMST0(double d); 52 | 53 | /* 54 | float mLongitude; 55 | float mLatitude; 56 | 57 | sTime *getSunInfo(uint8_t iSunInfo); 58 | void getSunDegree(uint8_t iSunInfo, double iDegree, sTime *eSun); 59 | */ 60 | }; 61 | 62 | /* A macro to compute the number of days elapsed since 2000 Jan 0.0 */ 63 | /* (which is equal to 1999 Dec 31, 0h UT) */ 64 | 65 | #define days_since_2000_Jan_0(y, m, d) \ 66 | (367L * (y) - ((7 * ((y) + (((m) + 9) / 12))) / 4) + ((275 * (m)) / 9) + (d)-730530L) 67 | 68 | /* Some conversion factors between radians and degrees */ 69 | 70 | // #ifndef PI 71 | // #define PI 3.1415926535897932384 72 | // #endif 73 | 74 | #define RADEG (180.0 / PI) 75 | #define DEGRAD (PI / 180.0) 76 | 77 | /* The trigonometric functions in degrees */ 78 | 79 | #define sind(x) sin((x)*DEGRAD) 80 | #define cosd(x) cos((x)*DEGRAD) 81 | #define tand(x) tan((x)*DEGRAD) 82 | 83 | #define atand(x) (RADEG * atan(x)) 84 | #define asind(x) (RADEG * asin(x)) 85 | #define acosd(x) (RADEG * acos(x)) 86 | #define atan2d(y, x) (RADEG * atan2(y, x)) 87 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Kommunikationsobjekt-fuer-Eingang.md: -------------------------------------------------------------------------------- 1 | ### Kommunikationsobjekt für Eingang 2 | 3 | Ein Eingang des Logikobjekts wird durch ein Kommunikationsobjekt repräsentiert. Dabei kann jedes Kommunikationsobjekt des Gerätes verwendet werden, auch KO, die nicht vom Logikmodul verwaltet werden. Dies ermöglicht, KO intern zu verbinden und so die Kommunikation auf dem Bus zu reduzieren. Eine solche interne Verbindung verhält sich genau so, als wäre der Eingang mit einer GA verbunden und Telegramme erhalten würde. 4 | 5 | Es gibt 2 Möglichkeiten, interne KO-Verknüpfungen zu realisieren: Absolut und relativ. 6 | 7 | * Absolute KO-Verknüpfungen werden über die Angabe einer KO-Nummer vorgenommen. Dieses KO wird dann für den Eingang benutzt. 8 | * Relative KO-Verknüpfungen werden über die Angabe eines KO-Offsets vorgenommen. Das eigentliche KO wird dadurch ermittelt, dass der angegebene Offset zur Nummer des eigenen KO addiert wird und so das Ziel-KO ermittelt wird. 9 | 10 | Relative und absolute KO-Verknüpfungen funktionieren absolut identisch. Relative Verknüpfungen sind von Vorteil, wenn man Logikblöcke baut, die aus mehreren Kanälen bestehen. Falls solche Logikblöcke mal verschoben oder auf ein anderes Gerät kopiert werden sollen, bekommen die Ein- und Ausgänge neue KO-Nummern. Wenn innerhalb der Logikblöcke mit relativen KO-Verknüpfungen gearbeitet wurde, funktionieren die Logikblöcke weiterhin, bei absoluten KO-Verknüpfungen müssen alle KO-Nummern angepasst werden. 11 | 12 | #### Eigenes KO 13 | 14 | Für den Eingang wird das Kommunikationsobjekt benutzt, dass für diesen Eingang vorgesehen ist. Dieses KO ist somit komplett vom Logikmodul kontrolliert und verwaltet. 15 | 16 | #### **Absolutes KO" 17 | 18 | Der Eingang wird durch ein existierendes Kommunikationsobjekt erzeugt, dessen KO-Nummer direkt angegeben wird. 19 | 20 | Das Kommunikationsobjekt wird anderweitig verwaltet, z.B. durch einen anderen Kanal oder eine andere Teilapplikation. Der Eingang "lauscht" somit nur auf die ankommenden Signale und kann keinerlei Aktionen an dem KO vornehmen, wie z.B. den DPT bestimmen oder Lese-Anforderungen verschicken. 21 | 22 | #### **Relatives KO" 23 | 24 | Der Eingang wird durch ein existierendes Kommunikationsobjekt erzeugt, dessen KO-Nummer berechnet wird, indem die eigene KO-Nummer genommen wird und der eingegebene Offset addiert wird. 25 | 26 | Das Kommunikationsobjekt wird anderweitig verwaltet, z.B. durch einen anderen Kanal oder eine andere Teilapplikation. Der Eingang "lauscht" somit nur auf die ankommenden Signale und kann keinerlei Aktionen an dem KO vornehmen, wie z.B. den DPT bestimmen oder Lese-Anforderungen verschicken. 27 | 28 | -------------------------------------------------------------------------------- /src/tinyexpr.h: -------------------------------------------------------------------------------- 1 | /* 2 | * TINYEXPR - Tiny recursive descent parser and evaluation engine in C 3 | * 4 | * Copyright (c) 2015-2018 Lewis Van Winkle 5 | * 6 | * http://CodePlea.com 7 | * 8 | * This software is provided 'as-is', without any express or implied 9 | * warranty. In no event will the authors be held liable for any damages 10 | * arising from the use of this software. 11 | * 12 | * Permission is granted to anyone to use this software for any purpose, 13 | * including commercial applications, and to alter it and redistribute it 14 | * freely, subject to the following restrictions: 15 | * 16 | * 1. The origin of this software must not be misrepresented; you must not 17 | * claim that you wrote the original software. If you use this software 18 | * in a product, an acknowledgement in the product documentation would be 19 | * appreciated but is not required. 20 | * 2. Altered source versions must be plainly marked as such, and must not be 21 | * misrepresented as being the original software. 22 | * 3. This notice may not be removed or altered from any source distribution. 23 | */ 24 | 25 | #ifndef __TINYEXPR_H__ 26 | #define __TINYEXPR_H__ 27 | 28 | 29 | #ifdef __cplusplus 30 | extern "C" { 31 | #endif 32 | 33 | 34 | 35 | typedef struct te_expr { 36 | int type; 37 | union {double value; const double *bound; const void *function;}; 38 | void *parameters[1]; 39 | } te_expr; 40 | 41 | 42 | enum { 43 | TE_VARIABLE = 0, 44 | 45 | TE_FUNCTION0 = 8, TE_FUNCTION1, TE_FUNCTION2, TE_FUNCTION3, 46 | TE_FUNCTION4, TE_FUNCTION5, TE_FUNCTION6, TE_FUNCTION7, 47 | 48 | TE_CLOSURE0 = 16, TE_CLOSURE1, TE_CLOSURE2, TE_CLOSURE3, 49 | TE_CLOSURE4, TE_CLOSURE5, TE_CLOSURE6, TE_CLOSURE7, 50 | 51 | TE_FLAG_PURE = 32 52 | }; 53 | 54 | typedef struct te_variable { 55 | const char *name; 56 | const void *address; 57 | int type; 58 | void *context; 59 | } te_variable; 60 | 61 | 62 | 63 | /* Parses the input expression, evaluates it, and frees it. */ 64 | /* Returns NaN on error. */ 65 | double te_interp(const char *expression, int *error); 66 | 67 | /* Parses the input expression and binds variables. */ 68 | /* Returns NULL on error. */ 69 | te_expr *te_compile(const char *expression, const te_variable *variables, int var_count, int *error); 70 | 71 | /* Evaluates the expression. */ 72 | double te_eval(const te_expr *n); 73 | 74 | /* Prints debugging information on the syntax tree. */ 75 | void te_print(const te_expr *n); 76 | 77 | /* Frees the expression. */ 78 | /* This is safe to call on NULL pointers. */ 79 | void te_free(te_expr *n); 80 | 81 | 82 | #ifdef __cplusplus 83 | } 84 | #endif 85 | 86 | #endif /*__TINYEXPR_H__*/ 87 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Falls-Vorbelegung-aus-dem-Speicher-nicht-moeglich-oder-nicht-gewuenscht-dann-vorbelegen-mit.md: -------------------------------------------------------------------------------- 1 | ### Falls Vorbelegung aus dem Speicher nicht möglich oder nicht gewünscht, dann vorbelegen mit 2 | 3 | Dieses Auswahlfeld erlaubt eine Vorbelegung mit einem festgelegten Wert. Die Einstellung kommt aber nur zur Auswirkung, falls die vorhergehende Einstellung "Eingangswert speichern und beim nächsten Neustart als Vorbelegung nutzen" auf "Nein" steht oder der gespeicherte Wert nicht genutzt werden kann. 4 | 5 | Es gibt einige wenige Gründe, warum ein gespeicherter Wert nicht genutzt werden kann: 6 | 7 | * Der gespeicherte Wert hat einen anderen DPT. Das passiert, wenn man das Gerät mit der Einstellung "Speichern" in Benutzung hat, dann in der ETS den DPT für den Eingang ändert und das Gerät neu programmiert. Nach dem Neustart passen dann der gespeicherte DPT und der DPT vom Eingang nicht zusammen. Der gespeicherte Wert wird dann verworfen und die Einstellung dieses Feldes als Vorbelegung genommen. 8 | * Es ist bisher gar kein Wert gespeichert worden, dann kann er natürlich auch nicht genutzt werden und stattdessen wird die Einstellung dieses Feldes als Vorbelegung genommen. Dies passiert immer, wenn man das erste Mal ein "Ja" beim "Eingangswert Speichern" geklickt hat. 9 | * Es ist eine neue Firmware aufgespielt worden und die gespeicherten Werte wurden gelöscht. Das passiert immer, wenn die Werte im FLASH gespeichert werden. 10 | * Durch einen Speicherfehler konnte vor einem Neustart der Wert vom Eingang nicht gespeichert werden. Auch dann wird die Einstellung dieses Feldes als Vorbelegung genutzt. Dieser Fall ist rein Theoretisch und noch nie in der Praxis aufgetreten. 11 | 12 | Durch ein Einspielen einer neuen Applikation über die ETS werden die gespeicherten Werte im nichtflüchtigen Speicher nicht gelöscht. 13 | 14 | #### nichts (undefiniert) 15 | 16 | Der Eingang wird nicht vorbelegt und bleibt undefiniert, bis ein erstes Telegramm vom KNX-Bus empfangen wird. 17 | 18 | #### Wert vom Bus lesen 19 | 20 | Nach der eingestellten Startverzögerung für das gesamte Gerät zuzüglich der Startverzögerung für den Logikkanal wird ein Lesetelegramm auf den KNX-Bus geschickt. Bis die Antwort empfangen wurde ist der Eingang undefiniert. 21 | 22 | Sollte in der Zeit, bis der Logikkanal startet, bereits ein Telegramm empfangen werden, dass das Lesetelegramm beantwortet hätte, wird das Lesetelegramm nicht gesendet. Damit wird verhindert, dass mehrere Eingänge, die mit der gleichen GA verbunden sind, viele Lesetelegramme auf die gleiche GA schicken. 23 | 24 | #### AUS (0) 25 | 26 | Der Eingang wird konstant mit einer 0 vorbelegt und hat somit sofort einen definierten Zustand. 27 | 28 | #### EIN (1) 29 | 30 | Der Eingang wird konstant mit einer 1 vorbelegt und hat somit sofort einen definierten Zustand. 31 | 32 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Logik-Operation.md: -------------------------------------------------------------------------------- 1 | ### Logik-Operation 2 | 3 | Mittels der Auswahlliste kann eine Operation und damit die Art der Verknüpfung der Eingänge dieses Logikkanals ausgewählt werden. Es stehen folgende Operationen zur Verfügung: 4 | 5 | #### aus 6 | 7 | Dieser Logikkanal nicht definiert und nicht aktiv. Es stehen keine Eingänge und kein Ausgang zur Verfügung. Alle entsprechenden KO sind ausgeblendet. 8 | 9 | #### UND 10 | 11 | Alle Eingänge werden über ein logisches UND verknüpft. Das Ergebnis der Verknüpfung ist EIN, wenn alle Eingänge des Funktionsblock EIN sind. Das Ergebnis ist AUS, wenn auch nur ein Eingang AUS ist. 12 | 13 | #### ODER 14 | 15 | Alle Eingänge werden über ein logisches ODER verknüpft. Das Ergebnis der Verknüpfung ist EIN, sobald nur ein Eingang des Funktionsblock EIN ist. Das Ergebnis ist AUS, wenn alle Eingänge AUS sind. 16 | 17 | #### EXKLUSIV-ODER 18 | 19 | Alle Eingänge werden über ein logisches Exklusiv-ODER verknüpft. Das Ergebnis der Verknüpfung ist EIN, wenn eine ungerade Anzahl von Eingängen des Funktionsblock EIN sind. Das Ergebnis ist AUS, wenn eine gerade Anzahl von Eingängen EIN sind. 20 | 21 | #### TOR 22 | 23 | Ein Tor hat normalerweise einen Dateneingang, Datenausgang und einen Toreingang. Wird das Tor über ein Signal am Toreingang geöffnet, können Daten vom Dateneingang zum Datenausgang fließen. Wird das Tor geschlossen, dann fließen keine Daten zwischen Dateneingang und Datenausgang. 24 | 25 | Wird das Signal am Toreingang invertiert (negiert), dann sprechen wir von einer Sperre. 26 | 27 | Da ein Logikkanal 4 Eingänge hat, ist bei einem Tor 28 | 29 | Dateneingang = Eingang 1 ODER Interner Eingang 3 30 | Toreingang = Eingang 2 ODER Interner Eingang 4 31 | 32 | (in Worten: Jeweils ein externer und ein interner Eingang werden über ein ODER verknüpft und bilden den entsprechenden Eingang der TOR-Verknüpfung). 33 | 34 | #### ZEITSCHALTUHR 35 | 36 | Dieser Logikkanal hat keine Eingänge, sondern repräsentiert eine Zeitschaltuhr. Der Ausgang wird somit durch entsprechende Zeitschaltpunkte geschaltet. Der Ausgang kann immer noch passende Funktionsmodule enthalten. 37 | 38 | #### SCHALTER (RS-FLIP_FLOP) 39 | 40 | Dieser Logikkanal hat den Eingang 1, der bei einem EIN-Signal den Ausgang EINschaltet. Der Eingang 2 schaltet bei einem EIN-Signal den Ausgang AUS. Ein AUS-Signal auf einem der beiden Eingänge bewirkt nichts. 41 | 42 | Mit dem Schalter lassen sich viele Funktionen, die vorher nur mit 2 Kanälen zu lösen waren, jetzt mit nur einem Kanal lösen, was die Übersichtlichkeit der Logiken erhöht. 43 | 44 | Der Schalter ermöglicht die Realisierung eines einfachen Szenen-Controllers (siehe Beispiele). Ferner können damit Hysterese-Logiken aufgebaut werden, bei denen die Ein- und Ausschaltbedingung aus 2 verschiedenen Quellen kommt (z.B. verschiedene DPT). 45 | 46 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Eingangswert-speichern-und-beim-naechsten-Neustart-als-Vorbelegung-nutzen.md: -------------------------------------------------------------------------------- 1 | ### Eingangswert speichern und beim nächsten Neustart als Vorbelegung nutzen 2 | 3 | Mit "Ja" legt man fest, dass der zuletzt an diesem Eingang empfangene Wert im nichtflüchtigen Speicher abgelegt wird und nach einem Neustart wieder gelesen wird. Der dann gelesene Wert wird als Vorbelegung für den Eingang genommen, falls nötig über den Eingangskonverter in einen DPT 1 konvertiert und dann die logische Operation getriggert. Ist der Eingang als interner Eingang über sein KO mit weiteren Eingängen verbunden (egal ob das KO im Logikmodul oder einem anderen Modul liegt, das das Logikmodul verwendet), empfangen auch alle verknüpften Eingänge den aus dem nichtflüchtigen Speicher geladenen Wert. 4 | 5 | Normalerweise triggert der neu geladene Wert die zugeordnete Logikfunktion und kann über den zugehörigen Ausgang auf den Bus gesendet werden. Man kann allerdings den Wert auch direkt vom Eingang auf den Bus senden lassen: 6 | 7 | * Über eine aktive Leseanforderung: Hierzu muss das L-Flag am zugehörigen Eingang gesetzt werden 8 | * Aktives Senden gleich nach einem Neustart: Hierzu muss das Ü-Flag am zugehörigen Eingang gesetzt werden 9 | 10 | > **Achtung:** Da das Lesen vom nichtflüchtigen Speicher direkt nach einem Neustart geschieht und alle Initialisierungen sofort laufen, werden beim Setzen des Ü-Flag am Eingang jegliche gelesenen Werte sofort gesendet und nicht erst, nachdem die Zeit abgelaufen ist, bis der Kanal aktiv wird. Das ist der Grund, warum das Ü-Flag nicht standardmäßig gesetzt ist. Würden alle 99 möglichen Kanäle bei einem Neustart ihre Werte von nichtflüchtigen Speicher lesen und sofort senden, würden die resultierenden 99 Telegramme sofort den Bus überlasten und einige davon verloren gehen. Um solche Situationen zu vermeiden, sollte man einen aus dem nichtflüchtigen Speicher gelesenen Wert über den Ausgang auf den Bus senden, dieser Wert wird dann erst gesendet, nachdem der entsprechende Kanal aktiv ist. 11 | 12 | Da nichtflüchtige Speicher nur eine relativ geringe Anzahl an Schreibzyklen zulassen, wird der Eingangswert nicht direkt nach dem Empfang im Speicher geschrieben, sondern erst beim Stromausfall, bei einem "Gerät zurücksetzen" über die ETS oder bei einer Neuprogrammierung über die ETS. Wird die RESET-Taste direkt am Gerät gedrückt, wird der nichtflüchtige Speicher nicht mit dem Eingangswert beschrieben. 13 | 14 | > **Wichtig:** Das speichern der Werte in den nichtflüchtigen Speicher bei Stromausfall ist hardwareabhängig und wird nicht von jeder Hardware unterstützt. Auch in einem solchen Fall kann die Funktion sinnvoll sein, z.B. bie einem Neustart nach einer ETS-Programmierung, deswegen wird die Funktion immer angeboten. Ob ein Speichern beim Stromausfall unterstützt wird, steht (hoffentlich) in der Anleitung zum Hardware-Gerät, dass das Logikmodul verwendet. 15 | 16 | -------------------------------------------------------------------------------- /src/Timer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /*********************************** 4 | * 5 | * Do all time relevant processing in logicmodule 6 | * 7 | * *********************************/ 8 | 9 | #include "OpenKNX.h" 10 | #include 11 | #include 12 | #include 13 | 14 | #include "TimerHoliday.h" 15 | 16 | 17 | #define MINYEAR 2022 18 | 19 | #define SUN_SUNRISE 0x00 20 | #define SUN_SUNSET 0x01 21 | 22 | #define REMOVED 0 23 | #define EASTER -1 24 | #define ADVENT -2 25 | 26 | // Values for Summertime 27 | #define VAL_STIM_FROM_KO 0 28 | #define VAL_STIM_FROM_DPT19 1 29 | #define VAL_STIM_FROM_INTERN 2 30 | 31 | // DPT19 special flags 32 | #define DPT19_FAULT 0x80 33 | #define DPT19_WORKING_DAY 0x40 34 | #define DPT19_NO_WORKING_DAY 0x20 35 | #define DPT19_NO_YEAR 0x10 36 | #define DPT19_NO_DATE 0x08 37 | #define DPT19_NO_DAY_OF_WEEK 0x04 38 | #define DPT19_NO_TIME 0x02 39 | #define DPT19_SUMMERTIME 0x01 40 | 41 | struct sTime 42 | { 43 | int8_t minute; 44 | int8_t hour; 45 | }; 46 | 47 | enum eTimeValid 48 | { 49 | tmInvalid, 50 | tmMinutesValid, 51 | tmDateValid, 52 | tmValid 53 | }; 54 | 55 | class Timer 56 | { 57 | private: 58 | const std::string logPrefix(); 59 | 60 | protected: 61 | TimerHoliday holiday; 62 | 63 | struct tm mTimeHelper; 64 | bool mUseSummertime; 65 | bool mIsSummertime; 66 | eTimeValid mTimeValid = tmInvalid; 67 | uint32_t mTimeDelay = 0; 68 | bool mMinuteChanged = false; 69 | sTime mSunrise; 70 | sTime mSunset; 71 | int8_t mMinuteTick = -1; // timer evaluation is called each time the minute changes 72 | int8_t mHourTick = -1; // timer evaluation is called each time the hour changes 73 | int8_t mDayTick = -1; // sunrise/sunset calculation happens each time the day changes 74 | int8_t mMonthTick = -1; // sunrise/sunset calculation happens each time the month changes 75 | int16_t mYearTick = -1; // easter calculation happens each time year changes 76 | 77 | void calculateSunriseSunset(); 78 | void convertToLocalTime(double iTime, sTime *eTime); 79 | 80 | Timer(); 81 | ~Timer(); 82 | Timer(const Timer &); // make copy constructor private 83 | Timer &operator=(const Timer &); // prevent copy 84 | 85 | public: 86 | // singleton! 87 | static Timer &instance(); 88 | struct tm mNow; 89 | float mLongitude; 90 | float mLatitude; 91 | 92 | void setup(); 93 | bool loop(); 94 | void debug(); 95 | 96 | uint8_t getDay(); 97 | uint8_t getMonth(); 98 | uint16_t getYear(); 99 | uint8_t getHour(); 100 | uint8_t getMinute(); 101 | uint8_t getSecond(); 102 | uint8_t getWeekday(); 103 | sTime *getSunInfo(uint8_t iSunInfo); 104 | void getSunDegree(uint8_t iSunInfo, double iDegree, sTime *eSun); 105 | sDay *getEaster(); 106 | char *getTimeAsc(); 107 | uint8_t holidayToday(); 108 | uint8_t holidayTomorrow(); 109 | eTimeValid isTimerValid(); 110 | }; 111 | 112 | -------------------------------------------------------------------------------- /src/Logic.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "LogicChannel.h" 3 | #include "OpenKNX.h" 4 | #include "Timer.h" 5 | #include "TimerRestore.h" 6 | 7 | #define USERDATA_MAGIC_OFFSET 0 // start of magic word in flash 8 | #define USERDATA_DPT_OFFSET 4 // start of DPT storage in flash 9 | #define USERDATA_KO_OFFSET 204 // start of KO values in flash (2 KO per channel, 4 Byte per KO) 10 | 11 | // Watchdog reset causes 12 | #define WDT_RCAUSE_SYSTEM 6 // reset by system itself 13 | #define WDT_RCAUSE_WDT 5 // reset by watchdog 14 | #define WDT_RCAUSE_EXT 4 // reset by reset signal 15 | #define WDT_RCAUSE_POR 0 // power on reset 16 | 17 | // typedef void (*loopCallback)(void *iThis); 18 | // struct sLoopCallbackParams { 19 | // loopCallback callback; 20 | // void *instance; 21 | // }; 22 | 23 | struct sKoLookup 24 | { 25 | uint16_t koNumber; 26 | uint8_t channelIndex; 27 | uint8_t ioIndex; 28 | }; 29 | 30 | class Logic : public OpenKNX::Module 31 | { 32 | public: 33 | Logic(); 34 | ~Logic(); 35 | 36 | // instance 37 | void addKoLookup(uint16_t iKoNumber, uint8_t iChannelId, uint8_t iIOIndex); 38 | bool getKoLookup(uint16_t iKoNumber, sKoLookup **iKoLookup = nullptr); 39 | LogicChannel *getChannel(uint8_t iChannelId); 40 | 41 | void processAllInternalInputs(LogicChannel *iChannel, bool iValue); 42 | void processAfterStartupDelay(); 43 | void processInputKo(GroupObject &iKo); 44 | void showHelp() override; 45 | bool processCommand(const std::string cmd, bool debugKo) override; 46 | void initLoadCounter(bool iAll); 47 | bool sendReadRequest(GroupObject &ko); 48 | 49 | void debug(); 50 | void setup(); 51 | void loop(); 52 | 53 | bool processFunctionProperty(uint8_t objectIndex, uint8_t propertyId, uint8_t length, uint8_t *data, uint8_t *resultData, uint8_t &resultLength) override; 54 | void readFlash(const uint8_t *iBuffer, const uint16_t iSize) override; 55 | void writeFlash() override; 56 | uint16_t flashSize() override; 57 | const std::string name() override; 58 | const std::string version() override; 59 | 60 | // TODO check removal from public api! 61 | tm &Now(); 62 | bool timeValid(); 63 | char gBuffer[14] = {0}; 64 | 65 | private: 66 | static const uint8_t helpCommandCount = 10; 67 | 68 | static uint8_t sMagicWord[]; 69 | static Timer &sTimer; 70 | static TimerRestore &sTimerRestore; 71 | static const char* helpCommands[]; 72 | 73 | LogicChannel *mChannel[LOG_ChannelCount]; 74 | uint8_t mNumChannels; // Number of channels defined in knxprod 75 | uint8_t mChannelIterator = 0; 76 | 77 | // we need a lookup for external KO 78 | static const uint16_t cCountKoLookups = LOG_ChannelCount * 3; 79 | sKoLookup mKoLookup[cCountKoLookups]; // max 3*4*100 = 1200 Byte, too much? 80 | uint16_t mNumKoLookups = 0; 81 | uint32_t readRequestDelay = 0; 82 | 83 | uint8_t getChannelId(LogicChannel *iChannel); 84 | void prepareChannels(); 85 | 86 | void processDiagnoseCommand(GroupObject &iKo); 87 | 88 | void processTimerRestore(); 89 | }; 90 | 91 | extern Logic openknxLogic; -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Bei-Neustart-letzte-Schaltzeit-nachholen.md: -------------------------------------------------------------------------------- 1 | ### Bei Neustart letzte Schaltzeit nachholen 2 | 3 | Erscheint nur bei Zeitschaltuhren, die nicht verbunden sind und die Urlaubsbehandlung aktiviert haben. Bei verbundenen Zeitschaltuhren gilt die Definition der ersten (nicht verbundenen) Zeitschaltuhr. 4 | 5 | Nach einem Neustart des Moduls kann die letzte Schaltzeit erneut ausgeführt werden. Sobald das Datum und die Uhrzeit erstmals über den Bus gesetzt worden sind, wird nach der spätesten Schaltzeit gesucht, die noch vor dem aktuellen Datum/Uhrzeit liegt. Dieser Schaltzeitpunkt wird dann ausgeführt. 6 | 7 | Da eine Nachberechnung aller Schaltzeiten für bis zu 99 Zeitschaltuhren inklusive Feiertagsbehandlung direkt nach dem ersten Setzen der Zeit über den Bus sehr lange dauern würde und in dieser Zeit (mehrere Sekunden) die Funktion des Moduls gestört wäre, wird die Nachberechnung der Schaltzeiten durch einen Nebenprozess während der normalen Funktion des Moduls durchgeführt. Der Nebenprozess funktioniert in kleinen Schritten, die wenig Rechenzeit kosten und die Normalfunktion nicht behindern. Als Konsequenz kann es etwas dauern, bis der entsprechende nachberechnete Zeitschaltpunkt nachgeholt wird. 8 | 9 | Wie lange es dauert, bis ein nachberechneter Zeitschaltpunkt nachgeholt wird, hängt wiederum vom Zeitschaltpunkt selbst ab. 10 | 11 | Der Nebenprozess wird pro Sekunde zweimal aufgerufen und geht dabei jeweils einen weiteren Tag zurück, berechnet für diesen Tag die Feiertage und prüft für jede Zeitschaltuhr, die bisher noch keinen definierten Ausgangswert hat (sie könnte ja schon von sich aus im Rahmen der Normalfunktion geschaltet haben), ob diese Zeitschaltuhr an diesem Tag schalten sollte. Wenn ja, dann schaltet diese Zeitschaltuhr mit dem für diesen Tag zeitlich spätesten Wert. Damit ist der zeitlich späteste Schaltpunkt vor dem Modulneustart gegeben. 12 | 13 | Obiges bedeutet, dass der Nebenprozess für Tagesschaltuhren, die auch Wochentage enthalten können, bis zu 3 Sekunden benötigen kann, um eine (Tages-)Schaltzeit nachzuholen, da er 2 Tage pro Sekunde zurückgeht. 14 | 15 | Bei Jahresschaltuhren wird der späteste Schaltzeitpunkt, der nachberechnet wurde, 366 / 2 = 183 Sekunden nach dem ersten setzen der Zeit über den Bus erreicht, also etwa 3 Minuten nach dem Neustart. Dies ist ein theoretischer Wert, da in diesem Fall der Schaltzeitpunkt vor einem Jahr liegen müsste und sich zwischendurch nicht geändert hat. Da man meistens aber einen Schaltzeitpunkt für EIN und einen für AUS definiert, wird bei Jahresschaltzeiten wahrscheinlich einer der Schaltzeitpunkte bereits früher erreicht. 16 | 17 | Der Nebenprozess beendet sich selbst, sobald alle Zeitschaltuhren einen definierten Ausgangswert haben. 18 | 19 | > **Achtung:** Zeitschaltuhren, die Urlaubstage berücksichtigen, können bei der Nachberechnung der Zeitschaltpunkte nicht mit einbezogen werden, da die Information "Urlaubstag" per KO von extern dem Modul über den Bus gemeldet wird und somit nicht für die (historische) Nachberechnung zur Verfügung steht. Somit werden bei der Nachberechnung alle Zeitschaltuhren mit einer anderen Angabe als "Urlaub nicht beachten" ignoriert. 20 | 21 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-AUS-senden.md: -------------------------------------------------------------------------------- 1 | ### Wert für AUS senden? 2 | 3 | In dieser Auswahlbox wird festgelegt, ob und was für ein Wert bei einem AUS-Signal gesendet werden soll. 4 | 5 | #### Nein 6 | 7 | Für ein AUS-Signal wird kein Wert auf den Bus gesendet. Das entspricht einem Ausgangsfilter, der alle AUS-Signale unterdrückt. 8 | 9 | #### Ja - Wert vorgeben 10 | 11 | Hier kann der Wert, der für ein AUS-Signal gesendet wird, konstant vorgegeben werden. In einem weiteren Feld kann der konstante Wert DPT gerecht eingegeben werden. 12 | 13 | #### Ja - Wert von Eingang 1 14 | 15 | Bei einem AUS-Signal wird der Wert gesendet, der am Eingang 1 anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 16 | 17 | #### Ja - Wert von Eingang 2 18 | 19 | Bei einem AUS-Signal wird der Wert gesendet, der am Eingang 2 anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 20 | 21 | #### Ja - Wert eines KO 22 | Bei einem AUS-Signal wird der Wert gesendet, der am angegebenen KO anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 23 | 24 | Man kann somit einen Wert senden, der an irgendeinem KO des Gerätes anliegt. Es sind explizit alle KO-Nummern erlaubt, nicht nur die KO-Nummern des Logikmoduls. Einzige Einschränkung: Es sind nur DPT erlaubt, die von einem Eingang des Logikmoduls unterstützt werden. 25 | 26 | #### Ja - Wert einer Funktion 27 | 28 | Bei einem AUS-Signal wird ein berechneter Wert gesendet. In einem weiteren Feld kann die Funktion ausgewählt werden, die angewendet werden soll. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 29 | 30 | Im Kapitel Funktionen kann nachgelesen werden, wie Funktionen und Benutzerfunktionen verwendet werden können. 31 | 32 | #### Ja - ReadRequest senden 33 | 34 | Bei einem AUS-Signal wird kein Wert auf die GA am Ausgang gesendet sondern ein Lesetelegramm. Damit kann man für Geräte, die kein zyklisches Senden unterstützen, bei Bedarf eine Abfrage eines Ausgangs erreichen. 35 | 36 | #### Ja - 'Gerät zurücksetzen' senden 37 | 38 | Bei einem AUS-Signal wird kein Wert gesendet, sondern die ETS-Funktion "Gerät zurücksetzen" an eine bestimmte PA geschickt. So kann man bestimmte Geräte überwachen und bei Bedarf zurücksetzen, ohne die ETS starten zu müssen. 39 | 40 | #### Ja - Tonwiedergabe (Buzzer) 41 | 42 | Wird nur angeboten, wenn ein Buzzer vorhanden ist. 43 | 44 | Bei einem AUS-Signal wird kein Wert gesendet, sondern der interne Buzzer zur Tonwiedergabe angesprochen. In einem weiteren Feld wird angegeben, ob die Tonwiedergabe gestartet oder gestoppt wird. 45 | 46 | Falls der Buzzer gerade über das Kommunikationsobjekt 19 gesperrt ist, wird kein Ton ausgegeben und ein eventueller laufender Ton abgeschaltet. 47 | 48 | Falls dieser Kanal als Alarmkanal gekennzeichnet ist, wird ein Ton unabhängig von der Sperre ausgegeben. 49 | 50 | #### Ja - RGB-LED schalten 51 | 52 | Wird nur angeboten, wenn eine RGB-LED vorhanden ist. 53 | 54 | Bei einem AUS-Signal wird kein Wert gesendet, sondern die interne RBG-LED angesprochen. So kann man eine optische Rückmeldung erreichen. 55 | 56 | In einem weiteren Feld wird die Farbe eingestellt. Ist die Farbe Schwarz eingestellt, wir die LED ausgeschaltet. 57 | 58 | Falls die LED gerade über das Kommunikationsobjekt 18 gesperrt ist, wird die LED nicht eingeschaltet und falls sie an ist, wird sie abgeschaltet. 59 | 60 | Falls dieser Kanal als Alarmkanal gekennzeichnet ist, wird die LED unabhängig von der Sperre eingeschaltet. 61 | 62 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Wert-fuer-EIN-senden.md: -------------------------------------------------------------------------------- 1 | ### Wert für EIN senden? 2 | 3 | 4 | In dieser Auswahlbox wird festgelegt, ob und was für ein Wert bei einem EIN-Signal gesendet werden soll. 5 | 6 | #### Nein 7 | 8 | Für ein EIN-Signal wird kein Wert auf den Bus gesendet. Das entspricht einem Ausgangsfilter, der alle EIN-Signale unterdrückt. 9 | 10 | #### Ja - Wert vorgeben 11 | 12 | Hier kann der Wert, der für ein EIN-Signal gesendet wird, konstant vorgegeben werden. In einem weiteren Feld kann der konstante Wert DPT gerecht eingegeben werden. 13 | 14 | #### Ja - Wert von Eingang 1 15 | 16 | Bei einem EIN-Signal wird der Wert gesendet, der am Eingang 1 anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 17 | 18 | #### Ja - Wert von Eingang 2 19 | 20 | Bei einem EIN-Signal wird der Wert gesendet, der am Eingang 2 anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 21 | 22 | #### Ja - Wert eines KO 23 | Bei einem EIN-Signal wird der Wert gesendet, der am angegebenen KO anliegt. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 24 | 25 | Man kann somit einen Wert senden, der an irgendeinem KO des Gerätes anliegt. Es sind explizit alle KO-Nummern erlaubt, nicht nur die KO-Nummern des Logikmoduls. Einzige Einschränkung: Es sind nur DPT erlaubt, die von einem Eingang des Logikmoduls unterstützt werden. 26 | 27 | #### Ja - Wert einer Funktion 28 | 29 | Bei einem EIN-Signal wird ein berechneter Wert gesendet. In einem weiteren Feld kann die Funktion ausgewählt werden, die angewendet werden soll. Sollte der Wert nicht den passenden DPT haben, wird er generisch gewandelt. 30 | 31 | Im Kapitel Funktionen kann nachgelesen werden, wie Funktionen und Benutzerfunktionen verwendet werden können. 32 | 33 | #### Ja - ReadRequest senden 34 | 35 | Bei einem EIN-Signal wird kein Wert auf die GA am Ausgang gesendet sondern ein Lesetelegramm. Damit kann man für Geräte, die kein zyklisches Senden unterstützen, bei Bedarf eine Abfrage eines Ausgangs erreichen. 36 | 37 | #### Ja - 'Gerät zurücksetzen' senden 38 | 39 | Bei einem EIN-Signal wird kein Wert gesendet, sondern die ETS-Funktion "Gerät zurücksetzen" an eine bestimmte PA geschickt. So kann man bestimmte Geräte überwachen und bei Bedarf zurücksetzen, ohne die ETS starten zu müssen. 40 | 41 | In einem weiteren Feld kann die PA ausgegeben werden. 42 | 43 | #### Ja - Tonwiedergabe (Buzzer) 44 | 45 | Wird nur angeboten, wenn ein Buzzer vorhanden ist. 46 | 47 | Bei einem EIN-Signal wird kein Wert gesendet, sondern der interne Buzzer zur Tonwiedergabe angesprochen. In einem weiteren Feld wird angegeben, in welcher Lautstärke die Tonwiedergabe gestartet oder ob sie gestoppt wird. 48 | 49 | Falls der Buzzer gerade über das Kommunikationsobjekt 19 gesperrt ist, wird kein Ton ausgegeben und ein eventueller laufender Ton abgeschaltet. 50 | 51 | Falls dieser Kanal als Alarmkanal gekennzeichnet ist, wird ein Ton unabhängig von der Sperre ausgegeben. 52 | 53 | 54 | #### Ja - RGB-LED schalten 55 | 56 | Wird nur angeboten, wenn eine RGB-LED vorhanden ist. 57 | 58 | Bei einem EIN-Signal wird kein Wert gesendet, sondern die interne RBG-LED angesprochen. So kann man eine optische Rückmeldung erreichen. 59 | 60 | In einem weiteren Feld wird die Farbe eingestellt. Ist die Farbe Schwarz eingestellt, wir die LED ausgeschaltet. 61 | 62 | Falls die LED gerade über das Kommunikationsobjekt 18 gesperrt ist, wird die LED nicht eingeschaltet und falls sie an ist, wird sie abgeschaltet. 63 | 64 | Falls dieser Kanal als Alarmkanal gekennzeichnet ist, wird die LED unabhängig von der Sperre eingeschaltet. 65 | 66 | -------------------------------------------------------------------------------- /src/Logikmodul.script.js: -------------------------------------------------------------------------------- 1 | function LOG_Nop(input, output, context) { } 2 | 3 | function LOG_ClearContent(input, output, context) { 4 | output.ResultDisplay = ""; 5 | } 6 | 7 | function LOG_checkUserFormula(device, online, progress, context) { 8 | var lFormulaIndex = context.formulaIndex; 9 | var lParFormulaName = "LOG_UserFormula" + lFormulaIndex; 10 | progress.setText("Logik: Benutzerformel " + lFormulaIndex + " prüfen..."); 11 | var resp = LOG_processUserFormula(1, lParFormulaName, lFormulaIndex, device, online, progress, context); 12 | if (resp[0] == 0) { 13 | progress.setText("Logik: Benutzerformel " + lFormulaIndex + " ist korrekt"); 14 | } 15 | } 16 | 17 | function LOG_testUserFormula(device, online, progress, context) { 18 | progress.setText("Logik: Testformel berechnen..."); 19 | var resp = LOG_processUserFormula(2, "LOG_TestFormula", 0, device, online, progress, context); 20 | if (resp[0] == 0) { 21 | // result is a 0 terminated string 22 | var result = ""; 23 | for (var index = 1; resp[index] > 0 && index < 32; index++) { 24 | result += String.fromCharCode(resp[index]); 25 | } 26 | progress.setText("Logik: Testformel ergibt " + result); 27 | var parTestResult = device.getParameterByName("LOG_TestFormulaResult"); 28 | parTestResult.value = result; 29 | } 30 | } 31 | 32 | function LOG_processUserFormula(command, parFormulaName, iFormulaIndex, device, online, progress, context) { 33 | // first we try to get rid of all '\n' strings 34 | newline(device, online, progress, { "textbox": parFormulaName }) 35 | 36 | var parFormula = device.getParameterByName(parFormulaName); 37 | var lFormula = parFormula.value; 38 | if (lFormula.length == 0) { 39 | throw new Error("Logik: Formel ist leer"); 40 | } 41 | online.connect(); 42 | var data = [command]; // check user formula command 43 | 44 | // user formula index to check 45 | data = data.concat(iFormulaIndex); 46 | // send formula length to avoid APDU problems 47 | data = data.concat(lFormula.length); 48 | // we send the client formula, because it might not have been sent to device 49 | // and we convert everything to lowercase 50 | for (var i = 0; i < lFormula.length; i++) { 51 | var code = lFormula.charCodeAt(i); 52 | // if (code >= 65 && code <= 90) code += 32; 53 | data = data.concat([code]); 54 | } 55 | data = data.concat(0); // ensure zero-terminated string 56 | 57 | var resp = online.invokeFunctionProperty(160, 4, data); 58 | online.disconnect(); 59 | if (resp[0] == 0) 60 | return resp; 61 | else if (resp[0] == -1) 62 | throw new Error("Logik: Fehler bei der Übertragung:\n\nAPDU ist zu kurz, prüfen der Formel nicht möglich"); 63 | else { 64 | var lErr = resp[0]; 65 | var lErrorFormula = parFormula.value; 66 | var lStart = lErrorFormula.substr(0, lErr - 1); 67 | var lLetter = lErrorFormula.charAt(lErr - 1); 68 | var lEnd = lErrorFormula.slice(lErr); 69 | throw new Error("Logik: Fehler bei '" + lLetter + "':\n\n" + lStart + " ==>" + lLetter + "<== " + lEnd); 70 | } 71 | } 72 | 73 | function LOG_CalcAbsFromRel(input, output, context) { 74 | if (input.AbsRel == 2) { 75 | output.AbsReadKO = context.OwnKO + input.RelWriteKO; 76 | output.AbsWriteKO = output.AbsReadKO; 77 | } 78 | } 79 | 80 | function LOG_CalcRelFromAbs(input, output, context) { 81 | if (output.AbsRel == 1) { 82 | output.RelWriteKO = input.AbsWriteKO - context.OwnKO; 83 | } 84 | } 85 | 86 | -------------------------------------------------------------------------------- /doc/Applikationsbeschreibung-Editieren.md: -------------------------------------------------------------------------------- 1 | 4 | # Editieren der Applikationsbeschreibung 5 | 6 | Die nachfolgende Anleitung beschreibt die Schritte für das Bearbeiten der Applikationsbeschreibung eines Moduls. Dabei wird die Installation von Visual Studio Code (VSCode) und das Clonen eines Projektes für die Arbeitsschritte vorausgesetzt. 7 | 8 | ## Änderungshistorie 9 | 10 | Im folgenden werden Änderungen an dem Dokument erfasst, damit man nicht immer das Gesamtdokument lesen muss, um Neuerungen zu erfahren. 11 | 12 | 02.09.2022: Initiale Version 13 | 14 | 15 | ## **Einleitung** 16 | 17 | In den jeweiligen Projekten dient die Applikationsbeschreibung dazu, die Funktionalitäten und Applikationsmöglichkeiten des Moduls zu beschreiben. Die Beschreibung ist als Textfile im Markdown Format im Unterverzeichnis /doc des Projektes abgelegt und kann in github direkt mit einem Browser und vielen anderen Programmen formatiert angezeigt werden. 18 | 19 | ## **Vorbereitungen** 20 | 21 | * Das jeweilige Projekt (workspace) im VSCode öffnen 22 | * Aus der Menüleiste auf der linken Seite Git Source Control auswählen 23 | * Durch Auswahl der drei Punkte rechts oben den Befehl "git fetch" für das Projekt ausführen 24 | * Sicherstellen, dass man im branch "main" ist 25 | * wenn nicht, dann durch einen Klick auf das Feld zum branch "main" wechseln 26 | * Abschließend noch ein "Git Pull" (wieder über das Untermenü der drei Punkte) ausführen 27 | * Danach einen neuen working branch erzeugen und in diesen branch wechseln 28 | 29 | ![Git](pics/Git-Pull-Fetch.png) 30 | 31 | * Im VSCode-Explorer den Pfad für die Applikationsbeschreibung finden. Der Pfad ist jeweils in dem Projekt im Unterverzeichnis ../doc und enthält in einem weiteren Unterverzeichnis (../pics) die zugehörigen Bilder. In den Unterverzeichnis ../technical können weitere technische Informationen z.B. für Diagnoseausgaben abgelegt werden. 32 | 33 | In diesem Beispiel für das OAM-LogicModule/doc 34 | auf Applikationsbeschreibung-Logik.md klicken 35 | 36 | ![Dateiauswahl](pics/Dateiauswahl.png) 37 | 38 | 39 | ## **Text bearbeiten** 40 | 41 | Im Editor sieht man jetzt den Quelltext für die Dokumentation, das Format ist "Markdown". 42 | Durch einen Klick auf das Symbol Preview im Editor ![Vorschau](pics/Vorschau.png) (oben rechts), wird in einem weiteren Fenster eine ungefähre Vorschau auf die Ausgabe in github angezeigt. 43 | 44 | 45 | Um an einer Dokumentation erst einmal unabhängig zu arbeiten, ohne ggf. aus Versehen die bisherige Version zu verändern, ist es sinnvoll temporär einen neuen Branch (z.B."Vorname-doc") anzulegen und dort zu editieren. Nach einem Review wird dieser Branch mit der bestehenden Version zusammengeführt. 46 | 47 | ## **Screenshots erzeugen** 48 | 49 | Screenshots unter Win10 erstellt man am einfachsten mit der Tastenkombination "Shift+Win+S", dabei kann man den Bereich auswählen. Danach erscheint ein Editor, von dem aus das Bild gesichert werden kann. Dabei immer als png-Format sichern und auf Groß-Kleinschreibung achten. 50 | 51 | ## **Bilder einbinden** 52 | Gespeichert werden alle Bilder im Unterverzeichnis pics im doc-Ordner. 53 | Das Konstrukt `![Bildunterschrift](pics/Dateiname.png)` bindet das Bild dann ein. Das `...` erzeugt dabei einen Rahmen um das Bild, um die Lesbarkeit zu verbessern. In der Vorschau wird dieser Rahmen noch nicht angezeigt. Das Wort in eckigen Klammern ist frei wählbar und sollte eine Bildunterschrift sein. Es erscheint bei manchen Browsern als Tooltip, wenn man mit der Maus über dem Bild ist. Gedacht ist es für Blindenunterstützung, der Text erscheint auch auf der Braille-Zeile. In den runden Klammern ist dann der **relative** Pfad zum Bild, in diesem Fall immer pics/, gefolgt vom Dateinamen (case sensitive) mit der Endung .png. 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/Logikmodul.input-intko.part.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/LogicValue.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | class LogicValue 7 | { 8 | public: 9 | LogicValue(bool value); 10 | LogicValue(uint8_t value); 11 | LogicValue(uint16_t value); 12 | LogicValue(uint32_t value); 13 | // LogicValue(uint64_t value); 14 | LogicValue(int8_t value); 15 | LogicValue(int16_t value); 16 | LogicValue(int32_t value); 17 | // LogicValue(int64_t value); 18 | LogicValue(double value); 19 | LogicValue(float value); 20 | LogicValue(const char* value); 21 | 22 | operator bool() const; 23 | operator uint8_t() const; 24 | operator uint16_t() const; 25 | operator uint32_t() const; 26 | // operator uint64_t() const; 27 | operator int8_t() const; 28 | operator int16_t() const; 29 | operator int32_t() const; 30 | // operator int64_t() const; 31 | operator double() const; 32 | operator float() const; 33 | operator const char*() const; 34 | 35 | LogicValue& operator=(const bool value); 36 | LogicValue& operator=(const uint8_t value); 37 | LogicValue& operator=(const uint16_t value); 38 | LogicValue& operator=(const uint32_t value); 39 | // LogicValue& operator=(const uint64_t value); 40 | LogicValue& operator=(const int8_t value); 41 | LogicValue& operator=(const int16_t value); 42 | LogicValue& operator=(const int32_t value); 43 | // LogicValue& operator=(const int64_t value); 44 | LogicValue& operator=(const double value); 45 | LogicValue& operator=(const float value); 46 | LogicValue& operator=(const char* value); 47 | 48 | LogicValue& operator++(); 49 | // LogicValue& operator++(int); 50 | 51 | LogicValue& operator+=(const int32_t value); 52 | LogicValue& operator+=(const double value); 53 | LogicValue& operator+=(const float value); 54 | 55 | bool operator>(LogicValue const& value); 56 | bool operator<(LogicValue const& value); 57 | bool operator>=(LogicValue const& value); 58 | bool operator<=(LogicValue const& value); 59 | 60 | LogicValue operator+(LogicValue const& value); 61 | LogicValue operator-(LogicValue const& value); 62 | LogicValue operator*(LogicValue const& value); 63 | LogicValue operator/(LogicValue const& value); 64 | LogicValue operator^(LogicValue const& value); 65 | 66 | LogicValue operator-(const int32_t value); 67 | LogicValue operator-(const float value); 68 | 69 | bool isInitial(); 70 | void isInitial(bool iValue); 71 | 72 | private: 73 | bool boolValue() const; 74 | uint8_t ucharValue() const; 75 | uint16_t ushortValue() const; 76 | uint32_t uintValue() const; 77 | // uint64_t ulongValue() const; 78 | int8_t charValue() const; 79 | int16_t shortValue() const; 80 | int32_t intValue() const; 81 | // int64_t longValue() const; 82 | double doubleValue() const; 83 | float floatValue() const; 84 | const char* stringValue() const; 85 | 86 | void setInternal(const uint32_t value); 87 | void setInternal(const int32_t value); 88 | void setInternal(const double value); 89 | void setInternal(const float value); 90 | void setInternal(const char* value); 91 | 92 | union Value 93 | { 94 | bool boolValue; 95 | uint8_t ucharValue; 96 | uint16_t ushortValue; 97 | uint32_t uintValue; 98 | // uint64_t ulongValue; 99 | int8_t charValue; 100 | int16_t shortValue; 101 | int32_t intValue; 102 | // int64_t longValue; 103 | double doubleValue; 104 | float floatValue; 105 | const char* stringValue; 106 | }; 107 | enum ValueType 108 | { 109 | BoolType, 110 | UCharType, 111 | UShortType, 112 | UIntType, 113 | // ULongType, 114 | CharType, 115 | ShortType, 116 | IntType, 117 | // LongType, 118 | DoubleType, 119 | FloatType, 120 | StringType, 121 | }; 122 | 123 | void setType(ValueType iType); 124 | 125 | ValueType _type; 126 | Value _value; 127 | bool _isInitial = false; 128 | }; -------------------------------------------------------------------------------- /src/PCA9632.cpp: -------------------------------------------------------------------------------- 1 | /** 2 | * Marlin 3D Printer Firmware 3 | * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] 4 | * 5 | * Based on Sprinter and grbl. 6 | * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm 7 | * 8 | * This program is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * This program is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with this program. If not, see . 20 | * 21 | */ 22 | 23 | /* 24 | * Driver for the Philips PCA9632 LED driver. 25 | * Written by Robert Mendon Feb 2017. 26 | */ 27 | 28 | 29 | #include "PCA9632.h" 30 | 31 | #define PCA9632_MODE1_VALUE 0b00000001 //(ALLCALL) 32 | #define PCA9632_MODE2_VALUE 0b00000001 //(DIMMING, NONINVERT, CHANGE ON STOP,OpenDrain) 33 | #define PCA9632_LEDOUT_VALUE 0b00101010 34 | 35 | 36 | /* Register addresses */ 37 | #define PCA9632_MODE1 0x00 38 | #define PCA9632_MODE2 0x01 39 | #define PCA9632_PWM0 0x02 40 | #define PCA9632_PWM1 0x03 41 | #define PCA9632_PWM2 0x04 42 | #define PCA9632_PWM3 0x05 43 | #define PCA9632_GRPPWM 0x06 44 | #define PCA9632_GRPFREQ 0x07 45 | #define PCA9632_LEDOUT 0X08 46 | #define PCA9632_SUBADR1 0x09 47 | #define PCA9632_SUBADR2 0x0A 48 | #define PCA9632_SUBADR3 0x0B 49 | #define PCA9632_ALLCALLADDR 0x0C 50 | 51 | #define PCA9632_NO_AUTOINC 0x00 52 | #define PCA9632_AUTO_ALL 0x80 53 | #define PCA9632_AUTO_IND 0xA0 54 | #define PCA9632_AUTOGLO 0xC0 55 | #define PCA9632_AUTOGI 0xE0 56 | 57 | // Red LED0 58 | // Green LED1 59 | // Blue LED2 60 | #define PCA9632_RED 0x00 61 | #define PCA9632_GRN 0x02 62 | #define PCA9632_BLU 0x04 63 | 64 | #define LED_OFF 0x00 65 | #define LED_ON 0x01 66 | #define LED_PWM 0x02 67 | 68 | #define PCA9632_ADDRESS 0b01100000 69 | 70 | byte PCA_init = 0; 71 | 72 | static void PCA9632_WriteRegister(const byte addr, const byte regadd, const byte value) { 73 | Wire.beginTransmission(addr); 74 | Wire.write(regadd); 75 | Wire.write(value); 76 | Wire.endTransmission(); 77 | } 78 | 79 | static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte value1, const byte value2, const byte value3) { 80 | Wire.beginTransmission(addr); 81 | Wire.write(PCA9632_AUTO_IND | regadd); 82 | Wire.write(value1); 83 | Wire.write(value2); 84 | Wire.write(value3); 85 | Wire.endTransmission(); 86 | } 87 | 88 | // static byte PCA9632_ReadRegister(const byte addr, const byte regadd) { 89 | // Wire.beginTransmission(addr); 90 | // Wire.write(regadd); 91 | // const byte value = Wire.read(); 92 | // Wire.endTransmission(); 93 | // return value; 94 | // } 95 | 96 | const uint16_t pwmtable[32] PROGMEM = 97 | { 98 | 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, 99 | 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255}; 100 | 101 | void PCA9632_SetColor(const byte iB, const byte iG, const byte iR) { 102 | if (!PCA_init) { 103 | PCA_init = 1; 104 | // Wire.begin(); 105 | PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_MODE1, PCA9632_MODE1_VALUE); 106 | PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_MODE2, PCA9632_MODE2_VALUE); 107 | } 108 | 109 | // we do logarithmic dimming here 110 | uint8_t lR = pwmtable[iR >> 3]; 111 | uint8_t lG = pwmtable[iG >> 3]; 112 | uint8_t lB = pwmtable[iB >> 3]; 113 | 114 | const byte LEDOUT = (lR ? LED_PWM << PCA9632_RED : LED_OFF) 115 | | (lG ? LED_PWM << PCA9632_GRN : LED_OFF) 116 | | (lB ? LED_PWM << PCA9632_BLU : LED_OFF); 117 | 118 | PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, lR, lG, lB); 119 | PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_LEDOUT, LEDOUT); 120 | } 121 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Zeitbezug.md: -------------------------------------------------------------------------------- 1 | ### Spalte: Zeitbezug 2 | 3 | Ist sowohl bei Tagesschaltuhr und Jahresschaltuhr vorhanden. 4 | 5 | Hier wird angegeben, wie eine Zeitangabe interpretiert werden soll. Je nach Einstellung dieses Feldes wirken sich Zeitangaben in den Spalten Stunde und Minute unterschiedlich aus. 6 | 7 | #### Schaltpunkt nicht aktiviert 8 | 9 | Dieser Schaltpunkt ist nicht aktiv und wird nicht ausgewertet. 10 | 11 | #### Zeitpunkt 12 | 13 | Es wird ein Zeitpunkt bestimmt, zu dem geschaltet werden soll. Die Angabe des Zeitpunktes erfolgt über die Spalten Stunde und Minute. 14 | 15 | #### Sonnenaufgang: plus Zeitversatz 16 | 17 | Der Schaltzeitpunkt ist der Sonnenaufgang, zu dem die Zeitangabe, die in den Spalten Stunde und Minute steht, hinzuaddiert wird. Es wird somit um die angegebenen Stunden und Minuten nach Sonnenaufgang geschaltet. 18 | 19 | #### Sonnenaufgang: minus Zeitversatz 20 | 21 | Der Schaltzeitpunkt ist der Sonnenaufgang, von dem die Zeitangabe, die in den Spalten Stunde und Minute steht, abgezogen wird. Es wird somit um die angegebenen Stunden und Minuten vor Sonnenaufgang geschaltet. Falls der Zeitversatz zu einer Zeit vor Mitternacht führt, wird nicht geschaltet. Man muss sich somit beim Zeitversatz innerhalb des selben Tages bewegen. 22 | 23 | 24 | #### Sonnenaufgang: Frühestens um 25 | 26 | Der Schaltzeitpunkt ist der Sonnenaufgang oder die Uhrzeit, die in den Spalten Stunde und Minute steht. Geht die Sonne vor der angegebenen Uhrzeit auf, wird erst um die angegebene Uhrzeit geschaltet, sonst erst beim Sonnenaufgang. Es wird somit beim Sonnenaufgang, aber nicht früher als die angegebene Uhrzeit geschaltet. 27 | 28 | #### Sonnenaufgang: Spätestens um 29 | 30 | Der Schaltzeitpunkt ist der Sonnenaufgang oder die Uhrzeit, die in den Spalten Stunde und Minute steht. Geht die Sonne nach der angegebenen Uhrzeit auf, wird bereits um die angegebene Uhrzeit geschaltet, sonst schon beim Sonnenaufgang. Es wird somit beim Sonnenaufgang, aber nicht später als die angegebene Uhrzeit geschaltet. 31 | 32 | #### Sonnenaufgang: Über Horizont 33 | 34 | Der Schaltzeitpunkt ist morgens, sobald die Sonne den Winkel über dem Horizont erreicht hat, der angegeben worden ist. Der Winkel kann in Grad und Minuten angegeben werden. Der Wertebereich geht von 0° bis 63°59'. 35 | 36 | #### Sonnenaufgang: Unter Horizont 37 | 38 | Der Schaltzeitpunkt ist morgens, sobald die Sonne den Winkel unter dem Horizont erreicht hat, der angegeben worden ist. Der Winkel kann in Grad und Minuten angegeben werden. Der Wertebereich geht von 0° bis 63°59'. 39 | 40 | #### Sonnenuntergang: plus Zeitversatz 41 | 42 | Der Schaltzeitpunkt ist der Sonnenuntergang, zu dem die Zeitangabe, die in den Spalten Stunde und Minute steht, hinzuaddiert wird. Es wird somit um die angegebenen Stunden und Minuten nach Sonnenuntergang geschaltet. Falls der Zeitversatz zu einer Zeit nach Mitternacht führt, wird nicht geschaltet. Man muss sich somit beim Zeitversatz innerhalb des selben Tages bewegen. 43 | 44 | 45 | #### Sonnenuntergang: minus Zeitversatz 46 | 47 | Der Schaltzeitpunkt ist der Sonnenuntergang, von dem die Zeitangabe, die in den Spalten Stunde und Minute steht, abgezogen wird. Es wird somit um die angegebenen Stunden und Minuten vor Sonnenuntergang geschaltet. 48 | 49 | #### Sonnenuntergang: Frühestens um 50 | 51 | Der Schaltzeitpunkt ist der Sonnenuntergang oder die Uhrzeit, die in den Spalten Stunde und Minute steht. Geht die Sonne vor der angegebenen Uhrzeit unter, wird erst um die angegebene Uhrzeit geschaltet, sonst erst beim Sonnenuntergang. Es wird somit beim Sonnenuntergang, aber nicht früher als die angegebene Uhrzeit geschaltet. 52 | 53 | #### **Sonnenuntergang: Spätestens um 54 | 55 | Der Schaltzeitpunkt ist der Sonnenuntergang oder die Uhrzeit, die in den Spalten Stunde und Minute steht. Geht die Sonne nach der angegebenen Uhrzeit unter, wird bereits um die angegebene Uhrzeit geschaltet, sonst schon beim Sonnenuntergang. Es wird somit beim Sonnenuntergang, aber nicht später als die angegebene Uhrzeit geschaltet. 56 | 57 | #### Sonnenuntergang: Über Horizont 58 | 59 | Der Schaltzeitpunkt ist abends, sobald die Sonne den Winkel über dem Horizont erreicht hat, der angegeben worden ist. Der Winkel kann in Grad und Minuten angegeben werden. Der Wertebereich geht von 0° bis 63°59'. 60 | 61 | #### Sonnenuntergang: Unter Horizont 62 | 63 | Der Schaltzeitpunkt ist abends, sobald die Sonne den Winkel unter dem Horizont erreicht hat, der angegeben worden ist. Der Winkel kann in Grad und Minuten angegeben werden. Der Wertebereich geht von 0° bis 63°59'. 64 | 65 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Definition-der-Benutzerformel.md: -------------------------------------------------------------------------------- 1 | ### Formeldefinition 2 | 3 | Hier wird die Benutzerformel eingegeben. Es wird normale C Formelsyntax unterstützt. Es stehen die unten aufgeführten Variablen, Konstanten, Operatoren und Funktionen zur Verfügung. Das Ergebnis der Formel wird immer dem Ausgang zugewiesen. 4 | 5 | Benutzerformeln werden immer mit dem Datentyp double (Fließkommazahl) berechnet. Alle Eingangsgrößen werden in double umgewandelt, dann wird gerechnet, anschließend wird das Ergebnis von double im Ausgangskonverter in den Ziel-DPT gewandelt. 6 | 7 | Eine Benutzerfunktion kann aus maximal 99 Zeichen bestehen. In einer Benutzerfunktion können auch andere Benutzerfunktionen aufgerufen werden. 8 | 9 | Um die Lesbarkeit einer Benutzerfunktion zu erhöhen, können neue Zeilen eingefügt werden. Da die ETS keine mehrzeiligen Eingabefelder zulässt, wird das gleiche Verfahren wie bei Kommentarfeldern verwendet: Die Zeichenfolge *\n*, gefolgt von einem Klick auf die Taste "Neue Zeilen aus '\n' machen". 10 | 11 | Eine Formel kann auch mit der Taste "Formel prüfen" auf ihre syntaktische Korrektheit geprüft werden. Dies passiert durch eine Online-Verbindung mit dem Gerät selbst. Damit die Taste "Formel prüfen" verfügbar ist, muss das Gerät der ETS bekannt sein. Dafür muss es mindestens einmal programmiert worden sein. 12 | 13 | Groß- und Kleinschreibung ist für die Formelauswertung nicht relevant. Man sollte die Formeln so notieren, dass die Lesbarkeit für einen selbst am höchsten ist. 14 | 15 | Wenn eine Formel zur Ausführungszeit einen Fehler enthält, liefert sie den Wert NaN (Not-a-Number). Das Ergebnis einer solchen Formel ändert nicht das Ausgangs-KO und der Wert wird nicht auf den Bus gesendet. Folgende Fehler sind möglich: 16 | 17 | * Formel ist syntaktisch falsch (Formel prüfen wurde z.B nicht ausgeführt) 18 | * Formel enthält eine Division durch 0 19 | * Formel enthält die Quadratwurzel einer negativen Zahl 20 | * Formel enthält den Logarithmus einer Zahl <= 0 21 | * Formel ruft mehr als 10 weitere Formeln auf (z.B. durch Rekursion) 22 | 23 | #### Variable E1 - Eingang 1 24 | 25 | E1 wird in der Formel als der aktuelle Wert vom Eingang 1 interpretiert. Der Wert wird generisch in eine Fließkommazahl gewandelt (double in C++) und dann mit dem Wert weitergerechnet. 26 | 27 | #### Variable E2 - Eingang 2 28 | 29 | E2 wird in der Formel als der aktuelle Wert vom Eingang 2 interpretiert. Der Wert wird generisch in eine Fließkommazahl gewandelt (double in C++) und dann mit dem Wert weitergerechnet. 30 | 31 | #### Variable A - Ausgang 32 | 33 | A wird in der Formel als der aktuelle Wert vom Ausgang interpretiert. Der Wert wird generisch in eine Fließkommazahl gewandelt (double in C++) und dann mit dem Wert weitergerechnet. 34 | 35 | #### Konstante e - Eulersche Zahl 36 | 37 | Die Konstante e wird mit dem Wert der Eulerschen Zahl belegt. 38 | 39 | #### Konstante pi - Kreiszahl 40 | 41 | Die Konstante pi wird mit dem Wert der Kreiszahl belegt. 42 | 43 | #### Operatoren 44 | 45 | Folgende Operatoren sind verfügbar: 46 | 47 | * '+' - Addition 48 | * '-' - Subtraktion 49 | * '*' - Multiplikation 50 | * '/' - Division 51 | * '*' - Multiplikation 52 | * '^' - Potenz 53 | * '%' - Modulo 54 | * '==' - Gleich 55 | * '!=' - Ungleich 56 | * '<' - Kleiner 57 | * '<=' - Kleiner gleich 58 | * '>' - Größer 59 | * '>=' - Größer gleich 60 | * '!' - Logisches 'Nicht' 61 | * '&&' - Logisches 'Und' 62 | * '||' - Logisches 'Oder' 63 | 64 | #### Funktionen 65 | 66 | Folgende Funktionen sind verfügbar: 67 | 68 | * 'if(c,p,q)' - Wenn c wahr ist, dann p sonst q 69 | * 'if2(c1,p,c2,q,r)' - Wenn c1 wahr ist, dann p sonst wenn c2 wahr ist, dann q sonst r 70 | * 'if3(c1,p,c2,q,c3,r,s)' - Wenn c1 wahr ist, dann p sonst wenn c2 wahr ist, dann q sonst wenn c3 wahr ist, dann r sonst s 71 | * 'b*n*(e1,e2,a)' - Benutzerfunktion *n* (für n=1 bis n=30) 72 | 73 | * 'abs(x)' - Absolutwert 74 | * 'sqrt(x)' - Quadratwurzel 75 | * 'pow(x,y)' - Potenz (x^y) 76 | * 'exp(x)' - Exponentialfunktion (e^x) 77 | * 'ln(x)' - natürlicher Logarithmus 78 | * 'log(x)' - Logarithmus zur Basis 10 79 | * 'fac(x)' - Fakultät 80 | * 'ncr(x,y)' - Kombination (nCr) 81 | * 'npr(x,y)' - Permutation (nPr) 82 | 83 | * 'round(x,n)' - Runde x an n-ter Stelle hinter dem Komma 84 | * 'ceil(x)' - nächstgrößere Ganzzahl 85 | * 'floor(x)' - nächstkleinere Ganzzahl 86 | 87 | * 'sin(x)' - Sinus 88 | * 'sinh(x)' - Sinus hyperbolicus 89 | * 'cos(x)' - Cosinus 90 | * 'cosh(x)' - Cosinus hyperbolicus 91 | * 'tan(x)' - Tangens 92 | * 'tanh(x)' - Tangens hyperbolicus 93 | * 'asin(x)' - Arcussinus 94 | * 'acos(x)' - Arcuscosinus 95 | * 'atan(x)' - Arcustangens 96 | 97 | * 'nan()' - Not-A-Number (liefert ungültigen Funktionswert) 98 | 99 | -------------------------------------------------------------------------------- /doc/technical/Zeitschaltuhr-Konzept.txt: -------------------------------------------------------------------------------- 1 | - Wir haben 8 Byte pro Eingang 2 | - Falls für Zeit die beiden Eingänge zusammengefallst werden, sind es 16 Byte 3 | - Das macht 128 Bit 4 | 5 | - 24 Stunden macht 5 Bit, 0-23 belegt, Werte 24-31 sind frei (8 Werte) 6 | - 60 Minuten macht 6 Bit, 0-59 belegt Werte 60-63 sind frei (4 Werte) 7 | - Sekundenauflösung ist nicht wichtig 8 | - Wochentag macht 3 Bit, 0-6 belegt, Wert 7 ist frei 9 | - Tag im Monat macht 5 Bit, 1-31 belegt, Wert 0 ist frei 10 | - Alternativ: Tag mit Werten *, 1-31 und letzter des Monats, und Mo-So, Feiertag (Freitag der 13 geht dann eben nicht), macht 6 Bit, was ist mit "nicht Feiertag" 11 | - Monat macht 4 Bit, 1-12 belegt, Wert 0 und 13-15 frei 12 | - Macht 21 Bit/Eintrag (mit alternative), somit 6 Zeitpunkte und 2 Bit verlust 13 | - Wahl von Tagesschaltpunkt oder Jahresschaltpunkt, dann pro Tag 14 Bit, somit 9 Zeitpunkte und auch 2 Bit verlust. 14 | - Aktuelle Idee: Tages- und Jahresschaltpunkt bekommen 1 Bit extra, um auch dynamische Schaltpunkte zu realisieren 15 | - Info ob Jahresschaltuhr oder Tagesschaltuhr und Feiertagsbehandlung kommen in ein extra Byte des Kanals 16 | - Wegen Veretzung von Bytegrenzen doch nur 4 Jahresschaltpunkte 17 | - Speicher wird bei Jahresschaltpunkten neu organisiert: 4 Tagesschaltpunkte en Block, dann die 4 Jahresinfos en Block 18 | 19 | Extra Byte: 20 | Bit 0: 0=Jahresschaltuhr; 1=Tagesschaltuhr 21 | Bit 1-2: Feiertagsbehandlung: 22 | 00=Feiertage nicht beachten 23 | 01=An Feiertagen nicht schalten 24 | 10=Nur an Feiertagen schalten 25 | 11=Feiertage wie Sonntage behandeln 26 | Bit 3-4: Urlaubsbehandlung 27 | 00=Urlaub nicht beachten 28 | 01=Bei Urlaub nicht schalten 29 | 10=Nur bei Urlaub schalten 30 | 11=Urlaub wie Sonntag behandeln 31 | Bit 5-6: Beim Neustart Schaltzeiten nachholen? (0=Nein, 1=Den letzen Schaltpunkt, 2=Die letzten beiden Schaltpunkte) 32 | Bit 7: frei für Erweiterungen 33 | 34 | Extra Long: Je 4 Bit pro Tabellenzeile für Zeitbezug 35 | 0x0: inaktiv 36 | 0x1: Zeitpunkt 37 | 0x4: Sonnenaufgang + 38 | 0x5: Sonnenaufgang - 39 | 0x6: Sonnenaufgang frühestens 40 | 0x7: Sonnenaufgang spätestens 41 | 0x8: Sonnenuntergang + 42 | 0x9: Sonnenuntergang - 43 | 0xA: Sonnenuntergang frühestens 44 | 0xB: Sonnenuntergang spätestens 45 | 46 | Speicheraufteilung (128 Bit) für Jahresschaltuhr mit 4 Zeitpunkten 47 | Bit 0-15: Jahresschaltpunkt 1 (Tagesanteil) 48 | Bit 16-31: Jahresschaltpunkt 2 (Tagesanteil) 49 | Bit 32-47: Jahresschaltpunkt 3 (Tagesanteil) 50 | Bit 48-63: Jahresschaltpunkt 4 (Tagesanteil) 51 | Bit 64-79: Jahresschaltpunkt 1 (Jahresanteil) 52 | Bit 80-95: Jahresschaltpunkt 2 (Jahresanteil) 53 | Bit 96-111: Jahresschaltpunkt 3 (Jahresanteil) 54 | Bit 112-127: Jahresschaltpunkt 4 (Jahresanteil) 55 | 56 | Speicheraufteilung (128 Bit) für Tagesschaltuhr mit 8 Zeitpunkten 57 | Bit 0-15: Tagesschaltpunkt 1 58 | Bit 16-31: Tagesschaltpunkt 2 59 | Bit 32-47: Tagesschaltpunkt 3 60 | Bit 48-63: Tagesschaltpunkt 4 61 | Bit 64-79: Tagesschaltpunkt 5 62 | Bit 80-95: Tagesschaltpunkt 6 63 | Bit 96-111: Tagesschaltpunkt 7 64 | Bit 112-127: Tagesschaltpunkt 8 65 | 66 | Speicheraufteilung Jahresschaltpunkt (2x16 Bit): 67 | Block 1: 68 | Bit 0-15: Wie Tagesschaltpunkt (wird auch technisch so verwendet) ohne Wochentag 69 | Bit 0: Schaltwert (0/1) 70 | Bit 1: ungenutzt 71 | Bit 2-6: Stunde; Werte 0-23; Sonderwerte: 31=* 72 | Bit 7-12: Minute; Werte 0-59; Sonderwerte: 63=* 73 | Bit 2-12: Alternativ relative Schaltzeit, siehe unten 74 | Bit 13-15: ungenutzt 75 | 76 | Block 2: 77 | Bit 0: Wochentag Montag 78 | Bit 1: Wochentag Dienstag 79 | Bit 2: Wochentag Mittwoch 80 | Bit 3: Wochentag Donnerstag 81 | Bit 4: Wochentag Freitag 82 | Bit 5: Wochentag Samstag 83 | Bit 6: Wochentag Sonntag 84 | Bit 0-6: Interpretation als Tag; Werte 1-31; Sonderwerte: 0=*; 32=letzter Tag im Monat 85 | Bit 7: 0=Tag; 1=Wochentag; gibt die Interpretation der Bits 0-6 an 86 | Bit 8-11: Monat; Werte 1-12; Sonderwerte: 0=* 87 | Bit 12-15: ungenutzt 88 | 89 | Speicheraufteilung Tagesschaltpunkt absolut/relativ (16 Bit): 90 | Bit 0: Schaltwert (0/1) 91 | Bit 1: ungenutzt 92 | Bit 2-6: Stunde; Werte 0-23; Sonderwerte: 31=*; bei relativer Schaltzeit kein * und nur 0-8 Stunden 93 | Bit 7-12: Minute; Werte 0-59; Sonderwerte: 63=*; bei relativer Schaltzeit kein * 94 | Bit 13-15: Wochentag; Werte 1-7 (Montag=1); Sonderwerte: 0=* 95 | 96 | Sortierbarer Zeitwert (Jahr nicht nötig): 97 | Bit 0-3: Monat (0-11), 12-15 ist frei 98 | Bit 4-8: Tag (0-30), 31 ist frei 99 | Bit 9-13: Stunde (0-23), 24-31 ist frei 100 | Bit 14-19: Minute (0-59), 60-63 ist frei 101 | => Es werden mehr als 16 Bit gebraucht, dann also 32 Bit. 102 | Der Einfachhheit halber also 1 Byte pro Wert: 103 | Byte 1: Monat 104 | Byte 2: Tag 105 | Byte 3: Stunde 106 | Byte 4: Minute 107 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Uebersicht-interne-KO.md: -------------------------------------------------------------------------------- 1 | ### Übersicht interne Verknüpfungen 2 | 3 | Das Logikmodul erlaubt 2 Arten von internen Verknüpfungen, damit Hilfswerte und Zwischenergebnisse von Kanal zu Kanal nicht über den Bus ausgetauscht werden müssen. 4 | 5 | Die eine Möglichkeit der Verknüpfung, genannt Interner Eingang, erlaubt es, die internen Eingänge eines Kanals mit dem internen Ausgang eines anderen Kanals zu verbinden. Dies ist unter Interne Eingänge beschrieben. 6 | 7 | Es gibt die Möglichkeit, einen Eingang oder einen Ausgang direkt mit einem Kommunikationsobjekt (KO) zu verknüpfen (über dessen KO-Nummer) und so den Wert von diesem KO intern (statt über eine GA) zu bekommen. 8 | 9 | Da es bei bis zu 99 Kanälen sehr schwer sein kann, den Überblick über alle intern Verknüpfungen zu behalten, soll die Übersichtstabelle auf dieser Seite dabei helfen. 10 | 11 | 12 | ### Anzeige 13 | 14 | Das Feld Anzeige bestimmt, welche Elemente in der Tabelle dargestellt werden. 15 | 16 | #### Mit Logikbeschriftungen 17 | 18 | Die Tabelle zeigt neben der Spalte L*n* (*n* ist die Nummer des Logikkanals) auch den Beschriftungstext, der für diesen Kanal vergeben wurde. Dies ist die ausführlichere Variante, benötigt aber pro dargestelltem Logikkanal eine zusätzliche Zeile. 19 | 20 | #### Ohne Logikbeschriftungen 21 | 22 | Es gibt nur eine Spalte mit den Logiknummern L*n*, aber ohne deren Texte. Diese Darstellung ist kompakter und erlaubt es, mehr Ein- und Ausgänge und deren interne KO-Verknüpfungen pro Seite zu sehen. 23 | 24 | #### Nur Kanäle mit Verknüpfungen 25 | 26 | Diese Ansicht zeigt nur Logikkanäle, die auch wirklich interne Verknüpfungen enthalten. Kanäle ohne interne Verknüpfungen werden nicht dargestellt. 27 | 28 | #### Alle Kanäle 29 | 30 | Diese Ansicht zeigt alle definierbaren Kanäle. 31 | 32 | ### Übersichtstabelle mit internen Verknüpfungen 33 | 34 | Die Tabelle enthält 5 Spalten und bis zu 5 Zeilen pro Logikkanal. Alle eingabebereiten Felder kommen auch so in der Kanaldefinition selbst vor und haben die gleiche Funktion. 35 | 36 | #### Spalte 1 (ohne Überschrift) 37 | 38 | Diese Spalte zeigt, welcher Logikkanal L*n* dargestellt wird und um welchen Eingang es geht (E1, E2, I1 oder I2). 39 | 40 | #### Spalte Logiktext / Eingang 41 | 42 | Die in dieser Spalte erscheinenden Textfelder enthalten die Beschriftungen, die man dem Logikkanal bzw. den Eingängen gegeben hat. Die Textfelder sind änderbar. 43 | 44 | #### Spalte KO / Interner Eingang 45 | 46 | Diese Spalte muss man unterschiedlich interpretieren, je nachdem, ob es sich um Eingänge mit KO-Verknüpfungen oder um interne Eingänge handelt. 47 | 48 | Bei KO-Verknüpfungen zeigt diese Spalte die KO-Nummern der Eingänge und wie sie ermittelt werden. Der Wert "Eigenes KO" zeigt immer die dann automatisch dem Eingang zugeordnete KO-Nummer, beim Wert "Bestehendes KO" erscheint ein Eingabefeld, in dem man die KO-Nummer eingeben kann. Steht da "Relatives KO", erscheint ein Eigabefeld, in dem man die Anzahl der KO angeben kann, die man vor- oder zurückspringen möchte (relative Angabe). Hinter dem Eingabefeld steht dann die ausgerechnete KO-Nummer, bei der man dann landet. Details kann man unter Kommunikationsobjekt für Eingang nachlesen. 49 | 50 | Bei internen Eingängen zeigt diese Spalte die Nummer des Kanals mit dessen Ausgang dieser Eingang verknüpft ist und wie dieser ermittelt wird. Beim Wert "absolut" erscheint ein Eingabefeld, in dem man die Kanalnummer des Kanals eingeben kann. Beim Wert "relativ" erscheint ein Eingabefeld, in dem man die Anzahl der Kanäle, um die man vor- oder zurückspringen will, angeben kann. Dahinter erscheint noch die Nummer des Kanals, bei dem man landet. 51 | 52 | #### Spalte Ausgang 53 | 54 | Das in dieser Spalte erscheinende Textfeld enthält die Beschriftung, die man dem Ausgang gegeben hat. Das Textfeld ist änderbar. 55 | 56 | #### Spalte Kommunikationsobjekt 57 | 58 | In dieser Spalte sieht man alle möglichen Verknüpfungen von Ausgängen mit externen KO. Dazu zählen die KO, an die der Ausgang zusätzlich zum eigenen KO senden kann (Zusatz) und die KO, deren Wert dieser Ausgang lesen und senden kann (Wert). Da es beides jeweils getrennt für das EIN- und das AUS-Signal gibt, ergeben sich bis zu 4 Zeilen "Zusatz-EIN", "Zusatz-AUS", "Wert-EIN" und "Wert-AUS" 59 | In dieser Spalte sieht man, ob für das EIN-Signal oder das AUS-Signal ein zusätzliches KO gewählt wurde und welche Nummer es hat. 60 | 61 | Das Auswahlfeld dahinter zeigt "Eigenes KO", falls kein zusätzliches KO gewählt wurde, gefolgt von der Nummer des eigenen KO dieses Ausgangs. 62 | Wählt man in dem Auswahlfeld "Absolutes KO", erscheint ein Eingabefeld, in dem man die Nummer des KO angeben kann, das genutzt werden soll. Wählt man "Relatives KO", erscheint ein Eingabefeld, in dem man die Anzahl der KO angibt, die man vor- oder zurückspringen möchte. Dahinter erscheint die berechnete KO-Nummer, bei der man dann landet. 63 | Details kann man unter Kommunikationsobjekt für Ausgang nachlesen. 64 | 65 | -------------------------------------------------------------------------------- /src/Baggages/Help_de/LOG-Dokumentation.md: -------------------------------------------------------------------------------- 1 | ### Dokumentation 2 | 3 | 4 | Eine vollständige Applikationsbeschreibung ist unter folgendem Link verfügbar: https://github.com/OpenKNX/OFM-LogicModule/blob/v1/doc/Applikationsbeschreibung-Logik.md 5 | 6 | Weitere Produktinformationen sind in unserem Wiki verfügbar: https://github.com/OpenKNX/OpenKNX/wiki/Produktinfo-Logikmodul 7 | 8 | Es gibt bis zu 99 Logikkanäle (abhängig von der Applikation, in die das Logikmodul integriert ist) mit folgenden Features: 9 | 10 | Logikfunktionen mit bis zu 2 externen und 2 internen Eingängen 11 | 12 | * UND 13 | * ODER 14 | * EXOR 15 | * TOR/Sperre 16 | * Zeitschaltuhr 17 | * Schalter 18 | * RS-Flipflop 19 | 20 | Einstellbare Ausgangstrigger 21 | 22 | * Bei Wertänderung am Ausgang 23 | * Bei jedem Eingangstelegramm 24 | * Nur beim Eingangstelegramm am Eingang 1 oder am Eingang 2 25 | 26 | Mehrere Kanäle können zu größeren Logikblöcken zusammengefasst werden 27 | 28 | Eingänge unterstützen DPT 1, 2, 3, 5, 5.001, 6, 7, 8, 9, 12, 13, 14, 17 29 | 30 | Ausgänge unterstützen zusätzlich den DPT 16 31 | 32 | Generische Konvertierung zwischen Ein- und Ausgangs-DPT 33 | 34 | Alle Ein- und Ausgänge können ihre Werte invertieren 35 | 36 | Eingänge können aktiv Werte lesen 37 | 38 | * beim Startup 39 | * Zyklisch mit einstellbarer Zeit 40 | * Zyklisch bis die erste Antwort kommt 41 | 42 | Wiederholfilter: Wenn mehrfach EIN- oder AUS-Telegramme hintereinander kommen, kann man 43 | 44 | * Alle Wiederholungen durchlassen 45 | * Nur EIN-Wiederholungen durchlassen, AUS nur einmal 46 | * Nur AUS-Wiederholungen durchlassen, EIN nur einmal 47 | * EIN- und AUS-Telegramm nur einmal durchlassen 48 | 49 | Zeitglieder am Ausgang 50 | 51 | * Treppenlicht mit Verlängerung und vorzeitigem Ausschalten (einstellbar) 52 | * Einschaltverzögerung mit einstellbarer Aktion bei vorzeitigem AUS/wiederholtem EIN 53 | * Ausschaltverzögerung mit einstellbarer Aktion bei vorzeitigem EIN/wiederholtem AUS 54 | * Blinken mit wählbarem Puls-Pausen-Verhältnis 55 | 56 | Zyklisch senden getrennt einstellbar für EIN- und AUS-Telegramm 57 | 58 | Ausgangsfilter: nur EIN-, nur AUS oder beides durchlassen 59 | 60 | Ausgangskonverter 61 | 62 | * Für EIN oder AUS wird der Wert eines anderen DPT gesendet 63 | * Für EIN oder AUS wird der Wert eines Eingangs gesendet 64 | * Für EIN oder AUS kann das Ergebnis einer Standardformel oder einer Benutzerformel verwendet werden 65 | 66 | User-spezifische (mathematische) Formeln sind in die Firmware einbaubar 67 | 68 | Sonderfunktionen 69 | 70 | * Die Funktion "Gerät zurücksetzen" (sonst nur über die ETS machbar) 71 | * Akustische Signalisierung über einen Buzzer (sofern entsprechende Hardware vorhanden ist) 72 | * Optische Signalisierung mittels einer RGB-LED (sofern entsprechende Hardware vorhanden ist) 73 | 74 | Zeitschaltuhren 75 | 76 | * Als Jahresschaltuhr mit 4 Schaltzeiten oder als Tages-/Wochenschaltuhr mit 8 Schaltzeiten 77 | * Feiertage berücksichtigen (oder ignorieren) 78 | * Urlaub berücksichtigen (oder ignorieren) 79 | * Tag/Monat berücksichtigen (bei Jahresschaltuhren) 80 | * Wochentag/Stunde/Minute berücksichtigen (bei allen Schaltuhren) 81 | * Sonnenstandsbezogene Schaltzeiten: 82 | * Sonnenauf-/-untergang +/- Stunden/Minuten 83 | * Sonnenauf-/-untergang, aber frühstens/spätestens um ... 84 | * Sonnenauf-/-untergang, mit Angabe des Sonnenstands als Winkel über/unter dem Horizont 85 | * Jede Stunde zu bestimmten Minuten schalten 86 | * Jeder Schaltvorgang kann dann wie bei jedem Logikkanal auch alle Ausgangsfunktionen haben 87 | * Beim Neustart des Logikmoduls den zeitlich letzten Schaltzeitpunkt berechnen und erneut ausgeben 88 | 89 | Weitere Features: 90 | 91 | * Komplexe Benutzerformeln können in der ETS eingegeben, getestet und die Ergebnisse überprüft werden. Diese Formeln können dann im Ausgangskonverter einer Logik genutzt werden. 92 | * Ein Eingang kann intern (ohne externe GA) mit jedem KO des Moduls verbunden werden. 93 | 94 | * Das erlaubt große Logiken ohne den Bus Zwischenergebnissen "vollzumüllen" 95 | * Da jedes KO geht, kann beim Sensormodul oder Enocean-Gateway z.B. direkt ein Sensorausgang verbunden werden und mit Logiken versehen werden. 96 | 97 | * Ein Ausgang kann nicht nur über das ihm eigentlich zugeordnete KO, sondern über einen beliebiges anderes KO senden, auch ein KO eines anderen Moduls. Dadurch kann die Logik Funktionalitäten anderer Kanäle erweitern oder mehrere Logikkanäle einen Ausgang nutzen und somit wie eine "große" Logik funktionieren. 98 | 99 | * Ein Toreingang kann auch ein Impulseingang sein (reagiert nur auf 1, wobei Tor geöffnet und sofort geschlossen wird) 100 | 101 | * Erlaubt diskrete getaktete Werte auf den Bus zu senden 102 | * Kann zur Synchronisation von Werten genutzt werden 103 | 104 | * Speichern von Werten über einen Stromausfall hinweg 105 | * Senden von gespeicherten Werten nach einem Neustart 106 | 107 | -------------------------------------------------------------------------------- /src/Logikmodul.userformula.part.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |