NEWS
Heathcliff mein Telegram Bot
-
Ich wollte euch mal meine Telegram Bot vorstellen.
Übersicht:
Heitzung:
Verwendete Adapter : MaxCul, ZigBeeWetter:
Verwendete Adapter : DasWetter.comTanken:
Verwendete Adapter : Tankerkönig, Flot, Screenshop Phantom, HistoryLicht:
Verwendete Adapter : ZigBeeSaugroboter:
Verwendete Adapter : Xiaomi/RoborockEinkausliste:
Verwendete Adapter : BringMusik:
Verwendete Adapter :Logitech Squeezebox AdapterSchichtplan:
Verwendete Adapter : -
Benötigt: Nextcloud KalenderAufbau
Für jede Funktion gibt es eine Javascipt Datei so ist es leichter einzelne Funktionen zu entfernen oder hinzu zufügen.
Neben der Auswahl über die Tastatur können die meisten Funktionen auch über Wörter gestartet werden (z.b. "Musik").
Die Skripte sind zustandslos geschrieben somit kann man immer zwischen den Funktionen wechseln ohne das man was beachten muss.Bei Interesse kann ich auch Quellecode online stelllen jedoch ist der leider überhaupt nicht Dokumentiert noch
verständlich geschrieben. Also muss ich den zumindest aufräumen damit der Überhaupt nachvollzogen werden kann. -
@ignis-draco ich hab meinen T2C in Klassen geschrieben. So bleibt das ganze extrem übersichtlich und man mit minimalem Aufwand neue Funktionen implementieren.
// Garage class garageClass { constructor() { this._name = 'Garage'; this._action = async (/** @type {string} */ cmd) => setStateAsync('0_userdata.0.Garage.Aktion.Garagentor_fahren', cmd, true); this.oeffnen = () => this._action('auf'); this.schliessen = () => this._action('zu'); this.paket = () => this._action('paket'); this.zustand = () => { const id = getState(arrPath[1]).val; const objMsg = { msg: getState('0_userdata.0.Garage.Zustand.Zustand_Garage').val, id: `${id}`, user: objRequest[id].firstName }; setState(telegram_msg, objMsg, true); }; }; }; // Lichtsteuerung class lichterClass { constructor() { this._name = 'Licht'; this._action = async (/** @type {string} */ path, /** @type {boolean} */ cmd, /** @type {boolean} */ ack) => setStateAsync(path, cmd, ack); this.aus = () => this._action('0_userdata.0.switches.main_Switch_Lights', true, true); }; }; // Sonstige Funktionen class sonstigesClass { constructor() { this._name = 'Sonstiges'; this._action = async (/** @type {string} */ path, /** @type {boolean} */ cmd, /** @type {boolean} */ ack) => setStateAsync(path, cmd, ack); this.spritpreise = () => this._action('0_userdata.0.message.trigger.telegram_Spritpreise', true, true); }; }; // klassen erstellen let objClass = { garage: new garageClass(), lueftung: new lueftungClass(), licht : new lichterClass(), sonstiges : new sonstigesClass() };
Jede Klasse ist ein eigenes Menu, jeder attribut ohne "_" am Anfang ein Button. Man braucht also auch keinen switch case oder sonst was bauen, einfach nur die Klasse mit den Funktionen einfügen und das wars
danach öffnet sich das entsprechende Menu:
Ich nutze das Wort vor dem ":" als keyword, das Wort nach dem ":" als command
// Aktion ausfuehren objClass[keyword][cmd]();
-
Das ist eine sehr interessante und auch elegante Möglichkeit wenn es jetzt noch möglich wäre die Classen in einzelne Dateien zu packen dann würde ich es sofort umstellen. Und diese ganzen Classen in global zu machen ist auch nicht wirklich sauber.
-
@ignis-draco du könntest dir ein eigenes node Modul erstellen, ich denke das wird mein nächster Schritt sein
-
node Modul ?
Meinst du damit NodeRed oder gibt es was neben Adapter und Skript das ich noch nicht kenne. -
@ignis-draco du kannst ja ein node Modul erstellen und es dann in den js Adapter importieren. Ein Adapter ist ja auch nichts anderes als ein node Modul
-
Oh stimmt daran habe ich noch gar nicht gedacht. Werde mich mal schlau machen wie so etwas geht und was die Vor und Nachteile sind. Mir fehlt nämlich häufiger die Möglichkeit zur Kapselung und Aufteilung in Dateien.